summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@suse.com>2011-09-09 18:09:47 -0400
committerKohei Yoshida <kohei.yoshida@suse.com>2011-09-12 13:22:04 -0400
commit6a3a25fa40ac9a7f1f579c3fb114cbcc9ed158db (patch)
tree576d29895b3ece36b750e44a9ae34d6f10887eb0 /sc
parent90f571cf964edea8ce6f6e37aeb1c36a8adfd226 (diff)
ScMultiBlockUndo in place.
Diffstat (limited to 'sc')
-rw-r--r--sc/source/ui/inc/undobase.hxx20
-rw-r--r--sc/source/ui/undo/undobase.cxx101
2 files changed, 121 insertions, 0 deletions
diff --git a/sc/source/ui/inc/undobase.hxx b/sc/source/ui/inc/undobase.hxx
index 701378430d2d..6f4135c9c8d4 100644
--- a/sc/source/ui/inc/undobase.hxx
+++ b/sc/source/ui/inc/undobase.hxx
@@ -94,6 +94,26 @@ protected:
void ShowBlock();
};
+class ScMultiBlockUndo: public ScSimpleUndo
+{
+public:
+ ScMultiBlockUndo(ScDocShell* pDocSh, const ScRangeList& rRanges,
+ ScBlockUndoMode eBlockMode);
+ virtual ~ScMultiBlockUndo();
+
+protected:
+ ScRangeList maBlockRanges;
+ SdrUndoAction* mpDrawUndo;
+ ScBlockUndoMode meMode;
+
+ void BeginUndo();
+ void EndUndo();
+ void EndRedo();
+
+ void AdjustHeight();
+ void ShowBlock();
+};
+
//----------------------------------------------------------------------------
// for functions that act on a database range - takes care of the unnamed database range
diff --git a/sc/source/ui/undo/undobase.cxx b/sc/source/ui/undo/undobase.cxx
index 0fddef5bc43a..42487b2f5dd0 100644
--- a/sc/source/ui/undo/undobase.cxx
+++ b/sc/source/ui/undo/undobase.cxx
@@ -280,6 +280,107 @@ void ScBlockUndo::ShowBlock()
}
}
+ScMultiBlockUndo::ScMultiBlockUndo(
+ ScDocShell* pDocSh, const ScRangeList& rRanges, ScBlockUndoMode eBlockMode) :
+ ScSimpleUndo(pDocSh),
+ maBlockRanges(rRanges),
+ meMode(eBlockMode)
+{
+ mpDrawUndo = GetSdrUndoAction( pDocShell->GetDocument() );
+}
+
+ScMultiBlockUndo::~ScMultiBlockUndo()
+{
+ DeleteSdrUndoAction( mpDrawUndo );
+}
+
+void ScMultiBlockUndo::BeginUndo()
+{
+ ScSimpleUndo::BeginUndo();
+ EnableDrawAdjust(pDocShell->GetDocument(), false);
+}
+
+void ScMultiBlockUndo::EndUndo()
+{
+ if (meMode == SC_UNDO_AUTOHEIGHT)
+ AdjustHeight();
+
+ EnableDrawAdjust(pDocShell->GetDocument(), true);
+ DoSdrUndoAction(mpDrawUndo, pDocShell->GetDocument());
+
+ ShowBlock();
+ ScSimpleUndo::EndUndo();
+}
+
+void ScMultiBlockUndo::EndRedo()
+{
+ if (meMode == SC_UNDO_AUTOHEIGHT)
+ AdjustHeight();
+
+ ShowBlock();
+ ScSimpleUndo::EndRedo();
+}
+
+void ScMultiBlockUndo::AdjustHeight()
+{
+ ScDocument* pDoc = pDocShell->GetDocument();
+
+ VirtualDevice aVirtDev;
+ Fraction aZoomX( 1, 1 );
+ Fraction aZoomY = aZoomX;
+ double nPPTX, nPPTY;
+ ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
+ if (pViewShell)
+ {
+ ScViewData* pData = pViewShell->GetViewData();
+ nPPTX = pData->GetPPTX();
+ nPPTY = pData->GetPPTY();
+ aZoomX = pData->GetZoomX();
+ aZoomY = pData->GetZoomY();
+ }
+ else
+ {
+ // Zoom auf 100 lassen
+ nPPTX = ScGlobal::nScreenPPTX;
+ nPPTY = ScGlobal::nScreenPPTY;
+ }
+
+ for (size_t i = 0, n = maBlockRanges.size(); i < n; ++i)
+ {
+ const ScRange& r = *maBlockRanges[i];
+ bool bRet = pDoc->SetOptimalHeight(
+ r.aStart.Row(), r.aEnd.Row(), r.aStart.Tab(), 0, &aVirtDev,
+ nPPTX, nPPTY, aZoomX, aZoomY, false);
+
+ if (bRet)
+ pDocShell->PostPaint(
+ 0, r.aStart.Row(), r.aStart.Tab(), MAXCOL, MAXROW, r.aEnd.Tab(),
+ PAINT_GRID | PAINT_LEFT);
+ }
+}
+
+void ScMultiBlockUndo::ShowBlock()
+{
+ if ( IsPaintLocked() )
+ return;
+
+ ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
+ if (!pViewShell)
+ return;
+
+ if (maBlockRanges.empty())
+ return;
+
+ // Show the very first range.
+ ScRange aRange = *maBlockRanges[0];
+ ShowTable(aRange);
+ pViewShell->MoveCursorAbs(
+ aRange.aStart.Col(), aRange.aStart.Row(), SC_FOLLOW_JUMP, false, false);
+ SCTAB nTab = pViewShell->GetViewData()->GetTabNo();
+ aRange.aStart.SetTab(nTab);
+ aRange.aEnd.SetTab(nTab);
+ pViewShell->MarkRange(aRange);
+}
// -----------------------------------------------------------------------