1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #ifndef _CHART2_OBJECTIDENTIFIER_HXX 24*b1cdbd2cSJim Jagielski #define _CHART2_OBJECTIDENTIFIER_HXX 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartType.hpp> 27*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDiagram.hpp> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XCoordinateSystem.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XDataSeries.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/chart2/XChartDocument.hpp> 31*b1cdbd2cSJim Jagielski #include "TitleHelper.hxx" 32*b1cdbd2cSJim Jagielski #include "charttoolsdllapi.hxx" 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski // header for class OUString 35*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx> 36*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel.hpp> 37*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 38*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/Point.hpp> 39*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XShape.hpp> 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski //............................................................................. 42*b1cdbd2cSJim Jagielski namespace chart 43*b1cdbd2cSJim Jagielski { 44*b1cdbd2cSJim Jagielski //............................................................................. 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------- 47*b1cdbd2cSJim Jagielski /** 48*b1cdbd2cSJim Jagielski */ 49*b1cdbd2cSJim Jagielski enum ObjectType 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski OBJECTTYPE_PAGE, 52*b1cdbd2cSJim Jagielski OBJECTTYPE_TITLE, 53*b1cdbd2cSJim Jagielski OBJECTTYPE_LEGEND, 54*b1cdbd2cSJim Jagielski OBJECTTYPE_LEGEND_ENTRY, 55*b1cdbd2cSJim Jagielski OBJECTTYPE_DIAGRAM, 56*b1cdbd2cSJim Jagielski OBJECTTYPE_DIAGRAM_WALL, 57*b1cdbd2cSJim Jagielski OBJECTTYPE_DIAGRAM_FLOOR, 58*b1cdbd2cSJim Jagielski OBJECTTYPE_AXIS, 59*b1cdbd2cSJim Jagielski OBJECTTYPE_AXIS_UNITLABEL, 60*b1cdbd2cSJim Jagielski OBJECTTYPE_GRID, 61*b1cdbd2cSJim Jagielski OBJECTTYPE_SUBGRID, 62*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_SERIES, 63*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_POINT, 64*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_LABELS, 65*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_LABEL, 66*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_ERRORS, 67*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_ERRORS_X, 68*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_ERRORS_Y, 69*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_ERRORS_Z, 70*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_CURVE,//e.g. a statistical method printed as line 71*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_AVERAGE_LINE, 72*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_CURVE_EQUATION, 73*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_STOCK_RANGE, 74*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_STOCK_LOSS, 75*b1cdbd2cSJim Jagielski OBJECTTYPE_DATA_STOCK_GAIN, 76*b1cdbd2cSJim Jagielski OBJECTTYPE_SHAPE, 77*b1cdbd2cSJim Jagielski OBJECTTYPE_UNKNOWN 78*b1cdbd2cSJim Jagielski }; 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski class OOO_DLLPUBLIC_CHARTTOOLS ObjectIdentifier 81*b1cdbd2cSJim Jagielski { 82*b1cdbd2cSJim Jagielski //CID == ClassifiedIdentifier <--> name of shape 83*b1cdbd2cSJim Jagielski //semicolon, colon, equal sign and slash have special meanings in a CID 84*b1cdbd2cSJim Jagielski //and are therefore not allowed in its components 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski //syntax of a CID: CID:/classification/ObjectID 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski //where classification: nothing or "MultiClick" or "DragMethod=DragMethodServiceName" and "DragParameter=DragParameterString" 89*b1cdbd2cSJim Jagielski // or a combination of these seperated with a colon 90*b1cdbd2cSJim Jagielski //where DragMethodServiceName can be a selfdefined servicename for special actions //todo define standard service for this purpose 91*b1cdbd2cSJim Jagielski //where DragParameterString is any string you like to transport information to your special drag service 92*b1cdbd2cSJim Jagielski // only semicolon, colon, equal sign and slash are not allowed characters 93*b1cdbd2cSJim Jagielski // also the keywors used in the ObjectIdentifiers are not allowed 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski //where ObjectID: Parent-Particle:Particle //e.g. Series=2:Point=22 96*b1cdbd2cSJim Jagielski //where Particle: Type=ParticleID //e.g. Point=22 97*b1cdbd2cSJim Jagielski //where Type: getStringForType( ObjectType eType ) or other string 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski public: 100*b1cdbd2cSJim Jagielski ObjectIdentifier(); 101*b1cdbd2cSJim Jagielski ObjectIdentifier( const ::rtl::OUString& rObjectCID ); 102*b1cdbd2cSJim Jagielski ObjectIdentifier( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rxShape ); 103*b1cdbd2cSJim Jagielski ObjectIdentifier( const ::com::sun::star::uno::Any& rAny ); 104*b1cdbd2cSJim Jagielski virtual ~ObjectIdentifier(); 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski ObjectIdentifier( const ObjectIdentifier& rOID ); 107*b1cdbd2cSJim Jagielski ObjectIdentifier& operator=( const ObjectIdentifier& rOID ); 108*b1cdbd2cSJim Jagielski bool operator==( const ObjectIdentifier& rOID ) const; 109*b1cdbd2cSJim Jagielski bool operator!=( const ObjectIdentifier& rOID ) const; 110*b1cdbd2cSJim Jagielski bool operator<( const ObjectIdentifier& rOID ) const; 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski static rtl::OUString createClassifiedIdentifierForObject( 113*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 114*b1cdbd2cSJim Jagielski ::com::sun::star::uno::XInterface >& xObject 115*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 116*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski static rtl::OUString createClassifiedIdentifierForParticle( 119*b1cdbd2cSJim Jagielski const rtl::OUString& rParticle ); 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski static rtl::OUString createClassifiedIdentifierForParticles( 122*b1cdbd2cSJim Jagielski const rtl::OUString& rParentParticle 123*b1cdbd2cSJim Jagielski , const rtl::OUString& rChildParticle 124*b1cdbd2cSJim Jagielski , const rtl::OUString& rDragMethodServiceName = rtl::OUString() 125*b1cdbd2cSJim Jagielski , const rtl::OUString& rDragParameterString = rtl::OUString() ); 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski static rtl::OUString createClassifiedIdentifierForGrid( 128*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 129*b1cdbd2cSJim Jagielski ::com::sun::star::chart2::XAxis >& xAxis 130*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 131*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel 132*b1cdbd2cSJim Jagielski , sal_Int32 nSubIndex = -1 );//-1: main grid, 0: first subgrid etc 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski SAL_DLLPRIVATE static rtl::OUString createParticleForDiagram( 135*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 136*b1cdbd2cSJim Jagielski ::com::sun::star::chart2::XDiagram >& xDiagram 137*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 138*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 139*b1cdbd2cSJim Jagielski 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski static rtl::OUString createParticleForCoordinateSystem( 142*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 143*b1cdbd2cSJim Jagielski ::com::sun::star::chart2::XCoordinateSystem >& xCooSys 144*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 145*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski static rtl::OUString createParticleForAxis( 148*b1cdbd2cSJim Jagielski sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ); 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski static rtl::OUString createParticleForGrid( 151*b1cdbd2cSJim Jagielski sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex ); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski static rtl::OUString createParticleForSeries( sal_Int32 nDiagramIndex, sal_Int32 nCooSysIndex 154*b1cdbd2cSJim Jagielski , sal_Int32 nChartTypeIndex, sal_Int32 nSeriesIndex ); 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski static rtl::OUString createParticleForLegend( 157*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< 158*b1cdbd2cSJim Jagielski ::com::sun::star::chart2::XLegend >& xLegend 159*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 160*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski static rtl::OUString addChildParticle( const rtl::OUString& rParticle, const rtl::OUString& rChildParticle ); 163*b1cdbd2cSJim Jagielski static rtl::OUString createChildParticleWithIndex( ObjectType eObjectType, sal_Int32 nIndex ); 164*b1cdbd2cSJim Jagielski static sal_Int32 getIndexFromParticleOrCID( const rtl::OUString& rParticleOrCID ); 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski static rtl::OUString createClassifiedIdentifier( 167*b1cdbd2cSJim Jagielski enum ObjectType eObjectType //e.g. OBJECTTYPE_DATA_SERIES 168*b1cdbd2cSJim Jagielski , const rtl::OUString& rParticleID );//e.g. SeriesID 169*b1cdbd2cSJim Jagielski 170*b1cdbd2cSJim Jagielski static rtl::OUString createClassifiedIdentifierWithParent( 171*b1cdbd2cSJim Jagielski enum ObjectType //e.g. OBJECTTYPE_DATA_POINT or OBJECTTYPE_GRID 172*b1cdbd2cSJim Jagielski , const rtl::OUString& rParticleID //for points or subgrids this is an Index or otherwise an identifier from the model object 173*b1cdbd2cSJim Jagielski , const rtl::OUString& rParentPartical //e.g. "Series=SeriesID" or "Grid=GridId" 174*b1cdbd2cSJim Jagielski , const rtl::OUString& rDragMethodServiceName = rtl::OUString() 175*b1cdbd2cSJim Jagielski , const rtl::OUString& rDragParameterString = rtl::OUString() 176*b1cdbd2cSJim Jagielski ); 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski static bool isCID( const rtl::OUString& rName ); 179*b1cdbd2cSJim Jagielski static rtl::OUString getDragMethodServiceName( const rtl::OUString& rClassifiedIdentifier ); 180*b1cdbd2cSJim Jagielski static rtl::OUString getDragParameterString( const rtl::OUString& rCID ); 181*b1cdbd2cSJim Jagielski static bool isDragableObject( const rtl::OUString& rClassifiedIdentifier ); 182*b1cdbd2cSJim Jagielski bool isDragableObject(); 183*b1cdbd2cSJim Jagielski static bool isRotateableObject( const rtl::OUString& rClassifiedIdentifier ); 184*b1cdbd2cSJim Jagielski static bool isMultiClickObject( const rtl::OUString& rClassifiedIdentifier ); 185*b1cdbd2cSJim Jagielski static bool areSiblings( const rtl::OUString& rCID1, const rtl::OUString& rCID2 );//identical object is no sibling 186*b1cdbd2cSJim Jagielski static bool areIdenticalObjects( const ::rtl::OUString& rCID1, const ::rtl::OUString& rCID2 ); 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski static rtl::OUString getStringForType( ObjectType eObjectType ); 189*b1cdbd2cSJim Jagielski static ObjectType getObjectType( const rtl::OUString& rCID ); 190*b1cdbd2cSJim Jagielski ObjectType getObjectType(); 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski static rtl::OUString createSeriesSubObjectStub( ObjectType eSubObjectType 193*b1cdbd2cSJim Jagielski , const rtl::OUString& rSeriesParticle 194*b1cdbd2cSJim Jagielski , const rtl::OUString& rDragMethodServiceName = rtl::OUString() 195*b1cdbd2cSJim Jagielski , const rtl::OUString& rDragParameterString = rtl::OUString() ); 196*b1cdbd2cSJim Jagielski static rtl::OUString createPointCID( const rtl::OUString& rPointCID_Stub, sal_Int32 nIndex ); 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski static rtl::OUString createDataCurveCID( const rtl::OUString& rSeriesParticle, sal_Int32 nCurveIndex, bool bAverageLine ); 199*b1cdbd2cSJim Jagielski static rtl::OUString createDataCurveEquationCID( const rtl::OUString& rSeriesParticle, sal_Int32 nCurveIndex ); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski SAL_DLLPRIVATE static rtl::OUString getObjectID( const rtl::OUString& rCID ); 202*b1cdbd2cSJim Jagielski static rtl::OUString getParticleID( const rtl::OUString& rCID ); 203*b1cdbd2cSJim Jagielski static rtl::OUString getFullParentParticle( const rtl::OUString& rCID ); 204*b1cdbd2cSJim Jagielski 205*b1cdbd2cSJim Jagielski //returns the series particle of a CID when the CID is a child of the series 206*b1cdbd2cSJim Jagielski static rtl::OUString getSeriesParticleFromCID( const rtl::OUString& rCID ); 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski //return the model object that is indicated by rObjectCID 209*b1cdbd2cSJim Jagielski static ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > 210*b1cdbd2cSJim Jagielski getObjectPropertySet( 211*b1cdbd2cSJim Jagielski const rtl::OUString& rObjectCID 212*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 213*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 214*b1cdbd2cSJim Jagielski static ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > 215*b1cdbd2cSJim Jagielski getObjectPropertySet( 216*b1cdbd2cSJim Jagielski const rtl::OUString& rObjectCID 217*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 218*b1cdbd2cSJim Jagielski ::com::sun::star::chart2::XChartDocument >& xChartDocument ); 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski //return the axis object that belongs to rObjectCID if any 221*b1cdbd2cSJim Jagielski static ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XAxis > 222*b1cdbd2cSJim Jagielski getAxisForCID( 223*b1cdbd2cSJim Jagielski const rtl::OUString& rObjectCID 224*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 225*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 226*b1cdbd2cSJim Jagielski 227*b1cdbd2cSJim Jagielski //return the series object that belongs to rObjectCID if any 228*b1cdbd2cSJim Jagielski static ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > 229*b1cdbd2cSJim Jagielski getDataSeriesForCID( 230*b1cdbd2cSJim Jagielski const rtl::OUString& rObjectCID 231*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 232*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 233*b1cdbd2cSJim Jagielski 234*b1cdbd2cSJim Jagielski static ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram > 235*b1cdbd2cSJim Jagielski getDiagramForCID( 236*b1cdbd2cSJim Jagielski const rtl::OUString& rObjectCID 237*b1cdbd2cSJim Jagielski , const ::com::sun::star::uno::Reference< 238*b1cdbd2cSJim Jagielski ::com::sun::star::frame::XModel >& xChartModel ); 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski static const ::rtl::OUString& getPieSegmentDragMethodServiceName(); 241*b1cdbd2cSJim Jagielski static ::rtl::OUString createPieSegmentDragParameterString( 242*b1cdbd2cSJim Jagielski sal_Int32 nOffsetPercent 243*b1cdbd2cSJim Jagielski , const ::com::sun::star::awt::Point& rMinimumPosition 244*b1cdbd2cSJim Jagielski , const ::com::sun::star::awt::Point& rMaximumPosition ); 245*b1cdbd2cSJim Jagielski static bool parsePieSegmentDragParameterString( const rtl::OUString& rDragParameterString 246*b1cdbd2cSJim Jagielski , sal_Int32& rOffsetPercent 247*b1cdbd2cSJim Jagielski , ::com::sun::star::awt::Point& rMinimumPosition 248*b1cdbd2cSJim Jagielski , ::com::sun::star::awt::Point& rMaximumPosition ); 249*b1cdbd2cSJim Jagielski 250*b1cdbd2cSJim Jagielski static TitleHelper::eTitleType getTitleTypeForCID( const ::rtl::OUString& rCID ); 251*b1cdbd2cSJim Jagielski 252*b1cdbd2cSJim Jagielski static ::rtl::OUString getMovedSeriesCID( const ::rtl::OUString& rObjectCID, sal_Bool bForward ); 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski bool isValid() const; 255*b1cdbd2cSJim Jagielski bool isAutoGeneratedObject() const; 256*b1cdbd2cSJim Jagielski bool isAdditionalShape() const; 257*b1cdbd2cSJim Jagielski ::rtl::OUString getObjectCID() const; 258*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > getAdditionalShape() const; 259*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Any getAny() const; 260*b1cdbd2cSJim Jagielski 261*b1cdbd2cSJim Jagielski private: 262*b1cdbd2cSJim Jagielski // #i12587# support for shapes in chart 263*b1cdbd2cSJim Jagielski // For autogenerated chart objects a CID is specified in m_aObjectCID, 264*b1cdbd2cSJim Jagielski // for all other objects m_xAdditionalShape is set. 265*b1cdbd2cSJim Jagielski // Note, that if m_aObjectCID is set, m_xAdditionalShape must be empty 266*b1cdbd2cSJim Jagielski // and vice versa. 267*b1cdbd2cSJim Jagielski ::rtl::OUString m_aObjectCID; 268*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > m_xAdditionalShape; 269*b1cdbd2cSJim Jagielski }; 270*b1cdbd2cSJim Jagielski 271*b1cdbd2cSJim Jagielski //............................................................................. 272*b1cdbd2cSJim Jagielski } //namespace chart 273*b1cdbd2cSJim Jagielski //............................................................................. 274*b1cdbd2cSJim Jagielski #endif 275