diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2012-03-28 03:24:47 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2012-03-28 03:35:22 +0200 |
commit | 5d8c9ef5e5945fd166a9e0793b7d31ed679742d4 (patch) | |
tree | d67d039166dea1abaabb8b17dfb49c90a03f481e /chart2/source | |
parent | 74b274602a5a76b949f6d1a521b343688693090b (diff) |
implement the layout dumper for chart2
Diffstat (limited to 'chart2/source')
-rw-r--r-- | chart2/source/model/main/ChartModel.cxx | 5 | ||||
-rw-r--r-- | chart2/source/model/main/ChartModel.hxx | 1 | ||||
-rw-r--r-- | chart2/source/view/main/ChartView.cxx | 113 | ||||
-rw-r--r-- | chart2/source/view/main/ChartView.hxx | 10 |
4 files changed, 127 insertions, 2 deletions
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx index c23dba72d22b..9b67d81d15c6 100644 --- a/chart2/source/model/main/ChartModel.cxx +++ b/chart2/source/model/main/ChartModel.cxx @@ -1357,6 +1357,11 @@ uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > SAL_CALL ChartM rtl::OUString SAL_CALL ChartModel::dump() throw (uno::RuntimeException) { + uno::Reference< qa::XDumper > xDumper( + this->createInstance( CHART_VIEW_SERVICE_NAME ), uno::UNO_QUERY ); + if (xDumper.is()) + return xDumper->dump(); + return rtl::OUString(); } diff --git a/chart2/source/model/main/ChartModel.hxx b/chart2/source/model/main/ChartModel.hxx index 40b1dbdebcee..b3bc2eb06656 100644 --- a/chart2/source/model/main/ChartModel.hxx +++ b/chart2/source/model/main/ChartModel.hxx @@ -51,6 +51,7 @@ #include <com/sun/star/chart2/data/XDataSource.hpp> #include <com/sun/star/chart2/XChartTypeTemplate.hpp> #include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/qa/XDumper.hpp> // public API #include <com/sun/star/chart2/data/XDataProvider.hpp> diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 9297cef1b779..250f1c8bcddc 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -97,6 +97,9 @@ #include <com/sun/star/util/XModifiable.hpp> #include <com/sun/star/util/XRefreshable.hpp> #include <com/sun/star/util/NumberFormat.hpp> +#include <com/sun/star/awt/Size.hpp> +#include <com/sun/star/awt/Point.hpp> +#include <com/sun/star/drawing/XShapeDescriptor.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> #include <com/sun/star/text/XTextDocument.hpp> @@ -106,6 +109,13 @@ #include <svl/languageoptions.hxx> #include <sot/clsids.hxx> +#include <rtl/strbuf.hxx> +#include <rtl/oustringostreaminserter.hxx> + +//libxml2 for dumping +#include <libxml/xmlwriter.h> + + //............................................................................. namespace chart { @@ -3015,6 +3025,109 @@ uno::Sequence< ::rtl::OUString > ChartView::getAvailableServiceNames() throw (un return aServiceNames; } +namespace { + +#define DEBUG_DUMPER 0 + +int writeCallback(void* pContext, const char* sBuffer, int nLen) +{ + rtl::OStringBuffer* pBuffer = static_cast<rtl::OStringBuffer*>(pContext); + pBuffer->append(sBuffer); + return nLen; +} + +int closeCallback(void* ) +{ + return 0; +} + +void dumpPositionAsAttribute(const awt::Point& rPoint, xmlTextWriterPtr xmlWriter) +{ + xmlTextWriterWriteFormatAttribute(xmlWriter, BAD_CAST("position"), "%i,%i", rPoint.X, rPoint.Y); +} + +void dumpSizeAsAttribute(const awt::Size& rSize, xmlTextWriterPtr xmlWriter) +{ + xmlTextWriterWriteFormatAttribute(xmlWriter, BAD_CAST("size"), "%ix%i", rSize.Width, rSize.Height); +} + +void dumpShapeDescriptorAsAttribute( uno::Reference< drawing::XShapeDescriptor > xDescr, xmlTextWriterPtr xmlWriter ) +{ + xmlTextWriterWriteFormatAttribute(xmlWriter, BAD_CAST("type"), "%s", rtl::OUStringToOString(xDescr->getShapeType(), RTL_TEXTENCODING_UTF8).getStr()); +} + +void dumpXShapes( uno::Reference< drawing::XShapes > xShapes, xmlTextWriterPtr xmlWriter ); + +void dumpXShape( uno::Reference< drawing::XShape > xShape, xmlTextWriterPtr xmlWriter ) +{ + xmlTextWriterStartElement( xmlWriter, BAD_CAST( "XShape" ) ); + + dumpPositionAsAttribute(xShape->getPosition(), xmlWriter); + dumpSizeAsAttribute(xShape->getSize(), xmlWriter); + uno::Reference< drawing::XShapeDescriptor > xDescr(xShape, uno::UNO_QUERY_THROW); + dumpShapeDescriptorAsAttribute(xDescr, xmlWriter); + + uno::Reference< lang::XServiceInfo > xServiceInfo( xShape, uno::UNO_QUERY_THROW ); + uno::Sequence< rtl::OUString > aServiceNames = xServiceInfo->getSupportedServiceNames(); + sal_Int32 nServices = aServiceNames.getLength(); + for (sal_Int32 i = 0; i < nServices; ++i) + { + if (aServiceNames[i].equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.GroupShape"))) + { + uno::Reference< drawing::XShapes > xShapes(xShape, uno::UNO_QUERY_THROW); + dumpXShapes(xShapes, xmlWriter); + } +#if DEBUG_DUMPER + xmlTextWriterStartElement(xmlWriter, BAD_CAST( "ServiceName" )); + xmlTextWriterWriteFormatAttribute(xmlWriter, BAD_CAST( "name" ), "%s", rtl::OUStringToOString(aServiceNames[i], RTL_TEXTENCODING_UTF8).getStr()); + xmlTextWriterEndElement( xmlWriter ); +#endif + } + + xmlTextWriterEndElement( xmlWriter ); +} + +void dumpXShapes( uno::Reference< drawing::XShapes > xShapes, xmlTextWriterPtr xmlWriter ) +{ + xmlTextWriterStartElement( xmlWriter, BAD_CAST( "XShapes" ) ); + uno::Reference< container::XIndexAccess > xIA( xShapes, uno::UNO_QUERY_THROW); + sal_Int32 nLength = xIA->getCount(); + for (sal_Int32 i = 0; i < nLength; ++i) + { + uno::Reference< drawing::XShape > xShape( xIA->getByIndex( i ), uno::UNO_QUERY_THROW ); + dumpXShape( xShape, xmlWriter ); + } + + xmlTextWriterEndElement( xmlWriter ); +} + +} + +rtl::OUString ChartView::dump() throw (uno::RuntimeException) +{ + impl_updateView(); + uno::Reference<drawing::XShapes> xPageShapes( ShapeFactory(m_xShapeFactory) + .getOrCreateChartRootShape( m_xDrawPage ) ); + + if (!xPageShapes.is()) + return rtl::OUString(); + + rtl::OStringBuffer aString; + xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO( writeCallback, closeCallback, &aString, NULL ); + xmlTextWriterPtr xmlWriter = xmlNewTextWriter( xmlOutBuffer ); + xmlTextWriterSetIndent( xmlWriter, 1 ); + + xmlTextWriterStartDocument( xmlWriter, NULL, NULL, NULL ); + + dumpXShapes( xPageShapes, xmlWriter ); + + xmlTextWriterEndDocument( xmlWriter ); + xmlFreeTextWriter( xmlWriter ); + + + return OStringToOUString(aString.makeStringAndClear(), RTL_TEXTENCODING_UTF8); +} + //............................................................................. } //namespace chart //............................................................................. diff --git a/chart2/source/view/main/ChartView.hxx b/chart2/source/view/main/ChartView.hxx index 32beb467e791..8321c038f0d7 100644 --- a/chart2/source/view/main/ChartView.hxx +++ b/chart2/source/view/main/ChartView.hxx @@ -30,7 +30,7 @@ #include "chartview/ExplicitValueProvider.hxx" #include "ServiceMacros.hxx" -#include <cppuhelper/implbase9.hxx> +#include <cppuhelper/implbase10.hxx> #include <cppuhelper/interfacecontainer.hxx> // header for class SfxListener @@ -47,6 +47,7 @@ #include <com/sun/star/util/XModifyListener.hpp> #include <com/sun/star/util/XModeChangeBroadcaster.hpp> #include <com/sun/star/util/XUpdatable.hpp> +#include <com/sun/star/qa/XDumper.hpp> #include <vector> #include <boost/shared_ptr.hpp> @@ -70,7 +71,7 @@ The view than changes to state dirty. The view can be updated with call 'update' The View is not responsible to handle single user events (that is instead done by the ChartWindow). */ -class ChartView : public ::cppu::WeakImplHelper9< +class ChartView : public ::cppu::WeakImplHelper10< ::com::sun::star::lang::XInitialization , ::com::sun::star::lang::XServiceInfo , ::com::sun::star::datatransfer::XTransferable @@ -84,6 +85,7 @@ class ChartView : public ::cppu::WeakImplHelper9< ,::com::sun::star::util::XUpdatable ,::com::sun::star::beans::XPropertySet ,::com::sun::star::lang::XMultiServiceFactory + ,::com::sun::star::qa::XDumper > , public ExplicitValueProvider , private SfxListener @@ -182,6 +184,10 @@ public: virtual ::sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< ::sal_Int8 >& aIdentifier ) throw (::com::sun::star::uno::RuntimeException); + // XDumper + virtual rtl::OUString SAL_CALL dump() + throw(::com::sun::star::uno::RuntimeException); + private: //methods ChartView(); |