Kaydet (Commit) 1f159a4d authored tarafından Miklos Vajna's avatar Miklos Vajna

tdf#115873 sd navigator: adapt IsEqualToDoc() to Fill() further

SdPageObjsTLB::Fill() populates the navigator tree list box,
SdPageObjsTLB::IsEqualToDoc() determintes if it has to be refreshed or
not.

Commit f3c68cdf (tdf#115873 sd
navigator: allow selecting but not focusing on objects, 2018-02-21)
already brought IsEqualToDoc() closer to Fill() with using the same
iteration mode for the SdrObjects, but that's not enough.

Fill() uses flat iteration, then checks for group shapes explicitly and
visits them recursively. Change IsEqualToDoc() to do the same, this way
selecting "Rectangle 3" in the testcase won't result in a jump back to
"Slide 1" (as an effect of IsEqualToDoc() returning false for an up to
date tree list box).

Change-Id: If2543cbc282af06ba43d4804e7ed455c8b9828cd
Reviewed-on: https://gerrit.libreoffice.org/50234Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: 's avatarJenkins <ci@libreoffice.org>
üst aae1b8f4
<?xml version="1.0" encoding="UTF-8"?>
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.presentation">
<office:automatic-styles>
<style:style style:name="dp1" style:family="drawing-page">
</style:style>
<style:style style:name="gr1" style:family="graphic" style:parent-style-name="standard">
<style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="2.15cm" fo:min-width="1.3cm"/>
</style:style>
<style:style style:name="gr2" style:family="graphic" style:parent-style-name="standard">
<style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="1.55cm" fo:min-width="1.3cm"/>
</style:style>
<style:style style:name="gr3" style:family="graphic" style:parent-style-name="standard">
<style:graphic-properties draw:textarea-horizontal-align="justify" draw:textarea-vertical-align="middle" draw:auto-grow-height="false" fo:min-height="1.55cm" fo:min-width="2.1cm"/>
</style:style>
</office:automatic-styles>
<office:body>
<office:presentation>
<draw:page draw:name="page1" draw:style-name="dp1">
<draw:g draw:name="Group 1">
<draw:custom-shape draw:name="Rectangle 1" draw:style-name="gr1" draw:layer="layout" svg:width="1.8cm" svg:height="2.4cm" svg:x="2.8cm" svg:y="2.8cm">
<text:p/>
<draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
</draw:custom-shape>
<draw:custom-shape draw:name="Rectangle 2" draw:style-name="gr2" draw:layer="layout" svg:width="1.8cm" svg:height="1.8cm" svg:x="6cm" svg:y="3.2cm">
<text:p/>
<draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
</draw:custom-shape>
</draw:g>
<draw:custom-shape draw:name="Rectangle 3" draw:style-name="gr3" draw:layer="layout" svg:width="2.6cm" svg:height="1.8cm" svg:x="4.6cm" svg:y="7.4cm">
<text:p/>
<draw:enhanced-geometry svg:viewBox="0 0 21600 21600" draw:type="rectangle" draw:enhanced-path="M 0 0 L 21600 0 21600 21600 0 21600 0 0 Z N"/>
</draw:custom-shape>
</draw:page>
</office:presentation>
</office:body>
</office:document>
......@@ -113,6 +113,7 @@ public:
void testTdf115783();
void testPasteTextOnSlide();
void testTdf115873();
void testTdf115873Group();
CPPUNIT_TEST_SUITE(SdTiledRenderingTest);
CPPUNIT_TEST(testRegisterCallback);
......@@ -157,6 +158,7 @@ public:
CPPUNIT_TEST(testTdf115783);
CPPUNIT_TEST(testPasteTextOnSlide);
CPPUNIT_TEST(testTdf115873);
CPPUNIT_TEST(testTdf115873Group);
CPPUNIT_TEST_SUITE_END();
......@@ -2160,6 +2162,21 @@ void SdTiledRenderingTest::testTdf115873()
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), rMarkList.GetMarkCount());
}
void SdTiledRenderingTest::testTdf115873Group()
{
// Initialize the navigator.
SdXImpressDocument* pXImpressDocument = createDoc("tdf115873-group.fodp");
SfxViewShell* pViewShell = SfxViewShell::Current();
CPPUNIT_ASSERT(pViewShell);
SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
ScopedVclPtrInstance<SdNavigatorWin> pNavigator(nullptr, &rBindings);
pNavigator->InitTreeLB(pXImpressDocument->GetDoc());
VclPtr<SdPageObjsTLB> pObjects = pNavigator->GetObjects();
// This failed, Fill() and IsEqualToDoc() were out of sync for group
// shapes.
CPPUNIT_ASSERT(pObjects->IsEqualToDoc(pXImpressDocument->GetDoc()));
}
CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest);
CPPUNIT_PLUGIN_IMPLEMENT();
......
......@@ -629,6 +629,52 @@ void SdPageObjsTLB::SetShowAllShapes (
}
}
bool SdPageObjsTLB::IsEqualToShapeList(SvTreeListEntry*& pEntry, const SdrObjList& rList,
const OUString& rListName)
{
if (!pEntry)
return false;
OUString aName = GetEntryText(pEntry);
if (rListName != aName)
return false;
pEntry = Next(pEntry);
SdrObjListIter aIter(rList,
!rList.HasObjectNavigationOrder() /* use navigation order, if available */,
SdrIterMode::Flat);
while (aIter.IsMore())
{
SdrObject* pObj = aIter.Next();
const OUString aObjectName(GetObjectName(pObj));
if (!aObjectName.isEmpty())
{
if (!pEntry)
return false;
aName = GetEntryText(pEntry);
if (aObjectName != aName)
return false;
if (pObj->IsGroupObject())
{
bool bRet = IsEqualToShapeList(pEntry, *pObj->GetSubList(), aObjectName);
if (!bRet)
return false;
}
else
pEntry = Next(pEntry);
}
}
return true;
}
/**
* Checks if the pages (PageKind::Standard) of a doc and the objects on the pages
* are identical to the TreeLB.
......@@ -643,9 +689,7 @@ bool SdPageObjsTLB::IsEqualToDoc( const SdDrawDocument* pInDoc )
if( !mpDoc )
return false;
SdrObject* pObj = nullptr;
SvTreeListEntry* pEntry = First();
OUString aName;
// compare all pages including the objects
sal_uInt16 nPage = 0;
......@@ -656,39 +700,9 @@ bool SdPageObjsTLB::IsEqualToDoc( const SdDrawDocument* pInDoc )
const SdPage* pPage = static_cast<const SdPage*>( mpDoc->GetPage( nPage ) );
if( pPage->GetPageKind() == PageKind::Standard )
{
if( !pEntry )
return false;
aName = GetEntryText( pEntry );
if( pPage->GetName() != aName )
bool bRet = IsEqualToShapeList(pEntry, *pPage, pPage->GetName());
if (!bRet)
return false;
pEntry = Next( pEntry );
SdrObjListIter aIter(
*pPage,
!pPage->HasObjectNavigationOrder() /* use navigation order, if available */,
SdrIterMode::Flat );
while( aIter.IsMore() )
{
pObj = aIter.Next();
const OUString aObjectName( GetObjectName( pObj ) );
if( !aObjectName.isEmpty() )
{
if( !pEntry )
return false;
aName = GetEntryText( pEntry );
if( aObjectName != aName )
return false;
pEntry = Next( pEntry );
}
}
}
nPage++;
}
......
......@@ -205,6 +205,9 @@ public:
bool GetShowAllShapes() const { return mbShowAllShapes;}
bool IsNavigationGrabsFocus() const { return mbNavigationGrabsFocus; }
bool IsEqualToDoc( const SdDrawDocument* pInDoc );
/// Visits rList recursively and tries to advance pEntry accordingly.
bool IsEqualToShapeList(SvTreeListEntry*& pEntry, const SdrObjList& rList,
const OUString& rListName);
bool HasSelectedChildren( const OUString& rName );
bool SelectEntry( const OUString& rName );
OUString GetSelectedEntry();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment