[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-4.2' - sc/inc sc/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Thu May 1 12:41:08 PDT 2014


 sc/inc/globstr.hrc                |    4 ++
 sc/source/ui/docshell/docfunc.cxx |   40 +++++++++++++++++++++++++++--
 sc/source/ui/inc/undoblk.hxx      |   22 ++++++++++++++++
 sc/source/ui/src/globstr.src      |    4 ++
 sc/source/ui/undo/undoblk.cxx     |   52 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 119 insertions(+), 3 deletions(-)

New commits:
commit c5c5b68fbf8165ba0614fd1f8fd7f8a642e408a8
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Wed Apr 23 05:23:50 2014 +0200

    add undo action for conditional formatting, cp#1000050, fdo#77381
    
    Conflicts:
    	sc/inc/globstr.hrc
    	sc/source/ui/src/globstr.src
    
    Change-Id: I11db1e5824077135c4352ae43cc0e8d139244268

diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc
index f02ef51..4f5b351 100644
--- a/sc/inc/globstr.hrc
+++ b/sc/inc/globstr.hrc
@@ -694,7 +694,9 @@
 #define STR_CTRLCLICKHYPERLINK      526
 #define STR_CLICKHYPERLINK          527
 
-#define SC_GLOBSTR_STR_COUNT        528     /**< the count of permanently resident strings */
+#define STR_UNDO_CONDFORMAT         528
+
+#define SC_GLOBSTR_STR_COUNT        529     /**< the count of permanently resident strings */
 
 #endif
 
diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx
index bcb45b6..2ce4ab8 100644
--- a/sc/source/ui/docshell/docfunc.cxx
+++ b/sc/source/ui/docshell/docfunc.cxx
@@ -5329,6 +5329,31 @@ void ScDocFunc::ReplaceConditionalFormat( sal_uLong nOldFormat, ScConditionalFor
     if(pDoc->IsTabProtected(nTab))
         return;
 
+    bool bUndo = pDoc->IsUndoEnabled();
+    ScDocument* pUndoDoc = NULL;
+    ScRange aCombinedRange = rRanges.Combine();
+    ScRange aCompleteRange;
+    if(bUndo)
+    {
+        pUndoDoc = new ScDocument(SCDOCMODE_UNDO);
+        pUndoDoc->InitUndo( pDoc, nTab, nTab );
+
+        if(pFormat)
+        {
+            aCompleteRange = aCombinedRange;
+        }
+        if(nOldFormat)
+        {
+            ScConditionalFormat* pOldFormat = pDoc->GetCondFormList(nTab)->GetFormat(nOldFormat);
+            if(pOldFormat)
+                aCompleteRange.ExtendTo(pOldFormat->GetRange().Combine());
+        }
+
+        pDoc->CopyToDocument( aCompleteRange.aStart.Col(),aCompleteRange.aStart.Row(),nTab,
+                aCompleteRange.aEnd.Col(),aCompleteRange.aEnd.Row(),nTab,
+                IDF_ALL, false, pUndoDoc );
+    }
+
     boost::scoped_ptr<ScRange> pRepaintRange;
     if(nOldFormat)
     {
@@ -5345,9 +5370,9 @@ void ScDocFunc::ReplaceConditionalFormat( sal_uLong nOldFormat, ScConditionalFor
     if(pFormat)
     {
         if(pRepaintRange)
-            pRepaintRange->ExtendTo(rRanges.Combine());
+            pRepaintRange->ExtendTo(aCombinedRange);
         else
-            pRepaintRange.reset(new ScRange(rRanges.Combine()));
+            pRepaintRange.reset(new ScRange(aCombinedRange));
 
 	sal_uLong nIndex = pDoc->AddCondFormat(pFormat, nTab);
 
@@ -5355,6 +5380,17 @@ void ScDocFunc::ReplaceConditionalFormat( sal_uLong nOldFormat, ScConditionalFor
         pDoc->SetStreamValid(nTab, false);
     }
 
+    if(bUndo)
+    {
+        ScDocument* pRedoDoc = new ScDocument(SCDOCMODE_UNDO);
+        pRedoDoc->InitUndo( pDoc, nTab, nTab );
+        pDoc->CopyToDocument( aCompleteRange.aStart.Col(),aCompleteRange.aStart.Row(),nTab,
+                aCompleteRange.aEnd.Col(),aCompleteRange.aEnd.Row(),nTab,
+                IDF_ALL, false, pRedoDoc );
+        rDocShell.GetUndoManager()->AddUndoAction(
+                new ScUndoConditionalFormat(&rDocShell, pUndoDoc, pRedoDoc, aCompleteRange));
+    }
+
     if(pRepaintRange)
         rDocShell.PostPaint(*pRepaintRange, PAINT_GRID);
 
diff --git a/sc/source/ui/inc/undoblk.hxx b/sc/source/ui/inc/undoblk.hxx
index 758e5bb..36bf058 100644
--- a/sc/source/ui/inc/undoblk.hxx
+++ b/sc/source/ui/inc/undoblk.hxx
@@ -637,6 +637,28 @@ private:
     void            DoChange( ScDocument* pSrcDoc ) const;
 };
 
+class ScUndoConditionalFormat : public ScSimpleUndo
+{
+public:
+    TYPEINFO_OVERRIDE();
+    ScUndoConditionalFormat( ScDocShell* pNewDocShell,
+            ScDocument* pUndoDoc, ScDocument* pRedoDoc, const ScRange& rRange);
+    virtual         ~ScUndoConditionalFormat();
+
+    virtual void    Undo() SAL_OVERRIDE;
+    virtual void    Redo() SAL_OVERRIDE;
+    virtual void    Repeat(SfxRepeatTarget& rTarget) SAL_OVERRIDE;
+    virtual bool    CanRepeat(SfxRepeatTarget& rTarget) const SAL_OVERRIDE;
+
+    virtual OUString GetComment() const SAL_OVERRIDE;
+
+private:
+    void DoChange(ScDocument* pDoc);
+    boost::scoped_ptr<ScDocument> mpUndoDoc;
+    boost::scoped_ptr<ScDocument> mpRedoDoc;
+    ScRange maRange;
+};
+
 
 class ScUndoUseScenario: public ScSimpleUndo
 {
diff --git a/sc/source/ui/src/globstr.src b/sc/source/ui/src/globstr.src
index ee46a95..839ecdb 100644
--- a/sc/source/ui/src/globstr.src
+++ b/sc/source/ui/src/globstr.src
@@ -2081,6 +2081,10 @@ Resource RID_GLOBSTR
     {
         Text [ en-US ] = "click to open hyperlink:";
     };
+    String STR_UNDO_CONDFORMAT
+    {
+        Text [ en-US ] = "Conditional Format";
+    };
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/undo/undoblk.cxx b/sc/source/ui/undo/undoblk.cxx
index cb4f25a..e0697ba 100644
--- a/sc/source/ui/undo/undoblk.cxx
+++ b/sc/source/ui/undo/undoblk.cxx
@@ -60,6 +60,7 @@ TYPEINIT1(ScUndoCut,                ScBlockUndo);
 TYPEINIT1(ScUndoPaste,              SfxUndoAction);
 TYPEINIT1(ScUndoDragDrop,           SfxUndoAction);
 TYPEINIT1(ScUndoListNames,          SfxUndoAction);
+TYPEINIT1(ScUndoConditionalFormat,  SfxUndoAction);
 TYPEINIT1(ScUndoUseScenario,        SfxUndoAction);
 TYPEINIT1(ScUndoSelectionStyle,     SfxUndoAction);
 TYPEINIT1(ScUndoEnterMatrix,        ScBlockUndo);
@@ -1433,6 +1434,57 @@ bool ScUndoListNames::CanRepeat(SfxRepeatTarget& rTarget) const
     return rTarget.ISA(ScTabViewTarget);
 }
 
+ScUndoConditionalFormat::ScUndoConditionalFormat(ScDocShell* pNewDocShell,
+        ScDocument* pUndoDoc, ScDocument* pRedoDoc, const ScRange& rRange):
+    ScSimpleUndo( pNewDocShell ),
+    mpUndoDoc(pUndoDoc),
+    mpRedoDoc(pRedoDoc),
+    maRange(rRange)
+{
+}
+
+ScUndoConditionalFormat::~ScUndoConditionalFormat()
+{
+}
+
+OUString ScUndoConditionalFormat::GetComment() const
+{
+    return ScGlobal::GetRscString( STR_UNDO_CONDFORMAT );
+}
+
+void ScUndoConditionalFormat::Undo()
+{
+    DoChange(mpUndoDoc.get());
+}
+
+void ScUndoConditionalFormat::Redo()
+{
+    DoChange(mpRedoDoc.get());
+}
+
+void ScUndoConditionalFormat::DoChange(ScDocument* pSrcDoc)
+{
+    ScDocument* pDoc = pDocShell->GetDocument();
+
+    pDoc->DeleteAreaTab( maRange, IDF_ALL );
+    pSrcDoc->CopyToDocument( maRange, IDF_ALL, false, pDoc );
+    pDocShell->PostPaint( maRange, PAINT_GRID );
+    pDocShell->PostDataChanged();
+    ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
+    if (pViewShell)
+        pViewShell->CellContentChanged();
+}
+
+void ScUndoConditionalFormat::Repeat(SfxRepeatTarget& )
+{
+}
+
+bool ScUndoConditionalFormat::CanRepeat(SfxRepeatTarget& ) const
+{
+    return false;
+}
+
+
 ScUndoUseScenario::ScUndoUseScenario( ScDocShell* pNewDocShell,
                         const ScMarkData& rMark,
 /*C*/                   const ScArea& rDestArea,


More information about the Libreoffice-commits mailing list