1*b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*b3f79822SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*b3f79822SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*b3f79822SAndrew Rist * distributed with this work for additional information
6*b3f79822SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*b3f79822SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*b3f79822SAndrew Rist * "License"); you may not use this file except in compliance
9*b3f79822SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*b3f79822SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*b3f79822SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*b3f79822SAndrew Rist * software distributed under the License is distributed on an
15*b3f79822SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b3f79822SAndrew Rist * KIND, either express or implied. See the License for the
17*b3f79822SAndrew Rist * specific language governing permissions and limitations
18*b3f79822SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*b3f79822SAndrew Rist *************************************************************/
21*b3f79822SAndrew Rist
22*b3f79822SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir
29cdf0e10cSrcweir //------------------------------------------------------------------
30cdf0e10cSrcweir
31cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
32cdf0e10cSrcweir
33cdf0e10cSrcweir #include "scitems.hxx"
34cdf0e10cSrcweir #include <vcl/virdev.hxx>
35cdf0e10cSrcweir #include <vcl/waitobj.hxx>
36cdf0e10cSrcweir #include <editeng/boxitem.hxx>
37cdf0e10cSrcweir #include <sfx2/app.hxx>
38cdf0e10cSrcweir
39cdf0e10cSrcweir #include "undoblk.hxx"
40cdf0e10cSrcweir #include "undoutil.hxx"
41cdf0e10cSrcweir #include "document.hxx"
42cdf0e10cSrcweir #include "patattr.hxx"
43cdf0e10cSrcweir #include "docsh.hxx"
44cdf0e10cSrcweir #include "tabvwsh.hxx"
45cdf0e10cSrcweir #include "rangenam.hxx"
46cdf0e10cSrcweir #include "rangeutl.hxx"
47cdf0e10cSrcweir #include "dbcolect.hxx"
48cdf0e10cSrcweir #include "stlpool.hxx"
49cdf0e10cSrcweir #include "stlsheet.hxx"
50cdf0e10cSrcweir #include "globstr.hrc"
51cdf0e10cSrcweir #include "global.hxx"
52cdf0e10cSrcweir #include "target.hxx"
53cdf0e10cSrcweir #include "docpool.hxx"
54cdf0e10cSrcweir #include "docfunc.hxx"
55cdf0e10cSrcweir #include "attrib.hxx"
56cdf0e10cSrcweir #include "chgtrack.hxx"
57cdf0e10cSrcweir #include "transobj.hxx"
58cdf0e10cSrcweir #include "refundo.hxx"
59cdf0e10cSrcweir #include "undoolk.hxx"
60cdf0e10cSrcweir #include "clipparam.hxx"
61cdf0e10cSrcweir #include "sc.hrc"
62cdf0e10cSrcweir
63cdf0e10cSrcweir
64cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
65cdf0e10cSrcweir
66cdf0e10cSrcweir TYPEINIT1(ScUndoInsertCells, SfxUndoAction);
67cdf0e10cSrcweir TYPEINIT1(ScUndoDeleteCells, SfxUndoAction);
68cdf0e10cSrcweir TYPEINIT1(ScUndoDeleteMulti, SfxUndoAction);
69cdf0e10cSrcweir TYPEINIT1(ScUndoCut, ScBlockUndo);
70cdf0e10cSrcweir TYPEINIT1(ScUndoPaste, SfxUndoAction);
71cdf0e10cSrcweir TYPEINIT1(ScUndoDragDrop, SfxUndoAction);
72cdf0e10cSrcweir TYPEINIT1(ScUndoListNames, SfxUndoAction);
73cdf0e10cSrcweir TYPEINIT1(ScUndoUseScenario, SfxUndoAction);
74cdf0e10cSrcweir TYPEINIT1(ScUndoSelectionStyle, SfxUndoAction);
75cdf0e10cSrcweir TYPEINIT1(ScUndoEnterMatrix, ScBlockUndo);
76cdf0e10cSrcweir TYPEINIT1(ScUndoIndent, ScBlockUndo);
77cdf0e10cSrcweir TYPEINIT1(ScUndoTransliterate, ScBlockUndo);
78cdf0e10cSrcweir TYPEINIT1(ScUndoClearItems, ScBlockUndo);
79cdf0e10cSrcweir TYPEINIT1(ScUndoRemoveBreaks, SfxUndoAction);
80cdf0e10cSrcweir TYPEINIT1(ScUndoRemoveMerge, ScBlockUndo);
81cdf0e10cSrcweir TYPEINIT1(ScUndoBorder, ScBlockUndo);
82cdf0e10cSrcweir
83cdf0e10cSrcweir
84cdf0e10cSrcweir
85cdf0e10cSrcweir // To Do:
86cdf0e10cSrcweir /*A*/ // SetOptimalHeight auf Dokument, wenn keine View
87cdf0e10cSrcweir /*B*/ // gelinkte Tabellen
88cdf0e10cSrcweir /*C*/ // ScArea
89cdf0e10cSrcweir //? // spaeter mal pruefen
90cdf0e10cSrcweir
91cdf0e10cSrcweir
92cdf0e10cSrcweir // -----------------------------------------------------------------------
93cdf0e10cSrcweir //
94cdf0e10cSrcweir // Zellen einfuegen
95cdf0e10cSrcweir // Zeilen einfuegen
96cdf0e10cSrcweir // einzeln oder Block
97cdf0e10cSrcweir //
98cdf0e10cSrcweir
ScUndoInsertCells(ScDocShell * pNewDocShell,const ScRange & rRange,SCTAB nNewCount,SCTAB * pNewTabs,SCTAB * pNewScenarios,InsCellCmd eNewCmd,ScDocument * pUndoDocument,ScRefUndoData * pRefData,sal_Bool bNewPartOfPaste)99cdf0e10cSrcweir ScUndoInsertCells::ScUndoInsertCells( ScDocShell* pNewDocShell,
100cdf0e10cSrcweir const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios,
101cdf0e10cSrcweir InsCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData,
102cdf0e10cSrcweir sal_Bool bNewPartOfPaste ) :
103cdf0e10cSrcweir ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ),
104cdf0e10cSrcweir aEffRange( rRange ),
105cdf0e10cSrcweir nCount( nNewCount ),
106cdf0e10cSrcweir pTabs( pNewTabs ),
107cdf0e10cSrcweir pScenarios( pNewScenarios ),
108cdf0e10cSrcweir eCmd( eNewCmd ),
109cdf0e10cSrcweir bPartOfPaste( bNewPartOfPaste ),
110cdf0e10cSrcweir pPasteUndo( NULL )
111cdf0e10cSrcweir {
112cdf0e10cSrcweir if (eCmd == INS_INSROWS) // ganze Zeilen?
113cdf0e10cSrcweir {
114cdf0e10cSrcweir aEffRange.aStart.SetCol(0);
115cdf0e10cSrcweir aEffRange.aEnd.SetCol(MAXCOL);
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
118cdf0e10cSrcweir if (eCmd == INS_INSCOLS) // ganze Spalten?
119cdf0e10cSrcweir {
120cdf0e10cSrcweir aEffRange.aStart.SetRow(0);
121cdf0e10cSrcweir aEffRange.aEnd.SetRow(MAXROW);
122cdf0e10cSrcweir }
123cdf0e10cSrcweir
124cdf0e10cSrcweir SetChangeTrack();
125cdf0e10cSrcweir }
126cdf0e10cSrcweir
~ScUndoInsertCells()127cdf0e10cSrcweir __EXPORT ScUndoInsertCells::~ScUndoInsertCells()
128cdf0e10cSrcweir {
129cdf0e10cSrcweir delete pPasteUndo;
130cdf0e10cSrcweir delete []pTabs;
131cdf0e10cSrcweir delete []pScenarios;
132cdf0e10cSrcweir }
133cdf0e10cSrcweir
GetComment() const134cdf0e10cSrcweir String __EXPORT ScUndoInsertCells::GetComment() const
135cdf0e10cSrcweir {
136cdf0e10cSrcweir return ScGlobal::GetRscString( pPasteUndo ? STR_UNDO_PASTE : STR_UNDO_INSERTCELLS );
137cdf0e10cSrcweir }
138cdf0e10cSrcweir
Merge(SfxUndoAction * pNextAction)139cdf0e10cSrcweir sal_Bool ScUndoInsertCells::Merge( SfxUndoAction* pNextAction )
140cdf0e10cSrcweir {
141cdf0e10cSrcweir // If a paste undo action has already been added, append (detective) action there.
142cdf0e10cSrcweir if ( pPasteUndo )
143cdf0e10cSrcweir return pPasteUndo->Merge( pNextAction );
144cdf0e10cSrcweir
145cdf0e10cSrcweir if ( bPartOfPaste && pNextAction->ISA( ScUndoWrapper ) )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir ScUndoWrapper* pWrapper = (ScUndoWrapper*)pNextAction;
148cdf0e10cSrcweir SfxUndoAction* pWrappedAction = pWrapper->GetWrappedUndo();
149cdf0e10cSrcweir if ( pWrappedAction && pWrappedAction->ISA( ScUndoPaste ) )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir // Store paste action if this is part of paste with inserting cells.
152cdf0e10cSrcweir // A list action isn't used because Repeat wouldn't work (insert wrong cells).
153cdf0e10cSrcweir
154cdf0e10cSrcweir pPasteUndo = pWrappedAction;
155cdf0e10cSrcweir pWrapper->ForgetWrappedUndo(); // pWrapper is deleted by UndoManager
156cdf0e10cSrcweir return sal_True;
157cdf0e10cSrcweir }
158cdf0e10cSrcweir }
159cdf0e10cSrcweir
160cdf0e10cSrcweir // Call base class for detective handling
161cdf0e10cSrcweir return ScMoveUndo::Merge( pNextAction );
162cdf0e10cSrcweir }
163cdf0e10cSrcweir
SetChangeTrack()164cdf0e10cSrcweir void ScUndoInsertCells::SetChangeTrack()
165cdf0e10cSrcweir {
166cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
167cdf0e10cSrcweir if ( pChangeTrack )
168cdf0e10cSrcweir {
169cdf0e10cSrcweir pChangeTrack->AppendInsert( aEffRange );
170cdf0e10cSrcweir nEndChangeAction = pChangeTrack->GetActionMax();
171cdf0e10cSrcweir }
172cdf0e10cSrcweir else
173cdf0e10cSrcweir nEndChangeAction = 0;
174cdf0e10cSrcweir }
175cdf0e10cSrcweir
DoChange(const sal_Bool bUndo)176cdf0e10cSrcweir void ScUndoInsertCells::DoChange( const sal_Bool bUndo )
177cdf0e10cSrcweir {
178cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
179cdf0e10cSrcweir SCTAB i;
180cdf0e10cSrcweir
181cdf0e10cSrcweir if ( bUndo )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
184cdf0e10cSrcweir if ( pChangeTrack )
185cdf0e10cSrcweir pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
186cdf0e10cSrcweir }
187cdf0e10cSrcweir else
188cdf0e10cSrcweir SetChangeTrack();
189cdf0e10cSrcweir
190cdf0e10cSrcweir // refresh of merged cells has to be after inserting/deleting
191cdf0e10cSrcweir
192cdf0e10cSrcweir switch (eCmd)
193cdf0e10cSrcweir {
194cdf0e10cSrcweir case INS_INSROWS:
195cdf0e10cSrcweir case INS_CELLSDOWN:
196cdf0e10cSrcweir for( i=0; i<nCount; i++ )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir if (bUndo)
199cdf0e10cSrcweir pDoc->DeleteRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
200cdf0e10cSrcweir aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
201cdf0e10cSrcweir else
202cdf0e10cSrcweir pDoc->InsertRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
203cdf0e10cSrcweir aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
204cdf0e10cSrcweir }
205cdf0e10cSrcweir break;
206cdf0e10cSrcweir case INS_INSCOLS:
207cdf0e10cSrcweir case INS_CELLSRIGHT:
208cdf0e10cSrcweir for( i=0; i<nCount; i++ )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir if (bUndo)
211cdf0e10cSrcweir pDoc->DeleteCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
212cdf0e10cSrcweir aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
213cdf0e10cSrcweir else
214cdf0e10cSrcweir pDoc->InsertCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
215cdf0e10cSrcweir aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
216cdf0e10cSrcweir }
217cdf0e10cSrcweir break;
218cdf0e10cSrcweir default:
219cdf0e10cSrcweir {
220cdf0e10cSrcweir // added to avoid warnings
221cdf0e10cSrcweir }
222cdf0e10cSrcweir }
223cdf0e10cSrcweir
224cdf0e10cSrcweir ScRange aWorkRange( aEffRange );
225cdf0e10cSrcweir if ( eCmd == INS_CELLSRIGHT ) // only "shift right" requires refresh of the moved area
226cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL);
227cdf0e10cSrcweir for( i=0; i<nCount; i++ )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir if ( pDoc->HasAttrib( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
230cdf0e10cSrcweir aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i], HASATTR_MERGED ) )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir SCCOL nEndCol = aWorkRange.aEnd.Col();
233cdf0e10cSrcweir SCROW nEndRow = aWorkRange.aEnd.Row();
234cdf0e10cSrcweir pDoc->ExtendMerge( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), nEndCol, nEndRow, pTabs[i], sal_True );
235cdf0e10cSrcweir }
236cdf0e10cSrcweir }
237cdf0e10cSrcweir
238cdf0e10cSrcweir //? Undo fuer herausgeschobene Attribute ?
239cdf0e10cSrcweir
240cdf0e10cSrcweir sal_uInt16 nPaint = PAINT_GRID;
241cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
242cdf0e10cSrcweir switch (eCmd)
243cdf0e10cSrcweir {
244cdf0e10cSrcweir case INS_INSROWS:
245cdf0e10cSrcweir nPaint |= PAINT_LEFT;
246cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW);
247cdf0e10cSrcweir break;
248cdf0e10cSrcweir case INS_CELLSDOWN:
249cdf0e10cSrcweir for( i=0; i<nCount; i++ )
250cdf0e10cSrcweir {
251cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW);
252cdf0e10cSrcweir if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] ))
253cdf0e10cSrcweir {
254cdf0e10cSrcweir aWorkRange.aStart.SetCol(0);
255cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL);
256cdf0e10cSrcweir nPaint |= PAINT_LEFT;
257cdf0e10cSrcweir }
258cdf0e10cSrcweir }
259cdf0e10cSrcweir break;
260cdf0e10cSrcweir case INS_INSCOLS:
261cdf0e10cSrcweir nPaint |= PAINT_TOP; // obere Leiste
262cdf0e10cSrcweir case INS_CELLSRIGHT:
263cdf0e10cSrcweir for( i=0; i<nCount; i++ )
264cdf0e10cSrcweir {
265cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL); // bis ganz nach rechts
266cdf0e10cSrcweir if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i]) )
267cdf0e10cSrcweir { // AdjustDraw zeichnet PAINT_TOP nicht,
268cdf0e10cSrcweir aWorkRange.aStart.SetCol(0); // daher so geloest
269cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW);
270cdf0e10cSrcweir nPaint |= PAINT_LEFT;
271cdf0e10cSrcweir }
272cdf0e10cSrcweir }
273cdf0e10cSrcweir break;
274cdf0e10cSrcweir default:
275cdf0e10cSrcweir {
276cdf0e10cSrcweir // added to avoid warnings
277cdf0e10cSrcweir }
278cdf0e10cSrcweir }
279cdf0e10cSrcweir
280cdf0e10cSrcweir for( i=0; i<nCount; i++ )
281cdf0e10cSrcweir {
282cdf0e10cSrcweir pDocShell->PostPaint( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
283cdf0e10cSrcweir aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i]+pScenarios[i], nPaint );
284cdf0e10cSrcweir }
285cdf0e10cSrcweir pDocShell->PostDataChanged();
286cdf0e10cSrcweir if (pViewShell)
287cdf0e10cSrcweir pViewShell->CellContentChanged();
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
Undo()290cdf0e10cSrcweir void __EXPORT ScUndoInsertCells::Undo()
291cdf0e10cSrcweir {
292cdf0e10cSrcweir if ( pPasteUndo )
293cdf0e10cSrcweir pPasteUndo->Undo(); // undo paste first
294cdf0e10cSrcweir
295cdf0e10cSrcweir WaitObject aWait( pDocShell->GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference
296cdf0e10cSrcweir BeginUndo();
297cdf0e10cSrcweir DoChange( sal_True );
298cdf0e10cSrcweir EndUndo();
299cdf0e10cSrcweir }
300cdf0e10cSrcweir
Redo()301cdf0e10cSrcweir void __EXPORT ScUndoInsertCells::Redo()
302cdf0e10cSrcweir {
303cdf0e10cSrcweir WaitObject aWait( pDocShell->GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference
304cdf0e10cSrcweir BeginRedo();
305cdf0e10cSrcweir DoChange( sal_False );
306cdf0e10cSrcweir EndRedo();
307cdf0e10cSrcweir
308cdf0e10cSrcweir if ( pPasteUndo )
309cdf0e10cSrcweir pPasteUndo->Redo(); // redo paste last
310cdf0e10cSrcweir }
311cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)312cdf0e10cSrcweir void __EXPORT ScUndoInsertCells::Repeat(SfxRepeatTarget& rTarget)
313cdf0e10cSrcweir {
314cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
315cdf0e10cSrcweir {
316cdf0e10cSrcweir if ( pPasteUndo )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir // #94115# Repeat for paste with inserting cells is handled completely
319cdf0e10cSrcweir // by the Paste undo action
320cdf0e10cSrcweir
321cdf0e10cSrcweir pPasteUndo->Repeat( rTarget );
322cdf0e10cSrcweir }
323cdf0e10cSrcweir else
324cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->InsertCells( eCmd, sal_True );
325cdf0e10cSrcweir }
326cdf0e10cSrcweir }
327cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const328cdf0e10cSrcweir sal_Bool __EXPORT ScUndoInsertCells::CanRepeat(SfxRepeatTarget& rTarget) const
329cdf0e10cSrcweir {
330cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
331cdf0e10cSrcweir }
332cdf0e10cSrcweir
333cdf0e10cSrcweir
334cdf0e10cSrcweir // -----------------------------------------------------------------------
335cdf0e10cSrcweir //
336cdf0e10cSrcweir // Zellen loeschen
337cdf0e10cSrcweir // Zeilen loeschen
338cdf0e10cSrcweir // einzeln oder Block
339cdf0e10cSrcweir //
340cdf0e10cSrcweir
ScUndoDeleteCells(ScDocShell * pNewDocShell,const ScRange & rRange,SCTAB nNewCount,SCTAB * pNewTabs,SCTAB * pNewScenarios,DelCellCmd eNewCmd,ScDocument * pUndoDocument,ScRefUndoData * pRefData)341cdf0e10cSrcweir ScUndoDeleteCells::ScUndoDeleteCells( ScDocShell* pNewDocShell,
342cdf0e10cSrcweir const ScRange& rRange, SCTAB nNewCount, SCTAB* pNewTabs, SCTAB* pNewScenarios,
343cdf0e10cSrcweir DelCellCmd eNewCmd, ScDocument* pUndoDocument, ScRefUndoData* pRefData ) :
344cdf0e10cSrcweir ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ),
345cdf0e10cSrcweir aEffRange( rRange ),
346cdf0e10cSrcweir nCount( nNewCount ),
347cdf0e10cSrcweir pTabs( pNewTabs ),
348cdf0e10cSrcweir pScenarios( pNewScenarios ),
349cdf0e10cSrcweir eCmd( eNewCmd )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir if (eCmd == DEL_DELROWS) // gaze Zeilen?
352cdf0e10cSrcweir {
353cdf0e10cSrcweir aEffRange.aStart.SetCol(0);
354cdf0e10cSrcweir aEffRange.aEnd.SetCol(MAXCOL);
355cdf0e10cSrcweir }
356cdf0e10cSrcweir
357cdf0e10cSrcweir if (eCmd == DEL_DELCOLS) // ganze Spalten?
358cdf0e10cSrcweir {
359cdf0e10cSrcweir aEffRange.aStart.SetRow(0);
360cdf0e10cSrcweir aEffRange.aEnd.SetRow(MAXROW);
361cdf0e10cSrcweir }
362cdf0e10cSrcweir
363cdf0e10cSrcweir SetChangeTrack();
364cdf0e10cSrcweir }
365cdf0e10cSrcweir
~ScUndoDeleteCells()366cdf0e10cSrcweir __EXPORT ScUndoDeleteCells::~ScUndoDeleteCells()
367cdf0e10cSrcweir {
368cdf0e10cSrcweir delete []pTabs;
369cdf0e10cSrcweir delete []pScenarios;
370cdf0e10cSrcweir }
371cdf0e10cSrcweir
GetComment() const372cdf0e10cSrcweir String __EXPORT ScUndoDeleteCells::GetComment() const
373cdf0e10cSrcweir {
374cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_DELETECELLS ); // "Loeschen"
375cdf0e10cSrcweir }
376cdf0e10cSrcweir
SetChangeTrack()377cdf0e10cSrcweir void ScUndoDeleteCells::SetChangeTrack()
378cdf0e10cSrcweir {
379cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
380cdf0e10cSrcweir if ( pChangeTrack )
381cdf0e10cSrcweir pChangeTrack->AppendDeleteRange( aEffRange, pRefUndoDoc,
382cdf0e10cSrcweir nStartChangeAction, nEndChangeAction );
383cdf0e10cSrcweir else
384cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir
DoChange(const sal_Bool bUndo)387cdf0e10cSrcweir void ScUndoDeleteCells::DoChange( const sal_Bool bUndo )
388cdf0e10cSrcweir {
389cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
390cdf0e10cSrcweir SCTAB i;
391cdf0e10cSrcweir
392cdf0e10cSrcweir if ( bUndo )
393cdf0e10cSrcweir {
394cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
395cdf0e10cSrcweir if ( pChangeTrack )
396cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
397cdf0e10cSrcweir }
398cdf0e10cSrcweir else
399cdf0e10cSrcweir SetChangeTrack();
400cdf0e10cSrcweir
401cdf0e10cSrcweir // Ausfuehren
402cdf0e10cSrcweir switch (eCmd)
403cdf0e10cSrcweir {
404cdf0e10cSrcweir case DEL_DELROWS:
405cdf0e10cSrcweir case DEL_CELLSUP:
406cdf0e10cSrcweir for( i=0; i<nCount; i++ )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir if (bUndo)
409cdf0e10cSrcweir pDoc->InsertRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
410cdf0e10cSrcweir aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
411cdf0e10cSrcweir else
412cdf0e10cSrcweir pDoc->DeleteRow( aEffRange.aStart.Col(), pTabs[i], aEffRange.aEnd.Col(), pTabs[i]+pScenarios[i],
413cdf0e10cSrcweir aEffRange.aStart.Row(), static_cast<SCSIZE>(aEffRange.aEnd.Row()-aEffRange.aStart.Row()+1));
414cdf0e10cSrcweir }
415cdf0e10cSrcweir break;
416cdf0e10cSrcweir case DEL_DELCOLS:
417cdf0e10cSrcweir case DEL_CELLSLEFT:
418cdf0e10cSrcweir for( i=0; i<nCount; i++ )
419cdf0e10cSrcweir {
420cdf0e10cSrcweir if (bUndo)
421cdf0e10cSrcweir pDoc->InsertCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
422cdf0e10cSrcweir aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
423cdf0e10cSrcweir else
424cdf0e10cSrcweir pDoc->DeleteCol( aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
425cdf0e10cSrcweir aEffRange.aStart.Col(), static_cast<SCSIZE>(aEffRange.aEnd.Col()-aEffRange.aStart.Col()+1));
426cdf0e10cSrcweir }
427cdf0e10cSrcweir break;
428cdf0e10cSrcweir default:
429cdf0e10cSrcweir {
430cdf0e10cSrcweir // added to avoid warnings
431cdf0e10cSrcweir }
432cdf0e10cSrcweir }
433cdf0e10cSrcweir
434cdf0e10cSrcweir // bei Undo Referenzen wiederherstellen
435cdf0e10cSrcweir for( i=0; i<nCount && bUndo; i++ )
436cdf0e10cSrcweir {
437cdf0e10cSrcweir pRefUndoDoc->CopyToDocument( aEffRange.aStart.Col(), aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Col(), aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i],
438cdf0e10cSrcweir IDF_ALL | IDF_NOCAPTIONS, sal_False, pDoc );
439cdf0e10cSrcweir }
440cdf0e10cSrcweir
441cdf0e10cSrcweir ScRange aWorkRange( aEffRange );
442cdf0e10cSrcweir if ( eCmd == DEL_CELLSLEFT ) // only "shift left" requires refresh of the moved area
443cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL);
444cdf0e10cSrcweir
445cdf0e10cSrcweir for( i=0; i<nCount; i++ )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir if ( pDoc->HasAttrib( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
448cdf0e10cSrcweir aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i], HASATTR_MERGED | HASATTR_OVERLAPPED ) )
449cdf0e10cSrcweir {
450cdf0e10cSrcweir // #i51445# old merge flag attributes must be deleted also for single cells,
451cdf0e10cSrcweir // not only for whole columns/rows
452cdf0e10cSrcweir
453cdf0e10cSrcweir if ( !bUndo )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir if ( eCmd==DEL_DELCOLS || eCmd==DEL_CELLSLEFT )
456cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL);
457cdf0e10cSrcweir if ( eCmd==DEL_DELROWS || eCmd==DEL_CELLSUP )
458cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW);
459cdf0e10cSrcweir ScMarkData aMarkData;
460cdf0e10cSrcweir aMarkData.SelectOneTable( aWorkRange.aStart.Tab() );
461cdf0e10cSrcweir ScPatternAttr aPattern( pDoc->GetPool() );
462cdf0e10cSrcweir aPattern.GetItemSet().Put( ScMergeFlagAttr() );
463cdf0e10cSrcweir pDoc->ApplyPatternArea( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(),
464cdf0e10cSrcweir aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(),
465cdf0e10cSrcweir aMarkData, aPattern );
466cdf0e10cSrcweir }
467cdf0e10cSrcweir
468cdf0e10cSrcweir SCCOL nEndCol = aWorkRange.aEnd.Col();
469cdf0e10cSrcweir SCROW nEndRow = aWorkRange.aEnd.Row();
470cdf0e10cSrcweir pDoc->ExtendMerge( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), nEndCol, nEndRow, pTabs[i], sal_True );
471cdf0e10cSrcweir }
472cdf0e10cSrcweir }
473cdf0e10cSrcweir
474cdf0e10cSrcweir // Zeichnen
475cdf0e10cSrcweir sal_uInt16 nPaint = PAINT_GRID;
476cdf0e10cSrcweir switch (eCmd)
477cdf0e10cSrcweir {
478cdf0e10cSrcweir case DEL_DELROWS:
479cdf0e10cSrcweir nPaint |= PAINT_LEFT;
480cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW);
481cdf0e10cSrcweir break;
482cdf0e10cSrcweir case DEL_CELLSUP:
483cdf0e10cSrcweir for( i=0; i<nCount; i++ )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW);
486cdf0e10cSrcweir if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] ))
487cdf0e10cSrcweir {
488cdf0e10cSrcweir aWorkRange.aStart.SetCol(0);
489cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL);
490cdf0e10cSrcweir nPaint |= PAINT_LEFT;
491cdf0e10cSrcweir }
492cdf0e10cSrcweir }
493cdf0e10cSrcweir break;
494cdf0e10cSrcweir case DEL_DELCOLS:
495cdf0e10cSrcweir nPaint |= PAINT_TOP; // obere Leiste
496cdf0e10cSrcweir case DEL_CELLSLEFT:
497cdf0e10cSrcweir for( i=0; i<nCount; i++ )
498cdf0e10cSrcweir {
499cdf0e10cSrcweir aWorkRange.aEnd.SetCol(MAXCOL); // bis ganz nach rechts
500cdf0e10cSrcweir if ( pDocShell->AdjustRowHeight( aWorkRange.aStart.Row(), aWorkRange.aEnd.Row(), pTabs[i] ) )
501cdf0e10cSrcweir {
502cdf0e10cSrcweir aWorkRange.aStart.SetCol(0);
503cdf0e10cSrcweir aWorkRange.aEnd.SetRow(MAXROW);
504cdf0e10cSrcweir nPaint |= PAINT_LEFT;
505cdf0e10cSrcweir }
506cdf0e10cSrcweir }
507cdf0e10cSrcweir break;
508cdf0e10cSrcweir default:
509cdf0e10cSrcweir {
510cdf0e10cSrcweir // added to avoid warnings
511cdf0e10cSrcweir }
512cdf0e10cSrcweir }
513cdf0e10cSrcweir
514cdf0e10cSrcweir for( i=0; i<nCount; i++ )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir pDocShell->PostPaint( aWorkRange.aStart.Col(), aWorkRange.aStart.Row(), pTabs[i],
517cdf0e10cSrcweir aWorkRange.aEnd.Col(), aWorkRange.aEnd.Row(), pTabs[i]+pScenarios[i], nPaint, SC_PF_LINES );
518cdf0e10cSrcweir }
519cdf0e10cSrcweir // Markierung erst nach EndUndo
520cdf0e10cSrcweir
521cdf0e10cSrcweir pDocShell->PostDataChanged();
522cdf0e10cSrcweir // CellContentChanged kommt mit der Markierung
523cdf0e10cSrcweir }
524cdf0e10cSrcweir
Undo()525cdf0e10cSrcweir void __EXPORT ScUndoDeleteCells::Undo()
526cdf0e10cSrcweir {
527cdf0e10cSrcweir WaitObject aWait( pDocShell->GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference
528cdf0e10cSrcweir BeginUndo();
529cdf0e10cSrcweir DoChange( sal_True );
530cdf0e10cSrcweir EndUndo();
531cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
532cdf0e10cSrcweir
533cdf0e10cSrcweir // Markierung erst nach EndUndo
534cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
535cdf0e10cSrcweir if (pViewShell)
536cdf0e10cSrcweir {
537cdf0e10cSrcweir for( SCTAB i=0; i<nCount; i++ )
538cdf0e10cSrcweir {
539cdf0e10cSrcweir pViewShell->MarkRange( ScRange(aEffRange.aStart.Col(), aEffRange.aStart.Row(), pTabs[i], aEffRange.aEnd.Col(), aEffRange.aEnd.Row(), pTabs[i]+pScenarios[i]) );
540cdf0e10cSrcweir }
541cdf0e10cSrcweir }
542cdf0e10cSrcweir }
543cdf0e10cSrcweir
Redo()544cdf0e10cSrcweir void __EXPORT ScUndoDeleteCells::Redo()
545cdf0e10cSrcweir {
546cdf0e10cSrcweir WaitObject aWait( pDocShell->GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference
547cdf0e10cSrcweir BeginRedo();
548cdf0e10cSrcweir DoChange( sal_False);
549cdf0e10cSrcweir EndRedo();
550cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
551cdf0e10cSrcweir
552cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
553cdf0e10cSrcweir if (pViewShell)
554cdf0e10cSrcweir pViewShell->DoneBlockMode(); // aktuelle weg
555cdf0e10cSrcweir }
556cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)557cdf0e10cSrcweir void __EXPORT ScUndoDeleteCells::Repeat(SfxRepeatTarget& rTarget)
558cdf0e10cSrcweir {
559cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
560cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->DeleteCells( eCmd, sal_True );
561cdf0e10cSrcweir }
562cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const563cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDeleteCells::CanRepeat(SfxRepeatTarget& rTarget) const
564cdf0e10cSrcweir {
565cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
566cdf0e10cSrcweir }
567cdf0e10cSrcweir
568cdf0e10cSrcweir
569cdf0e10cSrcweir // -----------------------------------------------------------------------
570cdf0e10cSrcweir //
571cdf0e10cSrcweir // Zellen loeschen auf Mehrfachselektion
572cdf0e10cSrcweir //
573cdf0e10cSrcweir
ScUndoDeleteMulti(ScDocShell * pNewDocShell,sal_Bool bNewRows,sal_Bool bNeedsRefresh,SCTAB nNewTab,const SCCOLROW * pRng,SCCOLROW nRngCnt,ScDocument * pUndoDocument,ScRefUndoData * pRefData)574cdf0e10cSrcweir ScUndoDeleteMulti::ScUndoDeleteMulti( ScDocShell* pNewDocShell,
575cdf0e10cSrcweir sal_Bool bNewRows, sal_Bool bNeedsRefresh, SCTAB nNewTab,
576cdf0e10cSrcweir const SCCOLROW* pRng, SCCOLROW nRngCnt,
577cdf0e10cSrcweir ScDocument* pUndoDocument, ScRefUndoData* pRefData ) :
578cdf0e10cSrcweir ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFLAST ),
579cdf0e10cSrcweir bRows( bNewRows ),
580cdf0e10cSrcweir bRefresh( bNeedsRefresh ),
581cdf0e10cSrcweir nTab( nNewTab ),
582cdf0e10cSrcweir nRangeCnt( nRngCnt )
583cdf0e10cSrcweir {
584cdf0e10cSrcweir pRanges = new SCCOLROW[ 2 * nRangeCnt ];
585cdf0e10cSrcweir memcpy(pRanges,pRng,nRangeCnt*2*sizeof(SCCOLROW));
586cdf0e10cSrcweir SetChangeTrack();
587cdf0e10cSrcweir }
588cdf0e10cSrcweir
~ScUndoDeleteMulti()589cdf0e10cSrcweir __EXPORT ScUndoDeleteMulti::~ScUndoDeleteMulti()
590cdf0e10cSrcweir {
591cdf0e10cSrcweir delete [] pRanges;
592cdf0e10cSrcweir }
593cdf0e10cSrcweir
GetComment() const594cdf0e10cSrcweir String __EXPORT ScUndoDeleteMulti::GetComment() const
595cdf0e10cSrcweir {
596cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_DELETECELLS ); // wie DeleteCells
597cdf0e10cSrcweir }
598cdf0e10cSrcweir
DoChange() const599cdf0e10cSrcweir void ScUndoDeleteMulti::DoChange() const
600cdf0e10cSrcweir {
601cdf0e10cSrcweir SCCOL nStartCol;
602cdf0e10cSrcweir SCROW nStartRow;
603cdf0e10cSrcweir sal_uInt16 nPaint;
604cdf0e10cSrcweir if (bRows)
605cdf0e10cSrcweir {
606cdf0e10cSrcweir nStartCol = 0;
607cdf0e10cSrcweir nStartRow = static_cast<SCROW>(pRanges[0]);
608cdf0e10cSrcweir nPaint = PAINT_GRID | PAINT_LEFT;
609cdf0e10cSrcweir }
610cdf0e10cSrcweir else
611cdf0e10cSrcweir {
612cdf0e10cSrcweir nStartCol = static_cast<SCCOL>(pRanges[0]);
613cdf0e10cSrcweir nStartRow = 0;
614cdf0e10cSrcweir nPaint = PAINT_GRID | PAINT_TOP;
615cdf0e10cSrcweir }
616cdf0e10cSrcweir
617cdf0e10cSrcweir if ( bRefresh )
618cdf0e10cSrcweir {
619cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
620cdf0e10cSrcweir SCCOL nEndCol = MAXCOL;
621cdf0e10cSrcweir SCROW nEndRow = MAXROW;
622cdf0e10cSrcweir pDoc->RemoveFlagsTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, SC_MF_HOR | SC_MF_VER );
623cdf0e10cSrcweir pDoc->ExtendMerge( nStartCol, nStartRow, nEndCol, nEndRow, nTab, sal_True );
624cdf0e10cSrcweir }
625cdf0e10cSrcweir
626cdf0e10cSrcweir pDocShell->PostPaint( nStartCol, nStartRow, nTab, MAXCOL, MAXROW, nTab, nPaint );
627cdf0e10cSrcweir pDocShell->PostDataChanged();
628cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
629cdf0e10cSrcweir if (pViewShell)
630cdf0e10cSrcweir pViewShell->CellContentChanged();
631cdf0e10cSrcweir
632cdf0e10cSrcweir ShowTable( nTab );
633cdf0e10cSrcweir }
634cdf0e10cSrcweir
SetChangeTrack()635cdf0e10cSrcweir void ScUndoDeleteMulti::SetChangeTrack()
636cdf0e10cSrcweir {
637cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
638cdf0e10cSrcweir if ( pChangeTrack )
639cdf0e10cSrcweir {
640cdf0e10cSrcweir nStartChangeAction = pChangeTrack->GetActionMax() + 1;
641cdf0e10cSrcweir ScRange aRange( 0, 0, nTab, 0, 0, nTab );
642cdf0e10cSrcweir if ( bRows )
643cdf0e10cSrcweir aRange.aEnd.SetCol( MAXCOL );
644cdf0e10cSrcweir else
645cdf0e10cSrcweir aRange.aEnd.SetRow( MAXROW );
646cdf0e10cSrcweir // rueckwaerts loeschen
647cdf0e10cSrcweir SCCOLROW* pOneRange = &pRanges[2*nRangeCnt];
648cdf0e10cSrcweir for ( SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++ )
649cdf0e10cSrcweir {
650cdf0e10cSrcweir SCCOLROW nEnd = *(--pOneRange);
651cdf0e10cSrcweir SCCOLROW nStart = *(--pOneRange);
652cdf0e10cSrcweir if ( bRows )
653cdf0e10cSrcweir {
654cdf0e10cSrcweir aRange.aStart.SetRow( nStart );
655cdf0e10cSrcweir aRange.aEnd.SetRow( nEnd );
656cdf0e10cSrcweir }
657cdf0e10cSrcweir else
658cdf0e10cSrcweir {
659cdf0e10cSrcweir aRange.aStart.SetCol( static_cast<SCCOL>(nStart) );
660cdf0e10cSrcweir aRange.aEnd.SetCol( static_cast<SCCOL>(nEnd) );
661cdf0e10cSrcweir }
662cdf0e10cSrcweir sal_uLong nDummyStart;
663cdf0e10cSrcweir pChangeTrack->AppendDeleteRange( aRange, pRefUndoDoc,
664cdf0e10cSrcweir nDummyStart, nEndChangeAction );
665cdf0e10cSrcweir }
666cdf0e10cSrcweir }
667cdf0e10cSrcweir else
668cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0;
669cdf0e10cSrcweir }
670cdf0e10cSrcweir
Undo()671cdf0e10cSrcweir void __EXPORT ScUndoDeleteMulti::Undo()
672cdf0e10cSrcweir {
673cdf0e10cSrcweir WaitObject aWait( pDocShell->GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference
674cdf0e10cSrcweir BeginUndo();
675cdf0e10cSrcweir
676cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
677cdf0e10cSrcweir SCCOLROW* pOneRange;
678cdf0e10cSrcweir SCCOLROW nRangeNo;
679cdf0e10cSrcweir
680cdf0e10cSrcweir // rueckwaerts geloescht -> vorwaerts einfuegen
681cdf0e10cSrcweir pOneRange = pRanges;
682cdf0e10cSrcweir for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
683cdf0e10cSrcweir {
684cdf0e10cSrcweir SCCOLROW nStart = *(pOneRange++);
685cdf0e10cSrcweir SCCOLROW nEnd = *(pOneRange++);
686cdf0e10cSrcweir if (bRows)
687cdf0e10cSrcweir pDoc->InsertRow( 0,nTab, MAXCOL,nTab, nStart,static_cast<SCSIZE>(nEnd-nStart+1) );
688cdf0e10cSrcweir else
689cdf0e10cSrcweir pDoc->InsertCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) );
690cdf0e10cSrcweir }
691cdf0e10cSrcweir
692cdf0e10cSrcweir pOneRange = pRanges;
693cdf0e10cSrcweir for (nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
694cdf0e10cSrcweir {
695cdf0e10cSrcweir SCCOLROW nStart = *(pOneRange++);
696cdf0e10cSrcweir SCCOLROW nEnd = *(pOneRange++);
697cdf0e10cSrcweir if (bRows)
698cdf0e10cSrcweir pRefUndoDoc->CopyToDocument( 0,nStart,nTab, MAXCOL,nEnd,nTab, IDF_ALL,sal_False,pDoc );
699cdf0e10cSrcweir else
700cdf0e10cSrcweir pRefUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart),0,nTab,
701cdf0e10cSrcweir static_cast<SCCOL>(nEnd),MAXROW,nTab, IDF_ALL,sal_False,pDoc );
702cdf0e10cSrcweir }
703cdf0e10cSrcweir
704cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
705cdf0e10cSrcweir if ( pChangeTrack )
706cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
707cdf0e10cSrcweir
708cdf0e10cSrcweir DoChange();
709cdf0e10cSrcweir
710cdf0e10cSrcweir //! Markierung wieder einzeichnen
711cdf0e10cSrcweir //! geht im Moment nicht, da keine Daten fuer Markierung vorhanden!
712cdf0e10cSrcweir
713cdf0e10cSrcweir EndUndo();
714cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
715cdf0e10cSrcweir }
716cdf0e10cSrcweir
Redo()717cdf0e10cSrcweir void __EXPORT ScUndoDeleteMulti::Redo()
718cdf0e10cSrcweir {
719cdf0e10cSrcweir WaitObject aWait( pDocShell->GetActiveDialogParent() ); // wichtig wegen TrackFormulas bei UpdateReference
720cdf0e10cSrcweir BeginRedo();
721cdf0e10cSrcweir
722cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
723cdf0e10cSrcweir
724cdf0e10cSrcweir // rueckwaerts loeschen
725cdf0e10cSrcweir SCCOLROW* pOneRange = &pRanges[2*nRangeCnt];
726cdf0e10cSrcweir for (SCCOLROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
727cdf0e10cSrcweir {
728cdf0e10cSrcweir SCCOLROW nEnd = *(--pOneRange);
729cdf0e10cSrcweir SCCOLROW nStart = *(--pOneRange);
730cdf0e10cSrcweir if (bRows)
731cdf0e10cSrcweir pDoc->DeleteRow( 0,nTab, MAXCOL,nTab, nStart,static_cast<SCSIZE>(nEnd-nStart+1) );
732cdf0e10cSrcweir else
733cdf0e10cSrcweir pDoc->DeleteCol( 0,nTab, MAXROW,nTab, static_cast<SCCOL>(nStart), static_cast<SCSIZE>(nEnd-nStart+1) );
734cdf0e10cSrcweir }
735cdf0e10cSrcweir
736cdf0e10cSrcweir SetChangeTrack();
737cdf0e10cSrcweir
738cdf0e10cSrcweir DoChange();
739cdf0e10cSrcweir
740cdf0e10cSrcweir //! Markierung loeschen, derzeit unnoetig (s.o.)
741cdf0e10cSrcweir //! ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
742cdf0e10cSrcweir //! if (pViewShell)
743cdf0e10cSrcweir //! DoneBlockMode();
744cdf0e10cSrcweir
745cdf0e10cSrcweir EndRedo();
746cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
747cdf0e10cSrcweir }
748cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)749cdf0e10cSrcweir void __EXPORT ScUndoDeleteMulti::Repeat(SfxRepeatTarget& rTarget)
750cdf0e10cSrcweir {
751cdf0e10cSrcweir // DeleteCells, falls einfache Selektion
752cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
753cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->DeleteCells( DEL_DELROWS, sal_True );
754cdf0e10cSrcweir }
755cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const756cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDeleteMulti::CanRepeat(SfxRepeatTarget& rTarget) const
757cdf0e10cSrcweir {
758cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
759cdf0e10cSrcweir }
760cdf0e10cSrcweir
761cdf0e10cSrcweir
762cdf0e10cSrcweir // -----------------------------------------------------------------------
763cdf0e10cSrcweir //
764cdf0e10cSrcweir // Ausschneiden (Cut)
765cdf0e10cSrcweir //
766cdf0e10cSrcweir
ScUndoCut(ScDocShell * pNewDocShell,ScRange aRange,ScAddress aOldEnd,const ScMarkData & rMark,ScDocument * pNewUndoDoc)767cdf0e10cSrcweir ScUndoCut::ScUndoCut( ScDocShell* pNewDocShell,
768cdf0e10cSrcweir ScRange aRange, ScAddress aOldEnd, const ScMarkData& rMark,
769cdf0e10cSrcweir ScDocument* pNewUndoDoc ) :
770cdf0e10cSrcweir ScBlockUndo( pNewDocShell, ScRange(aRange.aStart, aOldEnd), SC_UNDO_AUTOHEIGHT ),
771cdf0e10cSrcweir aMarkData( rMark ),
772cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
773cdf0e10cSrcweir aExtendedRange( aRange )
774cdf0e10cSrcweir {
775cdf0e10cSrcweir SetChangeTrack();
776cdf0e10cSrcweir }
777cdf0e10cSrcweir
~ScUndoCut()778cdf0e10cSrcweir __EXPORT ScUndoCut::~ScUndoCut()
779cdf0e10cSrcweir {
780cdf0e10cSrcweir delete pUndoDoc;
781cdf0e10cSrcweir }
782cdf0e10cSrcweir
GetComment() const783cdf0e10cSrcweir String __EXPORT ScUndoCut::GetComment() const
784cdf0e10cSrcweir {
785cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_CUT ); // "Ausschneiden"
786cdf0e10cSrcweir }
787cdf0e10cSrcweir
SetChangeTrack()788cdf0e10cSrcweir void ScUndoCut::SetChangeTrack()
789cdf0e10cSrcweir {
790cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
791cdf0e10cSrcweir if ( pChangeTrack )
792cdf0e10cSrcweir pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
793cdf0e10cSrcweir nStartChangeAction, nEndChangeAction, SC_CACM_CUT );
794cdf0e10cSrcweir else
795cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0;
796cdf0e10cSrcweir }
797cdf0e10cSrcweir
DoChange(const sal_Bool bUndo)798cdf0e10cSrcweir void ScUndoCut::DoChange( const sal_Bool bUndo )
799cdf0e10cSrcweir {
800cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
801cdf0e10cSrcweir sal_uInt16 nExtFlags = 0;
802cdf0e10cSrcweir
803cdf0e10cSrcweir // do not undo/redo objects and note captions, they are handled via drawing undo
804cdf0e10cSrcweir sal_uInt16 nUndoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
805cdf0e10cSrcweir
806cdf0e10cSrcweir if (bUndo) // nur bei Undo
807cdf0e10cSrcweir {
808cdf0e10cSrcweir // all sheets - CopyToDocument skips those that don't exist in pUndoDoc
809cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
810cdf0e10cSrcweir ScRange aCopyRange = aExtendedRange;
811cdf0e10cSrcweir aCopyRange.aStart.SetTab(0);
812cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1);
813cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, nUndoFlags, sal_False, pDoc );
814cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
815cdf0e10cSrcweir if ( pChangeTrack )
816cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
817cdf0e10cSrcweir }
818cdf0e10cSrcweir else // nur bei Redo
819cdf0e10cSrcweir {
820cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aExtendedRange );
821cdf0e10cSrcweir pDoc->DeleteArea( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(),
822cdf0e10cSrcweir aBlockRange.aEnd.Col(), aBlockRange.aEnd.Row(), aMarkData, nUndoFlags );
823cdf0e10cSrcweir SetChangeTrack();
824cdf0e10cSrcweir }
825cdf0e10cSrcweir
826cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
827cdf0e10cSrcweir if ( !( (pViewShell) && pViewShell->AdjustBlockHeight() ) )
828cdf0e10cSrcweir /*A*/ pDocShell->PostPaint( aExtendedRange, PAINT_GRID, nExtFlags );
829cdf0e10cSrcweir
830cdf0e10cSrcweir if ( !bUndo ) // draw redo after updating row heights
831cdf0e10cSrcweir RedoSdrUndoAction( pDrawUndo ); //! include in ScBlockUndo?
832cdf0e10cSrcweir
833cdf0e10cSrcweir pDocShell->PostDataChanged();
834cdf0e10cSrcweir if (pViewShell)
835cdf0e10cSrcweir pViewShell->CellContentChanged();
836cdf0e10cSrcweir }
837cdf0e10cSrcweir
Undo()838cdf0e10cSrcweir void __EXPORT ScUndoCut::Undo()
839cdf0e10cSrcweir {
840cdf0e10cSrcweir BeginUndo();
841cdf0e10cSrcweir DoChange( sal_True );
842cdf0e10cSrcweir EndUndo();
843cdf0e10cSrcweir }
844cdf0e10cSrcweir
Redo()845cdf0e10cSrcweir void __EXPORT ScUndoCut::Redo()
846cdf0e10cSrcweir {
847cdf0e10cSrcweir BeginRedo();
848cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
849cdf0e10cSrcweir EnableDrawAdjust( pDoc, sal_False ); //! include in ScBlockUndo?
850cdf0e10cSrcweir DoChange( sal_False );
851cdf0e10cSrcweir EnableDrawAdjust( pDoc, sal_True ); //! include in ScBlockUndo?
852cdf0e10cSrcweir EndRedo();
853cdf0e10cSrcweir }
854cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)855cdf0e10cSrcweir void __EXPORT ScUndoCut::Repeat(SfxRepeatTarget& rTarget)
856cdf0e10cSrcweir {
857cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
858cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->CutToClip( NULL, sal_True );
859cdf0e10cSrcweir }
860cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const861cdf0e10cSrcweir sal_Bool __EXPORT ScUndoCut::CanRepeat(SfxRepeatTarget& rTarget) const
862cdf0e10cSrcweir {
863cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
864cdf0e10cSrcweir }
865cdf0e10cSrcweir
866cdf0e10cSrcweir
867cdf0e10cSrcweir // -----------------------------------------------------------------------
868cdf0e10cSrcweir //
869cdf0e10cSrcweir // Einfuegen (Paste)
870cdf0e10cSrcweir //
871cdf0e10cSrcweir
ScUndoPaste(ScDocShell * pNewDocShell,SCCOL nStartX,SCROW nStartY,SCTAB nStartZ,SCCOL nEndX,SCROW nEndY,SCTAB nEndZ,const ScMarkData & rMark,ScDocument * pNewUndoDoc,ScDocument * pNewRedoDoc,sal_uInt16 nNewFlags,ScRefUndoData * pRefData,void *,void *,void *,sal_Bool bRedoIsFilled,const ScUndoPasteOptions * pOptions)872cdf0e10cSrcweir ScUndoPaste::ScUndoPaste( ScDocShell* pNewDocShell,
873cdf0e10cSrcweir SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
874cdf0e10cSrcweir SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
875cdf0e10cSrcweir const ScMarkData& rMark,
876cdf0e10cSrcweir ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc,
877cdf0e10cSrcweir sal_uInt16 nNewFlags,
878cdf0e10cSrcweir ScRefUndoData* pRefData,
879cdf0e10cSrcweir void* /* pFill1 */, void* /* pFill2 */, void* /* pFill3 */,
880cdf0e10cSrcweir sal_Bool bRedoIsFilled, const ScUndoPasteOptions* pOptions ) :
881cdf0e10cSrcweir ScBlockUndo( pNewDocShell, ScRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), SC_UNDO_SIMPLE ),
882cdf0e10cSrcweir aMarkData( rMark ),
883cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
884cdf0e10cSrcweir pRedoDoc( pNewRedoDoc ),
885cdf0e10cSrcweir nFlags( nNewFlags ),
886cdf0e10cSrcweir pRefUndoData( pRefData ),
887cdf0e10cSrcweir pRefRedoData( NULL ),
888cdf0e10cSrcweir bRedoFilled( bRedoIsFilled )
889cdf0e10cSrcweir {
890cdf0e10cSrcweir // pFill1,pFill2,pFill3 are there so the ctor calls for simple paste (without cutting)
891cdf0e10cSrcweir // don't have to be changed and branched for 641.
892cdf0e10cSrcweir // They can be removed later.
893cdf0e10cSrcweir
894cdf0e10cSrcweir if ( !aMarkData.IsMarked() ) // no cell marked:
895cdf0e10cSrcweir aMarkData.SetMarkArea( aBlockRange ); // mark paste block
896cdf0e10cSrcweir
897cdf0e10cSrcweir if ( pRefUndoData )
898cdf0e10cSrcweir pRefUndoData->DeleteUnchanged( pDocShell->GetDocument() );
899cdf0e10cSrcweir
900cdf0e10cSrcweir if ( pOptions )
901cdf0e10cSrcweir aPasteOptions = *pOptions; // used only for Repeat
902cdf0e10cSrcweir
903cdf0e10cSrcweir SetChangeTrack();
904cdf0e10cSrcweir }
905cdf0e10cSrcweir
~ScUndoPaste()906cdf0e10cSrcweir __EXPORT ScUndoPaste::~ScUndoPaste()
907cdf0e10cSrcweir {
908cdf0e10cSrcweir delete pUndoDoc;
909cdf0e10cSrcweir delete pRedoDoc;
910cdf0e10cSrcweir delete pRefUndoData;
911cdf0e10cSrcweir delete pRefRedoData;
912cdf0e10cSrcweir }
913cdf0e10cSrcweir
GetComment() const914cdf0e10cSrcweir String __EXPORT ScUndoPaste::GetComment() const
915cdf0e10cSrcweir {
916cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_PASTE ); // "Einfuegen"
917cdf0e10cSrcweir }
918cdf0e10cSrcweir
SetChangeTrack()919cdf0e10cSrcweir void ScUndoPaste::SetChangeTrack()
920cdf0e10cSrcweir {
921cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
922cdf0e10cSrcweir if ( pChangeTrack && (nFlags & IDF_CONTENTS) )
923cdf0e10cSrcweir pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
924cdf0e10cSrcweir nStartChangeAction, nEndChangeAction, SC_CACM_PASTE );
925cdf0e10cSrcweir else
926cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0;
927cdf0e10cSrcweir }
928cdf0e10cSrcweir
DoChange(const sal_Bool bUndo)929cdf0e10cSrcweir void ScUndoPaste::DoChange( const sal_Bool bUndo )
930cdf0e10cSrcweir {
931cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
932cdf0e10cSrcweir
933cdf0e10cSrcweir // RefUndoData for redo is created before first undo
934cdf0e10cSrcweir // (with DeleteUnchanged after the DoUndo call)
935cdf0e10cSrcweir sal_Bool bCreateRedoData = ( bUndo && pRefUndoData && !pRefRedoData );
936cdf0e10cSrcweir if ( bCreateRedoData )
937cdf0e10cSrcweir pRefRedoData = new ScRefUndoData( pDoc );
938cdf0e10cSrcweir
939cdf0e10cSrcweir ScRefUndoData* pWorkRefData = bUndo ? pRefUndoData : pRefRedoData;
940cdf0e10cSrcweir
941cdf0e10cSrcweir // fuer Undo immer alle oder keine Inhalte sichern
942cdf0e10cSrcweir sal_uInt16 nUndoFlags = IDF_NONE;
943cdf0e10cSrcweir if (nFlags & IDF_CONTENTS)
944cdf0e10cSrcweir nUndoFlags |= IDF_CONTENTS;
945cdf0e10cSrcweir if (nFlags & IDF_ATTRIB)
946cdf0e10cSrcweir nUndoFlags |= IDF_ATTRIB;
947cdf0e10cSrcweir
948cdf0e10cSrcweir // do not undo/redo objects and note captions, they are handled via drawing undo
949cdf0e10cSrcweir (nUndoFlags &= ~IDF_OBJECTS) |= IDF_NOCAPTIONS;
950cdf0e10cSrcweir
951cdf0e10cSrcweir sal_Bool bPaintAll = sal_False;
952cdf0e10cSrcweir
953cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
954cdf0e10cSrcweir
955cdf0e10cSrcweir // marking is in ScBlockUndo...
956cdf0e10cSrcweir ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockRange );
957cdf0e10cSrcweir
958cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
959cdf0e10cSrcweir if ( bUndo && !bRedoFilled )
960cdf0e10cSrcweir {
961cdf0e10cSrcweir if (!pRedoDoc)
962cdf0e10cSrcweir {
963cdf0e10cSrcweir sal_Bool bColInfo = ( aBlockRange.aStart.Row()==0 && aBlockRange.aEnd.Row()==MAXROW );
964cdf0e10cSrcweir sal_Bool bRowInfo = ( aBlockRange.aStart.Col()==0 && aBlockRange.aEnd.Col()==MAXCOL );
965cdf0e10cSrcweir
966cdf0e10cSrcweir pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
967cdf0e10cSrcweir pRedoDoc->InitUndoSelected( pDoc, aMarkData, bColInfo, bRowInfo );
968cdf0e10cSrcweir }
969cdf0e10cSrcweir // read "redo" data from the document in the first undo
970cdf0e10cSrcweir // all sheets - CopyToDocument skips those that don't exist in pRedoDoc
971cdf0e10cSrcweir ScRange aCopyRange = aBlockRange;
972cdf0e10cSrcweir aCopyRange.aStart.SetTab(0);
973cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1);
974cdf0e10cSrcweir pDoc->CopyToDocument( aCopyRange, nUndoFlags, sal_False, pRedoDoc );
975cdf0e10cSrcweir bRedoFilled = sal_True;
976cdf0e10cSrcweir }
977cdf0e10cSrcweir
978cdf0e10cSrcweir sal_uInt16 nExtFlags = 0;
979cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aBlockRange );
980cdf0e10cSrcweir
981cdf0e10cSrcweir aMarkData.MarkToMulti();
982cdf0e10cSrcweir pDoc->DeleteSelection( nUndoFlags, aMarkData );
983cdf0e10cSrcweir aMarkData.MarkToSimple();
984cdf0e10cSrcweir
985cdf0e10cSrcweir SCTAB nFirstSelected = aMarkData.GetFirstSelected();
986cdf0e10cSrcweir ScRange aTabSelectRange = aBlockRange;
987cdf0e10cSrcweir SCTAB nTab;
988cdf0e10cSrcweir
989cdf0e10cSrcweir if ( !bUndo && pRedoDoc ) // Redo: UndoToDocument before handling RefData
990cdf0e10cSrcweir {
991cdf0e10cSrcweir aTabSelectRange.aStart.SetTab( nFirstSelected );
992cdf0e10cSrcweir aTabSelectRange.aEnd.SetTab( nFirstSelected );
993cdf0e10cSrcweir pRedoDoc->UndoToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
994cdf0e10cSrcweir for (nTab=0; nTab<nTabCount; nTab++)
995cdf0e10cSrcweir if (nTab != nFirstSelected && aMarkData.GetTableSelect(nTab))
996cdf0e10cSrcweir {
997cdf0e10cSrcweir aTabSelectRange.aStart.SetTab( nTab );
998cdf0e10cSrcweir aTabSelectRange.aEnd.SetTab( nTab );
999cdf0e10cSrcweir pRedoDoc->CopyToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
1000cdf0e10cSrcweir }
1001cdf0e10cSrcweir }
1002cdf0e10cSrcweir
1003cdf0e10cSrcweir if (pWorkRefData)
1004cdf0e10cSrcweir {
1005cdf0e10cSrcweir pWorkRefData->DoUndo( pDoc, sal_True ); // sal_True = bSetChartRangeLists for SetChartListenerCollection
1006cdf0e10cSrcweir if ( pDoc->RefreshAutoFilter( 0,0, MAXCOL,MAXROW, aBlockRange.aStart.Tab() ) )
1007cdf0e10cSrcweir bPaintAll = sal_True;
1008cdf0e10cSrcweir }
1009cdf0e10cSrcweir
1010cdf0e10cSrcweir if ( bCreateRedoData && pRefRedoData )
1011cdf0e10cSrcweir pRefRedoData->DeleteUnchanged( pDoc );
1012cdf0e10cSrcweir
1013cdf0e10cSrcweir if (bUndo) // Undo: UndoToDocument after handling RefData
1014cdf0e10cSrcweir {
1015cdf0e10cSrcweir aTabSelectRange.aStart.SetTab( nFirstSelected );
1016cdf0e10cSrcweir aTabSelectRange.aEnd.SetTab( nFirstSelected );
1017cdf0e10cSrcweir pUndoDoc->UndoToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
1018cdf0e10cSrcweir for (nTab=0; nTab<nTabCount; nTab++)
1019cdf0e10cSrcweir if (nTab != nFirstSelected && aMarkData.GetTableSelect(nTab))
1020cdf0e10cSrcweir {
1021cdf0e10cSrcweir aTabSelectRange.aStart.SetTab( nTab );
1022cdf0e10cSrcweir aTabSelectRange.aEnd.SetTab( nTab );
1023cdf0e10cSrcweir pUndoDoc->UndoToDocument( aTabSelectRange, nUndoFlags, sal_False, pDoc );
1024cdf0e10cSrcweir }
1025cdf0e10cSrcweir }
1026cdf0e10cSrcweir
1027cdf0e10cSrcweir if ( bUndo )
1028cdf0e10cSrcweir {
1029cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1030cdf0e10cSrcweir if ( pChangeTrack )
1031cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1032cdf0e10cSrcweir }
1033cdf0e10cSrcweir else
1034cdf0e10cSrcweir SetChangeTrack();
1035cdf0e10cSrcweir
1036cdf0e10cSrcweir ScRange aDrawRange( aBlockRange );
1037cdf0e10cSrcweir pDoc->ExtendMerge( aDrawRange, sal_True ); // only needed for single sheet (text/rtf etc.)
1038cdf0e10cSrcweir sal_uInt16 nPaint = PAINT_GRID;
1039cdf0e10cSrcweir if (bPaintAll)
1040cdf0e10cSrcweir {
1041cdf0e10cSrcweir aDrawRange.aStart.SetCol(0);
1042cdf0e10cSrcweir aDrawRange.aStart.SetRow(0);
1043cdf0e10cSrcweir aDrawRange.aEnd.SetCol(MAXCOL);
1044cdf0e10cSrcweir aDrawRange.aEnd.SetRow(MAXROW);
1045cdf0e10cSrcweir nPaint |= PAINT_TOP | PAINT_LEFT;
1046cdf0e10cSrcweir /*A*/ if (pViewShell)
1047cdf0e10cSrcweir pViewShell->AdjustBlockHeight(sal_False);
1048cdf0e10cSrcweir }
1049cdf0e10cSrcweir else
1050cdf0e10cSrcweir {
1051cdf0e10cSrcweir if ( aBlockRange.aStart.Row() == 0 && aBlockRange.aEnd.Row() == MAXROW ) // ganze Spalte
1052cdf0e10cSrcweir {
1053cdf0e10cSrcweir nPaint |= PAINT_TOP;
1054cdf0e10cSrcweir aDrawRange.aEnd.SetCol(MAXCOL);
1055cdf0e10cSrcweir }
1056cdf0e10cSrcweir if ( aBlockRange.aStart.Col() == 0 && aBlockRange.aEnd.Col() == MAXCOL ) // ganze Zeile
1057cdf0e10cSrcweir {
1058cdf0e10cSrcweir nPaint |= PAINT_LEFT;
1059cdf0e10cSrcweir aDrawRange.aEnd.SetRow(MAXROW);
1060cdf0e10cSrcweir }
1061cdf0e10cSrcweir /*A*/ if ((pViewShell) && pViewShell->AdjustBlockHeight(sal_False))
1062cdf0e10cSrcweir {
1063cdf0e10cSrcweir aDrawRange.aStart.SetCol(0);
1064cdf0e10cSrcweir aDrawRange.aStart.SetRow(0);
1065cdf0e10cSrcweir aDrawRange.aEnd.SetCol(MAXCOL);
1066cdf0e10cSrcweir aDrawRange.aEnd.SetRow(MAXROW);
1067cdf0e10cSrcweir nPaint |= PAINT_LEFT;
1068cdf0e10cSrcweir }
1069cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aDrawRange );
1070cdf0e10cSrcweir }
1071cdf0e10cSrcweir
1072cdf0e10cSrcweir if ( !bUndo ) // draw redo after updating row heights
1073cdf0e10cSrcweir RedoSdrUndoAction( pDrawUndo ); //! include in ScBlockUndo?
1074cdf0e10cSrcweir
1075cdf0e10cSrcweir pDocShell->PostPaint( aDrawRange, nPaint, nExtFlags );
1076cdf0e10cSrcweir
1077cdf0e10cSrcweir pDocShell->PostDataChanged();
1078cdf0e10cSrcweir if (pViewShell)
1079cdf0e10cSrcweir pViewShell->CellContentChanged();
1080cdf0e10cSrcweir }
1081cdf0e10cSrcweir
Undo()1082cdf0e10cSrcweir void __EXPORT ScUndoPaste::Undo()
1083cdf0e10cSrcweir {
1084cdf0e10cSrcweir BeginUndo();
1085cdf0e10cSrcweir DoChange( sal_True );
1086cdf0e10cSrcweir ShowTable( aBlockRange );
1087cdf0e10cSrcweir EndUndo();
1088cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1089cdf0e10cSrcweir }
1090cdf0e10cSrcweir
Redo()1091cdf0e10cSrcweir void __EXPORT ScUndoPaste::Redo()
1092cdf0e10cSrcweir {
1093cdf0e10cSrcweir BeginRedo();
1094cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1095cdf0e10cSrcweir EnableDrawAdjust( pDoc, sal_False ); //! include in ScBlockUndo?
1096cdf0e10cSrcweir DoChange( sal_False );
1097cdf0e10cSrcweir EnableDrawAdjust( pDoc, sal_True ); //! include in ScBlockUndo?
1098cdf0e10cSrcweir EndRedo();
1099cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1100cdf0e10cSrcweir }
1101cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1102cdf0e10cSrcweir void __EXPORT ScUndoPaste::Repeat(SfxRepeatTarget& rTarget)
1103cdf0e10cSrcweir {
1104cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1105cdf0e10cSrcweir {
1106cdf0e10cSrcweir ScTabViewShell* pViewSh = ((ScTabViewTarget&)rTarget).GetViewShell();
1107cdf0e10cSrcweir ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pViewSh->GetActiveWin() );
1108cdf0e10cSrcweir if (pOwnClip)
1109cdf0e10cSrcweir {
1110cdf0e10cSrcweir // #129384# keep a reference in case the clipboard is changed during PasteFromClip
1111cdf0e10cSrcweir com::sun::star::uno::Reference<com::sun::star::datatransfer::XTransferable> aOwnClipRef( pOwnClip );
1112cdf0e10cSrcweir pViewSh->PasteFromClip( nFlags, pOwnClip->GetDocument(),
1113cdf0e10cSrcweir aPasteOptions.nFunction, aPasteOptions.bSkipEmpty, aPasteOptions.bTranspose,
1114cdf0e10cSrcweir aPasteOptions.bAsLink, aPasteOptions.eMoveMode, IDF_NONE,
1115cdf0e10cSrcweir sal_True ); // allow warning dialog
1116cdf0e10cSrcweir }
1117cdf0e10cSrcweir }
1118cdf0e10cSrcweir }
1119cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1120cdf0e10cSrcweir sal_Bool __EXPORT ScUndoPaste::CanRepeat(SfxRepeatTarget& rTarget) const
1121cdf0e10cSrcweir {
1122cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
1123cdf0e10cSrcweir }
1124cdf0e10cSrcweir
1125cdf0e10cSrcweir
1126cdf0e10cSrcweir // -----------------------------------------------------------------------
1127cdf0e10cSrcweir //
1128cdf0e10cSrcweir // Verschieben/Kopieren (Drag & Drop)
1129cdf0e10cSrcweir //
1130cdf0e10cSrcweir
ScUndoDragDrop(ScDocShell * pNewDocShell,const ScRange & rRange,ScAddress aNewDestPos,sal_Bool bNewCut,ScDocument * pUndoDocument,ScRefUndoData * pRefData,sal_Bool bScenario)1131cdf0e10cSrcweir ScUndoDragDrop::ScUndoDragDrop( ScDocShell* pNewDocShell,
1132cdf0e10cSrcweir const ScRange& rRange, ScAddress aNewDestPos, sal_Bool bNewCut,
1133cdf0e10cSrcweir ScDocument* pUndoDocument, ScRefUndoData* pRefData, sal_Bool bScenario ) :
1134cdf0e10cSrcweir ScMoveUndo( pNewDocShell, pUndoDocument, pRefData, SC_UNDO_REFFIRST ),
1135cdf0e10cSrcweir aSrcRange( rRange ),
1136cdf0e10cSrcweir bCut( bNewCut ),
1137cdf0e10cSrcweir bKeepScenarioFlags( bScenario )
1138cdf0e10cSrcweir {
1139cdf0e10cSrcweir ScAddress aDestEnd(aNewDestPos);
1140cdf0e10cSrcweir aDestEnd.IncRow(aSrcRange.aEnd.Row() - aSrcRange.aStart.Row());
1141cdf0e10cSrcweir aDestEnd.IncCol(aSrcRange.aEnd.Col() - aSrcRange.aStart.Col());
1142cdf0e10cSrcweir aDestEnd.IncTab(aSrcRange.aEnd.Tab() - aSrcRange.aStart.Tab());
1143cdf0e10cSrcweir
1144cdf0e10cSrcweir sal_Bool bIncludeFiltered = bCut;
1145cdf0e10cSrcweir if ( !bIncludeFiltered )
1146cdf0e10cSrcweir {
1147cdf0e10cSrcweir // find number of non-filtered rows
1148cdf0e10cSrcweir SCROW nPastedCount = pDocShell->GetDocument()->CountNonFilteredRows(
1149cdf0e10cSrcweir aSrcRange.aStart.Row(), aSrcRange.aEnd.Row(), aSrcRange.aStart.Tab());
1150cdf0e10cSrcweir
1151cdf0e10cSrcweir if ( nPastedCount == 0 )
1152cdf0e10cSrcweir nPastedCount = 1;
1153cdf0e10cSrcweir aDestEnd.SetRow( aNewDestPos.Row() + nPastedCount - 1 );
1154cdf0e10cSrcweir }
1155cdf0e10cSrcweir
1156cdf0e10cSrcweir aDestRange.aStart = aNewDestPos;
1157cdf0e10cSrcweir aDestRange.aEnd = aDestEnd;
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir SetChangeTrack();
1160cdf0e10cSrcweir }
1161cdf0e10cSrcweir
~ScUndoDragDrop()1162cdf0e10cSrcweir __EXPORT ScUndoDragDrop::~ScUndoDragDrop()
1163cdf0e10cSrcweir {
1164cdf0e10cSrcweir }
1165cdf0e10cSrcweir
GetComment() const1166cdf0e10cSrcweir String __EXPORT ScUndoDragDrop::GetComment() const
1167cdf0e10cSrcweir { // "Verschieben" : "Kopieren"
1168cdf0e10cSrcweir return bCut ?
1169cdf0e10cSrcweir ScGlobal::GetRscString( STR_UNDO_MOVE ) :
1170cdf0e10cSrcweir ScGlobal::GetRscString( STR_UNDO_COPY );
1171cdf0e10cSrcweir }
1172cdf0e10cSrcweir
SetChangeTrack()1173cdf0e10cSrcweir void ScUndoDragDrop::SetChangeTrack()
1174cdf0e10cSrcweir {
1175cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
1176cdf0e10cSrcweir if ( pChangeTrack )
1177cdf0e10cSrcweir {
1178cdf0e10cSrcweir if ( bCut )
1179cdf0e10cSrcweir {
1180cdf0e10cSrcweir nStartChangeAction = pChangeTrack->GetActionMax() + 1;
1181cdf0e10cSrcweir pChangeTrack->AppendMove( aSrcRange, aDestRange, pRefUndoDoc );
1182cdf0e10cSrcweir nEndChangeAction = pChangeTrack->GetActionMax();
1183cdf0e10cSrcweir }
1184cdf0e10cSrcweir else
1185cdf0e10cSrcweir pChangeTrack->AppendContentRange( aDestRange, pRefUndoDoc,
1186cdf0e10cSrcweir nStartChangeAction, nEndChangeAction );
1187cdf0e10cSrcweir }
1188cdf0e10cSrcweir else
1189cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0;
1190cdf0e10cSrcweir }
1191cdf0e10cSrcweir
PaintArea(ScRange aRange,sal_uInt16 nExtFlags) const1192cdf0e10cSrcweir void ScUndoDragDrop::PaintArea( ScRange aRange, sal_uInt16 nExtFlags ) const
1193cdf0e10cSrcweir {
1194cdf0e10cSrcweir sal_uInt16 nPaint = PAINT_GRID;
1195cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1196cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1197cdf0e10cSrcweir
1198cdf0e10cSrcweir if (pViewShell)
1199cdf0e10cSrcweir {
1200cdf0e10cSrcweir VirtualDevice aVirtDev;
1201cdf0e10cSrcweir ScViewData* pViewData = pViewShell->GetViewData();
1202cdf0e10cSrcweir
1203cdf0e10cSrcweir if ( pDoc->SetOptimalHeight( aRange.aStart.Row(), aRange.aEnd.Row(),
1204cdf0e10cSrcweir aRange.aStart.Tab(), 0, &aVirtDev,
1205cdf0e10cSrcweir pViewData->GetPPTX(), pViewData->GetPPTY(),
1206cdf0e10cSrcweir pViewData->GetZoomX(), pViewData->GetZoomY(),
1207cdf0e10cSrcweir sal_False ) )
1208cdf0e10cSrcweir {
1209cdf0e10cSrcweir aRange.aStart.SetCol(0);
1210cdf0e10cSrcweir aRange.aEnd.SetCol(MAXCOL);
1211cdf0e10cSrcweir aRange.aEnd.SetRow(MAXROW);
1212cdf0e10cSrcweir nPaint |= PAINT_LEFT;
1213cdf0e10cSrcweir }
1214cdf0e10cSrcweir }
1215cdf0e10cSrcweir
1216cdf0e10cSrcweir if ( bKeepScenarioFlags )
1217cdf0e10cSrcweir {
1218cdf0e10cSrcweir // Szenarien mitkopiert -> auch Szenario-Rahmen painten
1219cdf0e10cSrcweir aRange.aStart.SetCol(0);
1220cdf0e10cSrcweir aRange.aStart.SetRow(0);
1221cdf0e10cSrcweir aRange.aEnd.SetCol(MAXCOL);
1222cdf0e10cSrcweir aRange.aEnd.SetRow(MAXROW);
1223cdf0e10cSrcweir }
1224cdf0e10cSrcweir
1225cdf0e10cSrcweir // column/row info (width/height) included if whole columns/rows were copied
1226cdf0e10cSrcweir if ( aSrcRange.aStart.Col() == 0 && aSrcRange.aEnd.Col() == MAXCOL )
1227cdf0e10cSrcweir {
1228cdf0e10cSrcweir nPaint |= PAINT_LEFT;
1229cdf0e10cSrcweir aRange.aEnd.SetRow(MAXROW);
1230cdf0e10cSrcweir }
1231cdf0e10cSrcweir if ( aSrcRange.aStart.Row() == 0 && aSrcRange.aEnd.Row() == MAXROW )
1232cdf0e10cSrcweir {
1233cdf0e10cSrcweir nPaint |= PAINT_TOP;
1234cdf0e10cSrcweir aRange.aEnd.SetCol(MAXCOL);
1235cdf0e10cSrcweir }
1236cdf0e10cSrcweir
1237cdf0e10cSrcweir pDocShell->PostPaint( aRange, nPaint, nExtFlags );
1238cdf0e10cSrcweir }
1239cdf0e10cSrcweir
1240cdf0e10cSrcweir
DoUndo(ScRange aRange) const1241cdf0e10cSrcweir void ScUndoDragDrop::DoUndo( ScRange aRange ) const
1242cdf0e10cSrcweir {
1243cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1244cdf0e10cSrcweir
1245cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1246cdf0e10cSrcweir if ( pChangeTrack )
1247cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1248cdf0e10cSrcweir
1249cdf0e10cSrcweir //? DB-Areas vor Daten, damit bei ExtendMerge die Autofilter-Knoepfe stimmen
1250cdf0e10cSrcweir
1251cdf0e10cSrcweir ScRange aPaintRange = aRange;
1252cdf0e10cSrcweir pDoc->ExtendMerge( aPaintRange ); // before deleting
1253cdf0e10cSrcweir
1254cdf0e10cSrcweir sal_uInt16 nExtFlags = 0;
1255cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aPaintRange );
1256cdf0e10cSrcweir
1257cdf0e10cSrcweir // do not undo objects and note captions, they are handled via drawing undo
1258cdf0e10cSrcweir sal_uInt16 nUndoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
1259cdf0e10cSrcweir
1260cdf0e10cSrcweir pDoc->DeleteAreaTab( aRange, nUndoFlags );
1261cdf0e10cSrcweir pRefUndoDoc->CopyToDocument( aRange, nUndoFlags, sal_False, pDoc );
1262cdf0e10cSrcweir if ( pDoc->HasAttrib( aRange, HASATTR_MERGED ) )
1263cdf0e10cSrcweir pDoc->ExtendMerge( aRange, sal_True );
1264cdf0e10cSrcweir
1265cdf0e10cSrcweir aPaintRange.aEnd.SetCol( Max( aPaintRange.aEnd.Col(), aRange.aEnd.Col() ) );
1266cdf0e10cSrcweir aPaintRange.aEnd.SetRow( Max( aPaintRange.aEnd.Row(), aRange.aEnd.Row() ) );
1267cdf0e10cSrcweir
1268cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aPaintRange );
1269cdf0e10cSrcweir PaintArea( aPaintRange, nExtFlags );
1270cdf0e10cSrcweir }
1271cdf0e10cSrcweir
Undo()1272cdf0e10cSrcweir void __EXPORT ScUndoDragDrop::Undo()
1273cdf0e10cSrcweir {
1274cdf0e10cSrcweir BeginUndo();
1275cdf0e10cSrcweir DoUndo(aDestRange);
1276cdf0e10cSrcweir if (bCut)
1277cdf0e10cSrcweir DoUndo(aSrcRange);
1278cdf0e10cSrcweir EndUndo();
1279cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1280cdf0e10cSrcweir }
1281cdf0e10cSrcweir
Redo()1282cdf0e10cSrcweir void __EXPORT ScUndoDragDrop::Redo()
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir BeginRedo();
1285cdf0e10cSrcweir
1286cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1287cdf0e10cSrcweir ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
1288cdf0e10cSrcweir
1289cdf0e10cSrcweir EnableDrawAdjust( pDoc, sal_False ); //! include in ScBlockUndo?
1290cdf0e10cSrcweir
1291cdf0e10cSrcweir // do not undo/redo objects and note captions, they are handled via drawing undo
1292cdf0e10cSrcweir sal_uInt16 nRedoFlags = (IDF_ALL & ~IDF_OBJECTS) | IDF_NOCAPTIONS;
1293cdf0e10cSrcweir
1294cdf0e10cSrcweir /* TODO: Redoing note captions is quite tricky due to the fact that a
1295cdf0e10cSrcweir helper clip document is used. While (re-)pasting the contents to the
1296cdf0e10cSrcweir destination area, the original pointers to the captions created while
1297cdf0e10cSrcweir dropping have to be restored. A simple CopyFromClip() would create new
1298cdf0e10cSrcweir caption objects that are not tracked by drawing undo, and the captions
1299cdf0e10cSrcweir restored by drawing redo would live without cell note objects pointing
1300cdf0e10cSrcweir to them. So, first, CopyToClip() and CopyFromClip() are called without
1301cdf0e10cSrcweir cloning the caption objects. This leads to cell notes pointing to the
1302cdf0e10cSrcweir wrong captions from source area that will be removed by drawing redo
1303cdf0e10cSrcweir later. Second, the pointers to the new captions have to be restored.
1304cdf0e10cSrcweir Sadly, currently these pointers are not stored anywhere but in the list
1305cdf0e10cSrcweir of drawing undo actions. */
1306cdf0e10cSrcweir
1307cdf0e10cSrcweir SCTAB nTab;
1308cdf0e10cSrcweir ScMarkData aSourceMark;
1309cdf0e10cSrcweir for (nTab=aSrcRange.aStart.Tab(); nTab<=aSrcRange.aEnd.Tab(); nTab++)
1310cdf0e10cSrcweir aSourceMark.SelectTable( nTab, sal_True );
1311cdf0e10cSrcweir
1312cdf0e10cSrcweir // do not clone objects and note captions into clipdoc (see above)
1313cdf0e10cSrcweir ScClipParam aClipParam(aSrcRange, bCut);
1314cdf0e10cSrcweir pDoc->CopyToClip(aClipParam, pClipDoc, &aSourceMark, false, bKeepScenarioFlags, false, false);
1315cdf0e10cSrcweir
1316cdf0e10cSrcweir if (bCut)
1317cdf0e10cSrcweir {
1318cdf0e10cSrcweir ScRange aSrcPaintRange = aSrcRange;
1319cdf0e10cSrcweir pDoc->ExtendMerge( aSrcPaintRange ); // before deleting
1320cdf0e10cSrcweir sal_uInt16 nExtFlags = 0;
1321cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aSrcPaintRange );
1322cdf0e10cSrcweir pDoc->DeleteAreaTab( aSrcRange, nRedoFlags );
1323cdf0e10cSrcweir PaintArea( aSrcPaintRange, nExtFlags );
1324cdf0e10cSrcweir }
1325cdf0e10cSrcweir
1326cdf0e10cSrcweir ScMarkData aDestMark;
1327cdf0e10cSrcweir for (nTab=aDestRange.aStart.Tab(); nTab<=aDestRange.aEnd.Tab(); nTab++)
1328cdf0e10cSrcweir aDestMark.SelectTable( nTab, sal_True );
1329cdf0e10cSrcweir
1330cdf0e10cSrcweir sal_Bool bIncludeFiltered = bCut;
1331cdf0e10cSrcweir // TODO: restore old note captions instead of cloning new captions...
1332cdf0e10cSrcweir pDoc->CopyFromClip( aDestRange, aDestMark, IDF_ALL & ~IDF_OBJECTS, NULL, pClipDoc, sal_True, sal_False, bIncludeFiltered );
1333cdf0e10cSrcweir
1334cdf0e10cSrcweir if (bCut)
1335cdf0e10cSrcweir for (nTab=aSrcRange.aStart.Tab(); nTab<=aSrcRange.aEnd.Tab(); nTab++)
1336cdf0e10cSrcweir pDoc->RefreshAutoFilter( aSrcRange.aStart.Col(), aSrcRange.aStart.Row(),
1337cdf0e10cSrcweir aSrcRange.aEnd.Col(), aSrcRange.aEnd.Row(), nTab );
1338cdf0e10cSrcweir
1339cdf0e10cSrcweir // skipped rows and merged cells don't mix
1340cdf0e10cSrcweir if ( !bIncludeFiltered && pClipDoc->HasClipFilteredRows() )
1341cdf0e10cSrcweir pDocShell->GetDocFunc().UnmergeCells( aDestRange, sal_False, sal_True );
1342cdf0e10cSrcweir
1343cdf0e10cSrcweir for (nTab=aDestRange.aStart.Tab(); nTab<=aDestRange.aEnd.Tab(); nTab++)
1344cdf0e10cSrcweir {
1345cdf0e10cSrcweir SCCOL nEndCol = aDestRange.aEnd.Col();
1346cdf0e10cSrcweir SCROW nEndRow = aDestRange.aEnd.Row();
1347cdf0e10cSrcweir pDoc->ExtendMerge( aDestRange.aStart.Col(), aDestRange.aStart.Row(),
1348cdf0e10cSrcweir nEndCol, nEndRow, nTab, sal_True );
1349cdf0e10cSrcweir PaintArea( ScRange( aDestRange.aStart.Col(), aDestRange.aStart.Row(), nTab,
1350cdf0e10cSrcweir nEndCol, nEndRow, nTab ), 0 );
1351cdf0e10cSrcweir }
1352cdf0e10cSrcweir
1353cdf0e10cSrcweir SetChangeTrack();
1354cdf0e10cSrcweir
1355cdf0e10cSrcweir delete pClipDoc;
1356cdf0e10cSrcweir ShowTable( aDestRange.aStart.Tab() );
1357cdf0e10cSrcweir
1358cdf0e10cSrcweir RedoSdrUndoAction( pDrawUndo ); //! include in ScBlockUndo?
1359cdf0e10cSrcweir EnableDrawAdjust( pDoc, sal_True ); //! include in ScBlockUndo?
1360cdf0e10cSrcweir
1361cdf0e10cSrcweir EndRedo();
1362cdf0e10cSrcweir SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
1363cdf0e10cSrcweir }
1364cdf0e10cSrcweir
Repeat(SfxRepeatTarget &)1365cdf0e10cSrcweir void __EXPORT ScUndoDragDrop::Repeat(SfxRepeatTarget& /* rTarget */)
1366cdf0e10cSrcweir {
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget &) const1369cdf0e10cSrcweir sal_Bool __EXPORT ScUndoDragDrop::CanRepeat(SfxRepeatTarget& /* rTarget */) const
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir return sal_False; // geht nicht
1372cdf0e10cSrcweir }
1373cdf0e10cSrcweir
1374cdf0e10cSrcweir
1375cdf0e10cSrcweir // -----------------------------------------------------------------------
1376cdf0e10cSrcweir //
1377cdf0e10cSrcweir // Liste der Bereichsnamen einfuegen
1378cdf0e10cSrcweir // (Einfuegen|Name|Einfuegen =>[Liste])
1379cdf0e10cSrcweir //
1380cdf0e10cSrcweir
ScUndoListNames(ScDocShell * pNewDocShell,const ScRange & rRange,ScDocument * pNewUndoDoc,ScDocument * pNewRedoDoc)1381cdf0e10cSrcweir ScUndoListNames::ScUndoListNames( ScDocShell* pNewDocShell, const ScRange& rRange,
1382cdf0e10cSrcweir ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc ) :
1383cdf0e10cSrcweir ScBlockUndo( pNewDocShell, rRange, SC_UNDO_AUTOHEIGHT ),
1384cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
1385cdf0e10cSrcweir pRedoDoc( pNewRedoDoc )
1386cdf0e10cSrcweir {
1387cdf0e10cSrcweir }
1388cdf0e10cSrcweir
~ScUndoListNames()1389cdf0e10cSrcweir __EXPORT ScUndoListNames::~ScUndoListNames()
1390cdf0e10cSrcweir {
1391cdf0e10cSrcweir delete pUndoDoc;
1392cdf0e10cSrcweir delete pRedoDoc;
1393cdf0e10cSrcweir }
1394cdf0e10cSrcweir
GetComment() const1395cdf0e10cSrcweir String __EXPORT ScUndoListNames::GetComment() const
1396cdf0e10cSrcweir {
1397cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_LISTNAMES );
1398cdf0e10cSrcweir }
1399cdf0e10cSrcweir
DoChange(ScDocument * pSrcDoc) const1400cdf0e10cSrcweir void ScUndoListNames::DoChange( ScDocument* pSrcDoc ) const
1401cdf0e10cSrcweir {
1402cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1403cdf0e10cSrcweir
1404cdf0e10cSrcweir pDoc->DeleteAreaTab( aBlockRange, IDF_ALL );
1405cdf0e10cSrcweir pSrcDoc->CopyToDocument( aBlockRange, IDF_ALL, sal_False, pDoc );
1406cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID );
1407cdf0e10cSrcweir pDocShell->PostDataChanged();
1408cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1409cdf0e10cSrcweir if (pViewShell)
1410cdf0e10cSrcweir pViewShell->CellContentChanged();
1411cdf0e10cSrcweir }
1412cdf0e10cSrcweir
Undo()1413cdf0e10cSrcweir void __EXPORT ScUndoListNames::Undo()
1414cdf0e10cSrcweir {
1415cdf0e10cSrcweir BeginUndo();
1416cdf0e10cSrcweir DoChange(pUndoDoc);
1417cdf0e10cSrcweir EndUndo();
1418cdf0e10cSrcweir }
1419cdf0e10cSrcweir
Redo()1420cdf0e10cSrcweir void __EXPORT ScUndoListNames::Redo()
1421cdf0e10cSrcweir {
1422cdf0e10cSrcweir BeginRedo();
1423cdf0e10cSrcweir DoChange(pRedoDoc);
1424cdf0e10cSrcweir EndRedo();
1425cdf0e10cSrcweir }
1426cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1427cdf0e10cSrcweir void __EXPORT ScUndoListNames::Repeat(SfxRepeatTarget& rTarget)
1428cdf0e10cSrcweir {
1429cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1430cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->InsertNameList();
1431cdf0e10cSrcweir }
1432cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1433cdf0e10cSrcweir sal_Bool __EXPORT ScUndoListNames::CanRepeat(SfxRepeatTarget& rTarget) const
1434cdf0e10cSrcweir {
1435cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
1436cdf0e10cSrcweir }
1437cdf0e10cSrcweir
1438cdf0e10cSrcweir
1439cdf0e10cSrcweir // -----------------------------------------------------------------------
1440cdf0e10cSrcweir //
1441cdf0e10cSrcweir // Szenario anwenden
1442cdf0e10cSrcweir // (Extras|Szenarien)
1443cdf0e10cSrcweir //
1444cdf0e10cSrcweir
ScUndoUseScenario(ScDocShell * pNewDocShell,const ScMarkData & rMark,const ScArea & rDestArea,ScDocument * pNewUndoDoc,const String & rNewName)1445cdf0e10cSrcweir ScUndoUseScenario::ScUndoUseScenario( ScDocShell* pNewDocShell,
1446cdf0e10cSrcweir const ScMarkData& rMark,
1447cdf0e10cSrcweir /*C*/ const ScArea& rDestArea,
1448cdf0e10cSrcweir ScDocument* pNewUndoDoc,
1449cdf0e10cSrcweir const String& rNewName ) :
1450cdf0e10cSrcweir ScSimpleUndo( pNewDocShell ),
1451cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
1452cdf0e10cSrcweir aMarkData( rMark ),
1453cdf0e10cSrcweir aName( rNewName )
1454cdf0e10cSrcweir {
1455cdf0e10cSrcweir aRange.aStart.SetCol(rDestArea.nColStart);
1456cdf0e10cSrcweir aRange.aStart.SetRow(rDestArea.nRowStart);
1457cdf0e10cSrcweir aRange.aStart.SetTab(rDestArea.nTab);
1458cdf0e10cSrcweir aRange.aEnd.SetCol(rDestArea.nColEnd);
1459cdf0e10cSrcweir aRange.aEnd.SetRow(rDestArea.nRowEnd);
1460cdf0e10cSrcweir aRange.aEnd.SetTab(rDestArea.nTab);
1461cdf0e10cSrcweir }
1462cdf0e10cSrcweir
~ScUndoUseScenario()1463cdf0e10cSrcweir __EXPORT ScUndoUseScenario::~ScUndoUseScenario()
1464cdf0e10cSrcweir {
1465cdf0e10cSrcweir delete pUndoDoc;
1466cdf0e10cSrcweir }
1467cdf0e10cSrcweir
GetComment() const1468cdf0e10cSrcweir String __EXPORT ScUndoUseScenario::GetComment() const
1469cdf0e10cSrcweir {
1470cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_USESCENARIO );
1471cdf0e10cSrcweir }
1472cdf0e10cSrcweir
Undo()1473cdf0e10cSrcweir void __EXPORT ScUndoUseScenario::Undo()
1474cdf0e10cSrcweir {
1475cdf0e10cSrcweir BeginUndo();
1476cdf0e10cSrcweir
1477cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1478cdf0e10cSrcweir if (pViewShell)
1479cdf0e10cSrcweir {
1480cdf0e10cSrcweir pViewShell->DoneBlockMode();
1481cdf0e10cSrcweir pViewShell->InitOwnBlockMode();
1482cdf0e10cSrcweir }
1483cdf0e10cSrcweir
1484cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1485cdf0e10cSrcweir pDoc->DeleteSelection( IDF_ALL, aMarkData );
1486cdf0e10cSrcweir pUndoDoc->CopyToDocument( aRange, IDF_ALL, sal_True, pDoc, &aMarkData );
1487cdf0e10cSrcweir
1488cdf0e10cSrcweir // Szenario-Tabellen
1489cdf0e10cSrcweir sal_Bool bFrame = sal_False;
1490cdf0e10cSrcweir SCTAB nTab = aRange.aStart.Tab();
1491cdf0e10cSrcweir SCTAB nEndTab = nTab;
1492cdf0e10cSrcweir while ( pUndoDoc->HasTable(nEndTab+1) && pUndoDoc->IsScenario(nEndTab+1) )
1493cdf0e10cSrcweir ++nEndTab;
1494cdf0e10cSrcweir for (SCTAB i = nTab+1; i<=nEndTab; i++)
1495cdf0e10cSrcweir {
1496cdf0e10cSrcweir // Flags immer
1497cdf0e10cSrcweir String aComment;
1498cdf0e10cSrcweir Color aColor;
1499cdf0e10cSrcweir sal_uInt16 nScenFlags;
1500cdf0e10cSrcweir pUndoDoc->GetScenarioData( i, aComment, aColor, nScenFlags );
1501cdf0e10cSrcweir pDoc->SetScenarioData( i, aComment, aColor, nScenFlags );
1502cdf0e10cSrcweir sal_Bool bActive = pUndoDoc->IsActiveScenario( i );
1503cdf0e10cSrcweir pDoc->SetActiveScenario( i, bActive );
1504cdf0e10cSrcweir // Bei Zurueckkopier-Szenarios auch Inhalte
1505cdf0e10cSrcweir if ( nScenFlags & SC_SCENARIO_TWOWAY )
1506cdf0e10cSrcweir {
1507cdf0e10cSrcweir pDoc->DeleteAreaTab( 0,0, MAXCOL,MAXROW, i, IDF_ALL );
1508cdf0e10cSrcweir pUndoDoc->CopyToDocument( 0,0,i, MAXCOL,MAXROW,i, IDF_ALL,sal_False, pDoc );
1509cdf0e10cSrcweir }
1510cdf0e10cSrcweir if ( nScenFlags & SC_SCENARIO_SHOWFRAME )
1511cdf0e10cSrcweir bFrame = sal_True;
1512cdf0e10cSrcweir }
1513cdf0e10cSrcweir
1514cdf0e10cSrcweir // Wenn sichtbare Rahmen, dann alles painten
1515cdf0e10cSrcweir if (bFrame)
1516cdf0e10cSrcweir pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID | PAINT_EXTRAS );
1517cdf0e10cSrcweir else
1518cdf0e10cSrcweir pDocShell->PostPaint( aRange, PAINT_GRID | PAINT_EXTRAS );
1519cdf0e10cSrcweir pDocShell->PostDataChanged();
1520cdf0e10cSrcweir if (pViewShell)
1521cdf0e10cSrcweir pViewShell->CellContentChanged();
1522cdf0e10cSrcweir
1523cdf0e10cSrcweir ShowTable( aRange.aStart.Tab() );
1524cdf0e10cSrcweir
1525cdf0e10cSrcweir EndUndo();
1526cdf0e10cSrcweir }
1527cdf0e10cSrcweir
Redo()1528cdf0e10cSrcweir void __EXPORT ScUndoUseScenario::Redo()
1529cdf0e10cSrcweir {
1530cdf0e10cSrcweir SCTAB nTab = aRange.aStart.Tab();
1531cdf0e10cSrcweir BeginRedo();
1532cdf0e10cSrcweir
1533cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1534cdf0e10cSrcweir if (pViewShell)
1535cdf0e10cSrcweir {
1536cdf0e10cSrcweir pViewShell->SetTabNo( nTab );
1537cdf0e10cSrcweir pViewShell->DoneBlockMode();
1538cdf0e10cSrcweir pViewShell->InitOwnBlockMode();
1539cdf0e10cSrcweir }
1540cdf0e10cSrcweir
1541cdf0e10cSrcweir pDocShell->UseScenario( nTab, aName, sal_False );
1542cdf0e10cSrcweir
1543cdf0e10cSrcweir EndRedo();
1544cdf0e10cSrcweir }
1545cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1546cdf0e10cSrcweir void __EXPORT ScUndoUseScenario::Repeat(SfxRepeatTarget& rTarget)
1547cdf0e10cSrcweir {
1548cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1549cdf0e10cSrcweir {
1550cdf0e10cSrcweir String aTemp = aName;
1551cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->UseScenario(aTemp);
1552cdf0e10cSrcweir }
1553cdf0e10cSrcweir }
1554cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1555cdf0e10cSrcweir sal_Bool __EXPORT ScUndoUseScenario::CanRepeat(SfxRepeatTarget& rTarget) const
1556cdf0e10cSrcweir {
1557cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1558cdf0e10cSrcweir {
1559cdf0e10cSrcweir ScViewData* pViewData = ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData();
1560cdf0e10cSrcweir return !pViewData->GetDocument()->IsScenario( pViewData->GetTabNo() );
1561cdf0e10cSrcweir }
1562cdf0e10cSrcweir return sal_False;
1563cdf0e10cSrcweir }
1564cdf0e10cSrcweir
1565cdf0e10cSrcweir
1566cdf0e10cSrcweir // -----------------------------------------------------------------------
1567cdf0e10cSrcweir //
1568cdf0e10cSrcweir // Vorlage anwenden
1569cdf0e10cSrcweir // (Format|Vorlagenkatalog)
1570cdf0e10cSrcweir //
1571cdf0e10cSrcweir
ScUndoSelectionStyle(ScDocShell * pNewDocShell,const ScMarkData & rMark,const ScRange & rRange,const String & rName,ScDocument * pNewUndoDoc)1572cdf0e10cSrcweir ScUndoSelectionStyle::ScUndoSelectionStyle( ScDocShell* pNewDocShell,
1573cdf0e10cSrcweir const ScMarkData& rMark,
1574cdf0e10cSrcweir const ScRange& rRange,
1575cdf0e10cSrcweir const String& rName,
1576cdf0e10cSrcweir ScDocument* pNewUndoDoc ) :
1577cdf0e10cSrcweir ScSimpleUndo( pNewDocShell ),
1578cdf0e10cSrcweir aMarkData( rMark ),
1579cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
1580cdf0e10cSrcweir aStyleName( rName ),
1581cdf0e10cSrcweir aRange( rRange )
1582cdf0e10cSrcweir {
1583cdf0e10cSrcweir aMarkData.MarkToMulti();
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir
~ScUndoSelectionStyle()1586cdf0e10cSrcweir __EXPORT ScUndoSelectionStyle::~ScUndoSelectionStyle()
1587cdf0e10cSrcweir {
1588cdf0e10cSrcweir delete pUndoDoc;
1589cdf0e10cSrcweir }
1590cdf0e10cSrcweir
GetComment() const1591cdf0e10cSrcweir String __EXPORT ScUndoSelectionStyle::GetComment() const
1592cdf0e10cSrcweir {
1593cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_APPLYCELLSTYLE );
1594cdf0e10cSrcweir }
1595cdf0e10cSrcweir
DoChange(const sal_Bool bUndo)1596cdf0e10cSrcweir void ScUndoSelectionStyle::DoChange( const sal_Bool bUndo )
1597cdf0e10cSrcweir {
1598cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1599cdf0e10cSrcweir
1600cdf0e10cSrcweir SetViewMarkData( aMarkData );
1601cdf0e10cSrcweir
1602cdf0e10cSrcweir ScRange aWorkRange( aRange );
1603cdf0e10cSrcweir if ( pDoc->HasAttrib( aWorkRange, HASATTR_MERGED ) ) // zusammengefasste Zellen?
1604cdf0e10cSrcweir pDoc->ExtendMerge( aWorkRange, sal_True );
1605cdf0e10cSrcweir
1606cdf0e10cSrcweir sal_uInt16 nExtFlags = 0;
1607cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aWorkRange );
1608cdf0e10cSrcweir
1609cdf0e10cSrcweir if (bUndo) // bei Undo alte Daten wieder reinschubsen
1610cdf0e10cSrcweir {
1611cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
1612cdf0e10cSrcweir ScRange aCopyRange = aWorkRange;
1613cdf0e10cSrcweir aCopyRange.aStart.SetTab(0);
1614cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1);
1615cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
1616cdf0e10cSrcweir }
1617cdf0e10cSrcweir else // bei Redo Style wieder zuweisen
1618cdf0e10cSrcweir {
1619cdf0e10cSrcweir ScStyleSheetPool* pStlPool = pDoc->GetStyleSheetPool();
1620cdf0e10cSrcweir ScStyleSheet* pStyleSheet =
1621cdf0e10cSrcweir (ScStyleSheet*) pStlPool->Find( aStyleName, SFX_STYLE_FAMILY_PARA );
1622cdf0e10cSrcweir if (!pStyleSheet)
1623cdf0e10cSrcweir {
1624cdf0e10cSrcweir DBG_ERROR("StyleSheet not found");
1625cdf0e10cSrcweir return;
1626cdf0e10cSrcweir }
1627cdf0e10cSrcweir pDoc->ApplySelectionStyle( *pStyleSheet, aMarkData );
1628cdf0e10cSrcweir }
1629cdf0e10cSrcweir
1630cdf0e10cSrcweir pDocShell->UpdatePaintExt( nExtFlags, aWorkRange );
1631cdf0e10cSrcweir
1632cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1633cdf0e10cSrcweir if ( !( (pViewShell) && pViewShell->AdjustBlockHeight() ) )
1634cdf0e10cSrcweir /*A*/ pDocShell->PostPaint( aWorkRange, PAINT_GRID | PAINT_EXTRAS, nExtFlags );
1635cdf0e10cSrcweir
1636cdf0e10cSrcweir ShowTable( aWorkRange.aStart.Tab() );
1637cdf0e10cSrcweir }
1638cdf0e10cSrcweir
Undo()1639cdf0e10cSrcweir void __EXPORT ScUndoSelectionStyle::Undo()
1640cdf0e10cSrcweir {
1641cdf0e10cSrcweir BeginUndo();
1642cdf0e10cSrcweir DoChange( sal_True );
1643cdf0e10cSrcweir EndUndo();
1644cdf0e10cSrcweir }
1645cdf0e10cSrcweir
Redo()1646cdf0e10cSrcweir void __EXPORT ScUndoSelectionStyle::Redo()
1647cdf0e10cSrcweir {
1648cdf0e10cSrcweir BeginRedo();
1649cdf0e10cSrcweir DoChange( sal_False );
1650cdf0e10cSrcweir EndRedo();
1651cdf0e10cSrcweir }
1652cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1653cdf0e10cSrcweir void __EXPORT ScUndoSelectionStyle::Repeat(SfxRepeatTarget& rTarget)
1654cdf0e10cSrcweir {
1655cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1656cdf0e10cSrcweir {
1657cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1658cdf0e10cSrcweir ScStyleSheetPool* pStlPool = pDoc->GetStyleSheetPool();
1659cdf0e10cSrcweir ScStyleSheet* pStyleSheet = (ScStyleSheet*) pStlPool->
1660cdf0e10cSrcweir Find( aStyleName, SFX_STYLE_FAMILY_PARA );
1661cdf0e10cSrcweir if (!pStyleSheet)
1662cdf0e10cSrcweir {
1663cdf0e10cSrcweir DBG_ERROR("StyleSheet not found");
1664cdf0e10cSrcweir return;
1665cdf0e10cSrcweir }
1666cdf0e10cSrcweir
1667cdf0e10cSrcweir ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
1668cdf0e10cSrcweir rViewShell.SetStyleSheetToMarked( pStyleSheet, sal_True );
1669cdf0e10cSrcweir }
1670cdf0e10cSrcweir }
1671cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1672cdf0e10cSrcweir sal_Bool __EXPORT ScUndoSelectionStyle::CanRepeat(SfxRepeatTarget& rTarget) const
1673cdf0e10cSrcweir {
1674cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
1675cdf0e10cSrcweir }
1676cdf0e10cSrcweir
GetId() const1677cdf0e10cSrcweir sal_uInt16 __EXPORT ScUndoSelectionStyle::GetId() const
1678cdf0e10cSrcweir {
1679cdf0e10cSrcweir return STR_UNDO_APPLYCELLSTYLE;
1680cdf0e10cSrcweir }
1681cdf0e10cSrcweir
1682cdf0e10cSrcweir
1683cdf0e10cSrcweir // -----------------------------------------------------------------------
1684cdf0e10cSrcweir //
1685cdf0e10cSrcweir // Matrix-Formel eingeben
1686cdf0e10cSrcweir //
1687cdf0e10cSrcweir
ScUndoEnterMatrix(ScDocShell * pNewDocShell,const ScRange & rArea,ScDocument * pNewUndoDoc,const String & rForm)1688cdf0e10cSrcweir ScUndoEnterMatrix::ScUndoEnterMatrix( ScDocShell* pNewDocShell, const ScRange& rArea,
1689cdf0e10cSrcweir ScDocument* pNewUndoDoc, const String& rForm ) :
1690cdf0e10cSrcweir ScBlockUndo( pNewDocShell, rArea, SC_UNDO_SIMPLE ),
1691cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
1692cdf0e10cSrcweir aFormula( rForm )
1693cdf0e10cSrcweir {
1694cdf0e10cSrcweir SetChangeTrack();
1695cdf0e10cSrcweir }
1696cdf0e10cSrcweir
~ScUndoEnterMatrix()1697cdf0e10cSrcweir __EXPORT ScUndoEnterMatrix::~ScUndoEnterMatrix()
1698cdf0e10cSrcweir {
1699cdf0e10cSrcweir delete pUndoDoc;
1700cdf0e10cSrcweir }
1701cdf0e10cSrcweir
GetComment() const1702cdf0e10cSrcweir String __EXPORT ScUndoEnterMatrix::GetComment() const
1703cdf0e10cSrcweir {
1704cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_ENTERMATRIX );
1705cdf0e10cSrcweir }
1706cdf0e10cSrcweir
SetChangeTrack()1707cdf0e10cSrcweir void ScUndoEnterMatrix::SetChangeTrack()
1708cdf0e10cSrcweir {
1709cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1710cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1711cdf0e10cSrcweir if ( pChangeTrack )
1712cdf0e10cSrcweir pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
1713cdf0e10cSrcweir nStartChangeAction, nEndChangeAction );
1714cdf0e10cSrcweir else
1715cdf0e10cSrcweir nStartChangeAction = nEndChangeAction = 0;
1716cdf0e10cSrcweir }
1717cdf0e10cSrcweir
Undo()1718cdf0e10cSrcweir void __EXPORT ScUndoEnterMatrix::Undo()
1719cdf0e10cSrcweir {
1720cdf0e10cSrcweir BeginUndo();
1721cdf0e10cSrcweir
1722cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1723cdf0e10cSrcweir
1724cdf0e10cSrcweir pDoc->DeleteAreaTab( aBlockRange, IDF_ALL & ~IDF_NOTE );
1725cdf0e10cSrcweir pUndoDoc->CopyToDocument( aBlockRange, IDF_ALL & ~IDF_NOTE, sal_False, pDoc );
1726cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID );
1727cdf0e10cSrcweir pDocShell->PostDataChanged();
1728cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
1729cdf0e10cSrcweir if (pViewShell)
1730cdf0e10cSrcweir pViewShell->CellContentChanged();
1731cdf0e10cSrcweir
1732cdf0e10cSrcweir ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
1733cdf0e10cSrcweir if ( pChangeTrack )
1734cdf0e10cSrcweir pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
1735cdf0e10cSrcweir
1736cdf0e10cSrcweir EndUndo();
1737cdf0e10cSrcweir }
1738cdf0e10cSrcweir
Redo()1739cdf0e10cSrcweir void __EXPORT ScUndoEnterMatrix::Redo()
1740cdf0e10cSrcweir {
1741cdf0e10cSrcweir BeginRedo();
1742cdf0e10cSrcweir
1743cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1744cdf0e10cSrcweir
1745cdf0e10cSrcweir ScMarkData aDestMark;
1746cdf0e10cSrcweir aDestMark.SelectOneTable( aBlockRange.aStart.Tab() );
1747cdf0e10cSrcweir aDestMark.SetMarkArea( aBlockRange );
1748cdf0e10cSrcweir
1749cdf0e10cSrcweir pDoc->InsertMatrixFormula( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(),
1750cdf0e10cSrcweir aBlockRange.aEnd.Col(), aBlockRange.aEnd.Row(),
1751cdf0e10cSrcweir aDestMark, aFormula );
1752cdf0e10cSrcweir // pDocShell->PostPaint( aBlockRange, PAINT_GRID ); // nicht noetig ???
1753cdf0e10cSrcweir
1754cdf0e10cSrcweir SetChangeTrack();
1755cdf0e10cSrcweir
1756cdf0e10cSrcweir EndRedo();
1757cdf0e10cSrcweir }
1758cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1759cdf0e10cSrcweir void __EXPORT ScUndoEnterMatrix::Repeat(SfxRepeatTarget& rTarget)
1760cdf0e10cSrcweir {
1761cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1762cdf0e10cSrcweir {
1763cdf0e10cSrcweir String aTemp = aFormula;
1764cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->EnterMatrix(aTemp);
1765cdf0e10cSrcweir }
1766cdf0e10cSrcweir }
1767cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1768cdf0e10cSrcweir sal_Bool __EXPORT ScUndoEnterMatrix::CanRepeat(SfxRepeatTarget& rTarget) const
1769cdf0e10cSrcweir {
1770cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
1771cdf0e10cSrcweir }
1772cdf0e10cSrcweir
1773cdf0e10cSrcweir // -----------------------------------------------------------------------
1774cdf0e10cSrcweir //
1775cdf0e10cSrcweir // Einzug vermindern / erhoehen
1776cdf0e10cSrcweir //
1777cdf0e10cSrcweir
lcl_GetMultiMarkRange(const ScMarkData & rMark)1778cdf0e10cSrcweir ScRange lcl_GetMultiMarkRange( const ScMarkData& rMark )
1779cdf0e10cSrcweir {
1780cdf0e10cSrcweir DBG_ASSERT( rMark.IsMultiMarked(), "wrong mark type" );
1781cdf0e10cSrcweir
1782cdf0e10cSrcweir ScRange aRange;
1783cdf0e10cSrcweir rMark.GetMultiMarkArea( aRange );
1784cdf0e10cSrcweir return aRange;
1785cdf0e10cSrcweir }
1786cdf0e10cSrcweir
ScUndoIndent(ScDocShell * pNewDocShell,const ScMarkData & rMark,ScDocument * pNewUndoDoc,sal_Bool bIncrement)1787cdf0e10cSrcweir ScUndoIndent::ScUndoIndent( ScDocShell* pNewDocShell, const ScMarkData& rMark,
1788cdf0e10cSrcweir ScDocument* pNewUndoDoc, sal_Bool bIncrement ) :
1789cdf0e10cSrcweir ScBlockUndo( pNewDocShell, lcl_GetMultiMarkRange(rMark), SC_UNDO_AUTOHEIGHT ),
1790cdf0e10cSrcweir aMarkData( rMark ),
1791cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
1792cdf0e10cSrcweir bIsIncrement( bIncrement )
1793cdf0e10cSrcweir {
1794cdf0e10cSrcweir }
1795cdf0e10cSrcweir
~ScUndoIndent()1796cdf0e10cSrcweir __EXPORT ScUndoIndent::~ScUndoIndent()
1797cdf0e10cSrcweir {
1798cdf0e10cSrcweir delete pUndoDoc;
1799cdf0e10cSrcweir }
1800cdf0e10cSrcweir
GetComment() const1801cdf0e10cSrcweir String __EXPORT ScUndoIndent::GetComment() const
1802cdf0e10cSrcweir {
1803cdf0e10cSrcweir sal_uInt16 nId = bIsIncrement ? STR_UNDO_INC_INDENT : STR_UNDO_DEC_INDENT;
1804cdf0e10cSrcweir return ScGlobal::GetRscString( nId );
1805cdf0e10cSrcweir }
1806cdf0e10cSrcweir
Undo()1807cdf0e10cSrcweir void __EXPORT ScUndoIndent::Undo()
1808cdf0e10cSrcweir {
1809cdf0e10cSrcweir BeginUndo();
1810cdf0e10cSrcweir
1811cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1812cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
1813cdf0e10cSrcweir ScRange aCopyRange = aBlockRange;
1814cdf0e10cSrcweir aCopyRange.aStart.SetTab(0);
1815cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1);
1816cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
1817cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1818cdf0e10cSrcweir
1819cdf0e10cSrcweir EndUndo();
1820cdf0e10cSrcweir }
1821cdf0e10cSrcweir
Redo()1822cdf0e10cSrcweir void __EXPORT ScUndoIndent::Redo()
1823cdf0e10cSrcweir {
1824cdf0e10cSrcweir BeginRedo();
1825cdf0e10cSrcweir
1826cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1827cdf0e10cSrcweir pDoc->ChangeSelectionIndent( bIsIncrement, aMarkData );
1828cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1829cdf0e10cSrcweir
1830cdf0e10cSrcweir EndRedo();
1831cdf0e10cSrcweir }
1832cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1833cdf0e10cSrcweir void __EXPORT ScUndoIndent::Repeat(SfxRepeatTarget& rTarget)
1834cdf0e10cSrcweir {
1835cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1836cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->ChangeIndent( bIsIncrement );
1837cdf0e10cSrcweir }
1838cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1839cdf0e10cSrcweir sal_Bool __EXPORT ScUndoIndent::CanRepeat(SfxRepeatTarget& rTarget) const
1840cdf0e10cSrcweir {
1841cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
1842cdf0e10cSrcweir }
1843cdf0e10cSrcweir
1844cdf0e10cSrcweir // -----------------------------------------------------------------------
1845cdf0e10cSrcweir //
1846cdf0e10cSrcweir // Transliteration for cells
1847cdf0e10cSrcweir //
1848cdf0e10cSrcweir
ScUndoTransliterate(ScDocShell * pNewDocShell,const ScMarkData & rMark,ScDocument * pNewUndoDoc,sal_Int32 nType)1849cdf0e10cSrcweir ScUndoTransliterate::ScUndoTransliterate( ScDocShell* pNewDocShell, const ScMarkData& rMark,
1850cdf0e10cSrcweir ScDocument* pNewUndoDoc, sal_Int32 nType ) :
1851cdf0e10cSrcweir ScBlockUndo( pNewDocShell, lcl_GetMultiMarkRange(rMark), SC_UNDO_AUTOHEIGHT ),
1852cdf0e10cSrcweir aMarkData( rMark ),
1853cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
1854cdf0e10cSrcweir nTransliterationType( nType )
1855cdf0e10cSrcweir {
1856cdf0e10cSrcweir }
1857cdf0e10cSrcweir
~ScUndoTransliterate()1858cdf0e10cSrcweir __EXPORT ScUndoTransliterate::~ScUndoTransliterate()
1859cdf0e10cSrcweir {
1860cdf0e10cSrcweir delete pUndoDoc;
1861cdf0e10cSrcweir }
1862cdf0e10cSrcweir
GetComment() const1863cdf0e10cSrcweir String __EXPORT ScUndoTransliterate::GetComment() const
1864cdf0e10cSrcweir {
1865cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_TRANSLITERATE );
1866cdf0e10cSrcweir }
1867cdf0e10cSrcweir
Undo()1868cdf0e10cSrcweir void __EXPORT ScUndoTransliterate::Undo()
1869cdf0e10cSrcweir {
1870cdf0e10cSrcweir BeginUndo();
1871cdf0e10cSrcweir
1872cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1873cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount();
1874cdf0e10cSrcweir ScRange aCopyRange = aBlockRange;
1875cdf0e10cSrcweir aCopyRange.aStart.SetTab(0);
1876cdf0e10cSrcweir aCopyRange.aEnd.SetTab(nTabCount-1);
1877cdf0e10cSrcweir pUndoDoc->CopyToDocument( aCopyRange, IDF_CONTENTS, sal_True, pDoc, &aMarkData );
1878cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1879cdf0e10cSrcweir
1880cdf0e10cSrcweir EndUndo();
1881cdf0e10cSrcweir }
1882cdf0e10cSrcweir
Redo()1883cdf0e10cSrcweir void __EXPORT ScUndoTransliterate::Redo()
1884cdf0e10cSrcweir {
1885cdf0e10cSrcweir BeginRedo();
1886cdf0e10cSrcweir
1887cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1888cdf0e10cSrcweir pDoc->TransliterateText( aMarkData, nTransliterationType );
1889cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1890cdf0e10cSrcweir
1891cdf0e10cSrcweir EndRedo();
1892cdf0e10cSrcweir }
1893cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1894cdf0e10cSrcweir void __EXPORT ScUndoTransliterate::Repeat(SfxRepeatTarget& rTarget)
1895cdf0e10cSrcweir {
1896cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1897cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->TransliterateText( nTransliterationType );
1898cdf0e10cSrcweir }
1899cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1900cdf0e10cSrcweir sal_Bool __EXPORT ScUndoTransliterate::CanRepeat(SfxRepeatTarget& rTarget) const
1901cdf0e10cSrcweir {
1902cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
1903cdf0e10cSrcweir }
1904cdf0e10cSrcweir
1905cdf0e10cSrcweir // -----------------------------------------------------------------------
1906cdf0e10cSrcweir //
1907cdf0e10cSrcweir // einzelne Items per Which-IDs aus Bereich loeschen
1908cdf0e10cSrcweir //
1909cdf0e10cSrcweir
ScUndoClearItems(ScDocShell * pNewDocShell,const ScMarkData & rMark,ScDocument * pNewUndoDoc,const sal_uInt16 * pW)1910cdf0e10cSrcweir ScUndoClearItems::ScUndoClearItems( ScDocShell* pNewDocShell, const ScMarkData& rMark,
1911cdf0e10cSrcweir ScDocument* pNewUndoDoc, const sal_uInt16* pW ) :
1912cdf0e10cSrcweir ScBlockUndo( pNewDocShell, lcl_GetMultiMarkRange(rMark), SC_UNDO_AUTOHEIGHT ),
1913cdf0e10cSrcweir aMarkData( rMark ),
1914cdf0e10cSrcweir pUndoDoc( pNewUndoDoc ),
1915cdf0e10cSrcweir pWhich( NULL )
1916cdf0e10cSrcweir {
1917cdf0e10cSrcweir DBG_ASSERT( pW, "ScUndoClearItems: Which-Pointer ist 0" );
1918cdf0e10cSrcweir
1919cdf0e10cSrcweir sal_uInt16 nCount = 0;
1920cdf0e10cSrcweir while ( pW[nCount] )
1921cdf0e10cSrcweir ++nCount;
1922cdf0e10cSrcweir pWhich = new sal_uInt16[nCount+1];
1923cdf0e10cSrcweir for (sal_uInt16 i=0; i<=nCount; i++)
1924cdf0e10cSrcweir pWhich[i] = pW[i];
1925cdf0e10cSrcweir }
1926cdf0e10cSrcweir
~ScUndoClearItems()1927cdf0e10cSrcweir __EXPORT ScUndoClearItems::~ScUndoClearItems()
1928cdf0e10cSrcweir {
1929cdf0e10cSrcweir delete pUndoDoc;
1930cdf0e10cSrcweir delete pWhich;
1931cdf0e10cSrcweir }
1932cdf0e10cSrcweir
GetComment() const1933cdf0e10cSrcweir String __EXPORT ScUndoClearItems::GetComment() const
1934cdf0e10cSrcweir {
1935cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS );
1936cdf0e10cSrcweir }
1937cdf0e10cSrcweir
Undo()1938cdf0e10cSrcweir void __EXPORT ScUndoClearItems::Undo()
1939cdf0e10cSrcweir {
1940cdf0e10cSrcweir BeginUndo();
1941cdf0e10cSrcweir
1942cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1943cdf0e10cSrcweir pUndoDoc->CopyToDocument( aBlockRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
1944cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1945cdf0e10cSrcweir
1946cdf0e10cSrcweir EndUndo();
1947cdf0e10cSrcweir }
1948cdf0e10cSrcweir
Redo()1949cdf0e10cSrcweir void __EXPORT ScUndoClearItems::Redo()
1950cdf0e10cSrcweir {
1951cdf0e10cSrcweir BeginRedo();
1952cdf0e10cSrcweir
1953cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
1954cdf0e10cSrcweir pDoc->ClearSelectionItems( pWhich, aMarkData );
1955cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1956cdf0e10cSrcweir
1957cdf0e10cSrcweir EndRedo();
1958cdf0e10cSrcweir }
1959cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)1960cdf0e10cSrcweir void __EXPORT ScUndoClearItems::Repeat(SfxRepeatTarget& rTarget)
1961cdf0e10cSrcweir {
1962cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
1963cdf0e10cSrcweir {
1964cdf0e10cSrcweir ScViewData* pViewData = ((ScTabViewTarget&)rTarget).GetViewShell()->GetViewData();
1965cdf0e10cSrcweir ScDocFunc aFunc(*pViewData->GetDocShell());
1966cdf0e10cSrcweir aFunc.ClearItems( pViewData->GetMarkData(), pWhich, sal_False );
1967cdf0e10cSrcweir }
1968cdf0e10cSrcweir }
1969cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const1970cdf0e10cSrcweir sal_Bool __EXPORT ScUndoClearItems::CanRepeat(SfxRepeatTarget& rTarget) const
1971cdf0e10cSrcweir {
1972cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
1973cdf0e10cSrcweir }
1974cdf0e10cSrcweir
1975cdf0e10cSrcweir // -----------------------------------------------------------------------
1976cdf0e10cSrcweir //
1977cdf0e10cSrcweir // Alle Umbrueche einer Tabelle loeschen
1978cdf0e10cSrcweir //
1979cdf0e10cSrcweir
ScUndoRemoveBreaks(ScDocShell * pNewDocShell,SCTAB nNewTab,ScDocument * pNewUndoDoc)1980cdf0e10cSrcweir ScUndoRemoveBreaks::ScUndoRemoveBreaks( ScDocShell* pNewDocShell,
1981cdf0e10cSrcweir SCTAB nNewTab, ScDocument* pNewUndoDoc ) :
1982cdf0e10cSrcweir ScSimpleUndo( pNewDocShell ),
1983cdf0e10cSrcweir nTab( nNewTab ),
1984cdf0e10cSrcweir pUndoDoc( pNewUndoDoc )
1985cdf0e10cSrcweir {
1986cdf0e10cSrcweir }
1987cdf0e10cSrcweir
~ScUndoRemoveBreaks()1988cdf0e10cSrcweir __EXPORT ScUndoRemoveBreaks::~ScUndoRemoveBreaks()
1989cdf0e10cSrcweir {
1990cdf0e10cSrcweir delete pUndoDoc;
1991cdf0e10cSrcweir }
1992cdf0e10cSrcweir
GetComment() const1993cdf0e10cSrcweir String __EXPORT ScUndoRemoveBreaks::GetComment() const
1994cdf0e10cSrcweir {
1995cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_REMOVEBREAKS );
1996cdf0e10cSrcweir }
1997cdf0e10cSrcweir
Undo()1998cdf0e10cSrcweir void __EXPORT ScUndoRemoveBreaks::Undo()
1999cdf0e10cSrcweir {
2000cdf0e10cSrcweir BeginUndo();
2001cdf0e10cSrcweir
2002cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
2003cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2004cdf0e10cSrcweir
2005cdf0e10cSrcweir pUndoDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, sal_False, pDoc );
2006cdf0e10cSrcweir if (pViewShell)
2007cdf0e10cSrcweir pViewShell->UpdatePageBreakData( sal_True );
2008cdf0e10cSrcweir pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
2009cdf0e10cSrcweir
2010cdf0e10cSrcweir EndUndo();
2011cdf0e10cSrcweir }
2012cdf0e10cSrcweir
Redo()2013cdf0e10cSrcweir void __EXPORT ScUndoRemoveBreaks::Redo()
2014cdf0e10cSrcweir {
2015cdf0e10cSrcweir BeginRedo();
2016cdf0e10cSrcweir
2017cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
2018cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2019cdf0e10cSrcweir
2020cdf0e10cSrcweir pDoc->RemoveManualBreaks(nTab);
2021cdf0e10cSrcweir pDoc->UpdatePageBreaks(nTab);
2022cdf0e10cSrcweir if (pViewShell)
2023cdf0e10cSrcweir pViewShell->UpdatePageBreakData( sal_True );
2024cdf0e10cSrcweir pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
2025cdf0e10cSrcweir
2026cdf0e10cSrcweir EndRedo();
2027cdf0e10cSrcweir }
2028cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)2029cdf0e10cSrcweir void __EXPORT ScUndoRemoveBreaks::Repeat(SfxRepeatTarget& rTarget)
2030cdf0e10cSrcweir {
2031cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
2032cdf0e10cSrcweir {
2033cdf0e10cSrcweir ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
2034cdf0e10cSrcweir rViewShell.RemoveManualBreaks();
2035cdf0e10cSrcweir }
2036cdf0e10cSrcweir }
2037cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const2038cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRemoveBreaks::CanRepeat(SfxRepeatTarget& rTarget) const
2039cdf0e10cSrcweir {
2040cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
2041cdf0e10cSrcweir }
2042cdf0e10cSrcweir
2043cdf0e10cSrcweir // -----------------------------------------------------------------------
2044cdf0e10cSrcweir //
2045cdf0e10cSrcweir // Zusammenfassung aufheben (fuer einen ganzen Bereich)
2046cdf0e10cSrcweir //
2047cdf0e10cSrcweir
ScUndoRemoveMerge(ScDocShell * pNewDocShell,const ScRange & rArea,ScDocument * pNewUndoDoc)2048cdf0e10cSrcweir ScUndoRemoveMerge::ScUndoRemoveMerge( ScDocShell* pNewDocShell,
2049cdf0e10cSrcweir const ScRange& rArea, ScDocument* pNewUndoDoc ) :
2050cdf0e10cSrcweir ScBlockUndo( pNewDocShell, rArea, SC_UNDO_SIMPLE ),
2051cdf0e10cSrcweir pUndoDoc( pNewUndoDoc )
2052cdf0e10cSrcweir {
2053cdf0e10cSrcweir }
2054cdf0e10cSrcweir
~ScUndoRemoveMerge()2055cdf0e10cSrcweir __EXPORT ScUndoRemoveMerge::~ScUndoRemoveMerge()
2056cdf0e10cSrcweir {
2057cdf0e10cSrcweir delete pUndoDoc;
2058cdf0e10cSrcweir }
2059cdf0e10cSrcweir
GetComment() const2060cdf0e10cSrcweir String __EXPORT ScUndoRemoveMerge::GetComment() const
2061cdf0e10cSrcweir {
2062cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_REMERGE ); // "Zusammenfassung aufheben"
2063cdf0e10cSrcweir }
2064cdf0e10cSrcweir
Undo()2065cdf0e10cSrcweir void __EXPORT ScUndoRemoveMerge::Undo()
2066cdf0e10cSrcweir {
2067cdf0e10cSrcweir BeginUndo();
2068cdf0e10cSrcweir
2069cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
2070cdf0e10cSrcweir
2071cdf0e10cSrcweir ScRange aExtended = aBlockRange;
2072cdf0e10cSrcweir pUndoDoc->ExtendMerge( aExtended );
2073cdf0e10cSrcweir
2074cdf0e10cSrcweir pDoc->DeleteAreaTab( aExtended, IDF_ATTRIB );
2075cdf0e10cSrcweir pUndoDoc->CopyToDocument( aExtended, IDF_ATTRIB, sal_False, pDoc );
2076cdf0e10cSrcweir
2077cdf0e10cSrcweir sal_Bool bDidPaint = sal_False;
2078cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2079cdf0e10cSrcweir if ( pViewShell )
2080cdf0e10cSrcweir {
2081cdf0e10cSrcweir pViewShell->SetTabNo( aExtended.aStart.Tab() );
2082cdf0e10cSrcweir bDidPaint = pViewShell->AdjustRowHeight( aExtended.aStart.Row(), aExtended.aEnd.Row() );
2083cdf0e10cSrcweir }
2084cdf0e10cSrcweir if (!bDidPaint)
2085cdf0e10cSrcweir ScUndoUtil::PaintMore( pDocShell, aExtended );
2086cdf0e10cSrcweir
2087cdf0e10cSrcweir EndUndo();
2088cdf0e10cSrcweir }
2089cdf0e10cSrcweir
Redo()2090cdf0e10cSrcweir void __EXPORT ScUndoRemoveMerge::Redo()
2091cdf0e10cSrcweir {
2092cdf0e10cSrcweir BeginRedo();
2093cdf0e10cSrcweir
2094cdf0e10cSrcweir SCTAB nTab = aBlockRange.aStart.Tab();
2095cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
2096cdf0e10cSrcweir ScRange aExtended = aBlockRange;
2097cdf0e10cSrcweir pDoc->ExtendMerge( aExtended );
2098cdf0e10cSrcweir ScRange aRefresh = aExtended;
2099cdf0e10cSrcweir pDoc->ExtendOverlapped( aRefresh );
2100cdf0e10cSrcweir
2101cdf0e10cSrcweir // ausfuehren
2102cdf0e10cSrcweir
2103cdf0e10cSrcweir const SfxPoolItem& rDefAttr = pDoc->GetPool()->GetDefaultItem( ATTR_MERGE );
2104cdf0e10cSrcweir ScPatternAttr aPattern( pDoc->GetPool() );
2105cdf0e10cSrcweir aPattern.GetItemSet().Put( rDefAttr );
2106cdf0e10cSrcweir pDoc->ApplyPatternAreaTab( aBlockRange.aStart.Col(), aBlockRange.aStart.Row(),
2107cdf0e10cSrcweir aBlockRange.aEnd.Col(), aBlockRange.aEnd.Row(), nTab,
2108cdf0e10cSrcweir aPattern );
2109cdf0e10cSrcweir
2110cdf0e10cSrcweir pDoc->RemoveFlagsTab( aExtended.aStart.Col(), aExtended.aStart.Row(),
2111cdf0e10cSrcweir aExtended.aEnd.Col(), aExtended.aEnd.Row(), nTab,
2112cdf0e10cSrcweir SC_MF_HOR | SC_MF_VER );
2113cdf0e10cSrcweir
2114cdf0e10cSrcweir pDoc->ExtendMerge( aRefresh, sal_True, sal_False );
2115cdf0e10cSrcweir
2116cdf0e10cSrcweir // Paint
2117cdf0e10cSrcweir
2118cdf0e10cSrcweir sal_Bool bDidPaint = sal_False;
2119cdf0e10cSrcweir ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
2120cdf0e10cSrcweir if ( pViewShell )
2121cdf0e10cSrcweir {
2122cdf0e10cSrcweir pViewShell->SetTabNo( aExtended.aStart.Tab() );
2123cdf0e10cSrcweir bDidPaint = pViewShell->AdjustRowHeight( aExtended.aStart.Row(), aExtended.aEnd.Row() );
2124cdf0e10cSrcweir }
2125cdf0e10cSrcweir if (!bDidPaint)
2126cdf0e10cSrcweir ScUndoUtil::PaintMore( pDocShell, aExtended );
2127cdf0e10cSrcweir
2128cdf0e10cSrcweir EndRedo();
2129cdf0e10cSrcweir }
2130cdf0e10cSrcweir
Repeat(SfxRepeatTarget & rTarget)2131cdf0e10cSrcweir void __EXPORT ScUndoRemoveMerge::Repeat(SfxRepeatTarget& rTarget)
2132cdf0e10cSrcweir {
2133cdf0e10cSrcweir if (rTarget.ISA(ScTabViewTarget))
2134cdf0e10cSrcweir ((ScTabViewTarget&)rTarget).GetViewShell()->RemoveMerge();
2135cdf0e10cSrcweir }
2136cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget & rTarget) const2137cdf0e10cSrcweir sal_Bool __EXPORT ScUndoRemoveMerge::CanRepeat(SfxRepeatTarget& rTarget) const
2138cdf0e10cSrcweir {
2139cdf0e10cSrcweir return (rTarget.ISA(ScTabViewTarget));
2140cdf0e10cSrcweir }
2141cdf0e10cSrcweir
2142cdf0e10cSrcweir // -----------------------------------------------------------------------
2143cdf0e10cSrcweir //
2144cdf0e10cSrcweir // nur Umrandung setzen, per ScRangeList (StarOne)
2145cdf0e10cSrcweir //
2146cdf0e10cSrcweir
lcl_TotalRange(const ScRangeList & rRanges)2147cdf0e10cSrcweir ScRange lcl_TotalRange( const ScRangeList& rRanges )
2148cdf0e10cSrcweir {
2149cdf0e10cSrcweir ScRange aTotal;
2150cdf0e10cSrcweir sal_uLong nCount = rRanges.Count();
2151cdf0e10cSrcweir for (sal_uLong i=0; i<nCount; i++)
2152cdf0e10cSrcweir {
2153cdf0e10cSrcweir ScRange aRange = *rRanges.GetObject(i);
2154cdf0e10cSrcweir if (i==0)
2155cdf0e10cSrcweir aTotal = aRange;
2156cdf0e10cSrcweir else
2157cdf0e10cSrcweir {
2158cdf0e10cSrcweir if (aRange.aStart.Col() < aTotal.aStart.Col())
2159cdf0e10cSrcweir aTotal.aStart.SetCol(aRange.aStart.Col());
2160cdf0e10cSrcweir if (aRange.aStart.Row() < aTotal.aStart.Row())
2161cdf0e10cSrcweir aTotal.aStart.SetRow(aRange.aStart.Row());
2162cdf0e10cSrcweir if (aRange.aStart.Tab() < aTotal.aStart.Tab())
2163cdf0e10cSrcweir aTotal.aStart.SetTab(aRange.aStart.Tab());
2164cdf0e10cSrcweir if (aRange.aEnd.Col() > aTotal.aEnd.Col())
2165cdf0e10cSrcweir aTotal.aEnd.SetCol(aRange.aEnd.Col());
2166cdf0e10cSrcweir if (aRange.aEnd.Row() > aTotal.aEnd.Row())
2167cdf0e10cSrcweir aTotal.aEnd.SetRow(aRange.aEnd.Row());
2168cdf0e10cSrcweir if (aRange.aEnd.Tab() > aTotal.aEnd.Tab())
2169cdf0e10cSrcweir aTotal.aEnd.SetTab(aRange.aEnd.Tab());
2170cdf0e10cSrcweir }
2171cdf0e10cSrcweir }
2172cdf0e10cSrcweir return aTotal;
2173cdf0e10cSrcweir }
2174cdf0e10cSrcweir
ScUndoBorder(ScDocShell * pNewDocShell,const ScRangeList & rRangeList,ScDocument * pNewUndoDoc,const SvxBoxItem & rNewOuter,const SvxBoxInfoItem & rNewInner)2175cdf0e10cSrcweir ScUndoBorder::ScUndoBorder( ScDocShell* pNewDocShell,
2176cdf0e10cSrcweir const ScRangeList& rRangeList, ScDocument* pNewUndoDoc,
2177cdf0e10cSrcweir const SvxBoxItem& rNewOuter, const SvxBoxInfoItem& rNewInner ) :
2178cdf0e10cSrcweir ScBlockUndo( pNewDocShell, lcl_TotalRange(rRangeList), SC_UNDO_SIMPLE ),
2179cdf0e10cSrcweir pUndoDoc( pNewUndoDoc )
2180cdf0e10cSrcweir {
2181cdf0e10cSrcweir pRanges = new ScRangeList(rRangeList);
2182cdf0e10cSrcweir pOuter = new SvxBoxItem(rNewOuter);
2183cdf0e10cSrcweir pInner = new SvxBoxInfoItem(rNewInner);
2184cdf0e10cSrcweir }
2185cdf0e10cSrcweir
~ScUndoBorder()2186cdf0e10cSrcweir __EXPORT ScUndoBorder::~ScUndoBorder()
2187cdf0e10cSrcweir {
2188cdf0e10cSrcweir delete pUndoDoc;
2189cdf0e10cSrcweir delete pRanges;
2190cdf0e10cSrcweir delete pOuter;
2191cdf0e10cSrcweir delete pInner;
2192cdf0e10cSrcweir }
2193cdf0e10cSrcweir
GetComment() const2194cdf0e10cSrcweir String __EXPORT ScUndoBorder::GetComment() const
2195cdf0e10cSrcweir {
2196cdf0e10cSrcweir return ScGlobal::GetRscString( STR_UNDO_SELATTRLINES ); //! eigener String?
2197cdf0e10cSrcweir }
2198cdf0e10cSrcweir
Undo()2199cdf0e10cSrcweir void __EXPORT ScUndoBorder::Undo()
2200cdf0e10cSrcweir {
2201cdf0e10cSrcweir BeginUndo();
2202cdf0e10cSrcweir
2203cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument();
2204cdf0e10cSrcweir ScMarkData aMarkData;
2205cdf0e10cSrcweir aMarkData.MarkFromRangeList( *pRanges, sal_False );
2206cdf0e10cSrcweir pUndoDoc->CopyToDocument( aBlockRange, IDF_ATTRIB, sal_True, pDoc, &aMarkData );
2207cdf0e10cSrcweir pDocShell->PostPaint( aBlockRange, PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
2208cdf0e10cSrcweir
2209cdf0e10cSrcweir EndUndo();
2210cdf0e10cSrcweir }
2211cdf0e10cSrcweir
Redo()2212cdf0e10cSrcweir void __EXPORT ScUndoBorder::Redo()
2213cdf0e10cSrcweir {
2214cdf0e10cSrcweir BeginRedo();
2215cdf0e10cSrcweir
2216cdf0e10cSrcweir ScDocument* pDoc = pDocShell->GetDocument(); //! Funktion an docfunc aufrufen
2217cdf0e10cSrcweir sal_uLong nCount = pRanges->Count();
2218cdf0e10cSrcweir sal_uLong i;
2219cdf0e10cSrcweir for (i=0; i<nCount; i++)
2220cdf0e10cSrcweir {
2221cdf0e10cSrcweir ScRange aRange = *pRanges->GetObject(i);
2222cdf0e10cSrcweir SCTAB nTab = aRange.aStart.Tab();
2223cdf0e10cSrcweir
2224cdf0e10cSrcweir ScMarkData aMark;
2225cdf0e10cSrcweir aMark.SetMarkArea( aRange );
2226cdf0e10cSrcweir aMark.SelectTable( nTab, sal_True );
2227cdf0e10cSrcweir
2228cdf0e10cSrcweir pDoc->ApplySelectionFrame( aMark, pOuter, pInner );
2229cdf0e10cSrcweir }
2230cdf0e10cSrcweir for (i=0; i<nCount; i++)
2231cdf0e10cSrcweir pDocShell->PostPaint( *pRanges->GetObject(i), PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
2232cdf0e10cSrcweir
2233cdf0e10cSrcweir EndRedo();
2234cdf0e10cSrcweir }
2235cdf0e10cSrcweir
Repeat(SfxRepeatTarget &)2236cdf0e10cSrcweir void __EXPORT ScUndoBorder::Repeat(SfxRepeatTarget& /* rTarget */)
2237cdf0e10cSrcweir {
2238cdf0e10cSrcweir //! spaeter (wenn die Funktion aus cellsuno nach docfunc gewandert ist)
2239cdf0e10cSrcweir }
2240cdf0e10cSrcweir
CanRepeat(SfxRepeatTarget &) const2241cdf0e10cSrcweir sal_Bool __EXPORT ScUndoBorder::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2242cdf0e10cSrcweir {
2243cdf0e10cSrcweir return sal_False; // s.o.
2244cdf0e10cSrcweir }
2245cdf0e10cSrcweir
2246cdf0e10cSrcweir
2247cdf0e10cSrcweir
2248cdf0e10cSrcweir
2249