Files
libreoffice/sc/source/ui/undo/undodat.cxx

2002 lines
60 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes: Patches contributed by Herbert Duerr i#118735 prevent endless loop if vlookup/hlookup doesn't find anything http://svn.apache.org/viewvc?view=revision&revision=1239673 Patches contributed by Andre Fischer remove lp_solver http://svn.apache.org/viewvc?view=revision&revision=1199180 i#118160: Added external CoinMP library. http://svn.apache.org/viewvc?view=revision&revision=1233909 Patches contributed by Armin Le-Grand i#118485 - Styles for OLEs are not saved. http://svn.apache.org/viewvc?view=revision&revision=1182166 i#118524: apply patch, followup fixes to 118485 http://svn.apache.org/viewvc?view=revision&revision=1186077 Patches contributed by lihuiibm i#108860 - Fix range validation. http://svn.apache.org/viewvc?view=revision&revision=1242846 i#118954 Chart data will lost after copy to different file http://svn.apache.org/viewvc?view=revision&revision=1301345 Patches contributed by Ariel Constenla-Haile Fix Linux build breaker: extra qualification on member http://svn.apache.org/viewvc?view=revision&revision=1301591 i#118696 - i#118697 - Fix some Sheet Tab Color API issues http://svn.apache.org/viewvc?view=revision&revision=1225428 i#118697 - Fix uninitialized variable http://svn.apache.org/viewvc?view=revision&revision=1225859 i#118771 - ScUndoImportTab should preserve tab background color http://svn.apache.org/viewvc?view=revision&revision=1230356 i#118921 - Repaint linked sheet tab background color after updating link http://svn.apache.org/viewvc?view=revision&revision=1245177 i#118927 - Undo/Redo "Update Link" does not reset sheet tab color http://svn.apache.org/viewvc?view=revision&revision=1245241 i#118747 - Copy tab color when transferring sheets across documents http://svn.apache.org/viewvc?view=revision&revision=1230355 Patch contributed by Oliver Rainer-Wittman i#118012 - methods <ScBroadcastAreaSlot::AreaBroadcast(..)> and <ScBroadcastAreaSlot::AreaBroadcastInRange(..)> adapt stl-container iteration in order to avoid destroyed iterators during iteration. http://svn.apache.org/viewvc?view=revision&revision=1297916 Patches contributed by Mathias Bauer gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 http://svn.apache.org/viewvc?view=revision&revision=1396797 http://svn.apache.org/viewvc?view=revision&revision=1397315 Patch contributed by Daniel Rentz calc69: #i116936# fix VBA symbol Cells http://svn.apache.org/viewvc?view=revision&revision=1172135 Patches contributed by leiw: i#118546 CPU 100% on switched off AutoCalculate with Conditional Formatting on date values http://svn.apache.org/viewvc?view=revision&revision=1301380 Re-add new function documentation. Many various cleanups. Add missing calc66: #o11817313# also look at formula result number format, remove redundant binaries.
2012-11-30 12:23:25 +00:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
2000-09-18 16:07:07 +00:00
#include <sfx2/app.hxx>
#include "undodat.hxx"
#include "undoutil.hxx"
#include "undoolk.hxx"
2000-09-18 16:07:07 +00:00
#include "document.hxx"
#include "docsh.hxx"
#include "tabvwsh.hxx"
#include "olinetab.hxx"
#include "dbdata.hxx"
2000-09-18 16:07:07 +00:00
#include "rangenam.hxx"
#include "pivot.hxx"
#include "globstr.hrc"
#include "global.hxx"
#include "globalnames.hxx"
2000-09-18 16:07:07 +00:00
#include "target.hxx"
#include "chartarr.hxx"
#include "dbdocfun.hxx"
#include "olinefun.hxx"
#include "dpobject.hxx"
#include "attrib.hxx"
#include "hints.hxx"
2000-09-18 16:07:07 +00:00
#include "sc.hrc"
#include "chgtrack.hxx"
#include "refundo.hxx"
#include "markdata.hxx"
2000-09-18 16:07:07 +00:00
TYPEINIT1(ScUndoDoOutline, ScSimpleUndo);
TYPEINIT1(ScUndoMakeOutline, ScSimpleUndo);
TYPEINIT1(ScUndoOutlineLevel, ScSimpleUndo);
TYPEINIT1(ScUndoOutlineBlock, ScSimpleUndo);
TYPEINIT1(ScUndoRemoveAllOutlines, ScSimpleUndo);
TYPEINIT1(ScUndoAutoOutline, ScSimpleUndo);
TYPEINIT1(ScUndoSubTotals, ScDBFuncUndo);
TYPEINIT1(ScUndoQuery, ScDBFuncUndo);
TYPEINIT1(ScUndoAutoFilter, ScDBFuncUndo);
TYPEINIT1(ScUndoDBData, ScSimpleUndo);
TYPEINIT1(ScUndoImportData, ScSimpleUndo);
TYPEINIT1(ScUndoRepeatDB, ScSimpleUndo);
TYPEINIT1(ScUndoDataPilot, ScSimpleUndo);
TYPEINIT1(ScUndoConsolidate, ScSimpleUndo);
TYPEINIT1(ScUndoChartData, ScSimpleUndo);
TYPEINIT1(ScUndoDataForm, SfxUndoAction);
2000-09-18 16:07:07 +00:00
// Show or hide outline groups
2000-09-18 16:07:07 +00:00
ScUndoDoOutline::ScUndoDoOutline( ScDocShell* pNewDocShell,
SCCOLROW nNewStart, SCCOLROW nNewEnd, SCTAB nNewTab,
ScDocument* pNewUndoDoc, bool bNewColumns,
sal_uInt16 nNewLevel, sal_uInt16 nNewEntry, bool bNewShow ) :
2000-09-18 16:07:07 +00:00
ScSimpleUndo( pNewDocShell ),
nStart( nNewStart ),
nEnd( nNewEnd ),
nTab( nNewTab ),
pUndoDoc( pNewUndoDoc ),
bColumns( bNewColumns ),
nLevel( nNewLevel ),
nEntry( nNewEntry ),
bShow( bNewShow )
{
}
2010-12-11 23:25:30 +01:00
ScUndoDoOutline::~ScUndoDoOutline()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
}
OUString ScUndoDoOutline::GetComment() const
{ // Show outline" "Hide outline"
2000-09-18 16:07:07 +00:00
return bShow ?
ScGlobal::GetRscString( STR_UNDO_DOOUTLINE ) :
ScGlobal::GetRscString( STR_UNDO_REDOOUTLINE );
}
2010-12-11 23:25:30 +01:00
void ScUndoDoOutline::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
// sheet has to be switched over (#46952#)!
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
// perform the inverse function
2000-09-18 16:07:07 +00:00
if (bShow)
pViewShell->HideOutline( bColumns, nLevel, nEntry, false, false );
2000-09-18 16:07:07 +00:00
else
pViewShell->ShowOutline( bColumns, nLevel, nEntry, false, false );
2000-09-18 16:07:07 +00:00
// Original column/row status
2000-09-18 16:07:07 +00:00
if (bColumns)
pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, false, &rDoc);
2000-09-18 16:07:07 +00:00
else
pUndoDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
pViewShell->UpdateScrollBars();
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP);
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoDoOutline::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
// sheet has to be switched over (#46952#)!
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
if (bShow)
pViewShell->ShowOutline( bColumns, nLevel, nEntry, false );
2000-09-18 16:07:07 +00:00
else
pViewShell->HideOutline( bColumns, nLevel, nEntry, false );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoDoOutline::Repeat(SfxRepeatTarget& /* rTarget */)
2000-09-18 16:07:07 +00:00
{
}
bool ScUndoDoOutline::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2000-09-18 16:07:07 +00:00
{
return false; // is not possible
2000-09-18 16:07:07 +00:00
}
/** Make or delete outline groups */
2000-09-18 16:07:07 +00:00
ScUndoMakeOutline::ScUndoMakeOutline( ScDocShell* pNewDocShell,
SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
ScOutlineTable* pNewUndoTab, bool bNewColumns, bool bNewMake ) :
2000-09-18 16:07:07 +00:00
ScSimpleUndo( pNewDocShell ),
aBlockStart( nStartX, nStartY, nStartZ ),
aBlockEnd( nEndX, nEndY, nEndZ ),
pUndoTable( pNewUndoTab ),
bColumns( bNewColumns ),
bMake( bNewMake )
{
}
2010-12-11 23:25:30 +01:00
ScUndoMakeOutline::~ScUndoMakeOutline()
2000-09-18 16:07:07 +00:00
{
delete pUndoTable;
}
OUString ScUndoMakeOutline::GetComment() const
{ // "Grouping" "Undo grouping"
2000-09-18 16:07:07 +00:00
return bMake ?
ScGlobal::GetRscString( STR_UNDO_MAKEOUTLINE ) :
ScGlobal::GetRscString( STR_UNDO_REMAKEOUTLINE );
}
2010-12-11 23:25:30 +01:00
void ScUndoMakeOutline::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTab = aBlockStart.Tab();
2000-09-18 16:07:07 +00:00
ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart, aBlockEnd );
rDoc.SetOutlineTable( nTab, pUndoTable );
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoMakeOutline::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart, aBlockEnd );
if (bMake)
pViewShell->MakeOutline( bColumns, false );
2000-09-18 16:07:07 +00:00
else
pViewShell->RemoveOutline( bColumns, false );
2000-09-18 16:07:07 +00:00
pDocShell->PostPaint(0,0,aBlockStart.Tab(),MAXCOL,MAXROW,aBlockEnd.Tab(),PAINT_GRID);
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoMakeOutline::Repeat(SfxRepeatTarget& rTarget)
2000-09-18 16:07:07 +00:00
{
if (rTarget.ISA(ScTabViewTarget))
{
ScTabViewShell& rViewShell = *static_cast<ScTabViewTarget&>(rTarget).GetViewShell();
2000-09-18 16:07:07 +00:00
if (bMake)
rViewShell.MakeOutline( bColumns, true );
2000-09-18 16:07:07 +00:00
else
rViewShell.RemoveOutline( bColumns, true );
2000-09-18 16:07:07 +00:00
}
}
bool ScUndoMakeOutline::CanRepeat(SfxRepeatTarget& rTarget) const
2000-09-18 16:07:07 +00:00
{
return rTarget.ISA(ScTabViewTarget);
2000-09-18 16:07:07 +00:00
}
ScUndoOutlineLevel::ScUndoOutlineLevel( ScDocShell* pNewDocShell,
SCCOLROW nNewStart, SCCOLROW nNewEnd, SCTAB nNewTab,
2000-09-18 16:07:07 +00:00
ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab,
bool bNewColumns, sal_uInt16 nNewLevel ) :
2000-09-18 16:07:07 +00:00
ScSimpleUndo( pNewDocShell ),
nStart( nNewStart ),
nEnd( nNewEnd ),
nTab( nNewTab ),
pUndoDoc( pNewUndoDoc ),
pUndoTable( pNewUndoTab ),
bColumns( bNewColumns ),
nLevel( nNewLevel )
{
}
2010-12-11 23:25:30 +01:00
ScUndoOutlineLevel::~ScUndoOutlineLevel()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoTable;
}
OUString ScUndoOutlineLevel::GetComment() const
{ // "Select outline level"
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_OUTLINELEVEL );
}
2010-12-11 23:25:30 +01:00
void ScUndoOutlineLevel::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
// Original Outline table
2000-09-18 16:07:07 +00:00
rDoc.SetOutlineTable( nTab, pUndoTable );
2000-09-18 16:07:07 +00:00
// Original column/row status
2000-09-18 16:07:07 +00:00
if (bColumns)
pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStart), 0, nTab,
static_cast<SCCOL>(nEnd), MAXROW, nTab, IDF_NONE, false, &rDoc);
2000-09-18 16:07:07 +00:00
else
pUndoDoc->CopyToDocument( 0, nStart, nTab, MAXCOL, nEnd, nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
rDoc.UpdatePageBreaks( nTab );
2000-09-18 16:07:07 +00:00
pViewShell->UpdateScrollBars();
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP);
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoOutlineLevel::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
// sheet has to be switched on or off before this (#46952#) !!!
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pViewShell->SelectLevel( bColumns, nLevel, false );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoOutlineLevel::Repeat(SfxRepeatTarget& rTarget)
2000-09-18 16:07:07 +00:00
{
if (rTarget.ISA(ScTabViewTarget))
static_cast<ScTabViewTarget&>(rTarget).GetViewShell()->SelectLevel( bColumns, nLevel, true );
2000-09-18 16:07:07 +00:00
}
bool ScUndoOutlineLevel::CanRepeat(SfxRepeatTarget& rTarget) const
2000-09-18 16:07:07 +00:00
{
return rTarget.ISA(ScTabViewTarget);
2000-09-18 16:07:07 +00:00
}
/** show/hide outline over block marks */
2000-09-18 16:07:07 +00:00
ScUndoOutlineBlock::ScUndoOutlineBlock( ScDocShell* pNewDocShell,
SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab, bool bNewShow ) :
2000-09-18 16:07:07 +00:00
ScSimpleUndo( pNewDocShell ),
aBlockStart( nStartX, nStartY, nStartZ ),
aBlockEnd( nEndX, nEndY, nEndZ ),
pUndoDoc( pNewUndoDoc ),
pUndoTable( pNewUndoTab ),
bShow( bNewShow )
{
}
2010-12-11 23:25:30 +01:00
ScUndoOutlineBlock::~ScUndoOutlineBlock()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoTable;
}
OUString ScUndoOutlineBlock::GetComment() const
{ // "Show outline" "Hide outline"
2000-09-18 16:07:07 +00:00
return bShow ?
ScGlobal::GetRscString( STR_UNDO_DOOUTLINEBLK ) :
ScGlobal::GetRscString( STR_UNDO_REDOOUTLINEBLK );
}
2010-12-11 23:25:30 +01:00
void ScUndoOutlineBlock::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTab = aBlockStart.Tab();
2000-09-18 16:07:07 +00:00
// Original Outline table
rDoc.SetOutlineTable( nTab, pUndoTable );
2000-09-18 16:07:07 +00:00
// Original column/row status
SCCOLROW nStartCol = aBlockStart.Col();
SCCOLROW nEndCol = aBlockEnd.Col();
SCCOLROW nStartRow = aBlockStart.Row();
SCCOLROW nEndRow = aBlockEnd.Row();
2000-09-18 16:07:07 +00:00
if (!bShow)
{ // Size of the hidden blocks
size_t nLevel;
pUndoTable->GetColArray().FindTouchedLevel( nStartCol, nEndCol, nLevel );
pUndoTable->GetColArray().ExtendBlock( nLevel, nStartCol, nEndCol );
pUndoTable->GetRowArray().FindTouchedLevel( nStartRow, nEndRow, nLevel );
pUndoTable->GetRowArray().ExtendBlock( nLevel, nStartRow, nEndRow );
2000-09-18 16:07:07 +00:00
}
pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false, &rDoc );
pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
rDoc.UpdatePageBreaks( nTab );
2000-09-18 16:07:07 +00:00
pViewShell->UpdateScrollBars();
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP);
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoOutlineBlock::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart, aBlockEnd );
if (bShow)
pViewShell->ShowMarkedOutlines( false );
2000-09-18 16:07:07 +00:00
else
pViewShell->HideMarkedOutlines( false );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoOutlineBlock::Repeat(SfxRepeatTarget& rTarget)
2000-09-18 16:07:07 +00:00
{
if (rTarget.ISA(ScTabViewTarget))
{
ScTabViewShell& rViewShell = *static_cast<ScTabViewTarget&>(rTarget).GetViewShell();
2000-09-18 16:07:07 +00:00
if (bShow)
rViewShell.ShowMarkedOutlines( true );
2000-09-18 16:07:07 +00:00
else
rViewShell.HideMarkedOutlines( true );
2000-09-18 16:07:07 +00:00
}
}
bool ScUndoOutlineBlock::CanRepeat(SfxRepeatTarget& rTarget) const
2000-09-18 16:07:07 +00:00
{
return rTarget.ISA(ScTabViewTarget);
2000-09-18 16:07:07 +00:00
}
ScUndoRemoveAllOutlines::ScUndoRemoveAllOutlines( ScDocShell* pNewDocShell,
SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
2000-09-18 16:07:07 +00:00
ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab ) :
ScSimpleUndo( pNewDocShell ),
aBlockStart( nStartX, nStartY, nStartZ ),
aBlockEnd( nEndX, nEndY, nEndZ ),
pUndoDoc( pNewUndoDoc ),
pUndoTable( pNewUndoTab )
{
}
2010-12-11 23:25:30 +01:00
ScUndoRemoveAllOutlines::~ScUndoRemoveAllOutlines()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoTable;
}
OUString ScUndoRemoveAllOutlines::GetComment() const
{ // "Remove outlines"
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_REMOVEALLOTLNS );
}
2010-12-11 23:25:30 +01:00
void ScUndoRemoveAllOutlines::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTab = aBlockStart.Tab();
2000-09-18 16:07:07 +00:00
// Original Outline table
rDoc.SetOutlineTable( nTab, pUndoTable );
2000-09-18 16:07:07 +00:00
// Original column/row status
SCCOL nStartCol = aBlockStart.Col();
SCCOL nEndCol = aBlockEnd.Col();
SCROW nStartRow = aBlockStart.Row();
SCROW nEndRow = aBlockEnd.Row();
2000-09-18 16:07:07 +00:00
pUndoDoc->CopyToDocument( nStartCol, 0, nTab, nEndCol, MAXROW, nTab, IDF_NONE, false, &rDoc );
pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
rDoc.UpdatePageBreaks( nTab );
2000-09-18 16:07:07 +00:00
pViewShell->UpdateScrollBars();
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoRemoveAllOutlines::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
// sheet has to be switched over (#46952#)!
2000-09-18 16:07:07 +00:00
SCTAB nTab = aBlockStart.Tab();
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pViewShell->RemoveAllOutlines( false );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoRemoveAllOutlines::Repeat(SfxRepeatTarget& rTarget)
2000-09-18 16:07:07 +00:00
{
if (rTarget.ISA(ScTabViewTarget))
static_cast<ScTabViewTarget&>(rTarget).GetViewShell()->RemoveAllOutlines( true );
2000-09-18 16:07:07 +00:00
}
bool ScUndoRemoveAllOutlines::CanRepeat(SfxRepeatTarget& rTarget) const
2000-09-18 16:07:07 +00:00
{
return rTarget.ISA(ScTabViewTarget);
2000-09-18 16:07:07 +00:00
}
ScUndoAutoOutline::ScUndoAutoOutline( ScDocShell* pNewDocShell,
SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
2000-09-18 16:07:07 +00:00
ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab ) :
ScSimpleUndo( pNewDocShell ),
aBlockStart( nStartX, nStartY, nStartZ ),
aBlockEnd( nEndX, nEndY, nEndZ ),
pUndoDoc( pNewUndoDoc ),
pUndoTable( pNewUndoTab )
{
}
2010-12-11 23:25:30 +01:00
ScUndoAutoOutline::~ScUndoAutoOutline()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoTable;
}
OUString ScUndoAutoOutline::GetComment() const
{
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_AUTOOUTLINE );
}
2010-12-11 23:25:30 +01:00
void ScUndoAutoOutline::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTab = aBlockStart.Tab();
2000-09-18 16:07:07 +00:00
// Original outline table
rDoc.SetOutlineTable( nTab, pUndoTable );
2000-09-18 16:07:07 +00:00
// Original column/row status
2000-09-18 16:07:07 +00:00
if (pUndoDoc && pUndoTable)
{
SCCOLROW nStartCol;
SCCOLROW nStartRow;
SCCOLROW nEndCol;
SCCOLROW nEndRow;
pUndoTable->GetColArray().GetRange( nStartCol, nEndCol );
pUndoTable->GetRowArray().GetRange( nStartRow, nEndRow );
2000-09-18 16:07:07 +00:00
pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false,
&rDoc);
pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
pViewShell->UpdateScrollBars();
}
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoAutoOutline::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTab = aBlockStart.Tab();
2000-09-18 16:07:07 +00:00
if (pViewShell)
{
// sheet has to be switched on or off before this (#46952#) !!!
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
}
ScRange aRange( aBlockStart.Col(), aBlockStart.Row(), nTab,
aBlockEnd.Col(), aBlockEnd.Row(), nTab );
2000-09-18 16:07:07 +00:00
ScOutlineDocFunc aFunc( *pDocShell );
aFunc.AutoOutline( aRange, false );
2000-09-18 16:07:07 +00:00
// Select in View
// If it was called with a multi selection,
// then this is now the enclosing range...
2000-09-18 16:07:07 +00:00
if (pViewShell)
pViewShell->MarkRange( aRange );
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoAutoOutline::Repeat(SfxRepeatTarget& rTarget)
2000-09-18 16:07:07 +00:00
{
if (rTarget.ISA(ScTabViewTarget))
static_cast<ScTabViewTarget&>(rTarget).GetViewShell()->AutoOutline( true );
2000-09-18 16:07:07 +00:00
}
bool ScUndoAutoOutline::CanRepeat(SfxRepeatTarget& rTarget) const
2000-09-18 16:07:07 +00:00
{
return rTarget.ISA(ScTabViewTarget);
2000-09-18 16:07:07 +00:00
}
ScUndoSubTotals::ScUndoSubTotals( ScDocShell* pNewDocShell, SCTAB nNewTab,
const ScSubTotalParam& rNewParam, SCROW nNewEndY,
2000-09-18 16:07:07 +00:00
ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab,
ScRangeName* pNewUndoRange, ScDBCollection* pNewUndoDB ) :
ScDBFuncUndo( pNewDocShell, ScRange( rNewParam.nCol1, rNewParam.nRow1, nNewTab,
rNewParam.nCol2, rNewParam.nRow2, nNewTab ) ),
2000-09-18 16:07:07 +00:00
nTab( nNewTab ),
aParam( rNewParam ),
nNewEndRow( nNewEndY ),
pUndoDoc( pNewUndoDoc ),
pUndoTable( pNewUndoTab ),
pUndoRange( pNewUndoRange ),
pUndoDB( pNewUndoDB )
{
}
2010-12-11 23:25:30 +01:00
ScUndoSubTotals::~ScUndoSubTotals()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoTable;
delete pUndoRange;
delete pUndoDB;
}
OUString ScUndoSubTotals::GetComment() const
{ // "Subtotals"
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_SUBTOTALS );
}
2010-12-11 23:25:30 +01:00
void ScUndoSubTotals::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (nNewEndRow > aParam.nRow2)
{
rDoc.DeleteRow( 0,nTab, MAXCOL,nTab, aParam.nRow2+1, static_cast<SCSIZE>(nNewEndRow-aParam.nRow2) );
2000-09-18 16:07:07 +00:00
}
else if (nNewEndRow < aParam.nRow2)
{
rDoc.InsertRow( 0,nTab, MAXCOL,nTab, nNewEndRow+1, static_cast<SCSIZE>(aParam.nRow2-nNewEndRow) );
2000-09-18 16:07:07 +00:00
}
// Original Outline table
rDoc.SetOutlineTable( nTab, pUndoTable );
2000-09-18 16:07:07 +00:00
// Original column/row status
if (pUndoTable)
2000-09-18 16:07:07 +00:00
{
SCCOLROW nStartCol;
SCCOLROW nStartRow;
SCCOLROW nEndCol;
SCCOLROW nEndRow;
pUndoTable->GetColArray().GetRange( nStartCol, nEndCol );
pUndoTable->GetRowArray().GetRange( nStartRow, nEndRow );
2000-09-18 16:07:07 +00:00
pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false,
&rDoc);
pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
pViewShell->UpdateScrollBars();
}
// Original data and references
2000-09-18 16:07:07 +00:00
ScUndoUtil::MarkSimpleBlock( pDocShell, 0, aParam.nRow1+1, nTab,
MAXCOL, aParam.nRow2, nTab );
rDoc.DeleteAreaTab( 0,aParam.nRow1+1, MAXCOL,aParam.nRow2, nTab, IDF_ALL );
2000-09-18 16:07:07 +00:00
pUndoDoc->CopyToDocument( 0, aParam.nRow1+1, nTab, MAXCOL, aParam.nRow2, nTab,
IDF_NONE, false, &rDoc ); // Flags
2000-09-18 16:07:07 +00:00
pUndoDoc->UndoToDocument( 0, aParam.nRow1+1, nTab, MAXCOL, aParam.nRow2, nTab,
IDF_ALL, false, &rDoc );
2000-09-18 16:07:07 +00:00
ScUndoUtil::MarkSimpleBlock( pDocShell, aParam.nCol1,aParam.nRow1,nTab,
aParam.nCol2,aParam.nRow2,nTab );
if (pUndoRange)
rDoc.SetRangeName( new ScRangeName( *pUndoRange ) );
2000-09-18 16:07:07 +00:00
if (pUndoDB)
rDoc.SetDBCollection( new ScDBCollection( *pUndoDB ), true );
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
pDocShell->PostDataChanged();
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoSubTotals::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
ScUndoUtil::MarkSimpleBlock( pDocShell, aParam.nCol1,aParam.nRow1,nTab,
aParam.nCol2,aParam.nRow2,nTab );
pViewShell->DoSubTotals( aParam, false );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoSubTotals::Repeat(SfxRepeatTarget& /* rTarget */)
2000-09-18 16:07:07 +00:00
{
}
bool ScUndoSubTotals::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2000-09-18 16:07:07 +00:00
{
return false; // is not possible due to column numbers
2000-09-18 16:07:07 +00:00
}
ScUndoQuery::ScUndoQuery( ScDocShell* pNewDocShell, SCTAB nNewTab, const ScQueryParam& rParam,
2000-09-18 16:07:07 +00:00
ScDocument* pNewUndoDoc, ScDBCollection* pNewUndoDB,
const ScRange* pOld, bool bSize, const ScRange* pAdvSrc ) :
ScDBFuncUndo( pNewDocShell, ScRange( rParam.nCol1, rParam.nRow1, nNewTab,
rParam.nCol2, rParam.nRow2, nNewTab ) ),
pDrawUndo( NULL ),
2000-09-18 16:07:07 +00:00
nTab( nNewTab ),
aQueryParam( rParam ),
pUndoDoc( pNewUndoDoc ),
pUndoDB( pNewUndoDB ),
bIsAdvanced( false ),
bDestArea( false ),
bDoSize( bSize )
2000-09-18 16:07:07 +00:00
{
if ( pOld )
{
bDestArea = true;
2000-09-18 16:07:07 +00:00
aOldDest = *pOld;
}
if ( pAdvSrc )
{
bIsAdvanced = true;
2000-09-18 16:07:07 +00:00
aAdvSource = *pAdvSrc;
}
pDrawUndo = GetSdrUndoAction( &pDocShell->GetDocument() );
2000-09-18 16:07:07 +00:00
}
2010-12-11 23:25:30 +01:00
ScUndoQuery::~ScUndoQuery()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoDB;
DeleteSdrUndoAction( pDrawUndo );
2000-09-18 16:07:07 +00:00
}
OUString ScUndoQuery::GetComment() const
{ // "Filter";
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_QUERY );
}
2010-12-11 23:25:30 +01:00
void ScUndoQuery::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
bool bCopy = !aQueryParam.bInplace;
SCCOL nDestEndCol = 0;
SCROW nDestEndRow = 0;
2000-09-18 16:07:07 +00:00
if (bCopy)
{
nDestEndCol = aQueryParam.nDestCol + ( aQueryParam.nCol2-aQueryParam.nCol1 );
nDestEndRow = aQueryParam.nDestRow + ( aQueryParam.nRow2-aQueryParam.nRow1 );
ScDBData* pData = rDoc.GetDBAtCursor( aQueryParam.nDestCol, aQueryParam.nDestRow,
aQueryParam.nDestTab, true );
2000-09-18 16:07:07 +00:00
if (pData)
{
ScRange aNewDest;
pData->GetArea( aNewDest );
nDestEndCol = aNewDest.aEnd.Col();
nDestEndRow = aNewDest.aEnd.Row();
}
if ( bDoSize && bDestArea )
{
// aDestRange is the old range
rDoc.FitBlock( ScRange(
2000-09-18 16:07:07 +00:00
aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
nDestEndCol, nDestEndRow, aQueryParam.nDestTab ),
aOldDest );
}
ScUndoUtil::MarkSimpleBlock( pDocShell,
aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
nDestEndCol, nDestEndRow, aQueryParam.nDestTab );
rDoc.DeleteAreaTab( aQueryParam.nDestCol, aQueryParam.nDestRow,
2000-09-18 16:07:07 +00:00
nDestEndCol, nDestEndRow, aQueryParam.nDestTab, IDF_ALL );
pViewShell->DoneBlockMode();
pUndoDoc->CopyToDocument( aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
nDestEndCol, nDestEndRow, aQueryParam.nDestTab,
IDF_ALL, false, &rDoc );
// Attributes are always copied (#49287#)
2000-09-18 16:07:07 +00:00
// rest of the old range
2000-09-18 16:07:07 +00:00
if ( bDestArea && !bDoSize )
{
rDoc.DeleteAreaTab( aOldDest, IDF_ALL );
pUndoDoc->CopyToDocument( aOldDest, IDF_ALL, false, &rDoc );
2000-09-18 16:07:07 +00:00
}
}
else
pUndoDoc->CopyToDocument( 0, aQueryParam.nRow1, nTab, MAXCOL, aQueryParam.nRow2, nTab,
IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
if (pUndoDB)
rDoc.SetDBCollection( new ScDBCollection( *pUndoDB ), true );
2000-09-18 16:07:07 +00:00
if (!bCopy)
{
rDoc.InvalidatePageBreaks(nTab);
rDoc.UpdatePageBreaks( nTab );
}
2000-09-18 16:07:07 +00:00
CWS-TOOLING: integrate CWS calc47 2008-12-10 20:38:34 +0100 oc r265231 : #i97115# 2008-12-09 14:19:59 +0100 oc r265084 : #i96939# 2008-12-09 11:55:29 +0100 oc r265073 : #i97061# 2008-12-09 11:37:05 +0100 oc r265067 : #i97061# 2008-12-09 11:31:49 +0100 oc r265066 : #i97061# 2008-12-09 11:30:30 +0100 oc r265065 : #i97061# 2008-12-04 17:13:43 +0100 er r264859 : DBG_ERROR needs semicolon 2008-12-04 02:34:13 +0100 er r264811 : unxsols4 needs to be compiled with exceptions when using STL 2008-12-04 02:24:30 +0100 er r264810 : WaE unxsols4: ScZoomSliderWnd::Update hides the function Window::Update() 2008-12-04 01:40:22 +0100 er r264809 : DBG_ASSERT needs semicolon 2008-12-03 11:00:55 +0100 er r264753 : CWS-TOOLING: rebase CWS calc47 to trunk@264325 (milestone: DEV300:m36) 2008-10-31 12:30:09 +0100 nn r262863 : #i90362# call CheckNeedsRepaint in UpdateFormulas 2008-10-29 14:49:48 +0100 nn r262802 : #i88521# initialization order (gcc warning) 2008-10-29 12:31:38 +0100 nn r262782 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg) 2008-10-29 12:31:00 +0100 nn r262781 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg) 2008-10-29 12:28:45 +0100 nn r262780 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg) 2008-10-28 17:01:37 +0100 nn r262756 : resolve gcc warnings 2008-10-28 13:46:07 +0100 nn r262742 : #i9709# always use system encoding for DDE (patch from rail) 2008-10-28 13:45:44 +0100 nn r262741 : #i9709# always use system encoding for DDE (patch from rail) 2008-10-27 20:55:51 +0100 nn r262689 : #i44349# refresh auto filter flags in ScUndoDragDrop::Redo (patch from gaozm) 2008-10-27 20:40:06 +0100 nn r262688 : #i4517# rename sheet with double click (patch from kohei) 2008-10-27 20:28:55 +0100 nn r262687 : #i20491# ensure stable sorting (patch from maoyg) 2008-10-27 20:13:19 +0100 nn r262686 : #i22758# direct sort (toolbar buttons): detect headers (patch from maoyg) 2008-10-27 19:42:51 +0100 nn r262685 : #i7277# default for sorting is cursor column (patch from maoyg) 2008-10-27 19:18:57 +0100 nn r262684 : #i7088# insert/delete columns/rows across selected sheets (patch from maoyg) 2008-10-27 18:59:43 +0100 nn r262683 : #i86856# show formula syntax in tip help (patch from maoyg) 2008-10-27 18:30:45 +0100 nn r262682 : #i89145# scroll wheel handling in page preview (patch from maoyg) 2008-10-27 18:03:10 +0100 nn r262681 : #i85226# take care of subtotal formulas in ScUndoQuery::Undo (patch from gaozm) 2008-10-27 17:41:16 +0100 nn r262680 : #i88437# add zoom slider in status bar also for Calc (patch from maoyg) 2008-10-27 15:53:52 +0100 nn r262678 : #i88467# undo for page margins/column widths in page preview (patch from maoyg)
2008-12-11 08:36:38 +00:00
ScRange aDirtyRange( 0 , aQueryParam.nRow1, nTab,
MAXCOL, aQueryParam.nRow2, nTab );
rDoc.SetDirty( aDirtyRange, true );
CWS-TOOLING: integrate CWS calc47 2008-12-10 20:38:34 +0100 oc r265231 : #i97115# 2008-12-09 14:19:59 +0100 oc r265084 : #i96939# 2008-12-09 11:55:29 +0100 oc r265073 : #i97061# 2008-12-09 11:37:05 +0100 oc r265067 : #i97061# 2008-12-09 11:31:49 +0100 oc r265066 : #i97061# 2008-12-09 11:30:30 +0100 oc r265065 : #i97061# 2008-12-04 17:13:43 +0100 er r264859 : DBG_ERROR needs semicolon 2008-12-04 02:34:13 +0100 er r264811 : unxsols4 needs to be compiled with exceptions when using STL 2008-12-04 02:24:30 +0100 er r264810 : WaE unxsols4: ScZoomSliderWnd::Update hides the function Window::Update() 2008-12-04 01:40:22 +0100 er r264809 : DBG_ASSERT needs semicolon 2008-12-03 11:00:55 +0100 er r264753 : CWS-TOOLING: rebase CWS calc47 to trunk@264325 (milestone: DEV300:m36) 2008-10-31 12:30:09 +0100 nn r262863 : #i90362# call CheckNeedsRepaint in UpdateFormulas 2008-10-29 14:49:48 +0100 nn r262802 : #i88521# initialization order (gcc warning) 2008-10-29 12:31:38 +0100 nn r262782 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg) 2008-10-29 12:31:00 +0100 nn r262781 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg) 2008-10-29 12:28:45 +0100 nn r262780 : #i88521# toolbar entry for scaling factor in page preview (patch from maoyg) 2008-10-28 17:01:37 +0100 nn r262756 : resolve gcc warnings 2008-10-28 13:46:07 +0100 nn r262742 : #i9709# always use system encoding for DDE (patch from rail) 2008-10-28 13:45:44 +0100 nn r262741 : #i9709# always use system encoding for DDE (patch from rail) 2008-10-27 20:55:51 +0100 nn r262689 : #i44349# refresh auto filter flags in ScUndoDragDrop::Redo (patch from gaozm) 2008-10-27 20:40:06 +0100 nn r262688 : #i4517# rename sheet with double click (patch from kohei) 2008-10-27 20:28:55 +0100 nn r262687 : #i20491# ensure stable sorting (patch from maoyg) 2008-10-27 20:13:19 +0100 nn r262686 : #i22758# direct sort (toolbar buttons): detect headers (patch from maoyg) 2008-10-27 19:42:51 +0100 nn r262685 : #i7277# default for sorting is cursor column (patch from maoyg) 2008-10-27 19:18:57 +0100 nn r262684 : #i7088# insert/delete columns/rows across selected sheets (patch from maoyg) 2008-10-27 18:59:43 +0100 nn r262683 : #i86856# show formula syntax in tip help (patch from maoyg) 2008-10-27 18:30:45 +0100 nn r262682 : #i89145# scroll wheel handling in page preview (patch from maoyg) 2008-10-27 18:03:10 +0100 nn r262681 : #i85226# take care of subtotal formulas in ScUndoQuery::Undo (patch from gaozm) 2008-10-27 17:41:16 +0100 nn r262680 : #i88437# add zoom slider in status bar also for Calc (patch from maoyg) 2008-10-27 15:53:52 +0100 nn r262678 : #i88467# undo for page margins/column widths in page preview (patch from maoyg)
2008-12-11 08:36:38 +00:00
DoSdrUndoAction( pDrawUndo, &rDoc );
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
// Paint
if (bCopy)
{
SCCOL nEndX = nDestEndCol;
SCROW nEndY = nDestEndRow;
2000-09-18 16:07:07 +00:00
if (bDestArea)
{
if ( aOldDest.aEnd.Col() > nEndX )
nEndX = aOldDest.aEnd.Col();
if ( aOldDest.aEnd.Row() > nEndY )
nEndY = aOldDest.aEnd.Row();
}
if (bDoSize)
nEndY = MAXROW;
pDocShell->PostPaint( aQueryParam.nDestCol, aQueryParam.nDestRow, aQueryParam.nDestTab,
nEndX, nEndY, aQueryParam.nDestTab, PAINT_GRID );
2000-09-18 16:07:07 +00:00
}
else
pDocShell->PostPaint( 0, aQueryParam.nRow1, nTab, MAXCOL, MAXROW, nTab,
PAINT_GRID | PAINT_LEFT );
pDocShell->PostDataChanged();
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoQuery::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
if ( bIsAdvanced )
pViewShell->Query( aQueryParam, &aAdvSource, false );
2000-09-18 16:07:07 +00:00
else
pViewShell->Query( aQueryParam, NULL, false );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoQuery::Repeat(SfxRepeatTarget& /* rTarget */)
2000-09-18 16:07:07 +00:00
{
}
bool ScUndoQuery::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2000-09-18 16:07:07 +00:00
{
return false; // does not work due to column numbers
2000-09-18 16:07:07 +00:00
}
// Show or hide AutoFilter buttons (doesn't include filter settings)
ScUndoAutoFilter::ScUndoAutoFilter( ScDocShell* pNewDocShell, const ScRange& rRange,
const OUString& rName, bool bSet ) :
ScDBFuncUndo( pNewDocShell, rRange ),
aDBName( rName ),
bFilterSet( bSet )
{
}
ScUndoAutoFilter::~ScUndoAutoFilter()
{
}
OUString ScUndoAutoFilter::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_QUERY ); // same as ScUndoQuery
}
void ScUndoAutoFilter::DoChange( bool bUndo )
{
bool bNewFilter = bUndo ? !bFilterSet : bFilterSet;
ScDocument& rDoc = pDocShell->GetDocument();
ScDBData* pDBData=NULL;
if (aDBName == STR_DB_LOCAL_NONAME)
{
SCTAB nTab = aOriginalRange.aStart.Tab();
pDBData = rDoc.GetAnonymousDBData(nTab);
}
else
{
ScDBCollection* pColl = rDoc.GetDBCollection();
pDBData = pColl->getNamedDBs().findByUpperName(ScGlobal::pCharClass->uppercase(aDBName));
}
if ( pDBData )
{
pDBData->SetAutoFilter( bNewFilter );
SCCOL nRangeX1;
SCROW nRangeY1;
SCCOL nRangeX2;
SCROW nRangeY2;
SCTAB nRangeTab;
pDBData->GetArea( nRangeTab, nRangeX1, nRangeY1, nRangeX2, nRangeY2 );
if ( bNewFilter )
rDoc.ApplyFlagsTab( nRangeX1, nRangeY1, nRangeX2, nRangeY1, nRangeTab, SC_MF_AUTO );
else
rDoc.RemoveFlagsTab( nRangeX1, nRangeY1, nRangeX2, nRangeY1, nRangeTab, SC_MF_AUTO );
pDocShell->PostPaint( nRangeX1, nRangeY1, nRangeTab, nRangeX2, nRangeY1, nRangeTab, PAINT_GRID );
}
}
void ScUndoAutoFilter::Undo()
{
BeginUndo();
DoChange( true );
EndUndo();
}
void ScUndoAutoFilter::Redo()
{
BeginRedo();
DoChange( false );
EndRedo();
}
void ScUndoAutoFilter::Repeat(SfxRepeatTarget& /* rTarget */)
{
}
bool ScUndoAutoFilter::CanRepeat(SfxRepeatTarget& /* rTarget */) const
{
return false;
}
// change database sections (dialog)
2000-09-18 16:07:07 +00:00
ScUndoDBData::ScUndoDBData( ScDocShell* pNewDocShell,
ScDBCollection* pNewUndoColl, ScDBCollection* pNewRedoColl ) :
ScSimpleUndo( pNewDocShell ),
pUndoColl( pNewUndoColl ),
pRedoColl( pNewRedoColl )
{
}
2010-12-11 23:25:30 +01:00
ScUndoDBData::~ScUndoDBData()
2000-09-18 16:07:07 +00:00
{
delete pUndoColl;
delete pRedoColl;
}
OUString ScUndoDBData::GetComment() const
{ // "Change database range";
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_DBDATA );
}
2010-12-11 23:25:30 +01:00
void ScUndoDBData::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
bool bOldAutoCalc = rDoc.GetAutoCalc();
rDoc.SetAutoCalc( false ); // Avoid unnecessary calculations
rDoc.PreprocessDBDataUpdate();
rDoc.SetDBCollection( new ScDBCollection(*pUndoColl), true );
rDoc.CompileHybridFormula();
rDoc.SetAutoCalc( bOldAutoCalc );
2000-09-18 16:07:07 +00:00
SfxGetpApp()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
2000-09-18 16:07:07 +00:00
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoDBData::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
bool bOldAutoCalc = rDoc.GetAutoCalc();
rDoc.SetAutoCalc( false ); // Avoid unnecessary calculations
rDoc.PreprocessDBDataUpdate();
rDoc.SetDBCollection( new ScDBCollection(*pRedoColl), true );
rDoc.CompileHybridFormula();
rDoc.SetAutoCalc( bOldAutoCalc );
2000-09-18 16:07:07 +00:00
SfxGetpApp()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoDBData::Repeat(SfxRepeatTarget& /* rTarget */)
2000-09-18 16:07:07 +00:00
{
}
bool ScUndoDBData::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2000-09-18 16:07:07 +00:00
{
return false; // is not possible
2000-09-18 16:07:07 +00:00
}
ScUndoImportData::ScUndoImportData( ScDocShell* pNewDocShell, SCTAB nNewTab,
const ScImportParam& rParam, SCCOL nNewEndX, SCROW nNewEndY,
SCCOL nNewFormula,
2000-09-18 16:07:07 +00:00
ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc,
ScDBData* pNewUndoData, ScDBData* pNewRedoData ) :
ScSimpleUndo( pNewDocShell ),
nTab( nNewTab ),
aImportParam( rParam ),
nEndCol( nNewEndX ),
nEndRow( nNewEndY ),
pUndoDoc( pNewUndoDoc ),
pRedoDoc( pNewRedoDoc ),
pUndoDBData( pNewUndoData ),
pRedoDBData( pNewRedoData ),
nFormulaCols( nNewFormula ),
bRedoFilled( false )
2000-09-18 16:07:07 +00:00
{
// redo doc doesn't contain imported data (but everything else)
}
2010-12-11 23:25:30 +01:00
ScUndoImportData::~ScUndoImportData()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pRedoDoc;
delete pUndoDBData;
delete pRedoDBData;
}
OUString ScUndoImportData::GetComment() const
{
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_IMPORTDATA );
}
2010-12-11 23:25:30 +01:00
void ScUndoImportData::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
ScUndoUtil::MarkSimpleBlock( pDocShell, aImportParam.nCol1,aImportParam.nRow1,nTab,
nEndCol,nEndRow,nTab );
SCTAB nTable;
SCCOL nCol1, nCol2;
SCROW nRow1, nRow2;
2000-09-18 16:07:07 +00:00
ScDBData* pCurrentData = NULL;
if (pUndoDBData && pRedoDBData)
{
pRedoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
pCurrentData = ScUndoUtil::GetOldDBData( pRedoDBData, &rDoc, nTab,
2000-09-18 16:07:07 +00:00
nCol1, nRow1, nCol2, nRow2 );
if ( !bRedoFilled )
{
// read redo data from document at first undo
// imported data is deleted later anyway,
// so now delete each column after copying to save memory (#41216#)
bool bOldAutoCalc = rDoc.GetAutoCalc();
rDoc.SetAutoCalc( false ); // outside of the loop
for (SCCOL nCopyCol = nCol1; nCopyCol <= nCol2; nCopyCol++)
2000-09-18 16:07:07 +00:00
{
rDoc.CopyToDocument( nCopyCol,nRow1,nTab, nCopyCol,nRow2,nTab,
IDF_CONTENTS & ~IDF_NOTE, false, pRedoDoc );
rDoc.DeleteAreaTab( nCopyCol,nRow1, nCopyCol,nRow2, nTab, IDF_CONTENTS & ~IDF_NOTE );
2000-09-18 16:07:07 +00:00
}
rDoc.SetAutoCalc( bOldAutoCalc );
bRedoFilled = true;
2000-09-18 16:07:07 +00:00
}
}
bool bMoveCells = pUndoDBData && pRedoDBData &&
pRedoDBData->IsDoSize(); // the same in old and new
2000-09-18 16:07:07 +00:00
if (bMoveCells)
{
// Undo: first delete the new data, then FitBlock backwards
2000-09-18 16:07:07 +00:00
ScRange aOld, aNew;
pUndoDBData->GetArea( aOld );
pRedoDBData->GetArea( aNew );
rDoc.DeleteAreaTab( aNew.aStart.Col(), aNew.aStart.Row(),
aNew.aEnd.Col(), aNew.aEnd.Row(), nTab, IDF_ALL & ~IDF_NOTE );
2000-09-18 16:07:07 +00:00
aOld.aEnd.SetCol( aOld.aEnd.Col() + nFormulaCols ); // FitBlock also for formulas
2000-09-18 16:07:07 +00:00
aNew.aEnd.SetCol( aNew.aEnd.Col() + nFormulaCols );
rDoc.FitBlock( aNew, aOld, false ); // backwards
2000-09-18 16:07:07 +00:00
}
else
rDoc.DeleteAreaTab( aImportParam.nCol1,aImportParam.nRow1,
nEndCol,nEndRow, nTab, IDF_ALL & ~IDF_NOTE );
2000-09-18 16:07:07 +00:00
pUndoDoc->CopyToDocument( aImportParam.nCol1,aImportParam.nRow1,nTab,
nEndCol+nFormulaCols,nEndRow,nTab,
IDF_ALL & ~IDF_NOTE, false, &rDoc );
2000-09-18 16:07:07 +00:00
if (pCurrentData)
{
*pCurrentData = *pUndoDBData;
pUndoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
ScUndoUtil::MarkSimpleBlock( pDocShell, nCol1, nRow1, nTable, nCol2, nRow2, nTable );
}
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
if (bMoveCells)
pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
else
pDocShell->PostPaint( aImportParam.nCol1,aImportParam.nRow1,nTab,
nEndCol,nEndRow,nTab, PAINT_GRID );
pDocShell->PostDataChanged();
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoImportData::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
ScUndoUtil::MarkSimpleBlock( pDocShell, aImportParam.nCol1,aImportParam.nRow1,nTab,
nEndCol,nEndRow,nTab );
SCTAB nTable;
SCCOL nCol1, nCol2;
SCROW nRow1, nRow2;
2000-09-18 16:07:07 +00:00
ScDBData* pCurrentData = NULL;
if (pUndoDBData && pRedoDBData)
{
pUndoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
pCurrentData = ScUndoUtil::GetOldDBData( pUndoDBData, &rDoc, nTab,
2000-09-18 16:07:07 +00:00
nCol1, nRow1, nCol2, nRow2 );
}
bool bMoveCells = pUndoDBData && pRedoDBData &&
pRedoDBData->IsDoSize(); // // the same in old and new
2000-09-18 16:07:07 +00:00
if (bMoveCells)
{
// Redo: FitBlock, then delete data (needed for CopyToDocument)
2000-09-18 16:07:07 +00:00
ScRange aOld, aNew;
pUndoDBData->GetArea( aOld );
pRedoDBData->GetArea( aNew );
aOld.aEnd.SetCol( aOld.aEnd.Col() + nFormulaCols ); // FitBlock also for formulas
2000-09-18 16:07:07 +00:00
aNew.aEnd.SetCol( aNew.aEnd.Col() + nFormulaCols );
rDoc.FitBlock( aOld, aNew );
2000-09-18 16:07:07 +00:00
rDoc.DeleteAreaTab( aNew.aStart.Col(), aNew.aStart.Row(),
aNew.aEnd.Col(), aNew.aEnd.Row(), nTab, IDF_ALL & ~IDF_NOTE );
2000-09-18 16:07:07 +00:00
pRedoDoc->CopyToDocument( aNew, IDF_ALL & ~IDF_NOTE, false, &rDoc ); // including formulas
2000-09-18 16:07:07 +00:00
}
else
{
rDoc.DeleteAreaTab( aImportParam.nCol1,aImportParam.nRow1,
nEndCol,nEndRow, nTab, IDF_ALL & ~IDF_NOTE );
2000-09-18 16:07:07 +00:00
pRedoDoc->CopyToDocument( aImportParam.nCol1,aImportParam.nRow1,nTab,
nEndCol,nEndRow,nTab, IDF_ALL & ~IDF_NOTE, false, &rDoc );
2000-09-18 16:07:07 +00:00
}
if (pCurrentData)
{
*pCurrentData = *pRedoDBData;
pRedoDBData->GetArea( nTable, nCol1, nRow1, nCol2, nRow2 );
ScUndoUtil::MarkSimpleBlock( pDocShell, nCol1, nRow1, nTable, nCol2, nRow2, nTable );
}
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
if (bMoveCells)
pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
else
pDocShell->PostPaint( aImportParam.nCol1,aImportParam.nRow1,nTab,
nEndCol,nEndRow,nTab, PAINT_GRID );
pDocShell->PostDataChanged();
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoImportData::Repeat(SfxRepeatTarget& rTarget)
2000-09-18 16:07:07 +00:00
{
if (rTarget.ISA(ScTabViewTarget))
{
ScTabViewShell& rViewShell = *static_cast<ScTabViewTarget&>(rTarget).GetViewShell();
2000-09-18 16:07:07 +00:00
SCTAB nDummy;
2000-09-18 16:07:07 +00:00
ScImportParam aNewParam(aImportParam);
ScDBData* pDBData = rViewShell.GetDBData();
pDBData->GetArea( nDummy, aNewParam.nCol1,aNewParam.nRow1, aNewParam.nCol2,aNewParam.nRow2 );
rViewShell.ImportData( aNewParam );
}
}
bool ScUndoImportData::CanRepeat(SfxRepeatTarget& rTarget) const
2000-09-18 16:07:07 +00:00
{
// Repeat only for import using a database range, then pUndoDBData is set
2000-09-18 16:07:07 +00:00
if (pUndoDBData)
return rTarget.ISA(ScTabViewTarget);
2000-09-18 16:07:07 +00:00
else
return false; // Address book
2000-09-18 16:07:07 +00:00
}
ScUndoRepeatDB::ScUndoRepeatDB( ScDocShell* pNewDocShell, SCTAB nNewTab,
SCCOL nStartX, SCROW nStartY, SCCOL nEndX, SCROW nEndY,
SCROW nResultEndRow, SCCOL nCurX, SCROW nCurY,
2000-09-18 16:07:07 +00:00
ScDocument* pNewUndoDoc, ScOutlineTable* pNewUndoTab,
ScRangeName* pNewUndoRange, ScDBCollection* pNewUndoDB,
const ScRange* pOldQ, const ScRange* pNewQ ) :
ScSimpleUndo( pNewDocShell ),
aBlockStart( nStartX,nStartY,nNewTab ),
aBlockEnd( nEndX,nEndY,nNewTab ),
nNewEndRow( nResultEndRow ),
aCursorPos( nCurX,nCurY,nNewTab ),
pUndoDoc( pNewUndoDoc ),
pUndoTable( pNewUndoTab ),
pUndoRange( pNewUndoRange ),
pUndoDB( pNewUndoDB ),
bQuerySize( false )
2000-09-18 16:07:07 +00:00
{
if ( pOldQ && pNewQ )
{
aOldQuery = *pOldQ;
aNewQuery = *pNewQ;
bQuerySize = true;
2000-09-18 16:07:07 +00:00
}
}
2010-12-11 23:25:30 +01:00
ScUndoRepeatDB::~ScUndoRepeatDB()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoTable;
delete pUndoRange;
delete pUndoDB;
}
OUString ScUndoRepeatDB::GetComment() const
{
2000-09-18 16:07:07 +00:00
return ScGlobal::GetRscString( STR_UNDO_REPEATDB );
}
2010-12-11 23:25:30 +01:00
void ScUndoRepeatDB::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTab = aBlockStart.Tab();
2000-09-18 16:07:07 +00:00
if (bQuerySize)
{
rDoc.FitBlock( aNewQuery, aOldQuery, false );
2000-09-18 16:07:07 +00:00
if ( aNewQuery.aEnd.Col() == aOldQuery.aEnd.Col() )
{
SCCOL nFormulaCols = 0;
SCCOL nCol = aOldQuery.aEnd.Col() + 1;
SCROW nRow = aOldQuery.aStart.Row() + 1; // test the header
2000-09-18 16:07:07 +00:00
while ( nCol <= MAXCOL &&
rDoc.GetCellType(ScAddress( nCol, nRow, nTab )) == CELLTYPE_FORMULA )
2000-09-18 16:07:07 +00:00
++nCol, ++nFormulaCols;
if ( nFormulaCols > 0 )
2000-09-18 16:07:07 +00:00
{
ScRange aOldForm = aOldQuery;
aOldForm.aStart.SetCol( aOldQuery.aEnd.Col() + 1 );
aOldForm.aEnd.SetCol( aOldQuery.aEnd.Col() + nFormulaCols );
ScRange aNewForm = aOldForm;
aNewForm.aEnd.SetRow( aNewQuery.aEnd.Row() );
rDoc.FitBlock( aNewForm, aOldForm, false );
2000-09-18 16:07:07 +00:00
}
}
}
// TODO Data from Filter in other range are still missing!
2000-09-18 16:07:07 +00:00
if (nNewEndRow > aBlockEnd.Row())
2000-09-18 16:07:07 +00:00
{
rDoc.DeleteRow( 0,nTab, MAXCOL,nTab, aBlockEnd.Row()+1, static_cast<SCSIZE>(nNewEndRow-aBlockEnd.Row()) );
2000-09-18 16:07:07 +00:00
}
else if (nNewEndRow < aBlockEnd.Row())
2000-09-18 16:07:07 +00:00
{
rDoc.InsertRow( 0,nTab, MAXCOL,nTab, nNewEndRow+1, static_cast<SCSIZE>(nNewEndRow-aBlockEnd.Row()) );
2000-09-18 16:07:07 +00:00
}
// Original Outline table
rDoc.SetOutlineTable( nTab, pUndoTable );
2000-09-18 16:07:07 +00:00
// Original column/row status
if (pUndoTable)
2000-09-18 16:07:07 +00:00
{
SCCOLROW nStartCol;
SCCOLROW nStartRow;
SCCOLROW nEndCol;
SCCOLROW nEndRow;
pUndoTable->GetColArray().GetRange( nStartCol, nEndCol );
pUndoTable->GetRowArray().GetRange( nStartRow, nEndRow );
2000-09-18 16:07:07 +00:00
pUndoDoc->CopyToDocument( static_cast<SCCOL>(nStartCol), 0, nTab,
static_cast<SCCOL>(nEndCol), MAXROW, nTab, IDF_NONE, false,
&rDoc );
pUndoDoc->CopyToDocument( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
pViewShell->UpdateScrollBars();
}
// Original data and references
ScUndoUtil::MarkSimpleBlock( pDocShell, 0, aBlockStart.Row(), nTab,
MAXCOL, aBlockEnd.Row(), nTab );
rDoc.DeleteAreaTab( 0, aBlockStart.Row(),
MAXCOL, aBlockEnd.Row(), nTab, IDF_ALL );
2000-09-18 16:07:07 +00:00
pUndoDoc->CopyToDocument( 0, aBlockStart.Row(), nTab, MAXCOL, aBlockEnd.Row(), nTab,
IDF_NONE, false, &rDoc ); // Flags
pUndoDoc->UndoToDocument( 0, aBlockStart.Row(), nTab, MAXCOL, aBlockEnd.Row(), nTab,
IDF_ALL, false, &rDoc );
2000-09-18 16:07:07 +00:00
ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart.Col(),aBlockStart.Row(),nTab,
aBlockEnd.Col(),aBlockEnd.Row(),nTab );
2000-09-18 16:07:07 +00:00
if (pUndoRange)
rDoc.SetRangeName( new ScRangeName( *pUndoRange ) );
2000-09-18 16:07:07 +00:00
if (pUndoDB)
rDoc.SetDBCollection( new ScDBCollection( *pUndoDB ), true );
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PAINT_GRID|PAINT_LEFT|PAINT_TOP|PAINT_SIZE);
pDocShell->PostDataChanged();
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoRepeatDB::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTab = aBlockStart.Tab();
2000-09-18 16:07:07 +00:00
SCTAB nVisTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nVisTab != nTab )
pViewShell->SetTabNo( nTab );
ScUndoUtil::MarkSimpleBlock( pDocShell, aBlockStart.Col(),aBlockStart.Row(),nTab,
aBlockEnd.Col(),aBlockEnd.Row(),nTab );
pViewShell->SetCursor( aCursorPos.Col(), aCursorPos.Row() );
2000-09-18 16:07:07 +00:00
pViewShell->RepeatDB( false );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoRepeatDB::Repeat(SfxRepeatTarget& rTarget)
2000-09-18 16:07:07 +00:00
{
if (rTarget.ISA(ScTabViewTarget))
static_cast<ScTabViewTarget&>(rTarget).GetViewShell()->RepeatDB( true );
2000-09-18 16:07:07 +00:00
}
bool ScUndoRepeatDB::CanRepeat(SfxRepeatTarget& rTarget) const
2000-09-18 16:07:07 +00:00
{
return rTarget.ISA(ScTabViewTarget);
2000-09-18 16:07:07 +00:00
}
ScUndoDataPilot::ScUndoDataPilot( ScDocShell* pNewDocShell,
ScDocument* pOldDoc, ScDocument* pNewDoc,
const ScDPObject* pOldObj, const ScDPObject* pNewObj, bool bMove ) :
2000-09-18 16:07:07 +00:00
ScSimpleUndo( pNewDocShell ),
pOldUndoDoc( pOldDoc ),
pNewUndoDoc( pNewDoc ),
pOldDPObject( NULL ),
pNewDPObject( NULL ),
bAllowMove( bMove )
2000-09-18 16:07:07 +00:00
{
if (pOldObj)
pOldDPObject = new ScDPObject( *pOldObj );
if (pNewObj)
pNewDPObject = new ScDPObject( *pNewObj );
}
2010-12-11 23:25:30 +01:00
ScUndoDataPilot::~ScUndoDataPilot()
2000-09-18 16:07:07 +00:00
{
delete pOldDPObject;
delete pNewDPObject;
delete pOldUndoDoc;
delete pNewUndoDoc;
}
OUString ScUndoDataPilot::GetComment() const
2000-09-18 16:07:07 +00:00
{
sal_uInt16 nIndex;
2000-09-18 16:07:07 +00:00
if ( pOldUndoDoc && pNewUndoDoc )
nIndex = STR_UNDO_PIVOT_MODIFY;
else if ( pNewUndoDoc )
nIndex = STR_UNDO_PIVOT_NEW;
else
nIndex = STR_UNDO_PIVOT_DELETE;
return ScGlobal::GetRscString( nIndex );
}
2010-12-11 23:25:30 +01:00
void ScUndoDataPilot::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScRange aOldRange;
ScRange aNewRange;
if ( pNewDPObject && pNewUndoDoc )
{
aNewRange = pNewDPObject->GetOutRange();
rDoc.DeleteAreaTab( aNewRange, IDF_ALL );
pNewUndoDoc->CopyToDocument( aNewRange, IDF_ALL, false, &rDoc );
2000-09-18 16:07:07 +00:00
}
if ( pOldDPObject && pOldUndoDoc )
{
aOldRange = pOldDPObject->GetOutRange();
rDoc.DeleteAreaTab( aOldRange, IDF_ALL );
pOldUndoDoc->CopyToDocument( aOldRange, IDF_ALL, false, &rDoc );
2000-09-18 16:07:07 +00:00
}
// update objects in collection
if ( pNewDPObject )
{
// find updated object
//! find by name!
ScDPObject* pDocObj = rDoc.GetDPAtCursor(
2000-09-18 16:07:07 +00:00
aNewRange.aStart.Col(), aNewRange.aStart.Row(), aNewRange.aStart.Tab() );
OSL_ENSURE(pDocObj, "DPObject not found");
2000-09-18 16:07:07 +00:00
if (pDocObj)
{
if ( pOldDPObject )
{
// restore old settings
pOldDPObject->WriteSourceDataTo( *pDocObj );
ScDPSaveData* pData = pOldDPObject->GetSaveData();
if (pData)
pDocObj->SetSaveData(*pData);
pDocObj->SetOutRange( pOldDPObject->GetOutRange() );
pOldDPObject->WriteTempDataTo( *pDocObj );
2000-09-18 16:07:07 +00:00
}
else
{
// delete inserted object
rDoc.GetDPCollection()->FreeTable(pDocObj);
2000-09-18 16:07:07 +00:00
}
}
}
else if ( pOldDPObject )
{
// re-insert deleted object
ScDPObject* pDestObj = new ScDPObject( *pOldDPObject );
if ( !rDoc.GetDPCollection()->InsertNewTable(pDestObj) )
2000-09-18 16:07:07 +00:00
{
2011-03-01 19:05:02 +01:00
OSL_FAIL("cannot insert DPObject");
2000-09-18 16:07:07 +00:00
DELETEZ( pDestObj );
}
}
if (pNewUndoDoc)
pDocShell->PostPaint( aNewRange, PAINT_GRID, SC_PF_LINES );
if (pOldUndoDoc)
pDocShell->PostPaint( aOldRange, PAINT_GRID, SC_PF_LINES );
pDocShell->PostDataChanged();
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
{
//! set current sheet
}
if (pNewDPObject)
{
// notify API objects
rDoc.BroadcastUno( ScDataPilotModifiedHint( pNewDPObject->GetName() ) );
}
2000-09-18 16:07:07 +00:00
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoDataPilot::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
//! copy output data instead of repeating the change,
//! in case external data have changed!
ScDocument& rDoc = pDocShell->GetDocument();
2000-09-18 16:07:07 +00:00
ScDPObject* pSourceObj = NULL;
if ( pOldDPObject )
{
// find object to modify
//! find by name!
ScRange aOldRange = pOldDPObject->GetOutRange();
pSourceObj = rDoc.GetDPAtCursor(
2000-09-18 16:07:07 +00:00
aOldRange.aStart.Col(), aOldRange.aStart.Row(), aOldRange.aStart.Tab() );
OSL_ENSURE(pSourceObj, "DPObject not found");
2000-09-18 16:07:07 +00:00
}
ScDBDocFunc aFunc( *pDocShell );
aFunc.DataPilotUpdate( pSourceObj, pNewDPObject, false, false, bAllowMove ); // no new undo action
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoDataPilot::Repeat(SfxRepeatTarget& /* rTarget */)
2000-09-18 16:07:07 +00:00
{
//! allow deletion
}
bool ScUndoDataPilot::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2000-09-18 16:07:07 +00:00
{
//! allow deletion
return false;
2000-09-18 16:07:07 +00:00
}
ScUndoConsolidate::ScUndoConsolidate( ScDocShell* pNewDocShell, const ScArea& rArea,
const ScConsolidateParam& rPar, ScDocument* pNewUndoDoc,
bool bReference, SCROW nInsCount, ScOutlineTable* pTab,
2000-09-18 16:07:07 +00:00
ScDBData* pData ) :
ScSimpleUndo( pNewDocShell ),
aDestArea( rArea ),
pUndoDoc( pNewUndoDoc ),
aParam( rPar ),
2000-09-18 16:07:07 +00:00
bInsRef( bReference ),
nInsertCount( nInsCount ),
pUndoTab( pTab ),
pUndoData( pData )
{
}
2010-12-11 23:25:30 +01:00
ScUndoConsolidate::~ScUndoConsolidate()
2000-09-18 16:07:07 +00:00
{
delete pUndoDoc;
delete pUndoTab;
delete pUndoData;
}
OUString ScUndoConsolidate::GetComment() const
2000-09-18 16:07:07 +00:00
{
return ScGlobal::GetRscString( STR_UNDO_CONSOLIDATE );
}
2010-12-11 23:25:30 +01:00
void ScUndoConsolidate::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
ScDocument& rDoc = pDocShell->GetDocument();
SCTAB nTab = aDestArea.nTab;
2000-09-18 16:07:07 +00:00
ScRange aOldRange;
if (pUndoData)
pUndoData->GetArea(aOldRange);
if (bInsRef)
{
rDoc.DeleteRow( 0,nTab, MAXCOL,nTab, aDestArea.nRowStart, nInsertCount );
rDoc.SetOutlineTable( nTab, pUndoTab );
2000-09-18 16:07:07 +00:00
// Row status
pUndoDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, false, &rDoc );
2000-09-18 16:07:07 +00:00
// Data and references
rDoc.DeleteAreaTab( 0,aDestArea.nRowStart, MAXCOL,aDestArea.nRowEnd, nTab, IDF_ALL );
2000-09-18 16:07:07 +00:00
pUndoDoc->UndoToDocument( 0, aDestArea.nRowStart, nTab,
MAXCOL, aDestArea.nRowEnd, nTab,
IDF_ALL, false, &rDoc );
2000-09-18 16:07:07 +00:00
// Original range
2000-09-18 16:07:07 +00:00
if (pUndoData)
{
rDoc.DeleteAreaTab(aOldRange, IDF_ALL);
pUndoDoc->CopyToDocument(aOldRange, IDF_ALL, false, &rDoc);
2000-09-18 16:07:07 +00:00
}
pDocShell->PostPaint( 0,aDestArea.nRowStart,nTab, MAXCOL,MAXROW,nTab,
PAINT_GRID | PAINT_LEFT | PAINT_SIZE );
}
else
{
rDoc.DeleteAreaTab( aDestArea.nColStart,aDestArea.nRowStart,
2000-09-18 16:07:07 +00:00
aDestArea.nColEnd,aDestArea.nRowEnd, nTab, IDF_ALL );
pUndoDoc->CopyToDocument( aDestArea.nColStart, aDestArea.nRowStart, nTab,
aDestArea.nColEnd, aDestArea.nRowEnd, nTab,
IDF_ALL, false, &rDoc );
2000-09-18 16:07:07 +00:00
// Original range
2000-09-18 16:07:07 +00:00
if (pUndoData)
{
rDoc.DeleteAreaTab(aOldRange, IDF_ALL);
pUndoDoc->CopyToDocument(aOldRange, IDF_ALL, false, &rDoc);
2000-09-18 16:07:07 +00:00
}
SCCOL nEndX = aDestArea.nColEnd;
SCROW nEndY = aDestArea.nRowEnd;
2000-09-18 16:07:07 +00:00
if ( pUndoData )
{
if ( aOldRange.aEnd.Col() > nEndX )
nEndX = aOldRange.aEnd.Col();
if ( aOldRange.aEnd.Row() > nEndY )
nEndY = aOldRange.aEnd.Row();
}
pDocShell->PostPaint( aDestArea.nColStart, aDestArea.nRowStart, nTab,
nEndX, nEndY, nTab, PAINT_GRID );
}
// Adjust Database range again
2000-09-18 16:07:07 +00:00
if (pUndoData)
{
ScDBCollection* pColl = rDoc.GetDBCollection();
2000-09-18 16:07:07 +00:00
if (pColl)
{
ScDBData* pDocData = pColl->getNamedDBs().findByUpperName(pUndoData->GetUpperName());
if (pDocData)
*pDocData = *pUndoData;
2000-09-18 16:07:07 +00:00
}
}
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
{
SCTAB nViewTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nViewTab != nTab )
pViewShell->SetTabNo( nTab );
}
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoConsolidate::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
pDocShell->DoConsolidate( aParam, false );
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
if (pViewShell)
{
SCTAB nViewTab = pViewShell->GetViewData().GetTabNo();
2000-09-18 16:07:07 +00:00
if ( nViewTab != aParam.nTab )
pViewShell->SetTabNo( aParam.nTab );
}
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoConsolidate::Repeat(SfxRepeatTarget& /* rTarget */)
2000-09-18 16:07:07 +00:00
{
}
bool ScUndoConsolidate::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2000-09-18 16:07:07 +00:00
{
return false;
2000-09-18 16:07:07 +00:00
}
// Change source data of Chart
2000-09-18 16:07:07 +00:00
void ScUndoChartData::Init()
{
ScDocument& rDoc = pDocShell->GetDocument();
aOldRangeListRef = new ScRangeList;
rDoc.GetOldChartParameters( aChartName, *aOldRangeListRef, bOldColHeaders, bOldRowHeaders );
2000-09-18 16:07:07 +00:00
}
ScUndoChartData::ScUndoChartData( ScDocShell* pNewDocShell, const OUString& rName,
2011-11-05 07:00:32 +01:00
const ScRange& rNew, bool bColHdr, bool bRowHdr,
bool bAdd ) :
2000-09-18 16:07:07 +00:00
ScSimpleUndo( pNewDocShell ),
aChartName( rName ),
bNewColHeaders( bColHdr ),
bNewRowHeaders( bRowHdr ),
bAddRange( bAdd )
{
aNewRangeListRef = new ScRangeList;
aNewRangeListRef->Append( rNew );
Init();
}
ScUndoChartData::ScUndoChartData( ScDocShell* pNewDocShell, const OUString& rName,
2011-11-05 07:00:32 +01:00
const ScRangeListRef& rNew, bool bColHdr, bool bRowHdr,
bool bAdd ) :
2000-09-18 16:07:07 +00:00
ScSimpleUndo( pNewDocShell ),
aChartName( rName ),
aNewRangeListRef( rNew ),
bNewColHeaders( bColHdr ),
bNewRowHeaders( bRowHdr ),
bAddRange( bAdd )
{
Init();
}
2010-12-11 23:25:30 +01:00
ScUndoChartData::~ScUndoChartData()
2000-09-18 16:07:07 +00:00
{
}
OUString ScUndoChartData::GetComment() const
2000-09-18 16:07:07 +00:00
{
return ScGlobal::GetRscString( STR_UNDO_CHARTDATA );
}
2010-12-11 23:25:30 +01:00
void ScUndoChartData::Undo()
2000-09-18 16:07:07 +00:00
{
BeginUndo();
pDocShell->GetDocument().UpdateChartArea( aChartName, aOldRangeListRef,
bOldColHeaders, bOldRowHeaders, false );
2000-09-18 16:07:07 +00:00
EndUndo();
}
2010-12-11 23:25:30 +01:00
void ScUndoChartData::Redo()
2000-09-18 16:07:07 +00:00
{
BeginRedo();
pDocShell->GetDocument().UpdateChartArea( aChartName, aNewRangeListRef,
bNewColHeaders, bNewRowHeaders, bAddRange );
2000-09-18 16:07:07 +00:00
EndRedo();
}
2010-12-11 23:25:30 +01:00
void ScUndoChartData::Repeat(SfxRepeatTarget& /* rTarget */)
2000-09-18 16:07:07 +00:00
{
}
bool ScUndoChartData::CanRepeat(SfxRepeatTarget& /* rTarget */) const
2000-09-18 16:07:07 +00:00
{
return false;
2000-09-18 16:07:07 +00:00
}
ScUndoDataForm::ScUndoDataForm( ScDocShell* pNewDocShell,
SCCOL nStartX, SCROW nStartY, SCTAB nStartZ,
SCCOL nEndX, SCROW nEndY, SCTAB nEndZ,
const ScMarkData& rMark,
ScDocument* pNewUndoDoc, ScDocument* pNewRedoDoc,
InsertDeleteFlags nNewFlags,
ScRefUndoData* pRefData,
void* /*pFill1*/, void* /*pFill2*/, void* /*pFill3*/,
bool bRedoIsFilled ) :
ScBlockUndo( pNewDocShell, ScRange( nStartX, nStartY, nStartZ, nEndX, nEndY, nEndZ ), SC_UNDO_SIMPLE ),
mpMarkData(new ScMarkData(rMark)),
pUndoDoc( pNewUndoDoc ),
pRedoDoc( pNewRedoDoc ),
nFlags( nNewFlags ),
pRefUndoData( pRefData ),
pRefRedoData( NULL ),
bRedoFilled( bRedoIsFilled )
{
// pFill1,pFill2,pFill3 are there so the ctor calls for simple paste (without cutting)
// don't have to be changed and branched for 641.
// They can be removed later.
if (!mpMarkData->IsMarked()) // no cell marked:
mpMarkData->SetMarkArea(aBlockRange); // mark paste block
if ( pRefUndoData )
pRefUndoData->DeleteUnchanged( &pDocShell->GetDocument() );
SetChangeTrack();
}
ScUndoDataForm::~ScUndoDataForm()
{
delete pUndoDoc;
delete pRedoDoc;
delete pRefUndoData;
delete pRefRedoData;
}
OUString ScUndoDataForm::GetComment() const
{
return ScGlobal::GetRscString( STR_UNDO_PASTE );
}
void ScUndoDataForm::SetChangeTrack()
{
ScChangeTrack* pChangeTrack = pDocShell->GetDocument().GetChangeTrack();
if ( pChangeTrack && (nFlags & IDF_CONTENTS) )
pChangeTrack->AppendContentRange( aBlockRange, pUndoDoc,
nStartChangeAction, nEndChangeAction, SC_CACM_PASTE );
else
nStartChangeAction = nEndChangeAction = 0;
}
void ScUndoDataForm::Undo()
{
BeginUndo();
DoChange( true );
ShowTable( aBlockRange );
EndUndo();
SfxGetpApp()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
}
void ScUndoDataForm::Redo()
{
BeginRedo();
ScDocument& rDoc = pDocShell->GetDocument();
EnableDrawAdjust( &rDoc, false ); //! include in ScBlockUndo?
DoChange( false );
EnableDrawAdjust( &rDoc, true ); //! include in ScBlockUndo?
EndRedo();
SfxGetpApp()->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
}
void ScUndoDataForm::Repeat(SfxRepeatTarget& /*rTarget*/)
{
}
bool ScUndoDataForm::CanRepeat(SfxRepeatTarget& rTarget) const
{
return (rTarget.ISA(ScTabViewTarget));
}
void ScUndoDataForm::DoChange( const bool bUndo )
{
ScDocument& rDoc = pDocShell->GetDocument();
// RefUndoData for redo is created before first undo
// (with DeleteUnchanged after the DoUndo call)
bool bCreateRedoData = ( bUndo && pRefUndoData && !pRefRedoData );
if ( bCreateRedoData )
pRefRedoData = new ScRefUndoData( &rDoc );
ScRefUndoData* pWorkRefData = bUndo ? pRefUndoData : pRefRedoData;
// Always back-up either all or none of the content for Undo
InsertDeleteFlags nUndoFlags = IDF_NONE;
if (nFlags & IDF_CONTENTS)
nUndoFlags |= IDF_CONTENTS;
if (nFlags & IDF_ATTRIB)
nUndoFlags |= IDF_ATTRIB;
2000-09-18 16:07:07 +00:00
bool bPaintAll = false;
2000-09-18 16:07:07 +00:00
ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
SCTAB nTabCount = rDoc.GetTableCount();
if ( bUndo && !bRedoFilled )
{
if (!pRedoDoc)
{
bool bColInfo = ( aBlockRange.aStart.Row()==0 && aBlockRange.aEnd.Row()==MAXROW );
bool bRowInfo = ( aBlockRange.aStart.Col()==0 && aBlockRange.aEnd.Col()==MAXCOL );
pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
pRedoDoc->InitUndoSelected( &rDoc, *mpMarkData, bColInfo, bRowInfo );
}
// read "redo" data from the document in the first undo
// all sheets - CopyToDocument skips those that don't exist in pRedoDoc
ScRange aCopyRange = aBlockRange;
aCopyRange.aStart.SetTab(0);
aCopyRange.aEnd.SetTab(nTabCount-1);
rDoc.CopyToDocument( aCopyRange, IDF_VALUE, false, pRedoDoc );
bRedoFilled = true;
}
sal_uInt16 nExtFlags = 0;
pDocShell->UpdatePaintExt( nExtFlags, aBlockRange );
for ( sal_uInt16 i=0; i <= ( aBlockRange.aEnd.Col() - aBlockRange.aStart.Col() ); i++ )
{
OUString aOldString = pUndoDoc->GetString(
aBlockRange.aStart.Col()+i, aBlockRange.aStart.Row(), aBlockRange.aStart.Tab());
rDoc.SetString( aBlockRange.aStart.Col()+i , aBlockRange.aStart.Row() , aBlockRange.aStart.Tab() , aOldString );
}
if (pWorkRefData)
{
pWorkRefData->DoUndo( &rDoc, true ); // TRUE = bSetChartRangeLists for SetChartListenerCollection
if ( rDoc.RefreshAutoFilter( 0,0, MAXCOL,MAXROW, aBlockRange.aStart.Tab() ) )
bPaintAll = true;
}
if ( bCreateRedoData && pRefRedoData )
pRefRedoData->DeleteUnchanged( &rDoc );
if ( bUndo )
{
ScChangeTrack* pChangeTrack = rDoc.GetChangeTrack();
if ( pChangeTrack )
pChangeTrack->Undo( nStartChangeAction, nEndChangeAction );
}
else
SetChangeTrack();
ScRange aDrawRange( aBlockRange );
rDoc.ExtendMerge( aDrawRange, true ); // only needed for single sheet (text/rtf etc.)
sal_uInt16 nPaint = PAINT_GRID;
if (bPaintAll)
{
aDrawRange.aStart.SetCol(0);
aDrawRange.aStart.SetRow(0);
aDrawRange.aEnd.SetCol(MAXCOL);
aDrawRange.aEnd.SetRow(MAXROW);
nPaint |= PAINT_TOP | PAINT_LEFT;
/*A*/ if (pViewShell)
pViewShell->AdjustBlockHeight(false);
}
else
{
if ( aBlockRange.aStart.Row() == 0 && aBlockRange.aEnd.Row() == MAXROW ) // whole column
{
nPaint |= PAINT_TOP;
aDrawRange.aEnd.SetCol(MAXCOL);
}
if ( aBlockRange.aStart.Col() == 0 && aBlockRange.aEnd.Col() == MAXCOL ) // whole row
{
nPaint |= PAINT_LEFT;
aDrawRange.aEnd.SetRow(MAXROW);
}
/*A*/ if ((pViewShell) && pViewShell->AdjustBlockHeight(false))
{
aDrawRange.aStart.SetCol(0);
aDrawRange.aStart.SetRow(0);
aDrawRange.aEnd.SetCol(MAXCOL);
aDrawRange.aEnd.SetRow(MAXROW);
nPaint |= PAINT_LEFT;
}
pDocShell->UpdatePaintExt( nExtFlags, aDrawRange );
}
2000-09-18 16:07:07 +00:00
if ( !bUndo ) // draw redo after updating row heights
RedoSdrUndoAction( pDrawUndo ); //! include in ScBlockUndo?
2000-09-18 16:07:07 +00:00
pDocShell->PostPaint( aDrawRange, nPaint, nExtFlags );
2000-09-18 16:07:07 +00:00
pDocShell->PostDataChanged();
if (pViewShell)
pViewShell->CellContentChanged();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */