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