Files
libreoffice/sc/source/ui/undo/undocell.cxx
Release Engineers a7a6b2091e CWS-TOOLING: integrate CWS dr70
2009-06-09 13:52:02 +0200 dr  r272770 : #i101930# SXC import broken
2009-06-05 11:50:16 +0200 dr  r272675 : #i10000# compiler warning
2009-06-05 11:24:39 +0200 dr  r272674 : #i10000# compiler warning
2009-06-05 10:35:22 +0200 dr  r272668 : #i10000# compiler warning
2009-06-04 16:53:32 +0200 dr  r272646 : CWS-TOOLING: rebase CWS dr70 to trunk@272291 (milestone: DEV300:m49)
2009-06-04 14:50:45 +0200 dr  r272633 : #i10000# compiler warning
2009-06-03 18:50:57 +0200 dr  r272603 : #i101930# fix ODS export of uninit'ed notes, do not craete note captions in UpdatePendingRowHeights
2009-05-28 11:11:17 +0200 dr  r272384 : #i101930# note captions must be created before changing row/column size
2009-05-27 15:48:44 +0200 iha  r272356 : #i101925# metafile creation is requested superfluously during inplace editing
2009-05-27 15:46:44 +0200 iha  r272355 : #i101925# metafile creation is requested superfluously during inplace editing
2009-05-27 15:06:58 +0200 iha  r272349 : #i101928# superfluous paint calls while entering and editing charts
2009-05-27 15:01:08 +0200 iha  r272348 : #i101928# superfluous paint calls while entering and editing charts
2009-05-26 14:43:39 +0200 dr  r272303 : #i101930# import performance: invisible cell notes cache caption data
2009-05-22 18:44:19 +0200 dr  r272205 : #i101930# preparations for uninitialized notes (performance), adapted ODF import filter
2009-05-14 19:50:43 +0200 dr  r271918 : #i101930# 'recycle' the shapes already created while loading cell notes
2009-05-06 16:07:45 +0200 dr  r271598 : #i100827# improve performance of HTML query filter, patch by mmeeks, slightly modified
2009-05-06 11:02:38 +0200 dr  r271577 : #i100827# improve performance of HTML query filter, patch by mmeeks
2009-05-06 10:50:13 +0200 dr  r271575 : #i86650# improve performance of HTML query filter
2009-05-05 10:09:44 +0200 nn  r271502 : #i101428# better handling of non-existing view data
2009-04-29 16:42:57 +0200 nn  r271384 : #i101428# after loading, update row heights per sheet on demand
2009-07-03 12:42:53 +00:00

1131 lines
31 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: undocell.cxx,v $
* $Revision: 1.15.128.8 $
*
* 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_sc.hxx"
#include "scitems.hxx"
#include <svx/eeitem.hxx>
#include <svx/editobj.hxx>
#include <svtools/zforlist.hxx>
#include <sfx2/app.hxx>
#include "undocell.hxx"
#include "document.hxx"
#include "docpool.hxx"
#include "patattr.hxx"
#include "docsh.hxx"
#include "tabvwsh.hxx"
#include "globstr.hrc"
#include "global.hxx"
#include "cell.hxx"
#include "target.hxx"
#include "undoolk.hxx"
#include "detdata.hxx"
#include "stlpool.hxx"
#include "printfun.hxx"
#include "rangenam.hxx"
#include "chgtrack.hxx"
#include "sc.hrc"
#include "docuno.hxx"
// STATIC DATA -----------------------------------------------------------
TYPEINIT1(ScUndoCursorAttr, ScSimpleUndo);
TYPEINIT1(ScUndoEnterData, ScSimpleUndo);
TYPEINIT1(ScUndoEnterValue, ScSimpleUndo);
TYPEINIT1(ScUndoPutCell, ScSimpleUndo);
TYPEINIT1(ScUndoPageBreak, ScSimpleUndo);
TYPEINIT1(ScUndoPrintZoom, ScSimpleUndo);
TYPEINIT1(ScUndoThesaurus, ScSimpleUndo);
TYPEINIT1(ScUndoReplaceNote, ScSimpleUndo);
TYPEINIT1(ScUndoShowHideNote, ScSimpleUndo);
TYPEINIT1(ScUndoDetective, ScSimpleUndo);
TYPEINIT1(ScUndoRangeNames, ScSimpleUndo);
// -----------------------------------------------------------------------
//
// Attribute auf Cursor anwenden
//
ScUndoCursorAttr::ScUndoCursorAttr( ScDocShell* pNewDocShell,
SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
const ScPatternAttr* pOldPat, const ScPatternAttr* pNewPat,
const ScPatternAttr* pApplyPat, BOOL bAutomatic ) :
ScSimpleUndo( pNewDocShell ),
nCol( nNewCol ),
nRow( nNewRow ),
nTab( nNewTab ),
bIsAutomatic( bAutomatic )
{
ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool();
pNewPattern = (ScPatternAttr*) &pPool->Put( *pNewPat );
pOldPattern = (ScPatternAttr*) &pPool->Put( *pOldPat );
pApplyPattern = (ScPatternAttr*) &pPool->Put( *pApplyPat );
}
__EXPORT ScUndoCursorAttr::~ScUndoCursorAttr()
{
ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool();
pPool->Remove(*pNewPattern);
pPool->Remove(*pOldPattern);
pPool->Remove(*pApplyPattern);
}
String __EXPORT ScUndoCursorAttr::GetComment() const
{
//! eigener Text fuer automatische Attributierung
USHORT nId = STR_UNDO_CURSORATTR; // "Attribute"
return ScGlobal::GetRscString( nId );
}
void ScUndoCursorAttr::DoChange( const ScPatternAttr* pWhichPattern ) const
{
pDocShell->GetDocument()->SetPattern( nCol, nRow, nTab, *pWhichPattern, TRUE );
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
{
pViewShell->SetTabNo( nTab );
pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, FALSE, FALSE );
pViewShell->AdjustBlockHeight();
}
const SfxItemSet& rApplySet = pApplyPattern->GetItemSet();
BOOL bPaintExt = ( rApplySet.GetItemState( ATTR_SHADOW, TRUE ) != SFX_ITEM_DEFAULT ||
rApplySet.GetItemState( ATTR_CONDITIONAL, TRUE ) != SFX_ITEM_DEFAULT );
BOOL bPaintRows = ( rApplySet.GetItemState( ATTR_HOR_JUSTIFY, TRUE ) != SFX_ITEM_DEFAULT );
USHORT nFlags = SC_PF_TESTMERGE;
if (bPaintExt)
nFlags |= SC_PF_LINES;
if (bPaintRows)
nFlags |= SC_PF_WHOLEROWS;
pDocShell->PostPaint( nCol,nRow,nTab, nCol,nRow,nTab, PAINT_GRID, nFlags );
}
void __EXPORT ScUndoCursorAttr::Undo()
{
BeginUndo();
DoChange(pOldPattern);
if ( bIsAutomatic )
{
// wenn automatische Formatierung rueckgaengig gemacht wird,
// soll auch nicht weiter automatisch formatiert werden:
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
pViewShell->ForgetFormatArea();
}
EndUndo();
}
void __EXPORT ScUndoCursorAttr::Redo()
{
BeginRedo();
DoChange(pNewPattern);
EndRedo();
}
void __EXPORT ScUndoCursorAttr::Repeat(SfxRepeatTarget& rTarget)
{
if (rTarget.ISA(ScTabViewTarget))
((ScTabViewTarget&)rTarget).GetViewShell()->ApplySelectionPattern( *pApplyPattern );
}
BOOL __EXPORT ScUndoCursorAttr::CanRepeat(SfxRepeatTarget& rTarget) const
{
return (rTarget.ISA(ScTabViewTarget));
}
// -----------------------------------------------------------------------
//
// Daten eingeben
//
ScUndoEnterData::ScUndoEnterData( ScDocShell* pNewDocShell,
SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
SCTAB nNewCount, SCTAB* pNewTabs, ScBaseCell** ppOldData,
BOOL* pHasForm, ULONG* pOldForm,
const String& rNewStr, EditTextObject* pObj ) :
ScSimpleUndo( pNewDocShell ),
aNewString( rNewStr ),
pTabs( pNewTabs ),
ppOldCells( ppOldData ),
pHasFormat( pHasForm ),
pOldFormats( pOldForm ),
pNewEditData( pObj ),
nCol( nNewCol ),
nRow( nNewRow ),
nTab( nNewTab ),
nCount( nNewCount )
{
SetChangeTrack();
}
__EXPORT ScUndoEnterData::~ScUndoEnterData()
{
for (USHORT i=0; i<nCount; i++)
if (ppOldCells[i])
ppOldCells[i]->Delete();
delete[] ppOldCells;
delete[] pHasFormat;
delete[] pOldFormats;
delete[] pTabs;
delete pNewEditData;
}
String __EXPORT ScUndoEnterData::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe"
}
void ScUndoEnterData::DoChange() const
{
// Zeilenhoehe anpassen
//! nur wenn noetig (alte oder neue EditZelle, oder Attribute) ??
for (USHORT i=0; i<nCount; i++)
pDocShell->AdjustRowHeight( nRow, nRow, pTabs[i] );
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
{
pViewShell->SetTabNo( nTab );
pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, FALSE, FALSE );
}
pDocShell->PostDataChanged();
}
void ScUndoEnterData::SetChangeTrack()
{
ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
if ( pChangeTrack )
{
nEndChangeAction = pChangeTrack->GetActionMax() + 1;
ScAddress aPos( nCol, nRow, nTab );
for (USHORT i=0; i<nCount; i++)
{
aPos.SetTab( pTabs[i] );
ULONG nFormat = 0;
if ( pHasFormat && pOldFormats )
{
if ( pHasFormat[i] )
nFormat = pOldFormats[i];
}
pChangeTrack->AppendContent( aPos, ppOldCells[i], nFormat );
}
if ( nEndChangeAction > pChangeTrack->GetActionMax() )
nEndChangeAction = 0; // nichts appended
}
else
nEndChangeAction = 0;
}
void __EXPORT ScUndoEnterData::Undo()
{
BeginUndo();
ScDocument* pDoc = pDocShell->GetDocument();
for (USHORT i=0; i<nCount; i++)
{
ScBaseCell* pNewCell = ppOldCells[i] ? ppOldCells[i]->CloneWithoutNote( *pDoc, SC_CLONECELL_STARTLISTENING ) : 0;
pDoc->PutCell( nCol, nRow, pTabs[i], pNewCell );
if (pHasFormat && pOldFormats)
{
if ( pHasFormat[i] )
pDoc->ApplyAttr( nCol, nRow, pTabs[i],
SfxUInt32Item( ATTR_VALUE_FORMAT, pOldFormats[i] ) );
else
{
ScPatternAttr aPattern( *pDoc->GetPattern( nCol, nRow, pTabs[i] ) );
aPattern.GetItemSet().ClearItem( ATTR_VALUE_FORMAT );
pDoc->SetPattern( nCol, nRow, pTabs[i], aPattern, TRUE );
}
}
pDocShell->PostPaintCell( nCol, nRow, pTabs[i] );
}
ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
if ( pChangeTrack && nEndChangeAction >= sal::static_int_cast<ULONG>(nCount) )
pChangeTrack->Undo( nEndChangeAction - nCount + 1, nEndChangeAction );
DoChange();
EndUndo();
// #i97876# Spreadsheet data changes are not notified
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() );
if ( pModelObj && pModelObj->HasChangesListeners() )
{
ScRangeList aChangeRanges;
for ( USHORT i = 0; i < nCount; ++i )
{
aChangeRanges.Append( ScRange( nCol, nRow, pTabs[i] ) );
}
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
}
}
void __EXPORT ScUndoEnterData::Redo()
{
BeginRedo();
ScDocument* pDoc = pDocShell->GetDocument();
for (USHORT i=0; i<nCount; i++)
{
if (pNewEditData)
pDoc->PutCell( nCol, nRow, pTabs[i], new ScEditCell( pNewEditData,
pDoc, NULL ) );
else
pDoc->SetString( nCol, nRow, pTabs[i], aNewString );
pDocShell->PostPaintCell( nCol, nRow, pTabs[i] );
}
SetChangeTrack();
DoChange();
EndRedo();
// #i97876# Spreadsheet data changes are not notified
ScModelObj* pModelObj = ScModelObj::getImplementation( pDocShell->GetModel() );
if ( pModelObj && pModelObj->HasChangesListeners() )
{
ScRangeList aChangeRanges;
for ( USHORT i = 0; i < nCount; ++i )
{
aChangeRanges.Append( ScRange( nCol, nRow, pTabs[i] ) );
}
pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
}
}
void __EXPORT ScUndoEnterData::Repeat(SfxRepeatTarget& rTarget)
{
if (rTarget.ISA(ScTabViewTarget))
{
String aTemp = aNewString;
((ScTabViewTarget&)rTarget).GetViewShell()->EnterDataAtCursor( aTemp );
}
}
BOOL __EXPORT ScUndoEnterData::CanRepeat(SfxRepeatTarget& rTarget) const
{
return (rTarget.ISA(ScTabViewTarget));
}
// -----------------------------------------------------------------------
//
// Wert aendern
//
ScUndoEnterValue::ScUndoEnterValue( ScDocShell* pNewDocShell, const ScAddress& rNewPos,
ScBaseCell* pUndoCell, double nVal, BOOL bHeight ) :
ScSimpleUndo( pNewDocShell ),
aPos ( rNewPos ),
pOldCell ( pUndoCell ),
nValue ( nVal ),
bNeedHeight ( bHeight )
{
SetChangeTrack();
}
__EXPORT ScUndoEnterValue::~ScUndoEnterValue()
{
if (pOldCell)
pOldCell->Delete();
}
String __EXPORT ScUndoEnterValue::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe"
}
void ScUndoEnterValue::SetChangeTrack()
{
ScDocument* pDoc = pDocShell->GetDocument();
ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
if ( pChangeTrack )
{
nEndChangeAction = pChangeTrack->GetActionMax() + 1;
pChangeTrack->AppendContent( aPos, pOldCell );
if ( nEndChangeAction > pChangeTrack->GetActionMax() )
nEndChangeAction = 0; // nichts appended
}
else
nEndChangeAction = 0;
}
void __EXPORT ScUndoEnterValue::Undo()
{
BeginUndo();
ScDocument* pDoc = pDocShell->GetDocument();
ScBaseCell* pNewCell = pOldCell ? pOldCell->CloneWithoutNote( *pDoc, SC_CLONECELL_STARTLISTENING ) : 0;
pDoc->PutCell( aPos, pNewCell );
pDocShell->PostPaintCell( aPos );
ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
if ( pChangeTrack )
pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
EndUndo();
}
void __EXPORT ScUndoEnterValue::Redo()
{
BeginRedo();
ScDocument* pDoc = pDocShell->GetDocument();
pDoc->SetValue( aPos.Col(), aPos.Row(), aPos.Tab(), nValue );
pDocShell->PostPaintCell( aPos );
SetChangeTrack();
EndRedo();
}
void __EXPORT ScUndoEnterValue::Repeat(SfxRepeatTarget& /* rTarget */)
{
// gippsnich
}
BOOL __EXPORT ScUndoEnterValue::CanRepeat(SfxRepeatTarget& /* rTarget */) const
{
return FALSE;
}
// -----------------------------------------------------------------------
//
// Beliebige Zelle eingeben
//
ScUndoPutCell::ScUndoPutCell( ScDocShell* pNewDocShell, const ScAddress& rNewPos,
ScBaseCell* pUndoCell, ScBaseCell* pRedoCell, BOOL bHeight ) :
ScSimpleUndo( pNewDocShell ),
aPos ( rNewPos ),
pOldCell ( pUndoCell ),
pEnteredCell( pRedoCell ),
bNeedHeight ( bHeight )
{
SetChangeTrack();
}
__EXPORT ScUndoPutCell::~ScUndoPutCell()
{
if (pOldCell)
pOldCell->Delete();
if (pEnteredCell)
pEnteredCell->Delete();
}
String __EXPORT ScUndoPutCell::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_ENTERDATA ); // "Eingabe"
}
void ScUndoPutCell::SetChangeTrack()
{
ScDocument* pDoc = pDocShell->GetDocument();
ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
if ( pChangeTrack )
{
nEndChangeAction = pChangeTrack->GetActionMax() + 1;
pChangeTrack->AppendContent( aPos, pOldCell );
if ( nEndChangeAction > pChangeTrack->GetActionMax() )
nEndChangeAction = 0; // nichts appended
}
else
nEndChangeAction = 0;
}
void __EXPORT ScUndoPutCell::Undo()
{
BeginUndo();
ScDocument* pDoc = pDocShell->GetDocument();
ScBaseCell* pNewCell = pOldCell ? pOldCell->CloneWithoutNote( *pDoc, aPos, SC_CLONECELL_STARTLISTENING ) : 0;
pDoc->PutCell( aPos.Col(), aPos.Row(), aPos.Tab(), pNewCell );
pDocShell->PostPaintCell( aPos );
ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
if ( pChangeTrack )
pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
EndUndo();
}
void __EXPORT ScUndoPutCell::Redo()
{
BeginRedo();
ScDocument* pDoc = pDocShell->GetDocument();
ScBaseCell* pNewCell = pEnteredCell ? pEnteredCell->CloneWithoutNote( *pDoc, aPos, SC_CLONECELL_STARTLISTENING ) : 0;
pDoc->PutCell( aPos.Col(), aPos.Row(), aPos.Tab(), pNewCell );
pDocShell->PostPaintCell( aPos );
SetChangeTrack();
EndRedo();
}
void __EXPORT ScUndoPutCell::Repeat(SfxRepeatTarget& /* rTarget */)
{
// gippsnich
}
BOOL __EXPORT ScUndoPutCell::CanRepeat(SfxRepeatTarget& /* rTarget */) const
{
return FALSE;
}
// -----------------------------------------------------------------------
//
// Seitenumbrueche
//
ScUndoPageBreak::ScUndoPageBreak( ScDocShell* pNewDocShell,
SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
BOOL bNewColumn, BOOL bNewInsert ) :
ScSimpleUndo( pNewDocShell ),
nCol( nNewCol ),
nRow( nNewRow ),
nTab( nNewTab ),
bColumn( bNewColumn ),
bInsert( bNewInsert )
{
}
__EXPORT ScUndoPageBreak::~ScUndoPageBreak()
{
}
String __EXPORT ScUndoPageBreak::GetComment() const
{
//"Spaltenumbruch" | "Zeilenumbruch" "einfuegen" | "loeschen"
return String ( bColumn ?
( bInsert ?
ScGlobal::GetRscString( STR_UNDO_INSCOLBREAK ) :
ScGlobal::GetRscString( STR_UNDO_DELCOLBREAK )
) :
( bInsert ?
ScGlobal::GetRscString( STR_UNDO_INSROWBREAK ) :
ScGlobal::GetRscString( STR_UNDO_DELROWBREAK )
) );
}
void ScUndoPageBreak::DoChange( BOOL bInsertP ) const
{
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
{
pViewShell->SetTabNo( nTab );
pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, FALSE, FALSE );
if (bInsertP)
pViewShell->InsertPageBreak(bColumn, FALSE);
else
pViewShell->DeletePageBreak(bColumn, FALSE);
}
}
void __EXPORT ScUndoPageBreak::Undo()
{
BeginUndo();
DoChange(!bInsert);
EndUndo();
}
void __EXPORT ScUndoPageBreak::Redo()
{
BeginRedo();
DoChange(bInsert);
EndRedo();
}
void __EXPORT ScUndoPageBreak::Repeat(SfxRepeatTarget& rTarget)
{
if (rTarget.ISA(ScTabViewTarget))
{
ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
if (bInsert)
rViewShell.InsertPageBreak(bColumn, TRUE);
else
rViewShell.DeletePageBreak(bColumn, TRUE);
}
}
BOOL __EXPORT ScUndoPageBreak::CanRepeat(SfxRepeatTarget& rTarget) const
{
return (rTarget.ISA(ScTabViewTarget));
}
// -----------------------------------------------------------------------
//
// Druck-Skalierung
//
ScUndoPrintZoom::ScUndoPrintZoom( ScDocShell* pNewDocShell,
SCTAB nT, USHORT nOS, USHORT nOP, USHORT nNS, USHORT nNP ) :
ScSimpleUndo( pNewDocShell ),
nTab( nT ),
nOldScale( nOS ),
nOldPages( nOP ),
nNewScale( nNS ),
nNewPages( nNP )
{
}
__EXPORT ScUndoPrintZoom::~ScUndoPrintZoom()
{
}
String __EXPORT ScUndoPrintZoom::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_PRINTSCALE );
}
void ScUndoPrintZoom::DoChange( BOOL bUndo )
{
USHORT nScale = bUndo ? nOldScale : nNewScale;
USHORT nPages = bUndo ? nOldPages : nNewPages;
ScDocument* pDoc = pDocShell->GetDocument();
String aStyleName = pDoc->GetPageStyle( nTab );
ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found" );
if ( pStyleSheet )
{
SfxItemSet& rSet = pStyleSheet->GetItemSet();
rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALE, nScale ) );
rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, nPages ) );
ScPrintFunc aPrintFunc( pDocShell, pDocShell->GetPrinter(), nTab );
aPrintFunc.UpdatePages();
}
}
void __EXPORT ScUndoPrintZoom::Undo()
{
BeginUndo();
DoChange(TRUE);
EndUndo();
}
void __EXPORT ScUndoPrintZoom::Redo()
{
BeginRedo();
DoChange(FALSE);
EndRedo();
}
void __EXPORT ScUndoPrintZoom::Repeat(SfxRepeatTarget& rTarget)
{
if (rTarget.ISA(ScTabViewTarget))
{
ScTabViewShell& rViewShell = *((ScTabViewTarget&)rTarget).GetViewShell();
ScViewData* pViewData = rViewShell.GetViewData();
pViewData->GetDocShell()->SetPrintZoom( pViewData->GetTabNo(), nNewScale, nNewPages );
}
}
BOOL __EXPORT ScUndoPrintZoom::CanRepeat(SfxRepeatTarget& rTarget) const
{
return (rTarget.ISA(ScTabViewTarget));
}
// -----------------------------------------------------------------------
//
// Thesaurus
//
ScUndoThesaurus::ScUndoThesaurus( ScDocShell* pNewDocShell,
SCCOL nNewCol, SCROW nNewRow, SCTAB nNewTab,
const String& rNewUndoStr, const EditTextObject* pUndoTObj,
const String& rNewRedoStr, const EditTextObject* pRedoTObj) :
ScSimpleUndo( pNewDocShell ),
nCol( nNewCol ),
nRow( nNewRow ),
nTab( nNewTab ),
aUndoStr( rNewUndoStr ),
aRedoStr( rNewRedoStr )
{
pUndoTObject = (pUndoTObj) ? pUndoTObj->Clone() : NULL;
pRedoTObject = (pRedoTObj) ? pRedoTObj->Clone() : NULL;
ScBaseCell* pOldCell;
if ( pUndoTObject )
pOldCell = new ScEditCell( pUndoTObject, pDocShell->GetDocument(), NULL );
else
pOldCell = new ScStringCell( aUndoStr );
SetChangeTrack( pOldCell );
pOldCell->Delete();
}
__EXPORT ScUndoThesaurus::~ScUndoThesaurus()
{
delete pUndoTObject;
delete pRedoTObject;
}
String __EXPORT ScUndoThesaurus::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_THESAURUS ); // "Thesaurus"
}
void ScUndoThesaurus::SetChangeTrack( ScBaseCell* pOldCell )
{
ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
if ( pChangeTrack )
{
nEndChangeAction = pChangeTrack->GetActionMax() + 1;
pChangeTrack->AppendContent( ScAddress( nCol, nRow, nTab ), pOldCell );
if ( nEndChangeAction > pChangeTrack->GetActionMax() )
nEndChangeAction = 0; // nichts appended
}
else
nEndChangeAction = 0;
}
void __EXPORT ScUndoThesaurus::DoChange( BOOL bUndo, const String& rStr,
const EditTextObject* pTObj )
{
ScDocument* pDoc = pDocShell->GetDocument();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
{
pViewShell->SetTabNo( nTab );
pViewShell->MoveCursorAbs( nCol, nRow, SC_FOLLOW_JUMP, FALSE, FALSE );
}
if (pTObj)
{
ScBaseCell* pCell;
pDoc->GetCell( nCol, nRow, nTab, pCell );
if (pCell)
{
if (pCell->GetCellType() == CELLTYPE_EDIT )
{
ScEditCell* pNewCell = new ScEditCell( pTObj, pDoc, NULL );
pDoc->PutCell( nCol, nRow, nTab, pNewCell );
if ( !bUndo )
SetChangeTrack( pCell );
}
else
{
DBG_ERROR("Nicht CELLTYPE_EDIT bei Un/RedoThesaurus");
}
}
}
else
{
ScBaseCell* pCell = NULL;
if ( !bUndo )
pDoc->GetCell( nCol, nRow, nTab, pCell );
pDoc->SetString( nCol, nRow, nTab, rStr );
if ( !bUndo )
SetChangeTrack( pCell );
}
pDocShell->PostPaintCell( nCol, nRow, nTab );
}
void __EXPORT ScUndoThesaurus::Undo()
{
BeginUndo();
DoChange( TRUE, aUndoStr, pUndoTObject );
ScChangeTrack* pChangeTrack = pDocShell->GetDocument()->GetChangeTrack();
if ( pChangeTrack )
pChangeTrack->Undo( nEndChangeAction, nEndChangeAction );
EndUndo();
}
void __EXPORT ScUndoThesaurus::Redo()
{
BeginRedo();
DoChange( FALSE, aRedoStr, pRedoTObject );
EndRedo();
}
void __EXPORT ScUndoThesaurus::Repeat(SfxRepeatTarget& rTarget)
{
if (rTarget.ISA(ScTabViewTarget))
((ScTabViewTarget&)rTarget).GetViewShell()->DoThesaurus( TRUE );
}
BOOL __EXPORT ScUndoThesaurus::CanRepeat(SfxRepeatTarget& rTarget) const
{
return (rTarget.ISA(ScTabViewTarget));
}
// ============================================================================
ScUndoReplaceNote::ScUndoReplaceNote( ScDocShell& rDocShell, const ScAddress& rPos,
const ScNoteData& rNoteData, bool bInsert, SdrUndoAction* pDrawUndo ) :
ScSimpleUndo( &rDocShell ),
maPos( rPos ),
mpDrawUndo( pDrawUndo )
{
DBG_ASSERT( rNoteData.mpCaption, "ScUndoReplaceNote::ScUndoReplaceNote - missing note caption" );
(bInsert ? maNewData : maOldData) = rNoteData;
}
ScUndoReplaceNote::ScUndoReplaceNote( ScDocShell& rDocShell, const ScAddress& rPos,
const ScNoteData& rOldData, const ScNoteData& rNewData, SdrUndoAction* pDrawUndo ) :
ScSimpleUndo( &rDocShell ),
maPos( rPos ),
maOldData( rOldData ),
maNewData( rNewData ),
mpDrawUndo( pDrawUndo )
{
DBG_ASSERT( maOldData.mpCaption || maNewData.mpCaption, "ScUndoReplaceNote::ScUndoReplaceNote - missing note captions" );
DBG_ASSERT( !maOldData.mxInitData.get() && !maNewData.mxInitData.get(), "ScUndoReplaceNote::ScUndoReplaceNote - unexpected unitialized note" );
}
ScUndoReplaceNote::~ScUndoReplaceNote()
{
DeleteSdrUndoAction( mpDrawUndo );
}
void ScUndoReplaceNote::Undo()
{
BeginUndo();
DoSdrUndoAction( mpDrawUndo, pDocShell->GetDocument() );
/* Undo insert -> remove new note.
Undo remove -> insert old note.
Undo replace -> remove new note, insert old note. */
DoRemoveNote( maNewData );
DoInsertNote( maOldData );
pDocShell->PostPaintCell( maPos );
EndUndo();
}
void ScUndoReplaceNote::Redo()
{
BeginRedo();
RedoSdrUndoAction( mpDrawUndo );
/* Redo insert -> insert new note.
Redo remove -> remove old note.
Redo replace -> remove old note, insert new note. */
DoRemoveNote( maOldData );
DoInsertNote( maNewData );
pDocShell->PostPaintCell( maPos );
EndRedo();
}
void ScUndoReplaceNote::Repeat( SfxRepeatTarget& /*rTarget*/ )
{
}
BOOL ScUndoReplaceNote::CanRepeat( SfxRepeatTarget& /*rTarget*/ ) const
{
return FALSE;
}
String ScUndoReplaceNote::GetComment() const
{
return ScGlobal::GetRscString( maNewData.mpCaption ?
(maOldData.mpCaption ? STR_UNDO_EDITNOTE : STR_UNDO_INSERTNOTE) : STR_UNDO_DELETENOTE );
}
void ScUndoReplaceNote::DoInsertNote( const ScNoteData& rNoteData )
{
if( rNoteData.mpCaption )
{
ScDocument& rDoc = *pDocShell->GetDocument();
DBG_ASSERT( !rDoc.GetNote( maPos ), "ScUndoReplaceNote::DoInsertNote - unexpected cell note" );
ScPostIt* pNote = new ScPostIt( rDoc, maPos, rNoteData, false );
rDoc.TakeNote( maPos, pNote );
}
}
void ScUndoReplaceNote::DoRemoveNote( const ScNoteData& rNoteData )
{
if( rNoteData.mpCaption )
{
ScDocument& rDoc = *pDocShell->GetDocument();
DBG_ASSERT( rDoc.GetNote( maPos ), "ScUndoReplaceNote::DoRemoveNote - missing cell note" );
if( ScPostIt* pNote = rDoc.ReleaseNote( maPos ) )
{
/* Forget pointer to caption object to suppress removing the
caption object from the drawing layer while deleting pNote
(removing the caption is done by a drawing undo action). */
pNote->ForgetCaption();
delete pNote;
}
}
}
// ============================================================================
ScUndoShowHideNote::ScUndoShowHideNote( ScDocShell& rDocShell, const ScAddress& rPos, bool bShow ) :
ScSimpleUndo( &rDocShell ),
maPos( rPos ),
mbShown( bShow )
{
}
ScUndoShowHideNote::~ScUndoShowHideNote()
{
}
void ScUndoShowHideNote::Undo()
{
BeginUndo();
if( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( maPos ) )
pNote->ShowCaption( maPos, !mbShown );
EndUndo();
}
void ScUndoShowHideNote::Redo()
{
BeginRedo();
if( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( maPos ) )
pNote->ShowCaption( maPos, mbShown );
EndRedo();
}
void ScUndoShowHideNote::Repeat( SfxRepeatTarget& /*rTarget*/ )
{
}
BOOL ScUndoShowHideNote::CanRepeat( SfxRepeatTarget& /*rTarget*/ ) const
{
return FALSE;
}
String ScUndoShowHideNote::GetComment() const
{
return ScGlobal::GetRscString( mbShown ? STR_UNDO_SHOWNOTE : STR_UNDO_HIDENOTE );
}
// ============================================================================
// -----------------------------------------------------------------------
//
// Detektiv
//
ScUndoDetective::ScUndoDetective( ScDocShell* pNewDocShell,
SdrUndoAction* pDraw, const ScDetOpData* pOperation,
ScDetOpList* pUndoList ) :
ScSimpleUndo( pNewDocShell ),
pOldList ( pUndoList ),
nAction ( 0 ),
pDrawUndo ( pDraw )
{
bIsDelete = ( pOperation == NULL );
if (!bIsDelete)
{
nAction = (USHORT) pOperation->GetOperation();
aPos = pOperation->GetPos();
}
}
__EXPORT ScUndoDetective::~ScUndoDetective()
{
DeleteSdrUndoAction( pDrawUndo );
delete pOldList;
}
String __EXPORT ScUndoDetective::GetComment() const
{
USHORT nId = STR_UNDO_DETDELALL;
if ( !bIsDelete )
switch ( (ScDetOpType) nAction )
{
case SCDETOP_ADDSUCC: nId = STR_UNDO_DETADDSUCC; break;
case SCDETOP_DELSUCC: nId = STR_UNDO_DETDELSUCC; break;
case SCDETOP_ADDPRED: nId = STR_UNDO_DETADDPRED; break;
case SCDETOP_DELPRED: nId = STR_UNDO_DETDELPRED; break;
case SCDETOP_ADDERROR: nId = STR_UNDO_DETADDERROR; break;
}
return ScGlobal::GetRscString( nId );
}
void __EXPORT ScUndoDetective::Undo()
{
BeginUndo();
ScDocument* pDoc = pDocShell->GetDocument();
DoSdrUndoAction(pDrawUndo, pDoc);
if (bIsDelete)
{
if ( pOldList )
pDoc->SetDetOpList( new ScDetOpList(*pOldList) );
}
else
{
// Eintrag aus der Liste loeschen
ScDetOpList* pList = pDoc->GetDetOpList();
if (pList && pList->Count())
{
USHORT nPos = pList->Count() - 1;
ScDetOpData* pData = (*pList)[nPos];
if ( pData->GetOperation() == (ScDetOpType) nAction && pData->GetPos() == aPos )
pList->DeleteAndDestroy( nPos, 1 );
else
{
DBG_ERROR("Detektiv-Eintrag in der Liste nicht gefunden");
}
}
}
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
pViewShell->RecalcPPT(); //! use broadcast instead?
EndUndo();
}
void __EXPORT ScUndoDetective::Redo()
{
BeginRedo();
RedoSdrUndoAction(pDrawUndo);
ScDocument* pDoc = pDocShell->GetDocument();
if (bIsDelete)
pDoc->ClearDetectiveOperations();
else
pDoc->AddDetectiveOperation( ScDetOpData( aPos, (ScDetOpType) nAction ) );
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
pViewShell->RecalcPPT(); //! use broadcast instead?
EndRedo();
}
void __EXPORT ScUndoDetective::Repeat(SfxRepeatTarget& /* rTarget */)
{
// hammanich
}
BOOL __EXPORT ScUndoDetective::CanRepeat(SfxRepeatTarget& /* rTarget */) const
{
return FALSE;
}
// -----------------------------------------------------------------------
//
// Benannte Bereiche
//
ScUndoRangeNames::ScUndoRangeNames( ScDocShell* pNewDocShell,
ScRangeName* pOld, ScRangeName* pNew ) :
ScSimpleUndo( pNewDocShell ),
pOldRanges ( pOld ),
pNewRanges ( pNew )
{
}
__EXPORT ScUndoRangeNames::~ScUndoRangeNames()
{
delete pOldRanges;
delete pNewRanges;
}
String __EXPORT ScUndoRangeNames::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_RANGENAMES );
}
void ScUndoRangeNames::DoChange( BOOL bUndo )
{
ScDocument* pDoc = pDocShell->GetDocument();
pDoc->CompileNameFormula( TRUE ); // CreateFormulaString
if ( bUndo )
pDoc->SetRangeName( new ScRangeName( *pOldRanges ) );
else
pDoc->SetRangeName( new ScRangeName( *pNewRanges ) );
pDoc->CompileNameFormula( FALSE ); // CompileFormulaString
SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
}
void __EXPORT ScUndoRangeNames::Undo()
{
BeginUndo();
DoChange( TRUE );
EndUndo();
}
void __EXPORT ScUndoRangeNames::Redo()
{
BeginRedo();
DoChange( FALSE );
EndRedo();
}
void __EXPORT ScUndoRangeNames::Repeat(SfxRepeatTarget& /* rTarget */)
{
// hammanich
}
BOOL __EXPORT ScUndoRangeNames::CanRepeat(SfxRepeatTarget& /* rTarget */) const
{
return FALSE;
}