diff options
Diffstat (limited to 'chart2/source/tools/TitleHelper.cxx')
-rw-r--r-- | chart2/source/tools/TitleHelper.cxx | 340 |
1 files changed, 173 insertions, 167 deletions
diff --git a/chart2/source/tools/TitleHelper.cxx b/chart2/source/tools/TitleHelper.cxx index 0078e0a29a6c..e9f76c619985 100644 --- a/chart2/source/tools/TitleHelper.cxx +++ b/chart2/source/tools/TitleHelper.cxx @@ -18,16 +18,15 @@ */ #include <TitleHelper.hxx> +#include <Title.hxx> #include <ChartModel.hxx> -#include <ChartModelHelper.hxx> +#include <Axis.hxx> #include <AxisHelper.hxx> -#include <DiagramHelper.hxx> #include <Diagram.hxx> #include <ReferenceSizeProvider.hxx> #include <com/sun/star/chart2/FormattedString.hpp> -#include <com/sun/star/chart2/XChartDocument.hpp> #include <rtl/ustrbuf.hxx> -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <sal/log.hxx> namespace chart @@ -41,7 +40,7 @@ namespace { uno::Reference< XTitled > lcl_getTitleParentFromDiagram( TitleHelper::eTitleType nTitleIndex - , const uno::Reference< XDiagram >& xDiagram ) + , const rtl::Reference< Diagram >& xDiagram ) { uno::Reference< XTitled > xResult; @@ -49,7 +48,7 @@ uno::Reference< XTitled > lcl_getTitleParentFromDiagram( nTitleIndex == TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION ) { bool bDummy = false; - bool bIsVertical = DiagramHelper::getVertical( xDiagram, bDummy, bDummy ); + bool bIsVertical = xDiagram && xDiagram->getVertical( bDummy, bDummy ); if( nTitleIndex == TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION ) nTitleIndex = bIsVertical ? TitleHelper::X_AXIS_TITLE : TitleHelper::Y_AXIS_TITLE; @@ -61,27 +60,27 @@ uno::Reference< XTitled > lcl_getTitleParentFromDiagram( { case TitleHelper::SUB_TITLE: if( xDiagram.is()) - xResult.set( xDiagram, uno::UNO_QUERY ); + xResult = xDiagram; break; case TitleHelper::X_AXIS_TITLE: if( xDiagram.is()) - xResult.set( AxisHelper::getAxis( 0, true, xDiagram ), uno::UNO_QUERY ); + xResult = AxisHelper::getAxis( 0, true, xDiagram ); break; case TitleHelper::Y_AXIS_TITLE: if( xDiagram.is()) - xResult.set( AxisHelper::getAxis( 1, true, xDiagram ), uno::UNO_QUERY ); + xResult = AxisHelper::getAxis( 1, true, xDiagram ); break; case TitleHelper::Z_AXIS_TITLE: if( xDiagram.is()) - xResult.set( AxisHelper::getAxis( 2, true, xDiagram ), uno::UNO_QUERY ); + xResult = AxisHelper::getAxis( 2, true, xDiagram ); break; case TitleHelper::SECONDARY_X_AXIS_TITLE: if( xDiagram.is()) - xResult.set( AxisHelper::getAxis( 0, false, xDiagram ), uno::UNO_QUERY ); + xResult = AxisHelper::getAxis( 0, false, xDiagram ); break; case TitleHelper::SECONDARY_Y_AXIS_TITLE: if( xDiagram.is()) - xResult.set( AxisHelper::getAxis( 1, false, xDiagram ), uno::UNO_QUERY ); + xResult = AxisHelper::getAxis( 1, false, xDiagram ); break; case TitleHelper::MAIN_TITLE: @@ -94,7 +93,7 @@ uno::Reference< XTitled > lcl_getTitleParentFromDiagram( } uno::Reference< XTitled > lcl_getTitleParent( TitleHelper::eTitleType nTitleIndex - , const uno::Reference< XDiagram >& xDiagram ) + , const rtl::Reference< Diagram >& xDiagram ) { uno::Reference< XTitled > xResult; switch( nTitleIndex ) @@ -121,70 +120,72 @@ uno::Reference< XTitled > lcl_getTitleParent( TitleHelper::eTitleType nTitleInde } uno::Reference< XTitled > lcl_getTitleParent( TitleHelper::eTitleType nTitleIndex - , const uno::Reference< frame::XModel >& xModel ) + , const rtl::Reference<::chart::ChartModel>& xModel ) { if(nTitleIndex == TitleHelper::MAIN_TITLE) { - uno::Reference< XTitled > xTitled( xModel, uno::UNO_QUERY ); - return xTitled; + return xModel; } - uno::Reference< XChartDocument > xChartDoc( xModel, uno::UNO_QUERY ); - uno::Reference< XDiagram > xDiagram; + rtl::Reference< Diagram > xDiagram; - if( xChartDoc.is()) - xDiagram.set( xChartDoc->getFirstDiagram()); + if( xModel.is()) + xDiagram = xModel->getFirstChartDiagram(); return lcl_getTitleParent( nTitleIndex, xDiagram ); } } -uno::Reference< XTitle > TitleHelper::getTitle( TitleHelper::eTitleType nTitleIndex +rtl::Reference< Title > TitleHelper::getTitle( TitleHelper::eTitleType nTitleIndex , ChartModel& rModel ) { if(nTitleIndex == TitleHelper::MAIN_TITLE) - return rModel.getTitleObject(); + return rModel.getTitleObject2(); - uno::Reference< XDiagram > xDiagram = rModel.getFirstDiagram(); + rtl::Reference< Diagram > xDiagram = rModel.getFirstChartDiagram(); uno::Reference< XTitled > xTitled( lcl_getTitleParent( nTitleIndex, xDiagram ) ); - if( xTitled.is()) - return xTitled->getTitleObject(); - return nullptr; + if( !xTitled ) + return nullptr; + uno::Reference<XTitle> xTitle = xTitled->getTitleObject(); + auto pTitle = dynamic_cast<Title*>(xTitle.get()); + assert(!xTitle || pTitle); + return pTitle; } -uno::Reference< XTitle > TitleHelper::getTitle( TitleHelper::eTitleType nTitleIndex - , const uno::Reference< frame::XModel >& xModel ) +rtl::Reference< Title > TitleHelper::getTitle( TitleHelper::eTitleType nTitleIndex + , const rtl::Reference<ChartModel>& xModel ) { uno::Reference< XTitled > xTitled; if(nTitleIndex == TitleHelper::MAIN_TITLE) { - xTitled.set( xModel, uno::UNO_QUERY ); + xTitled = xModel; } else { - uno::Reference< XChartDocument > xChartDoc( xModel, uno::UNO_QUERY ); - uno::Reference< XDiagram > xDiagram; - if( xChartDoc.is()) - xDiagram.set( xChartDoc->getFirstDiagram()); + rtl::Reference< Diagram > xDiagram; + if( xModel.is()) + xDiagram = xModel->getFirstChartDiagram(); xTitled = lcl_getTitleParent( nTitleIndex, xDiagram ); } - if( xTitled.is()) - return xTitled->getTitleObject(); - return nullptr; + if( !xTitled ) + return nullptr; + uno::Reference<XTitle> xTitle = xTitled->getTitleObject(); + Title* pTitle = dynamic_cast<Title*>(xTitle.get()); + assert(!xTitle || pTitle); + return pTitle; } -uno::Reference< XTitle > TitleHelper::createOrShowTitle( +rtl::Reference< Title > TitleHelper::createOrShowTitle( TitleHelper::eTitleType eTitleType , const OUString& rTitleText - , const uno::Reference< frame::XModel >& xModel + , const rtl::Reference<ChartModel>& xModel , const uno::Reference< uno::XComponentContext > & xContext ) { - uno::Reference< chart2::XTitle > xTitled( TitleHelper::getTitle( eTitleType, xModel ) ); + rtl::Reference< Title > xTitled( TitleHelper::getTitle( eTitleType, xModel ) ); if( xTitled.is()) { - css::uno::Reference<css::beans::XPropertySet> xProps(xTitled, css::uno::UNO_QUERY_THROW); - xProps->setPropertyValue("Visible",css::uno::Any(true)); + xTitled->setPropertyValue("Visible",css::uno::Any(true)); return xTitled; } else @@ -193,20 +194,20 @@ uno::Reference< XTitle > TitleHelper::createOrShowTitle( } } -uno::Reference< XTitle > TitleHelper::createTitle( +rtl::Reference< Title > TitleHelper::createTitle( TitleHelper::eTitleType eTitleType , const OUString& rTitleText - , const uno::Reference< frame::XModel >& xModel + , const rtl::Reference<ChartModel>& xModel , const uno::Reference< uno::XComponentContext > & xContext , ReferenceSizeProvider * pRefSizeProvider ) { - uno::Reference< XTitle > xTitle; + rtl::Reference< ::chart::Title > xTitle; uno::Reference< XTitled > xTitled( lcl_getTitleParent( eTitleType, xModel ) ); if( !xTitled.is() ) { - uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xModel ) ); - uno::Reference< chart2::XAxis > xAxis; + rtl::Reference< Diagram > xDiagram( xModel->getFirstChartDiagram() ); + rtl::Reference< Axis > xAxis; switch( eTitleType ) { case TitleHelper::SECONDARY_X_AXIS_TITLE: @@ -218,90 +219,80 @@ uno::Reference< XTitle > TitleHelper::createTitle( default: break; } - uno::Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY ); - if( xProps.is() ) + if( xAxis.is() ) { - xProps->setPropertyValue( "Show", uno::Any( false ) ); + xAxis->setPropertyValue( "Show", uno::Any( false ) ); xTitled = lcl_getTitleParent( eTitleType, xModel ); } } if(xTitled.is()) { - uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xModel ) ); + rtl::Reference< Diagram > xDiagram( xModel->getFirstChartDiagram() ); - xTitle.set( xContext->getServiceManager()->createInstanceWithContext( - "com.sun.star.chart2.Title", - xContext ), uno::UNO_QUERY ); + xTitle = new ::chart::Title(); - if(xTitle.is()) + // default char height (main: 13.0 == default) + float fDefaultCharHeightSub = 11.0; + float fDefaultCharHeightAxis = 9.0; + switch( eTitleType ) { - // default char height (main: 13.0 == default) - float fDefaultCharHeightSub = 11.0; - float fDefaultCharHeightAxis = 9.0; - switch( eTitleType ) - { - case TitleHelper::SUB_TITLE: - TitleHelper::setCompleteString( - rTitleText, xTitle, xContext, & fDefaultCharHeightSub ); - break; - case TitleHelper::X_AXIS_TITLE: - case TitleHelper::Y_AXIS_TITLE: - case TitleHelper::Z_AXIS_TITLE: - case TitleHelper::TITLE_AT_STANDARD_X_AXIS_POSITION: - case TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION: - case TitleHelper::SECONDARY_X_AXIS_TITLE: - case TitleHelper::SECONDARY_Y_AXIS_TITLE: - TitleHelper::setCompleteString( - rTitleText, xTitle, xContext, & fDefaultCharHeightAxis ); - break; - default: - TitleHelper::setCompleteString( rTitleText, xTitle, xContext ); - break; - } + case TitleHelper::SUB_TITLE: + TitleHelper::setCompleteString( + rTitleText, xTitle, xContext, & fDefaultCharHeightSub ); + break; + case TitleHelper::X_AXIS_TITLE: + case TitleHelper::Y_AXIS_TITLE: + case TitleHelper::Z_AXIS_TITLE: + case TitleHelper::TITLE_AT_STANDARD_X_AXIS_POSITION: + case TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION: + case TitleHelper::SECONDARY_X_AXIS_TITLE: + case TitleHelper::SECONDARY_Y_AXIS_TITLE: + TitleHelper::setCompleteString( + rTitleText, xTitle, xContext, & fDefaultCharHeightAxis ); + break; + default: + TitleHelper::setCompleteString( rTitleText, xTitle, xContext ); + break; + } - // set/clear autoscale - if( pRefSizeProvider ) - pRefSizeProvider->setValuesAtTitle( xTitle ); + // set/clear autoscale + if( pRefSizeProvider ) + pRefSizeProvider->setValuesAtTitle( xTitle ); - xTitled->setTitleObject( xTitle ); + xTitled->setTitleObject( xTitle ); - //default rotation 90 degree for y axis title in normal coordinatesystems or for x axis title for swapped coordinatesystems - if( eTitleType == TitleHelper::X_AXIS_TITLE || - eTitleType == TitleHelper::Y_AXIS_TITLE || - eTitleType == TitleHelper::SECONDARY_X_AXIS_TITLE || - eTitleType == TitleHelper::SECONDARY_Y_AXIS_TITLE ) + //default rotation 90 degree for y axis title in normal coordinatesystems or for x axis title for swapped coordinatesystems + if( eTitleType == TitleHelper::X_AXIS_TITLE || + eTitleType == TitleHelper::Y_AXIS_TITLE || + eTitleType == TitleHelper::SECONDARY_X_AXIS_TITLE || + eTitleType == TitleHelper::SECONDARY_Y_AXIS_TITLE ) + { + try { - try - { - bool bDummy = false; - bool bIsVertical = DiagramHelper::getVertical( xDiagram, bDummy, bDummy ); - - Reference< beans::XPropertySet > xTitleProps( xTitle, uno::UNO_QUERY ); - if( xTitleProps.is() ) - { - if( (!bIsVertical && eTitleType == TitleHelper::Y_AXIS_TITLE) - || (bIsVertical && eTitleType == TitleHelper::X_AXIS_TITLE) - || (!bIsVertical && eTitleType == TitleHelper::SECONDARY_Y_AXIS_TITLE) - || (bIsVertical && eTitleType == TitleHelper::SECONDARY_X_AXIS_TITLE) ) - { - xTitleProps->setPropertyValue( "TextRotation", uno::Any( 90.0 )); - } - } - } - catch( const uno::Exception & ) + bool bDummy = false; + bool bIsVertical = xDiagram->getVertical( bDummy, bDummy ); + + if( (!bIsVertical && eTitleType == TitleHelper::Y_AXIS_TITLE) + || (bIsVertical && eTitleType == TitleHelper::X_AXIS_TITLE) + || (!bIsVertical && eTitleType == TitleHelper::SECONDARY_Y_AXIS_TITLE) + || (bIsVertical && eTitleType == TitleHelper::SECONDARY_X_AXIS_TITLE) ) { - DBG_UNHANDLED_EXCEPTION("chart2"); + xTitle->setPropertyValue( "TextRotation", uno::Any( 90.0 )); } } + catch( const uno::Exception & ) + { + DBG_UNHANDLED_EXCEPTION("chart2"); + } } } return xTitle; } -OUString TitleHelper::getCompleteString( const uno::Reference< XTitle >& xTitle ) +OUString TitleHelper::getCompleteString( const rtl::Reference< Title >& xTitle ) { if(!xTitle.is()) return OUString(); @@ -312,53 +303,89 @@ OUString TitleHelper::getCompleteString( const uno::Reference< XTitle >& xTitle return aRet.makeStringAndClear(); } +OUString TitleHelper::getUnstackedStr(const OUString& rNewText) +{ + //#i99841# remove linebreaks that were added for vertical stacking + OUStringBuffer aUnstackedStr; + OUStringBuffer aSource(rNewText); + + bool bBreakIgnored = false; + sal_Int32 nLen = rNewText.getLength(); + for (sal_Int32 nPos = 0; nPos < nLen; ++nPos) + { + sal_Unicode aChar = aSource[nPos]; + if (aChar != '\n') + { + aUnstackedStr.append(aChar); + bBreakIgnored = false; + } + else if (aChar == '\n' && bBreakIgnored) + aUnstackedStr.append(aChar); + else + bBreakIgnored = true; + } + return aUnstackedStr.makeStringAndClear(); +} + +void TitleHelper::setFormattedString( const rtl::Reference< Title >& xTitle, + const css::uno::Sequence< css::uno::Reference< css::chart2::XFormattedString > >& aNewFormattedTitle ) +{ + if (!xTitle.is() || !aNewFormattedTitle.hasElements()) + return; + + bool bStacked = false; + xTitle->getPropertyValue("StackCharacters") >>= bStacked; + + if (bStacked) + { + for (uno::Reference< chart2::XFormattedString >const& formattedStr : aNewFormattedTitle) + { + formattedStr->setString(TitleHelper::getUnstackedStr(formattedStr->getString())); + } + } + + xTitle->setText(aNewFormattedTitle); +} + void TitleHelper::setCompleteString( const OUString& rNewText - , const uno::Reference< XTitle >& xTitle + , const rtl::Reference< Title >& xTitle , const uno::Reference< uno::XComponentContext > & xContext - , const float * pDefaultCharHeight /* = 0 */ ) + , const float * pDefaultCharHeight /* = 0 */ + , bool bDialogTitle /*= false*/ ) { - //the format of the first old text portion will be maintained if there is any - if(!xTitle.is()) + if (!xTitle.is()) return; - OUString aNewText = rNewText; - bool bStacked = false; - uno::Reference< beans::XPropertySet > xTitleProperties( xTitle, uno::UNO_QUERY ); - if( xTitleProperties.is() ) - xTitleProperties->getPropertyValue( "StackCharacters" ) >>= bStacked; + if( xTitle.is() ) + xTitle->getPropertyValue( "StackCharacters" ) >>= bStacked; + OUString aNewText = rNewText; if( bStacked ) { - //#i99841# remove linebreaks that were added for vertical stacking - OUStringBuffer aUnstackedStr; - OUStringBuffer aSource(rNewText); - - bool bBreakIgnored = false; - sal_Int32 nLen = rNewText.getLength(); - for( sal_Int32 nPos = 0; nPos < nLen; ++nPos ) - { - sal_Unicode aChar = aSource[nPos]; - if( aChar != '\n' ) - { - aUnstackedStr.append( aChar ); - bBreakIgnored = false; - } - else if( aChar == '\n' && bBreakIgnored ) - aUnstackedStr.append( aChar ); - else - bBreakIgnored = true; - } - aNewText = aUnstackedStr.makeStringAndClear(); + aNewText = getUnstackedStr(rNewText); } uno::Sequence< uno::Reference< XFormattedString > > aNewStringList; - - uno::Sequence< uno::Reference< XFormattedString > > aOldStringList = xTitle->getText(); - if( aOldStringList.hasElements() ) + uno::Sequence< uno::Reference< XFormattedString > > aOldStringList = xTitle->getText(); + if( aOldStringList.hasElements()) { - aNewStringList = { aOldStringList[0] }; - aNewStringList[0]->setString( aNewText ); + const OUString aFullString = getCompleteString(xTitle); + if (bDialogTitle && aNewText.equals(getUnstackedStr(aFullString))) + { + // If the new title setted from a dialog window to a new string + // the first old text portion will be maintained if it's a new string, + // otherwise we use the original one. + aNewStringList = aOldStringList; + } + else + { + // If the new title setted from a dialog to a new string the first + // old text portion will be maintained if there was any. Also in case of ODF + // import which still not support non-uniform formatted titles + aNewStringList = { aOldStringList[0] }; + aNewStringList[0]->setString(aNewText); + } } else { @@ -386,7 +413,7 @@ void TitleHelper::setCompleteString( const OUString& rNewText } void TitleHelper::removeTitle( TitleHelper::eTitleType nTitleIndex - , const css::uno::Reference< css::frame::XModel >& xModel ) + , const rtl::Reference<ChartModel>& xModel ) { uno::Reference< XTitled > xTitled( lcl_getTitleParent( nTitleIndex, xModel ) ); if( xTitled.is()) @@ -396,34 +423,13 @@ void TitleHelper::removeTitle( TitleHelper::eTitleType nTitleIndex } bool TitleHelper::getTitleType( eTitleType& rType - , const css::uno::Reference< css::chart2::XTitle >& xTitle - , ChartModel& rModel ) -{ - if( !xTitle.is() ) - return false; - - Reference< chart2::XTitle > xCurrentTitle; - for( sal_Int32 nTitleType = TITLE_BEGIN; nTitleType < NORMAL_TITLE_END; nTitleType++ ) - { - xCurrentTitle = TitleHelper::getTitle( static_cast<eTitleType>(nTitleType), rModel ); - if( xCurrentTitle == xTitle ) - { - rType = static_cast<eTitleType>(nTitleType); - return true; - } - } - - return false; -} - -bool TitleHelper::getTitleType( eTitleType& rType - , const css::uno::Reference< css::chart2::XTitle >& xTitle - , const css::uno::Reference< css::frame::XModel >& xModel ) + , const rtl::Reference< Title >& xTitle + , const rtl::Reference<ChartModel>& xModel ) { if( !xTitle.is() || !xModel.is() ) return false; - Reference< chart2::XTitle > xCurrentTitle; + rtl::Reference< Title > xCurrentTitle; for( sal_Int32 nTitleType = TITLE_BEGIN; nTitleType < NORMAL_TITLE_END; nTitleType++ ) { xCurrentTitle = TitleHelper::getTitle( static_cast<eTitleType>(nTitleType), xModel ); @@ -438,13 +444,13 @@ bool TitleHelper::getTitleType( eTitleType& rType } void TitleHelper::hideTitle( TitleHelper::eTitleType nTitleIndex - , const css::uno::Reference< css::frame::XModel >& xModel) + , const rtl::Reference<ChartModel>& xModel) { uno::Reference< chart2::XTitle > xTitled( TitleHelper::getTitle( nTitleIndex, xModel ) ); if( xTitled.is()) { css::uno::Reference<css::beans::XPropertySet> xProps(xTitled, css::uno::UNO_QUERY_THROW); - xProps->setPropertyValue("Visible",css::uno::makeAny(false)); + xProps->setPropertyValue("Visible",css::uno::Any(false)); } } |