xref: /aoo4110/main/sc/source/ui/docshell/olinefun.cxx (revision b1cdbd2c)
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