summaryrefslogtreecommitdiff
path: root/bf_sch/source/ui/unoidl/sch_ChXChartAxis.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'bf_sch/source/ui/unoidl/sch_ChXChartAxis.cxx')
-rw-r--r--bf_sch/source/ui/unoidl/sch_ChXChartAxis.cxx863
1 files changed, 863 insertions, 0 deletions
diff --git a/bf_sch/source/ui/unoidl/sch_ChXChartAxis.cxx b/bf_sch/source/ui/unoidl/sch_ChXChartAxis.cxx
new file mode 100644
index 000000000..408db4e1f
--- /dev/null
+++ b/bf_sch/source/ui/unoidl/sch_ChXChartAxis.cxx
@@ -0,0 +1,863 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include "ChXChartAxis.hxx"
+#include "schattr.hxx"
+
+// header for class OGuard
+// header for class Application
+#include <vcl/svapp.hxx>
+#include <rtl/uuid.h>
+#include <rtl/memory.h>
+#include <rtl/ustring.h>
+
+// header for SvxDoubleItem
+#ifndef _SVX_CHRTITEM_HXX
+#define ITEMID_DOUBLE 0
+#define ITEMID_CHARTTEXTORDER SCHATTR_TEXT_ORDER
+#define ITEMID_CHARTTEXTORIENT SCHATTR_TEXT_ORIENT
+
+#include <bf_svtools/eitem.hxx>
+
+#endif
+#include "charttyp.hxx"
+// header for SvxUnoTextRangeBase
+// for OWN_ATTR_...
+#include <bf_svx/unoshprp.hxx>
+// for SID_ATTR_...
+#include <bf_svx/svxids.hrc>
+#include <bf_svx/unoshape.hxx>
+
+#include <com/sun/star/chart/ChartAxisArrangeOrderType.hpp>
+
+#include "chaxis.hxx"
+#include "mapprov.hxx"
+#include "pairs.hxx"
+
+#include "unonames.hxx"
+
+namespace binfilter {
+
+using namespace ::rtl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+
+
+ChXChartAxis::ChXChartAxis( ChartModel* _Model, long _WhichId ) :
+ ChXChartObject( CHMAP_AXIS, _Model, _WhichId )
+{
+}
+
+ChXChartAxis::~ChXChartAxis()
+{}
+
+
+::rtl::OUString SAL_CALL ChXChartAxis::getImplementationName()
+throw( uno::RuntimeException )
+{
+ return SCH_ASCII_TO_OU( "ChXChartAxis" );
+}
+
+uno::Sequence< ::rtl::OUString > SAL_CALL ChXChartAxis::getSupportedServiceNames()
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ uno::Sequence< ::rtl::OUString > aSeq( 4 );
+ aSeq[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.ChartAxis" ));
+ aSeq[ 1 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.LineProperties" ));
+ aSeq[ 2 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.style.CharacterProperties" ));
+ aSeq[ 3 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.UserDefinedAttributeSupplier" ));
+
+ return aSeq;
+}
+
+// generate a unique Id
+const uno::Sequence< sal_Int8 > & ChXChartAxis::getUnoTunnelId() throw()
+{
+ static uno::Sequence< sal_Int8 > * pSeq = 0;
+ if( !pSeq )
+ {
+ osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
+ if( !pSeq )
+ {
+ static uno::Sequence< sal_Int8 > aSeq( 16 );
+ rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
+ pSeq = &aSeq;
+ }
+ }
+ return *pSeq;
+}
+
+void ChXChartAxis::InitNumberFormatter() throw( uno::RuntimeException )
+{
+ if( ! rNumberFormatter.is())
+ {
+ if( mpModel )
+ rNumberFormatter = new SvNumberFormatsSupplierObj( mpModel->GetNumFormatter() );
+ else
+ rNumberFormatter = new SvNumberFormatsSupplierObj();
+ }
+
+ if( ! rNumberFormatter.is())
+ throw uno::RuntimeException();
+}
+
+// XNumberFormatsSupplier
+uno::Reference< beans::XPropertySet > SAL_CALL ChXChartAxis::getNumberFormatSettings() throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ InitNumberFormatter();
+
+ return rNumberFormatter.get()->getNumberFormatSettings();
+}
+
+uno::Reference< util::XNumberFormats > SAL_CALL ChXChartAxis::getNumberFormats() throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ InitNumberFormatter();
+
+ return rNumberFormatter.get()->getNumberFormats();
+}
+
+// XInterface
+uno::Any SAL_CALL ChXChartAxis::queryInterface( const uno::Type & rType )
+ throw ( uno::RuntimeException )
+{
+ uno::Any aAny = ChXChartObject::queryInterface( rType );
+
+ if( ! aAny.hasValue() )
+ {
+ InitNumberFormatter();
+ aAny = rNumberFormatter.get()->queryInterface( rType );
+ }
+
+ return aAny;
+}
+
+void SAL_CALL ChXChartAxis::acquire() throw()
+{
+ ChXChartObject::acquire();
+}
+
+void SAL_CALL ChXChartAxis::release() throw()
+{
+ ChXChartObject::release();
+}
+
+// XTypeProvider
+uno::Sequence< uno::Type > SAL_CALL ChXChartAxis::getTypes() throw( uno::RuntimeException )
+{
+ if( maTypeSequence.getLength() == 0 )
+ {
+ const uno::Sequence< uno::Type > aBaseTypes( ChXChartObject::getTypes() );
+ const sal_Int32 nBaseTypes = aBaseTypes.getLength();
+ const uno::Type* pBaseTypes = aBaseTypes.getConstArray();
+
+ maTypeSequence.realloc( nBaseTypes + 1 ); // Note: Keep the size updated !!
+ uno::Type* pTypes = maTypeSequence.getArray();
+
+ *pTypes++ = ::getCppuType((const uno::Reference< util::XNumberFormatsSupplier >*)0);
+
+ for( sal_Int32 nType = 0; nType < nBaseTypes; nType++ )
+ *pTypes++ = *pBaseTypes++;
+ }
+
+ return maTypeSequence;
+}
+
+uno::Sequence< sal_Int8 > SAL_CALL ChXChartAxis::getImplementationId() throw( uno::RuntimeException )
+{
+ static uno::Sequence< sal_Int8 > aId;
+ if( aId.getLength() == 0 )
+ {
+ aId.realloc( 16 );
+ rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
+ }
+ return aId;
+}
+
+// XShapeDescriptor
+::rtl::OUString SAL_CALL ChXChartAxis::getShapeType()
+ throw( uno::RuntimeException )
+{
+ return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart.ChartAxis" ));
+}
+
+// XUnoTunnel
+sal_Int64 SAL_CALL ChXChartAxis::getSomething( const uno::Sequence< sal_Int8 >& aIdentifier )
+ throw( uno::RuntimeException )
+{
+ if( aIdentifier.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
+ aIdentifier.getConstArray(), 16 ) )
+ {
+ return (sal_Int64)this;
+ }
+ return 0;
+}
+
+// XPropertySet
+uno::Any SAL_CALL ChXChartAxis::getPropertyValue( const ::rtl::OUString& PropertyName )
+ throw( beans::UnknownPropertyException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel )
+ {
+ uno::Any aAny;
+ if( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( UNONAME_TEXT_ORDER )))
+ {
+ SfxItemSet aSet( mpModel->GetItemPool(), SCHATTR_TEXT_ORDER, SCHATTR_TEXT_ORDER );
+ mpModel->GetAttr( mnWhichId, aSet );
+
+ chart::ChartAxisArrangeOrderType eArrOrder;
+ SvxChartTextOrder eTextOrder =
+ ((const SvxChartTextOrderItem&)(aSet.Get( SCHATTR_TEXT_ORDER ))).GetValue();
+
+ switch( eTextOrder )
+ {
+ case CHTXTORDER_SIDEBYSIDE:
+ eArrOrder = chart::ChartAxisArrangeOrderType_SIDE_BY_SIDE; break;
+ case CHTXTORDER_DOWNUP:
+ eArrOrder = chart::ChartAxisArrangeOrderType_STAGGER_EVEN; break;
+ case CHTXTORDER_UPDOWN:
+ eArrOrder = chart::ChartAxisArrangeOrderType_STAGGER_ODD; break;
+ case CHTXTORDER_AUTO:
+ default:
+ eArrOrder = chart::ChartAxisArrangeOrderType_AUTO; break;
+ }
+ aAny <<= eArrOrder;
+ return aAny;
+ }
+ else if( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( UNONAME_NUMBERFORMAT )))
+ {
+ // if we have a percent chart use the correct number format item
+ ChartType aType( mpModel );
+ if( aType.IsPercent())
+ {
+ SfxItemSet aSet( mpModel->GetItemPool(), SCHATTR_AXIS_NUMFMTPERCENT, SCHATTR_AXIS_NUMFMTPERCENT );
+ mpModel->GetAttr( mnWhichId, aSet );
+
+ aAny <<= (sal_Int32)(((const SfxUInt32Item&)(aSet.Get( SCHATTR_AXIS_NUMFMTPERCENT ))).GetValue());
+ return aAny;
+ }
+ }
+ }
+
+ return ChXChartObject::getPropertyValue( PropertyName );
+}
+
+void SAL_CALL ChXChartAxis::setPropertyValue( const ::rtl::OUString& aPropertyName, const uno::Any& aValue )
+ throw( beans::UnknownPropertyException,
+ beans::PropertyVetoException,
+ lang::IllegalArgumentException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ if( mpModel && mnWhichId != CHOBJID_ANY )
+ {
+ const SfxItemPropertyMap* pMap = maPropSet.getPropertyMapEntry( aPropertyName );
+
+ if( pMap && pMap->nWID )
+ {
+ if( pMap->nFlags & beans::PropertyAttribute::READONLY )
+ throw beans::PropertyVetoException();
+
+ USHORT nWID = pMap->nWID;
+
+ // create item set that contains nWID and maybe more
+ USHORT nAutoWid = 0;
+ SfxItemSet* pSet = NULL;
+ switch( nWID )
+ {
+ // min/max/stepmain/stephelp/origin need to disable the auto-settings
+ case SCHATTR_AXIS_MIN:
+ nAutoWid = SCHATTR_AXIS_AUTO_MIN;
+ break;
+ case SCHATTR_AXIS_MAX:
+ nAutoWid = SCHATTR_AXIS_AUTO_MAX;
+ break;
+ case SCHATTR_AXIS_STEP_MAIN:
+ nAutoWid = SCHATTR_AXIS_AUTO_STEP_MAIN;
+ break;
+ case SCHATTR_AXIS_STEP_HELP:
+ nAutoWid = SCHATTR_AXIS_AUTO_STEP_HELP;
+ break;
+ case SCHATTR_AXIS_ORIGIN:
+ nAutoWid = SCHATTR_AXIS_AUTO_ORIGIN;
+ break;
+
+ case SCHATTR_AXIS_LOGARITHM:
+ pSet = new SfxItemSet( mpModel->GetItemPool(), nWID, nWID,
+ SCHATTR_AXIS_AUTO_STEP_MAIN, SCHATTR_AXIS_AUTO_STEP_MAIN,
+ SCHATTR_AXIS_MIN, SCHATTR_AXIS_MIN,
+ SCHATTR_AXIS_MAX, SCHATTR_AXIS_MAX, 0 );
+ break;
+ case SCHATTR_AXIS_AUTO_STEP_MAIN:
+ pSet = new SfxItemSet( mpModel->GetItemPool(), nWID, nWID,
+ SCHATTR_AXIS_STEP_MAIN, SCHATTR_AXIS_STEP_MAIN, 0 );
+ break;
+ case SCHATTR_AXIS_AUTO_STEP_HELP:
+ pSet = new SfxItemSet( mpModel->GetItemPool(), nWID, nWID,
+ SCHATTR_AXIS_STEP_HELP, SCHATTR_AXIS_STEP_HELP, 0 );
+ break;
+
+ case XATTR_LINEEND:
+ case XATTR_LINESTART:
+ case XATTR_LINEDASH:
+ // there is a special handling done in the base class for this
+ ChXChartObject::setPropertyValue( aPropertyName, aValue );
+ return; // RETURN !
+
+ case SCHATTR_AXIS_NUMFMT:
+ {
+ ChartType aType( mpModel );
+ if( aType.IsPercent())
+ {
+ nWID = SCHATTR_AXIS_NUMFMTPERCENT;
+ }
+ }
+ // intentionally not breaking ! (nWID just changed)
+ default:
+ pSet = new SfxItemSet( mpModel->GetItemPool(), nWID, nWID );
+ }
+ if( nAutoWid )
+ pSet = new SfxItemSet( mpModel->GetItemPool(), nWID, nWID,
+ nAutoWid, nAutoWid, 0 );
+ DBG_ASSERT( pSet, "ItemSet was not created!" );
+
+ mpModel->GetAttr( mnWhichId, *pSet );
+
+ if( pSet->GetItemState( nWID ) != SFX_ITEM_SET )
+ {
+ // get default from ItemPool
+ if( mpModel->GetItemPool().IsWhich( nWID ))
+ {
+ pSet->Put( mpModel->GetItemPool().GetDefaultItem( nWID ));
+ }
+ else if( nWID != SID_ATTR_NUMBERFORMAT_SOURCE )
+ {
+#if OSL_DEBUG_LEVEL > 1
+ rtl::OString aProp(rtl::OUStringToOString(aPropertyName, RTL_TEXTENCODING_ASCII_US));
+ OSL_TRACE( "ChartAxis: Property %s has an invalid ID (%d)", aProp.getStr(), nWID );
+#endif
+ }
+ }
+
+ // special treatment for some properties
+ switch( nWID )
+ {
+ case SCHATTR_TEXT_ORDER:
+ {
+ SvxChartTextOrder eTextOrder;
+ chart::ChartAxisArrangeOrderType eArrOrder;
+ if( ! ( aValue >>= eArrOrder ))
+ {
+ // basic might give us an int instead of the enum type
+ sal_Int32 nIntVal = 0;
+ if( aValue >>= nIntVal )
+ {
+ eArrOrder = (static_cast< chart::ChartAxisArrangeOrderType >(nIntVal));
+ }
+ }
+ switch( eArrOrder )
+ {
+ case chart::ChartAxisArrangeOrderType_SIDE_BY_SIDE:
+ eTextOrder = CHTXTORDER_SIDEBYSIDE; break;
+ case chart::ChartAxisArrangeOrderType_STAGGER_EVEN:
+ eTextOrder = CHTXTORDER_DOWNUP; break;
+ case chart::ChartAxisArrangeOrderType_STAGGER_ODD:
+ eTextOrder = CHTXTORDER_UPDOWN; break;
+ case chart::ChartAxisArrangeOrderType_AUTO:
+ default:
+ eTextOrder = CHTXTORDER_AUTO; break;
+ }
+ pSet->Put( SvxChartTextOrderItem( eTextOrder ));
+ }
+ break;
+ case SCHATTR_TEXT_ORIENT:
+ {
+ sal_Bool bVal = sal_False;
+ if( aValue >>= bVal )
+ {
+ pSet->Put( SvxChartTextOrientItem(
+ bVal
+ ? CHTXTORIENT_STACKED
+ : CHTXTORIENT_AUTOMATIC ));
+ }
+ }
+ break;
+ case SCHATTR_AXIS_AUTO_STEP_MAIN:
+ case SCHATTR_AXIS_AUTO_STEP_HELP:
+ {
+ sal_Bool bVal(sal_False);
+ aValue >>= bVal;
+ if( ! bVal )
+ {
+ USHORT nStepWID = ( (nWID == SCHATTR_AXIS_AUTO_STEP_MAIN) ?
+ SCHATTR_AXIS_STEP_MAIN :
+ SCHATTR_AXIS_STEP_HELP );
+
+ BOOL bLog = FALSE;
+ ChartAxis* pAxis = mpModel->GetAxis( mnWhichId );
+ if( pAxis )
+ bLog = pAxis->IsLogarithm();
+ const SfxPoolItem* pPoolItem = NULL;
+ if( pSet->GetItemState( nStepWID, TRUE, &pPoolItem ) == SFX_ITEM_SET )
+ {
+ double fOld = ((const SvxDoubleItem*)pPoolItem)->GetValue();
+ if( fOld <= (bLog? 1.0: 0.0) )
+ pSet->Put( SvxDoubleItem( bLog? 10.0 : 1.0, nStepWID ) );
+ }
+ }
+ maPropSet.setPropertyValue( pMap, aValue, *pSet );
+ }
+ break;
+ case SCHATTR_AXIS_LOGARITHM:
+ {
+ sal_Bool bVal(sal_False);
+ aValue >>= bVal;
+ if( bVal )
+ {
+ // for logarithmic scale always use automatic steps
+ pSet->Put( SfxBoolItem( SCHATTR_AXIS_AUTO_STEP_MAIN, TRUE ) );
+
+ const SfxPoolItem* pPoolItem = NULL;
+ double fMin = 0.0;
+ if( pSet->GetItemState( SCHATTR_AXIS_MIN, TRUE, &pPoolItem ) == SFX_ITEM_SET )
+ {
+ fMin = ((const SvxDoubleItem*)pPoolItem)->GetValue();
+ if( fMin <= 0.0 )
+ pSet->Put( SvxDoubleItem( 1.0, SCHATTR_AXIS_MIN ) );
+ }
+ if( pSet->GetItemState( SCHATTR_AXIS_MAX, TRUE, &pPoolItem ) == SFX_ITEM_SET )
+ {
+ if( ((const SvxDoubleItem*)pPoolItem)->GetValue() <= fMin )
+ pSet->Put( SvxDoubleItem( fMin * 10.0, SCHATTR_AXIS_MAX ));
+ }
+ }
+ maPropSet.setPropertyValue( pMap, aValue, *pSet );
+ }
+ break;
+
+ case SCHATTR_AXIS_STEP_MAIN:
+ case SCHATTR_AXIS_STEP_HELP:
+ {
+ BOOL bLog = FALSE;
+ ChartAxis* pAxis = mpModel->GetAxis( mnWhichId );
+ if( pAxis )
+ bLog = pAxis->IsLogarithm();
+ double fVal(0.0);
+ aValue >>= fVal;
+ if( fVal <= bLog? 1.0: 0.0 )
+ throw lang::IllegalArgumentException();
+
+ pSet->Put( SfxBoolItem( nAutoWid, FALSE ));
+ maPropSet.setPropertyValue( pMap, aValue, *pSet );
+ }
+ break;
+
+ case SCHATTR_AXIS_MIN:
+ case SCHATTR_AXIS_MAX:
+ {
+ ChartAxis* pAxis = mpModel->GetAxis( mnWhichId );
+ double fVal(0.0);
+ aValue >>= fVal;
+ if( pAxis &&
+ pAxis->IsLogarithm() && fVal <= 0.0 )
+ throw lang::IllegalArgumentException();
+
+ pSet->Put( SfxBoolItem( nAutoWid, FALSE ));
+ maPropSet.setPropertyValue( pMap, aValue, *pSet );
+ }
+ break;
+
+ case SCHATTR_AXIS_ORIGIN:
+ pSet->Put( SfxBoolItem( nAutoWid, FALSE ));
+ maPropSet.setPropertyValue( pMap, aValue, *pSet );
+ break;
+
+ case SCHATTR_AXIS_NUMFMTPERCENT:
+ // was mapped from SCHATTR_AXIS_NUMFMT, so don't use standard mechanism
+ {
+ sal_Int32 nFmt(0);
+ aValue >>= nFmt;
+ pSet->Put( SfxUInt32Item( nWID, nFmt ));
+ }
+ break;
+
+ case SID_ATTR_NUMBERFORMAT_SOURCE:
+ // this is not a which id (>4999)
+ {
+ sal_Bool bUseSource = sal_False;
+ aValue >>= bUseSource;
+ pSet->Put( SfxBoolItem( nWID, bUseSource ));
+ }
+ break;
+
+ default:
+ // CL: convert special character properties
+ if( !SvxUnoTextRangeBase::SetPropertyValueHelper( *pSet, pMap, aValue, *pSet ))
+ maPropSet.setPropertyValue( pMap, aValue, *pSet );
+ break;
+ }
+
+ if( pSet->Count() )
+ mpModel->ChangeAttr( *pSet, mnWhichId );
+ else
+ throw beans::UnknownPropertyException();
+
+ delete pSet;
+ }
+ else
+ {
+ throw beans::UnknownPropertyException();
+ }
+ }
+}
+
+
+
+/*
+ In contrast to calling the method setPropertyValue (singular) for every given property name
+ the implementation of this method exploits the following properties:
+ 1: Both the given sequence of property names and the member property map are sorted according
+ to the property names.
+ 2: The item set which gathers all items changed by setting the properties is created only once.
+ 3: The solar mutex is acquired only once.
+*/
+void SAL_CALL ChXChartAxis::setPropertyValues (
+ const Sequence<OUString > & aPropertyNames,
+ const Sequence<Any > & aValues )
+ throw ( beans::PropertyVetoException,
+ lang::IllegalArgumentException,
+ lang::WrappedTargetException,
+ uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ if (mpModel == NULL || mnWhichId == CHOBJID_ANY)
+ return;
+
+ // Get pointers to first elements of lists.
+ const SfxItemPropertyMap * pProperty = maPropSet.getPropertyMap ();
+ const OUString * pPropertyName = aPropertyNames.getConstArray ();
+ const Any * pValue = aValues.getConstArray ();
+
+ USHORT nWID, nAutoWID;
+
+ // Create the item which collects all items modified by setting a property.
+ SfxItemSet aAttributes (mpModel->GetItemPool(), nAxisWhichPairs);
+ mpModel->GetAttr (mnWhichId, aAttributes);
+
+ // Iterate over all the given property names.
+ sal_Int32 nCounter = aPropertyNames.getLength();
+ while (nCounter-- > 0)
+ {
+ AdvanceToName (pProperty, pPropertyName);
+
+ nWID = pProperty->nWID;
+
+ if (pProperty == NULL || pProperty->nWID == 0)
+ {
+ OUString sMessage = OUString (RTL_CONSTASCII_USTRINGPARAM ( "ChXChartAxis::setPropertyValues: unknown property "));
+ sMessage += *pPropertyName;
+ throw UnknownPropertyException (sMessage, (::cppu::OWeakObject*)this);
+ }
+
+ // If the item that internally represents the property is not set, then get it's
+ // default value.
+ if (aAttributes.GetItemState(nWID) != SFX_ITEM_SET)
+ {
+ // Get default from the model's item pool.
+ if (mpModel->GetItemPool().IsWhich (nWID))
+ aAttributes.Put (mpModel->GetItemPool().GetDefaultItem(nWID));
+#if OSL_DEBUG_LEVEL > 1
+ else if (nWID != SID_ATTR_NUMBERFORMAT_SOURCE)
+ {
+ rtl::OString aProp(rtl::OUStringToOString(*pPropertyName, RTL_TEXTENCODING_ASCII_US));
+ OSL_TRACE( "ChartAxis: Property %s has an invalid ID (%d)", aProp.getStr(), nWID );
+ }
+#endif
+ }
+
+ // Set the property's new value and handle some special cases.
+ switch (nWID)
+ {
+ case SCHATTR_TEXT_ORDER:
+ {
+ SvxChartTextOrder eTextOrder;
+ chart::ChartAxisArrangeOrderType eArrOrder;
+ if ( ! ( *pValue >>= eArrOrder ))
+ {
+ // basic might give us an int instead of the enum type
+ sal_Int32 nIntVal = 0;
+ if( *pValue >>= nIntVal )
+ eArrOrder = (static_cast< chart::ChartAxisArrangeOrderType >(nIntVal));
+ }
+ switch( eArrOrder )
+ {
+ case chart::ChartAxisArrangeOrderType_SIDE_BY_SIDE:
+ eTextOrder = CHTXTORDER_SIDEBYSIDE;
+ break;
+ case chart::ChartAxisArrangeOrderType_STAGGER_EVEN:
+ eTextOrder = CHTXTORDER_DOWNUP;
+ break;
+ case chart::ChartAxisArrangeOrderType_STAGGER_ODD:
+ eTextOrder = CHTXTORDER_UPDOWN;
+ break;
+ case chart::ChartAxisArrangeOrderType_AUTO:
+ default:
+ eTextOrder = CHTXTORDER_AUTO;
+ break;
+ }
+ aAttributes.Put (SvxChartTextOrderItem( eTextOrder));
+ }
+ break;
+
+ case SCHATTR_TEXT_ORIENT:
+ {
+ sal_Bool bVal = sal_False;
+ if( *pValue >>= bVal )
+ {
+ aAttributes.Put( SvxChartTextOrientItem(
+ bVal
+ ? CHTXTORIENT_STACKED
+ : CHTXTORIENT_AUTOMATIC ));
+ }
+ }
+ break;
+
+ case SCHATTR_AXIS_AUTO_STEP_MAIN:
+ case SCHATTR_AXIS_AUTO_STEP_HELP:
+ {
+ sal_Bool bVal(sal_False);
+ *pValue >>= bVal;
+ if( ! bVal )
+ {
+ USHORT nStepWID = ( (nWID == SCHATTR_AXIS_AUTO_STEP_MAIN) ?
+ SCHATTR_AXIS_STEP_MAIN :
+ SCHATTR_AXIS_STEP_HELP );
+
+ BOOL bLog = FALSE;
+ ChartAxis* pAxis = mpModel->GetAxis( mnWhichId );
+ if( pAxis )
+ bLog = pAxis->IsLogarithm();
+ const SfxPoolItem* pPoolItem = NULL;
+ if( aAttributes.GetItemState( nStepWID, TRUE, &pPoolItem ) == SFX_ITEM_SET )
+ {
+ double fOld = ((const SvxDoubleItem*)pPoolItem)->GetValue();
+ if( fOld <= (bLog? 1.0: 0.0) )
+ aAttributes.Put( SvxDoubleItem( bLog? 10.0 : 1.0, nStepWID ) );
+ }
+ }
+ maPropSet.setPropertyValue( pProperty, *pValue, aAttributes );
+ }
+ break;
+
+ case SCHATTR_AXIS_LOGARITHM:
+ {
+ sal_Bool bVal(sal_False);
+ *pValue >>= bVal;
+ if( bVal )
+ {
+ // for logarithmic scale always use automatic steps
+ aAttributes.Put( SfxBoolItem( SCHATTR_AXIS_AUTO_STEP_MAIN, TRUE ) );
+
+ const SfxPoolItem* pPoolItem = NULL;
+ double fMin = 0.0;
+ if( aAttributes.GetItemState( SCHATTR_AXIS_MIN, TRUE, &pPoolItem ) == SFX_ITEM_SET )
+ {
+ fMin = ((const SvxDoubleItem*)pPoolItem)->GetValue();
+ if( fMin <= 0.0 )
+ aAttributes.Put( SvxDoubleItem( 1.0, SCHATTR_AXIS_MIN ) );
+ }
+ if( aAttributes.GetItemState( SCHATTR_AXIS_MAX, TRUE, &pPoolItem ) == SFX_ITEM_SET )
+ {
+ if( ((const SvxDoubleItem*)pPoolItem)->GetValue() <= fMin )
+ aAttributes.Put( SvxDoubleItem( fMin * 10.0, SCHATTR_AXIS_MAX ));
+ }
+ }
+ maPropSet.setPropertyValue( pProperty, *pValue, aAttributes );
+ }
+ break;
+
+ case SCHATTR_AXIS_STEP_MAIN:
+ case SCHATTR_AXIS_STEP_HELP:
+ {
+ BOOL bLog = FALSE;
+ ChartAxis* pAxis = mpModel->GetAxis( mnWhichId );
+ if( pAxis )
+ bLog = pAxis->IsLogarithm();
+ double fVal(0.0);
+ *pValue >>= fVal;
+ if( fVal <= bLog? 1.0: 0.0 )
+ throw lang::IllegalArgumentException();
+
+ if (nWID == SCHATTR_AXIS_STEP_MAIN)
+ nAutoWID = SCHATTR_AXIS_AUTO_STEP_MAIN;
+ else
+ nAutoWID = SCHATTR_AXIS_AUTO_STEP_HELP;
+ aAttributes.Put( SfxBoolItem( nAutoWID, FALSE ));
+ maPropSet.setPropertyValue( pProperty, *pValue, aAttributes );
+ }
+ break;
+
+ case SCHATTR_AXIS_MIN:
+ case SCHATTR_AXIS_MAX:
+ {
+ ChartAxis* pAxis = mpModel->GetAxis( mnWhichId );
+ double fVal(0.0);
+ *pValue >>= fVal;
+ if ( pAxis
+ && pAxis->IsLogarithm()
+ && fVal <= 0.0)
+ throw lang::IllegalArgumentException();
+ if (nWID == SCHATTR_AXIS_MIN)
+ nAutoWID = SCHATTR_AXIS_AUTO_MIN;
+ else
+ nAutoWID = SCHATTR_AXIS_AUTO_MAX;
+
+ aAttributes.Put( SfxBoolItem( nAutoWID, FALSE ));
+ maPropSet.setPropertyValue (pProperty, *pValue, aAttributes);
+ }
+ break;
+
+ case SCHATTR_AXIS_ORIGIN:
+ aAttributes.Put (SfxBoolItem (SCHATTR_AXIS_AUTO_ORIGIN, FALSE));
+ maPropSet.setPropertyValue (pProperty, *pValue, aAttributes);
+ break;
+
+ case SCHATTR_AXIS_NUMFMTPERCENT:
+ // was mapped from SCHATTR_AXIS_NUMFMT, so don't use standard mechanism
+ {
+ sal_Int32 nFmt(0);
+ *pValue >>= nFmt;
+ aAttributes.Put( SfxUInt32Item( nWID, nFmt ));
+ }
+ break;
+
+ case SID_ATTR_NUMBERFORMAT_SOURCE:
+ // this is not a which id (>4999)
+ {
+ sal_Bool bUseSource = sal_False;
+ *pValue >>= bUseSource;
+ aAttributes.Put (SfxBoolItem( nWID, bUseSource));
+ }
+ break;
+
+ case XATTR_LINEEND:
+ case XATTR_LINESTART:
+ case XATTR_LINEDASH:
+ if (pProperty->nMemberId == MID_NAME )
+ {
+ ::rtl::OUString aString;
+ if (*pValue >>= aString)
+ SvxShape::SetFillAttribute (nWID, aString, aAttributes, mpModel);
+ break;
+ }
+ // note: this fall-through is intended
+
+ default:
+ // CL: convert special character properties
+ if( !SvxUnoTextRangeBase::SetPropertyValueHelper (
+ aAttributes, pProperty, *pValue, aAttributes))
+ maPropSet.setPropertyValue (pProperty, *pValue, aAttributes);
+ break;
+ }
+
+ // Advance to the next property, property name and value.
+ pPropertyName++;
+ pValue++;
+ }
+
+ // Finally set the modified item set to the axis.
+ mpModel->ChangeAttr (aAttributes, mnWhichId);
+}
+
+//===== protected methods =======================================================================
+
+SfxItemSet * ChXChartAxis::CreateItemSet (void)
+{
+ SfxItemSet * pAttributes = new SfxItemSet (mpModel->GetItemPool(), nAxisWhichPairs);
+ mpModel->GetAttr (mnWhichId, *pAttributes, mnIndex);
+ return pAttributes;
+}
+
+
+
+void ChXChartAxis::GetPropertyValue (const SfxItemPropertyMap & rProperty,
+ ::com::sun::star::uno::Any & rValue,
+ SfxItemSet & rAttributes)
+{
+ switch (rProperty.nWID)
+ {
+ case SCHATTR_TEXT_ORDER:
+ {
+ chart::ChartAxisArrangeOrderType eArrOrder;
+
+ switch (((const SvxChartTextOrderItem&)(rAttributes.Get( SCHATTR_TEXT_ORDER ))).GetValue())
+ {
+ case CHTXTORDER_SIDEBYSIDE:
+ eArrOrder = chart::ChartAxisArrangeOrderType_SIDE_BY_SIDE;
+ break;
+ case CHTXTORDER_DOWNUP:
+ eArrOrder = chart::ChartAxisArrangeOrderType_STAGGER_EVEN;
+ break;
+ case CHTXTORDER_UPDOWN:
+ eArrOrder = chart::ChartAxisArrangeOrderType_STAGGER_ODD;
+ break;
+ case CHTXTORDER_AUTO:
+ default:
+ eArrOrder = chart::ChartAxisArrangeOrderType_AUTO;
+ break;
+ }
+ rValue <<= eArrOrder;
+ break;
+ }
+ case SCHATTR_AXIS_NUMFMT:
+ {
+ // if we have a percent chart use the correct number format item
+ ChartType aType( mpModel );
+ if( aType.IsPercent())
+ {
+ rValue <<= (sal_Int32)(((const SfxUInt32Item&)(rAttributes.Get( SCHATTR_AXIS_NUMFMTPERCENT ))).GetValue());
+ }
+ else
+ {
+ rValue <<= (sal_Int32)(((const SfxUInt32Item&)(rAttributes.Get( SCHATTR_AXIS_NUMFMT ))).GetValue());
+ }
+ }
+ break;
+
+
+ default:
+ ChXChartObject::GetPropertyValue (rProperty, rValue, rAttributes);
+ }
+}
+
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */