xref: /AOO41X/main/dbaccess/source/ui/tabledesign/TableUndo.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dbaccess.hxx"
26 #ifndef DBAUI_TABLEUNDO_HXX
27 #include "TableUndo.hxx"
28 #endif
29 #ifndef _DBU_TBL_HRC_
30 #include "dbu_tbl.hrc"
31 #endif
32 #ifndef DBAUI_TABLEEDITORCONTROL_HXX
33 #include "TEditControl.hxx"
34 #endif
35 #ifndef DBAUI_TABLEROW_HXX
36 #include "TableRow.hxx"
37 #endif
38 #ifndef DBACCESS_UI_BROWSER_ID_HXX
39 #include "browserids.hxx"
40 #endif
41 #ifndef DBUI_TABLECONTROLLER_HXX
42 #include "TableController.hxx"
43 #endif
44 #ifndef DBAUI_TABLEDESIGNVIEW_HXX
45 #include "TableDesignView.hxx"
46 #endif
47 #ifndef DBAUI_FIELDDESCRIPTIONS_HXX
48 #include "FieldDescriptions.hxx"
49 #endif
50 #ifndef _TOOLS_DEBUG_HXX
51 #include <tools/debug.hxx>
52 #endif
53 
54 using namespace dbaui;
55 using namespace ::svt;
56 
57 TYPEINIT1( OCommentUndoAction,          SfxUndoAction );
58 TYPEINIT1( OTableDesignUndoAct,         OCommentUndoAction );
59 TYPEINIT1( OTableEditorUndoAct,         OTableDesignUndoAct );
60 TYPEINIT1( OTableDesignCellUndoAct,     OTableDesignUndoAct );
61 TYPEINIT1( OTableEditorTypeSelUndoAct,  OTableEditorUndoAct );
62 TYPEINIT1( OTableEditorDelUndoAct,      OTableEditorUndoAct );
63 TYPEINIT1( OTableEditorInsUndoAct,      OTableEditorUndoAct );
64 TYPEINIT1( OTableEditorInsNewUndoAct,   OTableEditorUndoAct );
65 TYPEINIT1( OPrimKeyUndoAct,             OTableEditorUndoAct );
66 
67 //==============================================================================
68 // class OTableDesignUndoAct
69 //==============================================================================
70 DBG_NAME(OTableDesignUndoAct);
OTableDesignUndoAct(OTableRowView * pOwner,sal_uInt16 nCommentID)71 OTableDesignUndoAct::OTableDesignUndoAct( OTableRowView* pOwner,sal_uInt16 nCommentID ) : OCommentUndoAction(nCommentID)
72     ,m_pTabDgnCtrl(  pOwner )
73 {
74     DBG_CTOR(OTableDesignUndoAct,NULL);
75     m_pTabDgnCtrl->m_nCurUndoActId++;
76 }
77 
78 //-------------------------------------------------------------------------
~OTableDesignUndoAct()79 OTableDesignUndoAct::~OTableDesignUndoAct()
80 {
81     DBG_DTOR(OTableDesignUndoAct,NULL);
82 }
83 
84 //-------------------------------------------------------------------------
Undo()85 void OTableDesignUndoAct::Undo()
86 {
87     m_pTabDgnCtrl->m_nCurUndoActId--;
88 
89     //////////////////////////////////////////////////////////////////////
90     // Wenn erstes Undo zurueckgenommen wurde, ist Doc nicht modifiziert worden
91     if( m_pTabDgnCtrl->m_nCurUndoActId == 0 )
92     {
93         m_pTabDgnCtrl->GetView()->getController().setModified(sal_False);
94         m_pTabDgnCtrl->GetView()->getController().InvalidateFeature(SID_SAVEDOC);
95     }
96 }
97 
98 //-------------------------------------------------------------------------
Redo()99 void OTableDesignUndoAct::Redo()
100 {
101     m_pTabDgnCtrl->m_nCurUndoActId++;
102 
103     //////////////////////////////////////////////////////////////////////
104     // Wenn Redo fuer erste Undo-Action, muss Modified-Flag wieder gesetzt werden
105     if( m_pTabDgnCtrl->m_nCurUndoActId > 0 )
106     {
107         m_pTabDgnCtrl->GetView()->getController().setModified(sal_True);
108         m_pTabDgnCtrl->GetView()->getController().InvalidateFeature(SID_SAVEDOC);
109     }
110 }
111 //==============================================================================
112 // class OTableDesignCellUndoAct
113 //==============================================================================
114 DBG_NAME(OTableDesignCellUndoAct);
OTableDesignCellUndoAct(OTableRowView * pOwner,long nRowID,sal_uInt16 nColumn)115 OTableDesignCellUndoAct::OTableDesignCellUndoAct( OTableRowView* pOwner, long nRowID, sal_uInt16 nColumn ) :
116      OTableDesignUndoAct( pOwner ,STR_TABED_UNDO_CELLMODIFIED)
117     ,m_nCol( nColumn )
118     ,m_nRow( nRowID )
119 {
120     DBG_CTOR(OTableDesignCellUndoAct,NULL);
121     //////////////////////////////////////////////////////////////////////
122     // Text an der Position (m_nRow, m_nCol) auslesen
123     m_sOldText = m_pTabDgnCtrl->GetCellData( m_nRow, m_nCol );
124 }
125 
126 //-------------------------------------------------------------------------
~OTableDesignCellUndoAct()127 OTableDesignCellUndoAct::~OTableDesignCellUndoAct()
128 {
129     DBG_DTOR(OTableDesignCellUndoAct,NULL);
130 }
131 
132 //-------------------------------------------------------------------------
Undo()133 void OTableDesignCellUndoAct::Undo()
134 {
135     //////////////////////////////////////////////////////////////////////
136     // Neuen Text der alten Zelle speichern und alten wieder einsetzen
137     m_pTabDgnCtrl->ActivateCell( m_nRow, m_nCol );
138     m_sNewText = m_pTabDgnCtrl->GetCellData( m_nRow, m_nCol );
139     m_pTabDgnCtrl->SetCellData( m_nRow, m_nCol, m_sOldText );
140     //////////////////////////////////////////////////////////////////////
141     // Wenn erstes Undo zurueckgenommen wurde, ist Zelle nicht mehr modifiziert
142     if (m_pTabDgnCtrl->GetCurUndoActId() == 1)
143     {
144         CellControllerRef xController = m_pTabDgnCtrl->Controller();
145         if ( xController.Is() )
146             xController->ClearModified();
147         m_pTabDgnCtrl->GetView()->getController().setModified(sal_False);
148 
149     }
150 
151     OTableDesignUndoAct::Undo();
152 }
153 
154 //-------------------------------------------------------------------------
Redo()155 void OTableDesignCellUndoAct::Redo()
156 {
157     //////////////////////////////////////////////////////////////////////
158     // Neuen Text wieder einseten
159     m_pTabDgnCtrl->ActivateCell( m_nRow, m_nCol );
160     m_pTabDgnCtrl->SetCellData( m_nRow, m_nCol, m_sNewText );
161 
162     OTableDesignUndoAct::Redo();
163 }
164 
165 //==============================================================================
166 // class OTableEditorUndoAct
167 //==============================================================================
168 DBG_NAME(OTableEditorUndoAct);
OTableEditorUndoAct(OTableEditorCtrl * pOwner,sal_uInt16 _nCommentID)169 OTableEditorUndoAct::OTableEditorUndoAct( OTableEditorCtrl* pOwner,sal_uInt16 _nCommentID ) :
170      OTableDesignUndoAct(  pOwner ,_nCommentID)
171     ,pTabEdCtrl(pOwner)
172 {
173     DBG_CTOR(OTableEditorUndoAct,NULL);
174 }
175 
176 //-------------------------------------------------------------------------
~OTableEditorUndoAct()177 OTableEditorUndoAct::~OTableEditorUndoAct()
178 {
179     DBG_DTOR(OTableEditorUndoAct,NULL);
180 }
181 
182 //==============================================================================
183 // class OTableEditorTypeSelUndoAct
184 //==============================================================================
185 DBG_NAME(OTableEditorTypeSelUndoAct);
OTableEditorTypeSelUndoAct(OTableEditorCtrl * pOwner,long nRowID,sal_uInt16 nColumn,const TOTypeInfoSP & _pOldType)186 OTableEditorTypeSelUndoAct::OTableEditorTypeSelUndoAct( OTableEditorCtrl* pOwner, long nRowID, sal_uInt16 nColumn, const TOTypeInfoSP& _pOldType )
187     :OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_TYPE_CHANGED)
188     ,m_nCol( nColumn )
189     ,m_nRow( nRowID )
190     ,m_pOldType( _pOldType )
191 {
192     DBG_CTOR(OTableEditorTypeSelUndoAct,NULL);
193 }
194 
195 //-------------------------------------------------------------------------
~OTableEditorTypeSelUndoAct()196 OTableEditorTypeSelUndoAct::~OTableEditorTypeSelUndoAct()
197 {
198     DBG_DTOR(OTableEditorTypeSelUndoAct,NULL);
199 }
200 
201 //-------------------------------------------------------------------------
Undo()202 void OTableEditorTypeSelUndoAct::Undo()
203 {
204     //////////////////////////////////////////////////////////////////////
205     // Typ zuruecksetzen
206     OFieldDescription* pFieldDesc = pTabEdCtrl->GetFieldDescr(m_nRow);
207     if(pFieldDesc)
208         m_pNewType = pFieldDesc->getTypeInfo();
209     else
210         m_pNewType = TOTypeInfoSP();
211     pTabEdCtrl->SetCellData(m_nRow,m_nCol,m_pOldType);
212     pTabEdCtrl->SwitchType( m_pOldType );
213 
214     OTableEditorUndoAct::Undo();
215 }
216 
217 //-------------------------------------------------------------------------
Redo()218 void OTableEditorTypeSelUndoAct::Redo()
219 {
220     //////////////////////////////////////////////////////////////////////
221     // Neuen Typ
222     pTabEdCtrl->GoToRowColumnId( m_nRow ,m_nCol);
223     pTabEdCtrl->SetCellData(m_nRow,m_nCol,m_pNewType);
224 
225     OTableEditorUndoAct::Redo();
226 }
227 
228 //==============================================================================
229 // class OTableEditorDelUndoAct
230 //==============================================================================
231 DBG_NAME(OTableEditorDelUndoAct);
OTableEditorDelUndoAct(OTableEditorCtrl * pOwner)232 OTableEditorDelUndoAct::OTableEditorDelUndoAct( OTableEditorCtrl* pOwner) :
233      OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_ROWDELETED)
234 {
235     DBG_CTOR(OTableEditorDelUndoAct,NULL);
236     //////////////////////////////////////////////////////////////////////
237     // DeletedRowList fuellen
238     ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pOwner->GetRowList();
239     long nIndex = pOwner->FirstSelectedRow();
240      ::boost::shared_ptr<OTableRow>  pOriginalRow;
241      ::boost::shared_ptr<OTableRow>  pNewRow;
242 
243     while( nIndex >= 0 )
244     {
245         pOriginalRow = (*pOriginalRows)[nIndex];
246         pNewRow.reset(new OTableRow( *pOriginalRow, nIndex ));
247         m_aDeletedRows.push_back( pNewRow);
248 
249         nIndex = pOwner->NextSelectedRow();
250     }
251 }
252 
253 //-------------------------------------------------------------------------
~OTableEditorDelUndoAct()254 OTableEditorDelUndoAct::~OTableEditorDelUndoAct()
255 {
256     DBG_DTOR(OTableEditorDelUndoAct,NULL);
257     m_aDeletedRows.clear();
258 }
259 
260 //-------------------------------------------------------------------------
Undo()261 void OTableEditorDelUndoAct::Undo()
262 {
263     //////////////////////////////////////////////////////////////////////
264     // Geloeschte Zeilen wieder einfuegen
265     sal_uLong nPos;
266     ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_aDeletedRows.begin();
267     ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_aDeletedRows.end();
268 
269      ::boost::shared_ptr<OTableRow>  pNewOrigRow;
270     ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
271 
272     for(;aIter != aEnd;++aIter)
273     {
274         pNewOrigRow.reset(new OTableRow( **aIter ));
275         nPos = (*aIter)->GetPos();
276         pOriginalRows->insert( pOriginalRows->begin()+nPos,pNewOrigRow);
277     }
278 
279     pTabEdCtrl->DisplayData(pTabEdCtrl->GetCurRow());
280     pTabEdCtrl->Invalidate();
281     OTableEditorUndoAct::Undo();
282 }
283 
284 //-------------------------------------------------------------------------
Redo()285 void OTableEditorDelUndoAct::Redo()
286 {
287     //////////////////////////////////////////////////////////////////////
288     // Zeilen wieder loeschen
289     sal_uLong nPos;
290     ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_aDeletedRows.begin();
291     ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_aDeletedRows.end();
292     ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
293 
294     for(;aIter != aEnd;++aIter)
295     {
296         nPos = (*aIter)->GetPos();
297         pOriginalRows->erase( pOriginalRows->begin()+nPos );
298     }
299 
300     pTabEdCtrl->DisplayData(pTabEdCtrl->GetCurRow());
301     pTabEdCtrl->Invalidate();
302     OTableEditorUndoAct::Redo();
303 }
304 
305 //-------------------------------------------------------------------------
306 //==============================================================================
307 // class OTableEditorInsUndoAct
308 //==============================================================================
309 DBG_NAME(OTableEditorInsUndoAct);
OTableEditorInsUndoAct(OTableEditorCtrl * pOwner,long nInsertPosition,const::std::vector<::boost::shared_ptr<OTableRow>> & _vInsertedRows)310 OTableEditorInsUndoAct::OTableEditorInsUndoAct( OTableEditorCtrl* pOwner,
311                                                long nInsertPosition ,
312                                                const ::std::vector<  ::boost::shared_ptr<OTableRow> >& _vInsertedRows)
313     :OTableEditorUndoAct( pOwner,STR_TABED_UNDO_ROWINSERTED )
314     ,m_vInsertedRows(_vInsertedRows)
315     ,m_nInsPos( nInsertPosition )
316 {
317     DBG_CTOR(OTableEditorInsUndoAct,NULL);
318 }
319 
320 //-------------------------------------------------------------------------
~OTableEditorInsUndoAct()321 OTableEditorInsUndoAct::~OTableEditorInsUndoAct()
322 {
323     DBG_DTOR(OTableEditorInsUndoAct,NULL);
324     m_vInsertedRows.clear();
325 }
326 
327 //-------------------------------------------------------------------------
Undo()328 void OTableEditorInsUndoAct::Undo()
329 {
330     //////////////////////////////////////////////////////////////////////
331     // Eingefuegte Zeilen wieder loeschen
332     ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
333     for( long i=(m_nInsPos+m_vInsertedRows.size()-1); i>(m_nInsPos-1); i-- )
334     {
335         pOriginalRows->erase(pOriginalRows->begin()+i);
336     }
337 
338     pTabEdCtrl->RowRemoved( m_nInsPos, m_vInsertedRows.size(), sal_True );
339     pTabEdCtrl->InvalidateHandleColumn();
340 
341     OTableEditorUndoAct::Undo();
342 }
343 
344 //-------------------------------------------------------------------------
Redo()345 void OTableEditorInsUndoAct::Redo()
346 {
347     //////////////////////////////////////////////////////////////////////
348     // Zeilen wieder einfuegen
349     long nInsertRow = m_nInsPos;
350      ::boost::shared_ptr<OTableRow>  pRow;
351     ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_vInsertedRows.begin();
352     ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_vInsertedRows.end();
353     ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
354     for(;aIter != aEnd;++aIter)
355     {
356         pRow.reset(new OTableRow( **aIter ));
357         pRowList->insert( pRowList->begin()+nInsertRow ,pRow );
358         nInsertRow++;
359     }
360 
361     pTabEdCtrl->RowInserted( m_nInsPos, m_vInsertedRows.size(), sal_True );
362     pTabEdCtrl->InvalidateHandleColumn();
363 
364     OTableEditorUndoAct::Redo();
365 }
366 
367 //==============================================================================
368 // class OTableEditorInsNewUndoAct
369 //==============================================================================
370 DBG_NAME(OTableEditorInsNewUndoAct);
OTableEditorInsNewUndoAct(OTableEditorCtrl * pOwner,long nInsertPosition,long nInsertedRows)371 OTableEditorInsNewUndoAct::OTableEditorInsNewUndoAct( OTableEditorCtrl* pOwner, long nInsertPosition, long nInsertedRows ) :
372      OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_NEWROWINSERTED)
373     ,m_nInsPos( nInsertPosition )
374     ,m_nInsRows( nInsertedRows )
375 {
376     DBG_CTOR(OTableEditorInsNewUndoAct,NULL);
377 }
378 
379 //-------------------------------------------------------------------------
~OTableEditorInsNewUndoAct()380 OTableEditorInsNewUndoAct::~OTableEditorInsNewUndoAct()
381 {
382     DBG_DTOR(OTableEditorInsNewUndoAct,NULL);
383 }
384 
385 //-------------------------------------------------------------------------
Undo()386 void OTableEditorInsNewUndoAct::Undo()
387 {
388     //////////////////////////////////////////////////////////////////////
389     // Eingefuegte Zeilen wieder loeschen
390     ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
391 
392     for( long i=(m_nInsPos+m_nInsRows-1); i>(m_nInsPos-1); i-- )
393     {
394         pOriginalRows->erase(pOriginalRows->begin()+i);
395     }
396 
397     pTabEdCtrl->RowRemoved( m_nInsPos, m_nInsRows, sal_True );
398     pTabEdCtrl->InvalidateHandleColumn();
399 
400     OTableEditorUndoAct::Undo();
401 }
402 
403 //-------------------------------------------------------------------------
Redo()404 void OTableEditorInsNewUndoAct::Redo()
405 {
406     //////////////////////////////////////////////////////////////////////
407     // Zeilen wieder einfuegen
408     ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
409 
410     for( long i=m_nInsPos; i<(m_nInsPos+m_nInsRows); i++ )
411         pRowList->insert( pRowList->begin()+i,::boost::shared_ptr<OTableRow>(new OTableRow()) );
412 
413     pTabEdCtrl->RowInserted( m_nInsPos, m_nInsRows, sal_True );
414     pTabEdCtrl->InvalidateHandleColumn();
415 
416     OTableEditorUndoAct::Redo();
417 }
418 
419 //-------------------------------------------------------------------------
420 //========================================================================
421 // class OPrimKeyUndoAct
422 //========================================================================
423 DBG_NAME(OPrimKeyUndoAct);
424 //-------------------------------------------------------------------------
OPrimKeyUndoAct(OTableEditorCtrl * pOwner,MultiSelection aDeletedKeys,MultiSelection aInsertedKeys)425 OPrimKeyUndoAct::OPrimKeyUndoAct( OTableEditorCtrl* pOwner, MultiSelection aDeletedKeys, MultiSelection aInsertedKeys) :
426      OTableEditorUndoAct( pOwner ,STR_TABLEDESIGN_UNDO_PRIMKEY)
427     ,m_aDelKeys( aDeletedKeys )
428     ,m_aInsKeys( aInsertedKeys )
429     ,m_pEditorCtrl( pOwner )
430 {
431     DBG_CTOR(OPrimKeyUndoAct,NULL);
432 }
433 
434 //-------------------------------------------------------------------------
~OPrimKeyUndoAct()435 OPrimKeyUndoAct::~OPrimKeyUndoAct()
436 {
437     DBG_DTOR(OPrimKeyUndoAct,NULL);
438 }
439 
440 //-------------------------------------------------------------------------
Undo()441 void OPrimKeyUndoAct::Undo()
442 {
443     ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
444     ::boost::shared_ptr<OTableRow>  pRow;
445     long nIndex;
446 
447     //////////////////////////////////////////////////////////////////////
448     // Die eingefuegten Keys loeschen
449     for( nIndex = m_aInsKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aInsKeys.NextSelected() )
450     {
451         OSL_ENSURE(nIndex <= static_cast<long>(pRowList->size()),"Index for undo isn't valid!");
452         pRow = (*pRowList)[nIndex];
453         pRow->SetPrimaryKey( sal_False );
454     }
455 
456     //////////////////////////////////////////////////////////////////////
457     // Die geloeschten Keys herstellen
458     for( nIndex = m_aDelKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aDelKeys.NextSelected() )
459     {
460         OSL_ENSURE(nIndex <= static_cast<long>(pRowList->size()),"Index for undo isn't valid!");
461         pRow = (*pRowList)[nIndex];
462         pRow->SetPrimaryKey( sal_True );
463     }
464 
465     m_pEditorCtrl->InvalidateHandleColumn();
466     OTableEditorUndoAct::Undo();
467 }
468 
469 //-------------------------------------------------------------------------
Redo()470 void OPrimKeyUndoAct::Redo()
471 {
472     ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
473     long nIndex;
474 
475     //////////////////////////////////////////////////////////////////////
476     // Die geloeschten Keys loeschen
477     for( nIndex = m_aDelKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aDelKeys.NextSelected() )
478         (*pRowList)[nIndex]->SetPrimaryKey( sal_False );
479 
480     //////////////////////////////////////////////////////////////////////
481     // Die eingefuegten Keys herstellen
482     for( nIndex = m_aInsKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aInsKeys.NextSelected() )
483         (*pRowList)[nIndex]->SetPrimaryKey( sal_True );
484 
485     m_pEditorCtrl->InvalidateHandleColumn();
486     OTableEditorUndoAct::Redo();
487 }
488 
489 
490 
491 
492