/************************************************************************* * * 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 * * 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 #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,sal_uInt16 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, sal_uInt16 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,sal_uInt16 _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, sal_uInt16 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 >* pOriginalRows = pOwner->GetRowList(); long nIndex = pOwner->FirstSelectedRow(); ::boost::shared_ptr pOriginalRow; ::boost::shared_ptr 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 sal_uLong nPos; ::std::vector< ::boost::shared_ptr >::iterator aIter = m_aDeletedRows.begin(); ::std::vector< ::boost::shared_ptr >::iterator aEnd = m_aDeletedRows.end(); ::boost::shared_ptr pNewOrigRow; ::std::vector< ::boost::shared_ptr >* 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 sal_uLong nPos; ::std::vector< ::boost::shared_ptr >::iterator aIter = m_aDeletedRows.begin(); ::std::vector< ::boost::shared_ptr >::iterator aEnd = m_aDeletedRows.end(); ::std::vector< ::boost::shared_ptr >* 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 >& _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 >* 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(), sal_True ); pTabEdCtrl->InvalidateHandleColumn(); OTableEditorUndoAct::Undo(); } //------------------------------------------------------------------------- void OTableEditorInsUndoAct::Redo() { ////////////////////////////////////////////////////////////////////// // Zeilen wieder einfuegen long nInsertRow = m_nInsPos; ::boost::shared_ptr pRow; ::std::vector< ::boost::shared_ptr >::iterator aIter = m_vInsertedRows.begin(); ::std::vector< ::boost::shared_ptr >::iterator aEnd = m_vInsertedRows.end(); ::std::vector< ::boost::shared_ptr >* 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(), sal_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 >* 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, sal_True ); pTabEdCtrl->InvalidateHandleColumn(); OTableEditorUndoAct::Undo(); } //------------------------------------------------------------------------- void OTableEditorInsNewUndoAct::Redo() { ////////////////////////////////////////////////////////////////////// // Zeilen wieder einfuegen ::std::vector< ::boost::shared_ptr >* pRowList = pTabEdCtrl->GetRowList(); for( long i=m_nInsPos; i<(m_nInsPos+m_nInsRows); i++ ) pRowList->insert( pRowList->begin()+i,::boost::shared_ptr(new OTableRow()) ); pTabEdCtrl->RowInserted( m_nInsPos, m_nInsRows, sal_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 >* pRowList = pTabEdCtrl->GetRowList(); ::boost::shared_ptr 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(pRowList->size()),"Index for undo isn't valid!"); pRow = (*pRowList)[nIndex]; pRow->SetPrimaryKey( sal_False ); } ////////////////////////////////////////////////////////////////////// // Die geloeschten Keys herstellen for( nIndex = m_aDelKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aDelKeys.NextSelected() ) { OSL_ENSURE(nIndex <= static_cast(pRowList->size()),"Index for undo isn't valid!"); pRow = (*pRowList)[nIndex]; pRow->SetPrimaryKey( sal_True ); } m_pEditorCtrl->InvalidateHandleColumn(); OTableEditorUndoAct::Undo(); } //------------------------------------------------------------------------- void OPrimKeyUndoAct::Redo() { ::std::vector< ::boost::shared_ptr >* 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( sal_False ); ////////////////////////////////////////////////////////////////////// // Die eingefuegten Keys herstellen for( nIndex = m_aInsKeys.FirstSelected(); nIndex != (long)SFX_ENDOFSELECTION; nIndex=m_aInsKeys.NextSelected() ) (*pRowList)[nIndex]->SetPrimaryKey( sal_True ); m_pEditorCtrl->InvalidateHandleColumn(); OTableEditorUndoAct::Redo(); }