[Libreoffice-commits] core.git: sc/CppunitTest_sc_condformats.mk sc/inc sc/qa sc/source
Henry Castro
hcastro at collabora.com
Fri Apr 3 00:32:52 PDT 2015
sc/CppunitTest_sc_condformats.mk | 2
sc/inc/drwlayer.hxx | 14 ++++
sc/inc/sc.hrc | 5 +
sc/qa/extras/sccondformats.cxx | 110 +++++++++++++++++++++++++++++++++++++++
sc/source/core/data/drwlayer.cxx | 43 +++++++++++++++
sc/source/ui/src/scstring.src | 10 +++
sc/source/ui/view/drawvie3.cxx | 10 +++
7 files changed, 194 insertions(+)
New commits:
commit bff29a3b30c8e57ab78937dca862fd738f26d89e
Author: Henry Castro <hcastro at collabora.com>
Date: Fri Feb 13 20:22:04 2015 -0400
tdf#51460 Calc fails to set undo step after changing image anchor mode
Fixed. Note that the undo button is still grayed out. Calc has not set an undo step.
Change-Id: I7ff713a906b365b460351e5202161c9152542395
Reviewed-on: https://gerrit.libreoffice.org/14489
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/sc/CppunitTest_sc_condformats.mk b/sc/CppunitTest_sc_condformats.mk
index 0ee259e..799306a 100644
--- a/sc/CppunitTest_sc_condformats.mk
+++ b/sc/CppunitTest_sc_condformats.mk
@@ -33,6 +33,8 @@ $(eval $(call gb_CppunitTest_use_libraries,sc_condformats, \
salhelper \
sax \
sb \
+ sc \
+ scqahelper \
sfx \
sot \
subsequenttest \
diff --git a/sc/inc/drwlayer.hxx b/sc/inc/drwlayer.hxx
index 6917c2a..4d355b9 100644
--- a/sc/inc/drwlayer.hxx
+++ b/sc/inc/drwlayer.hxx
@@ -76,6 +76,20 @@ public:
virtual void Redo() SAL_OVERRIDE;
};
+class ScUndoAnchorData : public SdrUndoObj
+{
+private:
+ bool mbWasCellAnchored;
+ ScDocument* mpDoc;
+ SCTAB mnTab;
+public:
+ ScUndoAnchorData( SdrObject* pObj, ScDocument* pDoc, SCTAB nTab );
+ virtual ~ScUndoAnchorData();
+
+ virtual void Undo() SAL_OVERRIDE;
+ virtual void Redo() SAL_OVERRIDE;
+};
+
class SC_DLLPUBLIC ScDrawLayer : public FmFormModel
{
private:
diff --git a/sc/inc/sc.hrc b/sc/inc/sc.hrc
index f76a45a..242d8e8 100644
--- a/sc/inc/sc.hrc
+++ b/sc/inc/sc.hrc
@@ -908,6 +908,11 @@
#define STR_CELL (STR_START + 219)
#define STR_CONTENT (STR_START + 220)
+// Undo Anchor
+
+#define SCSTR_UNDO_PAGE_ANCHOR (STR_START + 221)
+#define SCSTR_UNDO_CELL_ANCHOR (STR_START + 222)
+
// navigator - in the same order as SC_CONTENT_...
#define SCSTR_CONTENT_ROOT (STR_START + 250)
#define SCSTR_CONTENT_TABLE (STR_START + 251)
diff --git a/sc/qa/extras/sccondformats.cxx b/sc/qa/extras/sccondformats.cxx
index 4a664c4..8b6f666 100644
--- a/sc/qa/extras/sccondformats.cxx
+++ b/sc/qa/extras/sccondformats.cxx
@@ -8,6 +8,9 @@
*/
#include <test/calc_unoapi_test.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdpage.hxx>
+#include <sfx2/dispatch.hxx>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/sheet/ConditionOperator.hpp>
@@ -17,6 +20,11 @@
#include <com/sun/star/table/CellAddress.hpp>
#include <unonames.hxx>
+#include "tabvwsh.hxx"
+#include "docsh.hxx"
+
+#include "sc.hrc"
+
using namespace css;
namespace sc_apitest {
@@ -33,9 +41,11 @@ public:
uno::Reference< uno::XInterface > init();
void testCondFormat();
+ void testUndoAnchor();
CPPUNIT_TEST_SUITE(ScConditionalFormatTest);
CPPUNIT_TEST(testCondFormat);
+ CPPUNIT_TEST(testUndoAnchor);
CPPUNIT_TEST_SUITE_END();
private:
@@ -110,6 +120,106 @@ void ScConditionalFormatTest::testCondFormat()
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xSheetConditionalEntries->getCount());
}
+void ScConditionalFormatTest::testUndoAnchor()
+{
+ const OString sFailedMessage = OString("Failed on :");
+ OUString aFileURL;
+ createFileURL(OUString("document_with_linked_graphic.ods"), aFileURL);
+ // open the document with graphic included
+ uno::Reference< com::sun::star::lang::XComponent > xComponent = loadFromDesktop(aFileURL);
+ CPPUNIT_ASSERT(xComponent.is());
+
+ // Get the document model
+ SfxObjectShell* pFoundShell = SfxObjectShell::GetShellFromComponent(xComponent);
+ CPPUNIT_ASSERT_MESSAGE("Failed to access document shell", pFoundShell);
+
+ ScDocShell* xDocSh = dynamic_cast<ScDocShell*>(pFoundShell);
+ CPPUNIT_ASSERT(xDocSh != NULL);
+
+ // Check whether graphic imported well
+ ScDocument& rDoc = xDocSh->GetDocument();
+ ScDrawLayer* pDrawLayer = rDoc.GetDrawLayer();
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pDrawLayer != NULL );
+
+ const SdrPage *pPage = pDrawLayer->GetPage(0);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pPage != NULL );
+
+ SdrGrafObj* pObject = dynamic_cast<SdrGrafObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pObject != NULL );
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pObject->IsLinkedGraphic() );
+
+ const GraphicObject& rGraphicObj = pObject->GetGraphicObject(true);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), !rGraphicObj.IsSwappedOut());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), GRAPHIC_BITMAP, rGraphicObj.GetGraphic().GetType());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), sal_uLong(864900), rGraphicObj.GetSizeBytes());
+
+ // Get the document controller
+ ScTabViewShell* pViewShell = xDocSh->GetBestViewShell(false);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pViewShell != NULL );
+
+ // Get the draw view of the document
+ ScDrawView* pDrawView = pViewShell->GetViewData().GetScDrawView();
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pDrawView != NULL );
+
+ // Select graphic object
+ pDrawView->MarkNextObj(false);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), pDrawView->AreObjectsMarked() );
+
+ // Set Cell Anchor
+ ScDrawLayer::SetCellAnchoredFromPosition(*pObject, rDoc, 0);
+ // Check state
+ ScAnchorType oldType = ScDrawLayer::GetAnchorType(*pObject);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), oldType == SCA_CELL );
+
+ // Change all selected objects to page anchor
+ pViewShell->GetViewData().GetDispatcher().Execute(SID_ANCHOR_PAGE);
+ // Check state
+ ScAnchorType newType = ScDrawLayer::GetAnchorType(*pObject);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), newType == SCA_PAGE );
+
+ // Undo and check its result.
+ SfxUndoManager* pUndoMgr = rDoc.GetUndoManager();
+ CPPUNIT_ASSERT(pUndoMgr);
+ pUndoMgr->Undo();
+
+ // Check anchor type
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), oldType == ScDrawLayer::GetAnchorType(*pObject) );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), GRAPHIC_BITMAP, rGraphicObj.GetGraphic().GetType());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), sal_uLong(864900), rGraphicObj.GetSizeBytes());
+
+ pUndoMgr->Redo();
+
+ // Check anchor type
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), newType == ScDrawLayer::GetAnchorType(*pObject) );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), GRAPHIC_BITMAP, rGraphicObj.GetGraphic().GetType());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), sal_uLong(864900), rGraphicObj.GetSizeBytes());
+
+ ScDrawLayer::SetPageAnchored(*pObject);
+ // Check state
+ oldType = ScDrawLayer::GetAnchorType(*pObject);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), oldType == SCA_PAGE );
+
+ // Change all selected objects to cell anchor
+ pViewShell->GetViewData().GetDispatcher().Execute(SID_ANCHOR_CELL);
+ // Check state
+ newType = ScDrawLayer::GetAnchorType(*pObject);
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), newType == SCA_CELL );
+
+ pUndoMgr->Undo();
+
+ // Check anchor type
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), oldType == ScDrawLayer::GetAnchorType(*pObject) );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), GRAPHIC_BITMAP, rGraphicObj.GetGraphic().GetType());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), sal_uLong(864900), rGraphicObj.GetSizeBytes());
+
+ pUndoMgr->Redo();
+
+ // Check anchor type
+ CPPUNIT_ASSERT_MESSAGE( sFailedMessage.getStr(), newType == ScDrawLayer::GetAnchorType(*pObject) );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), GRAPHIC_BITMAP, rGraphicObj.GetGraphic().GetType());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( sFailedMessage.getStr(), sal_uLong(864900), rGraphicObj.GetSizeBytes());
+}
+
void ScConditionalFormatTest::setUp()
{
nTest++;
diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx
index 1ec9d13..e70254a 100644
--- a/sc/source/core/data/drwlayer.cxx
+++ b/sc/source/core/data/drwlayer.cxx
@@ -129,6 +129,49 @@ void ScUndoObjData::Redo()
}
}
+ScUndoAnchorData::ScUndoAnchorData( SdrObject* pObjP, ScDocument* pDoc, SCTAB nTab ) :
+ SdrUndoObj( *pObjP ),
+ mpDoc( pDoc ),
+ mnTab( nTab )
+{
+ mbWasCellAnchored = ScDrawLayer::IsCellAnchored( *pObjP );
+}
+
+ScUndoAnchorData::~ScUndoAnchorData()
+{
+}
+
+void ScUndoAnchorData::Undo()
+{
+ // Trigger Object Change
+ if(pObj && pObj->IsInserted() && pObj->GetPage() && pObj->GetModel())
+ {
+ SdrHint aHint(*pObj);
+ pObj->GetModel()->Broadcast(aHint);
+ }
+
+ if (mbWasCellAnchored)
+ ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *mpDoc, mnTab);
+ else
+ ScDrawLayer::SetPageAnchored( *pObj );
+}
+
+void ScUndoAnchorData::Redo()
+{
+ if (mbWasCellAnchored)
+ ScDrawLayer::SetPageAnchored( *pObj );
+ else
+ ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *mpDoc, mnTab);
+
+ // Trigger Object Change
+ if(pObj && pObj->IsInserted() && pObj->GetPage() && pObj->GetModel())
+ {
+ SdrHint aHint(*pObj);
+ pObj->GetModel()->Broadcast(aHint);
+ }
+}
+
+
ScTabDeletedHint::ScTabDeletedHint( SCTAB nTabNo ) :
nTab( nTabNo )
{
diff --git a/sc/source/ui/src/scstring.src b/sc/source/ui/src/scstring.src
index 8b9c6e1..91ef6c5 100644
--- a/sc/source/ui/src/scstring.src
+++ b/sc/source/ui/src/scstring.src
@@ -907,4 +907,14 @@ String STR_CONTENT
Text [ en-US ] = "Content" ;
};
+String SCSTR_UNDO_PAGE_ANCHOR
+{
+ Text [ en-US ] = "Page Anchor" ;
+};
+
+String SCSTR_UNDO_CELL_ANCHOR
+{
+ Text [ en-US ] = "Cell Anchor" ;
+};
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/view/drawvie3.cxx b/sc/source/ui/view/drawvie3.cxx
index f0b1835..74ad8e6 100644
--- a/sc/source/ui/view/drawvie3.cxx
+++ b/sc/source/ui/view/drawvie3.cxx
@@ -22,6 +22,8 @@
#include <sfx2/app.hxx>
#include <sfx2/viewfrm.hxx>
+#include "sc.hrc"
+#include "scresid.hxx"
#include "drawview.hxx"
#include "drwlayer.hxx"
#include "imapwrap.hxx"
@@ -59,11 +61,15 @@ void ScDrawView::SetPageAnchored()
{
const SdrMarkList* pMark = &GetMarkedObjectList();
const size_t nCount = pMark->GetMarkCount();
+
+ BegUndo( OUString(ScResId( SCSTR_UNDO_PAGE_ANCHOR )) );
for( size_t i=0; i<nCount; ++i )
{
SdrObject* pObj = pMark->GetMark(i)->GetMarkedSdrObj();
+ AddUndo (new ScUndoAnchorData( pObj, pDoc, nTab ));
ScDrawLayer::SetPageAnchored( *pObj );
}
+ EndUndo();
if ( pViewData )
pViewData->GetDocShell()->SetDrawModified();
@@ -83,11 +89,15 @@ void ScDrawView::SetCellAnchored()
{
const SdrMarkList* pMark = &GetMarkedObjectList();
const size_t nCount = pMark->GetMarkCount();
+
+ BegUndo( OUString(ScResId( SCSTR_UNDO_CELL_ANCHOR )) );
for( size_t i=0; i<nCount; ++i )
{
SdrObject* pObj = pMark->GetMark(i)->GetMarkedSdrObj();
+ AddUndo (new ScUndoAnchorData( pObj, pDoc, nTab ));
ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *pDoc, nTab);
}
+ EndUndo();
if ( pViewData )
pViewData->GetDocShell()->SetDrawModified();
More information about the Libreoffice-commits
mailing list