1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 // MARKER(update_precomp.py): autogen include statement, do not remove
24 #include "precompiled_sc.hxx"
25 
26 // INCLUDE ---------------------------------------------------------------
27 #include "scdpoutputimpl.hxx"
28 #include "scitems.hxx"
29 #include <editeng/boxitem.hxx>
30 // -----------------------------------------------------------------------
31 
32 namespace
33 {
lcl_compareColfuc(SCCOL i,SCCOL j)34 	bool lcl_compareColfuc ( SCCOL i,  SCCOL j) { return (i<j); }
lcl_compareRowfuc(SCROW i,SCROW j)35 	bool lcl_compareRowfuc ( SCROW i,  SCROW j) { return (i<j); }
36 }
37 
38 
OutputDataArea()39 void OutputImpl::OutputDataArea()
40 {
41 	AddRow( mnDataStartRow );
42 	AddCol( mnDataStartCol );
43 
44 	mnCols.push_back( mnTabEndCol+1); //set last row bottom
45 	mnRows.push_back( mnTabEndRow+1); //set last col bottom
46 
47 	sal_Bool bAllRows = ( ( mnTabEndRow - mnDataStartRow + 2 ) == (SCROW) mnRows.size() );
48 
49 	std::sort( mnCols.begin(), mnCols.end(), lcl_compareColfuc );
50 	std::sort( mnRows.begin(), mnRows.end(), lcl_compareRowfuc );
51 
52 	for( SCCOL nCol = 0; nCol < (SCCOL)mnCols.size()-1; nCol ++ )
53 	{
54 		if ( !bAllRows )
55 		{
56 			if ( nCol < (SCCOL)mnCols.size()-2)
57 			{
58 				for ( SCROW i = nCol%2; i < (SCROW)mnRows.size()-2; i +=2 )
59 					OutputBlockFrame( mnCols[nCol], mnRows[i], mnCols[nCol+1]-1, mnRows[i+1]-1 );
60 				if ( mnRows.size()>=2 )
61 					OutputBlockFrame(  mnCols[nCol], mnRows[mnRows.size()-2], mnCols[nCol+1]-1, mnRows[mnRows.size()-1]-1 );
62 			}
63 			else
64 			{
65 				for ( SCROW i = 0 ; i < (SCROW)mnRows.size()-1; i++ )
66 					OutputBlockFrame(  mnCols[nCol], mnRows[i], mnCols[nCol+1]-1,  mnRows[i+1]-1 );
67 			}
68 		}
69 		else
70 			OutputBlockFrame( mnCols[nCol], mnRows.front(), mnCols[nCol+1]-1, mnRows.back()-1, bAllRows );
71 	}
72 	//out put rows area outer framer
73 	if ( mnTabStartCol != mnDataStartCol )
74 	{
75 		if ( mnTabStartRow != mnDataStartRow )
76 			OutputBlockFrame( mnTabStartCol, mnTabStartRow, mnDataStartCol-1, mnDataStartRow-1 );
77 		OutputBlockFrame( mnTabStartCol, mnDataStartRow, mnDataStartCol-1, mnTabEndRow );
78 	}
79 	//out put cols area outer framer
80 	OutputBlockFrame( mnDataStartCol, mnTabStartRow, mnTabEndCol, mnDataStartRow-1 );
81 }
82 
OutputImpl(ScDocument * pDoc,sal_uInt16 nTab,SCCOL nTabStartCol,SCROW nTabStartRow,SCCOL nMemberStartCol,SCROW nMemberStartRow,SCCOL nDataStartCol,SCROW nDataStartRow,SCCOL nTabEndCol,SCROW nTabEndRow)83 OutputImpl::OutputImpl( ScDocument*	pDoc, sal_uInt16 nTab,
84 		SCCOL	nTabStartCol,
85 		SCROW	nTabStartRow,
86 		SCCOL	nMemberStartCol,
87 		SCROW	nMemberStartRow,
88 		SCCOL nDataStartCol,
89 		SCROW nDataStartRow,
90 		SCCOL nTabEndCol,
91 		SCROW nTabEndRow ):
92 	mpDoc( pDoc ),
93 	mnTab( nTab ),
94 	mnTabStartCol( nTabStartCol ),
95 	mnTabStartRow( nTabStartRow ),
96 	mnMemberStartCol( nMemberStartCol),
97 	mnMemberStartRow( nMemberStartRow),
98 	mnDataStartCol ( nDataStartCol ),
99 	mnDataStartRow ( nDataStartRow ),
100 	mnTabEndCol(  nTabEndCol ),
101 	mnTabEndRow(  nTabEndRow )
102 {
103 	mbNeedLineCols.resize( nTabEndCol-nDataStartCol+1, false );
104 	mbNeedLineRows.resize( nTabEndRow-nDataStartRow+1, false );
105 
106 }
107 
AddRow(SCROW nRow)108 sal_Bool OutputImpl::AddRow( SCROW nRow )
109 {
110 	if ( !mbNeedLineRows[ nRow - mnDataStartRow ] )
111 	{
112 		mbNeedLineRows[ nRow - mnDataStartRow ] = true;
113 		mnRows.push_back( nRow );
114 		return sal_True;
115 	}
116 	else
117 		return sal_False;
118 }
119 
AddCol(SCCOL nCol)120 sal_Bool OutputImpl::AddCol( SCCOL nCol )
121 {
122 
123 	if ( !mbNeedLineCols[ nCol - mnDataStartCol ] )
124 	{
125 		mbNeedLineCols[ nCol - mnDataStartCol ] = true;
126 		mnCols.push_back( nCol );
127 		return sal_True;
128 	}
129 	else
130 		return sal_False;
131 }
132 
OutputBlockFrame(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,sal_Bool bHori)133 void OutputImpl::OutputBlockFrame ( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow, sal_Bool bHori )
134 {
135 
136 	SvxBorderLine aLine, aOutLine;
137 	aLine.SetColor( SC_DP_FRAME_COLOR );
138 	aLine.SetOutWidth( SC_DP_FRAME_INNER_BOLD );
139 	aOutLine.SetColor( SC_DP_FRAME_COLOR );
140 	aOutLine.SetOutWidth( SC_DP_FRAME_OUTER_BOLD );
141 
142 	SvxBoxItem aBox( ATTR_BORDER );
143 
144 	if ( nStartCol == mnTabStartCol )
145 		aBox.SetLine(&aOutLine, BOX_LINE_LEFT);
146 	else
147 		aBox.SetLine(&aLine, BOX_LINE_LEFT);
148 
149 	if ( nStartRow == mnTabStartRow )
150 		aBox.SetLine(&aOutLine, BOX_LINE_TOP);
151 	else
152 		aBox.SetLine(&aLine, BOX_LINE_TOP);
153 
154 	if ( nEndCol == mnTabEndCol ) //bottom row
155 		aBox.SetLine(&aOutLine, BOX_LINE_RIGHT);
156 	else
157 		aBox.SetLine(&aLine,  BOX_LINE_RIGHT);
158 
159  	if ( nEndRow == mnTabEndRow ) //bottom
160 		aBox.SetLine(&aOutLine,  BOX_LINE_BOTTOM);
161 	else
162 		aBox.SetLine(&aLine,  BOX_LINE_BOTTOM);
163 
164 
165 	SvxBoxInfoItem aBoxInfo( ATTR_BORDER_INNER );
166 	aBoxInfo.SetValid(VALID_VERT,sal_False );
167 	if ( bHori )
168 	{
169 		aBoxInfo.SetValid(VALID_HORI,sal_True);
170 		aBoxInfo.SetLine( &aLine, BOXINFO_LINE_HORI );
171 	}
172 	else
173 		aBoxInfo.SetValid(VALID_HORI,sal_False );
174 
175 	aBoxInfo.SetValid(VALID_DISTANCE,sal_False);
176 
177 	mpDoc->ApplyFrameAreaTab( ScRange(  nStartCol, nStartRow, mnTab, nEndCol, nEndRow , mnTab ), &aBox, &aBoxInfo );
178 
179 }
180