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

oox: ignore SmartArt "fallback" with empty shape list

This way at least something shows up in the import result. Far from
perfect, though.

Change-Id: Iae5a073d458598e7b5059ebdf435d50ce7c7df80
Reviewed-on: https://gerrit.libreoffice.org/61925Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins
üst a51c1829
......@@ -39,7 +39,8 @@ void loadDiagram( ShapePtr const & pShape,
const OUString& rDataModelPath,
const OUString& rLayoutPath,
const OUString& rQStylePath,
const OUString& rColorStylePath );
const OUString& rColorStylePath,
const oox::core::Relations& rRelations );
void loadDiagram( const ShapePtr& pShape,
core::XmlFilterBase& rFilter,
......
......@@ -31,6 +31,7 @@
#include <drawingml/fillproperties.hxx>
#include <oox/ppt/pptshapegroupcontext.hxx>
#include <oox/ppt/pptshape.hxx>
#include <oox/token/namespaces.hxx>
#include "diagramlayoutatoms.hxx"
#include "layoutatomvisitors.hxx"
......@@ -376,12 +377,57 @@ static void importFragment( core::XmlFilterBase& rFilter,
rFilter.importFragment( rxHandler, xSerializer );
}
namespace
{
/**
* A fragment handler that just counts the number of <dsp:sp> elements in a
* fragment.
*/
class DiagramShapeCounter : public oox::core::FragmentHandler2
{
public:
DiagramShapeCounter(oox::core::XmlFilterBase& rFilter, const OUString& rFragmentPath,
sal_Int32& nCounter);
oox::core::ContextHandlerRef onCreateContext(sal_Int32 nElement,
const AttributeList& rAttribs) override;
private:
sal_Int32& m_nCounter;
};
DiagramShapeCounter::DiagramShapeCounter(oox::core::XmlFilterBase& rFilter,
const OUString& rFragmentPath, sal_Int32& nCounter)
: FragmentHandler2(rFilter, rFragmentPath)
, m_nCounter(nCounter)
{
}
oox::core::ContextHandlerRef DiagramShapeCounter::onCreateContext(sal_Int32 nElement,
const AttributeList& /*rAttribs*/)
{
switch (nElement)
{
case DSP_TOKEN(drawing):
case DSP_TOKEN(spTree):
return this;
case DSP_TOKEN(sp):
++m_nCounter;
break;
default:
break;
}
return nullptr;
}
}
void loadDiagram( ShapePtr const & pShape,
core::XmlFilterBase& rFilter,
const OUString& rDataModelPath,
const OUString& rLayoutPath,
const OUString& rQStylePath,
const OUString& rColorStylePath )
const OUString& rColorStylePath,
const oox::core::Relations& rRelations )
{
DiagramPtr pDiagram( new Diagram );
......@@ -408,11 +454,26 @@ void loadDiagram( ShapePtr const & pShape,
// Pass the info to pShape
for (auto const& extDrawing : pData->getExtDrawings())
pShape->addExtDrawingRelId(extDrawing);
{
OUString aFragmentPath = rRelations.getFragmentPathFromRelId(extDrawing);
// Ignore RelIds which don't resolve to a fragment path.
if (aFragmentPath.isEmpty())
continue;
sal_Int32 nCounter = 0;
rtl::Reference<core::FragmentHandler> xCounter(
new DiagramShapeCounter(rFilter, aFragmentPath, nCounter));
rFilter.importFragment(xCounter);
// Ignore ext drawings which don't actually have any shapes.
if (nCounter == 0)
continue;
pShape->addExtDrawingRelId(extDrawing);
}
}
// extLst is present, lets bet on that and ignore the rest of the data from here
if( pData->getExtDrawings().empty() )
if( pShape->getExtDrawings().empty() )
{
// layout
if( !rLayoutPath.isEmpty() )
......
......@@ -263,7 +263,8 @@ ContextHandlerRef DiagramGraphicDataContext::onCreateContext( ::sal_Int32 aEleme
getFragmentPathFromRelId( msDm ),
getFragmentPathFromRelId( msLo ),
getFragmentPathFromRelId( msQs ),
getFragmentPathFromRelId( msCs ));
getFragmentPathFromRelId( msCs ),
getRelations());
SAL_INFO("oox.drawingml", "DiagramGraphicDataContext::onCreateContext: added shape " << mpShapePtr->getName()
<< " of type " << mpShapePtr->getServiceName()
<< ", position: " << mpShapePtr->getPosition().X
......
......@@ -49,6 +49,7 @@ bool QuickDiagrammingImport::importDocument()
Reference<drawing::XShapes> xParentShape(getParentShape(),
UNO_QUERY_THROW);
oox::core::Relations aRelations("");
oox::drawingml::ShapePtr pShape(
new oox::drawingml::Shape( "com.sun.star.drawing.DiagramShape" ) );
drawingml::loadDiagram(pShape,
......@@ -56,7 +57,8 @@ bool QuickDiagrammingImport::importDocument()
"",
aFragmentPath,
"",
"");
"",
aRelations);
oox::drawingml::ThemePtr pTheme(
new oox::drawingml::Theme());
basegfx::B2DHomMatrix aMatrix;
......
......@@ -40,6 +40,7 @@ public:
void testEquation();
void testSegmentedCycle();
void testBaseRtoL();
void testVertialBoxList();
CPPUNIT_TEST_SUITE(SdImportTestSmartArt);
......@@ -64,6 +65,7 @@ public:
CPPUNIT_TEST(testEquation);
CPPUNIT_TEST(testSegmentedCycle);
CPPUNIT_TEST(testBaseRtoL);
CPPUNIT_TEST(testVertialBoxList);
CPPUNIT_TEST_SUITE_END();
};
......@@ -359,6 +361,19 @@ void SdImportTestSmartArt::testBaseRtoL()
xDocShRef->DoClose();
}
void SdImportTestSmartArt::testVertialBoxList()
{
sd::DrawDocShellRef xDocShRef = loadURL(
m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/smartart-vertial-box-list.pptx"), PPTX);
uno::Reference<drawing::XShapes> xShapeGroup(getShapeFromPage(0, 0, xDocShRef),
uno::UNO_QUERY_THROW);
// Without the accompanying fix in place, this test would have failed with
// 'actual: 0'.
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xShapeGroup->getCount());
xDocShRef->DoClose();
}
CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTestSmartArt);
CPPUNIT_PLUGIN_IMPLEMENT();
......
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