xref: /aoo4110/main/sc/source/ui/docshell/docfunc.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 "scitems.hxx"
32*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
36*b1cdbd2cSJim Jagielski #include <sfx2/linkmgr.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/svdundo.hxx>
38*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
39*b1cdbd2cSJim Jagielski #include <sfx2/printer.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
41*b1cdbd2cSJim Jagielski #include <vcl/sound.hxx>
42*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
43*b1cdbd2cSJim Jagielski #include <vcl/waitobj.hxx>
44*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
45*b1cdbd2cSJim Jagielski #include <svl/PasswordHelper.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <basic/sbstar.hxx>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/script/ModuleType.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/script/XLibraryContainer.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/script/vba/XVBAModuleInfo.hpp>
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski #include <list>
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #include "docfunc.hxx"
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski #include "sc.hrc"
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski #include "arealink.hxx"
60*b1cdbd2cSJim Jagielski #include "attrib.hxx"
61*b1cdbd2cSJim Jagielski #include "dociter.hxx"
62*b1cdbd2cSJim Jagielski #include "autoform.hxx"
63*b1cdbd2cSJim Jagielski #include "cell.hxx"
64*b1cdbd2cSJim Jagielski #include "detdata.hxx"
65*b1cdbd2cSJim Jagielski #include "detfunc.hxx"
66*b1cdbd2cSJim Jagielski #include "docpool.hxx"
67*b1cdbd2cSJim Jagielski #include "docsh.hxx"
68*b1cdbd2cSJim Jagielski #include "drwlayer.hxx"
69*b1cdbd2cSJim Jagielski #include "editutil.hxx"
70*b1cdbd2cSJim Jagielski #include "globstr.hrc"
71*b1cdbd2cSJim Jagielski //CHINA001 #include "namecrea.hxx"		// NAME_TOP etc.
72*b1cdbd2cSJim Jagielski #include "olinetab.hxx"
73*b1cdbd2cSJim Jagielski #include "patattr.hxx"
74*b1cdbd2cSJim Jagielski #include "rangenam.hxx"
75*b1cdbd2cSJim Jagielski #include "rangeutl.hxx"
76*b1cdbd2cSJim Jagielski #include "refundo.hxx"
77*b1cdbd2cSJim Jagielski #include "scresid.hxx"
78*b1cdbd2cSJim Jagielski #include "stlpool.hxx"
79*b1cdbd2cSJim Jagielski #include "stlsheet.hxx"
80*b1cdbd2cSJim Jagielski #include "tablink.hxx"
81*b1cdbd2cSJim Jagielski #include "tabvwsh.hxx"
82*b1cdbd2cSJim Jagielski #include "uiitems.hxx"
83*b1cdbd2cSJim Jagielski #include "undoblk.hxx"
84*b1cdbd2cSJim Jagielski #include "undocell.hxx"
85*b1cdbd2cSJim Jagielski #include "undodraw.hxx"
86*b1cdbd2cSJim Jagielski #include "undotab.hxx"
87*b1cdbd2cSJim Jagielski #include "waitoff.hxx"
88*b1cdbd2cSJim Jagielski #include "sizedev.hxx"
89*b1cdbd2cSJim Jagielski #include "scmod.hxx"
90*b1cdbd2cSJim Jagielski #include "inputhdl.hxx"
91*b1cdbd2cSJim Jagielski #include "inputwin.hxx"
92*b1cdbd2cSJim Jagielski #include "editable.hxx"
93*b1cdbd2cSJim Jagielski #include "compiler.hxx"
94*b1cdbd2cSJim Jagielski #include "scui_def.hxx" //CHINA001
95*b1cdbd2cSJim Jagielski #include "tabprotection.hxx"
96*b1cdbd2cSJim Jagielski #include "clipparam.hxx"
97*b1cdbd2cSJim Jagielski #include "externalrefmgr.hxx"
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski #include <memory>
100*b1cdbd2cSJim Jagielski #include <basic/basmgr.hxx>
101*b1cdbd2cSJim Jagielski #include <boost/scoped_ptr.hpp>
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski using namespace com::sun::star;
104*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Sequence;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski // STATIC DATA -----------------------------------------------------------
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski //========================================================================
109*b1cdbd2cSJim Jagielski 
IMPL_LINK(ScDocFunc,NotifyDrawUndo,SdrUndoAction *,pUndoAction)110*b1cdbd2cSJim Jagielski IMPL_LINK( ScDocFunc, NotifyDrawUndo, SdrUndoAction*, pUndoAction )
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski     // #i101118# if drawing layer collects the undo actions, add it there
113*b1cdbd2cSJim Jagielski     ScDrawLayer* pDrawLayer = rDocShell.GetDocument()->GetDrawLayer();
114*b1cdbd2cSJim Jagielski     if( pDrawLayer && pDrawLayer->IsUndoAllowed() && pDrawLayer->IsRecording() )
115*b1cdbd2cSJim Jagielski         pDrawLayer->AddCalcUndo( pUndoAction );
116*b1cdbd2cSJim Jagielski     else
117*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->AddUndoAction( new ScUndoDraw( pUndoAction, &rDocShell ) );
118*b1cdbd2cSJim Jagielski 	rDocShell.SetDrawModified();
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski     // the affected sheet isn't known, so all stream positions are invalidated
121*b1cdbd2cSJim Jagielski     ScDocument* pDoc = rDocShell.GetDocument();
122*b1cdbd2cSJim Jagielski     SCTAB nTabCount = pDoc->GetTableCount();
123*b1cdbd2cSJim Jagielski     for (SCTAB nTab=0; nTab<nTabCount; nTab++)
124*b1cdbd2cSJim Jagielski         if (pDoc->IsStreamValid(nTab))
125*b1cdbd2cSJim Jagielski             pDoc->SetStreamValid(nTab, sal_False);
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 	return 0;
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski //	Zeile ueber dem Range painten (fuer Linien nach AdjustRowHeight)
133*b1cdbd2cSJim Jagielski 
lcl_PaintAbove(ScDocShell & rDocShell,const ScRange & rRange)134*b1cdbd2cSJim Jagielski void lcl_PaintAbove( ScDocShell& rDocShell, const ScRange& rRange )
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	SCROW nRow = rRange.aStart.Row();
137*b1cdbd2cSJim Jagielski 	if ( nRow > 0 )
138*b1cdbd2cSJim Jagielski 	{
139*b1cdbd2cSJim Jagielski 		SCTAB nTab = rRange.aStart.Tab();	//! alle?
140*b1cdbd2cSJim Jagielski 		--nRow;
141*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( ScRange(0,nRow,nTab, MAXCOL,nRow,nTab), PAINT_GRID );
142*b1cdbd2cSJim Jagielski 	}
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
146*b1cdbd2cSJim Jagielski 
AdjustRowHeight(const ScRange & rRange,sal_Bool bPaint)147*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::AdjustRowHeight( const ScRange& rRange, sal_Bool bPaint )
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
150*b1cdbd2cSJim Jagielski 	if ( pDoc->IsImportingXML() )
151*b1cdbd2cSJim Jagielski 	{
152*b1cdbd2cSJim Jagielski 		//	for XML import, all row heights are updated together after importing
153*b1cdbd2cSJim Jagielski 		return sal_False;
154*b1cdbd2cSJim Jagielski 	}
155*b1cdbd2cSJim Jagielski     if ( !pDoc->IsAdjustHeightEnabled() )
156*b1cdbd2cSJim Jagielski     {
157*b1cdbd2cSJim Jagielski         return sal_False;
158*b1cdbd2cSJim Jagielski     }
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 	SCTAB nTab      = rRange.aStart.Tab();
161*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
162*b1cdbd2cSJim Jagielski 	SCROW nEndRow   = rRange.aEnd.Row();
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 	ScSizeDeviceProvider aProv( &rDocShell );
165*b1cdbd2cSJim Jagielski 	Fraction aOne(1,1);
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 	sal_Bool bChanged = pDoc->SetOptimalHeight( nStartRow, nEndRow, nTab, 0, aProv.GetDevice(),
168*b1cdbd2cSJim Jagielski 											aProv.GetPPTX(), aProv.GetPPTY(), aOne, aOne, sal_False );
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 	if ( bPaint && bChanged )
171*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( 0, nStartRow, nTab, MAXCOL, MAXROW, nTab,
172*b1cdbd2cSJim Jagielski 											PAINT_GRID | PAINT_LEFT );
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	return bChanged;
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
179*b1cdbd2cSJim Jagielski 
DetectiveAddPred(const ScAddress & rPos)180*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveAddPred(const ScAddress& rPos)
181*b1cdbd2cSJim Jagielski {
182*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	rDocShell.MakeDrawLayer();
185*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
186*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
187*b1cdbd2cSJim Jagielski 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
188*b1cdbd2cSJim Jagielski 	SCCOL nCol = rPos.Col();
189*b1cdbd2cSJim Jagielski 	SCROW nRow = rPos.Row();
190*b1cdbd2cSJim Jagielski 	SCTAB nTab = rPos.Tab();
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	if (bUndo)
193*b1cdbd2cSJim Jagielski 		pModel->BeginCalcUndo(false);
194*b1cdbd2cSJim Jagielski 	sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).ShowPred( nCol, nRow );
195*b1cdbd2cSJim Jagielski 	SdrUndoGroup* pUndo = NULL;
196*b1cdbd2cSJim Jagielski 	if (bUndo)
197*b1cdbd2cSJim Jagielski 		pUndo = pModel->GetCalcUndo();
198*b1cdbd2cSJim Jagielski 	if (bDone)
199*b1cdbd2cSJim Jagielski 	{
200*b1cdbd2cSJim Jagielski 		ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_ADDPRED );
201*b1cdbd2cSJim Jagielski 		pDoc->AddDetectiveOperation( aOperation );
202*b1cdbd2cSJim Jagielski 		if (bUndo)
203*b1cdbd2cSJim Jagielski 		{
204*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
205*b1cdbd2cSJim Jagielski 						new ScUndoDetective( &rDocShell, pUndo, &aOperation ) );
206*b1cdbd2cSJim Jagielski 		}
207*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
208*b1cdbd2cSJim Jagielski 		SfxBindings* pBindings = rDocShell.GetViewBindings();
209*b1cdbd2cSJim Jagielski 		if (pBindings)
210*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( SID_DETECTIVE_REFRESH );
211*b1cdbd2cSJim Jagielski 	}
212*b1cdbd2cSJim Jagielski 	else
213*b1cdbd2cSJim Jagielski 		delete pUndo;
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	return bDone;
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski 
DetectiveDelPred(const ScAddress & rPos)218*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveDelPred(const ScAddress& rPos)
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
223*b1cdbd2cSJim Jagielski 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
224*b1cdbd2cSJim Jagielski 	if (!pModel)
225*b1cdbd2cSJim Jagielski 		return sal_False;
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 	SCCOL nCol = rPos.Col();
230*b1cdbd2cSJim Jagielski 	SCROW nRow = rPos.Row();
231*b1cdbd2cSJim Jagielski 	SCTAB nTab = rPos.Tab();
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 	if (bUndo)
234*b1cdbd2cSJim Jagielski 		pModel->BeginCalcUndo(false);
235*b1cdbd2cSJim Jagielski 	sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).DeletePred( nCol, nRow );
236*b1cdbd2cSJim Jagielski 	SdrUndoGroup* pUndo = NULL;
237*b1cdbd2cSJim Jagielski 	if (bUndo)
238*b1cdbd2cSJim Jagielski 		pUndo = pModel->GetCalcUndo();
239*b1cdbd2cSJim Jagielski 	if (bDone)
240*b1cdbd2cSJim Jagielski 	{
241*b1cdbd2cSJim Jagielski 		ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_DELPRED );
242*b1cdbd2cSJim Jagielski 		pDoc->AddDetectiveOperation( aOperation );
243*b1cdbd2cSJim Jagielski 		if (bUndo)
244*b1cdbd2cSJim Jagielski 		{
245*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
246*b1cdbd2cSJim Jagielski 						new ScUndoDetective( &rDocShell, pUndo, &aOperation ) );
247*b1cdbd2cSJim Jagielski 		}
248*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
249*b1cdbd2cSJim Jagielski 		SfxBindings* pBindings = rDocShell.GetViewBindings();
250*b1cdbd2cSJim Jagielski 		if (pBindings)
251*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( SID_DETECTIVE_REFRESH );
252*b1cdbd2cSJim Jagielski 	}
253*b1cdbd2cSJim Jagielski 	else
254*b1cdbd2cSJim Jagielski 		delete pUndo;
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 	return bDone;
257*b1cdbd2cSJim Jagielski }
258*b1cdbd2cSJim Jagielski 
DetectiveAddSucc(const ScAddress & rPos)259*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveAddSucc(const ScAddress& rPos)
260*b1cdbd2cSJim Jagielski {
261*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 	rDocShell.MakeDrawLayer();
264*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
267*b1cdbd2cSJim Jagielski 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
268*b1cdbd2cSJim Jagielski 	SCCOL nCol = rPos.Col();
269*b1cdbd2cSJim Jagielski 	SCROW nRow = rPos.Row();
270*b1cdbd2cSJim Jagielski 	SCTAB nTab = rPos.Tab();
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	if (bUndo)
273*b1cdbd2cSJim Jagielski 		pModel->BeginCalcUndo(false);
274*b1cdbd2cSJim Jagielski 	sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).ShowSucc( nCol, nRow );
275*b1cdbd2cSJim Jagielski 	SdrUndoGroup* pUndo = NULL;
276*b1cdbd2cSJim Jagielski 	if (bUndo)
277*b1cdbd2cSJim Jagielski 		pUndo = pModel->GetCalcUndo();
278*b1cdbd2cSJim Jagielski 	if (bDone)
279*b1cdbd2cSJim Jagielski 	{
280*b1cdbd2cSJim Jagielski 		ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_ADDSUCC );
281*b1cdbd2cSJim Jagielski 		pDoc->AddDetectiveOperation( aOperation );
282*b1cdbd2cSJim Jagielski 		if (bUndo)
283*b1cdbd2cSJim Jagielski 		{
284*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
285*b1cdbd2cSJim Jagielski 						new ScUndoDetective( &rDocShell, pUndo, &aOperation ) );
286*b1cdbd2cSJim Jagielski 		}
287*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
288*b1cdbd2cSJim Jagielski 		SfxBindings* pBindings = rDocShell.GetViewBindings();
289*b1cdbd2cSJim Jagielski 		if (pBindings)
290*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( SID_DETECTIVE_REFRESH );
291*b1cdbd2cSJim Jagielski 	}
292*b1cdbd2cSJim Jagielski 	else
293*b1cdbd2cSJim Jagielski 		delete pUndo;
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski 	return bDone;
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski 
DetectiveDelSucc(const ScAddress & rPos)298*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveDelSucc(const ScAddress& rPos)
299*b1cdbd2cSJim Jagielski {
300*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
303*b1cdbd2cSJim Jagielski 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
304*b1cdbd2cSJim Jagielski 	if (!pModel)
305*b1cdbd2cSJim Jagielski 		return sal_False;
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 	SCCOL nCol = rPos.Col();
310*b1cdbd2cSJim Jagielski 	SCROW nRow = rPos.Row();
311*b1cdbd2cSJim Jagielski 	SCTAB nTab = rPos.Tab();
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 	if (bUndo)
314*b1cdbd2cSJim Jagielski 		pModel->BeginCalcUndo(false);
315*b1cdbd2cSJim Jagielski 	sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).DeleteSucc( nCol, nRow );
316*b1cdbd2cSJim Jagielski 	SdrUndoGroup* pUndo = NULL;
317*b1cdbd2cSJim Jagielski 	if (bUndo)
318*b1cdbd2cSJim Jagielski 		pUndo = pModel->GetCalcUndo();
319*b1cdbd2cSJim Jagielski 	if (bDone)
320*b1cdbd2cSJim Jagielski 	{
321*b1cdbd2cSJim Jagielski 		ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_DELSUCC );
322*b1cdbd2cSJim Jagielski 		pDoc->AddDetectiveOperation( aOperation );
323*b1cdbd2cSJim Jagielski 		if (bUndo)
324*b1cdbd2cSJim Jagielski 		{
325*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
326*b1cdbd2cSJim Jagielski 						new ScUndoDetective( &rDocShell, pUndo, &aOperation ) );
327*b1cdbd2cSJim Jagielski 		}
328*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
329*b1cdbd2cSJim Jagielski 		SfxBindings* pBindings = rDocShell.GetViewBindings();
330*b1cdbd2cSJim Jagielski 		if (pBindings)
331*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( SID_DETECTIVE_REFRESH );
332*b1cdbd2cSJim Jagielski 	}
333*b1cdbd2cSJim Jagielski 	else
334*b1cdbd2cSJim Jagielski 		delete pUndo;
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 	return bDone;
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski 
DetectiveAddError(const ScAddress & rPos)339*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveAddError(const ScAddress& rPos)
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski 	rDocShell.MakeDrawLayer();
344*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
347*b1cdbd2cSJim Jagielski 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
348*b1cdbd2cSJim Jagielski 	SCCOL nCol = rPos.Col();
349*b1cdbd2cSJim Jagielski 	SCROW nRow = rPos.Row();
350*b1cdbd2cSJim Jagielski 	SCTAB nTab = rPos.Tab();
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 	if (bUndo)
353*b1cdbd2cSJim Jagielski 		pModel->BeginCalcUndo(false);
354*b1cdbd2cSJim Jagielski 	sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).ShowError( nCol, nRow );
355*b1cdbd2cSJim Jagielski 	SdrUndoGroup* pUndo = NULL;
356*b1cdbd2cSJim Jagielski 	if (bUndo)
357*b1cdbd2cSJim Jagielski 		pUndo = pModel->GetCalcUndo();
358*b1cdbd2cSJim Jagielski 	if (bDone)
359*b1cdbd2cSJim Jagielski 	{
360*b1cdbd2cSJim Jagielski 		ScDetOpData aOperation( ScAddress(nCol,nRow,nTab), SCDETOP_ADDERROR );
361*b1cdbd2cSJim Jagielski 		pDoc->AddDetectiveOperation( aOperation );
362*b1cdbd2cSJim Jagielski 		if (bUndo)
363*b1cdbd2cSJim Jagielski 		{
364*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
365*b1cdbd2cSJim Jagielski 						new ScUndoDetective( &rDocShell, pUndo, &aOperation ) );
366*b1cdbd2cSJim Jagielski 		}
367*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
368*b1cdbd2cSJim Jagielski 		SfxBindings* pBindings = rDocShell.GetViewBindings();
369*b1cdbd2cSJim Jagielski 		if (pBindings)
370*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( SID_DETECTIVE_REFRESH );
371*b1cdbd2cSJim Jagielski 	}
372*b1cdbd2cSJim Jagielski 	else
373*b1cdbd2cSJim Jagielski 		delete pUndo;
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 	return bDone;
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski 
DetectiveMarkInvalid(SCTAB nTab)378*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveMarkInvalid(SCTAB nTab)
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 	rDocShell.MakeDrawLayer();
383*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
386*b1cdbd2cSJim Jagielski 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 	Window* pWaitWin = rDocShell.GetActiveDialogParent();
389*b1cdbd2cSJim Jagielski 	if (pWaitWin)
390*b1cdbd2cSJim Jagielski 		pWaitWin->EnterWait();
391*b1cdbd2cSJim Jagielski 	if (bUndo)
392*b1cdbd2cSJim Jagielski 		pModel->BeginCalcUndo(false);
393*b1cdbd2cSJim Jagielski 	sal_Bool bOverflow;
394*b1cdbd2cSJim Jagielski 	sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).MarkInvalid( bOverflow );
395*b1cdbd2cSJim Jagielski 	SdrUndoGroup* pUndo = NULL;
396*b1cdbd2cSJim Jagielski 	if (bUndo)
397*b1cdbd2cSJim Jagielski 		pUndo = pModel->GetCalcUndo();
398*b1cdbd2cSJim Jagielski 	if (pWaitWin)
399*b1cdbd2cSJim Jagielski 		pWaitWin->LeaveWait();
400*b1cdbd2cSJim Jagielski 	if (bDone)
401*b1cdbd2cSJim Jagielski 	{
402*b1cdbd2cSJim Jagielski 		if (pUndo && bUndo)
403*b1cdbd2cSJim Jagielski 		{
404*b1cdbd2cSJim Jagielski 			pUndo->SetComment( ScGlobal::GetRscString( STR_UNDO_DETINVALID ) );
405*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction( pUndo );
406*b1cdbd2cSJim Jagielski 		}
407*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
408*b1cdbd2cSJim Jagielski 		if ( bOverflow )
409*b1cdbd2cSJim Jagielski 		{
410*b1cdbd2cSJim Jagielski 			InfoBox( NULL,
411*b1cdbd2cSJim Jagielski 					ScGlobal::GetRscString( STR_DETINVALID_OVERFLOW ) ).Execute();
412*b1cdbd2cSJim Jagielski 		}
413*b1cdbd2cSJim Jagielski 	}
414*b1cdbd2cSJim Jagielski 	else
415*b1cdbd2cSJim Jagielski 		delete pUndo;
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski 	return bDone;
418*b1cdbd2cSJim Jagielski }
419*b1cdbd2cSJim Jagielski 
DetectiveDelAll(SCTAB nTab)420*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveDelAll(SCTAB nTab)
421*b1cdbd2cSJim Jagielski {
422*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
425*b1cdbd2cSJim Jagielski 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
426*b1cdbd2cSJim Jagielski 	if (!pModel)
427*b1cdbd2cSJim Jagielski 		return sal_False;
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 	if (bUndo)
432*b1cdbd2cSJim Jagielski 		pModel->BeginCalcUndo(false);
433*b1cdbd2cSJim Jagielski 	sal_Bool bDone = ScDetectiveFunc( pDoc,nTab ).DeleteAll( SC_DET_DETECTIVE );
434*b1cdbd2cSJim Jagielski 	SdrUndoGroup* pUndo = NULL;
435*b1cdbd2cSJim Jagielski 	if (bUndo)
436*b1cdbd2cSJim Jagielski 		pUndo = pModel->GetCalcUndo();
437*b1cdbd2cSJim Jagielski 	if (bDone)
438*b1cdbd2cSJim Jagielski 	{
439*b1cdbd2cSJim Jagielski 		ScDetOpList* pOldList = pDoc->GetDetOpList();
440*b1cdbd2cSJim Jagielski 		ScDetOpList* pUndoList = NULL;
441*b1cdbd2cSJim Jagielski 		if (bUndo)
442*b1cdbd2cSJim Jagielski 			pUndoList = pOldList ? new ScDetOpList(*pOldList) : NULL;
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski 		pDoc->ClearDetectiveOperations();
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 		if (bUndo)
447*b1cdbd2cSJim Jagielski 		{
448*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
449*b1cdbd2cSJim Jagielski 						new ScUndoDetective( &rDocShell, pUndo, NULL, pUndoList ) );
450*b1cdbd2cSJim Jagielski 		}
451*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
452*b1cdbd2cSJim Jagielski 		SfxBindings* pBindings = rDocShell.GetViewBindings();
453*b1cdbd2cSJim Jagielski 		if (pBindings)
454*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( SID_DETECTIVE_REFRESH );
455*b1cdbd2cSJim Jagielski 	}
456*b1cdbd2cSJim Jagielski 	else
457*b1cdbd2cSJim Jagielski 		delete pUndo;
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 	return bDone;
460*b1cdbd2cSJim Jagielski }
461*b1cdbd2cSJim Jagielski 
DetectiveRefresh(sal_Bool bAutomatic)462*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DetectiveRefresh( sal_Bool bAutomatic )
463*b1cdbd2cSJim Jagielski {
464*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
465*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
468*b1cdbd2cSJim Jagielski 	ScDetOpList* pList = pDoc->GetDetOpList();
469*b1cdbd2cSJim Jagielski 	if ( pList && pList->Count() )
470*b1cdbd2cSJim Jagielski 	{
471*b1cdbd2cSJim Jagielski 		rDocShell.MakeDrawLayer();
472*b1cdbd2cSJim Jagielski 		ScDrawLayer* pModel = pDoc->GetDrawLayer();
473*b1cdbd2cSJim Jagielski 		if (bUndo)
474*b1cdbd2cSJim Jagielski 			pModel->BeginCalcUndo(false);
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski 		//	Loeschen auf allen Tabellen
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
479*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=0; nTab<nTabCount; nTab++)
480*b1cdbd2cSJim Jagielski 			ScDetectiveFunc( pDoc,nTab ).DeleteAll( SC_DET_ARROWS );	// don't remove circles
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 		//	Wiederholen
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = pList->Count();
485*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i=0; i<nCount; i++)
486*b1cdbd2cSJim Jagielski 		{
487*b1cdbd2cSJim Jagielski 			ScDetOpData* pData = (*pList)[i];
488*b1cdbd2cSJim Jagielski 			if (pData)
489*b1cdbd2cSJim Jagielski 			{
490*b1cdbd2cSJim Jagielski 				ScAddress aPos = pData->GetPos();
491*b1cdbd2cSJim Jagielski 				ScDetectiveFunc aFunc( pDoc, aPos.Tab() );
492*b1cdbd2cSJim Jagielski 				SCCOL nCol = aPos.Col();
493*b1cdbd2cSJim Jagielski 				SCROW nRow = aPos.Row();
494*b1cdbd2cSJim Jagielski 				switch (pData->GetOperation())
495*b1cdbd2cSJim Jagielski 				{
496*b1cdbd2cSJim Jagielski 					case SCDETOP_ADDSUCC:
497*b1cdbd2cSJim Jagielski 						aFunc.ShowSucc( nCol, nRow );
498*b1cdbd2cSJim Jagielski 						break;
499*b1cdbd2cSJim Jagielski 					case SCDETOP_DELSUCC:
500*b1cdbd2cSJim Jagielski 						aFunc.DeleteSucc( nCol, nRow );
501*b1cdbd2cSJim Jagielski 						break;
502*b1cdbd2cSJim Jagielski 					case SCDETOP_ADDPRED:
503*b1cdbd2cSJim Jagielski 						aFunc.ShowPred( nCol, nRow );
504*b1cdbd2cSJim Jagielski 						break;
505*b1cdbd2cSJim Jagielski 					case SCDETOP_DELPRED:
506*b1cdbd2cSJim Jagielski 						aFunc.DeletePred( nCol, nRow );
507*b1cdbd2cSJim Jagielski 						break;
508*b1cdbd2cSJim Jagielski 					case SCDETOP_ADDERROR:
509*b1cdbd2cSJim Jagielski 						aFunc.ShowError( nCol, nRow );
510*b1cdbd2cSJim Jagielski 						break;
511*b1cdbd2cSJim Jagielski 					default:
512*b1cdbd2cSJim Jagielski 						DBG_ERROR("falsche Op bei DetectiveRefresh");
513*b1cdbd2cSJim Jagielski 				}
514*b1cdbd2cSJim Jagielski 			}
515*b1cdbd2cSJim Jagielski 		}
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 		if (bUndo)
518*b1cdbd2cSJim Jagielski 		{
519*b1cdbd2cSJim Jagielski 			SdrUndoGroup* pUndo = pModel->GetCalcUndo();
520*b1cdbd2cSJim Jagielski 			if (pUndo)
521*b1cdbd2cSJim Jagielski 			{
522*b1cdbd2cSJim Jagielski 				pUndo->SetComment( ScGlobal::GetRscString( STR_UNDO_DETREFRESH ) );
523*b1cdbd2cSJim Jagielski 				//	wenn automatisch, an letzte Aktion anhaengen
524*b1cdbd2cSJim Jagielski 				rDocShell.GetUndoManager()->AddUndoAction(
525*b1cdbd2cSJim Jagielski 												new ScUndoDraw( pUndo, &rDocShell ),
526*b1cdbd2cSJim Jagielski 												bAutomatic );
527*b1cdbd2cSJim Jagielski 			}
528*b1cdbd2cSJim Jagielski 		}
529*b1cdbd2cSJim Jagielski 		rDocShell.SetDrawModified();
530*b1cdbd2cSJim Jagielski 		bDone = sal_True;
531*b1cdbd2cSJim Jagielski 	}
532*b1cdbd2cSJim Jagielski 	return bDone;
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
536*b1cdbd2cSJim Jagielski 
DeleteContents(const ScMarkData & rMark,sal_uInt16 nFlags,sal_Bool bRecord,sal_Bool bApi)537*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DeleteContents( const ScMarkData& rMark, sal_uInt16 nFlags,
538*b1cdbd2cSJim Jagielski 									sal_Bool bRecord, sal_Bool bApi )
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 	if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
543*b1cdbd2cSJim Jagielski 	{
544*b1cdbd2cSJim Jagielski 		DBG_ERROR("ScDocFunc::DeleteContents ohne Markierung");
545*b1cdbd2cSJim Jagielski 		return sal_False;
546*b1cdbd2cSJim Jagielski 	}
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
551*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, rMark );
554*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
555*b1cdbd2cSJim Jagielski 	{
556*b1cdbd2cSJim Jagielski 		if (!bApi)
557*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
558*b1cdbd2cSJim Jagielski 		return sal_False;
559*b1cdbd2cSJim Jagielski 	}
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 	ScRange aMarkRange;
562*b1cdbd2cSJim Jagielski 	sal_Bool bSimple = sal_False;
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 	ScMarkData aMultiMark = rMark;
565*b1cdbd2cSJim Jagielski 	aMultiMark.SetMarking(sal_False);		// fuer MarkToMulti
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
568*b1cdbd2cSJim Jagielski 	sal_Bool bMulti = !bSimple && aMultiMark.IsMultiMarked();
569*b1cdbd2cSJim Jagielski 	if (!bSimple)
570*b1cdbd2cSJim Jagielski 	{
571*b1cdbd2cSJim Jagielski 		aMultiMark.MarkToMulti();
572*b1cdbd2cSJim Jagielski 		aMultiMark.GetMultiMarkArea( aMarkRange );
573*b1cdbd2cSJim Jagielski 	}
574*b1cdbd2cSJim Jagielski 	ScRange aExtendedRange(aMarkRange);
575*b1cdbd2cSJim Jagielski 	if (!bSimple)
576*b1cdbd2cSJim Jagielski 	{
577*b1cdbd2cSJim Jagielski 		if ( pDoc->ExtendMerge( aExtendedRange, sal_True ) )
578*b1cdbd2cSJim Jagielski 			bMulti = sal_False;
579*b1cdbd2cSJim Jagielski 	}
580*b1cdbd2cSJim Jagielski 
581*b1cdbd2cSJim Jagielski 	// keine Objekte auf geschuetzten Tabellen
582*b1cdbd2cSJim Jagielski 	sal_Bool bObjects = sal_False;
583*b1cdbd2cSJim Jagielski 	if ( nFlags & IDF_OBJECTS )
584*b1cdbd2cSJim Jagielski 	{
585*b1cdbd2cSJim Jagielski 		bObjects = sal_True;
586*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
587*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=0; nTab<nTabCount; nTab++)
588*b1cdbd2cSJim Jagielski 			if (aMultiMark.GetTableSelect(nTab) && pDoc->IsTabProtected(nTab))
589*b1cdbd2cSJim Jagielski 				bObjects = sal_False;
590*b1cdbd2cSJim Jagielski 	}
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 	sal_uInt16 nExtFlags = 0;		// extra flags are needed only if attributes are deleted
593*b1cdbd2cSJim Jagielski 	if ( nFlags & IDF_ATTRIB )
594*b1cdbd2cSJim Jagielski 		rDocShell.UpdatePaintExt( nExtFlags, aMarkRange );
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski 	//	Reihenfolge:
597*b1cdbd2cSJim Jagielski 	//	1) BeginDrawUndo
598*b1cdbd2cSJim Jagielski 	//	2) Objekte loeschen (DrawUndo wird gefuellt)
599*b1cdbd2cSJim Jagielski 	//	3) Inhalte fuer Undo kopieren und Undo-Aktion anlegen
600*b1cdbd2cSJim Jagielski 	//	4) Inhalte loeschen
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski     bool bDrawUndo = bObjects || (nFlags & IDF_NOTE);
603*b1cdbd2cSJim Jagielski     if (bRecord && bDrawUndo)
604*b1cdbd2cSJim Jagielski         pDoc->BeginDrawUndo();
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski 	if (bObjects)
607*b1cdbd2cSJim Jagielski 	{
608*b1cdbd2cSJim Jagielski 		if (bMulti)
609*b1cdbd2cSJim Jagielski 			pDoc->DeleteObjectsInSelection( aMultiMark );
610*b1cdbd2cSJim Jagielski 		else
611*b1cdbd2cSJim Jagielski 			pDoc->DeleteObjectsInArea( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(),
612*b1cdbd2cSJim Jagielski 									   aMarkRange.aEnd.Col(),   aMarkRange.aEnd.Row(),
613*b1cdbd2cSJim Jagielski 									   aMultiMark );
614*b1cdbd2cSJim Jagielski 	}
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski 	if ( bRecord )
617*b1cdbd2cSJim Jagielski 	{
618*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
619*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, aMarkRange.aStart.Tab(), aMarkRange.aEnd.Tab() );
620*b1cdbd2cSJim Jagielski 
621*b1cdbd2cSJim Jagielski 		//	bei "Format/Standard" alle Attribute kopieren, weil CopyToDocument
622*b1cdbd2cSJim Jagielski 		//	nur mit IDF_HARDATTR zu langsam ist:
623*b1cdbd2cSJim Jagielski 		sal_uInt16 nUndoDocFlags = nFlags;
624*b1cdbd2cSJim Jagielski 		if (nFlags & IDF_ATTRIB)
625*b1cdbd2cSJim Jagielski 			nUndoDocFlags |= IDF_ATTRIB;
626*b1cdbd2cSJim Jagielski 		if (nFlags & IDF_EDITATTR)			// Edit-Engine-Attribute
627*b1cdbd2cSJim Jagielski 			nUndoDocFlags |= IDF_STRING;	// -> Zellen werden geaendert
628*b1cdbd2cSJim Jagielski 		if (nFlags & IDF_NOTE)
629*b1cdbd2cSJim Jagielski 			nUndoDocFlags |= IDF_CONTENTS;	// #68795# copy all cells with their notes
630*b1cdbd2cSJim Jagielski         // note captions are handled in drawing undo
631*b1cdbd2cSJim Jagielski         nUndoDocFlags |= IDF_NOCAPTIONS;
632*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( aExtendedRange, nUndoDocFlags, bMulti, pUndoDoc, &aMultiMark );
633*b1cdbd2cSJim Jagielski 	}
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski //!	HideAllCursors();	// falls Zusammenfassung aufgehoben wird
636*b1cdbd2cSJim Jagielski 	if (bSimple)
637*b1cdbd2cSJim Jagielski 		pDoc->DeleteArea( aMarkRange.aStart.Col(), aMarkRange.aStart.Row(),
638*b1cdbd2cSJim Jagielski 						  aMarkRange.aEnd.Col(),   aMarkRange.aEnd.Row(),
639*b1cdbd2cSJim Jagielski 						  aMultiMark, nFlags );
640*b1cdbd2cSJim Jagielski 	else
641*b1cdbd2cSJim Jagielski 	{
642*b1cdbd2cSJim Jagielski 		pDoc->DeleteSelection( nFlags, aMultiMark );
643*b1cdbd2cSJim Jagielski //       aMultiMark.MarkToSimple();
644*b1cdbd2cSJim Jagielski 	}
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski     // add undo action after drawing undo is complete (objects and note captions)
647*b1cdbd2cSJim Jagielski     if( bRecord )
648*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->AddUndoAction(
649*b1cdbd2cSJim Jagielski             new ScUndoDeleteContents( &rDocShell, aMultiMark, aExtendedRange,
650*b1cdbd2cSJim Jagielski                                       pUndoDoc, bMulti, nFlags, bDrawUndo ) );
651*b1cdbd2cSJim Jagielski 
652*b1cdbd2cSJim Jagielski 	if (!AdjustRowHeight( aExtendedRange ))
653*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( aExtendedRange, PAINT_GRID, nExtFlags );
654*b1cdbd2cSJim Jagielski 	else if (nExtFlags & SC_PF_LINES)
655*b1cdbd2cSJim Jagielski 		lcl_PaintAbove( rDocShell, aExtendedRange );	// fuer Linien ueber dem Bereich
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski //	rDocShell.UpdateOle(GetViewData());		//! an der View?
658*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
659*b1cdbd2cSJim Jagielski //!	CellContentChanged();
660*b1cdbd2cSJim Jagielski //!	ShowAllCursors();
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski #if 0
663*b1cdbd2cSJim Jagielski 	//!	muss an der View bleiben !!!!
664*b1cdbd2cSJim Jagielski 	if ( nFlags & IDF_ATTRIB )
665*b1cdbd2cSJim Jagielski 	{
666*b1cdbd2cSJim Jagielski 		if ( nFlags & IDF_CONTENTS )
667*b1cdbd2cSJim Jagielski 			ForgetFormatArea();
668*b1cdbd2cSJim Jagielski 		else
669*b1cdbd2cSJim Jagielski 			StartFormatArea();				// Attribute loeschen ist auch Attributierung
670*b1cdbd2cSJim Jagielski 	}
671*b1cdbd2cSJim Jagielski #endif
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski 	return sal_True;
674*b1cdbd2cSJim Jagielski }
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
677*b1cdbd2cSJim Jagielski 
TransliterateText(const ScMarkData & rMark,sal_Int32 nType,sal_Bool bRecord,sal_Bool bApi)678*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::TransliterateText( const ScMarkData& rMark, sal_Int32 nType,
679*b1cdbd2cSJim Jagielski 									sal_Bool bRecord, sal_Bool bApi )
680*b1cdbd2cSJim Jagielski {
681*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
684*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
685*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, rMark );
688*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
689*b1cdbd2cSJim Jagielski 	{
690*b1cdbd2cSJim Jagielski 		if (!bApi)
691*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
692*b1cdbd2cSJim Jagielski 		return sal_False;
693*b1cdbd2cSJim Jagielski 	}
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 	ScRange aMarkRange;
696*b1cdbd2cSJim Jagielski 	ScMarkData aMultiMark = rMark;
697*b1cdbd2cSJim Jagielski 	aMultiMark.SetMarking(sal_False);		// for MarkToMulti
698*b1cdbd2cSJim Jagielski 	aMultiMark.MarkToMulti();
699*b1cdbd2cSJim Jagielski 	aMultiMark.GetMultiMarkArea( aMarkRange );
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski 	if (bRecord)
702*b1cdbd2cSJim Jagielski 	{
703*b1cdbd2cSJim Jagielski 		SCTAB nStartTab = aMarkRange.aStart.Tab();
704*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
707*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab );
708*b1cdbd2cSJim Jagielski 		for (SCTAB i=0; i<nTabCount; i++)
709*b1cdbd2cSJim Jagielski 			if (i != nStartTab && rMark.GetTableSelect(i))
710*b1cdbd2cSJim Jagielski 				pUndoDoc->AddUndoTab( i, i );
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski 		ScRange aCopyRange = aMarkRange;
713*b1cdbd2cSJim Jagielski 		aCopyRange.aStart.SetTab(0);
714*b1cdbd2cSJim Jagielski 		aCopyRange.aEnd.SetTab(nTabCount-1);
715*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( aCopyRange, IDF_CONTENTS, sal_True, pUndoDoc, &aMultiMark );
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
718*b1cdbd2cSJim Jagielski 			new ScUndoTransliterate( &rDocShell, aMultiMark, pUndoDoc, nType ) );
719*b1cdbd2cSJim Jagielski 	}
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski 	pDoc->TransliterateText( aMultiMark, nType );
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 	if (!AdjustRowHeight( aMarkRange ))
724*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( aMarkRange, PAINT_GRID );
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 	return sal_True;
729*b1cdbd2cSJim Jagielski }
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
732*b1cdbd2cSJim Jagielski 
SetNormalString(const ScAddress & rPos,const String & rText,sal_Bool bApi)733*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::SetNormalString( const ScAddress& rPos, const String& rText, sal_Bool bApi )
734*b1cdbd2cSJim Jagielski {
735*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
736*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
739*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() );
740*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
741*b1cdbd2cSJim Jagielski 	{
742*b1cdbd2cSJim Jagielski 		if (!bApi)
743*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
744*b1cdbd2cSJim Jagielski 		return sal_False;
745*b1cdbd2cSJim Jagielski 	}
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski 	SCTAB* pTabs = NULL;
748*b1cdbd2cSJim Jagielski 	ScBaseCell** ppOldCells = NULL;
749*b1cdbd2cSJim Jagielski 	sal_Bool* pHasFormat = NULL;
750*b1cdbd2cSJim Jagielski 	sal_uLong* pOldFormats = NULL;
751*b1cdbd2cSJim Jagielski 	ScBaseCell* pDocCell = pDoc->GetCell( rPos );
752*b1cdbd2cSJim Jagielski 	sal_Bool bEditDeleted = (pDocCell && pDocCell->GetCellType() == CELLTYPE_EDIT);
753*b1cdbd2cSJim Jagielski 	if (bUndo)
754*b1cdbd2cSJim Jagielski 	{
755*b1cdbd2cSJim Jagielski 		pTabs = new SCTAB[1];
756*b1cdbd2cSJim Jagielski 		pTabs[0] = rPos.Tab();
757*b1cdbd2cSJim Jagielski 		ppOldCells	= new ScBaseCell*[1];
758*b1cdbd2cSJim Jagielski         ppOldCells[0] = pDocCell ? pDocCell->CloneWithoutNote( *pDoc ) : 0;
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski 		pHasFormat = new sal_Bool[1];
761*b1cdbd2cSJim Jagielski 		pOldFormats = new sal_uLong[1];
762*b1cdbd2cSJim Jagielski 		const SfxPoolItem* pItem;
763*b1cdbd2cSJim Jagielski 		const ScPatternAttr* pPattern = pDoc->GetPattern( rPos.Col(),rPos.Row(),rPos.Tab() );
764*b1cdbd2cSJim Jagielski 		if ( SFX_ITEM_SET == pPattern->GetItemSet().GetItemState(
765*b1cdbd2cSJim Jagielski 								ATTR_VALUE_FORMAT,sal_False,&pItem) )
766*b1cdbd2cSJim Jagielski 		{
767*b1cdbd2cSJim Jagielski 			pHasFormat[0] = sal_True;
768*b1cdbd2cSJim Jagielski 			pOldFormats[0] = ((const SfxUInt32Item*)pItem)->GetValue();
769*b1cdbd2cSJim Jagielski 		}
770*b1cdbd2cSJim Jagielski 		else
771*b1cdbd2cSJim Jagielski 			pHasFormat[0] = sal_False;
772*b1cdbd2cSJim Jagielski 	}
773*b1cdbd2cSJim Jagielski 
774*b1cdbd2cSJim Jagielski 	pDoc->SetString( rPos.Col(), rPos.Row(), rPos.Tab(), rText );
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski 	if (bUndo)
777*b1cdbd2cSJim Jagielski 	{
778*b1cdbd2cSJim Jagielski 		//	wegen ChangeTracking darf UndoAction erst nach SetString angelegt werden
779*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(new ScUndoEnterData( &rDocShell, rPos.Col(),rPos.Row(),rPos.Tab(), 1,pTabs,
780*b1cdbd2cSJim Jagielski 									 ppOldCells, pHasFormat, pOldFormats, rText, NULL ) );
781*b1cdbd2cSJim Jagielski 	}
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 	if ( bEditDeleted || pDoc->HasAttrib( ScRange(rPos), HASATTR_NEEDHEIGHT ) )
784*b1cdbd2cSJim Jagielski 		AdjustRowHeight( ScRange(rPos) );
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 	rDocShell.PostPaintCell( rPos );
787*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski     // #107160# notify input handler here the same way as in PutCell
790*b1cdbd2cSJim Jagielski     if (bApi)
791*b1cdbd2cSJim Jagielski         NotifyInputHandler( rPos );
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski 	return sal_True;
794*b1cdbd2cSJim Jagielski }
795*b1cdbd2cSJim Jagielski 
PutCell(const ScAddress & rPos,ScBaseCell * pNewCell,sal_Bool bApi)796*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::PutCell( const ScAddress& rPos, ScBaseCell* pNewCell, sal_Bool bApi )
797*b1cdbd2cSJim Jagielski {
798*b1cdbd2cSJim Jagielski     ScDocShellModificator aModificator( rDocShell );
799*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
800*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
801*b1cdbd2cSJim Jagielski     sal_Bool bXMLLoading(pDoc->IsImportingXML());
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski     // #i925#; it is not neccessary to test whether the cell is editable on loading a XML document
804*b1cdbd2cSJim Jagielski     if (!bXMLLoading)
805*b1cdbd2cSJim Jagielski     {
806*b1cdbd2cSJim Jagielski 	    ScEditableTester aTester( pDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() );
807*b1cdbd2cSJim Jagielski 	    if (!aTester.IsEditable())
808*b1cdbd2cSJim Jagielski 	    {
809*b1cdbd2cSJim Jagielski 		    if (!bApi)
810*b1cdbd2cSJim Jagielski 			    rDocShell.ErrorMessage(aTester.GetMessageId());
811*b1cdbd2cSJim Jagielski 		    pNewCell->Delete();
812*b1cdbd2cSJim Jagielski 		    return sal_False;
813*b1cdbd2cSJim Jagielski 	    }
814*b1cdbd2cSJim Jagielski     }
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski     sal_Bool bEditCell = ( pNewCell->GetCellType() == CELLTYPE_EDIT );
817*b1cdbd2cSJim Jagielski 	ScBaseCell* pDocCell = pDoc->GetCell( rPos );
818*b1cdbd2cSJim Jagielski 	sal_Bool bEditDeleted = (pDocCell && pDocCell->GetCellType() == CELLTYPE_EDIT);
819*b1cdbd2cSJim Jagielski 	sal_Bool bHeight = ( bEditDeleted || bEditCell ||
820*b1cdbd2cSJim Jagielski 					pDoc->HasAttrib( ScRange(rPos), HASATTR_NEEDHEIGHT ) );
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski     ScBaseCell* pUndoCell = (bUndo && pDocCell) ? pDocCell->CloneWithoutNote( *pDoc, rPos ) : 0;
823*b1cdbd2cSJim Jagielski     ScBaseCell* pRedoCell = (bUndo && pNewCell) ? pNewCell->CloneWithoutNote( *pDoc, rPos ) : 0;
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski 	pDoc->PutCell( rPos, pNewCell );
826*b1cdbd2cSJim Jagielski 
827*b1cdbd2cSJim Jagielski 	//	wegen ChangeTracking darf UndoAction erst nach PutCell angelegt werden
828*b1cdbd2cSJim Jagielski 	if (bUndo)
829*b1cdbd2cSJim Jagielski 	{
830*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
831*b1cdbd2cSJim Jagielski 				new ScUndoPutCell( &rDocShell, rPos, pUndoCell, pRedoCell, bHeight ) );
832*b1cdbd2cSJim Jagielski 	}
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski 	if (bHeight)
835*b1cdbd2cSJim Jagielski 		AdjustRowHeight( ScRange(rPos) );
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski     if (!bXMLLoading)
838*b1cdbd2cSJim Jagielski     	rDocShell.PostPaintCell( rPos );
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski     aModificator.SetDocumentModified();
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski     // #i925#; it is not neccessary to notify on loading a XML document
843*b1cdbd2cSJim Jagielski     // #103934#; notify editline and cell in edit mode
844*b1cdbd2cSJim Jagielski     if (bApi && !bXMLLoading)
845*b1cdbd2cSJim Jagielski         NotifyInputHandler( rPos );
846*b1cdbd2cSJim Jagielski 
847*b1cdbd2cSJim Jagielski 	return sal_True;
848*b1cdbd2cSJim Jagielski }
849*b1cdbd2cSJim Jagielski 
NotifyInputHandler(const ScAddress & rPos)850*b1cdbd2cSJim Jagielski void ScDocFunc::NotifyInputHandler( const ScAddress& rPos )
851*b1cdbd2cSJim Jagielski {
852*b1cdbd2cSJim Jagielski     ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
853*b1cdbd2cSJim Jagielski     if ( pViewSh && pViewSh->GetViewData()->GetDocShell() == &rDocShell )
854*b1cdbd2cSJim Jagielski     {
855*b1cdbd2cSJim Jagielski         ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl();
856*b1cdbd2cSJim Jagielski         if ( pInputHdl && pInputHdl->GetCursorPos() == rPos )
857*b1cdbd2cSJim Jagielski         {
858*b1cdbd2cSJim Jagielski             sal_Bool bIsEditMode(pInputHdl->IsEditMode());
859*b1cdbd2cSJim Jagielski 
860*b1cdbd2cSJim Jagielski             // set modified if in editmode, because so the string is not set in the InputWindow like in the cell
861*b1cdbd2cSJim Jagielski             // (the cell shows the same like the InputWindow)
862*b1cdbd2cSJim Jagielski             if (bIsEditMode)
863*b1cdbd2cSJim Jagielski                 pInputHdl->SetModified();
864*b1cdbd2cSJim Jagielski             pViewSh->UpdateInputHandler(sal_False, !bIsEditMode);
865*b1cdbd2cSJim Jagielski         }
866*b1cdbd2cSJim Jagielski     }
867*b1cdbd2cSJim Jagielski }
868*b1cdbd2cSJim Jagielski 
869*b1cdbd2cSJim Jagielski 		struct ScMyRememberItem
870*b1cdbd2cSJim Jagielski 		{
871*b1cdbd2cSJim Jagielski 			sal_uInt16		nIndex;
872*b1cdbd2cSJim Jagielski 			SfxItemSet	aItemSet;
873*b1cdbd2cSJim Jagielski 
ScMyRememberItemScMyRememberItem874*b1cdbd2cSJim Jagielski 			ScMyRememberItem(const SfxItemSet& rItemSet, sal_uInt16 nTempIndex) :
875*b1cdbd2cSJim Jagielski                 nIndex(nTempIndex), aItemSet(rItemSet) {}
876*b1cdbd2cSJim Jagielski 		};
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 		typedef ::std::list<ScMyRememberItem*> ScMyRememberItemList;
879*b1cdbd2cSJim Jagielski 
PutData(const ScAddress & rPos,ScEditEngineDefaulter & rEngine,sal_Bool bInterpret,sal_Bool bApi)880*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::PutData( const ScAddress& rPos, ScEditEngineDefaulter& rEngine, sal_Bool bInterpret, sal_Bool bApi )
881*b1cdbd2cSJim Jagielski {
882*b1cdbd2cSJim Jagielski 	//	PutData ruft PutCell oder SetNormalString
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
885*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
886*b1cdbd2cSJim Jagielski 	ScEditAttrTester aTester( &rEngine );
887*b1cdbd2cSJim Jagielski 	sal_Bool bEditCell = aTester.NeedsObject();
888*b1cdbd2cSJim Jagielski 	if ( bEditCell )
889*b1cdbd2cSJim Jagielski 	{
890*b1cdbd2cSJim Jagielski         // #i61702# With bLoseContent set, the content of rEngine isn't restored
891*b1cdbd2cSJim Jagielski         // (used in loading XML, where after the removeActionLock call the API obejct's
892*b1cdbd2cSJim Jagielski         // EditEngine isn't accessed again.
893*b1cdbd2cSJim Jagielski         sal_Bool bLoseContent = pDoc->IsImportingXML();
894*b1cdbd2cSJim Jagielski 
895*b1cdbd2cSJim Jagielski 		sal_Bool bUpdateMode(rEngine.GetUpdateMode());
896*b1cdbd2cSJim Jagielski 		if (bUpdateMode)
897*b1cdbd2cSJim Jagielski 			rEngine.SetUpdateMode(sal_False);
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski 		ScMyRememberItemList aRememberItems;
900*b1cdbd2cSJim Jagielski 		ScMyRememberItem* pRememberItem = NULL;
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski 		//	All paragraph attributes must be removed before calling CreateTextObject,
903*b1cdbd2cSJim Jagielski 		//	not only alignment, so the object doesn't contain the cell attributes as
904*b1cdbd2cSJim Jagielski 		//	paragraph attributes. Before remove the attributes store they in a list to
905*b1cdbd2cSJim Jagielski 		//	set they back to the EditEngine.
906*b1cdbd2cSJim Jagielski 		sal_uInt16 nCount = rEngine.GetParagraphCount();
907*b1cdbd2cSJim Jagielski 		for (sal_uInt16 i=0; i<nCount; i++)
908*b1cdbd2cSJim Jagielski 		{
909*b1cdbd2cSJim Jagielski 			const SfxItemSet& rOld = rEngine.GetParaAttribs( i );
910*b1cdbd2cSJim Jagielski 			if ( rOld.Count() )
911*b1cdbd2cSJim Jagielski 			{
912*b1cdbd2cSJim Jagielski                 if ( !bLoseContent )
913*b1cdbd2cSJim Jagielski                 {
914*b1cdbd2cSJim Jagielski                     pRememberItem = new ScMyRememberItem(rEngine.GetParaAttribs(i), i);
915*b1cdbd2cSJim Jagielski                     aRememberItems.push_back(pRememberItem);
916*b1cdbd2cSJim Jagielski                 }
917*b1cdbd2cSJim Jagielski 				rEngine.SetParaAttribs( i, SfxItemSet( *rOld.GetPool(), rOld.GetRanges() ) );
918*b1cdbd2cSJim Jagielski 			}
919*b1cdbd2cSJim Jagielski 		}
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski 		EditTextObject* pNewData = rEngine.CreateTextObject();
922*b1cdbd2cSJim Jagielski 		bRet = PutCell( rPos,
923*b1cdbd2cSJim Jagielski 						new ScEditCell( pNewData, pDoc, rEngine.GetEditTextObjectPool() ),
924*b1cdbd2cSJim Jagielski 						bApi );
925*b1cdbd2cSJim Jagielski 		delete pNewData;
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski 		// Set the paragraph attributes back to the EditEngine.
928*b1cdbd2cSJim Jagielski 		if (!aRememberItems.empty())
929*b1cdbd2cSJim Jagielski 		{
930*b1cdbd2cSJim Jagielski //            ScMyRememberItem* pRememberItem = NULL;
931*b1cdbd2cSJim Jagielski 			ScMyRememberItemList::iterator aItr = aRememberItems.begin();
932*b1cdbd2cSJim Jagielski 			while (aItr != aRememberItems.end())
933*b1cdbd2cSJim Jagielski 			{
934*b1cdbd2cSJim Jagielski 				pRememberItem = *aItr;
935*b1cdbd2cSJim Jagielski 				rEngine.SetParaAttribs(pRememberItem->nIndex, pRememberItem->aItemSet);
936*b1cdbd2cSJim Jagielski 				delete pRememberItem;
937*b1cdbd2cSJim Jagielski 				aItr = aRememberItems.erase(aItr);
938*b1cdbd2cSJim Jagielski 			}
939*b1cdbd2cSJim Jagielski 		}
940*b1cdbd2cSJim Jagielski 
941*b1cdbd2cSJim Jagielski         // #i61702# if the content isn't accessed, there's no need to set the UpdateMode again
942*b1cdbd2cSJim Jagielski         if ( bUpdateMode && !bLoseContent )
943*b1cdbd2cSJim Jagielski 			rEngine.SetUpdateMode(sal_True);
944*b1cdbd2cSJim Jagielski 	}
945*b1cdbd2cSJim Jagielski 	else
946*b1cdbd2cSJim Jagielski 	{
947*b1cdbd2cSJim Jagielski 		String aText = rEngine.GetText();
948*b1cdbd2cSJim Jagielski 		if ( bInterpret || !aText.Len() )
949*b1cdbd2cSJim Jagielski 			bRet = SetNormalString( rPos, aText, bApi );
950*b1cdbd2cSJim Jagielski 		else
951*b1cdbd2cSJim Jagielski 			bRet = PutCell( rPos, new ScStringCell( aText ), bApi );
952*b1cdbd2cSJim Jagielski 	}
953*b1cdbd2cSJim Jagielski 
954*b1cdbd2cSJim Jagielski 	if ( bRet && aTester.NeedsCellAttr() )
955*b1cdbd2cSJim Jagielski 	{
956*b1cdbd2cSJim Jagielski 		const SfxItemSet& rEditAttr = aTester.GetAttribs();
957*b1cdbd2cSJim Jagielski 		ScPatternAttr aPattern( pDoc->GetPool() );
958*b1cdbd2cSJim Jagielski 		aPattern.GetFromEditItemSet( &rEditAttr );
959*b1cdbd2cSJim Jagielski 		aPattern.DeleteUnchanged( pDoc->GetPattern( rPos.Col(), rPos.Row(), rPos.Tab() ) );
960*b1cdbd2cSJim Jagielski 		aPattern.GetItemSet().ClearItem( ATTR_HOR_JUSTIFY );	// wasn't removed above if no edit object
961*b1cdbd2cSJim Jagielski 		if ( aPattern.GetItemSet().Count() > 0 )
962*b1cdbd2cSJim Jagielski 		{
963*b1cdbd2cSJim Jagielski 			ScMarkData aMark;
964*b1cdbd2cSJim Jagielski 			aMark.SelectTable( rPos.Tab(), sal_True );
965*b1cdbd2cSJim Jagielski 			aMark.SetMarkArea( ScRange( rPos ) );
966*b1cdbd2cSJim Jagielski 			ApplyAttributes( aMark, aPattern, sal_True, bApi );
967*b1cdbd2cSJim Jagielski 		}
968*b1cdbd2cSJim Jagielski 	}
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski 	return bRet;
971*b1cdbd2cSJim Jagielski }
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski 
lcl_ScDocFunc_CreateTokenArrayXML(const String & rText,const String & rFormulaNmsp,const formula::FormulaGrammar::Grammar eGrammar)974*b1cdbd2cSJim Jagielski ScTokenArray* lcl_ScDocFunc_CreateTokenArrayXML( const String& rText, const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar )
975*b1cdbd2cSJim Jagielski {
976*b1cdbd2cSJim Jagielski 	ScTokenArray* pCode = new ScTokenArray;
977*b1cdbd2cSJim Jagielski     pCode->AddString( rText );
978*b1cdbd2cSJim Jagielski     if( (eGrammar == formula::FormulaGrammar::GRAM_EXTERNAL) && (rFormulaNmsp.Len() > 0) )
979*b1cdbd2cSJim Jagielski         pCode->AddString( rFormulaNmsp );
980*b1cdbd2cSJim Jagielski 	return pCode;
981*b1cdbd2cSJim Jagielski }
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski 
InterpretEnglishString(const ScAddress & rPos,const String & rText,const String & rFormulaNmsp,const formula::FormulaGrammar::Grammar eGrammar,short * pRetFormatType)984*b1cdbd2cSJim Jagielski ScBaseCell* ScDocFunc::InterpretEnglishString( const ScAddress& rPos,
985*b1cdbd2cSJim Jagielski         const String& rText, const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar, short* pRetFormatType )
986*b1cdbd2cSJim Jagielski {
987*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
988*b1cdbd2cSJim Jagielski 	ScBaseCell* pNewCell = NULL;
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski 	if ( rText.Len() > 1 && rText.GetChar(0) == '=' )
991*b1cdbd2cSJim Jagielski 	{
992*b1cdbd2cSJim Jagielski 		ScTokenArray* pCode;
993*b1cdbd2cSJim Jagielski 		if ( pDoc->IsImportingXML() )
994*b1cdbd2cSJim Jagielski 		{	// temporary formula string as string tokens
995*b1cdbd2cSJim Jagielski             pCode = lcl_ScDocFunc_CreateTokenArrayXML( rText, rFormulaNmsp, eGrammar );
996*b1cdbd2cSJim Jagielski             pDoc->IncXMLImportedFormulaCount( rText.Len() );
997*b1cdbd2cSJim Jagielski 		}
998*b1cdbd2cSJim Jagielski 		else
999*b1cdbd2cSJim Jagielski 		{
1000*b1cdbd2cSJim Jagielski 			ScCompiler aComp( pDoc, rPos );
1001*b1cdbd2cSJim Jagielski             aComp.SetGrammar(eGrammar);
1002*b1cdbd2cSJim Jagielski 			pCode = aComp.CompileString( rText );
1003*b1cdbd2cSJim Jagielski 		}
1004*b1cdbd2cSJim Jagielski 		pNewCell = new ScFormulaCell( pDoc, rPos, pCode, eGrammar, MM_NONE );
1005*b1cdbd2cSJim Jagielski 		delete pCode;	// Zell-ctor hat das TokenArray kopiert
1006*b1cdbd2cSJim Jagielski 	}
1007*b1cdbd2cSJim Jagielski 	else if ( rText.Len() > 1 && rText.GetChar(0) == '\'' )
1008*b1cdbd2cSJim Jagielski 	{
1009*b1cdbd2cSJim Jagielski 		//	for bEnglish, "'" at the beginning is always interpreted as text
1010*b1cdbd2cSJim Jagielski 		//	marker and stripped
1011*b1cdbd2cSJim Jagielski 		pNewCell = ScBaseCell::CreateTextCell( rText.Copy( 1 ), pDoc );
1012*b1cdbd2cSJim Jagielski 	}
1013*b1cdbd2cSJim Jagielski 	else		// (nur) auf englisches Zahlformat testen
1014*b1cdbd2cSJim Jagielski 	{
1015*b1cdbd2cSJim Jagielski 		SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
1016*b1cdbd2cSJim Jagielski 		sal_uInt32 nEnglish = pFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US);
1017*b1cdbd2cSJim Jagielski 		double fVal;
1018*b1cdbd2cSJim Jagielski 		if ( pFormatter->IsNumberFormat( rText, nEnglish, fVal ) )
1019*b1cdbd2cSJim Jagielski         {
1020*b1cdbd2cSJim Jagielski 			pNewCell = new ScValueCell( fVal );
1021*b1cdbd2cSJim Jagielski             // return the format type from the English format, so a localized format can be created
1022*b1cdbd2cSJim Jagielski             if ( pRetFormatType )
1023*b1cdbd2cSJim Jagielski                 *pRetFormatType = pFormatter->GetType( nEnglish );
1024*b1cdbd2cSJim Jagielski         }
1025*b1cdbd2cSJim Jagielski 		else if ( rText.Len() )
1026*b1cdbd2cSJim Jagielski 			pNewCell = ScBaseCell::CreateTextCell( rText, pDoc );
1027*b1cdbd2cSJim Jagielski 
1028*b1cdbd2cSJim Jagielski 		//	das (englische) Zahlformat wird nicht gesetzt
1029*b1cdbd2cSJim Jagielski 		//!	passendes lokales Format suchen und setzen???
1030*b1cdbd2cSJim Jagielski 	}
1031*b1cdbd2cSJim Jagielski 
1032*b1cdbd2cSJim Jagielski 	return pNewCell;
1033*b1cdbd2cSJim Jagielski }
1034*b1cdbd2cSJim Jagielski 
1035*b1cdbd2cSJim Jagielski 
SetCellText(const ScAddress & rPos,const String & rText,sal_Bool bInterpret,sal_Bool bEnglish,sal_Bool bApi,const String & rFormulaNmsp,const formula::FormulaGrammar::Grammar eGrammar)1036*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::SetCellText( const ScAddress& rPos, const String& rText,
1037*b1cdbd2cSJim Jagielski         sal_Bool bInterpret, sal_Bool bEnglish, sal_Bool bApi,
1038*b1cdbd2cSJim Jagielski         const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar )
1039*b1cdbd2cSJim Jagielski {
1040*b1cdbd2cSJim Jagielski 	//	SetCellText ruft PutCell oder SetNormalString
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
1043*b1cdbd2cSJim Jagielski 	ScBaseCell* pNewCell = NULL;
1044*b1cdbd2cSJim Jagielski 	if ( bInterpret )
1045*b1cdbd2cSJim Jagielski 	{
1046*b1cdbd2cSJim Jagielski 		if ( bEnglish )
1047*b1cdbd2cSJim Jagielski 		{
1048*b1cdbd2cSJim Jagielski             ::boost::scoped_ptr<ScExternalRefManager::ApiGuard> pExtRefGuard;
1049*b1cdbd2cSJim Jagielski             if (bApi)
1050*b1cdbd2cSJim Jagielski                 pExtRefGuard.reset(new ScExternalRefManager::ApiGuard(pDoc));
1051*b1cdbd2cSJim Jagielski 
1052*b1cdbd2cSJim Jagielski 			//	code moved to own method InterpretEnglishString because it is also used in
1053*b1cdbd2cSJim Jagielski 			//	ScCellRangeObj::setFormulaArray
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski             pNewCell = InterpretEnglishString( rPos, rText, rFormulaNmsp, eGrammar );
1056*b1cdbd2cSJim Jagielski 		}
1057*b1cdbd2cSJim Jagielski 		// sonst Null behalten -> SetString mit lokalen Formeln/Zahlformat
1058*b1cdbd2cSJim Jagielski 	}
1059*b1cdbd2cSJim Jagielski 	else if ( rText.Len() )
1060*b1cdbd2cSJim Jagielski     {
1061*b1cdbd2cSJim Jagielski         OSL_ENSURE( rFormulaNmsp.Len() == 0, "ScDocFunc::SetCellText - formula namespace, but do not interpret?" );
1062*b1cdbd2cSJim Jagielski 		pNewCell = ScBaseCell::CreateTextCell( rText, pDoc );	// immer Text
1063*b1cdbd2cSJim Jagielski     }
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski 	if (pNewCell)
1066*b1cdbd2cSJim Jagielski 		return PutCell( rPos, pNewCell, bApi );
1067*b1cdbd2cSJim Jagielski 	else
1068*b1cdbd2cSJim Jagielski 		return SetNormalString( rPos, rText, bApi );
1069*b1cdbd2cSJim Jagielski }
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1072*b1cdbd2cSJim Jagielski 
ShowNote(const ScAddress & rPos,bool bShow)1073*b1cdbd2cSJim Jagielski bool ScDocFunc::ShowNote( const ScAddress& rPos, bool bShow )
1074*b1cdbd2cSJim Jagielski {
1075*b1cdbd2cSJim Jagielski 	ScDocument& rDoc = *rDocShell.GetDocument();
1076*b1cdbd2cSJim Jagielski 	ScPostIt* pNote = rDoc.GetNote( rPos );
1077*b1cdbd2cSJim Jagielski     if( !pNote || (bShow == pNote->IsCaptionShown()) ) return false;
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski     // move the caption to internal or hidden layer and create undo action
1080*b1cdbd2cSJim Jagielski     pNote->ShowCaption( rPos, bShow );
1081*b1cdbd2cSJim Jagielski     if( rDoc.IsUndoEnabled() )
1082*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->AddUndoAction( new ScUndoShowHideNote( rDocShell, rPos, bShow ) );
1083*b1cdbd2cSJim Jagielski 
1084*b1cdbd2cSJim Jagielski     if (rDoc.IsStreamValid(rPos.Tab()))
1085*b1cdbd2cSJim Jagielski         rDoc.SetStreamValid(rPos.Tab(), sal_False);
1086*b1cdbd2cSJim Jagielski 
1087*b1cdbd2cSJim Jagielski     rDocShell.SetDocumentModified();
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski     return true;
1090*b1cdbd2cSJim Jagielski }
1091*b1cdbd2cSJim Jagielski 
1092*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1093*b1cdbd2cSJim Jagielski 
SetNoteText(const ScAddress & rPos,const String & rText,sal_Bool bApi)1094*b1cdbd2cSJim Jagielski bool ScDocFunc::SetNoteText( const ScAddress& rPos, const String& rText, sal_Bool bApi )
1095*b1cdbd2cSJim Jagielski {
1096*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
1097*b1cdbd2cSJim Jagielski 
1098*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
1099*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() );
1100*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
1101*b1cdbd2cSJim Jagielski 	{
1102*b1cdbd2cSJim Jagielski 		if (!bApi)
1103*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
1104*b1cdbd2cSJim Jagielski         return false;
1105*b1cdbd2cSJim Jagielski 	}
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski 	String aNewText = rText;
1108*b1cdbd2cSJim Jagielski 	aNewText.ConvertLineEnd();		//! ist das noetig ???
1109*b1cdbd2cSJim Jagielski 
1110*b1cdbd2cSJim Jagielski     if( ScPostIt* pNote = (aNewText.Len() > 0) ? pDoc->GetOrCreateNote( rPos ) : pDoc->GetNote( rPos ) )
1111*b1cdbd2cSJim Jagielski         pNote->SetText( rPos, aNewText );
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski 	//!	Undo !!!
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski     if (pDoc->IsStreamValid(rPos.Tab()))
1116*b1cdbd2cSJim Jagielski         pDoc->SetStreamValid(rPos.Tab(), sal_False);
1117*b1cdbd2cSJim Jagielski 
1118*b1cdbd2cSJim Jagielski 	rDocShell.PostPaintCell( rPos );
1119*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
1120*b1cdbd2cSJim Jagielski 
1121*b1cdbd2cSJim Jagielski     return true;
1122*b1cdbd2cSJim Jagielski }
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1125*b1cdbd2cSJim Jagielski 
ReplaceNote(const ScAddress & rPos,const String & rNoteText,const String * pAuthor,const String * pDate,sal_Bool bApi)1126*b1cdbd2cSJim Jagielski bool ScDocFunc::ReplaceNote( const ScAddress& rPos, const String& rNoteText, const String* pAuthor, const String* pDate, sal_Bool bApi )
1127*b1cdbd2cSJim Jagielski {
1128*b1cdbd2cSJim Jagielski     bool bDone = false;
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski     ScDocShellModificator aModificator( rDocShell );
1131*b1cdbd2cSJim Jagielski     ScDocument& rDoc = *rDocShell.GetDocument();
1132*b1cdbd2cSJim Jagielski     ScEditableTester aTester( &rDoc, rPos.Tab(), rPos.Col(),rPos.Row(), rPos.Col(),rPos.Row() );
1133*b1cdbd2cSJim Jagielski     if (aTester.IsEditable())
1134*b1cdbd2cSJim Jagielski     {
1135*b1cdbd2cSJim Jagielski         ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
1136*b1cdbd2cSJim Jagielski         ::svl::IUndoManager* pUndoMgr = (pDrawLayer && rDoc.IsUndoEnabled()) ? rDocShell.GetUndoManager() : 0;
1137*b1cdbd2cSJim Jagielski 
1138*b1cdbd2cSJim Jagielski         ScNoteData aOldData;
1139*b1cdbd2cSJim Jagielski         ScPostIt* pOldNote = rDoc.ReleaseNote( rPos );
1140*b1cdbd2cSJim Jagielski         if( pOldNote )
1141*b1cdbd2cSJim Jagielski         {
1142*b1cdbd2cSJim Jagielski             // ensure existing caption object before draw undo tracking starts
1143*b1cdbd2cSJim Jagielski             pOldNote->GetOrCreateCaption( rPos );
1144*b1cdbd2cSJim Jagielski             // rescue note data for undo
1145*b1cdbd2cSJim Jagielski             aOldData = pOldNote->GetNoteData();
1146*b1cdbd2cSJim Jagielski         }
1147*b1cdbd2cSJim Jagielski 
1148*b1cdbd2cSJim Jagielski         // collect drawing undo actions for deleting/inserting caption obejcts
1149*b1cdbd2cSJim Jagielski         if( pUndoMgr )
1150*b1cdbd2cSJim Jagielski             pDrawLayer->BeginCalcUndo(false);
1151*b1cdbd2cSJim Jagielski 
1152*b1cdbd2cSJim Jagielski         // delete the note (creates drawing undo action for the caption object)
1153*b1cdbd2cSJim Jagielski         delete pOldNote;
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski         // create new note (creates drawing undo action for the new caption object)
1156*b1cdbd2cSJim Jagielski         ScNoteData aNewData;
1157*b1cdbd2cSJim Jagielski         if( ScPostIt* pNewNote = ScNoteUtil::CreateNoteFromString( rDoc, rPos, rNoteText, false, true ) )
1158*b1cdbd2cSJim Jagielski         {
1159*b1cdbd2cSJim Jagielski             if( pAuthor ) pNewNote->SetAuthor( *pAuthor );
1160*b1cdbd2cSJim Jagielski             if( pDate ) pNewNote->SetDate( *pDate );
1161*b1cdbd2cSJim Jagielski             // rescue note data for undo
1162*b1cdbd2cSJim Jagielski             aNewData = pNewNote->GetNoteData();
1163*b1cdbd2cSJim Jagielski         }
1164*b1cdbd2cSJim Jagielski 
1165*b1cdbd2cSJim Jagielski         // create the undo action
1166*b1cdbd2cSJim Jagielski         if( pUndoMgr && (aOldData.mpCaption || aNewData.mpCaption) )
1167*b1cdbd2cSJim Jagielski             pUndoMgr->AddUndoAction( new ScUndoReplaceNote( rDocShell, rPos, aOldData, aNewData, pDrawLayer->GetCalcUndo() ) );
1168*b1cdbd2cSJim Jagielski 
1169*b1cdbd2cSJim Jagielski         // repaint cell (to make note marker visible)
1170*b1cdbd2cSJim Jagielski         rDocShell.PostPaintCell( rPos );
1171*b1cdbd2cSJim Jagielski 
1172*b1cdbd2cSJim Jagielski         if (rDoc.IsStreamValid(rPos.Tab()))
1173*b1cdbd2cSJim Jagielski             rDoc.SetStreamValid(rPos.Tab(), sal_False);
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski         aModificator.SetDocumentModified();
1176*b1cdbd2cSJim Jagielski         bDone = true;
1177*b1cdbd2cSJim Jagielski     }
1178*b1cdbd2cSJim Jagielski     else if (!bApi)
1179*b1cdbd2cSJim Jagielski     {
1180*b1cdbd2cSJim Jagielski         rDocShell.ErrorMessage(aTester.GetMessageId());
1181*b1cdbd2cSJim Jagielski     }
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski     return bDone;
1184*b1cdbd2cSJim Jagielski }
1185*b1cdbd2cSJim Jagielski 
1186*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1187*b1cdbd2cSJim Jagielski 
ApplyAttributes(const ScMarkData & rMark,const ScPatternAttr & rPattern,sal_Bool bRecord,sal_Bool bApi)1188*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::ApplyAttributes( const ScMarkData& rMark, const ScPatternAttr& rPattern,
1189*b1cdbd2cSJim Jagielski 									sal_Bool bRecord, sal_Bool bApi )
1190*b1cdbd2cSJim Jagielski {
1191*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
1192*b1cdbd2cSJim Jagielski 	if ( bRecord && !pDoc->IsUndoEnabled() )
1193*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski     sal_Bool bImportingXML = pDoc->IsImportingXML();
1196*b1cdbd2cSJim Jagielski     // Cell formats can still be set if the range isn't editable only because of matrix formulas.
1197*b1cdbd2cSJim Jagielski     // #i62483# When loading XML, the check can be skipped altogether.
1198*b1cdbd2cSJim Jagielski 	sal_Bool bOnlyNotBecauseOfMatrix;
1199*b1cdbd2cSJim Jagielski     if ( !bImportingXML && !pDoc->IsSelectionEditable( rMark, &bOnlyNotBecauseOfMatrix )
1200*b1cdbd2cSJim Jagielski 			&& !bOnlyNotBecauseOfMatrix )
1201*b1cdbd2cSJim Jagielski 	{
1202*b1cdbd2cSJim Jagielski 		if (!bApi)
1203*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_PROTECTIONERR);
1204*b1cdbd2cSJim Jagielski 		return sal_False;
1205*b1cdbd2cSJim Jagielski 	}
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski 	//!	Umrandung
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski 	ScRange aMultiRange;
1212*b1cdbd2cSJim Jagielski 	sal_Bool bMulti = rMark.IsMultiMarked();
1213*b1cdbd2cSJim Jagielski 	if ( bMulti )
1214*b1cdbd2cSJim Jagielski 		rMark.GetMultiMarkArea( aMultiRange );
1215*b1cdbd2cSJim Jagielski 	else
1216*b1cdbd2cSJim Jagielski 		rMark.GetMarkArea( aMultiRange );
1217*b1cdbd2cSJim Jagielski 
1218*b1cdbd2cSJim Jagielski 	if ( bRecord )
1219*b1cdbd2cSJim Jagielski 	{
1220*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1221*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, aMultiRange.aStart.Tab(), aMultiRange.aEnd.Tab() );
1222*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( aMultiRange, IDF_ATTRIB, bMulti, pUndoDoc, &rMark );
1223*b1cdbd2cSJim Jagielski 
1224*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
1225*b1cdbd2cSJim Jagielski 			new ScUndoSelectionAttr(
1226*b1cdbd2cSJim Jagielski 					&rDocShell, rMark,
1227*b1cdbd2cSJim Jagielski 					aMultiRange.aStart.Col(), aMultiRange.aStart.Row(), aMultiRange.aStart.Tab(),
1228*b1cdbd2cSJim Jagielski 					aMultiRange.aEnd.Col(), aMultiRange.aEnd.Row(), aMultiRange.aEnd.Tab(),
1229*b1cdbd2cSJim Jagielski 					pUndoDoc, bMulti, &rPattern ) );
1230*b1cdbd2cSJim Jagielski 	}
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski 	// While loading XML it is not neccessary to ask HasAttrib. It needs too much time.
1233*b1cdbd2cSJim Jagielski 	sal_uInt16 nExtFlags = 0;
1234*b1cdbd2cSJim Jagielski 	if ( !bImportingXML )
1235*b1cdbd2cSJim Jagielski 		rDocShell.UpdatePaintExt( nExtFlags, aMultiRange );		// content before the change
1236*b1cdbd2cSJim Jagielski 	pDoc->ApplySelectionPattern( rPattern, rMark );
1237*b1cdbd2cSJim Jagielski 	if ( !bImportingXML )
1238*b1cdbd2cSJim Jagielski 		rDocShell.UpdatePaintExt( nExtFlags, aMultiRange );		// content after the change
1239*b1cdbd2cSJim Jagielski 
1240*b1cdbd2cSJim Jagielski 	if (!AdjustRowHeight( aMultiRange ))
1241*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( aMultiRange, PAINT_GRID, nExtFlags );
1242*b1cdbd2cSJim Jagielski 	else if (nExtFlags & SC_PF_LINES)
1243*b1cdbd2cSJim Jagielski 		lcl_PaintAbove( rDocShell, aMultiRange );	// fuer Linien ueber dem Bereich
1244*b1cdbd2cSJim Jagielski 
1245*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
1246*b1cdbd2cSJim Jagielski 
1247*b1cdbd2cSJim Jagielski 	return sal_True;
1248*b1cdbd2cSJim Jagielski }
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski 
ApplyStyle(const ScMarkData & rMark,const String & rStyleName,sal_Bool bRecord,sal_Bool bApi)1251*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::ApplyStyle( const ScMarkData& rMark, const String& rStyleName,
1252*b1cdbd2cSJim Jagielski 									sal_Bool bRecord, sal_Bool bApi )
1253*b1cdbd2cSJim Jagielski {
1254*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
1255*b1cdbd2cSJim Jagielski 	if ( bRecord && !pDoc->IsUndoEnabled() )
1256*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
1257*b1cdbd2cSJim Jagielski 
1258*b1cdbd2cSJim Jagielski     sal_Bool bImportingXML = pDoc->IsImportingXML();
1259*b1cdbd2cSJim Jagielski     // Cell formats can still be set if the range isn't editable only because of matrix formulas.
1260*b1cdbd2cSJim Jagielski     // #i62483# When loading XML, the check can be skipped altogether.
1261*b1cdbd2cSJim Jagielski 	sal_Bool bOnlyNotBecauseOfMatrix;
1262*b1cdbd2cSJim Jagielski     if ( !bImportingXML && !pDoc->IsSelectionEditable( rMark, &bOnlyNotBecauseOfMatrix )
1263*b1cdbd2cSJim Jagielski 			&& !bOnlyNotBecauseOfMatrix )
1264*b1cdbd2cSJim Jagielski 	{
1265*b1cdbd2cSJim Jagielski 		if (!bApi)
1266*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_PROTECTIONERR);
1267*b1cdbd2cSJim Jagielski 		return sal_False;
1268*b1cdbd2cSJim Jagielski 	}
1269*b1cdbd2cSJim Jagielski 
1270*b1cdbd2cSJim Jagielski 	ScStyleSheet* pStyleSheet = (ScStyleSheet*) pDoc->GetStyleSheetPool()->Find(
1271*b1cdbd2cSJim Jagielski 												rStyleName, SFX_STYLE_FAMILY_PARA );
1272*b1cdbd2cSJim Jagielski 	if (!pStyleSheet)
1273*b1cdbd2cSJim Jagielski 		return sal_False;
1274*b1cdbd2cSJim Jagielski 
1275*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
1276*b1cdbd2cSJim Jagielski 
1277*b1cdbd2cSJim Jagielski 	ScRange aMultiRange;
1278*b1cdbd2cSJim Jagielski 	sal_Bool bMulti = rMark.IsMultiMarked();
1279*b1cdbd2cSJim Jagielski 	if ( bMulti )
1280*b1cdbd2cSJim Jagielski 		rMark.GetMultiMarkArea( aMultiRange );
1281*b1cdbd2cSJim Jagielski 	else
1282*b1cdbd2cSJim Jagielski 		rMark.GetMarkArea( aMultiRange );
1283*b1cdbd2cSJim Jagielski 
1284*b1cdbd2cSJim Jagielski 	if ( bRecord )
1285*b1cdbd2cSJim Jagielski 	{
1286*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1287*b1cdbd2cSJim Jagielski 		SCTAB nStartTab = aMultiRange.aStart.Tab();
1288*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
1289*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab );
1290*b1cdbd2cSJim Jagielski 		for (SCTAB i=0; i<nTabCount; i++)
1291*b1cdbd2cSJim Jagielski 			if (i != nStartTab && rMark.GetTableSelect(i))
1292*b1cdbd2cSJim Jagielski 				pUndoDoc->AddUndoTab( i, i );
1293*b1cdbd2cSJim Jagielski 
1294*b1cdbd2cSJim Jagielski 		ScRange aCopyRange = aMultiRange;
1295*b1cdbd2cSJim Jagielski 		aCopyRange.aStart.SetTab(0);
1296*b1cdbd2cSJim Jagielski 		aCopyRange.aEnd.SetTab(nTabCount-1);
1297*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, bMulti, pUndoDoc, &rMark );
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
1300*b1cdbd2cSJim Jagielski 			new ScUndoSelectionStyle(
1301*b1cdbd2cSJim Jagielski 					&rDocShell, rMark, aMultiRange, rStyleName, pUndoDoc ) );
1302*b1cdbd2cSJim Jagielski 
1303*b1cdbd2cSJim Jagielski 	}
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski //	sal_Bool bPaintExt = pDoc->HasAttrib( aMultiRange, HASATTR_PAINTEXT );
1306*b1cdbd2cSJim Jagielski //	pDoc->ApplySelectionPattern( rPattern, rMark );
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski 	pDoc->ApplySelectionStyle( (ScStyleSheet&)*pStyleSheet, rMark );
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski //	if (!bPaintExt)
1311*b1cdbd2cSJim Jagielski //		bPaintExt = pDoc->HasAttrib( aMultiRange, HASATTR_PAINTEXT );
1312*b1cdbd2cSJim Jagielski //	sal_uInt16 nExtFlags = bPaintExt ? SC_PF_LINES : 0;
1313*b1cdbd2cSJim Jagielski 	sal_uInt16 nExtFlags = 0;
1314*b1cdbd2cSJim Jagielski 	if (!AdjustRowHeight( aMultiRange ))
1315*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( aMultiRange, PAINT_GRID, nExtFlags );
1316*b1cdbd2cSJim Jagielski 	else if (nExtFlags & SC_PF_LINES)
1317*b1cdbd2cSJim Jagielski 		lcl_PaintAbove( rDocShell, aMultiRange );	// fuer Linien ueber dem Bereich
1318*b1cdbd2cSJim Jagielski 
1319*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
1320*b1cdbd2cSJim Jagielski 
1321*b1cdbd2cSJim Jagielski 	return sal_True;
1322*b1cdbd2cSJim Jagielski }
1323*b1cdbd2cSJim Jagielski 
1324*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1325*b1cdbd2cSJim Jagielski 
InsertCells(const ScRange & rRange,const ScMarkData * pTabMark,InsCellCmd eCmd,sal_Bool bRecord,sal_Bool bApi,sal_Bool bPartOfPaste)1326*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::InsertCells( const ScRange& rRange, const ScMarkData* pTabMark, InsCellCmd eCmd,
1327*b1cdbd2cSJim Jagielski 								sal_Bool bRecord, sal_Bool bApi, sal_Bool bPartOfPaste )
1328*b1cdbd2cSJim Jagielski {
1329*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
1332*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
1333*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
1334*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
1335*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
1336*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
1337*b1cdbd2cSJim Jagielski 
1338*b1cdbd2cSJim Jagielski 	if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) )
1339*b1cdbd2cSJim Jagielski 	{
1340*b1cdbd2cSJim Jagielski 		DBG_ERROR("invalid row in InsertCells");
1341*b1cdbd2cSJim Jagielski 		return sal_False;
1342*b1cdbd2cSJim Jagielski 	}
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
1345*b1cdbd2cSJim Jagielski 	SCTAB nTabCount = pDoc->GetTableCount();
1346*b1cdbd2cSJim Jagielski 	SCCOL nPaintStartX = nStartCol;
1347*b1cdbd2cSJim Jagielski 	SCROW nPaintStartY = nStartRow;
1348*b1cdbd2cSJim Jagielski 	SCCOL nPaintEndX = nEndCol;
1349*b1cdbd2cSJim Jagielski 	SCROW nPaintEndY = nEndRow;
1350*b1cdbd2cSJim Jagielski 	sal_uInt16 nPaintFlags = PAINT_GRID;
1351*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess;
1352*b1cdbd2cSJim Jagielski     SCTAB i;
1353*b1cdbd2cSJim Jagielski 
1354*b1cdbd2cSJim Jagielski     ScTabViewShell* pViewSh = rDocShell.GetBestViewShell();  //preserve current cursor position
1355*b1cdbd2cSJim Jagielski     SCCOL nCursorCol = 0;
1356*b1cdbd2cSJim Jagielski     SCROW nCursorRow = 0;
1357*b1cdbd2cSJim Jagielski     if( pViewSh )
1358*b1cdbd2cSJim Jagielski     {
1359*b1cdbd2cSJim Jagielski         nCursorCol = pViewSh->GetViewData()->GetCurX();
1360*b1cdbd2cSJim Jagielski         nCursorRow = pViewSh->GetViewData()->GetCurY();
1361*b1cdbd2cSJim Jagielski     }
1362*b1cdbd2cSJim Jagielski 
1363*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
1364*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
1365*b1cdbd2cSJim Jagielski 
1366*b1cdbd2cSJim Jagielski     ScMarkData aMark;
1367*b1cdbd2cSJim Jagielski     if (pTabMark)
1368*b1cdbd2cSJim Jagielski         aMark = *pTabMark;
1369*b1cdbd2cSJim Jagielski     else
1370*b1cdbd2cSJim Jagielski     {
1371*b1cdbd2cSJim Jagielski         SCTAB nCount = 0;
1372*b1cdbd2cSJim Jagielski         for( i=0; i<nTabCount; i++ )
1373*b1cdbd2cSJim Jagielski         {
1374*b1cdbd2cSJim Jagielski             if( !pDoc->IsScenario(i) )
1375*b1cdbd2cSJim Jagielski             {
1376*b1cdbd2cSJim Jagielski                 nCount++;
1377*b1cdbd2cSJim Jagielski                 if( nCount == nEndTab+1 )
1378*b1cdbd2cSJim Jagielski                 {
1379*b1cdbd2cSJim Jagielski                     aMark.SelectTable( i, sal_True );
1380*b1cdbd2cSJim Jagielski                     break;
1381*b1cdbd2cSJim Jagielski                 }
1382*b1cdbd2cSJim Jagielski             }
1383*b1cdbd2cSJim Jagielski         }
1384*b1cdbd2cSJim Jagielski     }
1385*b1cdbd2cSJim Jagielski 
1386*b1cdbd2cSJim Jagielski     ScMarkData aFullMark( aMark );          // including scenario sheets
1387*b1cdbd2cSJim Jagielski     for( i=0; i<nTabCount; i++ )
1388*b1cdbd2cSJim Jagielski         if( aMark.GetTableSelect( i ) )
1389*b1cdbd2cSJim Jagielski         {
1390*b1cdbd2cSJim Jagielski             for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
1391*b1cdbd2cSJim Jagielski                 aFullMark.SelectTable( j, sal_True );
1392*b1cdbd2cSJim Jagielski         }
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski     SCTAB nSelCount = aMark.GetSelectCount();
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski 	//	zugehoerige Szenarien auch anpassen
1397*b1cdbd2cSJim Jagielski 	// Test zusammengefasste
1398*b1cdbd2cSJim Jagielski 
1399*b1cdbd2cSJim Jagielski 	SCCOL nMergeTestStartX = nStartCol;
1400*b1cdbd2cSJim Jagielski 	SCROW nMergeTestStartY = nStartRow;
1401*b1cdbd2cSJim Jagielski 	SCCOL nMergeTestEndX = nEndCol;
1402*b1cdbd2cSJim Jagielski 	SCROW nMergeTestEndY = nEndRow;
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski     ScRange aExtendMergeRange( rRange );
1405*b1cdbd2cSJim Jagielski 
1406*b1cdbd2cSJim Jagielski     if( rRange.aStart == rRange.aEnd && pDoc->HasAttrib(rRange, HASATTR_MERGED) )
1407*b1cdbd2cSJim Jagielski     {
1408*b1cdbd2cSJim Jagielski         pDoc->ExtendMerge( aExtendMergeRange );
1409*b1cdbd2cSJim Jagielski         pDoc->ExtendOverlapped( aExtendMergeRange );
1410*b1cdbd2cSJim Jagielski         nMergeTestEndX = aExtendMergeRange.aEnd.Col();
1411*b1cdbd2cSJim Jagielski         nMergeTestEndY = aExtendMergeRange.aEnd.Row();
1412*b1cdbd2cSJim Jagielski         nPaintEndX = nMergeTestEndX;
1413*b1cdbd2cSJim Jagielski         nPaintEndY = nMergeTestEndY;
1414*b1cdbd2cSJim Jagielski     }
1415*b1cdbd2cSJim Jagielski 
1416*b1cdbd2cSJim Jagielski 	if ( eCmd == INS_INSROWS )
1417*b1cdbd2cSJim Jagielski 	{
1418*b1cdbd2cSJim Jagielski 		nMergeTestStartX = 0;
1419*b1cdbd2cSJim Jagielski 		nMergeTestEndX = MAXCOL;
1420*b1cdbd2cSJim Jagielski 	}
1421*b1cdbd2cSJim Jagielski 	if ( eCmd == INS_INSCOLS )
1422*b1cdbd2cSJim Jagielski 	{
1423*b1cdbd2cSJim Jagielski 		nMergeTestStartY = 0;
1424*b1cdbd2cSJim Jagielski 		nMergeTestEndY = MAXROW;
1425*b1cdbd2cSJim Jagielski 	}
1426*b1cdbd2cSJim Jagielski 	if ( eCmd == INS_CELLSDOWN )
1427*b1cdbd2cSJim Jagielski 		nMergeTestEndY = MAXROW;
1428*b1cdbd2cSJim Jagielski 	if ( eCmd == INS_CELLSRIGHT )
1429*b1cdbd2cSJim Jagielski 		nMergeTestEndX = MAXCOL;
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski 	sal_Bool bNeedRefresh = sal_False;
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski 	SCCOL nEditTestEndX = (eCmd==INS_INSCOLS) ? MAXCOL : nMergeTestEndX;
1434*b1cdbd2cSJim Jagielski 	SCROW nEditTestEndY = (eCmd==INS_INSROWS) ? MAXROW : nMergeTestEndY;
1435*b1cdbd2cSJim Jagielski     ScEditableTester aTester( pDoc, nMergeTestStartX, nMergeTestStartY, nEditTestEndX, nEditTestEndY, aMark );
1436*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
1437*b1cdbd2cSJim Jagielski 	{
1438*b1cdbd2cSJim Jagielski 		if (!bApi)
1439*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
1440*b1cdbd2cSJim Jagielski 		return sal_False;
1441*b1cdbd2cSJim Jagielski 	}
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski 	WaitObject aWait( rDocShell.GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
1444*b1cdbd2cSJim Jagielski 
1445*b1cdbd2cSJim Jagielski 	ScDocument* pRefUndoDoc = NULL;
1446*b1cdbd2cSJim Jagielski 	ScRefUndoData* pUndoData = NULL;
1447*b1cdbd2cSJim Jagielski 	if ( bRecord )
1448*b1cdbd2cSJim Jagielski 	{
1449*b1cdbd2cSJim Jagielski 		pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1450*b1cdbd2cSJim Jagielski 		pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, sal_False, sal_False );
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski 		// pRefUndoDoc is filled in InsertCol / InsertRow
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski 		pUndoData = new ScRefUndoData( pDoc );
1455*b1cdbd2cSJim Jagielski 
1456*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();
1457*b1cdbd2cSJim Jagielski 	}
1458*b1cdbd2cSJim Jagielski 
1459*b1cdbd2cSJim Jagielski     // #i8302 : we unmerge overwhelming ranges, before insertion all the actions are put in the same ListAction
1460*b1cdbd2cSJim Jagielski     // the patch comes from mloiseleur and maoyg
1461*b1cdbd2cSJim Jagielski     sal_Bool bInsertMerge = sal_False;
1462*b1cdbd2cSJim Jagielski     std::vector<ScRange> qIncreaseRange;
1463*b1cdbd2cSJim Jagielski     String aUndo = ScGlobal::GetRscString( STR_UNDO_INSERTCELLS );
1464*b1cdbd2cSJim Jagielski     if (bRecord)
1465*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo );
1466*b1cdbd2cSJim Jagielski 
1467*b1cdbd2cSJim Jagielski     for( i=0; i<nTabCount; i++ )
1468*b1cdbd2cSJim Jagielski     {
1469*b1cdbd2cSJim Jagielski         if( aMark.GetTableSelect(i) )
1470*b1cdbd2cSJim Jagielski         {
1471*b1cdbd2cSJim Jagielski             if( pDoc->HasAttrib( nMergeTestStartX, nMergeTestStartY, i, nMergeTestEndX, nMergeTestEndY, i, HASATTR_MERGED | HASATTR_OVERLAPPED ) )
1472*b1cdbd2cSJim Jagielski             {
1473*b1cdbd2cSJim Jagielski                 if (eCmd==INS_CELLSRIGHT)
1474*b1cdbd2cSJim Jagielski                     bNeedRefresh = sal_True;
1475*b1cdbd2cSJim Jagielski 
1476*b1cdbd2cSJim Jagielski                 SCCOL nMergeStartX = nMergeTestStartX;
1477*b1cdbd2cSJim Jagielski                 SCROW nMergeStartY = nMergeTestStartY;
1478*b1cdbd2cSJim Jagielski                 SCCOL nMergeEndX   = nMergeTestEndX;
1479*b1cdbd2cSJim Jagielski                 SCROW nMergeEndY   = nMergeTestEndY;
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski                 pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i );
1482*b1cdbd2cSJim Jagielski                 pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i );
1483*b1cdbd2cSJim Jagielski 
1484*b1cdbd2cSJim Jagielski                 if(( eCmd == INS_CELLSDOWN && ( nMergeStartX != nMergeTestStartX || nMergeEndX != nMergeTestEndX )) ||
1485*b1cdbd2cSJim Jagielski                     (eCmd == INS_CELLSRIGHT && ( nMergeStartY != nMergeTestStartY || nMergeEndY != nMergeTestEndY )) )
1486*b1cdbd2cSJim Jagielski                 {
1487*b1cdbd2cSJim Jagielski                     if (!bApi)
1488*b1cdbd2cSJim Jagielski                         rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0);
1489*b1cdbd2cSJim Jagielski                     rDocShell.GetUndoManager()->LeaveListAction();
1490*b1cdbd2cSJim Jagielski                     return sal_False;
1491*b1cdbd2cSJim Jagielski                 }
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski                 SCCOL nTestCol = -1;
1494*b1cdbd2cSJim Jagielski                 SCROW nTestRow1 = -1;
1495*b1cdbd2cSJim Jagielski                 SCROW nTestRow2 = -1;
1496*b1cdbd2cSJim Jagielski 
1497*b1cdbd2cSJim Jagielski                 ScDocAttrIterator aTestIter( pDoc, i, nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY );
1498*b1cdbd2cSJim Jagielski                 ScRange aExtendRange( nMergeTestStartX, nMergeTestStartY, i, nMergeTestEndX, nMergeTestEndY, i );
1499*b1cdbd2cSJim Jagielski                 const ScPatternAttr* pPattern = NULL;
1500*b1cdbd2cSJim Jagielski                 const ScMergeAttr* pMergeFlag = NULL;
1501*b1cdbd2cSJim Jagielski                 const ScMergeFlagAttr* pMergeFlagAttr = NULL;
1502*b1cdbd2cSJim Jagielski                 while ( ( pPattern = aTestIter.GetNext( nTestCol, nTestRow1, nTestRow2 ) ) != NULL )
1503*b1cdbd2cSJim Jagielski                 {
1504*b1cdbd2cSJim Jagielski                     pMergeFlag = (const ScMergeAttr*) &pPattern->GetItem(ATTR_MERGE);
1505*b1cdbd2cSJim Jagielski                     pMergeFlagAttr = (const ScMergeFlagAttr*) &pPattern->GetItem(ATTR_MERGE_FLAG);
1506*b1cdbd2cSJim Jagielski                     sal_Int16 nNewFlags = pMergeFlagAttr->GetValue() & ( SC_MF_HOR | SC_MF_VER );
1507*b1cdbd2cSJim Jagielski                     if( ( pMergeFlag && pMergeFlag->IsMerged() ) || nNewFlags == SC_MF_HOR || nNewFlags == SC_MF_VER )
1508*b1cdbd2cSJim Jagielski                     {
1509*b1cdbd2cSJim Jagielski                         ScRange aRange( nTestCol, nTestRow1, i );
1510*b1cdbd2cSJim Jagielski                         pDoc->ExtendOverlapped(aRange);
1511*b1cdbd2cSJim Jagielski                         pDoc->ExtendMerge(aRange, sal_True, sal_True);
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski                         if( nTestRow1 < nTestRow2 && nNewFlags == SC_MF_HOR )
1514*b1cdbd2cSJim Jagielski                         {
1515*b1cdbd2cSJim Jagielski                             for( SCROW nTestRow = nTestRow1; nTestRow <= nTestRow2; nTestRow++ )
1516*b1cdbd2cSJim Jagielski                             {
1517*b1cdbd2cSJim Jagielski                                 ScRange aTestRange( nTestCol, nTestRow, i );
1518*b1cdbd2cSJim Jagielski                                 pDoc->ExtendOverlapped( aTestRange );
1519*b1cdbd2cSJim Jagielski                                 pDoc->ExtendMerge( aTestRange, sal_True, sal_True);
1520*b1cdbd2cSJim Jagielski                                 ScRange aMergeRange( aTestRange.aStart.Col(),aTestRange.aStart.Row(), i );
1521*b1cdbd2cSJim Jagielski                                 if( !aExtendRange.In( aMergeRange ) )
1522*b1cdbd2cSJim Jagielski                                 {
1523*b1cdbd2cSJim Jagielski                                     qIncreaseRange.push_back( aTestRange );
1524*b1cdbd2cSJim Jagielski                                     bInsertMerge = sal_True;
1525*b1cdbd2cSJim Jagielski                                 }
1526*b1cdbd2cSJim Jagielski                             }
1527*b1cdbd2cSJim Jagielski                         }
1528*b1cdbd2cSJim Jagielski                         else
1529*b1cdbd2cSJim Jagielski                         {
1530*b1cdbd2cSJim Jagielski                             ScRange aMergeRange( aRange.aStart.Col(),aRange.aStart.Row(), i );
1531*b1cdbd2cSJim Jagielski                             if( !aExtendRange.In( aMergeRange ) )
1532*b1cdbd2cSJim Jagielski                             {
1533*b1cdbd2cSJim Jagielski                                 qIncreaseRange.push_back( aRange );
1534*b1cdbd2cSJim Jagielski                             }
1535*b1cdbd2cSJim Jagielski                             bInsertMerge = sal_True;
1536*b1cdbd2cSJim Jagielski                         }
1537*b1cdbd2cSJim Jagielski                     }
1538*b1cdbd2cSJim Jagielski                 }
1539*b1cdbd2cSJim Jagielski 
1540*b1cdbd2cSJim Jagielski                 if( bInsertMerge )
1541*b1cdbd2cSJim Jagielski                 {
1542*b1cdbd2cSJim Jagielski                     if( eCmd == INS_INSROWS || eCmd == INS_CELLSDOWN )
1543*b1cdbd2cSJim Jagielski                     {
1544*b1cdbd2cSJim Jagielski                         nStartRow = aExtendMergeRange.aStart.Row();
1545*b1cdbd2cSJim Jagielski                         nEndRow = aExtendMergeRange.aEnd.Row();
1546*b1cdbd2cSJim Jagielski 
1547*b1cdbd2cSJim Jagielski                         if( eCmd == INS_CELLSDOWN )
1548*b1cdbd2cSJim Jagielski                             nEndCol = nMergeTestEndX;
1549*b1cdbd2cSJim Jagielski                         else
1550*b1cdbd2cSJim Jagielski                         {
1551*b1cdbd2cSJim Jagielski                             nStartCol = 0;
1552*b1cdbd2cSJim Jagielski                             nEndCol = MAXCOL;
1553*b1cdbd2cSJim Jagielski                         }
1554*b1cdbd2cSJim Jagielski                     }
1555*b1cdbd2cSJim Jagielski                     else if( eCmd == INS_CELLSRIGHT || eCmd == INS_INSCOLS )
1556*b1cdbd2cSJim Jagielski                     {
1557*b1cdbd2cSJim Jagielski 
1558*b1cdbd2cSJim Jagielski                         nStartCol = aExtendMergeRange.aStart.Col();
1559*b1cdbd2cSJim Jagielski                         nEndCol = aExtendMergeRange.aEnd.Col();
1560*b1cdbd2cSJim Jagielski                         if( eCmd == INS_CELLSRIGHT )
1561*b1cdbd2cSJim Jagielski                         {
1562*b1cdbd2cSJim Jagielski                             nEndRow = nMergeTestEndY;
1563*b1cdbd2cSJim Jagielski                         }
1564*b1cdbd2cSJim Jagielski                         else
1565*b1cdbd2cSJim Jagielski                         {
1566*b1cdbd2cSJim Jagielski                             nStartRow = 0;
1567*b1cdbd2cSJim Jagielski                             nEndRow = MAXROW;
1568*b1cdbd2cSJim Jagielski                         }
1569*b1cdbd2cSJim Jagielski                     }
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski                     if( !qIncreaseRange.empty() )
1572*b1cdbd2cSJim Jagielski                     {
1573*b1cdbd2cSJim Jagielski                         for( ::std::vector<ScRange>::const_iterator iIter( qIncreaseRange.begin()); iIter != qIncreaseRange.end(); iIter++ )
1574*b1cdbd2cSJim Jagielski                         {
1575*b1cdbd2cSJim Jagielski                             ScRange aRange( *iIter );
1576*b1cdbd2cSJim Jagielski                             if( pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) )
1577*b1cdbd2cSJim Jagielski                             {
1578*b1cdbd2cSJim Jagielski                                 UnmergeCells( aRange, sal_True, sal_True );
1579*b1cdbd2cSJim Jagielski                             }
1580*b1cdbd2cSJim Jagielski                         }
1581*b1cdbd2cSJim Jagielski                     }
1582*b1cdbd2cSJim Jagielski                 }
1583*b1cdbd2cSJim Jagielski                 else
1584*b1cdbd2cSJim Jagielski                 {
1585*b1cdbd2cSJim Jagielski                     if (!bApi)
1586*b1cdbd2cSJim Jagielski                         rDocShell.ErrorMessage(STR_MSSG_INSERTCELLS_0);
1587*b1cdbd2cSJim Jagielski                     rDocShell.GetUndoManager()->LeaveListAction();
1588*b1cdbd2cSJim Jagielski                     return sal_False;
1589*b1cdbd2cSJim Jagielski                 }
1590*b1cdbd2cSJim Jagielski             }
1591*b1cdbd2cSJim Jagielski         }
1592*b1cdbd2cSJim Jagielski     }
1593*b1cdbd2cSJim Jagielski 
1594*b1cdbd2cSJim Jagielski 	switch (eCmd)
1595*b1cdbd2cSJim Jagielski 	{
1596*b1cdbd2cSJim Jagielski 		case INS_CELLSDOWN:
1597*b1cdbd2cSJim Jagielski             bSuccess = pDoc->InsertRow( nStartCol, 0, nEndCol, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &aFullMark );
1598*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
1599*b1cdbd2cSJim Jagielski 			break;
1600*b1cdbd2cSJim Jagielski 		case INS_INSROWS:
1601*b1cdbd2cSJim Jagielski             bSuccess = pDoc->InsertRow( 0, 0, MAXCOL, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &aFullMark );
1602*b1cdbd2cSJim Jagielski 			nPaintStartX = 0;
1603*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
1604*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
1605*b1cdbd2cSJim Jagielski 			nPaintFlags |= PAINT_LEFT;
1606*b1cdbd2cSJim Jagielski 			break;
1607*b1cdbd2cSJim Jagielski 		case INS_CELLSRIGHT:
1608*b1cdbd2cSJim Jagielski             bSuccess = pDoc->InsertCol( nStartRow, 0, nEndRow, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &aFullMark );
1609*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
1610*b1cdbd2cSJim Jagielski 			break;
1611*b1cdbd2cSJim Jagielski 		case INS_INSCOLS:
1612*b1cdbd2cSJim Jagielski             bSuccess = pDoc->InsertCol( 0, 0, MAXROW, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &aFullMark );
1613*b1cdbd2cSJim Jagielski 			nPaintStartY = 0;
1614*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
1615*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
1616*b1cdbd2cSJim Jagielski 			nPaintFlags |= PAINT_TOP;
1617*b1cdbd2cSJim Jagielski 			break;
1618*b1cdbd2cSJim Jagielski 		default:
1619*b1cdbd2cSJim Jagielski 			DBG_ERROR("Falscher Code beim Einfuegen");
1620*b1cdbd2cSJim Jagielski 			bSuccess = sal_False;
1621*b1cdbd2cSJim Jagielski 			break;
1622*b1cdbd2cSJim Jagielski 	}
1623*b1cdbd2cSJim Jagielski 
1624*b1cdbd2cSJim Jagielski 	if ( bSuccess )
1625*b1cdbd2cSJim Jagielski 	{
1626*b1cdbd2cSJim Jagielski         SCTAB* pTabs      = NULL;
1627*b1cdbd2cSJim Jagielski         SCTAB* pScenarios = NULL;
1628*b1cdbd2cSJim Jagielski         SCTAB  nUndoPos  = 0;
1629*b1cdbd2cSJim Jagielski 
1630*b1cdbd2cSJim Jagielski         if ( bRecord )
1631*b1cdbd2cSJim Jagielski         {
1632*b1cdbd2cSJim Jagielski             pTabs       = new SCTAB[nSelCount];
1633*b1cdbd2cSJim Jagielski             pScenarios  = new SCTAB[nSelCount];
1634*b1cdbd2cSJim Jagielski             nUndoPos    = 0;
1635*b1cdbd2cSJim Jagielski             for( i=0; i<nTabCount; i++ )
1636*b1cdbd2cSJim Jagielski             {
1637*b1cdbd2cSJim Jagielski                 if( aMark.GetTableSelect( i ) )
1638*b1cdbd2cSJim Jagielski                 {
1639*b1cdbd2cSJim Jagielski                     SCTAB nCount = 0;
1640*b1cdbd2cSJim Jagielski                     for( SCTAB j=i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
1641*b1cdbd2cSJim Jagielski                         nCount ++;
1642*b1cdbd2cSJim Jagielski 
1643*b1cdbd2cSJim Jagielski                     pScenarios[nUndoPos] = nCount;
1644*b1cdbd2cSJim Jagielski                     pTabs[nUndoPos] = i;
1645*b1cdbd2cSJim Jagielski                     nUndoPos ++;
1646*b1cdbd2cSJim Jagielski                 }
1647*b1cdbd2cSJim Jagielski             }
1648*b1cdbd2cSJim Jagielski 
1649*b1cdbd2cSJim Jagielski             if( !bInsertMerge )
1650*b1cdbd2cSJim Jagielski             {
1651*b1cdbd2cSJim Jagielski                 rDocShell.GetUndoManager()->LeaveListAction();
1652*b1cdbd2cSJim Jagielski             }
1653*b1cdbd2cSJim Jagielski 
1654*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->AddUndoAction( new ScUndoInsertCells(
1655*b1cdbd2cSJim Jagielski                 &rDocShell, ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ),
1656*b1cdbd2cSJim Jagielski                 nUndoPos, pTabs, pScenarios, eCmd, pRefUndoDoc, pUndoData, bPartOfPaste ) );
1657*b1cdbd2cSJim Jagielski         }
1658*b1cdbd2cSJim Jagielski 
1659*b1cdbd2cSJim Jagielski         // #i8302 : we remerge growing ranges, with the new part inserted
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski         while( !qIncreaseRange.empty() )
1662*b1cdbd2cSJim Jagielski         {
1663*b1cdbd2cSJim Jagielski             ScRange aRange = qIncreaseRange.back();
1664*b1cdbd2cSJim Jagielski             if( !pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) )
1665*b1cdbd2cSJim Jagielski             {
1666*b1cdbd2cSJim Jagielski                 switch (eCmd)
1667*b1cdbd2cSJim Jagielski                 {
1668*b1cdbd2cSJim Jagielski                     case INS_CELLSDOWN:
1669*b1cdbd2cSJim Jagielski                     case INS_INSROWS:
1670*b1cdbd2cSJim Jagielski                         aRange.aEnd.IncRow(static_cast<SCsCOL>(nEndRow-nStartRow+1));
1671*b1cdbd2cSJim Jagielski                         break;
1672*b1cdbd2cSJim Jagielski                     case INS_CELLSRIGHT:
1673*b1cdbd2cSJim Jagielski                     case INS_INSCOLS:
1674*b1cdbd2cSJim Jagielski                         aRange.aEnd.IncCol(static_cast<SCsCOL>(nEndCol-nStartCol+1));
1675*b1cdbd2cSJim Jagielski                         break;
1676*b1cdbd2cSJim Jagielski                     default:
1677*b1cdbd2cSJim Jagielski                         break;
1678*b1cdbd2cSJim Jagielski                 }
1679*b1cdbd2cSJim Jagielski                 MergeCells(aRange, sal_False, sal_True, sal_True);
1680*b1cdbd2cSJim Jagielski             }
1681*b1cdbd2cSJim Jagielski             qIncreaseRange.pop_back();
1682*b1cdbd2cSJim Jagielski         }
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski         if( bInsertMerge )
1685*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->LeaveListAction();
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski         for( i=0; i<nTabCount; i++ )
1688*b1cdbd2cSJim Jagielski         {
1689*b1cdbd2cSJim Jagielski             if( aMark.GetTableSelect( i ) )
1690*b1cdbd2cSJim Jagielski             {
1691*b1cdbd2cSJim Jagielski 		        if (bNeedRefresh)
1692*b1cdbd2cSJim Jagielski 			        pDoc->ExtendMerge( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i, sal_True );
1693*b1cdbd2cSJim Jagielski 		        else
1694*b1cdbd2cSJim Jagielski 			        pDoc->RefreshAutoFilter( nMergeTestStartX, nMergeTestStartY, nMergeTestEndX, nMergeTestEndY, i );
1695*b1cdbd2cSJim Jagielski 
1696*b1cdbd2cSJim Jagielski 		        if ( eCmd == INS_INSROWS || eCmd == INS_INSCOLS )
1697*b1cdbd2cSJim Jagielski 			        pDoc->UpdatePageBreaks( i );
1698*b1cdbd2cSJim Jagielski 
1699*b1cdbd2cSJim Jagielski 		        sal_uInt16 nExtFlags = 0;
1700*b1cdbd2cSJim Jagielski 		        rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i );
1701*b1cdbd2cSJim Jagielski 
1702*b1cdbd2cSJim Jagielski                 SCTAB nScenarioCount = 0;
1703*b1cdbd2cSJim Jagielski 
1704*b1cdbd2cSJim Jagielski                 for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
1705*b1cdbd2cSJim Jagielski                     nScenarioCount ++;
1706*b1cdbd2cSJim Jagielski 
1707*b1cdbd2cSJim Jagielski 		        sal_Bool bAdjusted = ( eCmd == INS_INSROWS ) ? AdjustRowHeight(ScRange(0, nStartRow, i, MAXCOL, nEndRow, i+nScenarioCount )) :
1708*b1cdbd2cSJim Jagielski 				                                           AdjustRowHeight(ScRange(0, nPaintStartY, i, MAXCOL, nPaintEndY, i+nScenarioCount ));
1709*b1cdbd2cSJim Jagielski 		        if (bAdjusted)
1710*b1cdbd2cSJim Jagielski 		        {
1711*b1cdbd2cSJim Jagielski 			        //	paint only what is not done by AdjustRowHeight
1712*b1cdbd2cSJim Jagielski 			        if (nPaintFlags & PAINT_TOP)
1713*b1cdbd2cSJim Jagielski 				        rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, PAINT_TOP );
1714*b1cdbd2cSJim Jagielski 		        }
1715*b1cdbd2cSJim Jagielski 		        else
1716*b1cdbd2cSJim Jagielski 			        rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, nPaintFlags, nExtFlags );
1717*b1cdbd2cSJim Jagielski             }
1718*b1cdbd2cSJim Jagielski         }
1719*b1cdbd2cSJim Jagielski 		//aModificator.SetDocumentModified();
1720*b1cdbd2cSJim Jagielski 	}
1721*b1cdbd2cSJim Jagielski 	else
1722*b1cdbd2cSJim Jagielski 	{
1723*b1cdbd2cSJim Jagielski         if( bInsertMerge )
1724*b1cdbd2cSJim Jagielski         {
1725*b1cdbd2cSJim Jagielski             while( !qIncreaseRange.empty() )
1726*b1cdbd2cSJim Jagielski             {
1727*b1cdbd2cSJim Jagielski                 ScRange aRange = qIncreaseRange.back();
1728*b1cdbd2cSJim Jagielski                 MergeCells(aRange, sal_False, sal_True, sal_True);
1729*b1cdbd2cSJim Jagielski                 qIncreaseRange.pop_back();
1730*b1cdbd2cSJim Jagielski             }
1731*b1cdbd2cSJim Jagielski 
1732*b1cdbd2cSJim Jagielski             if( pViewSh )
1733*b1cdbd2cSJim Jagielski             {
1734*b1cdbd2cSJim Jagielski                 pViewSh->MarkRange( rRange, sal_False );
1735*b1cdbd2cSJim Jagielski                 pViewSh->SetCursor( nCursorCol, nCursorRow );
1736*b1cdbd2cSJim Jagielski             }
1737*b1cdbd2cSJim Jagielski         }
1738*b1cdbd2cSJim Jagielski 
1739*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->LeaveListAction();
1740*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->RemoveLastUndoAction();
1741*b1cdbd2cSJim Jagielski 
1742*b1cdbd2cSJim Jagielski 		delete pRefUndoDoc;
1743*b1cdbd2cSJim Jagielski 		delete pUndoData;
1744*b1cdbd2cSJim Jagielski 		if (!bApi)
1745*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_INSERT_FULL);		// Spalte/Zeile voll
1746*b1cdbd2cSJim Jagielski 	}
1747*b1cdbd2cSJim Jagielski 
1748*b1cdbd2cSJim Jagielski     aModificator.SetDocumentModified();
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1751*b1cdbd2cSJim Jagielski 	return bSuccess;
1752*b1cdbd2cSJim Jagielski }
1753*b1cdbd2cSJim Jagielski 
DeleteCells(const ScRange & rRange,const ScMarkData * pTabMark,DelCellCmd eCmd,sal_Bool bRecord,sal_Bool bApi)1754*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DeleteCells( const ScRange& rRange, const ScMarkData* pTabMark, DelCellCmd eCmd,
1755*b1cdbd2cSJim Jagielski                              sal_Bool bRecord, sal_Bool bApi )
1756*b1cdbd2cSJim Jagielski {
1757*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
1758*b1cdbd2cSJim Jagielski 
1759*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
1760*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
1761*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
1762*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
1763*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
1764*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
1765*b1cdbd2cSJim Jagielski 
1766*b1cdbd2cSJim Jagielski 	if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) )
1767*b1cdbd2cSJim Jagielski 	{
1768*b1cdbd2cSJim Jagielski 		DBG_ERROR("invalid row in DeleteCells");
1769*b1cdbd2cSJim Jagielski 		return sal_False;
1770*b1cdbd2cSJim Jagielski 	}
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
1773*b1cdbd2cSJim Jagielski 	SCTAB nTabCount = pDoc->GetTableCount();
1774*b1cdbd2cSJim Jagielski 	SCCOL nPaintStartX = nStartCol;
1775*b1cdbd2cSJim Jagielski 	SCROW nPaintStartY = nStartRow;
1776*b1cdbd2cSJim Jagielski 	SCCOL nPaintEndX = nEndCol;
1777*b1cdbd2cSJim Jagielski 	SCROW nPaintEndY = nEndRow;
1778*b1cdbd2cSJim Jagielski 	sal_uInt16 nPaintFlags = PAINT_GRID;
1779*b1cdbd2cSJim Jagielski     SCTAB i;
1780*b1cdbd2cSJim Jagielski 
1781*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
1782*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
1783*b1cdbd2cSJim Jagielski 
1784*b1cdbd2cSJim Jagielski     ScMarkData aMark;
1785*b1cdbd2cSJim Jagielski     if (pTabMark)
1786*b1cdbd2cSJim Jagielski         aMark = *pTabMark;
1787*b1cdbd2cSJim Jagielski     else
1788*b1cdbd2cSJim Jagielski     {
1789*b1cdbd2cSJim Jagielski         SCTAB nCount = 0;
1790*b1cdbd2cSJim Jagielski         for( i=0; i<nTabCount; i++ )
1791*b1cdbd2cSJim Jagielski         {
1792*b1cdbd2cSJim Jagielski             if( !pDoc->IsScenario(i) )
1793*b1cdbd2cSJim Jagielski             {
1794*b1cdbd2cSJim Jagielski                 nCount++;
1795*b1cdbd2cSJim Jagielski                 if( nCount == nEndTab+1 )
1796*b1cdbd2cSJim Jagielski                 {
1797*b1cdbd2cSJim Jagielski                     aMark.SelectTable( i, sal_True );
1798*b1cdbd2cSJim Jagielski                     break;
1799*b1cdbd2cSJim Jagielski                 }
1800*b1cdbd2cSJim Jagielski             }
1801*b1cdbd2cSJim Jagielski         }
1802*b1cdbd2cSJim Jagielski     }
1803*b1cdbd2cSJim Jagielski 
1804*b1cdbd2cSJim Jagielski     ScMarkData aFullMark( aMark );          // including scenario sheets
1805*b1cdbd2cSJim Jagielski     for( i=0; i<nTabCount; i++ )
1806*b1cdbd2cSJim Jagielski         if( aMark.GetTableSelect( i ) )
1807*b1cdbd2cSJim Jagielski         {
1808*b1cdbd2cSJim Jagielski             for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
1809*b1cdbd2cSJim Jagielski                 aFullMark.SelectTable( j, sal_True );
1810*b1cdbd2cSJim Jagielski         }
1811*b1cdbd2cSJim Jagielski 
1812*b1cdbd2cSJim Jagielski     SCTAB nSelCount = aMark.GetSelectCount();
1813*b1cdbd2cSJim Jagielski 
1814*b1cdbd2cSJim Jagielski 	SCCOL nUndoStartX = nStartCol;
1815*b1cdbd2cSJim Jagielski 	SCROW nUndoStartY = nStartRow;
1816*b1cdbd2cSJim Jagielski 	SCCOL nUndoEndX = nEndCol;
1817*b1cdbd2cSJim Jagielski 	SCROW nUndoEndY = nEndRow;
1818*b1cdbd2cSJim Jagielski 
1819*b1cdbd2cSJim Jagielski     ScRange aExtendMergeRange( rRange );
1820*b1cdbd2cSJim Jagielski 
1821*b1cdbd2cSJim Jagielski     if( rRange.aStart == rRange.aEnd && pDoc->HasAttrib(rRange, HASATTR_MERGED) )
1822*b1cdbd2cSJim Jagielski     {
1823*b1cdbd2cSJim Jagielski         pDoc->ExtendMerge( aExtendMergeRange );
1824*b1cdbd2cSJim Jagielski         pDoc->ExtendOverlapped( aExtendMergeRange );
1825*b1cdbd2cSJim Jagielski         nUndoEndX = aExtendMergeRange.aEnd.Col();
1826*b1cdbd2cSJim Jagielski         nUndoEndY = aExtendMergeRange.aEnd.Row();
1827*b1cdbd2cSJim Jagielski         nPaintEndX = nUndoEndX;
1828*b1cdbd2cSJim Jagielski         nPaintEndY = nUndoEndY;
1829*b1cdbd2cSJim Jagielski     }
1830*b1cdbd2cSJim Jagielski 
1831*b1cdbd2cSJim Jagielski 	if (eCmd==DEL_DELROWS)
1832*b1cdbd2cSJim Jagielski 	{
1833*b1cdbd2cSJim Jagielski 		nUndoStartX = 0;
1834*b1cdbd2cSJim Jagielski 		nUndoEndX = MAXCOL;
1835*b1cdbd2cSJim Jagielski 	}
1836*b1cdbd2cSJim Jagielski 	if (eCmd==DEL_DELCOLS)
1837*b1cdbd2cSJim Jagielski 	{
1838*b1cdbd2cSJim Jagielski 		nUndoStartY = 0;
1839*b1cdbd2cSJim Jagielski 		nUndoEndY = MAXROW;
1840*b1cdbd2cSJim Jagielski 	}
1841*b1cdbd2cSJim Jagielski 					// Test Zellschutz
1842*b1cdbd2cSJim Jagielski 
1843*b1cdbd2cSJim Jagielski 	SCCOL nEditTestEndX = nUndoEndX;
1844*b1cdbd2cSJim Jagielski 	if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT )
1845*b1cdbd2cSJim Jagielski         nEditTestEndX = MAXCOL;
1846*b1cdbd2cSJim Jagielski 	SCROW nEditTestEndY = nUndoEndY;
1847*b1cdbd2cSJim Jagielski 	if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP )
1848*b1cdbd2cSJim Jagielski         nEditTestEndY = MAXROW;
1849*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nUndoStartX, nUndoStartY, nEditTestEndX, nEditTestEndY, aMark );
1850*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
1851*b1cdbd2cSJim Jagielski 	{
1852*b1cdbd2cSJim Jagielski 		if (!bApi)
1853*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
1854*b1cdbd2cSJim Jagielski 		return sal_False;
1855*b1cdbd2cSJim Jagielski 	}
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski 					// Test zusammengefasste
1858*b1cdbd2cSJim Jagielski 
1859*b1cdbd2cSJim Jagielski 	SCCOL nMergeTestEndX = (eCmd==DEL_CELLSLEFT) ? MAXCOL : nUndoEndX;
1860*b1cdbd2cSJim Jagielski 	SCROW nMergeTestEndY = (eCmd==DEL_CELLSUP)   ? MAXROW : nUndoEndY;
1861*b1cdbd2cSJim Jagielski     SCCOL nExtendStartCol = nUndoStartX;
1862*b1cdbd2cSJim Jagielski     SCROW nExtendStartRow = nUndoStartY;
1863*b1cdbd2cSJim Jagielski 	sal_Bool bNeedRefresh = sal_False;
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski     //Issue 8302 want to be able to insert into the middle of merged cells
1866*b1cdbd2cSJim Jagielski     //the patch comes from maoyg
1867*b1cdbd2cSJim Jagielski     ::std::vector<ScRange> qDecreaseRange;
1868*b1cdbd2cSJim Jagielski     sal_Bool bDeletingMerge = sal_False;
1869*b1cdbd2cSJim Jagielski     String aUndo = ScGlobal::GetRscString( STR_UNDO_DELETECELLS );
1870*b1cdbd2cSJim Jagielski     if (bRecord)
1871*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo );
1872*b1cdbd2cSJim Jagielski 
1873*b1cdbd2cSJim Jagielski     for( i=0; i<nTabCount; i++ )
1874*b1cdbd2cSJim Jagielski     {
1875*b1cdbd2cSJim Jagielski         if( aMark.GetTableSelect(i) )
1876*b1cdbd2cSJim Jagielski         {
1877*b1cdbd2cSJim Jagielski 	        if ( pDoc->HasAttrib( nUndoStartX, nUndoStartY, i, nMergeTestEndX, nMergeTestEndY, i, HASATTR_MERGED | HASATTR_OVERLAPPED ))
1878*b1cdbd2cSJim Jagielski             {
1879*b1cdbd2cSJim Jagielski 		        SCCOL nMergeStartX = nUndoStartX;
1880*b1cdbd2cSJim Jagielski 		        SCROW nMergeStartY = nUndoStartY;
1881*b1cdbd2cSJim Jagielski 		        SCCOL nMergeEndX   = nMergeTestEndX;
1882*b1cdbd2cSJim Jagielski 		        SCROW nMergeEndY   = nMergeTestEndY;
1883*b1cdbd2cSJim Jagielski 
1884*b1cdbd2cSJim Jagielski 		        pDoc->ExtendMerge( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i );
1885*b1cdbd2cSJim Jagielski 		        pDoc->ExtendOverlapped( nMergeStartX, nMergeStartY, nMergeEndX, nMergeEndY, i );
1886*b1cdbd2cSJim Jagielski                 if( ( eCmd == DEL_CELLSUP && ( nMergeStartX != nUndoStartX || nMergeEndX != nMergeTestEndX))||
1887*b1cdbd2cSJim Jagielski                     ( eCmd == DEL_CELLSLEFT && ( nMergeStartY != nUndoStartY || nMergeEndY != nMergeTestEndY)))
1888*b1cdbd2cSJim Jagielski                 {
1889*b1cdbd2cSJim Jagielski                     if (!bApi)
1890*b1cdbd2cSJim Jagielski                         rDocShell.ErrorMessage(STR_MSSG_DELETECELLS_0);
1891*b1cdbd2cSJim Jagielski                     rDocShell.GetUndoManager()->LeaveListAction();
1892*b1cdbd2cSJim Jagielski                     return sal_False;
1893*b1cdbd2cSJim Jagielski                 }
1894*b1cdbd2cSJim Jagielski 
1895*b1cdbd2cSJim Jagielski                 nExtendStartCol = nMergeStartX;
1896*b1cdbd2cSJim Jagielski                 nExtendStartRow = nMergeStartY;
1897*b1cdbd2cSJim Jagielski                 SCCOL nTestCol = -1;
1898*b1cdbd2cSJim Jagielski                 SCROW nTestRow1 = -1;
1899*b1cdbd2cSJim Jagielski                 SCROW nTestRow2 = -1;
1900*b1cdbd2cSJim Jagielski 
1901*b1cdbd2cSJim Jagielski                 ScDocAttrIterator aTestIter( pDoc, i, nUndoStartX, nUndoStartY, nMergeTestEndX, nMergeTestEndY );
1902*b1cdbd2cSJim Jagielski                 ScRange aExtendRange( nUndoStartX, nUndoStartY, i, nMergeTestEndX, nMergeTestEndY, i );
1903*b1cdbd2cSJim Jagielski                 const ScPatternAttr* pPattern = NULL;
1904*b1cdbd2cSJim Jagielski                 const ScMergeAttr* pMergeFlag = NULL;
1905*b1cdbd2cSJim Jagielski                 const ScMergeFlagAttr* pMergeFlagAttr = NULL;
1906*b1cdbd2cSJim Jagielski                 while ( ( pPattern = aTestIter.GetNext( nTestCol, nTestRow1, nTestRow2 ) ) != NULL )
1907*b1cdbd2cSJim Jagielski                 {
1908*b1cdbd2cSJim Jagielski                     pMergeFlag = (const ScMergeAttr*) &pPattern->GetItem( ATTR_MERGE );
1909*b1cdbd2cSJim Jagielski                     pMergeFlagAttr = (const ScMergeFlagAttr*) &pPattern->GetItem( ATTR_MERGE_FLAG );
1910*b1cdbd2cSJim Jagielski                     sal_Int16 nNewFlags = pMergeFlagAttr->GetValue() & ( SC_MF_HOR | SC_MF_VER );
1911*b1cdbd2cSJim Jagielski                     if( ( pMergeFlag && pMergeFlag->IsMerged() ) || nNewFlags == SC_MF_HOR || nNewFlags == SC_MF_VER )
1912*b1cdbd2cSJim Jagielski                     {
1913*b1cdbd2cSJim Jagielski                         ScRange aRange( nTestCol, nTestRow1, i );
1914*b1cdbd2cSJim Jagielski                         pDoc->ExtendOverlapped( aRange );
1915*b1cdbd2cSJim Jagielski                         pDoc->ExtendMerge( aRange, sal_True, sal_True );
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski                         if( nTestRow1 < nTestRow2 && nNewFlags == SC_MF_HOR )
1918*b1cdbd2cSJim Jagielski                         {
1919*b1cdbd2cSJim Jagielski                             for( SCROW nTestRow = nTestRow1; nTestRow <= nTestRow2; nTestRow++ )
1920*b1cdbd2cSJim Jagielski                             {
1921*b1cdbd2cSJim Jagielski                                 ScRange aTestRange( nTestCol, nTestRow, i );
1922*b1cdbd2cSJim Jagielski                                 pDoc->ExtendOverlapped( aTestRange );
1923*b1cdbd2cSJim Jagielski                                 pDoc->ExtendMerge( aTestRange, sal_True, sal_True);
1924*b1cdbd2cSJim Jagielski                                 ScRange aMergeRange( aTestRange.aStart.Col(),aTestRange.aStart.Row(), i );
1925*b1cdbd2cSJim Jagielski                                 if( !aExtendRange.In( aMergeRange ) )
1926*b1cdbd2cSJim Jagielski                                 {
1927*b1cdbd2cSJim Jagielski                                     qDecreaseRange.push_back( aTestRange );
1928*b1cdbd2cSJim Jagielski                                     bDeletingMerge = sal_True;
1929*b1cdbd2cSJim Jagielski                                 }
1930*b1cdbd2cSJim Jagielski                             }
1931*b1cdbd2cSJim Jagielski                         }
1932*b1cdbd2cSJim Jagielski                         else
1933*b1cdbd2cSJim Jagielski                         {
1934*b1cdbd2cSJim Jagielski                             ScRange aMergeRange( aRange.aStart.Col(),aRange.aStart.Row(), i );
1935*b1cdbd2cSJim Jagielski                             if( !aExtendRange.In( aMergeRange ) )
1936*b1cdbd2cSJim Jagielski                             {
1937*b1cdbd2cSJim Jagielski                                 qDecreaseRange.push_back( aRange );
1938*b1cdbd2cSJim Jagielski                             }
1939*b1cdbd2cSJim Jagielski                             bDeletingMerge = sal_True;
1940*b1cdbd2cSJim Jagielski                         }
1941*b1cdbd2cSJim Jagielski                     }
1942*b1cdbd2cSJim Jagielski                 }
1943*b1cdbd2cSJim Jagielski 
1944*b1cdbd2cSJim Jagielski                 if( bDeletingMerge )
1945*b1cdbd2cSJim Jagielski                 {
1946*b1cdbd2cSJim Jagielski 
1947*b1cdbd2cSJim Jagielski                     if( eCmd == DEL_DELROWS || eCmd == DEL_CELLSUP )
1948*b1cdbd2cSJim Jagielski                     {
1949*b1cdbd2cSJim Jagielski                         nStartRow = aExtendMergeRange.aStart.Row();
1950*b1cdbd2cSJim Jagielski                         nEndRow = aExtendMergeRange.aEnd.Row();
1951*b1cdbd2cSJim Jagielski                         bNeedRefresh = sal_True;
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski                         if( eCmd == DEL_CELLSUP )
1954*b1cdbd2cSJim Jagielski                         {
1955*b1cdbd2cSJim Jagielski                             nEndCol = aExtendMergeRange.aEnd.Col();
1956*b1cdbd2cSJim Jagielski                         }
1957*b1cdbd2cSJim Jagielski                         else
1958*b1cdbd2cSJim Jagielski                         {
1959*b1cdbd2cSJim Jagielski                             nStartCol = 0;
1960*b1cdbd2cSJim Jagielski                             nEndCol = MAXCOL;
1961*b1cdbd2cSJim Jagielski                         }
1962*b1cdbd2cSJim Jagielski                     }
1963*b1cdbd2cSJim Jagielski                     else if( eCmd == DEL_CELLSLEFT || eCmd == DEL_DELCOLS )
1964*b1cdbd2cSJim Jagielski                     {
1965*b1cdbd2cSJim Jagielski 
1966*b1cdbd2cSJim Jagielski                         nStartCol = aExtendMergeRange.aStart.Col();
1967*b1cdbd2cSJim Jagielski                         nEndCol = aExtendMergeRange.aEnd.Col();
1968*b1cdbd2cSJim Jagielski                         if( eCmd == DEL_CELLSLEFT )
1969*b1cdbd2cSJim Jagielski                         {
1970*b1cdbd2cSJim Jagielski                             nEndRow = aExtendMergeRange.aEnd.Row();
1971*b1cdbd2cSJim Jagielski                             bNeedRefresh = sal_True;
1972*b1cdbd2cSJim Jagielski                         }
1973*b1cdbd2cSJim Jagielski                         else
1974*b1cdbd2cSJim Jagielski                         {
1975*b1cdbd2cSJim Jagielski                             nStartRow = 0;
1976*b1cdbd2cSJim Jagielski                             nEndRow = MAXROW;
1977*b1cdbd2cSJim Jagielski                         }
1978*b1cdbd2cSJim Jagielski                     }
1979*b1cdbd2cSJim Jagielski 
1980*b1cdbd2cSJim Jagielski                     if( !qDecreaseRange.empty() )
1981*b1cdbd2cSJim Jagielski                     {
1982*b1cdbd2cSJim Jagielski                         for( ::std::vector<ScRange>::const_iterator iIter( qDecreaseRange.begin()); iIter != qDecreaseRange.end(); iIter++ )
1983*b1cdbd2cSJim Jagielski                         {
1984*b1cdbd2cSJim Jagielski                             ScRange aRange( *iIter );
1985*b1cdbd2cSJim Jagielski                             if( pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) )
1986*b1cdbd2cSJim Jagielski                             {
1987*b1cdbd2cSJim Jagielski                                 UnmergeCells( aRange, sal_True, sal_True );
1988*b1cdbd2cSJim Jagielski                             }
1989*b1cdbd2cSJim Jagielski                         }
1990*b1cdbd2cSJim Jagielski                     }
1991*b1cdbd2cSJim Jagielski                 }
1992*b1cdbd2cSJim Jagielski                 else
1993*b1cdbd2cSJim Jagielski                 {
1994*b1cdbd2cSJim Jagielski                     if (!bApi)
1995*b1cdbd2cSJim Jagielski                         rDocShell.ErrorMessage(STR_MSSG_DELETECELLS_0);
1996*b1cdbd2cSJim Jagielski                     rDocShell.GetUndoManager()->LeaveListAction();
1997*b1cdbd2cSJim Jagielski                     return sal_False;
1998*b1cdbd2cSJim Jagielski                 }
1999*b1cdbd2cSJim Jagielski 	        }
2000*b1cdbd2cSJim Jagielski         }
2001*b1cdbd2cSJim Jagielski     }
2002*b1cdbd2cSJim Jagielski 
2003*b1cdbd2cSJim Jagielski 	//
2004*b1cdbd2cSJim Jagielski 	//		ausfuehren
2005*b1cdbd2cSJim Jagielski 	//
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski 	WaitObject aWait( rDocShell.GetActiveDialogParent() );		// wichtig wegen TrackFormulas bei UpdateReference
2008*b1cdbd2cSJim Jagielski 
2009*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
2010*b1cdbd2cSJim Jagielski 	ScDocument* pRefUndoDoc = NULL;
2011*b1cdbd2cSJim Jagielski 	ScRefUndoData* pUndoData = NULL;
2012*b1cdbd2cSJim Jagielski 	if ( bRecord )
2013*b1cdbd2cSJim Jagielski 	{
2014*b1cdbd2cSJim Jagielski         // With the fix for #101329#, UpdateRef always puts cells into pRefUndoDoc at their old position,
2015*b1cdbd2cSJim Jagielski         // so it's no longer necessary to copy more than the deleted range into pUndoDoc.
2016*b1cdbd2cSJim Jagielski 
2017*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
2018*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, 0, nTabCount-1, (eCmd==DEL_DELCOLS), (eCmd==DEL_DELROWS) );
2019*b1cdbd2cSJim Jagielski         for( i=0; i<nTabCount; i++ )
2020*b1cdbd2cSJim Jagielski         {
2021*b1cdbd2cSJim Jagielski             if( aMark.GetTableSelect( i ) )
2022*b1cdbd2cSJim Jagielski             {
2023*b1cdbd2cSJim Jagielski                 SCTAB nScenarioCount = 0;
2024*b1cdbd2cSJim Jagielski 
2025*b1cdbd2cSJim Jagielski                 for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
2026*b1cdbd2cSJim Jagielski                     nScenarioCount ++;
2027*b1cdbd2cSJim Jagielski 
2028*b1cdbd2cSJim Jagielski                 pDoc->CopyToDocument( nUndoStartX, nUndoStartY, i, nUndoEndX, nUndoEndY, i+nScenarioCount,
2029*b1cdbd2cSJim Jagielski                     IDF_ALL | IDF_NOCAPTIONS, sal_False, pUndoDoc );
2030*b1cdbd2cSJim Jagielski             }
2031*b1cdbd2cSJim Jagielski         }
2032*b1cdbd2cSJim Jagielski 
2033*b1cdbd2cSJim Jagielski 		pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO );
2034*b1cdbd2cSJim Jagielski 		pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, sal_False, sal_False );
2035*b1cdbd2cSJim Jagielski 
2036*b1cdbd2cSJim Jagielski 		pUndoData = new ScRefUndoData( pDoc );
2037*b1cdbd2cSJim Jagielski 
2038*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();
2039*b1cdbd2cSJim Jagielski 	}
2040*b1cdbd2cSJim Jagielski 
2041*b1cdbd2cSJim Jagielski 	sal_uInt16 nExtFlags = 0;
2042*b1cdbd2cSJim Jagielski     for( i=0; i<nTabCount; i++ )
2043*b1cdbd2cSJim Jagielski     {
2044*b1cdbd2cSJim Jagielski         if( aMark.GetTableSelect( i ) )
2045*b1cdbd2cSJim Jagielski             rDocShell.UpdatePaintExt( nExtFlags, nStartCol, nStartRow, i, nEndCol, nEndRow, i );
2046*b1cdbd2cSJim Jagielski     }
2047*b1cdbd2cSJim Jagielski 
2048*b1cdbd2cSJim Jagielski 	sal_Bool bUndoOutline = sal_False;
2049*b1cdbd2cSJim Jagielski 	switch (eCmd)
2050*b1cdbd2cSJim Jagielski 	{
2051*b1cdbd2cSJim Jagielski 		case DEL_CELLSUP:
2052*b1cdbd2cSJim Jagielski             pDoc->DeleteRow( nStartCol, 0, nEndCol, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, NULL, &aFullMark );
2053*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
2054*b1cdbd2cSJim Jagielski 			break;
2055*b1cdbd2cSJim Jagielski 		case DEL_DELROWS:
2056*b1cdbd2cSJim Jagielski             pDoc->DeleteRow( 0, 0, MAXCOL, MAXTAB, nStartRow, static_cast<SCSIZE>(nEndRow-nStartRow+1), pRefUndoDoc, &bUndoOutline, &aFullMark );
2057*b1cdbd2cSJim Jagielski 			nPaintStartX = 0;
2058*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
2059*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
2060*b1cdbd2cSJim Jagielski 			nPaintFlags |= PAINT_LEFT;
2061*b1cdbd2cSJim Jagielski 			break;
2062*b1cdbd2cSJim Jagielski 		case DEL_CELLSLEFT:
2063*b1cdbd2cSJim Jagielski             pDoc->DeleteCol( nStartRow, 0, nEndRow, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, NULL, &aFullMark );
2064*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
2065*b1cdbd2cSJim Jagielski 			break;
2066*b1cdbd2cSJim Jagielski 		case DEL_DELCOLS:
2067*b1cdbd2cSJim Jagielski             pDoc->DeleteCol( 0, 0, MAXROW, MAXTAB, nStartCol, static_cast<SCSIZE>(nEndCol-nStartCol+1), pRefUndoDoc, &bUndoOutline, &aFullMark );
2068*b1cdbd2cSJim Jagielski 			nPaintStartY = 0;
2069*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
2070*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
2071*b1cdbd2cSJim Jagielski 			nPaintFlags |= PAINT_TOP;
2072*b1cdbd2cSJim Jagielski 			break;
2073*b1cdbd2cSJim Jagielski 		default:
2074*b1cdbd2cSJim Jagielski 			DBG_ERROR("Falscher Code beim Loeschen");
2075*b1cdbd2cSJim Jagielski 			break;
2076*b1cdbd2cSJim Jagielski 	}
2077*b1cdbd2cSJim Jagielski 
2078*b1cdbd2cSJim Jagielski 	//!	Test, ob Outline in Groesse geaendert
2079*b1cdbd2cSJim Jagielski 
2080*b1cdbd2cSJim Jagielski 	if ( bRecord )
2081*b1cdbd2cSJim Jagielski 	{
2082*b1cdbd2cSJim Jagielski         for( i=0; i<nTabCount; i++ )
2083*b1cdbd2cSJim Jagielski             if( aFullMark.GetTableSelect( i ) )
2084*b1cdbd2cSJim Jagielski                 pRefUndoDoc->DeleteAreaTab(nUndoStartX,nUndoStartY,nUndoEndX,nUndoEndY, i, IDF_ALL);
2085*b1cdbd2cSJim Jagielski 
2086*b1cdbd2cSJim Jagielski 			//	alle Tabellen anlegen, damit Formeln kopiert werden koennen:
2087*b1cdbd2cSJim Jagielski 		pUndoDoc->AddUndoTab( 0, nTabCount-1, sal_False, sal_False );
2088*b1cdbd2cSJim Jagielski 
2089*b1cdbd2cSJim Jagielski 			//	kopieren mit bColRowFlags=sal_False (#54194#)
2090*b1cdbd2cSJim Jagielski 		pRefUndoDoc->CopyToDocument(0,0,0,MAXCOL,MAXROW,MAXTAB,IDF_FORMULA,sal_False,pUndoDoc,NULL,sal_False);
2091*b1cdbd2cSJim Jagielski 		delete pRefUndoDoc;
2092*b1cdbd2cSJim Jagielski 
2093*b1cdbd2cSJim Jagielski         SCTAB* pTabs      = new SCTAB[nSelCount];
2094*b1cdbd2cSJim Jagielski         SCTAB* pScenarios = new SCTAB[nSelCount];
2095*b1cdbd2cSJim Jagielski         SCTAB   nUndoPos  = 0;
2096*b1cdbd2cSJim Jagielski 
2097*b1cdbd2cSJim Jagielski         for( i=0; i<nTabCount; i++ )
2098*b1cdbd2cSJim Jagielski         {
2099*b1cdbd2cSJim Jagielski             if( aMark.GetTableSelect( i ) )
2100*b1cdbd2cSJim Jagielski             {
2101*b1cdbd2cSJim Jagielski                 SCTAB nCount = 0;
2102*b1cdbd2cSJim Jagielski                 for( SCTAB j=i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
2103*b1cdbd2cSJim Jagielski                     nCount ++;
2104*b1cdbd2cSJim Jagielski 
2105*b1cdbd2cSJim Jagielski                 pScenarios[nUndoPos] = nCount;
2106*b1cdbd2cSJim Jagielski                 pTabs[nUndoPos] = i;
2107*b1cdbd2cSJim Jagielski                 nUndoPos ++;
2108*b1cdbd2cSJim Jagielski             }
2109*b1cdbd2cSJim Jagielski         }
2110*b1cdbd2cSJim Jagielski 
2111*b1cdbd2cSJim Jagielski         if( !bDeletingMerge )
2112*b1cdbd2cSJim Jagielski         {
2113*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->LeaveListAction();
2114*b1cdbd2cSJim Jagielski         }
2115*b1cdbd2cSJim Jagielski 
2116*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction( new ScUndoDeleteCells(
2117*b1cdbd2cSJim Jagielski             &rDocShell, ScRange( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ),nUndoPos, pTabs, pScenarios,
2118*b1cdbd2cSJim Jagielski 			eCmd, pUndoDoc, pUndoData ) );
2119*b1cdbd2cSJim Jagielski 	}
2120*b1cdbd2cSJim Jagielski 
2121*b1cdbd2cSJim Jagielski     // #i8302 want to be able to insert into the middle of merged cells
2122*b1cdbd2cSJim Jagielski     // the patch comes from maoyg
2123*b1cdbd2cSJim Jagielski 
2124*b1cdbd2cSJim Jagielski     while( !qDecreaseRange.empty() )
2125*b1cdbd2cSJim Jagielski     {
2126*b1cdbd2cSJim Jagielski         ScRange aRange = qDecreaseRange.back();
2127*b1cdbd2cSJim Jagielski 
2128*b1cdbd2cSJim Jagielski         long nDecreaseRowCount = 0;
2129*b1cdbd2cSJim Jagielski         long nDecreaseColCount = 0;
2130*b1cdbd2cSJim Jagielski         if( eCmd == DEL_CELLSUP || eCmd == DEL_DELROWS )
2131*b1cdbd2cSJim Jagielski         {
2132*b1cdbd2cSJim Jagielski             if( nStartRow >= aRange.aStart.Row() && nStartRow <= aRange.aEnd.Row() && nEndRow>= aRange.aStart.Row() && nEndRow <= aRange.aEnd.Row() )
2133*b1cdbd2cSJim Jagielski                 nDecreaseRowCount = nEndRow-nStartRow+1;
2134*b1cdbd2cSJim Jagielski             else if( nStartRow >= aRange.aStart.Row() && nStartRow <= aRange.aEnd.Row() && nEndRow >= aRange.aStart.Row() && nEndRow >= aRange.aEnd.Row() )
2135*b1cdbd2cSJim Jagielski                 nDecreaseRowCount = aRange.aEnd.Row()-nStartRow+1;
2136*b1cdbd2cSJim Jagielski             else if( nStartRow >= aRange.aStart.Row() && nStartRow >= aRange.aEnd.Row() && nEndRow>= aRange.aStart.Row() && nEndRow <= aRange.aEnd.Row() )
2137*b1cdbd2cSJim Jagielski                 nDecreaseRowCount = aRange.aEnd.Row()-nEndRow+1;
2138*b1cdbd2cSJim Jagielski         }
2139*b1cdbd2cSJim Jagielski         else if( eCmd == DEL_CELLSLEFT || eCmd == DEL_DELCOLS )
2140*b1cdbd2cSJim Jagielski         {
2141*b1cdbd2cSJim Jagielski             if( nStartCol >= aRange.aStart.Col() && nStartCol <= aRange.aEnd.Col() && nEndCol>= aRange.aStart.Col() && nEndCol <= aRange.aEnd.Col() )
2142*b1cdbd2cSJim Jagielski                 nDecreaseColCount = nEndCol-nStartCol+1;
2143*b1cdbd2cSJim Jagielski             else if( nStartCol >= aRange.aStart.Col() && nStartCol <= aRange.aEnd.Col() && nEndCol >= aRange.aStart.Col() && nEndCol >= aRange.aEnd.Col() )
2144*b1cdbd2cSJim Jagielski                 nDecreaseColCount = aRange.aEnd.Col()-nStartCol+1;
2145*b1cdbd2cSJim Jagielski             else if( nStartCol >= aRange.aStart.Col() && nStartCol >= aRange.aEnd.Col() && nEndCol>= aRange.aStart.Col() && nEndCol <= aRange.aEnd.Col() )
2146*b1cdbd2cSJim Jagielski                 nDecreaseColCount = aRange.aEnd.Col()-nEndCol+1;
2147*b1cdbd2cSJim Jagielski         }
2148*b1cdbd2cSJim Jagielski 
2149*b1cdbd2cSJim Jagielski         switch (eCmd)
2150*b1cdbd2cSJim Jagielski         {
2151*b1cdbd2cSJim Jagielski             case DEL_CELLSUP:
2152*b1cdbd2cSJim Jagielski             case DEL_DELROWS:
2153*b1cdbd2cSJim Jagielski                 aRange.aEnd.SetRow(static_cast<SCsCOL>( aRange.aEnd.Row()-nDecreaseRowCount));
2154*b1cdbd2cSJim Jagielski                 break;
2155*b1cdbd2cSJim Jagielski             case DEL_CELLSLEFT:
2156*b1cdbd2cSJim Jagielski             case DEL_DELCOLS:
2157*b1cdbd2cSJim Jagielski                 aRange.aEnd.SetCol(static_cast<SCsCOL>( aRange.aEnd.Col()-nDecreaseColCount));
2158*b1cdbd2cSJim Jagielski                 break;
2159*b1cdbd2cSJim Jagielski             default:
2160*b1cdbd2cSJim Jagielski                 break;
2161*b1cdbd2cSJim Jagielski         }
2162*b1cdbd2cSJim Jagielski 
2163*b1cdbd2cSJim Jagielski         if( !pDoc->HasAttrib( aRange, HASATTR_OVERLAPPED | HASATTR_MERGED ) )
2164*b1cdbd2cSJim Jagielski         {
2165*b1cdbd2cSJim Jagielski             MergeCells( aRange, sal_False, sal_True, sal_True );
2166*b1cdbd2cSJim Jagielski         }
2167*b1cdbd2cSJim Jagielski         qDecreaseRange.pop_back();
2168*b1cdbd2cSJim Jagielski     }
2169*b1cdbd2cSJim Jagielski 
2170*b1cdbd2cSJim Jagielski     if( bDeletingMerge )
2171*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->LeaveListAction();
2172*b1cdbd2cSJim Jagielski 
2173*b1cdbd2cSJim Jagielski 	if ( bNeedRefresh )
2174*b1cdbd2cSJim Jagielski 	{
2175*b1cdbd2cSJim Jagielski         // #i51445# old merge flag attributes must be deleted also for single cells,
2176*b1cdbd2cSJim Jagielski         // not only for whole columns/rows
2177*b1cdbd2cSJim Jagielski 
2178*b1cdbd2cSJim Jagielski         if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT )
2179*b1cdbd2cSJim Jagielski             nMergeTestEndX = MAXCOL;
2180*b1cdbd2cSJim Jagielski         if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP )
2181*b1cdbd2cSJim Jagielski             nMergeTestEndY = MAXROW;
2182*b1cdbd2cSJim Jagielski 		ScPatternAttr aPattern( pDoc->GetPool() );
2183*b1cdbd2cSJim Jagielski 		aPattern.GetItemSet().Put( ScMergeFlagAttr() );
2184*b1cdbd2cSJim Jagielski 
2185*b1cdbd2cSJim Jagielski         pDoc->ApplyPatternArea( nExtendStartCol, nExtendStartRow, nMergeTestEndX, nMergeTestEndY, aMark, aPattern );
2186*b1cdbd2cSJim Jagielski 
2187*b1cdbd2cSJim Jagielski         for( i=0; i<nTabCount; i++ )
2188*b1cdbd2cSJim Jagielski         {
2189*b1cdbd2cSJim Jagielski             if( aMark.GetTableSelect( i ) )
2190*b1cdbd2cSJim Jagielski             {
2191*b1cdbd2cSJim Jagielski                 SCTAB nScenarioCount = 0;
2192*b1cdbd2cSJim Jagielski 
2193*b1cdbd2cSJim Jagielski                 for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
2194*b1cdbd2cSJim Jagielski                     nScenarioCount ++;
2195*b1cdbd2cSJim Jagielski 
2196*b1cdbd2cSJim Jagielski                 ScRange aMergedRange( nExtendStartCol, nExtendStartRow, i, nMergeTestEndX, nMergeTestEndY, i+nScenarioCount );
2197*b1cdbd2cSJim Jagielski                 pDoc->ExtendMerge( aMergedRange, sal_True );
2198*b1cdbd2cSJim Jagielski             }
2199*b1cdbd2cSJim Jagielski         }
2200*b1cdbd2cSJim Jagielski 	}
2201*b1cdbd2cSJim Jagielski 
2202*b1cdbd2cSJim Jagielski     for( i=0; i<nTabCount; i++ )
2203*b1cdbd2cSJim Jagielski     {
2204*b1cdbd2cSJim Jagielski         if( aMark.GetTableSelect( i ) )
2205*b1cdbd2cSJim Jagielski         {
2206*b1cdbd2cSJim Jagielski 	        if ( eCmd == DEL_DELCOLS || eCmd == DEL_DELROWS )
2207*b1cdbd2cSJim Jagielski                 pDoc->UpdatePageBreaks( i );
2208*b1cdbd2cSJim Jagielski 
2209*b1cdbd2cSJim Jagielski 	        rDocShell.UpdatePaintExt( nExtFlags, nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i );
2210*b1cdbd2cSJim Jagielski 
2211*b1cdbd2cSJim Jagielski             SCTAB nScenarioCount = 0;
2212*b1cdbd2cSJim Jagielski 
2213*b1cdbd2cSJim Jagielski             for( SCTAB j = i+1; j<nTabCount && pDoc->IsScenario(j); j++ )
2214*b1cdbd2cSJim Jagielski                 nScenarioCount ++;
2215*b1cdbd2cSJim Jagielski 
2216*b1cdbd2cSJim Jagielski 	        //	ganze Zeilen loeschen: nichts anpassen
2217*b1cdbd2cSJim Jagielski 	        if ( eCmd == DEL_DELROWS || !AdjustRowHeight(ScRange( 0, nPaintStartY, i, MAXCOL, nPaintEndY, i+nScenarioCount )) )
2218*b1cdbd2cSJim Jagielski 		        rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, nPaintFlags,  nExtFlags );
2219*b1cdbd2cSJim Jagielski     	    else
2220*b1cdbd2cSJim Jagielski 	        {
2221*b1cdbd2cSJim Jagielski 		        //	paint only what is not done by AdjustRowHeight
2222*b1cdbd2cSJim Jagielski 		        if (nExtFlags & SC_PF_LINES)
2223*b1cdbd2cSJim Jagielski 			        lcl_PaintAbove( rDocShell, ScRange( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount) );
2224*b1cdbd2cSJim Jagielski 		        if (nPaintFlags & PAINT_TOP)
2225*b1cdbd2cSJim Jagielski 			        rDocShell.PostPaint( nPaintStartX, nPaintStartY, i, nPaintEndX, nPaintEndY, i+nScenarioCount, PAINT_TOP );
2226*b1cdbd2cSJim Jagielski 	        }
2227*b1cdbd2cSJim Jagielski         }
2228*b1cdbd2cSJim Jagielski     }
2229*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
2230*b1cdbd2cSJim Jagielski 
2231*b1cdbd2cSJim Jagielski     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
2232*b1cdbd2cSJim Jagielski 
2233*b1cdbd2cSJim Jagielski 	return sal_True;
2234*b1cdbd2cSJim Jagielski }
2235*b1cdbd2cSJim Jagielski 
MoveBlock(const ScRange & rSource,const ScAddress & rDestPos,sal_Bool bCut,sal_Bool bRecord,sal_Bool bPaint,sal_Bool bApi)2236*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::MoveBlock( const ScRange& rSource, const ScAddress& rDestPos,
2237*b1cdbd2cSJim Jagielski 								sal_Bool bCut, sal_Bool bRecord, sal_Bool bPaint, sal_Bool bApi )
2238*b1cdbd2cSJim Jagielski {
2239*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
2240*b1cdbd2cSJim Jagielski 
2241*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rSource.aStart.Col();
2242*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rSource.aStart.Row();
2243*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rSource.aStart.Tab();
2244*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rSource.aEnd.Col();
2245*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rSource.aEnd.Row();
2246*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rSource.aEnd.Tab();
2247*b1cdbd2cSJim Jagielski 	SCCOL nDestCol = rDestPos.Col();
2248*b1cdbd2cSJim Jagielski 	SCROW nDestRow = rDestPos.Row();
2249*b1cdbd2cSJim Jagielski 	SCTAB nDestTab = rDestPos.Tab();
2250*b1cdbd2cSJim Jagielski 
2251*b1cdbd2cSJim Jagielski 	if ( !ValidRow(nStartRow) || !ValidRow(nEndRow) || !ValidRow(nDestRow) )
2252*b1cdbd2cSJim Jagielski 	{
2253*b1cdbd2cSJim Jagielski 		DBG_ERROR("invalid row in MoveBlock");
2254*b1cdbd2cSJim Jagielski 		return sal_False;
2255*b1cdbd2cSJim Jagielski 	}
2256*b1cdbd2cSJim Jagielski 
2257*b1cdbd2cSJim Jagielski 	//	zugehoerige Szenarien auch anpassen - nur wenn innerhalb einer Tabelle verschoben wird!
2258*b1cdbd2cSJim Jagielski 	sal_Bool bScenariosAdded = sal_False;
2259*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
2260*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
2261*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
2262*b1cdbd2cSJim Jagielski 
2263*b1cdbd2cSJim Jagielski 	SCTAB nTabCount = pDoc->GetTableCount();
2264*b1cdbd2cSJim Jagielski 	if ( nDestTab == nStartTab && !pDoc->IsScenario(nEndTab) )
2265*b1cdbd2cSJim Jagielski 		while ( nEndTab+1 < nTabCount && pDoc->IsScenario(nEndTab+1) )
2266*b1cdbd2cSJim Jagielski 		{
2267*b1cdbd2cSJim Jagielski 			++nEndTab;
2268*b1cdbd2cSJim Jagielski 			bScenariosAdded = sal_True;
2269*b1cdbd2cSJim Jagielski 		}
2270*b1cdbd2cSJim Jagielski 
2271*b1cdbd2cSJim Jagielski 	SCTAB nSrcTabCount = nEndTab-nStartTab+1;
2272*b1cdbd2cSJim Jagielski 	SCTAB nDestEndTab = nDestTab+nSrcTabCount-1;
2273*b1cdbd2cSJim Jagielski 	SCTAB nTab;
2274*b1cdbd2cSJim Jagielski 
2275*b1cdbd2cSJim Jagielski 	ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
2276*b1cdbd2cSJim Jagielski 
2277*b1cdbd2cSJim Jagielski 	ScMarkData aSourceMark;
2278*b1cdbd2cSJim Jagielski 	for (nTab=nStartTab; nTab<=nEndTab; nTab++)
2279*b1cdbd2cSJim Jagielski 		aSourceMark.SelectTable( nTab, sal_True );		// Source selektieren
2280*b1cdbd2cSJim Jagielski 	aSourceMark.SetMarkArea( rSource );
2281*b1cdbd2cSJim Jagielski 
2282*b1cdbd2cSJim Jagielski 	ScDocShellRef aDragShellRef;
2283*b1cdbd2cSJim Jagielski 	if ( pDoc->HasOLEObjectsInArea( rSource ) )
2284*b1cdbd2cSJim Jagielski 	{
2285*b1cdbd2cSJim Jagielski 		aDragShellRef = new ScDocShell;		// DocShell needs a Ref immediately
2286*b1cdbd2cSJim Jagielski 		aDragShellRef->DoInitNew(NULL);
2287*b1cdbd2cSJim Jagielski 	}
2288*b1cdbd2cSJim Jagielski 	ScDrawLayer::SetGlobalDrawPersist(aDragShellRef);
2289*b1cdbd2cSJim Jagielski 
2290*b1cdbd2cSJim Jagielski     ScClipParam aClipParam(ScRange(nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nStartTab), bCut);
2291*b1cdbd2cSJim Jagielski     pDoc->CopyToClip(aClipParam, pClipDoc, &aSourceMark, false, bScenariosAdded, true);
2292*b1cdbd2cSJim Jagielski 
2293*b1cdbd2cSJim Jagielski 	ScDrawLayer::SetGlobalDrawPersist(NULL);
2294*b1cdbd2cSJim Jagielski 
2295*b1cdbd2cSJim Jagielski 	SCCOL nOldEndCol = nEndCol;
2296*b1cdbd2cSJim Jagielski 	SCROW nOldEndRow = nEndRow;
2297*b1cdbd2cSJim Jagielski 	sal_Bool bClipOver = sal_False;
2298*b1cdbd2cSJim Jagielski 	for (nTab=nStartTab; nTab<=nEndTab; nTab++)
2299*b1cdbd2cSJim Jagielski 	{
2300*b1cdbd2cSJim Jagielski 		SCCOL nTmpEndCol = nOldEndCol;
2301*b1cdbd2cSJim Jagielski 		SCROW nTmpEndRow = nOldEndRow;
2302*b1cdbd2cSJim Jagielski 		if (pDoc->ExtendMerge( nStartCol, nStartRow, nTmpEndCol, nTmpEndRow, nTab ))
2303*b1cdbd2cSJim Jagielski 			bClipOver = sal_True;
2304*b1cdbd2cSJim Jagielski 		if ( nTmpEndCol > nEndCol ) nEndCol = nTmpEndCol;
2305*b1cdbd2cSJim Jagielski 		if ( nTmpEndRow > nEndRow ) nEndRow = nTmpEndRow;
2306*b1cdbd2cSJim Jagielski 	}
2307*b1cdbd2cSJim Jagielski 
2308*b1cdbd2cSJim Jagielski 	SCCOL nDestEndCol = nDestCol + ( nOldEndCol-nStartCol );
2309*b1cdbd2cSJim Jagielski 	SCROW nDestEndRow = nDestRow + ( nOldEndRow-nStartRow );
2310*b1cdbd2cSJim Jagielski 
2311*b1cdbd2cSJim Jagielski 	SCCOL nUndoEndCol = nDestCol + ( nEndCol-nStartCol );		// erweitert im Zielblock
2312*b1cdbd2cSJim Jagielski 	SCROW nUndoEndRow = nDestRow + ( nEndRow-nStartRow );
2313*b1cdbd2cSJim Jagielski 
2314*b1cdbd2cSJim Jagielski 	sal_Bool bIncludeFiltered = bCut;
2315*b1cdbd2cSJim Jagielski 	if ( !bIncludeFiltered )
2316*b1cdbd2cSJim Jagielski 	{
2317*b1cdbd2cSJim Jagielski 		//	adjust sizes to include only non-filtered rows
2318*b1cdbd2cSJim Jagielski 
2319*b1cdbd2cSJim Jagielski         SCCOL nClipX;
2320*b1cdbd2cSJim Jagielski         SCROW nClipY;
2321*b1cdbd2cSJim Jagielski         pClipDoc->GetClipArea( nClipX, nClipY, sal_False );
2322*b1cdbd2cSJim Jagielski 		SCROW nUndoAdd = nUndoEndRow - nDestEndRow;
2323*b1cdbd2cSJim Jagielski 		nDestEndRow = nDestRow + nClipY;
2324*b1cdbd2cSJim Jagielski 		nUndoEndRow = nDestEndRow + nUndoAdd;
2325*b1cdbd2cSJim Jagielski 	}
2326*b1cdbd2cSJim Jagielski 
2327*b1cdbd2cSJim Jagielski 	if (!ValidCol(nUndoEndCol) || !ValidRow(nUndoEndRow))
2328*b1cdbd2cSJim Jagielski 	{
2329*b1cdbd2cSJim Jagielski 		if (!bApi)
2330*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_PASTE_FULL);
2331*b1cdbd2cSJim Jagielski 		delete pClipDoc;
2332*b1cdbd2cSJim Jagielski 		return sal_False;
2333*b1cdbd2cSJim Jagielski 	}
2334*b1cdbd2cSJim Jagielski 
2335*b1cdbd2cSJim Jagielski 	//	Test auf Zellschutz
2336*b1cdbd2cSJim Jagielski 
2337*b1cdbd2cSJim Jagielski 	ScEditableTester aTester;
2338*b1cdbd2cSJim Jagielski 	for (nTab=nDestTab; nTab<=nDestEndTab; nTab++)
2339*b1cdbd2cSJim Jagielski 		aTester.TestBlock( pDoc, nTab, nDestCol,nDestRow, nUndoEndCol,nUndoEndRow );
2340*b1cdbd2cSJim Jagielski 	if (bCut)
2341*b1cdbd2cSJim Jagielski 		for (nTab=nStartTab; nTab<=nEndTab; nTab++)
2342*b1cdbd2cSJim Jagielski 			aTester.TestBlock( pDoc, nTab, nStartCol,nStartRow, nEndCol,nEndRow );
2343*b1cdbd2cSJim Jagielski 
2344*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
2345*b1cdbd2cSJim Jagielski 	{
2346*b1cdbd2cSJim Jagielski 		if (!bApi)
2347*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
2348*b1cdbd2cSJim Jagielski 		delete pClipDoc;
2349*b1cdbd2cSJim Jagielski 		return sal_False;
2350*b1cdbd2cSJim Jagielski 	}
2351*b1cdbd2cSJim Jagielski 
2352*b1cdbd2cSJim Jagielski 	//	Test auf zusammengefasste - beim Verschieben erst nach dem Loeschen
2353*b1cdbd2cSJim Jagielski 
2354*b1cdbd2cSJim Jagielski 	if (bClipOver && !bCut)
2355*b1cdbd2cSJim Jagielski 		if (pDoc->HasAttrib( nDestCol,nDestRow,nDestTab, nUndoEndCol,nUndoEndRow,nDestEndTab,
2356*b1cdbd2cSJim Jagielski 								HASATTR_MERGED | HASATTR_OVERLAPPED ))
2357*b1cdbd2cSJim Jagielski 		{		// "Zusammenfassen nicht verschachteln !"
2358*b1cdbd2cSJim Jagielski 			if (!bApi)
2359*b1cdbd2cSJim Jagielski 				rDocShell.ErrorMessage(STR_MSSG_MOVEBLOCKTO_0);
2360*b1cdbd2cSJim Jagielski 			delete pClipDoc;
2361*b1cdbd2cSJim Jagielski 			return sal_False;
2362*b1cdbd2cSJim Jagielski 		}
2363*b1cdbd2cSJim Jagielski 
2364*b1cdbd2cSJim Jagielski 	//	Are there borders in the cells? (for painting)
2365*b1cdbd2cSJim Jagielski 
2366*b1cdbd2cSJim Jagielski 	sal_uInt16 nSourceExt = 0;
2367*b1cdbd2cSJim Jagielski 	rDocShell.UpdatePaintExt( nSourceExt, nStartCol,nStartRow,nStartTab, nEndCol,nEndRow,nEndTab );
2368*b1cdbd2cSJim Jagielski 	sal_uInt16 nDestExt = 0;
2369*b1cdbd2cSJim Jagielski 	rDocShell.UpdatePaintExt( nDestExt, nDestCol,nDestRow,nDestTab, nDestEndCol,nDestEndRow,nDestEndTab );
2370*b1cdbd2cSJim Jagielski 
2371*b1cdbd2cSJim Jagielski 	//
2372*b1cdbd2cSJim Jagielski 	//	ausfuehren
2373*b1cdbd2cSJim Jagielski 	//
2374*b1cdbd2cSJim Jagielski 
2375*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
2376*b1cdbd2cSJim Jagielski 	ScDocument* pRefUndoDoc = NULL;
2377*b1cdbd2cSJim Jagielski 	ScRefUndoData* pUndoData = NULL;
2378*b1cdbd2cSJim Jagielski 	if (bRecord)
2379*b1cdbd2cSJim Jagielski 	{
2380*b1cdbd2cSJim Jagielski 		sal_Bool bWholeCols = ( nStartRow == 0 && nEndRow == MAXROW );
2381*b1cdbd2cSJim Jagielski 		sal_Bool bWholeRows = ( nStartCol == 0 && nEndCol == MAXCOL );
2382*b1cdbd2cSJim Jagielski         sal_uInt16 nUndoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
2383*b1cdbd2cSJim Jagielski 
2384*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
2385*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab, bWholeCols, bWholeRows );
2386*b1cdbd2cSJim Jagielski 
2387*b1cdbd2cSJim Jagielski 		if (bCut)
2388*b1cdbd2cSJim Jagielski 		{
2389*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab,
2390*b1cdbd2cSJim Jagielski                                     nUndoFlags, sal_False, pUndoDoc );
2391*b1cdbd2cSJim Jagielski 			pRefUndoDoc = new ScDocument( SCDOCMODE_UNDO );
2392*b1cdbd2cSJim Jagielski 			pRefUndoDoc->InitUndo( pDoc, 0, nTabCount-1, sal_False, sal_False );
2393*b1cdbd2cSJim Jagielski 		}
2394*b1cdbd2cSJim Jagielski 
2395*b1cdbd2cSJim Jagielski 		if ( nDestTab != nStartTab )
2396*b1cdbd2cSJim Jagielski 			pUndoDoc->AddUndoTab( nDestTab, nDestEndTab, bWholeCols, bWholeRows );
2397*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( nDestCol, nDestRow, nDestTab,
2398*b1cdbd2cSJim Jagielski 									nDestEndCol, nDestEndRow, nDestEndTab,
2399*b1cdbd2cSJim Jagielski                                     nUndoFlags, sal_False, pUndoDoc );
2400*b1cdbd2cSJim Jagielski 
2401*b1cdbd2cSJim Jagielski 		pUndoData = new ScRefUndoData( pDoc );
2402*b1cdbd2cSJim Jagielski 
2403*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();
2404*b1cdbd2cSJim Jagielski 	}
2405*b1cdbd2cSJim Jagielski 
2406*b1cdbd2cSJim Jagielski 	sal_Bool bSourceHeight = sal_False;		// Hoehen angepasst?
2407*b1cdbd2cSJim Jagielski 	if (bCut)
2408*b1cdbd2cSJim Jagielski 	{
2409*b1cdbd2cSJim Jagielski 		ScMarkData aDelMark;	// only for tables
2410*b1cdbd2cSJim Jagielski 		for (nTab=nStartTab; nTab<=nEndTab; nTab++)
2411*b1cdbd2cSJim Jagielski 		{
2412*b1cdbd2cSJim Jagielski 			pDoc->DeleteAreaTab( nStartCol,nStartRow, nOldEndCol,nOldEndRow, nTab, IDF_ALL );
2413*b1cdbd2cSJim Jagielski 			aDelMark.SelectTable( nTab, sal_True );
2414*b1cdbd2cSJim Jagielski 		}
2415*b1cdbd2cSJim Jagielski 		pDoc->DeleteObjectsInArea( nStartCol,nStartRow, nOldEndCol,nOldEndRow, aDelMark );
2416*b1cdbd2cSJim Jagielski 
2417*b1cdbd2cSJim Jagielski 		//	Test auf zusammengefasste
2418*b1cdbd2cSJim Jagielski 
2419*b1cdbd2cSJim Jagielski 		if (bClipOver)
2420*b1cdbd2cSJim Jagielski 			if (pDoc->HasAttrib( nDestCol,nDestRow,nDestTab,
2421*b1cdbd2cSJim Jagielski 									nUndoEndCol,nUndoEndRow,nDestEndTab,
2422*b1cdbd2cSJim Jagielski 									HASATTR_MERGED | HASATTR_OVERLAPPED ))
2423*b1cdbd2cSJim Jagielski 			{
2424*b1cdbd2cSJim Jagielski 				pDoc->CopyFromClip( rSource, aSourceMark, IDF_ALL, pRefUndoDoc, pClipDoc );
2425*b1cdbd2cSJim Jagielski 				for (nTab=nStartTab; nTab<=nEndTab; nTab++)
2426*b1cdbd2cSJim Jagielski 				{
2427*b1cdbd2cSJim Jagielski 					SCCOL nTmpEndCol = nEndCol;
2428*b1cdbd2cSJim Jagielski 					SCROW nTmpEndRow = nEndRow;
2429*b1cdbd2cSJim Jagielski 					pDoc->ExtendMerge( nStartCol, nStartRow, nTmpEndCol, nTmpEndRow, nTab, sal_True );
2430*b1cdbd2cSJim Jagielski 				}
2431*b1cdbd2cSJim Jagielski 
2432*b1cdbd2cSJim Jagielski 				//	Fehlermeldung erst nach dem Wiederherstellen des Inhalts
2433*b1cdbd2cSJim Jagielski 				if (!bApi)		// "Zusammenfassen nicht verschachteln !"
2434*b1cdbd2cSJim Jagielski 					rDocShell.ErrorMessage(STR_MSSG_MOVEBLOCKTO_0);
2435*b1cdbd2cSJim Jagielski 
2436*b1cdbd2cSJim Jagielski 				delete pUndoDoc;
2437*b1cdbd2cSJim Jagielski 				delete pRefUndoDoc;
2438*b1cdbd2cSJim Jagielski 				delete pUndoData;
2439*b1cdbd2cSJim Jagielski 				delete pClipDoc;
2440*b1cdbd2cSJim Jagielski 				return sal_False;
2441*b1cdbd2cSJim Jagielski 			}
2442*b1cdbd2cSJim Jagielski 
2443*b1cdbd2cSJim Jagielski 		bSourceHeight = AdjustRowHeight( rSource, sal_False );
2444*b1cdbd2cSJim Jagielski 	}
2445*b1cdbd2cSJim Jagielski 
2446*b1cdbd2cSJim Jagielski 	ScRange aPasteDest( nDestCol, nDestRow, nDestTab, nDestEndCol, nDestEndRow, nDestEndTab );
2447*b1cdbd2cSJim Jagielski 
2448*b1cdbd2cSJim Jagielski 	ScMarkData aDestMark;
2449*b1cdbd2cSJim Jagielski 	for (nTab=nDestTab; nTab<=nDestEndTab; nTab++)
2450*b1cdbd2cSJim Jagielski 		aDestMark.SelectTable( nTab, sal_True );		// Destination selektieren
2451*b1cdbd2cSJim Jagielski 	aDestMark.SetMarkArea( aPasteDest );
2452*b1cdbd2cSJim Jagielski 
2453*b1cdbd2cSJim Jagielski     /*  Do not copy cell notes and drawing objects here. While pasting, the
2454*b1cdbd2cSJim Jagielski         function ScDocument::UpdateReference() is called which calls
2455*b1cdbd2cSJim Jagielski         ScDrawLayer::MoveCells() which may move away inserted objects to wrong
2456*b1cdbd2cSJim Jagielski         positions (e.g. if source and destination range overlaps). Cell notes
2457*b1cdbd2cSJim Jagielski         and drawing objects are pasted below after doing all adjusting. */
2458*b1cdbd2cSJim Jagielski     pDoc->CopyFromClip( aPasteDest, aDestMark, IDF_ALL & ~(IDF_NOTE | IDF_OBJECTS),
2459*b1cdbd2cSJim Jagielski 						pRefUndoDoc, pClipDoc, sal_True, sal_False, bIncludeFiltered );
2460*b1cdbd2cSJim Jagielski 
2461*b1cdbd2cSJim Jagielski 	// skipped rows and merged cells don't mix
2462*b1cdbd2cSJim Jagielski 	if ( !bIncludeFiltered && pClipDoc->HasClipFilteredRows() )
2463*b1cdbd2cSJim Jagielski 		UnmergeCells( aPasteDest, sal_False, sal_True );
2464*b1cdbd2cSJim Jagielski 
2465*b1cdbd2cSJim Jagielski 	VirtualDevice aVirtDev;
2466*b1cdbd2cSJim Jagielski 	sal_Bool bDestHeight = AdjustRowHeight(
2467*b1cdbd2cSJim Jagielski 							ScRange( 0,nDestRow,nDestTab, MAXCOL,nDestEndRow,nDestEndTab ),
2468*b1cdbd2cSJim Jagielski 							sal_False );
2469*b1cdbd2cSJim Jagielski 
2470*b1cdbd2cSJim Jagielski     /*  Paste cell notes and drawing objects after adjusting formula references
2471*b1cdbd2cSJim Jagielski         and row heights. There are no cell notes or drawing objects, if the
2472*b1cdbd2cSJim Jagielski         clipdoc does not contain a drawing layer.
2473*b1cdbd2cSJim Jagielski         #i102056# Passing IDF_NOTE only would overwrite cell contents with
2474*b1cdbd2cSJim Jagielski         empty note cells, therefore the special modifier IDF_ADDNOTES is passed
2475*b1cdbd2cSJim Jagielski         here too which changes the behaviour of ScColumn::CopyFromClip() to not
2476*b1cdbd2cSJim Jagielski         touch existing cells. */
2477*b1cdbd2cSJim Jagielski 	if ( pClipDoc->GetDrawLayer() )
2478*b1cdbd2cSJim Jagielski         pDoc->CopyFromClip( aPasteDest, aDestMark, IDF_NOTE | IDF_ADDNOTES | IDF_OBJECTS,
2479*b1cdbd2cSJim Jagielski 							pRefUndoDoc, pClipDoc, sal_True, sal_False, bIncludeFiltered );
2480*b1cdbd2cSJim Jagielski 
2481*b1cdbd2cSJim Jagielski 	if (bRecord)
2482*b1cdbd2cSJim Jagielski 	{
2483*b1cdbd2cSJim Jagielski 		if (pRefUndoDoc)
2484*b1cdbd2cSJim Jagielski 		{
2485*b1cdbd2cSJim Jagielski 				//	alle Tabellen anlegen, damit Formeln kopiert werden koennen:
2486*b1cdbd2cSJim Jagielski 			pUndoDoc->AddUndoTab( 0, nTabCount-1, sal_False, sal_False );
2487*b1cdbd2cSJim Jagielski 
2488*b1cdbd2cSJim Jagielski 			pRefUndoDoc->DeleteArea( nDestCol, nDestRow, nDestEndCol, nDestEndRow, aSourceMark, IDF_ALL );
2489*b1cdbd2cSJim Jagielski 			//	kopieren mit bColRowFlags=sal_False (#54194#)
2490*b1cdbd2cSJim Jagielski 			pRefUndoDoc->CopyToDocument( 0, 0, 0, MAXCOL, MAXROW, MAXTAB,
2491*b1cdbd2cSJim Jagielski 											IDF_FORMULA, sal_False, pUndoDoc, NULL, sal_False );
2492*b1cdbd2cSJim Jagielski 			delete pRefUndoDoc;
2493*b1cdbd2cSJim Jagielski 		}
2494*b1cdbd2cSJim Jagielski 
2495*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
2496*b1cdbd2cSJim Jagielski 			new ScUndoDragDrop( &rDocShell, ScRange(
2497*b1cdbd2cSJim Jagielski 									nStartCol, nStartRow, nStartTab,
2498*b1cdbd2cSJim Jagielski 									nOldEndCol, nOldEndRow, nEndTab ),
2499*b1cdbd2cSJim Jagielski 								ScAddress( nDestCol, nDestRow, nDestTab ),
2500*b1cdbd2cSJim Jagielski 								bCut, pUndoDoc, pUndoData, bScenariosAdded ) );
2501*b1cdbd2cSJim Jagielski 	}
2502*b1cdbd2cSJim Jagielski 
2503*b1cdbd2cSJim Jagielski 	SCCOL nDestPaintEndCol = nDestEndCol;
2504*b1cdbd2cSJim Jagielski 	SCROW nDestPaintEndRow = nDestEndRow;
2505*b1cdbd2cSJim Jagielski 	for (nTab=nDestTab; nTab<=nDestEndTab; nTab++)
2506*b1cdbd2cSJim Jagielski 	{
2507*b1cdbd2cSJim Jagielski 		SCCOL nTmpEndCol = nDestEndCol;
2508*b1cdbd2cSJim Jagielski 		SCROW nTmpEndRow = nDestEndRow;
2509*b1cdbd2cSJim Jagielski 		pDoc->ExtendMerge( nDestCol, nDestRow, nTmpEndCol, nTmpEndRow, nTab, sal_True );
2510*b1cdbd2cSJim Jagielski 		if (nTmpEndCol > nDestPaintEndCol) nDestPaintEndCol = nTmpEndCol;
2511*b1cdbd2cSJim Jagielski 		if (nTmpEndRow > nDestPaintEndRow) nDestPaintEndRow = nTmpEndRow;
2512*b1cdbd2cSJim Jagielski 	}
2513*b1cdbd2cSJim Jagielski 
2514*b1cdbd2cSJim Jagielski 	if (bCut)
2515*b1cdbd2cSJim Jagielski 		for (nTab=nStartTab; nTab<=nEndTab; nTab++)
2516*b1cdbd2cSJim Jagielski 			pDoc->RefreshAutoFilter( nStartCol, nStartRow, nEndCol, nEndRow, nTab );
2517*b1cdbd2cSJim Jagielski 
2518*b1cdbd2cSJim Jagielski 	if (bPaint)
2519*b1cdbd2cSJim Jagielski 	{
2520*b1cdbd2cSJim Jagielski 			//	Zielbereich:
2521*b1cdbd2cSJim Jagielski 
2522*b1cdbd2cSJim Jagielski 		SCCOL nPaintStartX = nDestCol;
2523*b1cdbd2cSJim Jagielski 		SCROW nPaintStartY = nDestRow;
2524*b1cdbd2cSJim Jagielski 		SCCOL nPaintEndX = nDestPaintEndCol;
2525*b1cdbd2cSJim Jagielski 		SCROW nPaintEndY = nDestPaintEndRow;
2526*b1cdbd2cSJim Jagielski 		sal_uInt16 nFlags = PAINT_GRID;
2527*b1cdbd2cSJim Jagielski 
2528*b1cdbd2cSJim Jagielski 		if ( nStartRow==0 && nEndRow==MAXROW )		// Breiten mitkopiert?
2529*b1cdbd2cSJim Jagielski 		{
2530*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
2531*b1cdbd2cSJim Jagielski 			nPaintStartY = 0;
2532*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
2533*b1cdbd2cSJim Jagielski 			nFlags |= PAINT_TOP;
2534*b1cdbd2cSJim Jagielski 		}
2535*b1cdbd2cSJim Jagielski 		if ( bDestHeight || ( nStartCol == 0 && nEndCol == MAXCOL ) )
2536*b1cdbd2cSJim Jagielski 		{
2537*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
2538*b1cdbd2cSJim Jagielski 			nPaintStartX = 0;
2539*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
2540*b1cdbd2cSJim Jagielski 			nFlags |= PAINT_LEFT;
2541*b1cdbd2cSJim Jagielski 		}
2542*b1cdbd2cSJim Jagielski 		if ( bScenariosAdded )
2543*b1cdbd2cSJim Jagielski 		{
2544*b1cdbd2cSJim Jagielski 			nPaintStartX = 0;
2545*b1cdbd2cSJim Jagielski             nPaintStartY = 0;
2546*b1cdbd2cSJim Jagielski 			nPaintEndX = MAXCOL;
2547*b1cdbd2cSJim Jagielski 			nPaintEndY = MAXROW;
2548*b1cdbd2cSJim Jagielski 		}
2549*b1cdbd2cSJim Jagielski 
2550*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( nPaintStartX,nPaintStartY,nDestTab,
2551*b1cdbd2cSJim Jagielski 							nPaintEndX,nPaintEndY,nDestEndTab, nFlags, nSourceExt | nDestExt );
2552*b1cdbd2cSJim Jagielski 
2553*b1cdbd2cSJim Jagielski 		if ( bCut )
2554*b1cdbd2cSJim Jagielski 		{
2555*b1cdbd2cSJim Jagielski 				//	Quellbereich:
2556*b1cdbd2cSJim Jagielski 
2557*b1cdbd2cSJim Jagielski 			nPaintStartX = nStartCol;
2558*b1cdbd2cSJim Jagielski 			nPaintStartY = nStartRow;
2559*b1cdbd2cSJim Jagielski 			nPaintEndX = nEndCol;
2560*b1cdbd2cSJim Jagielski 			nPaintEndY = nEndRow;
2561*b1cdbd2cSJim Jagielski 			nFlags = PAINT_GRID;
2562*b1cdbd2cSJim Jagielski 
2563*b1cdbd2cSJim Jagielski 			if ( bSourceHeight )
2564*b1cdbd2cSJim Jagielski 			{
2565*b1cdbd2cSJim Jagielski 				nPaintEndY = MAXROW;
2566*b1cdbd2cSJim Jagielski 				nPaintStartX = 0;
2567*b1cdbd2cSJim Jagielski 				nPaintEndX = MAXCOL;
2568*b1cdbd2cSJim Jagielski 				nFlags |= PAINT_LEFT;
2569*b1cdbd2cSJim Jagielski 			}
2570*b1cdbd2cSJim Jagielski 			if ( bScenariosAdded )
2571*b1cdbd2cSJim Jagielski 			{
2572*b1cdbd2cSJim Jagielski 				nPaintStartX = 0;
2573*b1cdbd2cSJim Jagielski                 nPaintStartY = 0;
2574*b1cdbd2cSJim Jagielski 				nPaintEndX = MAXCOL;
2575*b1cdbd2cSJim Jagielski 				nPaintEndY = MAXROW;
2576*b1cdbd2cSJim Jagielski 			}
2577*b1cdbd2cSJim Jagielski 
2578*b1cdbd2cSJim Jagielski 			rDocShell.PostPaint( nPaintStartX,nPaintStartY,nStartTab,
2579*b1cdbd2cSJim Jagielski 								nPaintEndX,nPaintEndY,nEndTab, nFlags, nSourceExt );
2580*b1cdbd2cSJim Jagielski 		}
2581*b1cdbd2cSJim Jagielski 	}
2582*b1cdbd2cSJim Jagielski 
2583*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
2584*b1cdbd2cSJim Jagielski 
2585*b1cdbd2cSJim Jagielski     SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
2586*b1cdbd2cSJim Jagielski 
2587*b1cdbd2cSJim Jagielski 	delete pClipDoc;
2588*b1cdbd2cSJim Jagielski 	return sal_True;
2589*b1cdbd2cSJim Jagielski }
2590*b1cdbd2cSJim Jagielski 
2591*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
GetDocModuleObject(SfxObjectShell & rDocSh,String & sCodeName)2592*b1cdbd2cSJim Jagielski uno::Reference< uno::XInterface > GetDocModuleObject( SfxObjectShell& rDocSh, String& sCodeName )
2593*b1cdbd2cSJim Jagielski {
2594*b1cdbd2cSJim Jagielski     uno::Reference< lang::XMultiServiceFactory> xSF(rDocSh.GetModel(), uno::UNO_QUERY);
2595*b1cdbd2cSJim Jagielski     uno::Reference< container::XNameAccess > xVBACodeNamedObjectAccess;
2596*b1cdbd2cSJim Jagielski     uno::Reference< uno::XInterface > xDocModuleApiObject;
2597*b1cdbd2cSJim Jagielski     if ( xSF.is() )
2598*b1cdbd2cSJim Jagielski     {
2599*b1cdbd2cSJim Jagielski         xVBACodeNamedObjectAccess.set( xSF->createInstance( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.VBAObjectModuleObjectProvider"))), uno::UNO_QUERY );
2600*b1cdbd2cSJim Jagielski         xDocModuleApiObject.set( xVBACodeNamedObjectAccess->getByName( sCodeName ), uno::UNO_QUERY );
2601*b1cdbd2cSJim Jagielski     }
2602*b1cdbd2cSJim Jagielski     return xDocModuleApiObject;
2603*b1cdbd2cSJim Jagielski 
2604*b1cdbd2cSJim Jagielski }
2605*b1cdbd2cSJim Jagielski 
lcl_InitModuleInfo(SfxObjectShell & rDocSh,String & sModule)2606*b1cdbd2cSJim Jagielski script::ModuleInfo lcl_InitModuleInfo( SfxObjectShell& rDocSh, String& sModule )
2607*b1cdbd2cSJim Jagielski {
2608*b1cdbd2cSJim Jagielski     script::ModuleInfo sModuleInfo;
2609*b1cdbd2cSJim Jagielski     sModuleInfo.ModuleType = script::ModuleType::DOCUMENT;
2610*b1cdbd2cSJim Jagielski     sModuleInfo.ModuleObject = GetDocModuleObject( rDocSh, sModule );
2611*b1cdbd2cSJim Jagielski     return sModuleInfo;
2612*b1cdbd2cSJim Jagielski }
2613*b1cdbd2cSJim Jagielski 
VBA_InsertModule(ScDocument & rDoc,SCTAB nTab,String & sModuleName,String & sSource)2614*b1cdbd2cSJim Jagielski void VBA_InsertModule( ScDocument& rDoc, SCTAB nTab, String& sModuleName, String& sSource )
2615*b1cdbd2cSJim Jagielski {
2616*b1cdbd2cSJim Jagielski     SfxObjectShell& rDocSh = *rDoc.GetDocumentShell();
2617*b1cdbd2cSJim Jagielski     uno::Reference< script::XLibraryContainer > xLibContainer = rDocSh.GetBasicContainer();
2618*b1cdbd2cSJim Jagielski     DBG_ASSERT( xLibContainer.is(), "No BasicContainer!" );
2619*b1cdbd2cSJim Jagielski 
2620*b1cdbd2cSJim Jagielski     uno::Reference< container::XNameContainer > xLib;
2621*b1cdbd2cSJim Jagielski     if( xLibContainer.is() )
2622*b1cdbd2cSJim Jagielski     {
2623*b1cdbd2cSJim Jagielski         String aLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) );
2624*b1cdbd2cSJim Jagielski         if ( rDocSh.GetBasicManager() && rDocSh.GetBasicManager()->GetName().Len() )
2625*b1cdbd2cSJim Jagielski             aLibName = rDocSh.GetBasicManager()->GetName();
2626*b1cdbd2cSJim Jagielski         uno::Any aLibAny = xLibContainer->getByName( aLibName );
2627*b1cdbd2cSJim Jagielski         aLibAny >>= xLib;
2628*b1cdbd2cSJim Jagielski     }
2629*b1cdbd2cSJim Jagielski     if( xLib.is() )
2630*b1cdbd2cSJim Jagielski     {
2631*b1cdbd2cSJim Jagielski         // if the Module with codename exists then find a new name
2632*b1cdbd2cSJim Jagielski         sal_Int32 nNum = 0;
2633*b1cdbd2cSJim Jagielski         String genModuleName;
2634*b1cdbd2cSJim Jagielski         if ( sModuleName.Len() )
2635*b1cdbd2cSJim Jagielski             sModuleName = sModuleName;
2636*b1cdbd2cSJim Jagielski         else
2637*b1cdbd2cSJim Jagielski         {
2638*b1cdbd2cSJim Jagielski              genModuleName = String::CreateFromAscii( "Sheet1" );
2639*b1cdbd2cSJim Jagielski              nNum = 1;
2640*b1cdbd2cSJim Jagielski         }
2641*b1cdbd2cSJim Jagielski         while( xLib->hasByName( genModuleName  ) )
2642*b1cdbd2cSJim Jagielski             genModuleName = rtl::OUString::createFromAscii( "Sheet" ) + rtl::OUString::valueOf( ++nNum );
2643*b1cdbd2cSJim Jagielski 
2644*b1cdbd2cSJim Jagielski         uno::Any aSourceAny;
2645*b1cdbd2cSJim Jagielski         rtl::OUString sTmpSource = sSource;
2646*b1cdbd2cSJim Jagielski         if ( sTmpSource.getLength() == 0 )
2647*b1cdbd2cSJim Jagielski             sTmpSource = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Rem Attribute VBA_ModuleType=VBADocumentModule\nOption VBASupport 1\n" ));
2648*b1cdbd2cSJim Jagielski         aSourceAny <<= sTmpSource;
2649*b1cdbd2cSJim Jagielski         uno::Reference< script::vba::XVBAModuleInfo > xVBAModuleInfo( xLib, uno::UNO_QUERY );
2650*b1cdbd2cSJim Jagielski         if ( xVBAModuleInfo.is() )
2651*b1cdbd2cSJim Jagielski         {
2652*b1cdbd2cSJim Jagielski             rDoc.SetCodeName( nTab, genModuleName );
2653*b1cdbd2cSJim Jagielski             script::ModuleInfo sModuleInfo = lcl_InitModuleInfo(  rDocSh, genModuleName );
2654*b1cdbd2cSJim Jagielski             xVBAModuleInfo->insertModuleInfo( genModuleName, sModuleInfo );
2655*b1cdbd2cSJim Jagielski             xLib->insertByName( genModuleName, aSourceAny );
2656*b1cdbd2cSJim Jagielski         }
2657*b1cdbd2cSJim Jagielski 
2658*b1cdbd2cSJim Jagielski     }
2659*b1cdbd2cSJim Jagielski }
2660*b1cdbd2cSJim Jagielski 
VBA_DeleteModule(ScDocShell & rDocSh,String & sModuleName)2661*b1cdbd2cSJim Jagielski void VBA_DeleteModule( ScDocShell& rDocSh, String& sModuleName )
2662*b1cdbd2cSJim Jagielski {
2663*b1cdbd2cSJim Jagielski     uno::Reference< script::XLibraryContainer > xLibContainer = rDocSh.GetBasicContainer();
2664*b1cdbd2cSJim Jagielski     DBG_ASSERT( xLibContainer.is(), "No BasicContainer!" );
2665*b1cdbd2cSJim Jagielski 
2666*b1cdbd2cSJim Jagielski     uno::Reference< container::XNameContainer > xLib;
2667*b1cdbd2cSJim Jagielski     if( xLibContainer.is() )
2668*b1cdbd2cSJim Jagielski     {
2669*b1cdbd2cSJim Jagielski         String aLibName( RTL_CONSTASCII_USTRINGPARAM( "Standard" ) );
2670*b1cdbd2cSJim Jagielski         if ( rDocSh.GetBasicManager() && rDocSh.GetBasicManager()->GetName().Len() )
2671*b1cdbd2cSJim Jagielski             aLibName = rDocSh.GetBasicManager()->GetName();
2672*b1cdbd2cSJim Jagielski         uno::Any aLibAny = xLibContainer->getByName( aLibName );
2673*b1cdbd2cSJim Jagielski         aLibAny >>= xLib;
2674*b1cdbd2cSJim Jagielski     }
2675*b1cdbd2cSJim Jagielski     if( xLib.is() )
2676*b1cdbd2cSJim Jagielski     {
2677*b1cdbd2cSJim Jagielski         uno::Reference< script::vba::XVBAModuleInfo > xVBAModuleInfo( xLib, uno::UNO_QUERY );
2678*b1cdbd2cSJim Jagielski         if( xLib->hasByName( sModuleName ) )
2679*b1cdbd2cSJim Jagielski             xLib->removeByName( sModuleName );
2680*b1cdbd2cSJim Jagielski         if ( xVBAModuleInfo.is() )
2681*b1cdbd2cSJim Jagielski             xVBAModuleInfo->removeModuleInfo( sModuleName );
2682*b1cdbd2cSJim Jagielski 
2683*b1cdbd2cSJim Jagielski     }
2684*b1cdbd2cSJim Jagielski }
2685*b1cdbd2cSJim Jagielski 
2686*b1cdbd2cSJim Jagielski 
InsertTable(SCTAB nTab,const String & rName,sal_Bool bRecord,sal_Bool bApi)2687*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::InsertTable( SCTAB nTab, const String& rName, sal_Bool bRecord, sal_Bool bApi )
2688*b1cdbd2cSJim Jagielski {
2689*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
2690*b1cdbd2cSJim Jagielski 	WaitObject aWait( rDocShell.GetActiveDialogParent() );
2691*b1cdbd2cSJim Jagielski 
2692*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
2693*b1cdbd2cSJim Jagielski 
2694*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
2695*b1cdbd2cSJim Jagielski 
2696*b1cdbd2cSJim Jagielski 
2697*b1cdbd2cSJim Jagielski     // Strange loop, also basic is loaded too early ( InsertTable )
2698*b1cdbd2cSJim Jagielski     // is called via the xml import for sheets in described in odf
2699*b1cdbd2cSJim Jagielski     sal_Bool bInsertDocModule = false;
2700*b1cdbd2cSJim Jagielski 
2701*b1cdbd2cSJim Jagielski     if(  !rDocShell.GetDocument()->IsImportingXML() )
2702*b1cdbd2cSJim Jagielski     {
2703*b1cdbd2cSJim Jagielski         bInsertDocModule = pDoc ? pDoc->IsInVBAMode() : false;
2704*b1cdbd2cSJim Jagielski     }
2705*b1cdbd2cSJim Jagielski 	if ( bInsertDocModule || ( bRecord && !pDoc->IsUndoEnabled() ) )
2706*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
2707*b1cdbd2cSJim Jagielski 
2708*b1cdbd2cSJim Jagielski 	if (bRecord)
2709*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();							//	InsertTab erzeugt ein SdrUndoNewPage
2710*b1cdbd2cSJim Jagielski 
2711*b1cdbd2cSJim Jagielski 	SCTAB nTabCount = pDoc->GetTableCount();
2712*b1cdbd2cSJim Jagielski 	sal_Bool bAppend = ( nTab >= nTabCount );
2713*b1cdbd2cSJim Jagielski 	if ( bAppend )
2714*b1cdbd2cSJim Jagielski 		nTab = nTabCount;		// wichtig fuer Undo
2715*b1cdbd2cSJim Jagielski 
2716*b1cdbd2cSJim Jagielski 	if (pDoc->InsertTab( nTab, rName ))
2717*b1cdbd2cSJim Jagielski 	{
2718*b1cdbd2cSJim Jagielski 		String sCodeName;
2719*b1cdbd2cSJim Jagielski 		if (bRecord)
2720*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
2721*b1cdbd2cSJim Jagielski 						new ScUndoInsertTab( &rDocShell, nTab, bAppend, rName));
2722*b1cdbd2cSJim Jagielski 		//	Views updaten:
2723*b1cdbd2cSJim Jagielski         // Only insert vba modules if vba mode ( and not currently importing XML )
2724*b1cdbd2cSJim Jagielski         if( bInsertDocModule )
2725*b1cdbd2cSJim Jagielski         {
2726*b1cdbd2cSJim Jagielski             String sSource;
2727*b1cdbd2cSJim Jagielski             VBA_InsertModule( *pDoc, nTab, sCodeName, sSource );
2728*b1cdbd2cSJim Jagielski         }
2729*b1cdbd2cSJim Jagielski 		rDocShell.Broadcast( ScTablesHint( SC_TAB_INSERTED, nTab ) );
2730*b1cdbd2cSJim Jagielski 
2731*b1cdbd2cSJim Jagielski 		rDocShell.PostPaintExtras();
2732*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
2733*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2734*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
2735*b1cdbd2cSJim Jagielski 	}
2736*b1cdbd2cSJim Jagielski 	else if (!bApi)
2737*b1cdbd2cSJim Jagielski 		rDocShell.ErrorMessage(STR_TABINSERT_ERROR);
2738*b1cdbd2cSJim Jagielski 
2739*b1cdbd2cSJim Jagielski 	return bSuccess;
2740*b1cdbd2cSJim Jagielski }
2741*b1cdbd2cSJim Jagielski 
DeleteTable(SCTAB nTab,sal_Bool bRecord,sal_Bool)2742*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::DeleteTable( SCTAB nTab, sal_Bool bRecord, sal_Bool /* bApi */ )
2743*b1cdbd2cSJim Jagielski {
2744*b1cdbd2cSJim Jagielski 	WaitObject aWait( rDocShell.GetActiveDialogParent() );
2745*b1cdbd2cSJim Jagielski 
2746*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
2747*b1cdbd2cSJim Jagielski 
2748*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
2749*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
2750*b1cdbd2cSJim Jagielski     sal_Bool bVbaEnabled = pDoc ? pDoc->IsInVBAMode() : false;
2751*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
2752*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
2753*b1cdbd2cSJim Jagielski     if ( bVbaEnabled )
2754*b1cdbd2cSJim Jagielski         bRecord = sal_False;
2755*b1cdbd2cSJim Jagielski 	sal_Bool bWasLinked = pDoc->IsLinked(nTab);
2756*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
2757*b1cdbd2cSJim Jagielski 	ScRefUndoData* pUndoData = NULL;
2758*b1cdbd2cSJim Jagielski 	if (bRecord)
2759*b1cdbd2cSJim Jagielski 	{
2760*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
2761*b1cdbd2cSJim Jagielski 		SCTAB nCount = pDoc->GetTableCount();
2762*b1cdbd2cSJim Jagielski 
2763*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );		// nur nTab mit Flags
2764*b1cdbd2cSJim Jagielski 		pUndoDoc->AddUndoTab( 0, nCount-1 );					// alle Tabs fuer Referenzen
2765*b1cdbd2cSJim Jagielski 
2766*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument(0,0,nTab, MAXCOL,MAXROW,nTab, IDF_ALL,sal_False, pUndoDoc );
2767*b1cdbd2cSJim Jagielski 		String aOldName;
2768*b1cdbd2cSJim Jagielski 		pDoc->GetName( nTab, aOldName );
2769*b1cdbd2cSJim Jagielski 		pUndoDoc->RenameTab( nTab, aOldName, sal_False );
2770*b1cdbd2cSJim Jagielski 		if (bWasLinked)
2771*b1cdbd2cSJim Jagielski 			pUndoDoc->SetLink( nTab, pDoc->GetLinkMode(nTab), pDoc->GetLinkDoc(nTab),
2772*b1cdbd2cSJim Jagielski 								pDoc->GetLinkFlt(nTab), pDoc->GetLinkOpt(nTab),
2773*b1cdbd2cSJim Jagielski 								pDoc->GetLinkTab(nTab),
2774*b1cdbd2cSJim Jagielski 								pDoc->GetLinkRefreshDelay(nTab) );
2775*b1cdbd2cSJim Jagielski 
2776*b1cdbd2cSJim Jagielski 		if ( pDoc->IsScenario(nTab) )
2777*b1cdbd2cSJim Jagielski 		{
2778*b1cdbd2cSJim Jagielski 			pUndoDoc->SetScenario( nTab, sal_True );
2779*b1cdbd2cSJim Jagielski 			String aComment;
2780*b1cdbd2cSJim Jagielski 			Color  aColor;
2781*b1cdbd2cSJim Jagielski 			sal_uInt16 nScenFlags;
2782*b1cdbd2cSJim Jagielski 			pDoc->GetScenarioData( nTab, aComment, aColor, nScenFlags );
2783*b1cdbd2cSJim Jagielski 			pUndoDoc->SetScenarioData( nTab, aComment, aColor, nScenFlags );
2784*b1cdbd2cSJim Jagielski 			sal_Bool bActive = pDoc->IsActiveScenario( nTab );
2785*b1cdbd2cSJim Jagielski 			pUndoDoc->SetActiveScenario( nTab, bActive );
2786*b1cdbd2cSJim Jagielski 		}
2787*b1cdbd2cSJim Jagielski 		pUndoDoc->SetVisible( nTab, pDoc->IsVisible( nTab ) );
2788*b1cdbd2cSJim Jagielski         pUndoDoc->SetTabBgColor( nTab, pDoc->GetTabBgColor(nTab) );
2789*b1cdbd2cSJim Jagielski         pUndoDoc->SetSheetEvents( nTab, pDoc->GetSheetEvents( nTab ) );
2790*b1cdbd2cSJim Jagielski 
2791*b1cdbd2cSJim Jagielski 		//	Drawing-Layer muss sein Undo selbst in der Hand behalten !!!
2792*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();							//	DeleteTab erzeugt ein SdrUndoDelPage
2793*b1cdbd2cSJim Jagielski 
2794*b1cdbd2cSJim Jagielski 		pUndoData = new ScRefUndoData( pDoc );
2795*b1cdbd2cSJim Jagielski 	}
2796*b1cdbd2cSJim Jagielski 
2797*b1cdbd2cSJim Jagielski     String sCodeName;
2798*b1cdbd2cSJim Jagielski     sal_Bool bHasCodeName = pDoc->GetCodeName( nTab, sCodeName );
2799*b1cdbd2cSJim Jagielski 	if (pDoc->DeleteTab( nTab, pUndoDoc ))
2800*b1cdbd2cSJim Jagielski 	{
2801*b1cdbd2cSJim Jagielski 		if (bRecord)
2802*b1cdbd2cSJim Jagielski 		{
2803*b1cdbd2cSJim Jagielski 			SvShorts theTabs;
2804*b1cdbd2cSJim Jagielski 			theTabs.push_back(nTab);
2805*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
2806*b1cdbd2cSJim Jagielski 						new ScUndoDeleteTab( &rDocShell, theTabs, pUndoDoc, pUndoData ));
2807*b1cdbd2cSJim Jagielski 		}
2808*b1cdbd2cSJim Jagielski 		//	Views updaten:
2809*b1cdbd2cSJim Jagielski         if( bVbaEnabled )
2810*b1cdbd2cSJim Jagielski         {
2811*b1cdbd2cSJim Jagielski             if( bHasCodeName )
2812*b1cdbd2cSJim Jagielski             {
2813*b1cdbd2cSJim Jagielski                 VBA_DeleteModule( rDocShell, sCodeName );
2814*b1cdbd2cSJim Jagielski             }
2815*b1cdbd2cSJim Jagielski         }
2816*b1cdbd2cSJim Jagielski 		rDocShell.Broadcast( ScTablesHint( SC_TAB_DELETED, nTab ) );
2817*b1cdbd2cSJim Jagielski 
2818*b1cdbd2cSJim Jagielski 		if (bWasLinked)
2819*b1cdbd2cSJim Jagielski 		{
2820*b1cdbd2cSJim Jagielski 			rDocShell.UpdateLinks();				// Link-Manager updaten
2821*b1cdbd2cSJim Jagielski 			SfxBindings* pBindings = rDocShell.GetViewBindings();
2822*b1cdbd2cSJim Jagielski 			if (pBindings)
2823*b1cdbd2cSJim Jagielski 				pBindings->Invalidate(SID_LINKS);
2824*b1cdbd2cSJim Jagielski 		}
2825*b1cdbd2cSJim Jagielski 
2826*b1cdbd2cSJim Jagielski 		rDocShell.PostPaintExtras();
2827*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
2828*b1cdbd2cSJim Jagielski 
2829*b1cdbd2cSJim Jagielski         SfxApplication* pSfxApp = SFX_APP();                                // Navigator
2830*b1cdbd2cSJim Jagielski         pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2831*b1cdbd2cSJim Jagielski         pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
2832*b1cdbd2cSJim Jagielski         pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
2833*b1cdbd2cSJim Jagielski 
2834*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
2835*b1cdbd2cSJim Jagielski 	}
2836*b1cdbd2cSJim Jagielski 	else
2837*b1cdbd2cSJim Jagielski 	{
2838*b1cdbd2cSJim Jagielski 		delete pUndoDoc;
2839*b1cdbd2cSJim Jagielski 		delete pUndoData;
2840*b1cdbd2cSJim Jagielski 	}
2841*b1cdbd2cSJim Jagielski 	return bSuccess;
2842*b1cdbd2cSJim Jagielski }
2843*b1cdbd2cSJim Jagielski 
SetTableVisible(SCTAB nTab,sal_Bool bVisible,sal_Bool bApi)2844*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::SetTableVisible( SCTAB nTab, sal_Bool bVisible, sal_Bool bApi )
2845*b1cdbd2cSJim Jagielski {
2846*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
2847*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
2848*b1cdbd2cSJim Jagielski 	if ( pDoc->IsVisible( nTab ) == bVisible )
2849*b1cdbd2cSJim Jagielski 		return sal_True;								// nichts zu tun - ok
2850*b1cdbd2cSJim Jagielski 
2851*b1cdbd2cSJim Jagielski 	if ( !pDoc->IsDocEditable() )
2852*b1cdbd2cSJim Jagielski 	{
2853*b1cdbd2cSJim Jagielski 		if (!bApi)
2854*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_PROTECTIONERR);
2855*b1cdbd2cSJim Jagielski 		return sal_False;
2856*b1cdbd2cSJim Jagielski 	}
2857*b1cdbd2cSJim Jagielski 
2858*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
2859*b1cdbd2cSJim Jagielski 
2860*b1cdbd2cSJim Jagielski 	if ( !bVisible && !pDoc->IsImportingXML() )     // #i57869# allow hiding in any order for loading
2861*b1cdbd2cSJim Jagielski 	{
2862*b1cdbd2cSJim Jagielski 		//	nicht alle Tabellen ausblenden
2863*b1cdbd2cSJim Jagielski 
2864*b1cdbd2cSJim Jagielski 		sal_uInt16 nVisCount = 0;
2865*b1cdbd2cSJim Jagielski 		SCTAB nCount = pDoc->GetTableCount();
2866*b1cdbd2cSJim Jagielski 		for (SCTAB i=0; i<nCount; i++)
2867*b1cdbd2cSJim Jagielski 			if (pDoc->IsVisible(i))
2868*b1cdbd2cSJim Jagielski 				++nVisCount;
2869*b1cdbd2cSJim Jagielski 
2870*b1cdbd2cSJim Jagielski 		if (nVisCount <= 1)
2871*b1cdbd2cSJim Jagielski 		{
2872*b1cdbd2cSJim Jagielski 			if (!bApi)
2873*b1cdbd2cSJim Jagielski 				rDocShell.ErrorMessage(STR_PROTECTIONERR);	//!	eigene Meldung?
2874*b1cdbd2cSJim Jagielski 			return sal_False;
2875*b1cdbd2cSJim Jagielski 		}
2876*b1cdbd2cSJim Jagielski 	}
2877*b1cdbd2cSJim Jagielski 
2878*b1cdbd2cSJim Jagielski 	pDoc->SetVisible( nTab, bVisible );
2879*b1cdbd2cSJim Jagielski 	if (bUndo)
2880*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( &rDocShell, nTab, bVisible ) );
2881*b1cdbd2cSJim Jagielski 
2882*b1cdbd2cSJim Jagielski 	//	Views updaten:
2883*b1cdbd2cSJim Jagielski 	if (!bVisible)
2884*b1cdbd2cSJim Jagielski 		rDocShell.Broadcast( ScTablesHint( SC_TAB_HIDDEN, nTab ) );
2885*b1cdbd2cSJim Jagielski 
2886*b1cdbd2cSJim Jagielski 	SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2887*b1cdbd2cSJim Jagielski 	rDocShell.PostPaint(0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_EXTRAS);
2888*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
2889*b1cdbd2cSJim Jagielski 
2890*b1cdbd2cSJim Jagielski 	return sal_True;
2891*b1cdbd2cSJim Jagielski }
2892*b1cdbd2cSJim Jagielski 
SetLayoutRTL(SCTAB nTab,sal_Bool bRTL,sal_Bool)2893*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::SetLayoutRTL( SCTAB nTab, sal_Bool bRTL, sal_Bool /* bApi */ )
2894*b1cdbd2cSJim Jagielski {
2895*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
2896*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
2897*b1cdbd2cSJim Jagielski 	if ( pDoc->IsLayoutRTL( nTab ) == bRTL )
2898*b1cdbd2cSJim Jagielski 		return sal_True;								// nothing to do - ok
2899*b1cdbd2cSJim Jagielski 
2900*b1cdbd2cSJim Jagielski 	//!	protection (sheet or document?)
2901*b1cdbd2cSJim Jagielski 
2902*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
2903*b1cdbd2cSJim Jagielski 
2904*b1cdbd2cSJim Jagielski 	pDoc->SetLayoutRTL( nTab, bRTL );
2905*b1cdbd2cSJim Jagielski 
2906*b1cdbd2cSJim Jagielski 	if (bUndo)
2907*b1cdbd2cSJim Jagielski 	{
2908*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction( new ScUndoLayoutRTL( &rDocShell, nTab, bRTL ) );
2909*b1cdbd2cSJim Jagielski 	}
2910*b1cdbd2cSJim Jagielski 
2911*b1cdbd2cSJim Jagielski 	rDocShell.PostPaint( 0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_ALL );
2912*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
2913*b1cdbd2cSJim Jagielski 
2914*b1cdbd2cSJim Jagielski 	SfxBindings* pBindings = rDocShell.GetViewBindings();
2915*b1cdbd2cSJim Jagielski 	if (pBindings)
2916*b1cdbd2cSJim Jagielski 	{
2917*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( FID_TAB_RTL );
2918*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ATTR_SIZE );
2919*b1cdbd2cSJim Jagielski 	}
2920*b1cdbd2cSJim Jagielski 
2921*b1cdbd2cSJim Jagielski 	return sal_True;
2922*b1cdbd2cSJim Jagielski }
2923*b1cdbd2cSJim Jagielski 
2924*b1cdbd2cSJim Jagielski //UNUSED2009-05 sal_Bool ScDocFunc::SetGrammar( formula::FormulaGrammar::Grammar eGrammar )
2925*b1cdbd2cSJim Jagielski //UNUSED2009-05 {
2926*b1cdbd2cSJim Jagielski //UNUSED2009-05     ScDocument* pDoc = rDocShell.GetDocument();
2927*b1cdbd2cSJim Jagielski //UNUSED2009-05
2928*b1cdbd2cSJim Jagielski //UNUSED2009-05     if ( pDoc->GetGrammar() == eGrammar )
2929*b1cdbd2cSJim Jagielski //UNUSED2009-05         return sal_True;
2930*b1cdbd2cSJim Jagielski //UNUSED2009-05
2931*b1cdbd2cSJim Jagielski //UNUSED2009-05     sal_Bool bUndo(pDoc->IsUndoEnabled());
2932*b1cdbd2cSJim Jagielski //UNUSED2009-05     ScDocShellModificator aModificator( rDocShell );
2933*b1cdbd2cSJim Jagielski //UNUSED2009-05
2934*b1cdbd2cSJim Jagielski //UNUSED2009-05     pDoc->SetGrammar( eGrammar );
2935*b1cdbd2cSJim Jagielski //UNUSED2009-05
2936*b1cdbd2cSJim Jagielski //UNUSED2009-05     if (bUndo)
2937*b1cdbd2cSJim Jagielski //UNUSED2009-05     {
2938*b1cdbd2cSJim Jagielski //UNUSED2009-05         rDocShell.GetUndoManager()->AddUndoAction( new ScUndoSetGrammar( &rDocShell, eGrammar ) );
2939*b1cdbd2cSJim Jagielski //UNUSED2009-05     }
2940*b1cdbd2cSJim Jagielski //UNUSED2009-05
2941*b1cdbd2cSJim Jagielski //UNUSED2009-05     rDocShell.PostPaint( 0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_ALL );
2942*b1cdbd2cSJim Jagielski //UNUSED2009-05
2943*b1cdbd2cSJim Jagielski //UNUSED2009-05     ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
2944*b1cdbd2cSJim Jagielski //UNUSED2009-05     if (NULL != pViewSh)
2945*b1cdbd2cSJim Jagielski //UNUSED2009-05     {
2946*b1cdbd2cSJim Jagielski //UNUSED2009-05         pViewSh->UpdateInputHandler( sal_False, sal_False );
2947*b1cdbd2cSJim Jagielski //UNUSED2009-05     }
2948*b1cdbd2cSJim Jagielski //UNUSED2009-05
2949*b1cdbd2cSJim Jagielski //UNUSED2009-05     aModificator.SetDocumentModified();
2950*b1cdbd2cSJim Jagielski //UNUSED2009-05
2951*b1cdbd2cSJim Jagielski //UNUSED2009-05     SfxBindings* pBindings = rDocShell.GetViewBindings();
2952*b1cdbd2cSJim Jagielski //UNUSED2009-05     if (pBindings)
2953*b1cdbd2cSJim Jagielski //UNUSED2009-05     {
2954*b1cdbd2cSJim Jagielski //UNUSED2009-05         // erAck: 2006-09-07T22:19+0200  commented out in CWS scr1c1
2955*b1cdbd2cSJim Jagielski //UNUSED2009-05         //pBindings->Invalidate( FID_TAB_USE_R1C1 );
2956*b1cdbd2cSJim Jagielski //UNUSED2009-05     }
2957*b1cdbd2cSJim Jagielski //UNUSED2009-05
2958*b1cdbd2cSJim Jagielski //UNUSED2009-05     return sal_True;
2959*b1cdbd2cSJim Jagielski //UNUSED2009-05 }
2960*b1cdbd2cSJim Jagielski 
RenameTable(SCTAB nTab,const String & rName,sal_Bool bRecord,sal_Bool bApi)2961*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::RenameTable( SCTAB nTab, const String& rName, sal_Bool bRecord, sal_Bool bApi )
2962*b1cdbd2cSJim Jagielski {
2963*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
2964*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
2965*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
2966*b1cdbd2cSJim Jagielski 	if ( !pDoc->IsDocEditable() )
2967*b1cdbd2cSJim Jagielski 	{
2968*b1cdbd2cSJim Jagielski 		if (!bApi)
2969*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_PROTECTIONERR);
2970*b1cdbd2cSJim Jagielski 		return sal_False;
2971*b1cdbd2cSJim Jagielski 	}
2972*b1cdbd2cSJim Jagielski 
2973*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
2974*b1cdbd2cSJim Jagielski 
2975*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
2976*b1cdbd2cSJim Jagielski 	String sOldName;
2977*b1cdbd2cSJim Jagielski 	pDoc->GetName(nTab, sOldName);
2978*b1cdbd2cSJim Jagielski 	if (pDoc->RenameTab( nTab, rName ))
2979*b1cdbd2cSJim Jagielski 	{
2980*b1cdbd2cSJim Jagielski 		if (bRecord)
2981*b1cdbd2cSJim Jagielski 		{
2982*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
2983*b1cdbd2cSJim Jagielski 							new ScUndoRenameTab( &rDocShell, nTab, sOldName, rName));
2984*b1cdbd2cSJim Jagielski 		}
2985*b1cdbd2cSJim Jagielski 		rDocShell.PostPaintExtras();
2986*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
2987*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2988*b1cdbd2cSJim Jagielski 
2989*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
2990*b1cdbd2cSJim Jagielski 	}
2991*b1cdbd2cSJim Jagielski 	return bSuccess;
2992*b1cdbd2cSJim Jagielski }
2993*b1cdbd2cSJim Jagielski 
SetTabBgColor(SCTAB nTab,const Color & rColor,bool bRecord,bool bApi)2994*b1cdbd2cSJim Jagielski bool ScDocFunc::SetTabBgColor( SCTAB nTab, const Color& rColor, bool bRecord, bool bApi )
2995*b1cdbd2cSJim Jagielski {
2996*b1cdbd2cSJim Jagielski 
2997*b1cdbd2cSJim Jagielski     ScDocument* pDoc = rDocShell.GetDocument();
2998*b1cdbd2cSJim Jagielski     if (bRecord && !pDoc->IsUndoEnabled())
2999*b1cdbd2cSJim Jagielski         bRecord = false;
3000*b1cdbd2cSJim Jagielski     if ( !pDoc->IsDocEditable() || pDoc->IsTabProtected(nTab) )
3001*b1cdbd2cSJim Jagielski     {
3002*b1cdbd2cSJim Jagielski         if (!bApi)
3003*b1cdbd2cSJim Jagielski             rDocShell.ErrorMessage(STR_PROTECTIONERR); //TODO Check to see what this string is...
3004*b1cdbd2cSJim Jagielski         return false;
3005*b1cdbd2cSJim Jagielski     }
3006*b1cdbd2cSJim Jagielski 
3007*b1cdbd2cSJim Jagielski     Color aOldTabBgColor;
3008*b1cdbd2cSJim Jagielski     aOldTabBgColor = pDoc->GetTabBgColor(nTab);
3009*b1cdbd2cSJim Jagielski 
3010*b1cdbd2cSJim Jagielski     bool bSuccess = false;
3011*b1cdbd2cSJim Jagielski     pDoc->SetTabBgColor(nTab, rColor);
3012*b1cdbd2cSJim Jagielski     if ( pDoc->GetTabBgColor(nTab) == rColor)
3013*b1cdbd2cSJim Jagielski         bSuccess = true;
3014*b1cdbd2cSJim Jagielski     if (bSuccess)
3015*b1cdbd2cSJim Jagielski     {
3016*b1cdbd2cSJim Jagielski         if (bRecord)
3017*b1cdbd2cSJim Jagielski         {
3018*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->AddUndoAction(
3019*b1cdbd2cSJim Jagielski                 new ScUndoTabColor( &rDocShell, nTab, aOldTabBgColor, rColor));
3020*b1cdbd2cSJim Jagielski         }
3021*b1cdbd2cSJim Jagielski         rDocShell.PostPaintExtras();
3022*b1cdbd2cSJim Jagielski         ScDocShellModificator aModificator( rDocShell );
3023*b1cdbd2cSJim Jagielski         aModificator.SetDocumentModified();
3024*b1cdbd2cSJim Jagielski         SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
3025*b1cdbd2cSJim Jagielski 
3026*b1cdbd2cSJim Jagielski         bSuccess = true;
3027*b1cdbd2cSJim Jagielski     }
3028*b1cdbd2cSJim Jagielski     return bSuccess;
3029*b1cdbd2cSJim Jagielski }
3030*b1cdbd2cSJim Jagielski 
SetTabBgColor(ScUndoTabColorInfo::List & rUndoTabColorList,bool bRecord,bool bApi)3031*b1cdbd2cSJim Jagielski bool ScDocFunc::SetTabBgColor(
3032*b1cdbd2cSJim Jagielski     ScUndoTabColorInfo::List& rUndoTabColorList, bool bRecord, bool bApi )
3033*b1cdbd2cSJim Jagielski {
3034*b1cdbd2cSJim Jagielski     ScDocument* pDoc = rDocShell.GetDocument();
3035*b1cdbd2cSJim Jagielski     if (bRecord && !pDoc->IsUndoEnabled())
3036*b1cdbd2cSJim Jagielski         bRecord = false;
3037*b1cdbd2cSJim Jagielski 
3038*b1cdbd2cSJim Jagielski     if ( !pDoc->IsDocEditable() )
3039*b1cdbd2cSJim Jagielski     {
3040*b1cdbd2cSJim Jagielski         if (!bApi)
3041*b1cdbd2cSJim Jagielski             rDocShell.ErrorMessage(STR_PROTECTIONERR); //TODO Get a better String Error...
3042*b1cdbd2cSJim Jagielski         return false;
3043*b1cdbd2cSJim Jagielski     }
3044*b1cdbd2cSJim Jagielski 
3045*b1cdbd2cSJim Jagielski     sal_uInt16 nTab;
3046*b1cdbd2cSJim Jagielski     Color aNewTabBgColor;
3047*b1cdbd2cSJim Jagielski     bool bSuccess = true;
3048*b1cdbd2cSJim Jagielski     size_t nTabProtectCount = 0;
3049*b1cdbd2cSJim Jagielski     size_t nTabListCount = rUndoTabColorList.size();
3050*b1cdbd2cSJim Jagielski     for ( size_t i = 0; i < nTabListCount; ++i )
3051*b1cdbd2cSJim Jagielski     {
3052*b1cdbd2cSJim Jagielski         ScUndoTabColorInfo& rInfo = rUndoTabColorList[i];
3053*b1cdbd2cSJim Jagielski         nTab = rInfo.mnTabId;
3054*b1cdbd2cSJim Jagielski         if ( !pDoc->IsTabProtected(nTab) )
3055*b1cdbd2cSJim Jagielski         {
3056*b1cdbd2cSJim Jagielski             aNewTabBgColor = rInfo.maNewTabBgColor;
3057*b1cdbd2cSJim Jagielski             rInfo.maOldTabBgColor = pDoc->GetTabBgColor(nTab);
3058*b1cdbd2cSJim Jagielski             pDoc->SetTabBgColor(nTab, aNewTabBgColor);
3059*b1cdbd2cSJim Jagielski             if ( pDoc->GetTabBgColor(nTab) != aNewTabBgColor)
3060*b1cdbd2cSJim Jagielski             {
3061*b1cdbd2cSJim Jagielski                 bSuccess = false;
3062*b1cdbd2cSJim Jagielski                 break;
3063*b1cdbd2cSJim Jagielski             }
3064*b1cdbd2cSJim Jagielski         }
3065*b1cdbd2cSJim Jagielski         else
3066*b1cdbd2cSJim Jagielski         {
3067*b1cdbd2cSJim Jagielski             nTabProtectCount++;
3068*b1cdbd2cSJim Jagielski         }
3069*b1cdbd2cSJim Jagielski     }
3070*b1cdbd2cSJim Jagielski 
3071*b1cdbd2cSJim Jagielski     if ( nTabProtectCount == nTabListCount )
3072*b1cdbd2cSJim Jagielski     {
3073*b1cdbd2cSJim Jagielski         if (!bApi)
3074*b1cdbd2cSJim Jagielski             rDocShell.ErrorMessage(STR_PROTECTIONERR); //TODO Get a better String Error...
3075*b1cdbd2cSJim Jagielski         return false;
3076*b1cdbd2cSJim Jagielski     }
3077*b1cdbd2cSJim Jagielski 
3078*b1cdbd2cSJim Jagielski     if (bSuccess)
3079*b1cdbd2cSJim Jagielski     {
3080*b1cdbd2cSJim Jagielski         if (bRecord)
3081*b1cdbd2cSJim Jagielski         {
3082*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->AddUndoAction(
3083*b1cdbd2cSJim Jagielski                 new ScUndoTabColor( &rDocShell, rUndoTabColorList));
3084*b1cdbd2cSJim Jagielski         }
3085*b1cdbd2cSJim Jagielski         rDocShell.PostPaintExtras();
3086*b1cdbd2cSJim Jagielski         ScDocShellModificator aModificator( rDocShell );
3087*b1cdbd2cSJim Jagielski         aModificator.SetDocumentModified();
3088*b1cdbd2cSJim Jagielski     }
3089*b1cdbd2cSJim Jagielski     return bSuccess;
3090*b1cdbd2cSJim Jagielski }
3091*b1cdbd2cSJim Jagielski 
3092*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
3093*b1cdbd2cSJim Jagielski 
3094*b1cdbd2cSJim Jagielski //!	SetWidthOrHeight - noch doppelt zu ViewFunc !!!!!!
3095*b1cdbd2cSJim Jagielski //!	Probleme:
3096*b1cdbd2cSJim Jagielski //!	- Optimale Hoehe fuer Edit-Zellen ist unterschiedlich zwischen Drucker und Bildschirm
3097*b1cdbd2cSJim Jagielski //!	- Optimale Breite braucht Selektion, um evtl. nur selektierte Zellen zu beruecksichtigen
3098*b1cdbd2cSJim Jagielski 
lcl_GetOptimalColWidth(ScDocShell & rDocShell,SCCOL nCol,SCTAB nTab,sal_Bool bFormula)3099*b1cdbd2cSJim Jagielski sal_uInt16 lcl_GetOptimalColWidth( ScDocShell& rDocShell, SCCOL nCol, SCTAB nTab, sal_Bool bFormula )
3100*b1cdbd2cSJim Jagielski {
3101*b1cdbd2cSJim Jagielski 	sal_uInt16 nTwips = 0;
3102*b1cdbd2cSJim Jagielski 
3103*b1cdbd2cSJim Jagielski 	ScSizeDeviceProvider aProv(&rDocShell);
3104*b1cdbd2cSJim Jagielski 	OutputDevice* pDev = aProv.GetDevice();			// has pixel MapMode
3105*b1cdbd2cSJim Jagielski 	double nPPTX = aProv.GetPPTX();
3106*b1cdbd2cSJim Jagielski 	double nPPTY = aProv.GetPPTY();
3107*b1cdbd2cSJim Jagielski 
3108*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3109*b1cdbd2cSJim Jagielski 	Fraction aOne(1,1);
3110*b1cdbd2cSJim Jagielski 	nTwips = pDoc->GetOptimalColWidth( nCol, nTab, pDev, nPPTX, nPPTY, aOne, aOne,
3111*b1cdbd2cSJim Jagielski 										bFormula, NULL );
3112*b1cdbd2cSJim Jagielski 
3113*b1cdbd2cSJim Jagielski 	return nTwips;
3114*b1cdbd2cSJim Jagielski }
3115*b1cdbd2cSJim Jagielski 
SetWidthOrHeight(sal_Bool bWidth,SCCOLROW nRangeCnt,SCCOLROW * pRanges,SCTAB nTab,ScSizeMode eMode,sal_uInt16 nSizeTwips,sal_Bool bRecord,sal_Bool bApi)3116*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::SetWidthOrHeight( sal_Bool bWidth, SCCOLROW nRangeCnt, SCCOLROW* pRanges, SCTAB nTab,
3117*b1cdbd2cSJim Jagielski 										ScSizeMode eMode, sal_uInt16 nSizeTwips,
3118*b1cdbd2cSJim Jagielski 										sal_Bool bRecord, sal_Bool bApi )
3119*b1cdbd2cSJim Jagielski {
3120*b1cdbd2cSJim Jagielski     ScDocShellModificator aModificator( rDocShell );
3121*b1cdbd2cSJim Jagielski 
3122*b1cdbd2cSJim Jagielski 	if (!nRangeCnt)
3123*b1cdbd2cSJim Jagielski 		return sal_True;
3124*b1cdbd2cSJim Jagielski 
3125*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3126*b1cdbd2cSJim Jagielski 	if ( bRecord && !pDoc->IsUndoEnabled() )
3127*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
3128*b1cdbd2cSJim Jagielski 
3129*b1cdbd2cSJim Jagielski     // import into read-only document is possible
3130*b1cdbd2cSJim Jagielski     if ( !pDoc->IsChangeReadOnlyEnabled() && !rDocShell.IsEditable() )
3131*b1cdbd2cSJim Jagielski 	{
3132*b1cdbd2cSJim Jagielski 		if (!bApi)
3133*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_PROTECTIONERR);		//! eigene Meldung?
3134*b1cdbd2cSJim Jagielski 		return sal_False;
3135*b1cdbd2cSJim Jagielski 	}
3136*b1cdbd2cSJim Jagielski 
3137*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
3138*b1cdbd2cSJim Jagielski 	SCCOLROW nStart = pRanges[0];
3139*b1cdbd2cSJim Jagielski 	SCCOLROW nEnd = pRanges[2*nRangeCnt-1];
3140*b1cdbd2cSJim Jagielski 
3141*b1cdbd2cSJim Jagielski 	sal_Bool bFormula = sal_False;
3142*b1cdbd2cSJim Jagielski 	if ( eMode == SC_SIZE_OPTIMAL )
3143*b1cdbd2cSJim Jagielski 	{
3144*b1cdbd2cSJim Jagielski 		//!	Option "Formeln anzeigen" - woher nehmen?
3145*b1cdbd2cSJim Jagielski 	}
3146*b1cdbd2cSJim Jagielski 
3147*b1cdbd2cSJim Jagielski 	ScDocument* 	pUndoDoc = NULL;
3148*b1cdbd2cSJim Jagielski 	ScOutlineTable* pUndoTab = NULL;
3149*b1cdbd2cSJim Jagielski 	SCCOLROW*		pUndoRanges = NULL;
3150*b1cdbd2cSJim Jagielski 
3151*b1cdbd2cSJim Jagielski 	if ( bRecord )
3152*b1cdbd2cSJim Jagielski 	{
3153*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();							// Drawing Updates
3154*b1cdbd2cSJim Jagielski 
3155*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
3156*b1cdbd2cSJim Jagielski 		if (bWidth)
3157*b1cdbd2cSJim Jagielski 		{
3158*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_False );
3159*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab, static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, sal_False, pUndoDoc );
3160*b1cdbd2cSJim Jagielski 		}
3161*b1cdbd2cSJim Jagielski 		else
3162*b1cdbd2cSJim Jagielski 		{
3163*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_False, sal_True );
3164*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument( 0, static_cast<SCROW>(nStart), nTab, MAXCOL, static_cast<SCROW>(nEnd), nTab, IDF_NONE, sal_False, pUndoDoc );
3165*b1cdbd2cSJim Jagielski 		}
3166*b1cdbd2cSJim Jagielski 
3167*b1cdbd2cSJim Jagielski 		pUndoRanges = new SCCOLROW[ 2*nRangeCnt ];
3168*b1cdbd2cSJim Jagielski 		memmove( pUndoRanges, pRanges, 2*nRangeCnt*sizeof(SCCOLROW) );
3169*b1cdbd2cSJim Jagielski 
3170*b1cdbd2cSJim Jagielski 		ScOutlineTable* pTable = pDoc->GetOutlineTable( nTab );
3171*b1cdbd2cSJim Jagielski 		if (pTable)
3172*b1cdbd2cSJim Jagielski 			pUndoTab = new ScOutlineTable( *pTable );
3173*b1cdbd2cSJim Jagielski 	}
3174*b1cdbd2cSJim Jagielski 
3175*b1cdbd2cSJim Jagielski 	sal_Bool bShow = nSizeTwips > 0 || eMode != SC_SIZE_DIRECT;
3176*b1cdbd2cSJim Jagielski 	sal_Bool bOutline = sal_False;
3177*b1cdbd2cSJim Jagielski 
3178*b1cdbd2cSJim Jagielski 	pDoc->IncSizeRecalcLevel( nTab );		// nicht fuer jede Spalte einzeln
3179*b1cdbd2cSJim Jagielski 	for (SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
3180*b1cdbd2cSJim Jagielski 	{
3181*b1cdbd2cSJim Jagielski 		SCCOLROW nStartNo = *(pRanges++);
3182*b1cdbd2cSJim Jagielski 		SCCOLROW nEndNo = *(pRanges++);
3183*b1cdbd2cSJim Jagielski 
3184*b1cdbd2cSJim Jagielski 		if ( !bWidth )						// Hoehen immer blockweise
3185*b1cdbd2cSJim Jagielski 		{
3186*b1cdbd2cSJim Jagielski 			if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT )
3187*b1cdbd2cSJim Jagielski 			{
3188*b1cdbd2cSJim Jagielski 				sal_Bool bAll = ( eMode==SC_SIZE_OPTIMAL );
3189*b1cdbd2cSJim Jagielski 				if (!bAll)
3190*b1cdbd2cSJim Jagielski 				{
3191*b1cdbd2cSJim Jagielski 					//	fuer alle eingeblendeten CR_MANUALSIZE loeschen,
3192*b1cdbd2cSJim Jagielski 					//	dann SetOptimalHeight mit bShrink = FALSE
3193*b1cdbd2cSJim Jagielski 					for (SCROW nRow=nStartNo; nRow<=nEndNo; nRow++)
3194*b1cdbd2cSJim Jagielski 					{
3195*b1cdbd2cSJim Jagielski 						sal_uInt8 nOld = pDoc->GetRowFlags(nRow,nTab);
3196*b1cdbd2cSJim Jagielski 						SCROW nLastRow = -1;
3197*b1cdbd2cSJim Jagielski 						bool bHidden = pDoc->RowHidden(nRow, nTab, nLastRow);
3198*b1cdbd2cSJim Jagielski 						if ( !bHidden && ( nOld & CR_MANUALSIZE ) )
3199*b1cdbd2cSJim Jagielski 							pDoc->SetRowFlags( nRow, nTab, nOld & ~CR_MANUALSIZE );
3200*b1cdbd2cSJim Jagielski 					}
3201*b1cdbd2cSJim Jagielski 				}
3202*b1cdbd2cSJim Jagielski 
3203*b1cdbd2cSJim Jagielski 				ScSizeDeviceProvider aProv( &rDocShell );
3204*b1cdbd2cSJim Jagielski 				Fraction aOne(1,1);
3205*b1cdbd2cSJim Jagielski 				pDoc->SetOptimalHeight( nStartNo, nEndNo, nTab, 0, aProv.GetDevice(),
3206*b1cdbd2cSJim Jagielski 										aProv.GetPPTX(), aProv.GetPPTY(), aOne, aOne, bAll );
3207*b1cdbd2cSJim Jagielski 
3208*b1cdbd2cSJim Jagielski 				if (bAll)
3209*b1cdbd2cSJim Jagielski 					pDoc->ShowRows( nStartNo, nEndNo, nTab, sal_True );
3210*b1cdbd2cSJim Jagielski 
3211*b1cdbd2cSJim Jagielski 				//	Manual-Flag wird bei bAll=sal_True schon in SetOptimalHeight gesetzt
3212*b1cdbd2cSJim Jagielski 				//	(an bei Extra-Height, sonst aus).
3213*b1cdbd2cSJim Jagielski 			}
3214*b1cdbd2cSJim Jagielski 			else if ( eMode==SC_SIZE_DIRECT || eMode==SC_SIZE_ORIGINAL )
3215*b1cdbd2cSJim Jagielski 			{
3216*b1cdbd2cSJim Jagielski 				if (nSizeTwips)
3217*b1cdbd2cSJim Jagielski 				{
3218*b1cdbd2cSJim Jagielski 					pDoc->SetRowHeightRange( nStartNo, nEndNo, nTab, nSizeTwips );
3219*b1cdbd2cSJim Jagielski 					pDoc->SetManualHeight( nStartNo, nEndNo, nTab, sal_True );			// height was set manually
3220*b1cdbd2cSJim Jagielski 				}
3221*b1cdbd2cSJim Jagielski 				if ( eMode != SC_SIZE_ORIGINAL )
3222*b1cdbd2cSJim Jagielski 					pDoc->ShowRows( nStartNo, nEndNo, nTab, nSizeTwips != 0 );
3223*b1cdbd2cSJim Jagielski 			}
3224*b1cdbd2cSJim Jagielski 			else if ( eMode==SC_SIZE_SHOW )
3225*b1cdbd2cSJim Jagielski 			{
3226*b1cdbd2cSJim Jagielski 				pDoc->ShowRows( nStartNo, nEndNo, nTab, sal_True );
3227*b1cdbd2cSJim Jagielski 			}
3228*b1cdbd2cSJim Jagielski 		}
3229*b1cdbd2cSJim Jagielski 		else								// Spaltenbreiten
3230*b1cdbd2cSJim Jagielski 		{
3231*b1cdbd2cSJim Jagielski 			for (SCCOL nCol=static_cast<SCCOL>(nStartNo); nCol<=static_cast<SCCOL>(nEndNo); nCol++)
3232*b1cdbd2cSJim Jagielski 			{
3233*b1cdbd2cSJim Jagielski                 SCCOL nLastCol = -1;
3234*b1cdbd2cSJim Jagielski                 if ( eMode != SC_SIZE_VISOPT || !pDoc->ColHidden(nCol, nTab, nLastCol) )
3235*b1cdbd2cSJim Jagielski 				{
3236*b1cdbd2cSJim Jagielski 					sal_uInt16 nThisSize = nSizeTwips;
3237*b1cdbd2cSJim Jagielski 
3238*b1cdbd2cSJim Jagielski 					if ( eMode==SC_SIZE_OPTIMAL || eMode==SC_SIZE_VISOPT )
3239*b1cdbd2cSJim Jagielski 						nThisSize = nSizeTwips +
3240*b1cdbd2cSJim Jagielski 									lcl_GetOptimalColWidth( rDocShell, nCol, nTab, bFormula );
3241*b1cdbd2cSJim Jagielski 					if ( nThisSize )
3242*b1cdbd2cSJim Jagielski 						pDoc->SetColWidth( nCol, nTab, nThisSize );
3243*b1cdbd2cSJim Jagielski 
3244*b1cdbd2cSJim Jagielski 					if ( eMode != SC_SIZE_ORIGINAL )
3245*b1cdbd2cSJim Jagielski 						pDoc->ShowCol( nCol, nTab, bShow );
3246*b1cdbd2cSJim Jagielski 				}
3247*b1cdbd2cSJim Jagielski 			}
3248*b1cdbd2cSJim Jagielski 		}
3249*b1cdbd2cSJim Jagielski 
3250*b1cdbd2cSJim Jagielski 							//	adjust outlines
3251*b1cdbd2cSJim Jagielski 
3252*b1cdbd2cSJim Jagielski 		if ( eMode != SC_SIZE_ORIGINAL )
3253*b1cdbd2cSJim Jagielski 		{
3254*b1cdbd2cSJim Jagielski 			if (bWidth)
3255*b1cdbd2cSJim Jagielski                 bOutline = bOutline || pDoc->UpdateOutlineCol(
3256*b1cdbd2cSJim Jagielski                         static_cast<SCCOL>(nStartNo),
3257*b1cdbd2cSJim Jagielski                         static_cast<SCCOL>(nEndNo), nTab, bShow );
3258*b1cdbd2cSJim Jagielski 			else
3259*b1cdbd2cSJim Jagielski                 bOutline = bOutline || pDoc->UpdateOutlineRow(
3260*b1cdbd2cSJim Jagielski                         static_cast<SCROW>(nStartNo),
3261*b1cdbd2cSJim Jagielski                         static_cast<SCROW>(nEndNo), nTab, bShow );
3262*b1cdbd2cSJim Jagielski 		}
3263*b1cdbd2cSJim Jagielski 	}
3264*b1cdbd2cSJim Jagielski 	pDoc->DecSizeRecalcLevel( nTab );		// nicht fuer jede Spalte einzeln
3265*b1cdbd2cSJim Jagielski 
3266*b1cdbd2cSJim Jagielski 	if (!bOutline)
3267*b1cdbd2cSJim Jagielski 		DELETEZ(pUndoTab);
3268*b1cdbd2cSJim Jagielski 
3269*b1cdbd2cSJim Jagielski 	if (bRecord)
3270*b1cdbd2cSJim Jagielski 	{
3271*b1cdbd2cSJim Jagielski 		ScMarkData aMark;
3272*b1cdbd2cSJim Jagielski 		aMark.SelectOneTable( nTab );
3273*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
3274*b1cdbd2cSJim Jagielski 			new ScUndoWidthOrHeight( &rDocShell, aMark,
3275*b1cdbd2cSJim Jagielski 									 nStart, nTab, nEnd, nTab,
3276*b1cdbd2cSJim Jagielski 									 pUndoDoc, nRangeCnt, pUndoRanges,
3277*b1cdbd2cSJim Jagielski 									 pUndoTab, eMode, nSizeTwips, bWidth ) );
3278*b1cdbd2cSJim Jagielski 	}
3279*b1cdbd2cSJim Jagielski 
3280*b1cdbd2cSJim Jagielski 	pDoc->UpdatePageBreaks( nTab );
3281*b1cdbd2cSJim Jagielski 
3282*b1cdbd2cSJim Jagielski 	rDocShell.PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_ALL);
3283*b1cdbd2cSJim Jagielski     aModificator.SetDocumentModified();
3284*b1cdbd2cSJim Jagielski 
3285*b1cdbd2cSJim Jagielski 	return bSuccess;
3286*b1cdbd2cSJim Jagielski }
3287*b1cdbd2cSJim Jagielski 
3288*b1cdbd2cSJim Jagielski 
InsertPageBreak(sal_Bool bColumn,const ScAddress & rPos,sal_Bool bRecord,sal_Bool bSetModified,sal_Bool)3289*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::InsertPageBreak( sal_Bool bColumn, const ScAddress& rPos,
3290*b1cdbd2cSJim Jagielski                                 sal_Bool bRecord, sal_Bool bSetModified, sal_Bool /* bApi */ )
3291*b1cdbd2cSJim Jagielski {
3292*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3293*b1cdbd2cSJim Jagielski 
3294*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3295*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
3296*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
3297*b1cdbd2cSJim Jagielski 	SCTAB nTab = rPos.Tab();
3298*b1cdbd2cSJim Jagielski 	SfxBindings* pBindings = rDocShell.GetViewBindings();
3299*b1cdbd2cSJim Jagielski 
3300*b1cdbd2cSJim Jagielski     SCCOLROW nPos = bColumn ? static_cast<SCCOLROW>(rPos.Col()) :
3301*b1cdbd2cSJim Jagielski         static_cast<SCCOLROW>(rPos.Row());
3302*b1cdbd2cSJim Jagielski 	if (nPos == 0)
3303*b1cdbd2cSJim Jagielski 		return sal_False;					// erste Spalte / Zeile
3304*b1cdbd2cSJim Jagielski 
3305*b1cdbd2cSJim Jagielski     ScBreakType nBreak = bColumn ?
3306*b1cdbd2cSJim Jagielski         pDoc->HasColBreak(static_cast<SCCOL>(nPos), nTab) :
3307*b1cdbd2cSJim Jagielski         pDoc->HasRowBreak(static_cast<SCROW>(nPos), nTab);
3308*b1cdbd2cSJim Jagielski     if (nBreak & BREAK_MANUAL)
3309*b1cdbd2cSJim Jagielski         return true;
3310*b1cdbd2cSJim Jagielski 
3311*b1cdbd2cSJim Jagielski 	if (bRecord)
3312*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
3313*b1cdbd2cSJim Jagielski 			new ScUndoPageBreak( &rDocShell, rPos.Col(), rPos.Row(), nTab, bColumn, sal_True ) );
3314*b1cdbd2cSJim Jagielski 
3315*b1cdbd2cSJim Jagielski     if (bColumn)
3316*b1cdbd2cSJim Jagielski         pDoc->SetColBreak(static_cast<SCCOL>(nPos), nTab, false, true);
3317*b1cdbd2cSJim Jagielski     else
3318*b1cdbd2cSJim Jagielski         pDoc->SetRowBreak(static_cast<SCROW>(nPos), nTab, false, true);
3319*b1cdbd2cSJim Jagielski 
3320*b1cdbd2cSJim Jagielski     pDoc->InvalidatePageBreaks(nTab);
3321*b1cdbd2cSJim Jagielski 	pDoc->UpdatePageBreaks( nTab );
3322*b1cdbd2cSJim Jagielski 
3323*b1cdbd2cSJim Jagielski     if (pDoc->IsStreamValid(nTab))
3324*b1cdbd2cSJim Jagielski         pDoc->SetStreamValid(nTab, sal_False);
3325*b1cdbd2cSJim Jagielski 
3326*b1cdbd2cSJim Jagielski 	if (bColumn)
3327*b1cdbd2cSJim Jagielski 	{
3328*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( static_cast<SCCOL>(nPos)-1, 0, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID );
3329*b1cdbd2cSJim Jagielski 		if (pBindings)
3330*b1cdbd2cSJim Jagielski 		{
3331*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_INS_COLBRK );
3332*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_DEL_COLBRK );
3333*b1cdbd2cSJim Jagielski 		}
3334*b1cdbd2cSJim Jagielski 	}
3335*b1cdbd2cSJim Jagielski 	else
3336*b1cdbd2cSJim Jagielski 	{
3337*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( 0, static_cast<SCROW>(nPos)-1, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID );
3338*b1cdbd2cSJim Jagielski 		if (pBindings)
3339*b1cdbd2cSJim Jagielski 		{
3340*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_INS_ROWBRK );
3341*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_DEL_ROWBRK );
3342*b1cdbd2cSJim Jagielski 		}
3343*b1cdbd2cSJim Jagielski 	}
3344*b1cdbd2cSJim Jagielski 	if (pBindings)
3345*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( FID_DEL_MANUALBREAKS );
3346*b1cdbd2cSJim Jagielski 
3347*b1cdbd2cSJim Jagielski 	if (bSetModified)
3348*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
3349*b1cdbd2cSJim Jagielski 
3350*b1cdbd2cSJim Jagielski 	return sal_True;
3351*b1cdbd2cSJim Jagielski }
3352*b1cdbd2cSJim Jagielski 
RemovePageBreak(sal_Bool bColumn,const ScAddress & rPos,sal_Bool bRecord,sal_Bool bSetModified,sal_Bool)3353*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::RemovePageBreak( sal_Bool bColumn, const ScAddress& rPos,
3354*b1cdbd2cSJim Jagielski                                 sal_Bool bRecord, sal_Bool bSetModified, sal_Bool /* bApi */ )
3355*b1cdbd2cSJim Jagielski {
3356*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3357*b1cdbd2cSJim Jagielski 
3358*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3359*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
3360*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
3361*b1cdbd2cSJim Jagielski 	SCTAB nTab = rPos.Tab();
3362*b1cdbd2cSJim Jagielski 	SfxBindings* pBindings = rDocShell.GetViewBindings();
3363*b1cdbd2cSJim Jagielski 
3364*b1cdbd2cSJim Jagielski     SCCOLROW nPos = bColumn ? static_cast<SCCOLROW>(rPos.Col()) :
3365*b1cdbd2cSJim Jagielski         static_cast<SCCOLROW>(rPos.Row());
3366*b1cdbd2cSJim Jagielski 
3367*b1cdbd2cSJim Jagielski     ScBreakType nBreak;
3368*b1cdbd2cSJim Jagielski     if (bColumn)
3369*b1cdbd2cSJim Jagielski         nBreak = pDoc->HasColBreak(static_cast<SCCOL>(nPos), nTab);
3370*b1cdbd2cSJim Jagielski     else
3371*b1cdbd2cSJim Jagielski         nBreak = pDoc->HasRowBreak(static_cast<SCROW>(nPos), nTab);
3372*b1cdbd2cSJim Jagielski     if ((nBreak & BREAK_MANUAL) == 0)
3373*b1cdbd2cSJim Jagielski         // There is no manual break.
3374*b1cdbd2cSJim Jagielski         return false;
3375*b1cdbd2cSJim Jagielski 
3376*b1cdbd2cSJim Jagielski 	if (bRecord)
3377*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
3378*b1cdbd2cSJim Jagielski 			new ScUndoPageBreak( &rDocShell, rPos.Col(), rPos.Row(), nTab, bColumn, sal_False ) );
3379*b1cdbd2cSJim Jagielski 
3380*b1cdbd2cSJim Jagielski     if (bColumn)
3381*b1cdbd2cSJim Jagielski         pDoc->RemoveColBreak(static_cast<SCCOL>(nPos), nTab, false, true);
3382*b1cdbd2cSJim Jagielski     else
3383*b1cdbd2cSJim Jagielski         pDoc->RemoveRowBreak(static_cast<SCROW>(nPos), nTab, false, true);
3384*b1cdbd2cSJim Jagielski 
3385*b1cdbd2cSJim Jagielski 	pDoc->UpdatePageBreaks( nTab );
3386*b1cdbd2cSJim Jagielski 
3387*b1cdbd2cSJim Jagielski     if (pDoc->IsStreamValid(nTab))
3388*b1cdbd2cSJim Jagielski         pDoc->SetStreamValid(nTab, sal_False);
3389*b1cdbd2cSJim Jagielski 
3390*b1cdbd2cSJim Jagielski 	if (bColumn)
3391*b1cdbd2cSJim Jagielski 	{
3392*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( static_cast<SCCOL>(nPos)-1, 0, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID );
3393*b1cdbd2cSJim Jagielski 		if (pBindings)
3394*b1cdbd2cSJim Jagielski 		{
3395*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_INS_COLBRK );
3396*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_DEL_COLBRK );
3397*b1cdbd2cSJim Jagielski 		}
3398*b1cdbd2cSJim Jagielski 	}
3399*b1cdbd2cSJim Jagielski 	else
3400*b1cdbd2cSJim Jagielski 	{
3401*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( 0, nPos-1, nTab, MAXCOL, MAXROW, nTab, PAINT_GRID );
3402*b1cdbd2cSJim Jagielski 		if (pBindings)
3403*b1cdbd2cSJim Jagielski 		{
3404*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_INS_ROWBRK );
3405*b1cdbd2cSJim Jagielski 			pBindings->Invalidate( FID_DEL_ROWBRK );
3406*b1cdbd2cSJim Jagielski 		}
3407*b1cdbd2cSJim Jagielski 	}
3408*b1cdbd2cSJim Jagielski 	if (pBindings)
3409*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( FID_DEL_MANUALBREAKS );
3410*b1cdbd2cSJim Jagielski 
3411*b1cdbd2cSJim Jagielski 	if (bSetModified)
3412*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
3413*b1cdbd2cSJim Jagielski 
3414*b1cdbd2cSJim Jagielski 	return sal_True;
3415*b1cdbd2cSJim Jagielski }
3416*b1cdbd2cSJim Jagielski 
3417*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
3418*b1cdbd2cSJim Jagielski 
ProtectSheet(SCTAB nTab,const ScTableProtection & rProtect)3419*b1cdbd2cSJim Jagielski void ScDocFunc::ProtectSheet( SCTAB nTab, const ScTableProtection& rProtect )
3420*b1cdbd2cSJim Jagielski {
3421*b1cdbd2cSJim Jagielski     ScDocument* pDoc = rDocShell.GetDocument();
3422*b1cdbd2cSJim Jagielski 
3423*b1cdbd2cSJim Jagielski     pDoc->SetTabProtection(nTab, &rProtect);
3424*b1cdbd2cSJim Jagielski     if (pDoc->IsUndoEnabled())
3425*b1cdbd2cSJim Jagielski     {
3426*b1cdbd2cSJim Jagielski         ScTableProtection* pProtect = pDoc->GetTabProtection(nTab);
3427*b1cdbd2cSJim Jagielski         DBG_ASSERT(pProtect, "ScDocFunc::Unprotect: ScTableProtection pointer is NULL!");
3428*b1cdbd2cSJim Jagielski         if (pProtect)
3429*b1cdbd2cSJim Jagielski         {
3430*b1cdbd2cSJim Jagielski             ::std::auto_ptr<ScTableProtection> p(new ScTableProtection(*pProtect));
3431*b1cdbd2cSJim Jagielski             p->setProtected(true); // just in case ...
3432*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->AddUndoAction(
3433*b1cdbd2cSJim Jagielski                 new ScUndoTabProtect(&rDocShell, nTab, p) );
3434*b1cdbd2cSJim Jagielski 
3435*b1cdbd2cSJim Jagielski             // ownership of auto_ptr now transferred to ScUndoTabProtect.
3436*b1cdbd2cSJim Jagielski         }
3437*b1cdbd2cSJim Jagielski     }
3438*b1cdbd2cSJim Jagielski 
3439*b1cdbd2cSJim Jagielski     rDocShell.PostPaintGridAll();
3440*b1cdbd2cSJim Jagielski     ScDocShellModificator aModificator(rDocShell);
3441*b1cdbd2cSJim Jagielski     aModificator.SetDocumentModified();
3442*b1cdbd2cSJim Jagielski }
3443*b1cdbd2cSJim Jagielski 
Protect(SCTAB nTab,const String & rPassword,sal_Bool)3444*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::Protect( SCTAB nTab, const String& rPassword, sal_Bool /*bApi*/ )
3445*b1cdbd2cSJim Jagielski {
3446*b1cdbd2cSJim Jagielski     ScDocument* pDoc = rDocShell.GetDocument();
3447*b1cdbd2cSJim Jagielski     if (nTab == TABLEID_DOC)
3448*b1cdbd2cSJim Jagielski     {
3449*b1cdbd2cSJim Jagielski         // document protection
3450*b1cdbd2cSJim Jagielski         ScDocProtection aProtection;
3451*b1cdbd2cSJim Jagielski         aProtection.setProtected(true);
3452*b1cdbd2cSJim Jagielski         aProtection.setPassword(rPassword);
3453*b1cdbd2cSJim Jagielski         pDoc->SetDocProtection(&aProtection);
3454*b1cdbd2cSJim Jagielski         if (pDoc->IsUndoEnabled())
3455*b1cdbd2cSJim Jagielski         {
3456*b1cdbd2cSJim Jagielski             ScDocProtection* pProtect = pDoc->GetDocProtection();
3457*b1cdbd2cSJim Jagielski             DBG_ASSERT(pProtect, "ScDocFunc::Unprotect: ScDocProtection pointer is NULL!");
3458*b1cdbd2cSJim Jagielski             if (pProtect)
3459*b1cdbd2cSJim Jagielski             {
3460*b1cdbd2cSJim Jagielski                 ::std::auto_ptr<ScDocProtection> p(new ScDocProtection(*pProtect));
3461*b1cdbd2cSJim Jagielski                 p->setProtected(true); // just in case ...
3462*b1cdbd2cSJim Jagielski                 rDocShell.GetUndoManager()->AddUndoAction(
3463*b1cdbd2cSJim Jagielski                     new ScUndoDocProtect(&rDocShell, p) );
3464*b1cdbd2cSJim Jagielski                 // ownership of auto_ptr is transferred to ScUndoDocProtect.
3465*b1cdbd2cSJim Jagielski             }
3466*b1cdbd2cSJim Jagielski         }
3467*b1cdbd2cSJim Jagielski     }
3468*b1cdbd2cSJim Jagielski     else
3469*b1cdbd2cSJim Jagielski     {
3470*b1cdbd2cSJim Jagielski         // sheet protection
3471*b1cdbd2cSJim Jagielski 
3472*b1cdbd2cSJim Jagielski         ScTableProtection aProtection;
3473*b1cdbd2cSJim Jagielski         aProtection.setProtected(true);
3474*b1cdbd2cSJim Jagielski         aProtection.setPassword(rPassword);
3475*b1cdbd2cSJim Jagielski         pDoc->SetTabProtection(nTab, &aProtection);
3476*b1cdbd2cSJim Jagielski         if (pDoc->IsUndoEnabled())
3477*b1cdbd2cSJim Jagielski         {
3478*b1cdbd2cSJim Jagielski             ScTableProtection* pProtect = pDoc->GetTabProtection(nTab);
3479*b1cdbd2cSJim Jagielski             DBG_ASSERT(pProtect, "ScDocFunc::Unprotect: ScTableProtection pointer is NULL!");
3480*b1cdbd2cSJim Jagielski             if (pProtect)
3481*b1cdbd2cSJim Jagielski             {
3482*b1cdbd2cSJim Jagielski                 ::std::auto_ptr<ScTableProtection> p(new ScTableProtection(*pProtect));
3483*b1cdbd2cSJim Jagielski                 p->setProtected(true); // just in case ...
3484*b1cdbd2cSJim Jagielski                 rDocShell.GetUndoManager()->AddUndoAction(
3485*b1cdbd2cSJim Jagielski                     new ScUndoTabProtect(&rDocShell, nTab, p) );
3486*b1cdbd2cSJim Jagielski                 // ownership of auto_ptr now transferred to ScUndoTabProtect.
3487*b1cdbd2cSJim Jagielski             }
3488*b1cdbd2cSJim Jagielski         }
3489*b1cdbd2cSJim Jagielski     }
3490*b1cdbd2cSJim Jagielski 
3491*b1cdbd2cSJim Jagielski     rDocShell.PostPaintGridAll();
3492*b1cdbd2cSJim Jagielski     ScDocShellModificator aModificator( rDocShell );
3493*b1cdbd2cSJim Jagielski     aModificator.SetDocumentModified();
3494*b1cdbd2cSJim Jagielski 
3495*b1cdbd2cSJim Jagielski     return true;
3496*b1cdbd2cSJim Jagielski }
3497*b1cdbd2cSJim Jagielski 
Unprotect(SCTAB nTab,const String & rPassword,sal_Bool bApi)3498*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::Unprotect( SCTAB nTab, const String& rPassword, sal_Bool bApi )
3499*b1cdbd2cSJim Jagielski {
3500*b1cdbd2cSJim Jagielski     ScDocument* pDoc = rDocShell.GetDocument();
3501*b1cdbd2cSJim Jagielski 
3502*b1cdbd2cSJim Jagielski     if (nTab == TABLEID_DOC)
3503*b1cdbd2cSJim Jagielski     {
3504*b1cdbd2cSJim Jagielski         // document protection
3505*b1cdbd2cSJim Jagielski 
3506*b1cdbd2cSJim Jagielski         ScDocProtection* pDocProtect = pDoc->GetDocProtection();
3507*b1cdbd2cSJim Jagielski         if (!pDocProtect || !pDocProtect->isProtected())
3508*b1cdbd2cSJim Jagielski             // already unprotected (should not happen)!
3509*b1cdbd2cSJim Jagielski             return true;
3510*b1cdbd2cSJim Jagielski 
3511*b1cdbd2cSJim Jagielski         // save the protection state before unprotect (for undo).
3512*b1cdbd2cSJim Jagielski         ::std::auto_ptr<ScDocProtection> pProtectCopy(new ScDocProtection(*pDocProtect));
3513*b1cdbd2cSJim Jagielski 
3514*b1cdbd2cSJim Jagielski         if (!pDocProtect->verifyPassword(rPassword))
3515*b1cdbd2cSJim Jagielski         {
3516*b1cdbd2cSJim Jagielski             if (!bApi)
3517*b1cdbd2cSJim Jagielski             {
3518*b1cdbd2cSJim Jagielski                 InfoBox aBox( rDocShell.GetActiveDialogParent(), String( ScResId( SCSTR_WRONGPASSWORD ) ) );
3519*b1cdbd2cSJim Jagielski                 aBox.Execute();
3520*b1cdbd2cSJim Jagielski             }
3521*b1cdbd2cSJim Jagielski             return false;
3522*b1cdbd2cSJim Jagielski         }
3523*b1cdbd2cSJim Jagielski 
3524*b1cdbd2cSJim Jagielski         pDoc->SetDocProtection(NULL);
3525*b1cdbd2cSJim Jagielski         if (pDoc->IsUndoEnabled())
3526*b1cdbd2cSJim Jagielski         {
3527*b1cdbd2cSJim Jagielski             pProtectCopy->setProtected(false);
3528*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->AddUndoAction(
3529*b1cdbd2cSJim Jagielski                 new ScUndoDocProtect(&rDocShell, pProtectCopy) );
3530*b1cdbd2cSJim Jagielski             // ownership of auto_ptr now transferred to ScUndoDocProtect.
3531*b1cdbd2cSJim Jagielski         }
3532*b1cdbd2cSJim Jagielski     }
3533*b1cdbd2cSJim Jagielski     else
3534*b1cdbd2cSJim Jagielski     {
3535*b1cdbd2cSJim Jagielski         // sheet protection
3536*b1cdbd2cSJim Jagielski 
3537*b1cdbd2cSJim Jagielski         ScTableProtection* pTabProtect = pDoc->GetTabProtection(nTab);
3538*b1cdbd2cSJim Jagielski         if (!pTabProtect || !pTabProtect->isProtected())
3539*b1cdbd2cSJim Jagielski             // already unprotected (should not happen)!
3540*b1cdbd2cSJim Jagielski             return true;
3541*b1cdbd2cSJim Jagielski 
3542*b1cdbd2cSJim Jagielski         // save the protection state before unprotect (for undo).
3543*b1cdbd2cSJim Jagielski         ::std::auto_ptr<ScTableProtection> pProtectCopy(new ScTableProtection(*pTabProtect));
3544*b1cdbd2cSJim Jagielski         if (!pTabProtect->verifyPassword(rPassword))
3545*b1cdbd2cSJim Jagielski         {
3546*b1cdbd2cSJim Jagielski             if (!bApi)
3547*b1cdbd2cSJim Jagielski             {
3548*b1cdbd2cSJim Jagielski                 InfoBox aBox( rDocShell.GetActiveDialogParent(), String( ScResId( SCSTR_WRONGPASSWORD ) ) );
3549*b1cdbd2cSJim Jagielski                 aBox.Execute();
3550*b1cdbd2cSJim Jagielski             }
3551*b1cdbd2cSJim Jagielski             return false;
3552*b1cdbd2cSJim Jagielski         }
3553*b1cdbd2cSJim Jagielski 
3554*b1cdbd2cSJim Jagielski         pDoc->SetTabProtection(nTab, NULL);
3555*b1cdbd2cSJim Jagielski         if (pDoc->IsUndoEnabled())
3556*b1cdbd2cSJim Jagielski         {
3557*b1cdbd2cSJim Jagielski             pProtectCopy->setProtected(false);
3558*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->AddUndoAction(
3559*b1cdbd2cSJim Jagielski                 new ScUndoTabProtect(&rDocShell, nTab, pProtectCopy) );
3560*b1cdbd2cSJim Jagielski             // ownership of auto_ptr now transferred to ScUndoTabProtect.
3561*b1cdbd2cSJim Jagielski         }
3562*b1cdbd2cSJim Jagielski     }
3563*b1cdbd2cSJim Jagielski 
3564*b1cdbd2cSJim Jagielski     rDocShell.PostPaintGridAll();
3565*b1cdbd2cSJim Jagielski     ScDocShellModificator aModificator( rDocShell );
3566*b1cdbd2cSJim Jagielski     aModificator.SetDocumentModified();
3567*b1cdbd2cSJim Jagielski 
3568*b1cdbd2cSJim Jagielski     return true;
3569*b1cdbd2cSJim Jagielski }
3570*b1cdbd2cSJim Jagielski 
3571*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
3572*b1cdbd2cSJim Jagielski 
ClearItems(const ScMarkData & rMark,const sal_uInt16 * pWhich,sal_Bool bApi)3573*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::ClearItems( const ScMarkData& rMark, const sal_uInt16* pWhich, sal_Bool bApi )
3574*b1cdbd2cSJim Jagielski {
3575*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3576*b1cdbd2cSJim Jagielski 
3577*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3578*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
3579*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, rMark );
3580*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
3581*b1cdbd2cSJim Jagielski 	{
3582*b1cdbd2cSJim Jagielski 		if (!bApi)
3583*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
3584*b1cdbd2cSJim Jagielski 		return sal_False;
3585*b1cdbd2cSJim Jagielski 	}
3586*b1cdbd2cSJim Jagielski 
3587*b1cdbd2cSJim Jagielski 	//	#i12940# ClearItems is called (from setPropertyToDefault) directly with uno object's cached
3588*b1cdbd2cSJim Jagielski 	//	MarkData (GetMarkData), so rMark must be changed to multi selection for ClearSelectionItems
3589*b1cdbd2cSJim Jagielski 	//	here.
3590*b1cdbd2cSJim Jagielski 
3591*b1cdbd2cSJim Jagielski 	ScRange aMarkRange;
3592*b1cdbd2cSJim Jagielski 	ScMarkData aMultiMark = rMark;
3593*b1cdbd2cSJim Jagielski 	aMultiMark.SetMarking(sal_False);		// for MarkToMulti
3594*b1cdbd2cSJim Jagielski 	aMultiMark.MarkToMulti();
3595*b1cdbd2cSJim Jagielski 	aMultiMark.GetMultiMarkArea( aMarkRange );
3596*b1cdbd2cSJim Jagielski 
3597*b1cdbd2cSJim Jagielski //	if (bRecord)
3598*b1cdbd2cSJim Jagielski 	if (bUndo)
3599*b1cdbd2cSJim Jagielski 	{
3600*b1cdbd2cSJim Jagielski 		SCTAB nStartTab = aMarkRange.aStart.Tab();
3601*b1cdbd2cSJim Jagielski 		SCTAB nEndTab = aMarkRange.aEnd.Tab();
3602*b1cdbd2cSJim Jagielski 
3603*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
3604*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab );
3605*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( aMarkRange, IDF_ATTRIB, sal_True, pUndoDoc, (ScMarkData*)&aMultiMark );
3606*b1cdbd2cSJim Jagielski 
3607*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
3608*b1cdbd2cSJim Jagielski 			new ScUndoClearItems( &rDocShell, aMultiMark, pUndoDoc, pWhich ) );
3609*b1cdbd2cSJim Jagielski 	}
3610*b1cdbd2cSJim Jagielski 
3611*b1cdbd2cSJim Jagielski 	pDoc->ClearSelectionItems( pWhich, aMultiMark );
3612*b1cdbd2cSJim Jagielski 
3613*b1cdbd2cSJim Jagielski 	rDocShell.PostPaint( aMarkRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
3614*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
3615*b1cdbd2cSJim Jagielski 
3616*b1cdbd2cSJim Jagielski 	//!	Bindings-Invalidate etc.?
3617*b1cdbd2cSJim Jagielski 
3618*b1cdbd2cSJim Jagielski 	return sal_True;
3619*b1cdbd2cSJim Jagielski }
3620*b1cdbd2cSJim Jagielski 
ChangeIndent(const ScMarkData & rMark,sal_Bool bIncrement,sal_Bool bApi)3621*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::ChangeIndent( const ScMarkData& rMark, sal_Bool bIncrement, sal_Bool bApi )
3622*b1cdbd2cSJim Jagielski {
3623*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3624*b1cdbd2cSJim Jagielski 
3625*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3626*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
3627*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, rMark );
3628*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
3629*b1cdbd2cSJim Jagielski 	{
3630*b1cdbd2cSJim Jagielski 		if (!bApi)
3631*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
3632*b1cdbd2cSJim Jagielski 		return sal_False;
3633*b1cdbd2cSJim Jagielski 	}
3634*b1cdbd2cSJim Jagielski 
3635*b1cdbd2cSJim Jagielski 	ScRange aMarkRange;
3636*b1cdbd2cSJim Jagielski 	rMark.GetMultiMarkArea( aMarkRange );
3637*b1cdbd2cSJim Jagielski 
3638*b1cdbd2cSJim Jagielski //	if (bRecord)
3639*b1cdbd2cSJim Jagielski 	if (bUndo)
3640*b1cdbd2cSJim Jagielski 	{
3641*b1cdbd2cSJim Jagielski 		SCTAB nStartTab = aMarkRange.aStart.Tab();
3642*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
3643*b1cdbd2cSJim Jagielski 
3644*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
3645*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab );
3646*b1cdbd2cSJim Jagielski 		for (SCTAB i=0; i<nTabCount; i++)
3647*b1cdbd2cSJim Jagielski 			if (i != nStartTab && rMark.GetTableSelect(i))
3648*b1cdbd2cSJim Jagielski 				pUndoDoc->AddUndoTab( i, i );
3649*b1cdbd2cSJim Jagielski 
3650*b1cdbd2cSJim Jagielski 		ScRange aCopyRange = aMarkRange;
3651*b1cdbd2cSJim Jagielski 		aCopyRange.aStart.SetTab(0);
3652*b1cdbd2cSJim Jagielski 		aCopyRange.aEnd.SetTab(nTabCount-1);
3653*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_True, pUndoDoc, (ScMarkData*)&rMark );
3654*b1cdbd2cSJim Jagielski 
3655*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
3656*b1cdbd2cSJim Jagielski 			new ScUndoIndent( &rDocShell, rMark, pUndoDoc, bIncrement ) );
3657*b1cdbd2cSJim Jagielski 	}
3658*b1cdbd2cSJim Jagielski 
3659*b1cdbd2cSJim Jagielski 	pDoc->ChangeSelectionIndent( bIncrement, rMark );
3660*b1cdbd2cSJim Jagielski 
3661*b1cdbd2cSJim Jagielski 	rDocShell.PostPaint( aMarkRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
3662*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
3663*b1cdbd2cSJim Jagielski 
3664*b1cdbd2cSJim Jagielski 	SfxBindings* pBindings = rDocShell.GetViewBindings();
3665*b1cdbd2cSJim Jagielski 	if (pBindings)
3666*b1cdbd2cSJim Jagielski 	{
3667*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ALIGNLEFT );			// ChangeIndent setzt auf links
3668*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ALIGNRIGHT );
3669*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ALIGNBLOCK );
3670*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ALIGNCENTERHOR );
3671*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ATTR_LRSPACE );
3672*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ATTR_PARA_ADJUST_LEFT );
3673*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ATTR_PARA_ADJUST_RIGHT );
3674*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ATTR_PARA_ADJUST_BLOCK );
3675*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_ATTR_PARA_ADJUST_CENTER);
3676*b1cdbd2cSJim Jagielski         // pseudo slots for Format menu
3677*b1cdbd2cSJim Jagielski         pBindings->Invalidate( SID_ALIGN_ANY_HDEFAULT );
3678*b1cdbd2cSJim Jagielski         pBindings->Invalidate( SID_ALIGN_ANY_LEFT );
3679*b1cdbd2cSJim Jagielski         pBindings->Invalidate( SID_ALIGN_ANY_HCENTER );
3680*b1cdbd2cSJim Jagielski         pBindings->Invalidate( SID_ALIGN_ANY_RIGHT );
3681*b1cdbd2cSJim Jagielski         pBindings->Invalidate( SID_ALIGN_ANY_JUSTIFIED );
3682*b1cdbd2cSJim Jagielski 	}
3683*b1cdbd2cSJim Jagielski 
3684*b1cdbd2cSJim Jagielski 	return sal_True;
3685*b1cdbd2cSJim Jagielski }
3686*b1cdbd2cSJim Jagielski 
AutoFormat(const ScRange & rRange,const ScMarkData * pTabMark,sal_uInt16 nFormatNo,sal_Bool bRecord,sal_Bool bApi)3687*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::AutoFormat( const ScRange& rRange, const ScMarkData* pTabMark,
3688*b1cdbd2cSJim Jagielski 							sal_uInt16 nFormatNo, sal_Bool bRecord, sal_Bool bApi )
3689*b1cdbd2cSJim Jagielski {
3690*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3691*b1cdbd2cSJim Jagielski 
3692*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
3693*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3694*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
3695*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
3696*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
3697*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
3698*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
3699*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
3700*b1cdbd2cSJim Jagielski 
3701*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
3702*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
3703*b1cdbd2cSJim Jagielski 	ScMarkData aMark;
3704*b1cdbd2cSJim Jagielski 	if (pTabMark)
3705*b1cdbd2cSJim Jagielski 		aMark = *pTabMark;
3706*b1cdbd2cSJim Jagielski 	else
3707*b1cdbd2cSJim Jagielski 	{
3708*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
3709*b1cdbd2cSJim Jagielski 			aMark.SelectTable( nTab, sal_True );
3710*b1cdbd2cSJim Jagielski 	}
3711*b1cdbd2cSJim Jagielski 
3712*b1cdbd2cSJim Jagielski 	ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat();
3713*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark );
3714*b1cdbd2cSJim Jagielski 	if ( pAutoFormat && nFormatNo < pAutoFormat->GetCount() && aTester.IsEditable() )
3715*b1cdbd2cSJim Jagielski 	{
3716*b1cdbd2cSJim Jagielski 		WaitObject aWait( rDocShell.GetActiveDialogParent() );
3717*b1cdbd2cSJim Jagielski 
3718*b1cdbd2cSJim Jagielski 		sal_Bool bSize = (*pAutoFormat)[nFormatNo]->GetIncludeWidthHeight();
3719*b1cdbd2cSJim Jagielski 
3720*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
3721*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = NULL;
3722*b1cdbd2cSJim Jagielski 		if ( bRecord )
3723*b1cdbd2cSJim Jagielski 		{
3724*b1cdbd2cSJim Jagielski 			pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
3725*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nStartTab, nStartTab, bSize, bSize );
3726*b1cdbd2cSJim Jagielski 			for (SCTAB i=0; i<nTabCount; i++)
3727*b1cdbd2cSJim Jagielski 				if (i != nStartTab && aMark.GetTableSelect(i))
3728*b1cdbd2cSJim Jagielski 					pUndoDoc->AddUndoTab( i, i, bSize, bSize );
3729*b1cdbd2cSJim Jagielski 
3730*b1cdbd2cSJim Jagielski 			ScRange aCopyRange = rRange;
3731*b1cdbd2cSJim Jagielski 			aCopyRange.aStart.SetTab(0);
3732*b1cdbd2cSJim Jagielski 			aCopyRange.aStart.SetTab(nTabCount-1);
3733*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_False, pUndoDoc, &aMark );
3734*b1cdbd2cSJim Jagielski 			if (bSize)
3735*b1cdbd2cSJim Jagielski 			{
3736*b1cdbd2cSJim Jagielski 				pDoc->CopyToDocument( nStartCol,0,0, nEndCol,MAXROW,nTabCount-1,
3737*b1cdbd2cSJim Jagielski 															IDF_NONE, sal_False, pUndoDoc, &aMark );
3738*b1cdbd2cSJim Jagielski 				pDoc->CopyToDocument( 0,nStartRow,0, MAXCOL,nEndRow,nTabCount-1,
3739*b1cdbd2cSJim Jagielski 															IDF_NONE, sal_False, pUndoDoc, &aMark );
3740*b1cdbd2cSJim Jagielski 			}
3741*b1cdbd2cSJim Jagielski 			pDoc->BeginDrawUndo();
3742*b1cdbd2cSJim Jagielski 		}
3743*b1cdbd2cSJim Jagielski 
3744*b1cdbd2cSJim Jagielski 		pDoc->AutoFormat( nStartCol, nStartRow, nEndCol, nEndRow, nFormatNo, aMark );
3745*b1cdbd2cSJim Jagielski 
3746*b1cdbd2cSJim Jagielski 		if (bSize)
3747*b1cdbd2cSJim Jagielski 		{
3748*b1cdbd2cSJim Jagielski /*			SCCOL nCols[2];
3749*b1cdbd2cSJim Jagielski 			nCols[0] = nStartCol;
3750*b1cdbd2cSJim Jagielski 			nCols[1] = nEndCol;
3751*b1cdbd2cSJim Jagielski 			SCROW nRows[2];
3752*b1cdbd2cSJim Jagielski 			nRows[0] = nStartRow;
3753*b1cdbd2cSJim Jagielski 			nRows[1] = nEndRow;
3754*b1cdbd2cSJim Jagielski */
3755*b1cdbd2cSJim Jagielski 			SCCOLROW nCols[2] = { nStartCol, nEndCol };
3756*b1cdbd2cSJim Jagielski 			SCCOLROW nRows[2] = { nStartRow, nEndRow };
3757*b1cdbd2cSJim Jagielski 
3758*b1cdbd2cSJim Jagielski 			for (SCTAB nTab=0; nTab<nTabCount; nTab++)
3759*b1cdbd2cSJim Jagielski 				if (aMark.GetTableSelect(nTab))
3760*b1cdbd2cSJim Jagielski 				{
3761*b1cdbd2cSJim Jagielski                     SetWidthOrHeight( sal_True, 1,nCols, nTab, SC_SIZE_VISOPT, STD_EXTRA_WIDTH, sal_False, sal_True);
3762*b1cdbd2cSJim Jagielski                     SetWidthOrHeight( sal_False,1,nRows, nTab, SC_SIZE_VISOPT, 0, sal_False, sal_False);
3763*b1cdbd2cSJim Jagielski 					rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab,
3764*b1cdbd2cSJim Jagielski 									PAINT_GRID | PAINT_LEFT | PAINT_TOP );
3765*b1cdbd2cSJim Jagielski 				}
3766*b1cdbd2cSJim Jagielski 		}
3767*b1cdbd2cSJim Jagielski 		else
3768*b1cdbd2cSJim Jagielski 		{
3769*b1cdbd2cSJim Jagielski 			for (SCTAB nTab=0; nTab<nTabCount; nTab++)
3770*b1cdbd2cSJim Jagielski 				if (aMark.GetTableSelect(nTab))
3771*b1cdbd2cSJim Jagielski 				{
3772*b1cdbd2cSJim Jagielski 					sal_Bool bAdj = AdjustRowHeight( ScRange(nStartCol, nStartRow, nTab,
3773*b1cdbd2cSJim Jagielski 														nEndCol, nEndRow, nTab), sal_False );
3774*b1cdbd2cSJim Jagielski 					if (bAdj)
3775*b1cdbd2cSJim Jagielski 						rDocShell.PostPaint( 0,nStartRow,nTab, MAXCOL,MAXROW,nTab,
3776*b1cdbd2cSJim Jagielski 											PAINT_GRID | PAINT_LEFT );
3777*b1cdbd2cSJim Jagielski 					else
3778*b1cdbd2cSJim Jagielski 						rDocShell.PostPaint( nStartCol, nStartRow, nTab,
3779*b1cdbd2cSJim Jagielski 											nEndCol, nEndRow, nTab, PAINT_GRID );
3780*b1cdbd2cSJim Jagielski 				}
3781*b1cdbd2cSJim Jagielski 		}
3782*b1cdbd2cSJim Jagielski 
3783*b1cdbd2cSJim Jagielski 		if ( bRecord )		// Draw-Undo erst jetzt verfuegbar
3784*b1cdbd2cSJim Jagielski 		{
3785*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
3786*b1cdbd2cSJim Jagielski 				new ScUndoAutoFormat( &rDocShell, rRange, pUndoDoc, aMark, bSize, nFormatNo ) );
3787*b1cdbd2cSJim Jagielski 		}
3788*b1cdbd2cSJim Jagielski 
3789*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
3790*b1cdbd2cSJim Jagielski 	}
3791*b1cdbd2cSJim Jagielski 	else if (!bApi)
3792*b1cdbd2cSJim Jagielski 		rDocShell.ErrorMessage(aTester.GetMessageId());
3793*b1cdbd2cSJim Jagielski 
3794*b1cdbd2cSJim Jagielski 	return bSuccess;
3795*b1cdbd2cSJim Jagielski }
3796*b1cdbd2cSJim Jagielski 
3797*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
3798*b1cdbd2cSJim Jagielski 
EnterMatrix(const ScRange & rRange,const ScMarkData * pTabMark,const ScTokenArray * pTokenArray,const String & rString,sal_Bool bApi,sal_Bool bEnglish,const String & rFormulaNmsp,const formula::FormulaGrammar::Grammar eGrammar)3799*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::EnterMatrix( const ScRange& rRange, const ScMarkData* pTabMark,
3800*b1cdbd2cSJim Jagielski         const ScTokenArray* pTokenArray, const String& rString, sal_Bool bApi, sal_Bool bEnglish,
3801*b1cdbd2cSJim Jagielski         const String& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar )
3802*b1cdbd2cSJim Jagielski {
3803*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3804*b1cdbd2cSJim Jagielski 
3805*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
3806*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3807*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
3808*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
3809*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
3810*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
3811*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
3812*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
3813*b1cdbd2cSJim Jagielski 
3814*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
3815*b1cdbd2cSJim Jagielski 
3816*b1cdbd2cSJim Jagielski 	ScMarkData aMark;
3817*b1cdbd2cSJim Jagielski 	if (pTabMark)
3818*b1cdbd2cSJim Jagielski 		aMark = *pTabMark;
3819*b1cdbd2cSJim Jagielski 	else
3820*b1cdbd2cSJim Jagielski 	{
3821*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
3822*b1cdbd2cSJim Jagielski 			aMark.SelectTable( nTab, sal_True );
3823*b1cdbd2cSJim Jagielski 	}
3824*b1cdbd2cSJim Jagielski 
3825*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark );
3826*b1cdbd2cSJim Jagielski 	if ( aTester.IsEditable() )
3827*b1cdbd2cSJim Jagielski 	{
3828*b1cdbd2cSJim Jagielski 		WaitObject aWait( rDocShell.GetActiveDialogParent() );
3829*b1cdbd2cSJim Jagielski 
3830*b1cdbd2cSJim Jagielski         ScDocument* pUndoDoc = NULL;
3831*b1cdbd2cSJim Jagielski //		if (bRecord)	// immer
3832*b1cdbd2cSJim Jagielski 		if (bUndo)
3833*b1cdbd2cSJim Jagielski 		{
3834*b1cdbd2cSJim Jagielski 			//!	auch bei Undo selektierte Tabellen beruecksichtigen
3835*b1cdbd2cSJim Jagielski 			pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
3836*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab );
3837*b1cdbd2cSJim Jagielski             pDoc->CopyToDocument( rRange, IDF_ALL & ~IDF_NOTE, sal_False, pUndoDoc );
3838*b1cdbd2cSJim Jagielski 		}
3839*b1cdbd2cSJim Jagielski 
3840*b1cdbd2cSJim Jagielski         // use TokenArray if given, string (and flags) otherwise
3841*b1cdbd2cSJim Jagielski         if ( pTokenArray )
3842*b1cdbd2cSJim Jagielski         {
3843*b1cdbd2cSJim Jagielski             pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow,
3844*b1cdbd2cSJim Jagielski                     aMark, EMPTY_STRING, pTokenArray, eGrammar);
3845*b1cdbd2cSJim Jagielski         }
3846*b1cdbd2cSJim Jagielski         else if ( pDoc->IsImportingXML() )
3847*b1cdbd2cSJim Jagielski 		{
3848*b1cdbd2cSJim Jagielski             ScTokenArray* pCode = lcl_ScDocFunc_CreateTokenArrayXML( rString, rFormulaNmsp, eGrammar );
3849*b1cdbd2cSJim Jagielski             pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow,
3850*b1cdbd2cSJim Jagielski                     aMark, EMPTY_STRING, pCode, eGrammar);
3851*b1cdbd2cSJim Jagielski 			delete pCode;
3852*b1cdbd2cSJim Jagielski             pDoc->IncXMLImportedFormulaCount( rString.Len() );
3853*b1cdbd2cSJim Jagielski 		}
3854*b1cdbd2cSJim Jagielski 		else if (bEnglish)
3855*b1cdbd2cSJim Jagielski         {
3856*b1cdbd2cSJim Jagielski 			ScCompiler aComp( pDoc, rRange.aStart);
3857*b1cdbd2cSJim Jagielski             aComp.SetGrammar(eGrammar);
3858*b1cdbd2cSJim Jagielski 			ScTokenArray* pCode = aComp.CompileString( rString );
3859*b1cdbd2cSJim Jagielski             pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow,
3860*b1cdbd2cSJim Jagielski                     aMark, EMPTY_STRING, pCode, eGrammar);
3861*b1cdbd2cSJim Jagielski 			delete pCode;
3862*b1cdbd2cSJim Jagielski         }
3863*b1cdbd2cSJim Jagielski         else
3864*b1cdbd2cSJim Jagielski             pDoc->InsertMatrixFormula( nStartCol, nStartRow, nEndCol, nEndRow,
3865*b1cdbd2cSJim Jagielski                     aMark, rString, NULL, eGrammar);
3866*b1cdbd2cSJim Jagielski 
3867*b1cdbd2cSJim Jagielski //		if (bRecord)	// immer
3868*b1cdbd2cSJim Jagielski 		if (bUndo)
3869*b1cdbd2cSJim Jagielski 		{
3870*b1cdbd2cSJim Jagielski 			//!	auch bei Undo selektierte Tabellen beruecksichtigen
3871*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
3872*b1cdbd2cSJim Jagielski 				new ScUndoEnterMatrix( &rDocShell, rRange, pUndoDoc, rString ) );
3873*b1cdbd2cSJim Jagielski 		}
3874*b1cdbd2cSJim Jagielski 
3875*b1cdbd2cSJim Jagielski 		//	Err522 beim Paint von DDE-Formeln werden jetzt beim Interpretieren abgefangen
3876*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab, PAINT_GRID );
3877*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
3878*b1cdbd2cSJim Jagielski 
3879*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
3880*b1cdbd2cSJim Jagielski 	}
3881*b1cdbd2cSJim Jagielski 	else if (!bApi)
3882*b1cdbd2cSJim Jagielski 		rDocShell.ErrorMessage(aTester.GetMessageId());
3883*b1cdbd2cSJim Jagielski 
3884*b1cdbd2cSJim Jagielski 	return bSuccess;
3885*b1cdbd2cSJim Jagielski }
3886*b1cdbd2cSJim Jagielski 
3887*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
3888*b1cdbd2cSJim Jagielski 
TabOp(const ScRange & rRange,const ScMarkData * pTabMark,const ScTabOpParam & rParam,sal_Bool bRecord,sal_Bool bApi)3889*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::TabOp( const ScRange& rRange, const ScMarkData* pTabMark,
3890*b1cdbd2cSJim Jagielski 							const ScTabOpParam& rParam, sal_Bool bRecord, sal_Bool bApi )
3891*b1cdbd2cSJim Jagielski {
3892*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3893*b1cdbd2cSJim Jagielski 
3894*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
3895*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3896*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
3897*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
3898*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
3899*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
3900*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
3901*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
3902*b1cdbd2cSJim Jagielski 
3903*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
3904*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
3905*b1cdbd2cSJim Jagielski 
3906*b1cdbd2cSJim Jagielski 	ScMarkData aMark;
3907*b1cdbd2cSJim Jagielski 	if (pTabMark)
3908*b1cdbd2cSJim Jagielski 		aMark = *pTabMark;
3909*b1cdbd2cSJim Jagielski 	else
3910*b1cdbd2cSJim Jagielski 	{
3911*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
3912*b1cdbd2cSJim Jagielski 			aMark.SelectTable( nTab, sal_True );
3913*b1cdbd2cSJim Jagielski 	}
3914*b1cdbd2cSJim Jagielski 
3915*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark );
3916*b1cdbd2cSJim Jagielski 	if ( aTester.IsEditable() )
3917*b1cdbd2cSJim Jagielski 	{
3918*b1cdbd2cSJim Jagielski 		WaitObject aWait( rDocShell.GetActiveDialogParent() );
3919*b1cdbd2cSJim Jagielski 		pDoc->SetDirty( rRange );
3920*b1cdbd2cSJim Jagielski 		if ( bRecord )
3921*b1cdbd2cSJim Jagielski 		{
3922*b1cdbd2cSJim Jagielski 			//!	auch bei Undo selektierte Tabellen beruecksichtigen
3923*b1cdbd2cSJim Jagielski 			ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
3924*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab );
3925*b1cdbd2cSJim Jagielski             pDoc->CopyToDocument( rRange, IDF_ALL & ~IDF_NOTE, sal_False, pUndoDoc );
3926*b1cdbd2cSJim Jagielski 
3927*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
3928*b1cdbd2cSJim Jagielski 					new ScUndoTabOp( &rDocShell,
3929*b1cdbd2cSJim Jagielski 									 nStartCol, nStartRow, nStartTab,
3930*b1cdbd2cSJim Jagielski 									 nEndCol, nEndRow, nEndTab, pUndoDoc,
3931*b1cdbd2cSJim Jagielski 									 rParam.aRefFormulaCell,
3932*b1cdbd2cSJim Jagielski 									 rParam.aRefFormulaEnd,
3933*b1cdbd2cSJim Jagielski 									 rParam.aRefRowCell,
3934*b1cdbd2cSJim Jagielski 									 rParam.aRefColCell,
3935*b1cdbd2cSJim Jagielski 									 rParam.nMode) );
3936*b1cdbd2cSJim Jagielski 		}
3937*b1cdbd2cSJim Jagielski 		pDoc->InsertTableOp(rParam, nStartCol, nStartRow, nEndCol, nEndRow, aMark);
3938*b1cdbd2cSJim Jagielski 		rDocShell.PostPaintGridAll();
3939*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
3940*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
3941*b1cdbd2cSJim Jagielski 	}
3942*b1cdbd2cSJim Jagielski 	else if (!bApi)
3943*b1cdbd2cSJim Jagielski 		rDocShell.ErrorMessage(aTester.GetMessageId());
3944*b1cdbd2cSJim Jagielski 
3945*b1cdbd2cSJim Jagielski 	return bSuccess;
3946*b1cdbd2cSJim Jagielski }
3947*b1cdbd2cSJim Jagielski 
3948*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
3949*b1cdbd2cSJim Jagielski 
DirFromFillDir(FillDir eDir)3950*b1cdbd2cSJim Jagielski inline ScDirection DirFromFillDir( FillDir eDir )
3951*b1cdbd2cSJim Jagielski {
3952*b1cdbd2cSJim Jagielski 	if (eDir==FILL_TO_BOTTOM)
3953*b1cdbd2cSJim Jagielski 		return DIR_BOTTOM;
3954*b1cdbd2cSJim Jagielski 	else if (eDir==FILL_TO_RIGHT)
3955*b1cdbd2cSJim Jagielski 		return DIR_RIGHT;
3956*b1cdbd2cSJim Jagielski 	else if (eDir==FILL_TO_TOP)
3957*b1cdbd2cSJim Jagielski 		return DIR_TOP;
3958*b1cdbd2cSJim Jagielski 	else // if (eDir==FILL_TO_LEFT)
3959*b1cdbd2cSJim Jagielski 		return DIR_LEFT;
3960*b1cdbd2cSJim Jagielski }
3961*b1cdbd2cSJim Jagielski 
FillSimple(const ScRange & rRange,const ScMarkData * pTabMark,FillDir eDir,sal_Bool bRecord,sal_Bool bApi)3962*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::FillSimple( const ScRange& rRange, const ScMarkData* pTabMark,
3963*b1cdbd2cSJim Jagielski 							FillDir eDir, sal_Bool bRecord, sal_Bool bApi )
3964*b1cdbd2cSJim Jagielski {
3965*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
3966*b1cdbd2cSJim Jagielski 
3967*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
3968*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
3969*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
3970*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
3971*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
3972*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
3973*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
3974*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
3975*b1cdbd2cSJim Jagielski 
3976*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
3977*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
3978*b1cdbd2cSJim Jagielski 
3979*b1cdbd2cSJim Jagielski 	ScMarkData aMark;
3980*b1cdbd2cSJim Jagielski 	if (pTabMark)
3981*b1cdbd2cSJim Jagielski 		aMark = *pTabMark;
3982*b1cdbd2cSJim Jagielski 	else
3983*b1cdbd2cSJim Jagielski 	{
3984*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
3985*b1cdbd2cSJim Jagielski 			aMark.SelectTable( nTab, sal_True );
3986*b1cdbd2cSJim Jagielski 	}
3987*b1cdbd2cSJim Jagielski 
3988*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark );
3989*b1cdbd2cSJim Jagielski 	if ( aTester.IsEditable() )
3990*b1cdbd2cSJim Jagielski 	{
3991*b1cdbd2cSJim Jagielski 		WaitObject aWait( rDocShell.GetActiveDialogParent() );
3992*b1cdbd2cSJim Jagielski 
3993*b1cdbd2cSJim Jagielski 		ScRange aSourceArea = rRange;
3994*b1cdbd2cSJim Jagielski 		ScRange aDestArea   = rRange;
3995*b1cdbd2cSJim Jagielski 
3996*b1cdbd2cSJim Jagielski         SCCOLROW nCount = 0;
3997*b1cdbd2cSJim Jagielski 		switch (eDir)
3998*b1cdbd2cSJim Jagielski 		{
3999*b1cdbd2cSJim Jagielski 			case FILL_TO_BOTTOM:
4000*b1cdbd2cSJim Jagielski 				nCount = aSourceArea.aEnd.Row()-aSourceArea.aStart.Row();
4001*b1cdbd2cSJim Jagielski 				aSourceArea.aEnd.SetRow( aSourceArea.aStart.Row() );
4002*b1cdbd2cSJim Jagielski 				break;
4003*b1cdbd2cSJim Jagielski 			case FILL_TO_RIGHT:
4004*b1cdbd2cSJim Jagielski 				nCount = aSourceArea.aEnd.Col()-aSourceArea.aStart.Col();
4005*b1cdbd2cSJim Jagielski 				aSourceArea.aEnd.SetCol( aSourceArea.aStart.Col() );
4006*b1cdbd2cSJim Jagielski 				break;
4007*b1cdbd2cSJim Jagielski 			case FILL_TO_TOP:
4008*b1cdbd2cSJim Jagielski 				nCount = aSourceArea.aEnd.Row()-aSourceArea.aStart.Row();
4009*b1cdbd2cSJim Jagielski 				aSourceArea.aStart.SetRow( aSourceArea.aEnd.Row() );
4010*b1cdbd2cSJim Jagielski 				break;
4011*b1cdbd2cSJim Jagielski 			case FILL_TO_LEFT:
4012*b1cdbd2cSJim Jagielski 				nCount = aSourceArea.aEnd.Col()-aSourceArea.aStart.Col();
4013*b1cdbd2cSJim Jagielski 				aSourceArea.aStart.SetCol( aSourceArea.aEnd.Col() );
4014*b1cdbd2cSJim Jagielski 				break;
4015*b1cdbd2cSJim Jagielski 		}
4016*b1cdbd2cSJim Jagielski 
4017*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = NULL;
4018*b1cdbd2cSJim Jagielski 		if ( bRecord )
4019*b1cdbd2cSJim Jagielski 		{
4020*b1cdbd2cSJim Jagielski 			SCTAB nTabCount = pDoc->GetTableCount();
4021*b1cdbd2cSJim Jagielski             SCTAB nDestStartTab = aDestArea.aStart.Tab();
4022*b1cdbd2cSJim Jagielski 
4023*b1cdbd2cSJim Jagielski 			pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
4024*b1cdbd2cSJim Jagielski             pUndoDoc->InitUndo( pDoc, nDestStartTab, nDestStartTab );
4025*b1cdbd2cSJim Jagielski 			for (SCTAB i=0; i<nTabCount; i++)
4026*b1cdbd2cSJim Jagielski                 if (i != nDestStartTab && aMark.GetTableSelect(i))
4027*b1cdbd2cSJim Jagielski 					pUndoDoc->AddUndoTab( i, i );
4028*b1cdbd2cSJim Jagielski 
4029*b1cdbd2cSJim Jagielski 			ScRange aCopyRange = aDestArea;
4030*b1cdbd2cSJim Jagielski 			aCopyRange.aStart.SetTab(0);
4031*b1cdbd2cSJim Jagielski 			aCopyRange.aEnd.SetTab(nTabCount-1);
4032*b1cdbd2cSJim Jagielski             pDoc->CopyToDocument( aCopyRange, IDF_AUTOFILL, sal_False, pUndoDoc, &aMark );
4033*b1cdbd2cSJim Jagielski 		}
4034*b1cdbd2cSJim Jagielski 
4035*b1cdbd2cSJim Jagielski 		pDoc->Fill( aSourceArea.aStart.Col(), aSourceArea.aStart.Row(),
4036*b1cdbd2cSJim Jagielski 					aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aMark,
4037*b1cdbd2cSJim Jagielski 					nCount, eDir, FILL_SIMPLE );
4038*b1cdbd2cSJim Jagielski 		AdjustRowHeight(rRange);
4039*b1cdbd2cSJim Jagielski 
4040*b1cdbd2cSJim Jagielski 		if ( bRecord )		// Draw-Undo erst jetzt verfuegbar
4041*b1cdbd2cSJim Jagielski 		{
4042*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
4043*b1cdbd2cSJim Jagielski 				new ScUndoAutoFill( &rDocShell, aDestArea, aSourceArea, pUndoDoc, aMark,
4044*b1cdbd2cSJim Jagielski 									eDir, FILL_SIMPLE, FILL_DAY, MAXDOUBLE, 1.0, 1e307,
4045*b1cdbd2cSJim Jagielski 									pDoc->GetRangeName()->GetSharedMaxIndex()+1 ) );
4046*b1cdbd2cSJim Jagielski 		}
4047*b1cdbd2cSJim Jagielski 
4048*b1cdbd2cSJim Jagielski 		rDocShell.PostPaintGridAll();
4049*b1cdbd2cSJim Jagielski //		rDocShell.PostPaintDataChanged();
4050*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
4051*b1cdbd2cSJim Jagielski 
4052*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
4053*b1cdbd2cSJim Jagielski 	}
4054*b1cdbd2cSJim Jagielski 	else if (!bApi)
4055*b1cdbd2cSJim Jagielski 		rDocShell.ErrorMessage(aTester.GetMessageId());
4056*b1cdbd2cSJim Jagielski 
4057*b1cdbd2cSJim Jagielski 	return bSuccess;
4058*b1cdbd2cSJim Jagielski }
4059*b1cdbd2cSJim Jagielski 
FillSeries(const ScRange & rRange,const ScMarkData * pTabMark,FillDir eDir,FillCmd eCmd,FillDateCmd eDateCmd,double fStart,double fStep,double fMax,sal_Bool bRecord,sal_Bool bApi)4060*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::FillSeries( const ScRange& rRange, const ScMarkData* pTabMark,
4061*b1cdbd2cSJim Jagielski 							FillDir	eDir, FillCmd eCmd, FillDateCmd	eDateCmd,
4062*b1cdbd2cSJim Jagielski 							double fStart, double fStep, double fMax,
4063*b1cdbd2cSJim Jagielski 							sal_Bool bRecord, sal_Bool bApi )
4064*b1cdbd2cSJim Jagielski {
4065*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
4066*b1cdbd2cSJim Jagielski 
4067*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
4068*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4069*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
4070*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
4071*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
4072*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
4073*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
4074*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
4075*b1cdbd2cSJim Jagielski 
4076*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
4077*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
4078*b1cdbd2cSJim Jagielski 
4079*b1cdbd2cSJim Jagielski 	ScMarkData aMark;
4080*b1cdbd2cSJim Jagielski 	if (pTabMark)
4081*b1cdbd2cSJim Jagielski 		aMark = *pTabMark;
4082*b1cdbd2cSJim Jagielski 	else
4083*b1cdbd2cSJim Jagielski 	{
4084*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
4085*b1cdbd2cSJim Jagielski 			aMark.SelectTable( nTab, sal_True );
4086*b1cdbd2cSJim Jagielski 	}
4087*b1cdbd2cSJim Jagielski 
4088*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nStartCol,nStartRow, nEndCol,nEndRow, aMark );
4089*b1cdbd2cSJim Jagielski 	if ( aTester.IsEditable() )
4090*b1cdbd2cSJim Jagielski 	{
4091*b1cdbd2cSJim Jagielski 		WaitObject aWait( rDocShell.GetActiveDialogParent() );
4092*b1cdbd2cSJim Jagielski 
4093*b1cdbd2cSJim Jagielski 		ScRange aSourceArea = rRange;
4094*b1cdbd2cSJim Jagielski 		ScRange aDestArea   = rRange;
4095*b1cdbd2cSJim Jagielski 
4096*b1cdbd2cSJim Jagielski 		SCSIZE nCount = pDoc->GetEmptyLinesInBlock(
4097*b1cdbd2cSJim Jagielski 				aSourceArea.aStart.Col(), aSourceArea.aStart.Row(), aSourceArea.aStart.Tab(),
4098*b1cdbd2cSJim Jagielski 				aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aSourceArea.aEnd.Tab(),
4099*b1cdbd2cSJim Jagielski 				DirFromFillDir(eDir) );
4100*b1cdbd2cSJim Jagielski 
4101*b1cdbd2cSJim Jagielski 		//	#27665# mindestens eine Zeile/Spalte als Quellbereich behalten:
4102*b1cdbd2cSJim Jagielski 		SCSIZE nTotLines = ( eDir == FILL_TO_BOTTOM || eDir == FILL_TO_TOP ) ?
4103*b1cdbd2cSJim Jagielski             static_cast<SCSIZE>( aSourceArea.aEnd.Row() - aSourceArea.aStart.Row() + 1 ) :
4104*b1cdbd2cSJim Jagielski             static_cast<SCSIZE>( aSourceArea.aEnd.Col() - aSourceArea.aStart.Col() + 1 );
4105*b1cdbd2cSJim Jagielski 		if ( nCount >= nTotLines )
4106*b1cdbd2cSJim Jagielski 			nCount = nTotLines - 1;
4107*b1cdbd2cSJim Jagielski 
4108*b1cdbd2cSJim Jagielski 		switch (eDir)
4109*b1cdbd2cSJim Jagielski 		{
4110*b1cdbd2cSJim Jagielski 			case FILL_TO_BOTTOM:
4111*b1cdbd2cSJim Jagielski                 aSourceArea.aEnd.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aEnd.Row() - nCount ) );
4112*b1cdbd2cSJim Jagielski 				break;
4113*b1cdbd2cSJim Jagielski 			case FILL_TO_RIGHT:
4114*b1cdbd2cSJim Jagielski                 aSourceArea.aEnd.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aEnd.Col() - nCount ) );
4115*b1cdbd2cSJim Jagielski 				break;
4116*b1cdbd2cSJim Jagielski 			case FILL_TO_TOP:
4117*b1cdbd2cSJim Jagielski                 aSourceArea.aStart.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aStart.Row() + nCount ) );
4118*b1cdbd2cSJim Jagielski 				break;
4119*b1cdbd2cSJim Jagielski 			case FILL_TO_LEFT:
4120*b1cdbd2cSJim Jagielski                 aSourceArea.aStart.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aStart.Col() + nCount ) );
4121*b1cdbd2cSJim Jagielski 				break;
4122*b1cdbd2cSJim Jagielski 		}
4123*b1cdbd2cSJim Jagielski 
4124*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = NULL;
4125*b1cdbd2cSJim Jagielski 		if ( bRecord )
4126*b1cdbd2cSJim Jagielski 		{
4127*b1cdbd2cSJim Jagielski 			SCTAB nTabCount = pDoc->GetTableCount();
4128*b1cdbd2cSJim Jagielski             SCTAB nDestStartTab = aDestArea.aStart.Tab();
4129*b1cdbd2cSJim Jagielski 
4130*b1cdbd2cSJim Jagielski 			pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
4131*b1cdbd2cSJim Jagielski             pUndoDoc->InitUndo( pDoc, nDestStartTab, nDestStartTab );
4132*b1cdbd2cSJim Jagielski 			for (SCTAB i=0; i<nTabCount; i++)
4133*b1cdbd2cSJim Jagielski                 if (i != nDestStartTab && aMark.GetTableSelect(i))
4134*b1cdbd2cSJim Jagielski 					pUndoDoc->AddUndoTab( i, i );
4135*b1cdbd2cSJim Jagielski 
4136*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument(
4137*b1cdbd2cSJim Jagielski 				aDestArea.aStart.Col(), aDestArea.aStart.Row(), 0,
4138*b1cdbd2cSJim Jagielski 				aDestArea.aEnd.Col(), aDestArea.aEnd.Row(), nTabCount-1,
4139*b1cdbd2cSJim Jagielski                 IDF_AUTOFILL, sal_False, pUndoDoc, &aMark );
4140*b1cdbd2cSJim Jagielski 		}
4141*b1cdbd2cSJim Jagielski 
4142*b1cdbd2cSJim Jagielski 		if (aDestArea.aStart.Col() <= aDestArea.aEnd.Col() &&
4143*b1cdbd2cSJim Jagielski 			aDestArea.aStart.Row() <= aDestArea.aEnd.Row())
4144*b1cdbd2cSJim Jagielski 		{
4145*b1cdbd2cSJim Jagielski 			if ( fStart != MAXDOUBLE )
4146*b1cdbd2cSJim Jagielski 			{
4147*b1cdbd2cSJim Jagielski 				SCCOL nValX = (eDir == FILL_TO_LEFT) ? aDestArea.aEnd.Col() : aDestArea.aStart.Col();
4148*b1cdbd2cSJim Jagielski 				SCROW nValY = (eDir == FILL_TO_TOP ) ? aDestArea.aEnd.Row() : aDestArea.aStart.Row();
4149*b1cdbd2cSJim Jagielski 				SCTAB nTab = aDestArea.aStart.Tab();
4150*b1cdbd2cSJim Jagielski 				pDoc->SetValue( nValX, nValY, nTab, fStart );
4151*b1cdbd2cSJim Jagielski 			}
4152*b1cdbd2cSJim Jagielski 			pDoc->Fill( aSourceArea.aStart.Col(), aSourceArea.aStart.Row(),
4153*b1cdbd2cSJim Jagielski 						aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aMark,
4154*b1cdbd2cSJim Jagielski 						nCount, eDir, eCmd, eDateCmd, fStep, fMax );
4155*b1cdbd2cSJim Jagielski 			AdjustRowHeight(rRange);
4156*b1cdbd2cSJim Jagielski 
4157*b1cdbd2cSJim Jagielski 			rDocShell.PostPaintGridAll();
4158*b1cdbd2cSJim Jagielski //			rDocShell.PostPaintDataChanged();
4159*b1cdbd2cSJim Jagielski 			aModificator.SetDocumentModified();
4160*b1cdbd2cSJim Jagielski 		}
4161*b1cdbd2cSJim Jagielski 
4162*b1cdbd2cSJim Jagielski 		if ( bRecord )		// Draw-Undo erst jetzt verfuegbar
4163*b1cdbd2cSJim Jagielski 		{
4164*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
4165*b1cdbd2cSJim Jagielski 				new ScUndoAutoFill( &rDocShell, aDestArea, aSourceArea, pUndoDoc, aMark,
4166*b1cdbd2cSJim Jagielski 									eDir, eCmd, eDateCmd, fStart, fStep, fMax,
4167*b1cdbd2cSJim Jagielski 									pDoc->GetRangeName()->GetSharedMaxIndex()+1 ) );
4168*b1cdbd2cSJim Jagielski 		}
4169*b1cdbd2cSJim Jagielski 
4170*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
4171*b1cdbd2cSJim Jagielski 	}
4172*b1cdbd2cSJim Jagielski 	else if (!bApi)
4173*b1cdbd2cSJim Jagielski 		rDocShell.ErrorMessage(aTester.GetMessageId());
4174*b1cdbd2cSJim Jagielski 
4175*b1cdbd2cSJim Jagielski 	return bSuccess;
4176*b1cdbd2cSJim Jagielski }
4177*b1cdbd2cSJim Jagielski 
FillAuto(ScRange & rRange,const ScMarkData * pTabMark,FillDir eDir,sal_uLong nCount,sal_Bool bRecord,sal_Bool bApi)4178*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::FillAuto( ScRange& rRange, const ScMarkData* pTabMark,
4179*b1cdbd2cSJim Jagielski 							FillDir eDir, sal_uLong nCount, sal_Bool bRecord, sal_Bool bApi )
4180*b1cdbd2cSJim Jagielski {
4181*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
4182*b1cdbd2cSJim Jagielski 
4183*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4184*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
4185*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
4186*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = rRange.aStart.Tab();
4187*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
4188*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
4189*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = rRange.aEnd.Tab();
4190*b1cdbd2cSJim Jagielski 
4191*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
4192*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
4193*b1cdbd2cSJim Jagielski 
4194*b1cdbd2cSJim Jagielski 	ScMarkData aMark;
4195*b1cdbd2cSJim Jagielski 	if (pTabMark)
4196*b1cdbd2cSJim Jagielski 		aMark = *pTabMark;
4197*b1cdbd2cSJim Jagielski 	else
4198*b1cdbd2cSJim Jagielski 	{
4199*b1cdbd2cSJim Jagielski 		for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
4200*b1cdbd2cSJim Jagielski 			aMark.SelectTable( nTab, sal_True );
4201*b1cdbd2cSJim Jagielski 	}
4202*b1cdbd2cSJim Jagielski 
4203*b1cdbd2cSJim Jagielski 	ScRange aSourceArea = rRange;
4204*b1cdbd2cSJim Jagielski 	ScRange aDestArea   = rRange;
4205*b1cdbd2cSJim Jagielski 
4206*b1cdbd2cSJim Jagielski 	FillCmd		eCmd = FILL_AUTO;
4207*b1cdbd2cSJim Jagielski 	FillDateCmd	eDateCmd = FILL_DAY;
4208*b1cdbd2cSJim Jagielski 	double		fStep = 1.0;
4209*b1cdbd2cSJim Jagielski 	double		fMax = MAXDOUBLE;
4210*b1cdbd2cSJim Jagielski 
4211*b1cdbd2cSJim Jagielski 	switch (eDir)
4212*b1cdbd2cSJim Jagielski 	{
4213*b1cdbd2cSJim Jagielski 		case FILL_TO_BOTTOM:
4214*b1cdbd2cSJim Jagielski             aDestArea.aEnd.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aEnd.Row() + nCount ) );
4215*b1cdbd2cSJim Jagielski 			break;
4216*b1cdbd2cSJim Jagielski 		case FILL_TO_TOP:
4217*b1cdbd2cSJim Jagielski             if (nCount > sal::static_int_cast<sal_uLong>( aSourceArea.aStart.Row() ))
4218*b1cdbd2cSJim Jagielski 			{
4219*b1cdbd2cSJim Jagielski 				DBG_ERROR("FillAuto: Row < 0");
4220*b1cdbd2cSJim Jagielski 				nCount = aSourceArea.aStart.Row();
4221*b1cdbd2cSJim Jagielski 			}
4222*b1cdbd2cSJim Jagielski             aDestArea.aStart.SetRow( sal::static_int_cast<SCROW>( aSourceArea.aStart.Row() - nCount ) );
4223*b1cdbd2cSJim Jagielski 			break;
4224*b1cdbd2cSJim Jagielski 		case FILL_TO_RIGHT:
4225*b1cdbd2cSJim Jagielski             aDestArea.aEnd.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aEnd.Col() + nCount ) );
4226*b1cdbd2cSJim Jagielski 			break;
4227*b1cdbd2cSJim Jagielski 		case FILL_TO_LEFT:
4228*b1cdbd2cSJim Jagielski             if (nCount > sal::static_int_cast<sal_uLong>( aSourceArea.aStart.Col() ))
4229*b1cdbd2cSJim Jagielski 			{
4230*b1cdbd2cSJim Jagielski 				DBG_ERROR("FillAuto: Col < 0");
4231*b1cdbd2cSJim Jagielski 				nCount = aSourceArea.aStart.Col();
4232*b1cdbd2cSJim Jagielski 			}
4233*b1cdbd2cSJim Jagielski             aDestArea.aStart.SetCol( sal::static_int_cast<SCCOL>( aSourceArea.aStart.Col() - nCount ) );
4234*b1cdbd2cSJim Jagielski 			break;
4235*b1cdbd2cSJim Jagielski 		default:
4236*b1cdbd2cSJim Jagielski 			DBG_ERROR("Falsche Richtung bei FillAuto");
4237*b1cdbd2cSJim Jagielski 			break;
4238*b1cdbd2cSJim Jagielski 	}
4239*b1cdbd2cSJim Jagielski 
4240*b1cdbd2cSJim Jagielski 	//		Zellschutz testen
4241*b1cdbd2cSJim Jagielski 	//!		Quellbereich darf geschuetzt sein !!!
4242*b1cdbd2cSJim Jagielski 	//!		aber kein Matrixfragment enthalten !!!
4243*b1cdbd2cSJim Jagielski 
4244*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, aDestArea );
4245*b1cdbd2cSJim Jagielski 	if ( !aTester.IsEditable() )
4246*b1cdbd2cSJim Jagielski 	{
4247*b1cdbd2cSJim Jagielski 		if (!bApi)
4248*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
4249*b1cdbd2cSJim Jagielski 		return sal_False;
4250*b1cdbd2cSJim Jagielski 	}
4251*b1cdbd2cSJim Jagielski 
4252*b1cdbd2cSJim Jagielski 	if ( pDoc->HasSelectedBlockMatrixFragment( nStartCol, nStartRow,
4253*b1cdbd2cSJim Jagielski 			nEndCol, nEndRow, aMark ) )
4254*b1cdbd2cSJim Jagielski 	{
4255*b1cdbd2cSJim Jagielski 		if (!bApi)
4256*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_MATRIXFRAGMENTERR);
4257*b1cdbd2cSJim Jagielski 		return sal_False;
4258*b1cdbd2cSJim Jagielski 	}
4259*b1cdbd2cSJim Jagielski 
4260*b1cdbd2cSJim Jagielski 	WaitObject aWait( rDocShell.GetActiveDialogParent() );
4261*b1cdbd2cSJim Jagielski 
4262*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
4263*b1cdbd2cSJim Jagielski 	if ( bRecord )
4264*b1cdbd2cSJim Jagielski 	{
4265*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
4266*b1cdbd2cSJim Jagielski         SCTAB nDestStartTab = aDestArea.aStart.Tab();
4267*b1cdbd2cSJim Jagielski 
4268*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
4269*b1cdbd2cSJim Jagielski         pUndoDoc->InitUndo( pDoc, nDestStartTab, nDestStartTab );
4270*b1cdbd2cSJim Jagielski 		for (SCTAB i=0; i<nTabCount; i++)
4271*b1cdbd2cSJim Jagielski             if (i != nDestStartTab && aMark.GetTableSelect(i))
4272*b1cdbd2cSJim Jagielski 				pUndoDoc->AddUndoTab( i, i );
4273*b1cdbd2cSJim Jagielski 
4274*b1cdbd2cSJim Jagielski         // do not clone note captions in undo document
4275*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument(
4276*b1cdbd2cSJim Jagielski 			aDestArea.aStart.Col(), aDestArea.aStart.Row(), 0,
4277*b1cdbd2cSJim Jagielski 			aDestArea.aEnd.Col(), aDestArea.aEnd.Row(), nTabCount-1,
4278*b1cdbd2cSJim Jagielski             IDF_AUTOFILL, sal_False, pUndoDoc, &aMark );
4279*b1cdbd2cSJim Jagielski 	}
4280*b1cdbd2cSJim Jagielski 
4281*b1cdbd2cSJim Jagielski 	pDoc->Fill( aSourceArea.aStart.Col(), aSourceArea.aStart.Row(),
4282*b1cdbd2cSJim Jagielski 				aSourceArea.aEnd.Col(), aSourceArea.aEnd.Row(), aMark,
4283*b1cdbd2cSJim Jagielski 				nCount, eDir, eCmd, eDateCmd, fStep, fMax );
4284*b1cdbd2cSJim Jagielski 
4285*b1cdbd2cSJim Jagielski 	AdjustRowHeight(aDestArea);
4286*b1cdbd2cSJim Jagielski 
4287*b1cdbd2cSJim Jagielski 	if ( bRecord )		// Draw-Undo erst jetzt verfuegbar
4288*b1cdbd2cSJim Jagielski 	{
4289*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
4290*b1cdbd2cSJim Jagielski 			new ScUndoAutoFill( &rDocShell, aDestArea, aSourceArea, pUndoDoc, aMark,
4291*b1cdbd2cSJim Jagielski 								eDir, eCmd, eDateCmd, MAXDOUBLE, fStep, fMax,
4292*b1cdbd2cSJim Jagielski 								pDoc->GetRangeName()->GetSharedMaxIndex()+1 ) );
4293*b1cdbd2cSJim Jagielski 	}
4294*b1cdbd2cSJim Jagielski 
4295*b1cdbd2cSJim Jagielski 	rDocShell.PostPaintGridAll();
4296*b1cdbd2cSJim Jagielski //	rDocShell.PostPaintDataChanged();
4297*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
4298*b1cdbd2cSJim Jagielski 
4299*b1cdbd2cSJim Jagielski 	rRange = aDestArea;			// Zielbereich zurueckgeben (zum Markieren)
4300*b1cdbd2cSJim Jagielski 	return sal_True;
4301*b1cdbd2cSJim Jagielski }
4302*b1cdbd2cSJim Jagielski 
4303*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
4304*b1cdbd2cSJim Jagielski 
MergeCells(const ScRange & rRange,sal_Bool bContents,sal_Bool bRecord,sal_Bool bApi)4305*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::MergeCells( const ScRange& rRange, sal_Bool bContents, sal_Bool bRecord, sal_Bool bApi )
4306*b1cdbd2cSJim Jagielski {
4307*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
4308*b1cdbd2cSJim Jagielski 
4309*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4310*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
4311*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
4312*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
4313*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
4314*b1cdbd2cSJim Jagielski 	SCTAB nTab = rRange.aStart.Tab();
4315*b1cdbd2cSJim Jagielski 
4316*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
4317*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
4318*b1cdbd2cSJim Jagielski 
4319*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nTab, nStartCol, nStartRow, nEndCol, nEndRow );
4320*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
4321*b1cdbd2cSJim Jagielski 	{
4322*b1cdbd2cSJim Jagielski 		if (!bApi)
4323*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
4324*b1cdbd2cSJim Jagielski 		return sal_False;
4325*b1cdbd2cSJim Jagielski 	}
4326*b1cdbd2cSJim Jagielski 
4327*b1cdbd2cSJim Jagielski 	if ( nStartCol == nEndCol && nStartRow == nEndRow )
4328*b1cdbd2cSJim Jagielski 	{
4329*b1cdbd2cSJim Jagielski 		// nichts zu tun
4330*b1cdbd2cSJim Jagielski 		return sal_True;
4331*b1cdbd2cSJim Jagielski 	}
4332*b1cdbd2cSJim Jagielski 
4333*b1cdbd2cSJim Jagielski 	if ( pDoc->HasAttrib( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab,
4334*b1cdbd2cSJim Jagielski 							HASATTR_MERGED | HASATTR_OVERLAPPED ) )
4335*b1cdbd2cSJim Jagielski 	{
4336*b1cdbd2cSJim Jagielski 		// "Zusammenfassen nicht verschachteln !"
4337*b1cdbd2cSJim Jagielski 		if (!bApi)
4338*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(STR_MSSG_MERGECELLS_0);
4339*b1cdbd2cSJim Jagielski 		return sal_False;
4340*b1cdbd2cSJim Jagielski 	}
4341*b1cdbd2cSJim Jagielski 
4342*b1cdbd2cSJim Jagielski 	sal_Bool bNeedContents = bContents &&
4343*b1cdbd2cSJim Jagielski 			( !pDoc->IsBlockEmpty( nTab, nStartCol,nStartRow+1, nStartCol,nEndRow, true ) ||
4344*b1cdbd2cSJim Jagielski 			  !pDoc->IsBlockEmpty( nTab, nStartCol+1,nStartRow, nEndCol,nEndRow, true ) );
4345*b1cdbd2cSJim Jagielski 
4346*b1cdbd2cSJim Jagielski     ScDocument* pUndoDoc = 0;
4347*b1cdbd2cSJim Jagielski 	if (bRecord)
4348*b1cdbd2cSJim Jagielski 	{
4349*b1cdbd2cSJim Jagielski         // test if the range contains other notes which also implies that we need an undo document
4350*b1cdbd2cSJim Jagielski         bool bHasNotes = false;
4351*b1cdbd2cSJim Jagielski         for( ScAddress aPos( nStartCol, nStartRow, nTab ); !bHasNotes && (aPos.Col() <= nEndCol); aPos.IncCol() )
4352*b1cdbd2cSJim Jagielski             for( aPos.SetRow( nStartRow ); !bHasNotes && (aPos.Row() <= nEndRow); aPos.IncRow() )
4353*b1cdbd2cSJim Jagielski                 bHasNotes = ((aPos.Col() != nStartCol) || (aPos.Row() != nStartRow)) && (pDoc->GetNote( aPos ) != 0);
4354*b1cdbd2cSJim Jagielski 
4355*b1cdbd2cSJim Jagielski 		if (bNeedContents || bHasNotes)
4356*b1cdbd2cSJim Jagielski 		{
4357*b1cdbd2cSJim Jagielski 			pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
4358*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nTab, nTab );
4359*b1cdbd2cSJim Jagielski             // note captions are collected by drawing undo
4360*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab,
4361*b1cdbd2cSJim Jagielski                                     IDF_ALL|IDF_NOCAPTIONS, sal_False, pUndoDoc );
4362*b1cdbd2cSJim Jagielski 		}
4363*b1cdbd2cSJim Jagielski         if( bHasNotes )
4364*b1cdbd2cSJim Jagielski             pDoc->BeginDrawUndo();
4365*b1cdbd2cSJim Jagielski 	}
4366*b1cdbd2cSJim Jagielski 
4367*b1cdbd2cSJim Jagielski 	if (bNeedContents)
4368*b1cdbd2cSJim Jagielski 		pDoc->DoMergeContents( nTab, nStartCol,nStartRow, nEndCol,nEndRow );
4369*b1cdbd2cSJim Jagielski 	pDoc->DoMerge( nTab, nStartCol,nStartRow, nEndCol,nEndRow );
4370*b1cdbd2cSJim Jagielski 
4371*b1cdbd2cSJim Jagielski     if( bRecord )
4372*b1cdbd2cSJim Jagielski     {
4373*b1cdbd2cSJim Jagielski         SdrUndoGroup* pDrawUndo = pDoc->GetDrawLayer() ? pDoc->GetDrawLayer()->GetCalcUndo() : 0;
4374*b1cdbd2cSJim Jagielski         rDocShell.GetUndoManager()->AddUndoAction(
4375*b1cdbd2cSJim Jagielski             new ScUndoMerge( &rDocShell,
4376*b1cdbd2cSJim Jagielski                             nStartCol, nStartRow, nTab,
4377*b1cdbd2cSJim Jagielski                             nEndCol, nEndRow, nTab, bNeedContents, pUndoDoc, pDrawUndo ) );
4378*b1cdbd2cSJim Jagielski     }
4379*b1cdbd2cSJim Jagielski 
4380*b1cdbd2cSJim Jagielski 	if ( !AdjustRowHeight( ScRange( 0,nStartRow,nTab, MAXCOL,nEndRow,nTab ) ) )
4381*b1cdbd2cSJim Jagielski 		rDocShell.PostPaint( nStartCol, nStartRow, nTab,
4382*b1cdbd2cSJim Jagielski 											nEndCol, nEndRow, nTab, PAINT_GRID );
4383*b1cdbd2cSJim Jagielski 	if (bNeedContents)
4384*b1cdbd2cSJim Jagielski 		pDoc->SetDirty( rRange );
4385*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
4386*b1cdbd2cSJim Jagielski 
4387*b1cdbd2cSJim Jagielski 	SfxBindings* pBindings = rDocShell.GetViewBindings();
4388*b1cdbd2cSJim Jagielski 	if (pBindings)
4389*b1cdbd2cSJim Jagielski 	{
4390*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( FID_MERGE_ON );
4391*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( FID_MERGE_OFF );
4392*b1cdbd2cSJim Jagielski         pBindings->Invalidate( FID_MERGE_TOGGLE );
4393*b1cdbd2cSJim Jagielski 	}
4394*b1cdbd2cSJim Jagielski 
4395*b1cdbd2cSJim Jagielski 	return sal_True;
4396*b1cdbd2cSJim Jagielski }
4397*b1cdbd2cSJim Jagielski 
UnmergeCells(const ScRange & rRange,sal_Bool bRecord,sal_Bool bApi)4398*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::UnmergeCells( const ScRange& rRange, sal_Bool bRecord, sal_Bool bApi )
4399*b1cdbd2cSJim Jagielski {
4400*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
4401*b1cdbd2cSJim Jagielski 
4402*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4403*b1cdbd2cSJim Jagielski 	SCTAB nTab = rRange.aStart.Tab();
4404*b1cdbd2cSJim Jagielski 
4405*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
4406*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
4407*b1cdbd2cSJim Jagielski 
4408*b1cdbd2cSJim Jagielski 	if ( pDoc->HasAttrib( rRange, HASATTR_MERGED ) )
4409*b1cdbd2cSJim Jagielski 	{
4410*b1cdbd2cSJim Jagielski 		ScRange aExtended = rRange;
4411*b1cdbd2cSJim Jagielski 		pDoc->ExtendMerge( aExtended );
4412*b1cdbd2cSJim Jagielski 		ScRange aRefresh = aExtended;
4413*b1cdbd2cSJim Jagielski 		pDoc->ExtendOverlapped( aRefresh );
4414*b1cdbd2cSJim Jagielski 
4415*b1cdbd2cSJim Jagielski 		if (bRecord)
4416*b1cdbd2cSJim Jagielski 		{
4417*b1cdbd2cSJim Jagielski 			ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
4418*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nTab, nTab );
4419*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument( aExtended, IDF_ATTRIB, sal_False, pUndoDoc );
4420*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->AddUndoAction(
4421*b1cdbd2cSJim Jagielski 				new ScUndoRemoveMerge( &rDocShell, rRange, pUndoDoc ) );
4422*b1cdbd2cSJim Jagielski 		}
4423*b1cdbd2cSJim Jagielski 
4424*b1cdbd2cSJim Jagielski 		const SfxPoolItem& rDefAttr = pDoc->GetPool()->GetDefaultItem( ATTR_MERGE );
4425*b1cdbd2cSJim Jagielski 		ScPatternAttr aPattern( pDoc->GetPool() );
4426*b1cdbd2cSJim Jagielski 		aPattern.GetItemSet().Put( rDefAttr );
4427*b1cdbd2cSJim Jagielski 		pDoc->ApplyPatternAreaTab( rRange.aStart.Col(), rRange.aStart.Row(),
4428*b1cdbd2cSJim Jagielski 									rRange.aEnd.Col(), rRange.aEnd.Row(), nTab,
4429*b1cdbd2cSJim Jagielski 									aPattern );
4430*b1cdbd2cSJim Jagielski 
4431*b1cdbd2cSJim Jagielski 		pDoc->RemoveFlagsTab( aExtended.aStart.Col(), aExtended.aStart.Row(),
4432*b1cdbd2cSJim Jagielski 								aExtended.aEnd.Col(), aExtended.aEnd.Row(), nTab,
4433*b1cdbd2cSJim Jagielski 								SC_MF_HOR | SC_MF_VER );
4434*b1cdbd2cSJim Jagielski 
4435*b1cdbd2cSJim Jagielski 		pDoc->ExtendMerge( aRefresh, sal_True, sal_False );
4436*b1cdbd2cSJim Jagielski 
4437*b1cdbd2cSJim Jagielski 		if ( !AdjustRowHeight( aExtended ) )
4438*b1cdbd2cSJim Jagielski 			rDocShell.PostPaint( aExtended, PAINT_GRID );
4439*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
4440*b1cdbd2cSJim Jagielski 	}
4441*b1cdbd2cSJim Jagielski 	else if (!bApi)
4442*b1cdbd2cSJim Jagielski 		Sound::Beep();		//! sal_False zurueck???
4443*b1cdbd2cSJim Jagielski 
4444*b1cdbd2cSJim Jagielski 	return sal_True;
4445*b1cdbd2cSJim Jagielski }
4446*b1cdbd2cSJim Jagielski 
4447*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
4448*b1cdbd2cSJim Jagielski 
ModifyRangeNames(const ScRangeName & rNewRanges,sal_Bool bApi)4449*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::ModifyRangeNames( const ScRangeName& rNewRanges, sal_Bool bApi )
4450*b1cdbd2cSJim Jagielski {
4451*b1cdbd2cSJim Jagielski     return SetNewRangeNames( new ScRangeName( rNewRanges ), bApi );
4452*b1cdbd2cSJim Jagielski }
4453*b1cdbd2cSJim Jagielski 
SetNewRangeNames(ScRangeName * pNewRanges,sal_Bool)4454*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, sal_Bool /* bApi */ )     // takes ownership of pNewRanges
4455*b1cdbd2cSJim Jagielski {
4456*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
4457*b1cdbd2cSJim Jagielski 
4458*b1cdbd2cSJim Jagielski     DBG_ASSERT( pNewRanges, "pNewRanges is 0" );
4459*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4460*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
4461*b1cdbd2cSJim Jagielski 
4462*b1cdbd2cSJim Jagielski 	if (bUndo)
4463*b1cdbd2cSJim Jagielski 	{
4464*b1cdbd2cSJim Jagielski 		ScRangeName* pOld = pDoc->GetRangeName();
4465*b1cdbd2cSJim Jagielski 		ScRangeName* pUndoRanges = new ScRangeName(*pOld);
4466*b1cdbd2cSJim Jagielski 		ScRangeName* pRedoRanges = new ScRangeName(*pNewRanges);
4467*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction(
4468*b1cdbd2cSJim Jagielski 			new ScUndoRangeNames( &rDocShell, pUndoRanges, pRedoRanges ) );
4469*b1cdbd2cSJim Jagielski 	}
4470*b1cdbd2cSJim Jagielski 
4471*b1cdbd2cSJim Jagielski     // #i55926# While loading XML, formula cells only have a single string token,
4472*b1cdbd2cSJim Jagielski     // so CompileNameFormula would never find any name (index) tokens, and would
4473*b1cdbd2cSJim Jagielski     // unnecessarily loop through all cells.
4474*b1cdbd2cSJim Jagielski     sal_Bool bCompile = ( !pDoc->IsImportingXML() && pDoc->GetNamedRangesLockCount() == 0 );
4475*b1cdbd2cSJim Jagielski 
4476*b1cdbd2cSJim Jagielski     if ( bCompile )
4477*b1cdbd2cSJim Jagielski         pDoc->CompileNameFormula( sal_True );	// CreateFormulaString
4478*b1cdbd2cSJim Jagielski     pDoc->SetRangeName( pNewRanges );       // takes ownership
4479*b1cdbd2cSJim Jagielski     if ( bCompile )
4480*b1cdbd2cSJim Jagielski         pDoc->CompileNameFormula( sal_False );	// CompileFormulaString
4481*b1cdbd2cSJim Jagielski 
4482*b1cdbd2cSJim Jagielski 	aModificator.SetDocumentModified();
4483*b1cdbd2cSJim Jagielski 
4484*b1cdbd2cSJim Jagielski     // #i114072# don't broadcast while loading a file
4485*b1cdbd2cSJim Jagielski     // (navigator and input line for other open documents would be notified)
4486*b1cdbd2cSJim Jagielski     if ( bCompile )
4487*b1cdbd2cSJim Jagielski         SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
4488*b1cdbd2cSJim Jagielski 
4489*b1cdbd2cSJim Jagielski 	return sal_True;
4490*b1cdbd2cSJim Jagielski }
4491*b1cdbd2cSJim Jagielski 
4492*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
4493*b1cdbd2cSJim Jagielski 
CreateOneName(ScRangeName & rList,SCCOL nPosX,SCROW nPosY,SCTAB nTab,SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2,sal_Bool & rCancel,sal_Bool bApi)4494*b1cdbd2cSJim Jagielski void ScDocFunc::CreateOneName( ScRangeName& rList,
4495*b1cdbd2cSJim Jagielski 								SCCOL nPosX, SCROW nPosY, SCTAB nTab,
4496*b1cdbd2cSJim Jagielski 								SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
4497*b1cdbd2cSJim Jagielski 								sal_Bool& rCancel, sal_Bool bApi )
4498*b1cdbd2cSJim Jagielski {
4499*b1cdbd2cSJim Jagielski 	if (rCancel)
4500*b1cdbd2cSJim Jagielski 		return;
4501*b1cdbd2cSJim Jagielski 
4502*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4503*b1cdbd2cSJim Jagielski 	if (!pDoc->HasValueData( nPosX, nPosY, nTab ))
4504*b1cdbd2cSJim Jagielski 	{
4505*b1cdbd2cSJim Jagielski 		String aName;
4506*b1cdbd2cSJim Jagielski 		pDoc->GetString( nPosX, nPosY, nTab, aName );
4507*b1cdbd2cSJim Jagielski 		ScRangeData::MakeValidName(aName);
4508*b1cdbd2cSJim Jagielski 		if (aName.Len())
4509*b1cdbd2cSJim Jagielski 		{
4510*b1cdbd2cSJim Jagielski 			String aContent;
4511*b1cdbd2cSJim Jagielski             ScRange( nX1, nY1, nTab, nX2, nY2, nTab ).Format( aContent, SCR_ABS_3D, pDoc );
4512*b1cdbd2cSJim Jagielski 
4513*b1cdbd2cSJim Jagielski 			sal_Bool bInsert = sal_False;
4514*b1cdbd2cSJim Jagielski 			sal_uInt16 nOldPos;
4515*b1cdbd2cSJim Jagielski 			if (rList.SearchName( aName, nOldPos ))			// vorhanden ?
4516*b1cdbd2cSJim Jagielski 			{
4517*b1cdbd2cSJim Jagielski 				ScRangeData* pOld = rList[nOldPos];
4518*b1cdbd2cSJim Jagielski 				String aOldStr;
4519*b1cdbd2cSJim Jagielski 				pOld->GetSymbol( aOldStr );
4520*b1cdbd2cSJim Jagielski 				if (aOldStr != aContent)
4521*b1cdbd2cSJim Jagielski 				{
4522*b1cdbd2cSJim Jagielski 					if (bApi)
4523*b1cdbd2cSJim Jagielski 						bInsert = sal_True;		// per API nicht nachfragen
4524*b1cdbd2cSJim Jagielski 					else
4525*b1cdbd2cSJim Jagielski 					{
4526*b1cdbd2cSJim Jagielski 						String aTemplate = ScGlobal::GetRscString( STR_CREATENAME_REPLACE );
4527*b1cdbd2cSJim Jagielski 
4528*b1cdbd2cSJim Jagielski 						String aMessage = aTemplate.GetToken( 0, '#' );
4529*b1cdbd2cSJim Jagielski 						aMessage += aName;
4530*b1cdbd2cSJim Jagielski 						aMessage += aTemplate.GetToken( 1, '#' );
4531*b1cdbd2cSJim Jagielski 
4532*b1cdbd2cSJim Jagielski 						short nResult = QueryBox( rDocShell.GetActiveDialogParent(),
4533*b1cdbd2cSJim Jagielski 													WinBits(WB_YES_NO_CANCEL | WB_DEF_YES),
4534*b1cdbd2cSJim Jagielski 													aMessage ).Execute();
4535*b1cdbd2cSJim Jagielski 						if ( nResult == RET_YES )
4536*b1cdbd2cSJim Jagielski 						{
4537*b1cdbd2cSJim Jagielski 							rList.AtFree(nOldPos);
4538*b1cdbd2cSJim Jagielski 							bInsert = sal_True;
4539*b1cdbd2cSJim Jagielski 						}
4540*b1cdbd2cSJim Jagielski 						else if ( nResult == RET_CANCEL )
4541*b1cdbd2cSJim Jagielski 							rCancel = sal_True;
4542*b1cdbd2cSJim Jagielski 					}
4543*b1cdbd2cSJim Jagielski 				}
4544*b1cdbd2cSJim Jagielski 			}
4545*b1cdbd2cSJim Jagielski 			else
4546*b1cdbd2cSJim Jagielski 				bInsert = sal_True;
4547*b1cdbd2cSJim Jagielski 
4548*b1cdbd2cSJim Jagielski 			if (bInsert)
4549*b1cdbd2cSJim Jagielski 			{
4550*b1cdbd2cSJim Jagielski                 ScRangeData* pData = new ScRangeData( pDoc, aName, aContent,
4551*b1cdbd2cSJim Jagielski                         ScAddress( nPosX, nPosY, nTab));
4552*b1cdbd2cSJim Jagielski 				if (!rList.Insert(pData))
4553*b1cdbd2cSJim Jagielski 				{
4554*b1cdbd2cSJim Jagielski 					DBG_ERROR("nanu?");
4555*b1cdbd2cSJim Jagielski 					delete pData;
4556*b1cdbd2cSJim Jagielski 				}
4557*b1cdbd2cSJim Jagielski 			}
4558*b1cdbd2cSJim Jagielski 		}
4559*b1cdbd2cSJim Jagielski 	}
4560*b1cdbd2cSJim Jagielski }
4561*b1cdbd2cSJim Jagielski 
CreateNames(const ScRange & rRange,sal_uInt16 nFlags,sal_Bool bApi)4562*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::CreateNames( const ScRange& rRange, sal_uInt16 nFlags, sal_Bool bApi )
4563*b1cdbd2cSJim Jagielski {
4564*b1cdbd2cSJim Jagielski 	if (!nFlags)
4565*b1cdbd2cSJim Jagielski 		return sal_False;		// war nix
4566*b1cdbd2cSJim Jagielski 
4567*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
4568*b1cdbd2cSJim Jagielski 
4569*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
4570*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rRange.aStart.Col();
4571*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rRange.aStart.Row();
4572*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = rRange.aEnd.Col();
4573*b1cdbd2cSJim Jagielski 	SCROW nEndRow = rRange.aEnd.Row();
4574*b1cdbd2cSJim Jagielski 	SCTAB nTab = rRange.aStart.Tab();
4575*b1cdbd2cSJim Jagielski 	DBG_ASSERT(rRange.aEnd.Tab() == nTab, "CreateNames: mehrere Tabellen geht nicht");
4576*b1cdbd2cSJim Jagielski 
4577*b1cdbd2cSJim Jagielski 	sal_Bool bValid = sal_True;
4578*b1cdbd2cSJim Jagielski 	if ( nFlags & ( NAME_TOP | NAME_BOTTOM ) )
4579*b1cdbd2cSJim Jagielski 		if ( nStartRow == nEndRow )
4580*b1cdbd2cSJim Jagielski 			bValid = sal_False;
4581*b1cdbd2cSJim Jagielski 	if ( nFlags & ( NAME_LEFT | NAME_RIGHT ) )
4582*b1cdbd2cSJim Jagielski 		if ( nStartCol == nEndCol )
4583*b1cdbd2cSJim Jagielski 			bValid = sal_False;
4584*b1cdbd2cSJim Jagielski 
4585*b1cdbd2cSJim Jagielski 	if (bValid)
4586*b1cdbd2cSJim Jagielski 	{
4587*b1cdbd2cSJim Jagielski 		ScDocument* pDoc = rDocShell.GetDocument();
4588*b1cdbd2cSJim Jagielski 		ScRangeName* pNames = pDoc->GetRangeName();
4589*b1cdbd2cSJim Jagielski 		if (!pNames)
4590*b1cdbd2cSJim Jagielski 			return sal_False;	// soll nicht sein
4591*b1cdbd2cSJim Jagielski 		ScRangeName aNewRanges( *pNames );
4592*b1cdbd2cSJim Jagielski 
4593*b1cdbd2cSJim Jagielski 		sal_Bool bTop    = ( ( nFlags & NAME_TOP ) != 0 );
4594*b1cdbd2cSJim Jagielski 		sal_Bool bLeft   = ( ( nFlags & NAME_LEFT ) != 0 );
4595*b1cdbd2cSJim Jagielski 		sal_Bool bBottom = ( ( nFlags & NAME_BOTTOM ) != 0 );
4596*b1cdbd2cSJim Jagielski 		sal_Bool bRight  = ( ( nFlags & NAME_RIGHT ) != 0 );
4597*b1cdbd2cSJim Jagielski 
4598*b1cdbd2cSJim Jagielski 		SCCOL nContX1 = nStartCol;
4599*b1cdbd2cSJim Jagielski 		SCROW nContY1 = nStartRow;
4600*b1cdbd2cSJim Jagielski 		SCCOL nContX2 = nEndCol;
4601*b1cdbd2cSJim Jagielski 		SCROW nContY2 = nEndRow;
4602*b1cdbd2cSJim Jagielski 
4603*b1cdbd2cSJim Jagielski 		if ( bTop )
4604*b1cdbd2cSJim Jagielski 			++nContY1;
4605*b1cdbd2cSJim Jagielski 		if ( bLeft )
4606*b1cdbd2cSJim Jagielski 			++nContX1;
4607*b1cdbd2cSJim Jagielski 		if ( bBottom )
4608*b1cdbd2cSJim Jagielski 			--nContY2;
4609*b1cdbd2cSJim Jagielski 		if ( bRight )
4610*b1cdbd2cSJim Jagielski 			--nContX2;
4611*b1cdbd2cSJim Jagielski 
4612*b1cdbd2cSJim Jagielski 		sal_Bool bCancel = sal_False;
4613*b1cdbd2cSJim Jagielski         SCCOL i;
4614*b1cdbd2cSJim Jagielski         SCROW j;
4615*b1cdbd2cSJim Jagielski 
4616*b1cdbd2cSJim Jagielski 		if ( bTop )
4617*b1cdbd2cSJim Jagielski 			for (i=nContX1; i<=nContX2; i++)
4618*b1cdbd2cSJim Jagielski 				CreateOneName( aNewRanges, i,nStartRow,nTab, i,nContY1,i,nContY2, bCancel, bApi );
4619*b1cdbd2cSJim Jagielski 		if ( bLeft )
4620*b1cdbd2cSJim Jagielski 			for (j=nContY1; j<=nContY2; j++)
4621*b1cdbd2cSJim Jagielski 				CreateOneName( aNewRanges, nStartCol,j,nTab, nContX1,j,nContX2,j, bCancel, bApi );
4622*b1cdbd2cSJim Jagielski 		if ( bBottom )
4623*b1cdbd2cSJim Jagielski 			for (i=nContX1; i<=nContX2; i++)
4624*b1cdbd2cSJim Jagielski 				CreateOneName( aNewRanges, i,nEndRow,nTab, i,nContY1,i,nContY2, bCancel, bApi );
4625*b1cdbd2cSJim Jagielski 		if ( bRight )
4626*b1cdbd2cSJim Jagielski 			for (j=nContY1; j<=nContY2; j++)
4627*b1cdbd2cSJim Jagielski 				CreateOneName( aNewRanges, nEndCol,j,nTab, nContX1,j,nContX2,j, bCancel, bApi );
4628*b1cdbd2cSJim Jagielski 
4629*b1cdbd2cSJim Jagielski 		if ( bTop && bLeft )
4630*b1cdbd2cSJim Jagielski 			CreateOneName( aNewRanges, nStartCol,nStartRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi );
4631*b1cdbd2cSJim Jagielski 		if ( bTop && bRight )
4632*b1cdbd2cSJim Jagielski 			CreateOneName( aNewRanges, nEndCol,nStartRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi );
4633*b1cdbd2cSJim Jagielski 		if ( bBottom && bLeft )
4634*b1cdbd2cSJim Jagielski 			CreateOneName( aNewRanges, nStartCol,nEndRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi );
4635*b1cdbd2cSJim Jagielski 		if ( bBottom && bRight )
4636*b1cdbd2cSJim Jagielski 			CreateOneName( aNewRanges, nEndCol,nEndRow,nTab, nContX1,nContY1,nContX2,nContY2, bCancel, bApi );
4637*b1cdbd2cSJim Jagielski 
4638*b1cdbd2cSJim Jagielski 		bDone = ModifyRangeNames( aNewRanges, bApi );
4639*b1cdbd2cSJim Jagielski 
4640*b1cdbd2cSJim Jagielski 		aModificator.SetDocumentModified();
4641*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
4642*b1cdbd2cSJim Jagielski 	}
4643*b1cdbd2cSJim Jagielski 
4644*b1cdbd2cSJim Jagielski 	return bDone;
4645*b1cdbd2cSJim Jagielski }
4646*b1cdbd2cSJim Jagielski 
4647*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
4648*b1cdbd2cSJim Jagielski 
InsertNameList(const ScAddress & rStartPos,sal_Bool bApi)4649*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::InsertNameList( const ScAddress& rStartPos, sal_Bool bApi )
4650*b1cdbd2cSJim Jagielski {
4651*b1cdbd2cSJim Jagielski 	ScDocShellModificator aModificator( rDocShell );
4652*b1cdbd2cSJim Jagielski 
4653*b1cdbd2cSJim Jagielski 
4654*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
4655*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4656*b1cdbd2cSJim Jagielski 	const sal_Bool bRecord = pDoc->IsUndoEnabled();
4657*b1cdbd2cSJim Jagielski 	SCTAB nTab = rStartPos.Tab();
4658*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
4659*b1cdbd2cSJim Jagielski 
4660*b1cdbd2cSJim Jagielski 	ScRangeName* pList = pDoc->GetRangeName();
4661*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = pList->GetCount();
4662*b1cdbd2cSJim Jagielski 	sal_uInt16 nValidCount = 0;
4663*b1cdbd2cSJim Jagielski 	sal_uInt16 i;
4664*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount; i++)
4665*b1cdbd2cSJim Jagielski 	{
4666*b1cdbd2cSJim Jagielski 		ScRangeData* pData = (*pList)[i];
4667*b1cdbd2cSJim Jagielski 		if ( !pData->HasType( RT_DATABASE ) && !pData->HasType( RT_SHARED ) )
4668*b1cdbd2cSJim Jagielski 			++nValidCount;
4669*b1cdbd2cSJim Jagielski 	}
4670*b1cdbd2cSJim Jagielski 
4671*b1cdbd2cSJim Jagielski 	if (nValidCount)
4672*b1cdbd2cSJim Jagielski 	{
4673*b1cdbd2cSJim Jagielski 		SCCOL nStartCol = rStartPos.Col();
4674*b1cdbd2cSJim Jagielski 		SCROW nStartRow = rStartPos.Row();
4675*b1cdbd2cSJim Jagielski 		SCCOL nEndCol = nStartCol + 1;
4676*b1cdbd2cSJim Jagielski 		SCROW nEndRow = nStartRow + static_cast<SCROW>(nValidCount) - 1;
4677*b1cdbd2cSJim Jagielski 
4678*b1cdbd2cSJim Jagielski 		ScEditableTester aTester( pDoc, nTab, nStartCol,nStartRow, nEndCol,nEndRow );
4679*b1cdbd2cSJim Jagielski 		if (aTester.IsEditable())
4680*b1cdbd2cSJim Jagielski 		{
4681*b1cdbd2cSJim Jagielski 			if (bRecord)
4682*b1cdbd2cSJim Jagielski 			{
4683*b1cdbd2cSJim Jagielski 				pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
4684*b1cdbd2cSJim Jagielski 				pUndoDoc->InitUndo( pDoc, nTab, nTab );
4685*b1cdbd2cSJim Jagielski 				pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab,
4686*b1cdbd2cSJim Jagielski 										IDF_ALL, sal_False, pUndoDoc );
4687*b1cdbd2cSJim Jagielski 
4688*b1cdbd2cSJim Jagielski 				pDoc->BeginDrawUndo();		// wegen Hoehenanpassung
4689*b1cdbd2cSJim Jagielski 			}
4690*b1cdbd2cSJim Jagielski 
4691*b1cdbd2cSJim Jagielski 			ScRangeData** ppSortArray = new ScRangeData* [ nValidCount ];
4692*b1cdbd2cSJim Jagielski 			sal_uInt16 j = 0;
4693*b1cdbd2cSJim Jagielski 			for (i=0; i<nCount; i++)
4694*b1cdbd2cSJim Jagielski 			{
4695*b1cdbd2cSJim Jagielski 				ScRangeData* pData = (*pList)[i];
4696*b1cdbd2cSJim Jagielski 				if ( !pData->HasType( RT_DATABASE ) && !pData->HasType( RT_SHARED ) )
4697*b1cdbd2cSJim Jagielski 					ppSortArray[j++] = pData;
4698*b1cdbd2cSJim Jagielski 			}
4699*b1cdbd2cSJim Jagielski #ifndef ICC
4700*b1cdbd2cSJim Jagielski 			qsort( (void*)ppSortArray, nValidCount, sizeof(ScRangeData*),
4701*b1cdbd2cSJim Jagielski 				&ScRangeData_QsortNameCompare );
4702*b1cdbd2cSJim Jagielski #else
4703*b1cdbd2cSJim Jagielski 			qsort( (void*)ppSortArray, nValidCount, sizeof(ScRangeData*),
4704*b1cdbd2cSJim Jagielski 				ICCQsortNameCompare );
4705*b1cdbd2cSJim Jagielski #endif
4706*b1cdbd2cSJim Jagielski 			String aName;
4707*b1cdbd2cSJim Jagielski 			rtl::OUStringBuffer aContent;
4708*b1cdbd2cSJim Jagielski 			String aFormula;
4709*b1cdbd2cSJim Jagielski 			SCROW nOutRow = nStartRow;
4710*b1cdbd2cSJim Jagielski 			for (j=0; j<nValidCount; j++)
4711*b1cdbd2cSJim Jagielski 			{
4712*b1cdbd2cSJim Jagielski 				ScRangeData* pData = ppSortArray[j];
4713*b1cdbd2cSJim Jagielski 				pData->GetName(aName);
4714*b1cdbd2cSJim Jagielski 				// relative Referenzen Excel-konform auf die linke Spalte anpassen:
4715*b1cdbd2cSJim Jagielski 				pData->UpdateSymbol(aContent, ScAddress( nStartCol, nOutRow, nTab ));
4716*b1cdbd2cSJim Jagielski 				aFormula = '=';
4717*b1cdbd2cSJim Jagielski 				aFormula += aContent;
4718*b1cdbd2cSJim Jagielski 				pDoc->PutCell( nStartCol,nOutRow,nTab, new ScStringCell( aName ) );
4719*b1cdbd2cSJim Jagielski 				pDoc->PutCell( nEndCol  ,nOutRow,nTab, new ScStringCell( aFormula ) );
4720*b1cdbd2cSJim Jagielski 				++nOutRow;
4721*b1cdbd2cSJim Jagielski 			}
4722*b1cdbd2cSJim Jagielski 
4723*b1cdbd2cSJim Jagielski 			delete [] ppSortArray;
4724*b1cdbd2cSJim Jagielski 
4725*b1cdbd2cSJim Jagielski 			if (bRecord)
4726*b1cdbd2cSJim Jagielski 			{
4727*b1cdbd2cSJim Jagielski 				ScDocument* pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
4728*b1cdbd2cSJim Jagielski 				pRedoDoc->InitUndo( pDoc, nTab, nTab );
4729*b1cdbd2cSJim Jagielski 				pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab,
4730*b1cdbd2cSJim Jagielski 										IDF_ALL, sal_False, pRedoDoc );
4731*b1cdbd2cSJim Jagielski 
4732*b1cdbd2cSJim Jagielski 				rDocShell.GetUndoManager()->AddUndoAction(
4733*b1cdbd2cSJim Jagielski 					new ScUndoListNames( &rDocShell,
4734*b1cdbd2cSJim Jagielski 								ScRange( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab ),
4735*b1cdbd2cSJim Jagielski 								pUndoDoc, pRedoDoc ) );
4736*b1cdbd2cSJim Jagielski 			}
4737*b1cdbd2cSJim Jagielski 
4738*b1cdbd2cSJim Jagielski 			if (!AdjustRowHeight(ScRange(0,nStartRow,nTab,MAXCOL,nEndRow,nTab)))
4739*b1cdbd2cSJim Jagielski 				rDocShell.PostPaint( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab, PAINT_GRID );
4740*b1cdbd2cSJim Jagielski //!			rDocShell.UpdateOle(GetViewData());
4741*b1cdbd2cSJim Jagielski 			aModificator.SetDocumentModified();
4742*b1cdbd2cSJim Jagielski 			bDone = sal_True;
4743*b1cdbd2cSJim Jagielski 		}
4744*b1cdbd2cSJim Jagielski 		else if (!bApi)
4745*b1cdbd2cSJim Jagielski 			rDocShell.ErrorMessage(aTester.GetMessageId());
4746*b1cdbd2cSJim Jagielski 	}
4747*b1cdbd2cSJim Jagielski 	return bDone;
4748*b1cdbd2cSJim Jagielski }
4749*b1cdbd2cSJim Jagielski 
4750*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
4751*b1cdbd2cSJim Jagielski 
ResizeMatrix(const ScRange & rOldRange,const ScAddress & rNewEnd,sal_Bool bApi)4752*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::ResizeMatrix( const ScRange& rOldRange, const ScAddress& rNewEnd, sal_Bool bApi )
4753*b1cdbd2cSJim Jagielski {
4754*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4755*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = rOldRange.aStart.Col();
4756*b1cdbd2cSJim Jagielski 	SCROW nStartRow = rOldRange.aStart.Row();
4757*b1cdbd2cSJim Jagielski 	SCTAB nTab = rOldRange.aStart.Tab();
4758*b1cdbd2cSJim Jagielski 
4759*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
4760*b1cdbd2cSJim Jagielski 
4761*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
4762*b1cdbd2cSJim Jagielski 
4763*b1cdbd2cSJim Jagielski 	String aFormula;
4764*b1cdbd2cSJim Jagielski 	pDoc->GetFormula( nStartCol, nStartRow, nTab, aFormula );
4765*b1cdbd2cSJim Jagielski 	if ( aFormula.GetChar(0) == '{' && aFormula.GetChar(aFormula.Len()-1) == '}' )
4766*b1cdbd2cSJim Jagielski 	{
4767*b1cdbd2cSJim Jagielski 		String aUndo = ScGlobal::GetRscString( STR_UNDO_RESIZEMATRIX );
4768*b1cdbd2cSJim Jagielski 		if (bUndo)
4769*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo );
4770*b1cdbd2cSJim Jagielski 
4771*b1cdbd2cSJim Jagielski 		aFormula.Erase(0,1);
4772*b1cdbd2cSJim Jagielski 		aFormula.Erase(aFormula.Len()-1,1);
4773*b1cdbd2cSJim Jagielski 
4774*b1cdbd2cSJim Jagielski 		ScMarkData aMark;
4775*b1cdbd2cSJim Jagielski 		aMark.SetMarkArea( rOldRange );
4776*b1cdbd2cSJim Jagielski 		aMark.SelectTable( nTab, sal_True );
4777*b1cdbd2cSJim Jagielski 		ScRange aNewRange( rOldRange.aStart, rNewEnd );
4778*b1cdbd2cSJim Jagielski 
4779*b1cdbd2cSJim Jagielski 		if ( DeleteContents( aMark, IDF_CONTENTS, sal_True, bApi ) )
4780*b1cdbd2cSJim Jagielski 		{
4781*b1cdbd2cSJim Jagielski             // GRAM_PODF_A1 for API compatibility.
4782*b1cdbd2cSJim Jagielski             bRet = EnterMatrix( aNewRange, &aMark, NULL, aFormula, bApi, sal_False, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
4783*b1cdbd2cSJim Jagielski 			if (!bRet)
4784*b1cdbd2cSJim Jagielski 			{
4785*b1cdbd2cSJim Jagielski 				//	versuchen, alten Zustand wiederherzustellen
4786*b1cdbd2cSJim Jagielski                 EnterMatrix( rOldRange, &aMark, NULL, aFormula, bApi, sal_False, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
4787*b1cdbd2cSJim Jagielski 			}
4788*b1cdbd2cSJim Jagielski 		}
4789*b1cdbd2cSJim Jagielski 
4790*b1cdbd2cSJim Jagielski 		if (bUndo)
4791*b1cdbd2cSJim Jagielski 			rDocShell.GetUndoManager()->LeaveListAction();
4792*b1cdbd2cSJim Jagielski 	}
4793*b1cdbd2cSJim Jagielski 
4794*b1cdbd2cSJim Jagielski 	return bRet;
4795*b1cdbd2cSJim Jagielski }
4796*b1cdbd2cSJim Jagielski 
4797*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
4798*b1cdbd2cSJim Jagielski 
InsertAreaLink(const String & rFile,const String & rFilter,const String & rOptions,const String & rSource,const ScRange & rDestRange,sal_uLong nRefresh,sal_Bool bFitBlock,sal_Bool bApi)4799*b1cdbd2cSJim Jagielski sal_Bool ScDocFunc::InsertAreaLink( const String& rFile, const String& rFilter,
4800*b1cdbd2cSJim Jagielski 								const String& rOptions, const String& rSource,
4801*b1cdbd2cSJim Jagielski 								const ScRange& rDestRange, sal_uLong nRefresh,
4802*b1cdbd2cSJim Jagielski                                 sal_Bool bFitBlock, sal_Bool bApi )
4803*b1cdbd2cSJim Jagielski {
4804*b1cdbd2cSJim Jagielski 	//!	auch fuer ScViewFunc::InsertAreaLink benutzen!
4805*b1cdbd2cSJim Jagielski 
4806*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = rDocShell.GetDocument();
4807*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
4808*b1cdbd2cSJim Jagielski 
4809*b1cdbd2cSJim Jagielski     sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
4810*b1cdbd2cSJim Jagielski 
4811*b1cdbd2cSJim Jagielski     //  #i52120# if other area links exist at the same start position,
4812*b1cdbd2cSJim Jagielski     //  remove them first (file format specifies only one link definition
4813*b1cdbd2cSJim Jagielski     //  for a cell)
4814*b1cdbd2cSJim Jagielski 
4815*b1cdbd2cSJim Jagielski     sal_uInt16 nLinkCount = pLinkManager->GetLinks().Count();
4816*b1cdbd2cSJim Jagielski     sal_uInt16 nRemoved = 0;
4817*b1cdbd2cSJim Jagielski     sal_uInt16 nLinkPos = 0;
4818*b1cdbd2cSJim Jagielski     while (nLinkPos<nLinkCount)
4819*b1cdbd2cSJim Jagielski     {
4820*b1cdbd2cSJim Jagielski         ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[nLinkPos];
4821*b1cdbd2cSJim Jagielski         if ( pBase->ISA(ScAreaLink) &&
4822*b1cdbd2cSJim Jagielski              static_cast<ScAreaLink*>(pBase)->GetDestArea().aStart == rDestRange.aStart )
4823*b1cdbd2cSJim Jagielski         {
4824*b1cdbd2cSJim Jagielski             if ( bUndo )
4825*b1cdbd2cSJim Jagielski             {
4826*b1cdbd2cSJim Jagielski                 if ( !nRemoved )
4827*b1cdbd2cSJim Jagielski                 {
4828*b1cdbd2cSJim Jagielski                     // group all remove and the insert action
4829*b1cdbd2cSJim Jagielski                     String aUndo = ScGlobal::GetRscString( STR_UNDO_INSERTAREALINK );
4830*b1cdbd2cSJim Jagielski                     rDocShell.GetUndoManager()->EnterListAction( aUndo, aUndo );
4831*b1cdbd2cSJim Jagielski                 }
4832*b1cdbd2cSJim Jagielski 
4833*b1cdbd2cSJim Jagielski                 ScAreaLink* pOldArea = static_cast<ScAreaLink*>(pBase);
4834*b1cdbd2cSJim Jagielski                 rDocShell.GetUndoManager()->AddUndoAction(
4835*b1cdbd2cSJim Jagielski                     new ScUndoRemoveAreaLink( &rDocShell,
4836*b1cdbd2cSJim Jagielski                         pOldArea->GetFile(), pOldArea->GetFilter(), pOldArea->GetOptions(),
4837*b1cdbd2cSJim Jagielski                         pOldArea->GetSource(), pOldArea->GetDestArea(), pOldArea->GetRefreshDelay() ) );
4838*b1cdbd2cSJim Jagielski             }
4839*b1cdbd2cSJim Jagielski             pLinkManager->Remove( pBase );
4840*b1cdbd2cSJim Jagielski             nLinkCount = pLinkManager->GetLinks().Count();
4841*b1cdbd2cSJim Jagielski             ++nRemoved;
4842*b1cdbd2cSJim Jagielski         }
4843*b1cdbd2cSJim Jagielski         else
4844*b1cdbd2cSJim Jagielski             ++nLinkPos;
4845*b1cdbd2cSJim Jagielski     }
4846*b1cdbd2cSJim Jagielski 
4847*b1cdbd2cSJim Jagielski 	String aFilterName = rFilter;
4848*b1cdbd2cSJim Jagielski 	String aNewOptions = rOptions;
4849*b1cdbd2cSJim Jagielski 	if (!aFilterName.Len())
4850*b1cdbd2cSJim Jagielski         ScDocumentLoader::GetFilterName( rFile, aFilterName, aNewOptions, sal_True, !bApi );
4851*b1cdbd2cSJim Jagielski 
4852*b1cdbd2cSJim Jagielski 	//	remove application prefix from filter name here, so the filter options
4853*b1cdbd2cSJim Jagielski 	//	aren't reset when the filter name is changed in ScAreaLink::DataChanged
4854*b1cdbd2cSJim Jagielski 	ScDocumentLoader::RemoveAppPrefix( aFilterName );
4855*b1cdbd2cSJim Jagielski 
4856*b1cdbd2cSJim Jagielski 	ScAreaLink* pLink = new ScAreaLink( &rDocShell, rFile, aFilterName,
4857*b1cdbd2cSJim Jagielski 										aNewOptions, rSource, rDestRange, nRefresh );
4858*b1cdbd2cSJim Jagielski 	pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, rFile, &aFilterName, &rSource );
4859*b1cdbd2cSJim Jagielski 
4860*b1cdbd2cSJim Jagielski 	//	Undo fuer den leeren Link
4861*b1cdbd2cSJim Jagielski 
4862*b1cdbd2cSJim Jagielski 	if (bUndo)
4863*b1cdbd2cSJim Jagielski     {
4864*b1cdbd2cSJim Jagielski 		rDocShell.GetUndoManager()->AddUndoAction( new ScUndoInsertAreaLink( &rDocShell,
4865*b1cdbd2cSJim Jagielski 													rFile, aFilterName, aNewOptions,
4866*b1cdbd2cSJim Jagielski 													rSource, rDestRange, nRefresh ) );
4867*b1cdbd2cSJim Jagielski         if ( nRemoved )
4868*b1cdbd2cSJim Jagielski             rDocShell.GetUndoManager()->LeaveListAction();  // undo for link update is still separate
4869*b1cdbd2cSJim Jagielski     }
4870*b1cdbd2cSJim Jagielski 
4871*b1cdbd2cSJim Jagielski 	//	Update hat sein eigenes Undo
4872*b1cdbd2cSJim Jagielski     if (pDoc->IsExecuteLinkEnabled())
4873*b1cdbd2cSJim Jagielski     {
4874*b1cdbd2cSJim Jagielski         pLink->SetDoInsert(bFitBlock);	// beim ersten Update ggf. nichts einfuegen
4875*b1cdbd2cSJim Jagielski         pLink->Update();				// kein SetInCreate -> Update ausfuehren
4876*b1cdbd2cSJim Jagielski     }
4877*b1cdbd2cSJim Jagielski 	pLink->SetDoInsert(sal_True);		// Default = sal_True
4878*b1cdbd2cSJim Jagielski 
4879*b1cdbd2cSJim Jagielski 	SfxBindings* pBindings = rDocShell.GetViewBindings();
4880*b1cdbd2cSJim Jagielski 	if (pBindings)
4881*b1cdbd2cSJim Jagielski 		pBindings->Invalidate( SID_LINKS );
4882*b1cdbd2cSJim Jagielski 
4883*b1cdbd2cSJim Jagielski 	SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );		// Navigator
4884*b1cdbd2cSJim Jagielski 
4885*b1cdbd2cSJim Jagielski 	return sal_True;
4886*b1cdbd2cSJim Jagielski }
4887*b1cdbd2cSJim Jagielski 
4888*b1cdbd2cSJim Jagielski 
4889*b1cdbd2cSJim Jagielski 
4890*b1cdbd2cSJim Jagielski 
4891