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