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