1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski // INCLUDE ---------------------------------------------------------------
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski #include <vcl/sound.hxx>
32*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski #include "olinefun.hxx"
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski #include "docsh.hxx"
37*b1cdbd2cSJim Jagielski #include "olinetab.hxx"
38*b1cdbd2cSJim Jagielski #include "undodat.hxx"
39*b1cdbd2cSJim Jagielski #include "globstr.hrc"
40*b1cdbd2cSJim Jagielski #include "sc.hrc"
41*b1cdbd2cSJim Jagielski
42*b1cdbd2cSJim Jagielski
43*b1cdbd2cSJim Jagielski //========================================================================
44*b1cdbd2cSJim Jagielski
lcl_InvalidateOutliner(SfxBindings * pBindings)45*b1cdbd2cSJim Jagielski void lcl_InvalidateOutliner( SfxBindings* pBindings )
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski if ( pBindings )
48*b1cdbd2cSJim Jagielski {
49*b1cdbd2cSJim Jagielski pBindings->Invalidate( SID_OUTLINE_SHOW );
50*b1cdbd2cSJim Jagielski pBindings->Invalidate( SID_OUTLINE_HIDE );
51*b1cdbd2cSJim Jagielski pBindings->Invalidate( SID_OUTLINE_REMOVE );
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski pBindings->Invalidate( SID_STATUS_SUM ); // wegen ein-/ausblenden
54*b1cdbd2cSJim Jagielski pBindings->Invalidate( SID_ATTR_SIZE );
55*b1cdbd2cSJim Jagielski }
56*b1cdbd2cSJim Jagielski }
57*b1cdbd2cSJim Jagielski
58*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski //! PaintWidthHeight zur DocShell verschieben?
61*b1cdbd2cSJim Jagielski
lcl_PaintWidthHeight(ScDocShell & rDocShell,SCTAB nTab,sal_Bool bColumns,SCCOLROW nStart,SCCOLROW nEnd)62*b1cdbd2cSJim Jagielski void lcl_PaintWidthHeight( ScDocShell& rDocShell, SCTAB nTab,
63*b1cdbd2cSJim Jagielski sal_Bool bColumns, SCCOLROW nStart, SCCOLROW nEnd )
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielski sal_uInt16 nParts = PAINT_GRID;
68*b1cdbd2cSJim Jagielski SCCOL nStartCol = 0;
69*b1cdbd2cSJim Jagielski SCROW nStartRow = 0;
70*b1cdbd2cSJim Jagielski SCCOL nEndCol = MAXCOL; // fuer Test auf Merge
71*b1cdbd2cSJim Jagielski SCROW nEndRow = MAXROW;
72*b1cdbd2cSJim Jagielski if ( bColumns )
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski nParts |= PAINT_TOP;
75*b1cdbd2cSJim Jagielski nStartCol = static_cast<SCCOL>(nStart);
76*b1cdbd2cSJim Jagielski nEndCol = static_cast<SCCOL>(nEnd);
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski else
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski nParts |= PAINT_LEFT;
81*b1cdbd2cSJim Jagielski nStartRow = nStart;
82*b1cdbd2cSJim Jagielski nEndRow = nEnd;
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski if (pDoc->HasAttrib( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab,
85*b1cdbd2cSJim Jagielski HASATTR_MERGED | HASATTR_OVERLAPPED ))
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski nStartCol = 0;
88*b1cdbd2cSJim Jagielski nStartRow = 0;
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski rDocShell.PostPaint( nStartCol,nStartRow,nTab, MAXCOL,MAXROW,nTab, nParts );
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
94*b1cdbd2cSJim Jagielski
MakeOutline(const ScRange & rRange,sal_Bool bColumns,sal_Bool bRecord,sal_Bool bApi)95*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::MakeOutline( const ScRange& rRange, sal_Bool bColumns, sal_Bool bRecord, sal_Bool bApi )
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski sal_Bool bSuccess = sal_False;
98*b1cdbd2cSJim Jagielski SCCOL nStartCol = rRange.aStart.Col();
99*b1cdbd2cSJim Jagielski SCROW nStartRow = rRange.aStart.Row();
100*b1cdbd2cSJim Jagielski SCCOL nEndCol = rRange.aEnd.Col();
101*b1cdbd2cSJim Jagielski SCROW nEndRow = rRange.aEnd.Row();
102*b1cdbd2cSJim Jagielski SCTAB nTab = rRange.aStart.Tab();
103*b1cdbd2cSJim Jagielski
104*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
105*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab, sal_True );
106*b1cdbd2cSJim Jagielski ScOutlineTable* pUndoTab = NULL;
107*b1cdbd2cSJim Jagielski
108*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
109*b1cdbd2cSJim Jagielski bRecord = sal_False;
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski if (bRecord)
112*b1cdbd2cSJim Jagielski pUndoTab = new ScOutlineTable( *pTable );
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski ScOutlineArray* pArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
115*b1cdbd2cSJim Jagielski
116*b1cdbd2cSJim Jagielski sal_Bool bRes;
117*b1cdbd2cSJim Jagielski sal_Bool bSize = sal_False;
118*b1cdbd2cSJim Jagielski if ( bColumns )
119*b1cdbd2cSJim Jagielski bRes = pArray->Insert( nStartCol, nEndCol, bSize );
120*b1cdbd2cSJim Jagielski else
121*b1cdbd2cSJim Jagielski bRes = pArray->Insert( nStartRow, nEndRow, bSize );
122*b1cdbd2cSJim Jagielski
123*b1cdbd2cSJim Jagielski if ( bRes )
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski if (bRecord)
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
128*b1cdbd2cSJim Jagielski new ScUndoMakeOutline( &rDocShell,
129*b1cdbd2cSJim Jagielski nStartCol,nStartRow,nTab,nEndCol,nEndRow,nTab,
130*b1cdbd2cSJim Jagielski pUndoTab, bColumns, sal_True ) );
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski if (pDoc->IsStreamValid(nTab))
134*b1cdbd2cSJim Jagielski pDoc->SetStreamValid(nTab, sal_False);
135*b1cdbd2cSJim Jagielski
136*b1cdbd2cSJim Jagielski sal_uInt16 nParts = 0; // Datenbereich nicht geaendert
137*b1cdbd2cSJim Jagielski if ( bColumns )
138*b1cdbd2cSJim Jagielski nParts |= PAINT_TOP;
139*b1cdbd2cSJim Jagielski else
140*b1cdbd2cSJim Jagielski nParts |= PAINT_LEFT;
141*b1cdbd2cSJim Jagielski if ( bSize )
142*b1cdbd2cSJim Jagielski nParts |= PAINT_SIZE;
143*b1cdbd2cSJim Jagielski
144*b1cdbd2cSJim Jagielski rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, nParts );
145*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
146*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
147*b1cdbd2cSJim Jagielski bSuccess = sal_True;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski else
150*b1cdbd2cSJim Jagielski {
151*b1cdbd2cSJim Jagielski if (!bApi)
152*b1cdbd2cSJim Jagielski rDocShell.ErrorMessage(STR_MSSG_MAKEOUTLINE_0); // "Gruppierung nicht moeglich"
153*b1cdbd2cSJim Jagielski delete pUndoTab;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski return bSuccess;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski
RemoveOutline(const ScRange & rRange,sal_Bool bColumns,sal_Bool bRecord,sal_Bool bApi)159*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::RemoveOutline( const ScRange& rRange, sal_Bool bColumns, sal_Bool bRecord, sal_Bool bApi )
160*b1cdbd2cSJim Jagielski {
161*b1cdbd2cSJim Jagielski sal_Bool bDone = sal_False;
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski SCCOL nStartCol = rRange.aStart.Col();
164*b1cdbd2cSJim Jagielski SCROW nStartRow = rRange.aStart.Row();
165*b1cdbd2cSJim Jagielski SCCOL nEndCol = rRange.aEnd.Col();
166*b1cdbd2cSJim Jagielski SCROW nEndRow = rRange.aEnd.Row();
167*b1cdbd2cSJim Jagielski SCTAB nTab = rRange.aStart.Tab();
168*b1cdbd2cSJim Jagielski
169*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
170*b1cdbd2cSJim Jagielski
171*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
172*b1cdbd2cSJim Jagielski bRecord = sal_False;
173*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
174*b1cdbd2cSJim Jagielski if (pTable)
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski ScOutlineTable* pUndoTab = NULL;
177*b1cdbd2cSJim Jagielski if (bRecord)
178*b1cdbd2cSJim Jagielski pUndoTab = new ScOutlineTable( *pTable );
179*b1cdbd2cSJim Jagielski
180*b1cdbd2cSJim Jagielski ScOutlineArray* pArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
181*b1cdbd2cSJim Jagielski
182*b1cdbd2cSJim Jagielski sal_Bool bRes;
183*b1cdbd2cSJim Jagielski sal_Bool bSize = sal_False;
184*b1cdbd2cSJim Jagielski if ( bColumns )
185*b1cdbd2cSJim Jagielski bRes = pArray->Remove( nStartCol, nEndCol, bSize );
186*b1cdbd2cSJim Jagielski else
187*b1cdbd2cSJim Jagielski bRes = pArray->Remove( nStartRow, nEndRow, bSize );
188*b1cdbd2cSJim Jagielski
189*b1cdbd2cSJim Jagielski if ( bRes )
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski if (bRecord)
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
194*b1cdbd2cSJim Jagielski new ScUndoMakeOutline( &rDocShell,
195*b1cdbd2cSJim Jagielski nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab,
196*b1cdbd2cSJim Jagielski pUndoTab, bColumns, sal_False ) );
197*b1cdbd2cSJim Jagielski }
198*b1cdbd2cSJim Jagielski
199*b1cdbd2cSJim Jagielski if (pDoc->IsStreamValid(nTab))
200*b1cdbd2cSJim Jagielski pDoc->SetStreamValid(nTab, sal_False);
201*b1cdbd2cSJim Jagielski
202*b1cdbd2cSJim Jagielski sal_uInt16 nParts = 0; // Datenbereich nicht geaendert
203*b1cdbd2cSJim Jagielski if ( bColumns )
204*b1cdbd2cSJim Jagielski nParts |= PAINT_TOP;
205*b1cdbd2cSJim Jagielski else
206*b1cdbd2cSJim Jagielski nParts |= PAINT_LEFT;
207*b1cdbd2cSJim Jagielski if ( bSize )
208*b1cdbd2cSJim Jagielski nParts |= PAINT_SIZE;
209*b1cdbd2cSJim Jagielski
210*b1cdbd2cSJim Jagielski rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, nParts );
211*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
212*b1cdbd2cSJim Jagielski bDone = sal_True;
213*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
214*b1cdbd2cSJim Jagielski
215*b1cdbd2cSJim Jagielski // es wird nicht wieder eingeblendet -> kein UpdatePageBreaks
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski else
218*b1cdbd2cSJim Jagielski delete pUndoTab;
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski
221*b1cdbd2cSJim Jagielski if (!bDone && !bApi)
222*b1cdbd2cSJim Jagielski rDocShell.ErrorMessage(STR_MSSG_REMOVEOUTLINE_0); // "Aufheben nicht moeglich"
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski return bDone;
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski
RemoveAllOutlines(SCTAB nTab,sal_Bool bRecord,sal_Bool bApi)227*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::RemoveAllOutlines( SCTAB nTab, sal_Bool bRecord, sal_Bool bApi )
228*b1cdbd2cSJim Jagielski {
229*b1cdbd2cSJim Jagielski sal_Bool bSuccess = sal_False;
230*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
231*b1cdbd2cSJim Jagielski
232*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
233*b1cdbd2cSJim Jagielski bRecord = sal_False;
234*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
235*b1cdbd2cSJim Jagielski if (pTable)
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski if (bRecord)
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski SCCOLROW nCol1, nCol2, nRow1, nRow2;
240*b1cdbd2cSJim Jagielski pTable->GetColArray()->GetRange( nCol1, nCol2 );
241*b1cdbd2cSJim Jagielski pTable->GetRowArray()->GetRange( nRow1, nRow2 );
242*b1cdbd2cSJim Jagielski SCCOL nStartCol = static_cast<SCCOL>(nCol1);
243*b1cdbd2cSJim Jagielski SCROW nStartRow = nRow1;
244*b1cdbd2cSJim Jagielski SCCOL nEndCol = static_cast<SCCOL>(nCol2);
245*b1cdbd2cSJim Jagielski SCROW nEndRow = nRow2;
246*b1cdbd2cSJim Jagielski
247*b1cdbd2cSJim Jagielski ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
248*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
249*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( nStartCol, 0, nTab, nEndCol, MAXROW, nTab, IDF_NONE, sal_False, pUndoDoc );
250*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, sal_False, pUndoDoc );
251*b1cdbd2cSJim Jagielski
252*b1cdbd2cSJim Jagielski ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
255*b1cdbd2cSJim Jagielski new ScUndoRemoveAllOutlines( &rDocShell,
256*b1cdbd2cSJim Jagielski nStartCol, nStartRow, nTab,
257*b1cdbd2cSJim Jagielski nEndCol, nEndRow, nTab,
258*b1cdbd2cSJim Jagielski pUndoDoc, pUndoTab ) );
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski
261*b1cdbd2cSJim Jagielski SelectLevel( nTab, sal_True, pTable->GetColArray()->GetDepth(), sal_False, sal_False, bApi );
262*b1cdbd2cSJim Jagielski SelectLevel( nTab, sal_False, pTable->GetRowArray()->GetDepth(), sal_False, sal_False, bApi );
263*b1cdbd2cSJim Jagielski pDoc->SetOutlineTable( nTab, NULL );
264*b1cdbd2cSJim Jagielski
265*b1cdbd2cSJim Jagielski pDoc->UpdatePageBreaks( nTab );
266*b1cdbd2cSJim Jagielski
267*b1cdbd2cSJim Jagielski if (pDoc->IsStreamValid(nTab))
268*b1cdbd2cSJim Jagielski pDoc->SetStreamValid(nTab, sal_False);
269*b1cdbd2cSJim Jagielski
270*b1cdbd2cSJim Jagielski rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab,
271*b1cdbd2cSJim Jagielski PAINT_GRID | PAINT_LEFT | PAINT_TOP | PAINT_SIZE );
272*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
273*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
274*b1cdbd2cSJim Jagielski bSuccess = sal_True;
275*b1cdbd2cSJim Jagielski }
276*b1cdbd2cSJim Jagielski else if (!bApi)
277*b1cdbd2cSJim Jagielski Sound::Beep();
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski return bSuccess;
280*b1cdbd2cSJim Jagielski }
281*b1cdbd2cSJim Jagielski
282*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
283*b1cdbd2cSJim Jagielski
AutoOutline(const ScRange & rRange,sal_Bool bRecord,sal_Bool bApi)284*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::AutoOutline( const ScRange& rRange, sal_Bool bRecord, sal_Bool bApi )
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski SCCOL nStartCol = rRange.aStart.Col();
287*b1cdbd2cSJim Jagielski SCROW nStartRow = rRange.aStart.Row();
288*b1cdbd2cSJim Jagielski SCCOL nEndCol = rRange.aEnd.Col();
289*b1cdbd2cSJim Jagielski SCROW nEndRow = rRange.aEnd.Row();
290*b1cdbd2cSJim Jagielski SCTAB nTab = rRange.aStart.Tab();
291*b1cdbd2cSJim Jagielski
292*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
293*b1cdbd2cSJim Jagielski
294*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
295*b1cdbd2cSJim Jagielski bRecord = sal_False;
296*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
297*b1cdbd2cSJim Jagielski
298*b1cdbd2cSJim Jagielski ScDocument* pUndoDoc = NULL;
299*b1cdbd2cSJim Jagielski ScOutlineTable* pUndoTab = NULL;
300*b1cdbd2cSJim Jagielski
301*b1cdbd2cSJim Jagielski if ( pTable )
302*b1cdbd2cSJim Jagielski {
303*b1cdbd2cSJim Jagielski if ( bRecord )
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski pUndoTab = new ScOutlineTable( *pTable );
306*b1cdbd2cSJim Jagielski
307*b1cdbd2cSJim Jagielski SCCOLROW nCol1, nCol2, nRow1, nRow2;
308*b1cdbd2cSJim Jagielski pTable->GetColArray()->GetRange( nCol1, nCol2 );
309*b1cdbd2cSJim Jagielski pTable->GetRowArray()->GetRange( nRow1, nRow2 );
310*b1cdbd2cSJim Jagielski SCCOL nOutStartCol = static_cast<SCCOL>(nCol1);;
311*b1cdbd2cSJim Jagielski SCROW nOutStartRow = nRow1;
312*b1cdbd2cSJim Jagielski SCCOL nOutEndCol = static_cast<SCCOL>(nCol2);;
313*b1cdbd2cSJim Jagielski SCROW nOutEndRow = nRow2;
314*b1cdbd2cSJim Jagielski
315*b1cdbd2cSJim Jagielski pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
316*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
317*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( nOutStartCol, 0, nTab, nOutEndCol, MAXROW, nTab, IDF_NONE, sal_False, pUndoDoc );
318*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( 0, nOutStartRow, nTab, MAXCOL, nOutEndRow, nTab, IDF_NONE, sal_False, pUndoDoc );
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski
321*b1cdbd2cSJim Jagielski // einblenden
322*b1cdbd2cSJim Jagielski SelectLevel( nTab, sal_True, pTable->GetColArray()->GetDepth(), sal_False, sal_False, bApi );
323*b1cdbd2cSJim Jagielski SelectLevel( nTab, sal_False, pTable->GetRowArray()->GetDepth(), sal_False, sal_False, bApi );
324*b1cdbd2cSJim Jagielski pDoc->SetOutlineTable( nTab, NULL );
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski
327*b1cdbd2cSJim Jagielski pDoc->DoAutoOutline( nStartCol,nStartRow, nEndCol,nEndRow, nTab );
328*b1cdbd2cSJim Jagielski
329*b1cdbd2cSJim Jagielski if (bRecord)
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
332*b1cdbd2cSJim Jagielski new ScUndoAutoOutline( &rDocShell,
333*b1cdbd2cSJim Jagielski nStartCol, nStartRow, nTab,
334*b1cdbd2cSJim Jagielski nEndCol, nEndRow, nTab,
335*b1cdbd2cSJim Jagielski pUndoDoc, pUndoTab ) );
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski
338*b1cdbd2cSJim Jagielski if (pDoc->IsStreamValid(nTab))
339*b1cdbd2cSJim Jagielski pDoc->SetStreamValid(nTab, sal_False);
340*b1cdbd2cSJim Jagielski
341*b1cdbd2cSJim Jagielski rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_LEFT | PAINT_TOP | PAINT_SIZE );
342*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
343*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
344*b1cdbd2cSJim Jagielski
345*b1cdbd2cSJim Jagielski return sal_True;
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski
348*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
349*b1cdbd2cSJim Jagielski
SelectLevel(SCTAB nTab,sal_Bool bColumns,sal_uInt16 nLevel,sal_Bool bRecord,sal_Bool bPaint,sal_Bool)350*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, sal_Bool bColumns, sal_uInt16 nLevel,
351*b1cdbd2cSJim Jagielski sal_Bool bRecord, sal_Bool bPaint, sal_Bool /* bApi */ )
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
354*b1cdbd2cSJim Jagielski
355*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
356*b1cdbd2cSJim Jagielski bRecord = sal_False;
357*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab ); // ist schon da
358*b1cdbd2cSJim Jagielski if (!pTable)
359*b1cdbd2cSJim Jagielski return sal_False;
360*b1cdbd2cSJim Jagielski ScOutlineArray* pArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
361*b1cdbd2cSJim Jagielski if (!pArray)
362*b1cdbd2cSJim Jagielski return sal_False;
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski SCCOLROW nStart, nEnd;
365*b1cdbd2cSJim Jagielski pArray->GetRange( nStart, nEnd );
366*b1cdbd2cSJim Jagielski
367*b1cdbd2cSJim Jagielski if ( bRecord )
368*b1cdbd2cSJim Jagielski {
369*b1cdbd2cSJim Jagielski ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
370*b1cdbd2cSJim Jagielski ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
371*b1cdbd2cSJim Jagielski if (bColumns)
372*b1cdbd2cSJim Jagielski {
373*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_False );
374*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
375*b1cdbd2cSJim Jagielski static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, sal_False,
376*b1cdbd2cSJim Jagielski pUndoDoc );
377*b1cdbd2cSJim Jagielski }
378*b1cdbd2cSJim Jagielski else
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_False, sal_True );
381*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, sal_False, pUndoDoc );
382*b1cdbd2cSJim Jagielski }
383*b1cdbd2cSJim Jagielski
384*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
385*b1cdbd2cSJim Jagielski new ScUndoOutlineLevel( &rDocShell,
386*b1cdbd2cSJim Jagielski nStart, nEnd, nTab, //! start und end berechnen
387*b1cdbd2cSJim Jagielski pUndoDoc, pUndoTab,
388*b1cdbd2cSJim Jagielski bColumns, nLevel ) );
389*b1cdbd2cSJim Jagielski }
390*b1cdbd2cSJim Jagielski
391*b1cdbd2cSJim Jagielski pDoc->IncSizeRecalcLevel( nTab );
392*b1cdbd2cSJim Jagielski
393*b1cdbd2cSJim Jagielski ScSubOutlineIterator aIter( pArray ); // alle Eintraege
394*b1cdbd2cSJim Jagielski ScOutlineEntry* pEntry;
395*b1cdbd2cSJim Jagielski while ((pEntry=aIter.GetNext()) != NULL)
396*b1cdbd2cSJim Jagielski {
397*b1cdbd2cSJim Jagielski sal_uInt16 nThisLevel = aIter.LastLevel();
398*b1cdbd2cSJim Jagielski sal_Bool bShow = (nThisLevel < nLevel);
399*b1cdbd2cSJim Jagielski if (bShow) // einblenden
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski pEntry->SetHidden( sal_False );
402*b1cdbd2cSJim Jagielski pEntry->SetVisible( sal_True );
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski else if ( nThisLevel == nLevel ) // ausblenden
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski pEntry->SetHidden( sal_True );
407*b1cdbd2cSJim Jagielski pEntry->SetVisible( sal_True );
408*b1cdbd2cSJim Jagielski }
409*b1cdbd2cSJim Jagielski else // verdeckt
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski pEntry->SetVisible( sal_False );
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski
414*b1cdbd2cSJim Jagielski SCCOLROW nThisStart = pEntry->GetStart();
415*b1cdbd2cSJim Jagielski SCCOLROW nThisEnd = pEntry->GetEnd();
416*b1cdbd2cSJim Jagielski for (SCCOLROW i=nThisStart; i<=nThisEnd; i++)
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski if ( bColumns )
419*b1cdbd2cSJim Jagielski pDoc->ShowCol( static_cast<SCCOL>(i), nTab, bShow );
420*b1cdbd2cSJim Jagielski else
421*b1cdbd2cSJim Jagielski {
422*b1cdbd2cSJim Jagielski // show several rows together, don't show filtered rows
423*b1cdbd2cSJim Jagielski SCROW nFilterEnd = i;
424*b1cdbd2cSJim Jagielski bool bFiltered = pDoc->RowFiltered( i, nTab, NULL, &nFilterEnd );
425*b1cdbd2cSJim Jagielski nFilterEnd = std::min( nThisEnd, nFilterEnd );
426*b1cdbd2cSJim Jagielski if ( !bShow || !bFiltered )
427*b1cdbd2cSJim Jagielski pDoc->ShowRows( i, nFilterEnd, nTab, bShow );
428*b1cdbd2cSJim Jagielski i = nFilterEnd;
429*b1cdbd2cSJim Jagielski }
430*b1cdbd2cSJim Jagielski }
431*b1cdbd2cSJim Jagielski }
432*b1cdbd2cSJim Jagielski
433*b1cdbd2cSJim Jagielski pDoc->DecSizeRecalcLevel( nTab );
434*b1cdbd2cSJim Jagielski pDoc->UpdatePageBreaks( nTab );
435*b1cdbd2cSJim Jagielski
436*b1cdbd2cSJim Jagielski if (bPaint)
437*b1cdbd2cSJim Jagielski lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd );
438*b1cdbd2cSJim Jagielski
439*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
440*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
441*b1cdbd2cSJim Jagielski
442*b1cdbd2cSJim Jagielski return sal_True;
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski
445*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
446*b1cdbd2cSJim Jagielski
ShowMarkedOutlines(const ScRange & rRange,sal_Bool bRecord,sal_Bool bApi)447*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, sal_Bool bRecord, sal_Bool bApi )
448*b1cdbd2cSJim Jagielski {
449*b1cdbd2cSJim Jagielski sal_Bool bDone = sal_False;
450*b1cdbd2cSJim Jagielski
451*b1cdbd2cSJim Jagielski SCCOL nStartCol = rRange.aStart.Col();
452*b1cdbd2cSJim Jagielski SCROW nStartRow = rRange.aStart.Row();
453*b1cdbd2cSJim Jagielski SCCOL nEndCol = rRange.aEnd.Col();
454*b1cdbd2cSJim Jagielski SCROW nEndRow = rRange.aEnd.Row();
455*b1cdbd2cSJim Jagielski SCTAB nTab = rRange.aStart.Tab();
456*b1cdbd2cSJim Jagielski
457*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
458*b1cdbd2cSJim Jagielski
459*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
460*b1cdbd2cSJim Jagielski bRecord = sal_False;
461*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
462*b1cdbd2cSJim Jagielski
463*b1cdbd2cSJim Jagielski if (pTable)
464*b1cdbd2cSJim Jagielski {
465*b1cdbd2cSJim Jagielski ScOutlineArray* pArray;
466*b1cdbd2cSJim Jagielski ScOutlineEntry* pEntry;
467*b1cdbd2cSJim Jagielski SCCOLROW nStart;
468*b1cdbd2cSJim Jagielski SCCOLROW nEnd;
469*b1cdbd2cSJim Jagielski SCCOLROW nMin;
470*b1cdbd2cSJim Jagielski SCCOLROW nMax;
471*b1cdbd2cSJim Jagielski SCCOLROW i;
472*b1cdbd2cSJim Jagielski
473*b1cdbd2cSJim Jagielski if ( bRecord )
474*b1cdbd2cSJim Jagielski {
475*b1cdbd2cSJim Jagielski ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
476*b1cdbd2cSJim Jagielski ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
477*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
478*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( nStartCol, 0, nTab, nEndCol, MAXROW, nTab, IDF_NONE, sal_False, pUndoDoc );
479*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, sal_False, pUndoDoc );
480*b1cdbd2cSJim Jagielski
481*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
482*b1cdbd2cSJim Jagielski new ScUndoOutlineBlock( &rDocShell,
483*b1cdbd2cSJim Jagielski nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab,
484*b1cdbd2cSJim Jagielski pUndoDoc, pUndoTab, sal_True ) );
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski
487*b1cdbd2cSJim Jagielski pDoc->IncSizeRecalcLevel( nTab );
488*b1cdbd2cSJim Jagielski
489*b1cdbd2cSJim Jagielski // Spalten
490*b1cdbd2cSJim Jagielski
491*b1cdbd2cSJim Jagielski nMin=MAXCOL;
492*b1cdbd2cSJim Jagielski nMax=0;
493*b1cdbd2cSJim Jagielski pArray = pTable->GetColArray();
494*b1cdbd2cSJim Jagielski ScSubOutlineIterator aColIter( pArray );
495*b1cdbd2cSJim Jagielski while ((pEntry=aColIter.GetNext()) != NULL)
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski nStart = pEntry->GetStart();
498*b1cdbd2cSJim Jagielski nEnd = pEntry->GetEnd();
499*b1cdbd2cSJim Jagielski if ( nStart>=nStartCol && nEnd<=nEndCol )
500*b1cdbd2cSJim Jagielski {
501*b1cdbd2cSJim Jagielski pEntry->SetHidden( sal_False );
502*b1cdbd2cSJim Jagielski pEntry->SetVisible( sal_True );
503*b1cdbd2cSJim Jagielski if (nStart<nMin) nMin=nStart;
504*b1cdbd2cSJim Jagielski if (nEnd>nMax) nMax=nEnd;
505*b1cdbd2cSJim Jagielski }
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski for ( i=nMin; i<=nMax; i++ )
508*b1cdbd2cSJim Jagielski pDoc->ShowCol( static_cast<SCCOL>(i), nTab, sal_True );
509*b1cdbd2cSJim Jagielski
510*b1cdbd2cSJim Jagielski // Zeilen
511*b1cdbd2cSJim Jagielski
512*b1cdbd2cSJim Jagielski nMin=MAXROW;
513*b1cdbd2cSJim Jagielski nMax=0;
514*b1cdbd2cSJim Jagielski pArray = pTable->GetRowArray();
515*b1cdbd2cSJim Jagielski ScSubOutlineIterator aRowIter( pArray );
516*b1cdbd2cSJim Jagielski while ((pEntry=aRowIter.GetNext()) != NULL)
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski nStart = pEntry->GetStart();
519*b1cdbd2cSJim Jagielski nEnd = pEntry->GetEnd();
520*b1cdbd2cSJim Jagielski if ( nStart>=nStartRow && nEnd<=nEndRow )
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski pEntry->SetHidden( sal_False );
523*b1cdbd2cSJim Jagielski pEntry->SetVisible( sal_True );
524*b1cdbd2cSJim Jagielski if (nStart<nMin) nMin=nStart;
525*b1cdbd2cSJim Jagielski if (nEnd>nMax) nMax=nEnd;
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski }
528*b1cdbd2cSJim Jagielski for ( i=nMin; i<=nMax; i++ )
529*b1cdbd2cSJim Jagielski {
530*b1cdbd2cSJim Jagielski // show several rows together, don't show filtered rows
531*b1cdbd2cSJim Jagielski SCROW nFilterEnd = i;
532*b1cdbd2cSJim Jagielski bool bFiltered = pDoc->RowFiltered( i, nTab, NULL, &nFilterEnd );
533*b1cdbd2cSJim Jagielski nFilterEnd = std::min( nMax, nFilterEnd );
534*b1cdbd2cSJim Jagielski if ( !bFiltered )
535*b1cdbd2cSJim Jagielski pDoc->ShowRows( i, nFilterEnd, nTab, sal_True );
536*b1cdbd2cSJim Jagielski i = nFilterEnd;
537*b1cdbd2cSJim Jagielski }
538*b1cdbd2cSJim Jagielski
539*b1cdbd2cSJim Jagielski pDoc->DecSizeRecalcLevel( nTab );
540*b1cdbd2cSJim Jagielski pDoc->UpdatePageBreaks( nTab );
541*b1cdbd2cSJim Jagielski
542*b1cdbd2cSJim Jagielski rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT | PAINT_TOP );
543*b1cdbd2cSJim Jagielski
544*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
545*b1cdbd2cSJim Jagielski bDone = sal_True;
546*b1cdbd2cSJim Jagielski
547*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski
550*b1cdbd2cSJim Jagielski if (!bDone && !bApi)
551*b1cdbd2cSJim Jagielski Sound::Beep();
552*b1cdbd2cSJim Jagielski
553*b1cdbd2cSJim Jagielski return bDone;
554*b1cdbd2cSJim Jagielski }
555*b1cdbd2cSJim Jagielski
HideMarkedOutlines(const ScRange & rRange,sal_Bool bRecord,sal_Bool bApi)556*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::HideMarkedOutlines( const ScRange& rRange, sal_Bool bRecord, sal_Bool bApi )
557*b1cdbd2cSJim Jagielski {
558*b1cdbd2cSJim Jagielski sal_Bool bDone = sal_False;
559*b1cdbd2cSJim Jagielski
560*b1cdbd2cSJim Jagielski SCCOL nStartCol = rRange.aStart.Col();
561*b1cdbd2cSJim Jagielski SCROW nStartRow = rRange.aStart.Row();
562*b1cdbd2cSJim Jagielski SCCOL nEndCol = rRange.aEnd.Col();
563*b1cdbd2cSJim Jagielski SCROW nEndRow = rRange.aEnd.Row();
564*b1cdbd2cSJim Jagielski SCTAB nTab = rRange.aStart.Tab();
565*b1cdbd2cSJim Jagielski
566*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
567*b1cdbd2cSJim Jagielski
568*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
569*b1cdbd2cSJim Jagielski bRecord = sal_False;
570*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
571*b1cdbd2cSJim Jagielski
572*b1cdbd2cSJim Jagielski if (pTable)
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski ScOutlineEntry* pEntry;
575*b1cdbd2cSJim Jagielski sal_uInt16 nColLevel;
576*b1cdbd2cSJim Jagielski sal_uInt16 nRowLevel;
577*b1cdbd2cSJim Jagielski sal_uInt16 nCount;
578*b1cdbd2cSJim Jagielski SCCOLROW nStart;
579*b1cdbd2cSJim Jagielski SCCOLROW nEnd;
580*b1cdbd2cSJim Jagielski sal_uInt16 i;
581*b1cdbd2cSJim Jagielski
582*b1cdbd2cSJim Jagielski SCCOLROW nEffStartCol = nStartCol;
583*b1cdbd2cSJim Jagielski SCCOLROW nEffEndCol = nEndCol;
584*b1cdbd2cSJim Jagielski ScOutlineArray* pColArray = pTable->GetColArray();
585*b1cdbd2cSJim Jagielski pColArray->FindTouchedLevel( nStartCol, nEndCol, nColLevel );
586*b1cdbd2cSJim Jagielski pColArray->ExtendBlock( nColLevel, nEffStartCol, nEffEndCol );
587*b1cdbd2cSJim Jagielski SCCOLROW nEffStartRow = nStartRow;
588*b1cdbd2cSJim Jagielski SCCOLROW nEffEndRow = nEndRow;
589*b1cdbd2cSJim Jagielski ScOutlineArray* pRowArray = pTable->GetRowArray();
590*b1cdbd2cSJim Jagielski pRowArray->FindTouchedLevel( nStartRow, nEndRow, nRowLevel );
591*b1cdbd2cSJim Jagielski pRowArray->ExtendBlock( nRowLevel, nEffStartRow, nEffEndRow );
592*b1cdbd2cSJim Jagielski
593*b1cdbd2cSJim Jagielski if ( bRecord )
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable );
596*b1cdbd2cSJim Jagielski ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
597*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
598*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( static_cast<SCCOL>(nEffStartCol), 0, nTab,
599*b1cdbd2cSJim Jagielski static_cast<SCCOL>(nEffEndCol), MAXROW, nTab, IDF_NONE,
600*b1cdbd2cSJim Jagielski sal_False, pUndoDoc );
601*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( 0, nEffStartRow, nTab, MAXCOL, nEffEndRow, nTab, IDF_NONE, sal_False, pUndoDoc );
602*b1cdbd2cSJim Jagielski
603*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
604*b1cdbd2cSJim Jagielski new ScUndoOutlineBlock( &rDocShell,
605*b1cdbd2cSJim Jagielski nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab,
606*b1cdbd2cSJim Jagielski pUndoDoc, pUndoTab, sal_False ) );
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski
609*b1cdbd2cSJim Jagielski pDoc->IncSizeRecalcLevel( nTab );
610*b1cdbd2cSJim Jagielski
611*b1cdbd2cSJim Jagielski // Spalten
612*b1cdbd2cSJim Jagielski
613*b1cdbd2cSJim Jagielski nCount = pColArray->GetCount(nColLevel);
614*b1cdbd2cSJim Jagielski for ( i=0; i<nCount; i++ )
615*b1cdbd2cSJim Jagielski {
616*b1cdbd2cSJim Jagielski pEntry = pColArray->GetEntry(nColLevel,i);
617*b1cdbd2cSJim Jagielski nStart = pEntry->GetStart();
618*b1cdbd2cSJim Jagielski nEnd = pEntry->GetEnd();
619*b1cdbd2cSJim Jagielski
620*b1cdbd2cSJim Jagielski if ( static_cast<SCCOLROW>(nStartCol)<=nEnd && static_cast<SCCOLROW>(nEndCol)>=nStart )
621*b1cdbd2cSJim Jagielski HideOutline( nTab, sal_True, nColLevel, i, sal_False, sal_False, bApi );
622*b1cdbd2cSJim Jagielski }
623*b1cdbd2cSJim Jagielski
624*b1cdbd2cSJim Jagielski // Zeilen
625*b1cdbd2cSJim Jagielski
626*b1cdbd2cSJim Jagielski nCount = pRowArray->GetCount(nRowLevel);
627*b1cdbd2cSJim Jagielski for ( i=0; i<nCount; i++ )
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski pEntry = pRowArray->GetEntry(nRowLevel,i);
630*b1cdbd2cSJim Jagielski nStart = pEntry->GetStart();
631*b1cdbd2cSJim Jagielski nEnd = pEntry->GetEnd();
632*b1cdbd2cSJim Jagielski
633*b1cdbd2cSJim Jagielski if ( nStartRow<=nEnd && nEndRow>=nStart )
634*b1cdbd2cSJim Jagielski HideOutline( nTab, sal_False, nRowLevel, i, sal_False, sal_False, bApi );
635*b1cdbd2cSJim Jagielski }
636*b1cdbd2cSJim Jagielski
637*b1cdbd2cSJim Jagielski pDoc->DecSizeRecalcLevel( nTab );
638*b1cdbd2cSJim Jagielski pDoc->UpdatePageBreaks( nTab );
639*b1cdbd2cSJim Jagielski
640*b1cdbd2cSJim Jagielski rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_LEFT | PAINT_TOP );
641*b1cdbd2cSJim Jagielski
642*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
643*b1cdbd2cSJim Jagielski bDone = sal_True;
644*b1cdbd2cSJim Jagielski
645*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
646*b1cdbd2cSJim Jagielski }
647*b1cdbd2cSJim Jagielski
648*b1cdbd2cSJim Jagielski if (!bDone && !bApi)
649*b1cdbd2cSJim Jagielski Sound::Beep();
650*b1cdbd2cSJim Jagielski
651*b1cdbd2cSJim Jagielski return bDone;
652*b1cdbd2cSJim Jagielski }
653*b1cdbd2cSJim Jagielski
654*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
655*b1cdbd2cSJim Jagielski
ShowOutline(SCTAB nTab,sal_Bool bColumns,sal_uInt16 nLevel,sal_uInt16 nEntry,sal_Bool bRecord,sal_Bool bPaint,sal_Bool)656*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry,
657*b1cdbd2cSJim Jagielski sal_Bool bRecord, sal_Bool bPaint, sal_Bool /* bApi */ )
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
660*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
661*b1cdbd2cSJim Jagielski bRecord = sal_False;
662*b1cdbd2cSJim Jagielski
663*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
664*b1cdbd2cSJim Jagielski ScOutlineArray* pArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
665*b1cdbd2cSJim Jagielski ScOutlineEntry* pEntry = pArray->GetEntry( nLevel, nEntry );
666*b1cdbd2cSJim Jagielski SCCOLROW nStart = pEntry->GetStart();
667*b1cdbd2cSJim Jagielski SCCOLROW nEnd = pEntry->GetEnd();
668*b1cdbd2cSJim Jagielski
669*b1cdbd2cSJim Jagielski if ( bRecord )
670*b1cdbd2cSJim Jagielski {
671*b1cdbd2cSJim Jagielski ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
672*b1cdbd2cSJim Jagielski if (bColumns)
673*b1cdbd2cSJim Jagielski {
674*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_False );
675*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
676*b1cdbd2cSJim Jagielski static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, sal_False,
677*b1cdbd2cSJim Jagielski pUndoDoc );
678*b1cdbd2cSJim Jagielski }
679*b1cdbd2cSJim Jagielski else
680*b1cdbd2cSJim Jagielski {
681*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_False, sal_True );
682*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, sal_False, pUndoDoc );
683*b1cdbd2cSJim Jagielski }
684*b1cdbd2cSJim Jagielski
685*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
686*b1cdbd2cSJim Jagielski new ScUndoDoOutline( &rDocShell,
687*b1cdbd2cSJim Jagielski nStart, nEnd, nTab, pUndoDoc, //! start und end berechnen
688*b1cdbd2cSJim Jagielski bColumns, nLevel, nEntry, sal_True ) );
689*b1cdbd2cSJim Jagielski }
690*b1cdbd2cSJim Jagielski
691*b1cdbd2cSJim Jagielski //! HideCursor();
692*b1cdbd2cSJim Jagielski
693*b1cdbd2cSJim Jagielski pDoc->IncSizeRecalcLevel( nTab );
694*b1cdbd2cSJim Jagielski
695*b1cdbd2cSJim Jagielski pEntry->SetHidden(sal_False);
696*b1cdbd2cSJim Jagielski SCCOLROW i;
697*b1cdbd2cSJim Jagielski for ( i = nStart; i <= nEnd; i++ )
698*b1cdbd2cSJim Jagielski {
699*b1cdbd2cSJim Jagielski if ( bColumns )
700*b1cdbd2cSJim Jagielski pDoc->ShowCol( static_cast<SCCOL>(i), nTab, sal_True );
701*b1cdbd2cSJim Jagielski else
702*b1cdbd2cSJim Jagielski {
703*b1cdbd2cSJim Jagielski // show several rows together, don't show filtered rows
704*b1cdbd2cSJim Jagielski SCROW nFilterEnd = i;
705*b1cdbd2cSJim Jagielski bool bFiltered = pDoc->RowFiltered( i, nTab, NULL, &nFilterEnd );
706*b1cdbd2cSJim Jagielski nFilterEnd = std::min( nEnd, nFilterEnd );
707*b1cdbd2cSJim Jagielski if ( !bFiltered )
708*b1cdbd2cSJim Jagielski pDoc->ShowRows( i, nFilterEnd, nTab, sal_True );
709*b1cdbd2cSJim Jagielski i = nFilterEnd;
710*b1cdbd2cSJim Jagielski }
711*b1cdbd2cSJim Jagielski }
712*b1cdbd2cSJim Jagielski
713*b1cdbd2cSJim Jagielski ScSubOutlineIterator aIter( pArray, nLevel, nEntry );
714*b1cdbd2cSJim Jagielski while ((pEntry=aIter.GetNext()) != NULL)
715*b1cdbd2cSJim Jagielski {
716*b1cdbd2cSJim Jagielski if ( pEntry->IsHidden() )
717*b1cdbd2cSJim Jagielski {
718*b1cdbd2cSJim Jagielski SCCOLROW nSubStart = pEntry->GetStart();
719*b1cdbd2cSJim Jagielski SCCOLROW nSubEnd = pEntry->GetEnd();
720*b1cdbd2cSJim Jagielski if ( bColumns )
721*b1cdbd2cSJim Jagielski for ( i = nSubStart; i <= nSubEnd; i++ )
722*b1cdbd2cSJim Jagielski pDoc->ShowCol( static_cast<SCCOL>(i), nTab, sal_False );
723*b1cdbd2cSJim Jagielski else
724*b1cdbd2cSJim Jagielski pDoc->ShowRows( nSubStart, nSubEnd, nTab, sal_False );
725*b1cdbd2cSJim Jagielski }
726*b1cdbd2cSJim Jagielski }
727*b1cdbd2cSJim Jagielski
728*b1cdbd2cSJim Jagielski pArray->SetVisibleBelow( nLevel, nEntry, sal_True, sal_True );
729*b1cdbd2cSJim Jagielski
730*b1cdbd2cSJim Jagielski pDoc->DecSizeRecalcLevel( nTab );
731*b1cdbd2cSJim Jagielski pDoc->InvalidatePageBreaks(nTab);
732*b1cdbd2cSJim Jagielski pDoc->UpdatePageBreaks( nTab );
733*b1cdbd2cSJim Jagielski
734*b1cdbd2cSJim Jagielski if (bPaint)
735*b1cdbd2cSJim Jagielski lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd );
736*b1cdbd2cSJim Jagielski
737*b1cdbd2cSJim Jagielski //! ShowCursor();
738*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
739*b1cdbd2cSJim Jagielski
740*b1cdbd2cSJim Jagielski //! if (bPaint)
741*b1cdbd2cSJim Jagielski //! UpdateScrollBars();
742*b1cdbd2cSJim Jagielski
743*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
744*b1cdbd2cSJim Jagielski
745*b1cdbd2cSJim Jagielski return sal_True; //! immer ???
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski
HideOutline(SCTAB nTab,sal_Bool bColumns,sal_uInt16 nLevel,sal_uInt16 nEntry,sal_Bool bRecord,sal_Bool bPaint,sal_Bool)748*b1cdbd2cSJim Jagielski sal_Bool ScOutlineDocFunc::HideOutline( SCTAB nTab, sal_Bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry,
749*b1cdbd2cSJim Jagielski sal_Bool bRecord, sal_Bool bPaint, sal_Bool /* bApi */ )
750*b1cdbd2cSJim Jagielski {
751*b1cdbd2cSJim Jagielski ScDocument* pDoc = rDocShell.GetDocument();
752*b1cdbd2cSJim Jagielski if (bRecord && !pDoc->IsUndoEnabled())
753*b1cdbd2cSJim Jagielski bRecord = sal_False;
754*b1cdbd2cSJim Jagielski
755*b1cdbd2cSJim Jagielski ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
756*b1cdbd2cSJim Jagielski ScOutlineArray* pArray = bColumns ? pTable->GetColArray() : pTable->GetRowArray();
757*b1cdbd2cSJim Jagielski ScOutlineEntry* pEntry = pArray->GetEntry( nLevel, nEntry );
758*b1cdbd2cSJim Jagielski SCCOLROW nStart = pEntry->GetStart();
759*b1cdbd2cSJim Jagielski SCCOLROW nEnd = pEntry->GetEnd();
760*b1cdbd2cSJim Jagielski
761*b1cdbd2cSJim Jagielski if ( bRecord )
762*b1cdbd2cSJim Jagielski {
763*b1cdbd2cSJim Jagielski ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
764*b1cdbd2cSJim Jagielski if (bColumns)
765*b1cdbd2cSJim Jagielski {
766*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_False );
767*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
768*b1cdbd2cSJim Jagielski static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, sal_False,
769*b1cdbd2cSJim Jagielski pUndoDoc );
770*b1cdbd2cSJim Jagielski }
771*b1cdbd2cSJim Jagielski else
772*b1cdbd2cSJim Jagielski {
773*b1cdbd2cSJim Jagielski pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_False, sal_True );
774*b1cdbd2cSJim Jagielski pDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, sal_False, pUndoDoc );
775*b1cdbd2cSJim Jagielski }
776*b1cdbd2cSJim Jagielski
777*b1cdbd2cSJim Jagielski rDocShell.GetUndoManager()->AddUndoAction(
778*b1cdbd2cSJim Jagielski new ScUndoDoOutline( &rDocShell,
779*b1cdbd2cSJim Jagielski nStart, nEnd, nTab, pUndoDoc,
780*b1cdbd2cSJim Jagielski bColumns, nLevel, nEntry, sal_False ) );
781*b1cdbd2cSJim Jagielski }
782*b1cdbd2cSJim Jagielski
783*b1cdbd2cSJim Jagielski //! HideCursor();
784*b1cdbd2cSJim Jagielski
785*b1cdbd2cSJim Jagielski pDoc->IncSizeRecalcLevel( nTab );
786*b1cdbd2cSJim Jagielski
787*b1cdbd2cSJim Jagielski pEntry->SetHidden(sal_True);
788*b1cdbd2cSJim Jagielski SCCOLROW i;
789*b1cdbd2cSJim Jagielski if ( bColumns )
790*b1cdbd2cSJim Jagielski for ( i = nStart; i <= nEnd; i++ )
791*b1cdbd2cSJim Jagielski pDoc->ShowCol( static_cast<SCCOL>(i), nTab, sal_False );
792*b1cdbd2cSJim Jagielski else
793*b1cdbd2cSJim Jagielski pDoc->ShowRows( nStart, nEnd, nTab, sal_False );
794*b1cdbd2cSJim Jagielski
795*b1cdbd2cSJim Jagielski pArray->SetVisibleBelow( nLevel, nEntry, sal_False );
796*b1cdbd2cSJim Jagielski
797*b1cdbd2cSJim Jagielski pDoc->DecSizeRecalcLevel( nTab );
798*b1cdbd2cSJim Jagielski pDoc->InvalidatePageBreaks(nTab);
799*b1cdbd2cSJim Jagielski pDoc->UpdatePageBreaks( nTab );
800*b1cdbd2cSJim Jagielski
801*b1cdbd2cSJim Jagielski if (bPaint)
802*b1cdbd2cSJim Jagielski lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd );
803*b1cdbd2cSJim Jagielski
804*b1cdbd2cSJim Jagielski //! ShowCursor();
805*b1cdbd2cSJim Jagielski rDocShell.SetDocumentModified();
806*b1cdbd2cSJim Jagielski
807*b1cdbd2cSJim Jagielski //! if (bPaint)
808*b1cdbd2cSJim Jagielski //! UpdateScrollBars();
809*b1cdbd2cSJim Jagielski
810*b1cdbd2cSJim Jagielski lcl_InvalidateOutliner( rDocShell.GetViewBindings() );
811*b1cdbd2cSJim Jagielski
812*b1cdbd2cSJim Jagielski return sal_True; //! immer ???
813*b1cdbd2cSJim Jagielski }
814*b1cdbd2cSJim Jagielski
815*b1cdbd2cSJim Jagielski
816*b1cdbd2cSJim Jagielski
817*b1cdbd2cSJim Jagielski
818*b1cdbd2cSJim Jagielski
819