1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include "TableUndo.hxx"
21 #include <strings.hrc>
22 #include "TEditControl.hxx"
23 #include <TableRow.hxx>
24 #include <TableController.hxx>
25 #include <TableDesignView.hxx>
26 #include <FieldDescriptions.hxx>
27 #include <svx/svxids.hrc>
28 
29 using namespace dbaui;
30 using namespace ::svt;
31 
32 
OTableDesignUndoAct(OTableRowView * pOwner,const char * pCommentID)33 OTableDesignUndoAct::OTableDesignUndoAct(OTableRowView* pOwner, const char* pCommentID)
34     : OCommentUndoAction(pCommentID)
35     , m_pTabDgnCtrl(pOwner)
36 {
37     m_pTabDgnCtrl->m_nCurUndoActId++;
38 }
39 
~OTableDesignUndoAct()40 OTableDesignUndoAct::~OTableDesignUndoAct()
41 {
42 }
43 
Undo()44 void OTableDesignUndoAct::Undo()
45 {
46     m_pTabDgnCtrl->m_nCurUndoActId--;
47 
48     // doc has not been modified if first undo was reverted
49     if( m_pTabDgnCtrl->m_nCurUndoActId == 0 )
50     {
51         m_pTabDgnCtrl->GetView()->getController().setModified(false);
52         m_pTabDgnCtrl->GetView()->getController().InvalidateFeature(SID_SAVEDOC);
53     }
54 }
55 
Redo()56 void OTableDesignUndoAct::Redo()
57 {
58     m_pTabDgnCtrl->m_nCurUndoActId++;
59 
60     // restore Modified-flag after Redo of first Undo-action
61     if( m_pTabDgnCtrl->m_nCurUndoActId > 0 )
62     {
63         m_pTabDgnCtrl->GetView()->getController().setModified(true);
64         m_pTabDgnCtrl->GetView()->getController().InvalidateFeature(SID_SAVEDOC);
65     }
66 }
67 
OTableDesignCellUndoAct(OTableRowView * pOwner,sal_Int32 nRowID,sal_uInt16 nColumn)68 OTableDesignCellUndoAct::OTableDesignCellUndoAct( OTableRowView* pOwner, sal_Int32 nRowID, sal_uInt16 nColumn ) :
69      OTableDesignUndoAct( pOwner ,STR_TABED_UNDO_CELLMODIFIED)
70     ,m_nCol( nColumn )
71     ,m_nRow( nRowID )
72 {
73     // read text at position (m_nRow, m_nCol)
74     m_sOldText = m_pTabDgnCtrl->GetCellData( m_nRow, m_nCol );
75 }
76 
~OTableDesignCellUndoAct()77 OTableDesignCellUndoAct::~OTableDesignCellUndoAct()
78 {
79 }
80 
Undo()81 void OTableDesignCellUndoAct::Undo()
82 {
83     // store text at old line and restore the old one
84     m_pTabDgnCtrl->ActivateCell( m_nRow, m_nCol );
85     m_sNewText = m_pTabDgnCtrl->GetCellData( m_nRow, m_nCol );
86     m_pTabDgnCtrl->SetCellData( m_nRow, m_nCol, m_sOldText );
87     // line has not been modified if the first Undo was reverted
88     if (m_pTabDgnCtrl->GetCurUndoActId() == 1)
89     {
90         CellControllerRef xController = m_pTabDgnCtrl->Controller();
91         if ( xController.is() )
92             xController->SaveValue();
93         m_pTabDgnCtrl->GetView()->getController().setModified(false);
94 
95     }
96 
97     OTableDesignUndoAct::Undo();
98 }
99 
Redo()100 void OTableDesignCellUndoAct::Redo()
101 {
102     // restore new text
103     m_pTabDgnCtrl->ActivateCell( m_nRow, m_nCol );
104     m_pTabDgnCtrl->SetCellData( m_nRow, m_nCol, m_sNewText );
105 
106     OTableDesignUndoAct::Redo();
107 }
108 
OTableEditorUndoAct(OTableEditorCtrl * pOwner,const char * pCommentID)109 OTableEditorUndoAct::OTableEditorUndoAct(OTableEditorCtrl* pOwner, const char* pCommentID)
110     : OTableDesignUndoAct(pOwner, pCommentID)
111     , pTabEdCtrl(pOwner)
112 {
113 }
114 
~OTableEditorUndoAct()115 OTableEditorUndoAct::~OTableEditorUndoAct()
116 {
117 }
118 
OTableEditorTypeSelUndoAct(OTableEditorCtrl * pOwner,sal_Int32 nRowID,sal_uInt16 nColumn,const TOTypeInfoSP & _pOldType)119 OTableEditorTypeSelUndoAct::OTableEditorTypeSelUndoAct( OTableEditorCtrl* pOwner, sal_Int32 nRowID, sal_uInt16 nColumn, const TOTypeInfoSP& _pOldType )
120     :OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_TYPE_CHANGED)
121     ,m_nCol( nColumn )
122     ,m_nRow( nRowID )
123     ,m_pOldType( _pOldType )
124 {
125 }
126 
~OTableEditorTypeSelUndoAct()127 OTableEditorTypeSelUndoAct::~OTableEditorTypeSelUndoAct()
128 {
129 }
130 
Undo()131 void OTableEditorTypeSelUndoAct::Undo()
132 {
133     // restore type
134     OFieldDescription* pFieldDesc = pTabEdCtrl->GetFieldDescr(m_nRow);
135     if(pFieldDesc)
136         m_pNewType = pFieldDesc->getTypeInfo();
137     else
138         m_pNewType = TOTypeInfoSP();
139     pTabEdCtrl->SetCellData(m_nRow,m_nCol,m_pOldType);
140     pTabEdCtrl->SwitchType( m_pOldType );
141 
142     OTableEditorUndoAct::Undo();
143 }
144 
Redo()145 void OTableEditorTypeSelUndoAct::Redo()
146 {
147     // new type
148     pTabEdCtrl->GoToRowColumnId( m_nRow ,m_nCol);
149     pTabEdCtrl->SetCellData(m_nRow,m_nCol,m_pNewType);
150 
151     OTableEditorUndoAct::Redo();
152 }
153 
OTableEditorDelUndoAct(OTableEditorCtrl * pOwner)154 OTableEditorDelUndoAct::OTableEditorDelUndoAct( OTableEditorCtrl* pOwner) :
155      OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_ROWDELETED)
156 {
157     // fill DeletedRowList
158     std::vector< std::shared_ptr<OTableRow> >* pOriginalRows = pOwner->GetRowList();
159     sal_Int32 nIndex = pOwner->FirstSelectedRow();
160     std::shared_ptr<OTableRow>  pOriginalRow;
161     std::shared_ptr<OTableRow>  pNewRow;
162 
163     while( nIndex != SFX_ENDOFSELECTION )
164     {
165         pOriginalRow = (*pOriginalRows)[nIndex];
166         pNewRow = std::make_shared<OTableRow>( *pOriginalRow, nIndex );
167         m_aDeletedRows.push_back( pNewRow);
168 
169         nIndex = pOwner->NextSelectedRow();
170     }
171 }
172 
~OTableEditorDelUndoAct()173 OTableEditorDelUndoAct::~OTableEditorDelUndoAct()
174 {
175     m_aDeletedRows.clear();
176 }
177 
Undo()178 void OTableEditorDelUndoAct::Undo()
179 {
180     // Insert the deleted line
181     sal_uLong nPos;
182 
183     std::shared_ptr<OTableRow>  pNewOrigRow;
184     std::vector< std::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
185 
186     for (auto const& deletedRow : m_aDeletedRows)
187     {
188         pNewOrigRow = std::make_shared<OTableRow>( *deletedRow );
189         nPos = deletedRow->GetPos();
190         pOriginalRows->insert( pOriginalRows->begin()+nPos,pNewOrigRow);
191     }
192 
193     pTabEdCtrl->DisplayData(pTabEdCtrl->GetCurRow());
194     pTabEdCtrl->Invalidate();
195     OTableEditorUndoAct::Undo();
196 }
197 
Redo()198 void OTableEditorDelUndoAct::Redo()
199 {
200     // delete line again
201     std::vector< std::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
202 
203     for (auto const& deletedRow : m_aDeletedRows)
204     {
205         auto it = pOriginalRows->begin() + deletedRow->GetPos();
206         pOriginalRows->erase(it);
207     }
208 
209     pTabEdCtrl->DisplayData(pTabEdCtrl->GetCurRow());
210     pTabEdCtrl->Invalidate();
211     OTableEditorUndoAct::Redo();
212 }
213 
OTableEditorInsUndoAct(OTableEditorCtrl * pOwner,tools::Long nInsertPosition,const std::vector<std::shared_ptr<OTableRow>> & _vInsertedRows)214 OTableEditorInsUndoAct::OTableEditorInsUndoAct( OTableEditorCtrl* pOwner,
215                                                tools::Long nInsertPosition ,
216                                                const std::vector<  std::shared_ptr<OTableRow> >& _vInsertedRows)
217     :OTableEditorUndoAct( pOwner,STR_TABED_UNDO_ROWINSERTED )
218     ,m_vInsertedRows(_vInsertedRows)
219     ,m_nInsPos( nInsertPosition )
220 {
221 }
222 
~OTableEditorInsUndoAct()223 OTableEditorInsUndoAct::~OTableEditorInsUndoAct()
224 {
225     m_vInsertedRows.clear();
226 }
227 
Undo()228 void OTableEditorInsUndoAct::Undo()
229 {
230     // delete lines again
231     std::vector< std::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
232     pOriginalRows->erase(pOriginalRows->begin() + m_nInsPos, pOriginalRows->begin() + m_nInsPos + m_vInsertedRows.size());
233 
234     pTabEdCtrl->RowRemoved( m_nInsPos, m_vInsertedRows.size() );
235     pTabEdCtrl->InvalidateHandleColumn();
236 
237     OTableEditorUndoAct::Undo();
238 }
239 
Redo()240 void OTableEditorInsUndoAct::Redo()
241 {
242     // insert lines again
243     sal_Int32 nInsertRow = m_nInsPos;
244     std::shared_ptr<OTableRow>  pRow;
245     std::vector< std::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
246     for (auto const& insertedRow : m_vInsertedRows)
247     {
248         pRow = std::make_shared<OTableRow>( *insertedRow );
249         pRowList->insert( pRowList->begin()+nInsertRow ,pRow );
250         nInsertRow++;
251     }
252 
253     pTabEdCtrl->RowInserted( m_nInsPos, m_vInsertedRows.size() );
254     pTabEdCtrl->InvalidateHandleColumn();
255 
256     OTableEditorUndoAct::Redo();
257 }
258 
OTableEditorInsNewUndoAct(OTableEditorCtrl * pOwner,sal_Int32 nInsertPosition,sal_Int32 nInsertedRows)259 OTableEditorInsNewUndoAct::OTableEditorInsNewUndoAct( OTableEditorCtrl* pOwner, sal_Int32 nInsertPosition, sal_Int32 nInsertedRows ) :
260      OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_NEWROWINSERTED)
261     ,m_nInsPos( nInsertPosition )
262     ,m_nInsRows( nInsertedRows )
263 {
264 }
265 
~OTableEditorInsNewUndoAct()266 OTableEditorInsNewUndoAct::~OTableEditorInsNewUndoAct()
267 {
268 }
269 
Undo()270 void OTableEditorInsNewUndoAct::Undo()
271 {
272     // delete inserted lines
273     std::vector< std::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
274 
275     pOriginalRows->erase(pOriginalRows->begin() + m_nInsPos, pOriginalRows->begin() + m_nInsPos + m_nInsRows);
276 
277     pTabEdCtrl->RowRemoved( m_nInsPos, m_nInsRows );
278     pTabEdCtrl->InvalidateHandleColumn();
279 
280     OTableEditorUndoAct::Undo();
281 }
282 
Redo()283 void OTableEditorInsNewUndoAct::Redo()
284 {
285     // insert lines again
286     std::vector< std::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
287 
288     for( tools::Long i=m_nInsPos; i<(m_nInsPos+m_nInsRows); i++ )
289         pRowList->insert( pRowList->begin()+i,std::make_shared<OTableRow>() );
290 
291     pTabEdCtrl->RowInserted( m_nInsPos, m_nInsRows );
292     pTabEdCtrl->InvalidateHandleColumn();
293 
294     OTableEditorUndoAct::Redo();
295 }
296 
OPrimKeyUndoAct(OTableEditorCtrl * pOwner,const MultiSelection & aDeletedKeys,const MultiSelection & aInsertedKeys)297 OPrimKeyUndoAct::OPrimKeyUndoAct( OTableEditorCtrl* pOwner, const MultiSelection& aDeletedKeys, const MultiSelection& aInsertedKeys) :
298      OTableEditorUndoAct( pOwner ,STR_TABLEDESIGN_UNDO_PRIMKEY)
299     ,m_aDelKeys( aDeletedKeys )
300     ,m_aInsKeys( aInsertedKeys )
301     ,m_pEditorCtrl( pOwner )
302 {
303 }
304 
~OPrimKeyUndoAct()305 OPrimKeyUndoAct::~OPrimKeyUndoAct()
306 {
307 }
308 
Undo()309 void OPrimKeyUndoAct::Undo()
310 {
311     std::vector< std::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
312     std::shared_ptr<OTableRow>  pRow;
313     tools::Long nIndex;
314 
315     // delete inserted keys
316     for( nIndex = m_aInsKeys.FirstSelected(); nIndex != tools::Long(SFX_ENDOFSELECTION); nIndex=m_aInsKeys.NextSelected() )
317     {
318         OSL_ENSURE(nIndex <= static_cast<tools::Long>(pRowList->size()),"Index for undo isn't valid!");
319         pRow = (*pRowList)[nIndex];
320         pRow->SetPrimaryKey( false );
321     }
322 
323     // restore deleted keys
324     for( nIndex = m_aDelKeys.FirstSelected(); nIndex != tools::Long(SFX_ENDOFSELECTION); nIndex=m_aDelKeys.NextSelected() )
325     {
326         OSL_ENSURE(nIndex <= static_cast<tools::Long>(pRowList->size()),"Index for undo isn't valid!");
327         pRow = (*pRowList)[nIndex];
328         pRow->SetPrimaryKey( true );
329     }
330 
331     m_pEditorCtrl->InvalidateHandleColumn();
332     OTableEditorUndoAct::Undo();
333 }
334 
Redo()335 void OPrimKeyUndoAct::Redo()
336 {
337     std::vector< std::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
338     tools::Long nIndex;
339 
340     // delete the deleted keys
341     for( nIndex = m_aDelKeys.FirstSelected(); nIndex != tools::Long(SFX_ENDOFSELECTION); nIndex=m_aDelKeys.NextSelected() )
342         (*pRowList)[nIndex]->SetPrimaryKey( false );
343 
344     // restore the inserted keys
345     for( nIndex = m_aInsKeys.FirstSelected(); nIndex != tools::Long(SFX_ENDOFSELECTION); nIndex=m_aInsKeys.NextSelected() )
346         (*pRowList)[nIndex]->SetPrimaryKey( true );
347 
348     m_pEditorCtrl->InvalidateHandleColumn();
349     OTableEditorUndoAct::Redo();
350 }
351 
352 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
353