summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/tabledesign/TableUndo.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dbaccess/source/ui/tabledesign/TableUndo.cxx')
-rw-r--r--dbaccess/source/ui/tabledesign/TableUndo.cxx495
1 files changed, 495 insertions, 0 deletions
diff --git a/dbaccess/source/ui/tabledesign/TableUndo.cxx b/dbaccess/source/ui/tabledesign/TableUndo.cxx
new file mode 100644
index 000000000000..39d7902a1b9d
--- /dev/null
+++ b/dbaccess/source/ui/tabledesign/TableUndo.cxx
@@ -0,0 +1,495 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_dbaccess.hxx"
+#ifndef DBAUI_TABLEUNDO_HXX
+#include "TableUndo.hxx"
+#endif
+#ifndef _DBU_TBL_HRC_
+#include "dbu_tbl.hrc"
+#endif
+#ifndef DBAUI_TABLEEDITORCONTROL_HXX
+#include "TEditControl.hxx"
+#endif
+#ifndef DBAUI_TABLEROW_HXX
+#include "TableRow.hxx"
+#endif
+#ifndef DBACCESS_UI_BROWSER_ID_HXX
+#include "browserids.hxx"
+#endif
+#ifndef DBUI_TABLECONTROLLER_HXX
+#include "TableController.hxx"
+#endif
+#ifndef DBAUI_TABLEDESIGNVIEW_HXX
+#include "TableDesignView.hxx"
+#endif
+#ifndef DBAUI_FIELDDESCRIPTIONS_HXX
+#include "FieldDescriptions.hxx"
+#endif
+#ifndef _TOOLS_DEBUG_HXX
+#include <tools/debug.hxx>
+#endif
+
+using namespace dbaui;
+using namespace ::svt;
+
+TYPEINIT1( OCommentUndoAction, SfxUndoAction );
+TYPEINIT1( OTableDesignUndoAct, OCommentUndoAction );
+TYPEINIT1( OTableEditorUndoAct, OTableDesignUndoAct );
+TYPEINIT1( OTableDesignCellUndoAct, OTableDesignUndoAct );
+TYPEINIT1( OTableEditorTypeSelUndoAct, OTableEditorUndoAct );
+TYPEINIT1( OTableEditorDelUndoAct, OTableEditorUndoAct );
+TYPEINIT1( OTableEditorInsUndoAct, OTableEditorUndoAct );
+TYPEINIT1( OTableEditorInsNewUndoAct, OTableEditorUndoAct );
+TYPEINIT1( OPrimKeyUndoAct, OTableEditorUndoAct );
+
+//==============================================================================
+// class OTableDesignUndoAct
+//==============================================================================
+DBG_NAME(OTableDesignUndoAct);
+OTableDesignUndoAct::OTableDesignUndoAct( OTableRowView* pOwner,USHORT nCommentID ) : OCommentUndoAction(nCommentID)
+ ,m_pTabDgnCtrl( pOwner )
+{
+ DBG_CTOR(OTableDesignUndoAct,NULL);
+ m_pTabDgnCtrl->m_nCurUndoActId++;
+}
+
+//-------------------------------------------------------------------------
+OTableDesignUndoAct::~OTableDesignUndoAct()
+{
+ DBG_DTOR(OTableDesignUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+void OTableDesignUndoAct::Undo()
+{
+ m_pTabDgnCtrl->m_nCurUndoActId--;
+
+ //////////////////////////////////////////////////////////////////////
+ // Wenn erstes Undo zurueckgenommen wurde, ist Doc nicht modifiziert worden
+ if( m_pTabDgnCtrl->m_nCurUndoActId == 0 )
+ {
+ m_pTabDgnCtrl->GetView()->getController().setModified(sal_False);
+ m_pTabDgnCtrl->GetView()->getController().InvalidateFeature(SID_SAVEDOC);
+ }
+}
+
+//-------------------------------------------------------------------------
+void OTableDesignUndoAct::Redo()
+{
+ m_pTabDgnCtrl->m_nCurUndoActId++;
+
+ //////////////////////////////////////////////////////////////////////
+ // Wenn Redo fuer erste Undo-Action, muss Modified-Flag wieder gesetzt werden
+ if( m_pTabDgnCtrl->m_nCurUndoActId > 0 )
+ {
+ m_pTabDgnCtrl->GetView()->getController().setModified(sal_True);
+ m_pTabDgnCtrl->GetView()->getController().InvalidateFeature(SID_SAVEDOC);
+ }
+}
+//==============================================================================
+// class OTableDesignCellUndoAct
+//==============================================================================
+DBG_NAME(OTableDesignCellUndoAct);
+OTableDesignCellUndoAct::OTableDesignCellUndoAct( OTableRowView* pOwner, long nRowID, USHORT nColumn ) :
+ OTableDesignUndoAct( pOwner ,STR_TABED_UNDO_CELLMODIFIED)
+ ,m_nCol( nColumn )
+ ,m_nRow( nRowID )
+{
+ DBG_CTOR(OTableDesignCellUndoAct,NULL);
+ //////////////////////////////////////////////////////////////////////
+ // Text an der Position (m_nRow, m_nCol) auslesen
+ m_sOldText = m_pTabDgnCtrl->GetCellData( m_nRow, m_nCol );
+}
+
+//-------------------------------------------------------------------------
+OTableDesignCellUndoAct::~OTableDesignCellUndoAct()
+{
+ DBG_DTOR(OTableDesignCellUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+void OTableDesignCellUndoAct::Undo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Neuen Text der alten Zelle speichern und alten wieder einsetzen
+ m_pTabDgnCtrl->ActivateCell( m_nRow, m_nCol );
+ m_sNewText = m_pTabDgnCtrl->GetCellData( m_nRow, m_nCol );
+ m_pTabDgnCtrl->SetCellData( m_nRow, m_nCol, m_sOldText );
+ //////////////////////////////////////////////////////////////////////
+ // Wenn erstes Undo zurueckgenommen wurde, ist Zelle nicht mehr modifiziert
+ if (m_pTabDgnCtrl->GetCurUndoActId() == 1)
+ {
+ CellControllerRef xController = m_pTabDgnCtrl->Controller();
+ if ( xController.Is() )
+ xController->ClearModified();
+ m_pTabDgnCtrl->GetView()->getController().setModified(sal_False);
+
+ }
+
+ OTableDesignUndoAct::Undo();
+}
+
+//-------------------------------------------------------------------------
+void OTableDesignCellUndoAct::Redo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Neuen Text wieder einseten
+ m_pTabDgnCtrl->ActivateCell( m_nRow, m_nCol );
+ m_pTabDgnCtrl->SetCellData( m_nRow, m_nCol, m_sNewText );
+
+ OTableDesignUndoAct::Redo();
+}
+
+//==============================================================================
+// class OTableEditorUndoAct
+//==============================================================================
+DBG_NAME(OTableEditorUndoAct);
+OTableEditorUndoAct::OTableEditorUndoAct( OTableEditorCtrl* pOwner,USHORT _nCommentID ) :
+ OTableDesignUndoAct( pOwner ,_nCommentID)
+ ,pTabEdCtrl(pOwner)
+{
+ DBG_CTOR(OTableEditorUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+OTableEditorUndoAct::~OTableEditorUndoAct()
+{
+ DBG_DTOR(OTableEditorUndoAct,NULL);
+}
+
+//==============================================================================
+// class OTableEditorTypeSelUndoAct
+//==============================================================================
+DBG_NAME(OTableEditorTypeSelUndoAct);
+OTableEditorTypeSelUndoAct::OTableEditorTypeSelUndoAct( OTableEditorCtrl* pOwner, long nRowID, USHORT nColumn, const TOTypeInfoSP& _pOldType )
+ :OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_TYPE_CHANGED)
+ ,m_nCol( nColumn )
+ ,m_nRow( nRowID )
+ ,m_pOldType( _pOldType )
+{
+ DBG_CTOR(OTableEditorTypeSelUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+OTableEditorTypeSelUndoAct::~OTableEditorTypeSelUndoAct()
+{
+ DBG_DTOR(OTableEditorTypeSelUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorTypeSelUndoAct::Undo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Typ zuruecksetzen
+ OFieldDescription* pFieldDesc = pTabEdCtrl->GetFieldDescr(m_nRow);
+ if(pFieldDesc)
+ m_pNewType = pFieldDesc->getTypeInfo();
+ else
+ m_pNewType = TOTypeInfoSP();
+ pTabEdCtrl->SetCellData(m_nRow,m_nCol,m_pOldType);
+ pTabEdCtrl->SwitchType( m_pOldType );
+
+ OTableEditorUndoAct::Undo();
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorTypeSelUndoAct::Redo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Neuen Typ
+ pTabEdCtrl->GoToRowColumnId( m_nRow ,m_nCol);
+ pTabEdCtrl->SetCellData(m_nRow,m_nCol,m_pNewType);
+
+ OTableEditorUndoAct::Redo();
+}
+
+//==============================================================================
+// class OTableEditorDelUndoAct
+//==============================================================================
+DBG_NAME(OTableEditorDelUndoAct);
+OTableEditorDelUndoAct::OTableEditorDelUndoAct( OTableEditorCtrl* pOwner) :
+ OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_ROWDELETED)
+{
+ DBG_CTOR(OTableEditorDelUndoAct,NULL);
+ //////////////////////////////////////////////////////////////////////
+ // DeletedRowList fuellen
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pOwner->GetRowList();
+ long nIndex = pOwner->FirstSelectedRow();
+ ::boost::shared_ptr<OTableRow> pOriginalRow;
+ ::boost::shared_ptr<OTableRow> pNewRow;
+
+ while( nIndex >= 0 )
+ {
+ pOriginalRow = (*pOriginalRows)[nIndex];
+ pNewRow.reset(new OTableRow( *pOriginalRow, nIndex ));
+ m_aDeletedRows.push_back( pNewRow);
+
+ nIndex = pOwner->NextSelectedRow();
+ }
+}
+
+//-------------------------------------------------------------------------
+OTableEditorDelUndoAct::~OTableEditorDelUndoAct()
+{
+ DBG_DTOR(OTableEditorDelUndoAct,NULL);
+ m_aDeletedRows.clear();
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorDelUndoAct::Undo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Geloeschte Zeilen wieder einfuegen
+ ULONG nPos;
+ ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_aDeletedRows.begin();
+ ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_aDeletedRows.end();
+
+ ::boost::shared_ptr<OTableRow> pNewOrigRow;
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
+
+ for(;aIter != aEnd;++aIter)
+ {
+ pNewOrigRow.reset(new OTableRow( **aIter ));
+ nPos = (*aIter)->GetPos();
+ pOriginalRows->insert( pOriginalRows->begin()+nPos,pNewOrigRow);
+ }
+
+ pTabEdCtrl->DisplayData(pTabEdCtrl->GetCurRow());
+ pTabEdCtrl->Invalidate();
+ OTableEditorUndoAct::Undo();
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorDelUndoAct::Redo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Zeilen wieder loeschen
+ ULONG nPos;
+ ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_aDeletedRows.begin();
+ ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_aDeletedRows.end();
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
+
+ for(;aIter != aEnd;++aIter)
+ {
+ nPos = (*aIter)->GetPos();
+ pOriginalRows->erase( pOriginalRows->begin()+nPos );
+ }
+
+ pTabEdCtrl->DisplayData(pTabEdCtrl->GetCurRow());
+ pTabEdCtrl->Invalidate();
+ OTableEditorUndoAct::Redo();
+}
+
+//-------------------------------------------------------------------------
+//==============================================================================
+// class OTableEditorInsUndoAct
+//==============================================================================
+DBG_NAME(OTableEditorInsUndoAct);
+OTableEditorInsUndoAct::OTableEditorInsUndoAct( OTableEditorCtrl* pOwner,
+ long nInsertPosition ,
+ const ::std::vector< ::boost::shared_ptr<OTableRow> >& _vInsertedRows)
+ :OTableEditorUndoAct( pOwner,STR_TABED_UNDO_ROWINSERTED )
+ ,m_vInsertedRows(_vInsertedRows)
+ ,m_nInsPos( nInsertPosition )
+{
+ DBG_CTOR(OTableEditorInsUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+OTableEditorInsUndoAct::~OTableEditorInsUndoAct()
+{
+ DBG_DTOR(OTableEditorInsUndoAct,NULL);
+ m_vInsertedRows.clear();
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorInsUndoAct::Undo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Eingefuegte Zeilen wieder loeschen
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
+ for( long i=(m_nInsPos+m_vInsertedRows.size()-1); i>(m_nInsPos-1); i-- )
+ {
+ pOriginalRows->erase(pOriginalRows->begin()+i);
+ }
+
+ pTabEdCtrl->RowRemoved( m_nInsPos, m_vInsertedRows.size(), TRUE );
+ pTabEdCtrl->InvalidateHandleColumn();
+
+ OTableEditorUndoAct::Undo();
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorInsUndoAct::Redo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Zeilen wieder einfuegen
+ long nInsertRow = m_nInsPos;
+ ::boost::shared_ptr<OTableRow> pRow;
+ ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_vInsertedRows.begin();
+ ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_vInsertedRows.end();
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
+ for(;aIter != aEnd;++aIter)
+ {
+ pRow.reset(new OTableRow( **aIter ));
+ pRowList->insert( pRowList->begin()+nInsertRow ,pRow );
+ nInsertRow++;
+ }
+
+ pTabEdCtrl->RowInserted( m_nInsPos, m_vInsertedRows.size(), TRUE );
+ pTabEdCtrl->InvalidateHandleColumn();
+
+ OTableEditorUndoAct::Redo();
+}
+
+//==============================================================================
+// class OTableEditorInsNewUndoAct
+//==============================================================================
+DBG_NAME(OTableEditorInsNewUndoAct);
+OTableEditorInsNewUndoAct::OTableEditorInsNewUndoAct( OTableEditorCtrl* pOwner, long nInsertPosition, long nInsertedRows ) :
+ OTableEditorUndoAct( pOwner ,STR_TABED_UNDO_NEWROWINSERTED)
+ ,m_nInsPos( nInsertPosition )
+ ,m_nInsRows( nInsertedRows )
+{
+ DBG_CTOR(OTableEditorInsNewUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+OTableEditorInsNewUndoAct::~OTableEditorInsNewUndoAct()
+{
+ DBG_DTOR(OTableEditorInsNewUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorInsNewUndoAct::Undo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Eingefuegte Zeilen wieder loeschen
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pOriginalRows = pTabEdCtrl->GetRowList();
+
+ for( long i=(m_nInsPos+m_nInsRows-1); i>(m_nInsPos-1); i-- )
+ {
+ pOriginalRows->erase(pOriginalRows->begin()+i);
+ }
+
+ pTabEdCtrl->RowRemoved( m_nInsPos, m_nInsRows, TRUE );
+ pTabEdCtrl->InvalidateHandleColumn();
+
+ OTableEditorUndoAct::Undo();
+}
+
+//-------------------------------------------------------------------------
+void OTableEditorInsNewUndoAct::Redo()
+{
+ //////////////////////////////////////////////////////////////////////
+ // Zeilen wieder einfuegen
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
+
+ for( long i=m_nInsPos; i<(m_nInsPos+m_nInsRows); i++ )
+ pRowList->insert( pRowList->begin()+i,::boost::shared_ptr<OTableRow>(new OTableRow()) );
+
+ pTabEdCtrl->RowInserted( m_nInsPos, m_nInsRows, TRUE );
+ pTabEdCtrl->InvalidateHandleColumn();
+
+ OTableEditorUndoAct::Redo();
+}
+
+//-------------------------------------------------------------------------
+//========================================================================
+// class OPrimKeyUndoAct
+//========================================================================
+DBG_NAME(OPrimKeyUndoAct);
+//-------------------------------------------------------------------------
+OPrimKeyUndoAct::OPrimKeyUndoAct( OTableEditorCtrl* pOwner, MultiSelection aDeletedKeys, MultiSelection aInsertedKeys) :
+ OTableEditorUndoAct( pOwner ,STR_TABLEDESIGN_UNDO_PRIMKEY)
+ ,m_aDelKeys( aDeletedKeys )
+ ,m_aInsKeys( aInsertedKeys )
+ ,m_pEditorCtrl( pOwner )
+{
+ DBG_CTOR(OPrimKeyUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+OPrimKeyUndoAct::~OPrimKeyUndoAct()
+{
+ DBG_DTOR(OPrimKeyUndoAct,NULL);
+}
+
+//-------------------------------------------------------------------------
+void OPrimKeyUndoAct::Undo()
+{
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
+ ::boost::shared_ptr<OTableRow> pRow;
+ long nIndex;
+
+ //////////////////////////////////////////////////////////////////////
+ // Die eingefuegten Keys loeschen
+ for( nIndex = m_aInsKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aInsKeys.NextSelected() )
+ {
+ OSL_ENSURE(nIndex <= static_cast<long>(pRowList->size()),"Index for undo isn't valid!");
+ pRow = (*pRowList)[nIndex];
+ pRow->SetPrimaryKey( FALSE );
+ }
+
+ //////////////////////////////////////////////////////////////////////
+ // Die geloeschten Keys herstellen
+ for( nIndex = m_aDelKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aDelKeys.NextSelected() )
+ {
+ OSL_ENSURE(nIndex <= static_cast<long>(pRowList->size()),"Index for undo isn't valid!");
+ pRow = (*pRowList)[nIndex];
+ pRow->SetPrimaryKey( TRUE );
+ }
+
+ m_pEditorCtrl->InvalidateHandleColumn();
+ OTableEditorUndoAct::Undo();
+}
+
+//-------------------------------------------------------------------------
+void OPrimKeyUndoAct::Redo()
+{
+ ::std::vector< ::boost::shared_ptr<OTableRow> >* pRowList = pTabEdCtrl->GetRowList();
+ long nIndex;
+
+ //////////////////////////////////////////////////////////////////////
+ // Die geloeschten Keys loeschen
+ for( nIndex = m_aDelKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aDelKeys.NextSelected() )
+ (*pRowList)[nIndex]->SetPrimaryKey( FALSE );
+
+ //////////////////////////////////////////////////////////////////////
+ // Die eingefuegten Keys herstellen
+ for( nIndex = m_aInsKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aInsKeys.NextSelected() )
+ (*pRowList)[nIndex]->SetPrimaryKey( TRUE );
+
+ m_pEditorCtrl->InvalidateHandleColumn();
+ OTableEditorUndoAct::Redo();
+}
+
+
+
+