20#include <libxml/xmlwriter.h>
28#include <bitmaps.hlst>
36#include <com/sun/star/chart2/XChartDocument.hpp>
37#include <com/sun/star/chart2/XCoordinateSystem.hpp>
38#include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
39#include <com/sun/star/chart2/XDiagram.hpp>
40#include <com/sun/star/chart2/XChartTypeContainer.hpp>
41#include <com/sun/star/chart2/XChartType.hpp>
44#include <com/sun/star/util/CloseVetoException.hpp>
45#include <com/sun/star/util/XModifyListener.hpp>
46#include <com/sun/star/util/XModifiable.hpp>
47#include <com/sun/star/embed/Aspects.hpp>
48#include <com/sun/star/embed/EmbedStates.hpp>
49#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
50#include <com/sun/star/embed/XEmbeddedObject.hpp>
51#include <com/sun/star/embed/XStateChangeListener.hpp>
52#include <com/sun/star/embed/XLinkageSupport.hpp>
53#include <com/sun/star/chart2/XDefaultSizeTransmitter.hpp>
54#include <com/sun/star/qa/XDumper.hpp>
68class EmbedEventListener_Impl :
public ::cppu::WeakImplHelper < embed::XStateChangeListener,
69 document::XEventListener,
70 util::XModifyListener,
71 util::XCloseListener >
77 explicit EmbedEventListener_Impl( EmbeddedObjectRef* p ) :
84 virtual void SAL_CALL changingState(
const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState )
override;
85 virtual void SAL_CALL stateChanged(
const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState )
override;
86 virtual void SAL_CALL queryClosing(
const lang::EventObject& Source,
sal_Bool GetsOwnership )
override;
87 virtual void SAL_CALL notifyClosing(
const lang::EventObject& Source )
override;
88 virtual void SAL_CALL notifyEvent(
const document::EventObject& aEvent )
override;
89 virtual void SAL_CALL disposing(
const lang::EventObject& aEvent )
override;
90 virtual void SAL_CALL modified(
const css::lang::EventObject& aEvent )
override;
99 if (
p->GetObject().is() )
101 p->GetObject()->addStateChangeListener( pRet );
103 uno::Reference < util::XCloseable > xClose =
p->GetObject();
104 DBG_ASSERT( xClose.is(),
"Object does not support XCloseable!" );
106 xClose->addCloseListener( pRet );
108 uno::Reference < document::XEventBroadcaster > xBrd =
p->GetObject();
110 xBrd->addEventListener( pRet );
112 pRet->nState =
p->GetObject()->getCurrentState();
113 if ( pRet->nState == embed::EmbedStates::RUNNING )
115 uno::Reference < util::XModifiable > xMod(
p->GetObject()->getComponent(), uno::UNO_QUERY );
118 xMod->addModifyListener( pRet );
125void SAL_CALL EmbedEventListener_Impl::changingState(
const lang::EventObject&,
131void SAL_CALL EmbedEventListener_Impl::stateChanged(
const lang::EventObject&,
132 ::sal_Int32 nOldState,
133 ::sal_Int32 nNewState )
140 uno::Reference < util::XModifiable > xMod(
pObject->
GetObject()->getComponent(), uno::UNO_QUERY );
141 if ( nNewState == embed::EmbedStates::RUNNING )
143 bool bProtected =
false;
152 && nOldState != embed::EmbedStates::LOADED && !
pObject->
IsChart() && !bProtected)
156 if(
pObject->
IsChart() && nOldState == embed::EmbedStates::UI_ACTIVE )
160 if( xMod.is() && !xMod->isModified() )
164 if ( xMod.is() && nOldState == embed::EmbedStates::LOADED )
166 xMod->addModifyListener(
this );
168 else if ( nNewState == embed::EmbedStates::LOADED )
172 xMod->removeModifyListener(
this );
176void SAL_CALL EmbedEventListener_Impl::modified(
const lang::EventObject& )
182 if (
nState == embed::EmbedStates::RUNNING )
190 else if (
nState == embed::EmbedStates::ACTIVE ||
191 nState == embed::EmbedStates::UI_ACTIVE ||
192 nState == embed::EmbedStates::INPLACE_ACTIVE )
199void SAL_CALL EmbedEventListener_Impl::notifyEvent(
const document::EventObject& aEvent )
209void SAL_CALL EmbedEventListener_Impl::queryClosing(
const lang::EventObject& Source,
sal_Bool )
215 throw util::CloseVetoException();
218void SAL_CALL EmbedEventListener_Impl::notifyClosing(
const lang::EventObject& Source )
227void SAL_CALL EmbedEventListener_Impl::disposing(
const lang::EventObject& aEvent )
238 uno::Reference <embed::XEmbeddedObject>
mxObj;
284 (void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"EmbeddedObjectRef_Impl"));
285 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST(
"ptr"),
"%p",
this);
287 (void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"mxObj"));
288 (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST(
"symbol"),
289 BAD_CAST(
typeid(*mxObj).name()));
290 css::uno::Reference<css::qa::XDumper> pComponent(
291 mxObj->getComponent(), css::uno::UNO_QUERY);
294 auto const s = pComponent->dump(
"");
296 (void)xmlTextWriterWriteRawLen(
297 pWriter,
reinterpret_cast<xmlChar
const *
>(s1.getStr()), s1.getLength());
299 (void)xmlTextWriterEndElement(pWriter);
301 (void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"pGraphic"));
302 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST(
"ptr"),
"%p",
oGraphic ? &*
oGraphic :
nullptr);
305 (void)xmlTextWriterWriteAttribute(
306 pWriter, BAD_CAST(
"is-none"),
307 BAD_CAST(OString::boolean(
oGraphic->IsNone()).getStr()));
309 (void)xmlTextWriterEndElement(pWriter);
311 (void)xmlTextWriterEndElement(pWriter);
330 mpImpl->nViewAspect = nAspect;
332 mpImpl->mxListener = EmbedEventListener_Impl::Create(
this );
338 mpImpl->mxListener = EmbedEventListener_Impl::Create(
this );
348 DBG_ASSERT(!
mpImpl->mxObj.is(),
"Never assign an already assigned object!");
351 mpImpl->nViewAspect = nAspect;
353 mpImpl->mxListener = EmbedEventListener_Impl::Create(
this );
358 uno::Reference < chart2::XDefaultSizeTransmitter > xSizeTransmitter( xObj, uno::UNO_QUERY );
359 DBG_ASSERT( xSizeTransmitter.is(),
"Object does not support XDefaultSizeTransmitter -> will cause #i103460#!" );
360 if( xSizeTransmitter.is() )
361 xSizeTransmitter->setDefaultSize(
mpImpl->aDefaultSizeForChart_In_100TH_MM );
369 mpImpl->mxObj->removeStateChangeListener(
mpImpl->mxListener);
371 mpImpl->mxObj->removeCloseListener(
mpImpl->mxListener );
372 mpImpl->mxObj->removeEventListener(
mpImpl->mxListener );
378 mpImpl->mxObj->changeState(embed::EmbedStates::LOADED);
379 mpImpl->mxObj->close(
true );
381 catch (
const util::CloseVetoException&)
385 catch (
const uno::Exception&)
387 TOOLS_WARN_EXCEPTION(
"svtools.misc",
"Error on switching of the object to loaded state and closing");
392 if (
mpImpl->mxListener.is())
394 mpImpl->mxListener->pObject =
nullptr;
395 mpImpl->mxListener.clear();
399 mpImpl->pContainer =
nullptr;
400 mpImpl->bIsLocked =
false;
401 mpImpl->bNeedUpdate =
false;
406 return mpImpl->mxObj.is();
411 mpImpl->pContainer = pContainer;
412 mpImpl->aPersistName = rPersistName;
414 if (
mpImpl->oGraphic && !
mpImpl->bNeedUpdate && pContainer )
420 return mpImpl->pContainer;
425 return mpImpl->nViewAspect;
430 mpImpl->nViewAspect = nAspect;
435 mpImpl->bIsLocked = bLock;
445 mpImpl->m_aIsProtectedHdl = rProtectedHdl;
450 return mpImpl->m_aIsProtectedHdl;
460 aOldGraphic = *
mpImpl->oGraphic;
463 mpImpl->aMediaType.clear();
464 mpImpl->oGraphic.emplace();
465 mpImpl->mnGraphicVersion++;
467 else if ( !
mpImpl->oGraphic )
469 mpImpl->oGraphic.emplace();
470 mpImpl->mnGraphicVersion++;
474 OSL_FAIL(
"No update, but replacement exists already!");
479 if (!pGraphicStream && aOldGraphic.
IsNone())
485 "EmbeddedObjectRef::GetReplacement: failed to get updated graphic stream");
488 if ( pGraphicStream )
493 mpImpl->mnGraphicVersion++;
498 if (bUpdate && (!
mpImpl->oGraphic ||
mpImpl->oGraphic->IsNone()) && !aOldGraphic.
IsNone())
503 mpImpl->oGraphic.emplace(aOldGraphic);
504 SAL_WARN(
"svtools.misc",
"EmbeddedObjectRef::GetReplacement: failed to update graphic");
512 if (
mpImpl->bNeedUpdate )
515 else if ( !
mpImpl->oGraphic )
518 catch(
const uno::Exception& )
528 MapMode aSourceMapMode( MapUnit::Map100thMM );
531 if (
mpImpl->nViewAspect == embed::Aspects::MSOLE_ICON )
540 aResult =
Size( 2500, 2500 );
550 aSize =
mpImpl->mxObj->getVisualAreaSize(
mpImpl->nViewAspect);
552 catch(
const embed::NoVisualAreaSizeException&)
554 SAL_WARN(
"svtools.misc",
"EmbeddedObjectRef::GetSize: no visual area size");
556 catch (
const uno::Exception&)
558 TOOLS_WARN_EXCEPTION(
"svtools.misc",
"Something went wrong on getting of the size of the object");
565 catch (
const uno::Exception&)
571 if ( !aSize.Height && !aSize.Width )
573 SAL_WARN(
"svtools.misc",
"EmbeddedObjectRef::GetSize: empty size, defaulting to 5x5cm");
578 aResult =
Size( aSize.Width, aSize.Height );
581 if ( pTargetMapMode )
588 const OUString& rMediaType )
590 mpImpl->oGraphic.emplace();
591 mpImpl->aMediaType = rMediaType;
592 mpImpl->mnGraphicVersion++;
596 if ( pGraphicStream )
600 mpImpl->mnGraphicVersion++;
604 pGraphicStream->Seek( 0 );
605 uno::Reference< io::XInputStream > xInSeekGrStream = new ::utl::OSeekableInputStreamWrapper( pGraphicStream.get() );
607 mpImpl->pContainer->InsertGraphicStream( xInSeekGrStream,
mpImpl->aPersistName, rMediaType );
611 mpImpl->bNeedUpdate =
false;
617 mpImpl->oGraphic.emplace( rGraphic );
618 mpImpl->aMediaType = rMediaType;
619 mpImpl->mnGraphicVersion++;
624 mpImpl->bNeedUpdate =
false;
629 DBG_ASSERT( bUpdate ||
mpImpl->pContainer,
"Can't retrieve current graphic!" );
630 uno::Reference < io::XInputStream >
xStream;
631 if (
mpImpl->pContainer && !bUpdate )
633 SAL_INFO(
"svtools.misc",
"getting stream from container" );
639 std::unique_ptr<SvMemoryStream> pStream(
new SvMemoryStream( 32000, 32000 ));
647 pStream->WriteBytes(aSequence.getConstArray(), nRead);
651 pStream->MakeReadOnly();
654 catch (
const uno::Exception&)
664 SAL_INFO(
"svtools.misc",
"getting stream from object" );
665 bool bUpdateAllowed(
true);
670 uno::Reference<embed::XLinkageSupport>
const xLinkage(
671 mpImpl->mxObj, uno::UNO_QUERY);
672 if (xLinkage.is() && xLinkage->isLink())
688 bool bInsertGraphicStream =
true;
689 uno::Reference<io::XSeekable> xSeekable(
xStream, uno::UNO_QUERY);
690 std::optional<sal_Int64> oPosition;
693 oPosition = xSeekable->getPosition();
707 SAL_WARN(
"svtools.misc",
"EmbeddedObjectRef::GetGraphicStream: failed to parse xStream");
708 bInsertGraphicStream =
false;
712 if (xSeekable.is() && oPosition.has_value())
714 xSeekable->seek(*oPosition);
716 if (bInsertGraphicStream)
723 if (pResult && bUpdate)
724 mpImpl->bNeedUpdate =
false;
736 MapMode aMM( MapUnit::MapAppFont );
737 Size aAppFontSz =
pOut->LogicToLogic(
Size( 0, 8 ), &aMM,
nullptr );
738 vcl::Font aFnt(
"Helvetica", aAppFontSz );
745 pOut->SetBackground();
746 pOut->SetFont( aFnt );
752 for( sal_uInt16
i = 8;
i > 2;
i-- )
772 pOut->SetFont( aFnt );
787 if( nHeight * 10 / nWidth
794 aP.
AdjustY((nHeight - nH) / 2 );
803 aP.
AdjustX((nWidth - nW) / 2 );
807 pOut->DrawBitmapEx(aP,
Size( nWidth, nHeight ), aBmp);
810 pOut->IntersectClipRegion( rRect );
812 pOut->DrawText( aPt, rText );
829 sal_Int32 nMax = aPixSize.
Width() + aPixSize.
Height();
830 for( sal_Int32
i = 5;
i < nMax;
i += 5 )
832 Point a1( aPixViewPos ), a2( aPixViewPos );
833 if(
i > aPixSize.
Width() )
842 pOut->DrawLine(
pOut->PixelToLogic( a1 ),
pOut->PixelToLogic( a2 ) );
856 if ( xEmbObj->getCurrentState() == embed::EmbedStates::LOADED )
857 xEmbObj->changeState( embed::EmbedStates::RUNNING );
859 catch (
const uno::Exception&)
869 const OUString& aName,
870 const OUString& aMediaType )
876 if (pGfxLink && pGfxLink->IsNative())
878 if (pGfxLink->ExportNative(aStream))
881 uno::Reference <io::XInputStream>
xStream = new ::utl::OSeekableInputStreamWrapper(aStream);
885 OSL_FAIL(
"Export of graphic is failed!");
894 uno::Reference <io::XInputStream>
xStream = new ::utl::OSeekableInputStreamWrapper(aStream);
898 OSL_FAIL(
"Export of graphic is failed!");
903 sal_Int64 nViewAspect,
904 const uno::Reference< embed::XEmbeddedObject >& xObj,
905 OUString* pMediaType )
908 return ::comphelper::EmbeddedObjectContainer::GetGraphicReplacementStream(nViewAspect,xObj,pMediaType);
924 SAL_WARN(
"svtools.misc",
"UpdateReplacement called while UpdateReplacement already underway");
931 mpImpl->bUpdating =
false;
936 embed::EmbeddedUpdate* pObj =
dynamic_cast<embed::EmbeddedUpdate*
> (
GetObject().get());
938 pObj->SetOleState( bUpdateOle );
945 mpImpl->bNeedUpdate =
true;
946 mpImpl->mnGraphicVersion++;
951 mpImpl->pContainer->RemoveGraphicStream(
mpImpl->aPersistName );
980 uno::Reference< chart2::XChartDocument > xChart(
mpImpl->mxObj->getComponent(), uno::UNO_QUERY );
983 uno::Reference< chart2::XDiagram > xDiagram( xChart->getFirstDiagram());
986 uno::Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
987 const uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
989 bool bGetChartType =
false;
990 for(
const auto& rCooSys : aCooSysSeq )
992 uno::Reference< chart2::XChartTypeContainer > xCTCnt( rCooSys, uno::UNO_QUERY_THROW );
993 const uno::Sequence< uno::Reference< chart2::XChartType > > aChartTypes( xCTCnt->getChartTypes());
994 int nDimesionCount = rCooSys->getDimension();
995 if( nDimesionCount == 3 )
999 for(
const auto& rChartType : aChartTypes )
1001 OUString strChartType = rChartType->getChartType();
1002 if (strChartType ==
"com.sun.star.chart2.AreaChartType")
1005 bGetChartType =
true;
1007 else if (strChartType ==
"com.sun.star.chart2.BarChartType")
1010 bGetChartType =
true;
1012 else if (strChartType ==
"com.sun.star.chart2.ColumnChartType")
1014 uno::Reference< beans::XPropertySet > xProp( rCooSys, uno::UNO_QUERY );
1017 bool bCurrent =
false;
1018 if( xProp->getPropertyValue(
"SwapXAndYAxis" ) >>= bCurrent )
1024 bGetChartType =
true;
1028 else if (strChartType ==
"com.sun.star.chart2.LineChartType")
1031 bGetChartType =
true;
1033 else if (strChartType ==
"com.sun.star.chart2.ScatterChartType")
1035 Style +=
"XY Chart";
1036 bGetChartType =
true;
1038 else if (strChartType ==
"com.sun.star.chart2.PieChartType")
1041 bGetChartType =
true;
1043 else if (strChartType ==
"com.sun.star.chart2.NetChartType")
1046 bGetChartType =
true;
1048 else if (strChartType ==
"com.sun.star.chart2.CandleStickChartType")
1050 Style +=
"Candle Stick Chart";
1051 bGetChartType =
true;
1067 return mpImpl->mnGraphicVersion;
1076 mpImpl->aDefaultSizeForChart_In_100TH_MM = awt::Size( rSizeIn_100TH_MM.
getWidth(), rSizeIn_100TH_MM.
getHeight() );
1078 uno::Reference<chart2::XDefaultSizeTransmitter> xSizeTransmitter(
mpImpl->mxObj, uno::UNO_QUERY);
1079 DBG_ASSERT( xSizeTransmitter.is(),
"Object does not support XDefaultSizeTransmitter -> will cause #i103460#!" );
1080 if( xSizeTransmitter.is() )
1081 xSizeTransmitter->setDefaultSize(
mpImpl->aDefaultSizeForChart_In_100TH_MM );
1086 (void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"EmbeddedObjectRef"));
1087 (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST(
"ptr"),
"%p",
this);
1089 mpImpl->dumpAsXml(pWriter);
1091 (void)xmlTextWriterEndElement(pWriter);
const Size & GetSizePixel() const
static GraphicFilter & GetGraphicFilter()
ErrCode ImportGraphic(Graphic &rGraphic, const INetURLObject &rPath, sal_uInt16 nFormat=GRFILTER_FORMAT_DONTKNOW, sal_uInt16 *pDeterminedFormat=nullptr, GraphicFilterImportFlags nImportFlags=GraphicFilterImportFlags::NONE)
const std::shared_ptr< GfxLink > & GetSharedGfxLink() const
MapMode GetPrefMapMode() const
SAL_WARN_UNUSED_RESULT Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
constexpr tools::Long Y() const
void setX(tools::Long nX)
void setY(tools::Long nY)
tools::Long AdjustY(tools::Long nVertMove)
tools::Long AdjustX(tools::Long nHorzMove)
constexpr tools::Long X() const
constexpr tools::Long getHeight() const
constexpr tools::Long Height() const
tools::Long AdjustHeight(tools::Long n)
constexpr tools::Long getWidth() const
tools::Long AdjustWidth(tools::Long n)
constexpr tools::Long Width() const
void SetVersion(sal_Int32 n)
sal_uInt64 Seek(sal_uInt64 nPos)
void writeGraphic(const Graphic &rGraphic)
static MapUnit UnoEmbed2VCLMapUnit(sal_Int32 nUnoEmbedMapUnit)
bool getUserAllowsLinkUpdate() const
bool InsertGraphicStream(const css::uno::Reference< css::io::XInputStream > &rStream, const OUString &rObjectName, const OUString &rMediaType)
#define SO3_SCH_CLASSID_40
#define SO3_SCH_CLASSID_30
#define SO3_SCH_CLASSID_50
#define SO3_SCH_CLASSID_60
void AssignToContainer(comphelper::EmbeddedObjectContainer *pContainer, const OUString &rPersistName)
void SetViewAspect(sal_Int64 nAspect)
void SetIsProtectedHdl(const Link< LinkParamNone *, bool > &rProtectedHdl)
sal_uInt32 getGraphicVersion() const
comphelper::EmbeddedObjectContainer * GetContainer() const
SVT_DLLPRIVATE void UpdateOleObject(bool bUpdateOle)
void dumpAsXml(xmlTextWriterPtr pWriter) const
static bool TryRunningState(const css::uno::Reference< css::embed::XEmbeddedObject > &)
const Link< LinkParamNone *, bool > & GetIsProtectedHdl() const
SVT_DLLPRIVATE std::unique_ptr< SvStream > GetGraphicStream(bool bUpdate) const
static void DrawPaintReplacement(const tools::Rectangle &rRect, const OUString &rText, OutputDevice *pOut)
void SetGraphicStream(const css::uno::Reference< css::io::XInputStream > &xInGrStream, const OUString &rMediaType)
void UpdateReplacement(bool bUpdateOle=false)
void Lock(bool bLock=true)
const css::uno::Reference< css::embed::XEmbeddedObject > & operator->() const
void SetDefaultSizeForChart(const Size &rSizeIn_100TH_MM)
static css::uno::Reference< css::io::XInputStream > GetGraphicReplacementStream(sal_Int64 nViewAspect, const css::uno::Reference< css::embed::XEmbeddedObject > &, OUString *pMediaType) noexcept
void SetGraphic(const Graphic &rGraphic, const OUString &rMediaType)
const Graphic * GetGraphic() const
sal_Int64 GetViewAspect() const
static void DrawShading(const tools::Rectangle &rRect, OutputDevice *pOut)
Size GetSize(MapMode const *pTargetMapMode) const
void UpdateReplacementOnDemand()
static void SetGraphicToContainer(const Graphic &rGraphic, comphelper::EmbeddedObjectContainer &aContainer, const OUString &aName, const OUString &aMediaType)
SVT_DLLPRIVATE void GetReplacement(bool bUpdate)
void Assign(const css::uno::Reference< css::embed::XEmbeddedObject > &xObj, sal_Int64 nAspect)
static bool IsChart(const css::uno::Reference< css::embed::XEmbeddedObject > &xObj)
const css::uno::Reference< css::embed::XEmbeddedObject > & GetObject() const
std::unique_ptr< EmbeddedObjectRef_Impl > mpImpl
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
void SetFontSize(const Size &)
void SetTransparent(bool bTransparent)
void SetColor(const Color &)
void SetWeight(FontWeight)
void SetFamily(FontFamily)
constexpr ::Color COL_LIGHTRED(0xFF, 0x00, 0x00)
constexpr ::Color COL_BLACK(0x00, 0x00, 0x00)
#define DBG_ASSERT(sCon, aError)
#define TOOLS_WARN_EXCEPTION(area, stream)
#define DBG_UNHANDLED_EXCEPTION(...)
EmbeddedObjectRef * pObject
struct _xmlTextWriter * xmlTextWriterPtr
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
const sal_Int32 nConstBufferSize
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
uno::Reference< embed::XEmbeddedObject > mxObj
void dumpAsXml(xmlTextWriterPtr pWriter) const
std::optional< Graphic > oGraphic
comphelper::EmbeddedObjectContainer * pContainer
rtl::Reference< EmbedEventListener_Impl > mxListener
EmbeddedObjectRef_Impl(const EmbeddedObjectRef_Impl &r)
awt::Size aDefaultSizeForChart_In_100TH_MM
Link< LinkParamNone *, bool > m_aIsProtectedHdl
sal_uInt32 mnGraphicVersion