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