diff options
44 files changed, 931 insertions, 293 deletions
diff --git a/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx b/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx index dd13b9032..bcd5c8086 100644 --- a/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx +++ b/chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx @@ -112,6 +112,7 @@ enum PROP_DIAGRAM_DATAROW_SOURCE, PROP_DIAGRAM_GROUP_BARS_PER_AXIS, + PROP_DIAGRAM_INCLUDE_HIDDEN_CELLS, PROP_DIAGRAM_SORT_BY_X_VALUES, @@ -233,6 +234,13 @@ void lcl_AddPropertiesToVector( beans::PropertyAttribute::BOUND | beans::PropertyAttribute::MAYBEDEFAULT )); + rOutProperties.push_back( + Property( C2U( "IncludeHiddenCells" ), + PROP_DIAGRAM_INCLUDE_HIDDEN_CELLS, + ::getBooleanCppuType(), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); + //new for XY charts rOutProperties.push_back( Property( C2U( "SortByXValues" ), @@ -1970,6 +1978,44 @@ Any WrappedAutomaticSizeProperty::getPropertyDefault( const Reference< beans::XP //----------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------- +//PROP_DIAGRAM_INCLUDE_HIDDEN_CELLS +class WrappedIncludeHiddenCellsProperty : public WrappedProperty +{ +public: + WrappedIncludeHiddenCellsProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ); + virtual ~WrappedIncludeHiddenCellsProperty(); + + virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const + throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + +private: //member + ::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact; +}; + +WrappedIncludeHiddenCellsProperty::WrappedIncludeHiddenCellsProperty( ::boost::shared_ptr< Chart2ModelContact > spChart2ModelContact ) + : WrappedProperty(C2U("IncludeHiddenCells"),C2U("IncludeHiddenCells")) + , m_spChart2ModelContact( spChart2ModelContact ) +{ +} + +WrappedIncludeHiddenCellsProperty::~WrappedIncludeHiddenCellsProperty() +{ +} + +void WrappedIncludeHiddenCellsProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& /*xInnerPropertySet*/ ) const + throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) +{ + sal_Bool bNewValue = false; + if( ! (rOuterValue >>= bNewValue) ) + throw lang::IllegalArgumentException( C2U("Property Dim3D requires boolean value"), 0, 0 ); + + ChartModelHelper::setIncludeHiddenCells( bNewValue, m_spChart2ModelContact->getChartModel() ); +} + +//----------------------------------------------------------------------------------------------------------------- +//----------------------------------------------------------------------------------------------------------------- +//----------------------------------------------------------------------------------------------------------------- + // ____ XDiagramProvider ____ Reference< chart2::XDiagram > SAL_CALL DiagramWrapper::getDiagram() throw (uno::RuntimeException) @@ -2025,6 +2071,8 @@ const std::vector< WrappedProperty* > DiagramWrapper::createWrappedProperties() aWrappedProperties.push_back( new WrappedProperty( C2U( "StackedBarsConnected" ), C2U( "ConnectBars" ) ) ); aWrappedProperties.push_back( new WrappedSolidTypeProperty( m_spChart2ModelContact ) ); aWrappedProperties.push_back( new WrappedAutomaticSizeProperty() ); + aWrappedProperties.push_back( new WrappedIncludeHiddenCellsProperty( m_spChart2ModelContact ) ); + return aWrappedProperties; } diff --git a/chart2/source/controller/dialogs/TabPages.hrc b/chart2/source/controller/dialogs/TabPages.hrc index a9fb1ab85..fb58fd454 100644 --- a/chart2/source/controller/dialogs/TabPages.hrc +++ b/chart2/source/controller/dialogs/TabPages.hrc @@ -83,22 +83,6 @@ #define CTL_BITMAP_PREVIEW 6 */ -//#define TP_OPTIONS 908 -#define GRP_OPT_AXIS 1 -#define RBT_OPT_AXIS_1 2 -#define RBT_OPT_AXIS_2 3 -#define MT_GAP 4 -#define MT_OVERLAP 5 -#define FT_GAP 6 -#define FT_OVERLAP 7 -#define GB_BAR 8 -#define CB_CONNECTOR 9 -#define CB_BARS_SIDE_BY_SIDE 10 -#define FL_PLOT_MISSING_VALUES 11 -#define RB_DONT_PAINT 12 -#define RB_ASSUME_ZERO 13 -#define RB_CONTINUE_LINE 14 - //------------ //from old chart tplabel.hrc diff --git a/chart2/source/controller/dialogs/tp_PolarOptions.cxx b/chart2/source/controller/dialogs/tp_PolarOptions.cxx index 30cf24e40..bf0c1e655 100644 --- a/chart2/source/controller/dialogs/tp_PolarOptions.cxx +++ b/chart2/source/controller/dialogs/tp_PolarOptions.cxx @@ -32,7 +32,6 @@ #include "tp_PolarOptions.hxx" #include "tp_PolarOptions.hrc" #include "ResId.hxx" -#include "TabPages.hrc" #include "chartview/ChartSfxItemIds.hxx" #include "NoWarningThisInCTOR.hxx" @@ -51,7 +50,9 @@ PolarOptionsTabPage::PolarOptionsTabPage( Window* pWindow,const SfxItemSet& rInA m_aFL_StartingAngle( this, SchResId( FL_STARTING_ANGLE ) ), m_aAngleDial( this, SchResId( CT_ANGLE_DIAL ) ), m_aFT_Degrees( this, SchResId( FT_ROTATION_DEGREES ) ), - m_aNF_StartingAngle( this, SchResId( NF_STARTING_ANGLE ) ) + m_aNF_StartingAngle( this, SchResId( NF_STARTING_ANGLE ) ), + m_aFL_PlotOptions( this, SchResId( FL_PLOT_OPTIONS_POLAR ) ), + m_aCB_IncludeHiddenCells( this, SchResId( CB_INCLUDE_HIDDEN_CELLS_POLAR ) ) { FreeResource(); @@ -78,6 +79,9 @@ BOOL PolarOptionsTabPage::FillItemSet( SfxItemSet& rOutAttrs ) if( m_aCB_Clockwise.IsVisible() ) rOutAttrs.Put(SfxBoolItem(SCHATTR_CLOCKWISE,m_aCB_Clockwise.IsChecked())); + if (m_aCB_IncludeHiddenCells.IsVisible()) + rOutAttrs.Put(SfxBoolItem(SCHATTR_INCLUDE_HIDDEN_CELLS, m_aCB_IncludeHiddenCells.IsChecked())); + return TRUE; } @@ -108,6 +112,16 @@ void PolarOptionsTabPage::Reset(const SfxItemSet& rInAttrs) { m_aCB_Clockwise.Show(FALSE); } + if (rInAttrs.GetItemState(SCHATTR_INCLUDE_HIDDEN_CELLS, TRUE, &pPoolItem) == SFX_ITEM_SET) + { + bool bVal = static_cast<const SfxBoolItem*>(pPoolItem)->GetValue(); + m_aCB_IncludeHiddenCells.Check(bVal); + } + else + { + m_aCB_IncludeHiddenCells.Show(FALSE); + m_aFL_PlotOptions.Show(FALSE); + } } //............................................................................. diff --git a/chart2/source/controller/dialogs/tp_PolarOptions.hrc b/chart2/source/controller/dialogs/tp_PolarOptions.hrc index 722155bab..b275a72cf 100644 --- a/chart2/source/controller/dialogs/tp_PolarOptions.hrc +++ b/chart2/source/controller/dialogs/tp_PolarOptions.hrc @@ -28,9 +28,13 @@ * ************************************************************************/ +#include "ResourceIds.hrc" + #define CB_CLOCKWISE 1 +#define CB_INCLUDE_HIDDEN_CELLS_POLAR 2 #define FL_STARTING_ANGLE 1 +#define FL_PLOT_OPTIONS_POLAR 2 #define CT_ANGLE_DIAL 1 diff --git a/chart2/source/controller/dialogs/tp_PolarOptions.hxx b/chart2/source/controller/dialogs/tp_PolarOptions.hxx index af6074ab6..abb84a6e7 100644 --- a/chart2/source/controller/dialogs/tp_PolarOptions.hxx +++ b/chart2/source/controller/dialogs/tp_PolarOptions.hxx @@ -58,6 +58,9 @@ private: svx::DialControl m_aAngleDial; FixedText m_aFT_Degrees; NumericField m_aNF_StartingAngle; + + FixedLine m_aFL_PlotOptions; + CheckBox m_aCB_IncludeHiddenCells; }; //............................................................................. diff --git a/chart2/source/controller/dialogs/tp_PolarOptions.src b/chart2/source/controller/dialogs/tp_PolarOptions.src index b9c25bb32..568583b3c 100644 --- a/chart2/source/controller/dialogs/tp_PolarOptions.src +++ b/chart2/source/controller/dialogs/tp_PolarOptions.src @@ -28,7 +28,6 @@ * ************************************************************************/ -#include "TabPages.hrc" #include "tp_PolarOptions.hrc" #include "HelpIds.hrc" @@ -47,8 +46,8 @@ TabPage TP_POLAROPTIONS }; FixedLine FL_STARTING_ANGLE { - Pos = MAP_APPFONT ( 12 , 21 ) ; - Size = MAP_APPFONT ( 242 , 12 ) ; + Pos = MAP_APPFONT ( 6 , 21 ) ; + Size = MAP_APPFONT ( 248 , 12 ) ; Text [ en-US ] = "Starting angle" ; }; Control CT_ANGLE_DIAL @@ -75,4 +74,17 @@ TabPage TP_POLAROPTIONS Maximum = 359 ; SpinSize = 5 ; }; + FixedLine FL_PLOT_OPTIONS_POLAR + { + Pos = MAP_APPFONT ( 6 , 90 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "Plot options"; + }; + CheckBox CB_INCLUDE_HIDDEN_CELLS_POLAR + { + Pos = MAP_APPFONT ( 12 , 104 ) ; + Size = MAP_APPFONT ( 200 , 10 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Include ~values from hidden cells"; + }; }; diff --git a/chart2/source/controller/dialogs/tp_SeriesToAxis.cxx b/chart2/source/controller/dialogs/tp_SeriesToAxis.cxx index aa562e169..7812b8b97 100644 --- a/chart2/source/controller/dialogs/tp_SeriesToAxis.cxx +++ b/chart2/source/controller/dialogs/tp_SeriesToAxis.cxx @@ -31,9 +31,9 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_chart2.hxx" #include "tp_SeriesToAxis.hxx" +#include "tp_SeriesToAxis.hrc" #include "ResId.hxx" -#include "TabPages.hrc" #include "chartview/ChartSfxItemIds.hxx" #include "NoWarningThisInCTOR.hxx" @@ -43,6 +43,8 @@ #include <svtools/intitem.hxx> //SfxIntegerListItem #include <svtools/ilstitem.hxx> +#include <svtools/controldims.hrc> + #include <com/sun/star/chart/MissingValueTreatment.hpp> //............................................................................. @@ -63,10 +65,12 @@ SchOptionTabPage::SchOptionTabPage(Window* pWindow,const SfxItemSet& rInAttrs) : aMTOverlap(this,SchResId(MT_OVERLAP)), aCBConnect(this,SchResId(CB_CONNECTOR)), aCBAxisSideBySide(this,SchResId(CB_BARS_SIDE_BY_SIDE)), - m_aFL_EmptyCells(this,SchResId(FL_PLOT_MISSING_VALUES)), + m_aFL_PlotOptions(this,SchResId(FL_PLOT_OPTIONS)), + m_aFT_MissingValues(this,SchResId(FT_MISSING_VALUES)), m_aRB_DontPaint(this,SchResId(RB_DONT_PAINT)), m_aRB_AssumeZero(this,SchResId(RB_ASSUME_ZERO)), m_aRB_ContinueLine(this,SchResId(RB_CONTINUE_LINE)), + m_aCBIncludeHiddenCells(this,SchResId(CB_INCLUDE_HIDDEN_CELLS)), m_bProvidesSecondaryYAxis(true), m_bProvidesOverlapAndGapWidth(false) { @@ -123,6 +127,9 @@ BOOL SchOptionTabPage::FillItemSet(SfxItemSet& rOutAttrs) else if(m_aRB_ContinueLine.IsChecked()) rOutAttrs.Put(SfxInt32Item(SCHATTR_MISSING_VALUE_TREATMENT,::com::sun::star::chart::MissingValueTreatment::CONTINUE)); + if (m_aCBIncludeHiddenCells.IsVisible()) + rOutAttrs.Put(SfxBoolItem(SCHATTR_INCLUDE_HIDDEN_CELLS, m_aCBIncludeHiddenCells.IsChecked())); + return TRUE; } @@ -212,13 +219,26 @@ void SchOptionTabPage::Reset(const SfxItemSet& rInAttrs) } else { + m_aFT_MissingValues.Show(FALSE); m_aRB_DontPaint.Show(FALSE); m_aRB_AssumeZero.Show(FALSE); m_aRB_ContinueLine.Show(FALSE); - m_aFL_EmptyCells.Show(FALSE); } } + // Include hidden cells + if (rInAttrs.GetItemState(SCHATTR_INCLUDE_HIDDEN_CELLS, TRUE, &pPoolItem) == SFX_ITEM_SET) + { + bool bVal = static_cast<const SfxBoolItem*>(pPoolItem)->GetValue(); + m_aCBIncludeHiddenCells.Check(bVal); + } + else + { + m_aCBIncludeHiddenCells.Show(FALSE); + if(!m_aFT_MissingValues.IsVisible()) + m_aFL_PlotOptions.Show(FALSE); + } + AdaptControlPositionsAndVisibility(); } @@ -231,6 +251,17 @@ void SchOptionTabPage::Init( bool bProvidesSecondaryYAxis, bool bProvidesOverlap AdaptControlPositionsAndVisibility(); } +void lcl_offsetControl(Control& rCtrl, long nXOffset, long nYOffset ) +{ + Point aPos = rCtrl.GetPosPixel(); + rCtrl.SetPosPixel( Point(aPos.getX() + nXOffset, aPos.getY() + nYOffset) ); +} + +void lcl_optimzeRadioButtonSize( RadioButton& rCtrl ) +{ + rCtrl.SetSizePixel( rCtrl.CalcMinimumSize() ); +} + void SchOptionTabPage::AdaptControlPositionsAndVisibility() { aRbtAxis1.Show(m_bProvidesSecondaryYAxis); @@ -254,20 +285,30 @@ void SchOptionTabPage::AdaptControlPositionsAndVisibility() else aPos = aGrpBar.GetPosPixel(); - long nDiffX = aRbtAxis1.GetPosPixel().getX() - aGrpAxis.GetPosPixel().getX(); - long nDiffY = aRbtAxis1.GetPosPixel().getY() - aGrpAxis.GetPosPixel().getY(); - long nDiffY1 = aRbtAxis2.GetPosPixel().getY() - aRbtAxis1.GetPosPixel().getY(); - - m_aFL_EmptyCells.SetPosPixel( aPos ); - m_aRB_DontPaint.SetPosPixel( Point( aPos.getX() + nDiffX, aPos.getY() + nDiffY ) ); - m_aRB_AssumeZero.SetPosPixel( Point( aPos.getX() + nDiffX, aPos.getY() + nDiffY + nDiffY1 ) ); - m_aRB_ContinueLine.SetPosPixel( Point( aPos.getX() + nDiffX, aPos.getY() + nDiffY + nDiffY1 * 2 ) ); + long nYOffset = aPos.getY() - m_aFL_PlotOptions.GetPosPixel().getY(); + lcl_offsetControl(m_aFL_PlotOptions, 0, nYOffset); + lcl_offsetControl(m_aFT_MissingValues, 0, nYOffset); + lcl_offsetControl(m_aRB_DontPaint, 0, nYOffset); + lcl_offsetControl(m_aRB_AssumeZero, 0, nYOffset); + lcl_offsetControl(m_aRB_ContinueLine, 0, nYOffset); + lcl_offsetControl(m_aCBIncludeHiddenCells, 0, nYOffset); } - if( !m_aRB_DontPaint.IsVisible() ) + m_aFT_MissingValues.SetSizePixel( m_aFT_MissingValues.CalcMinimumSize() ); + lcl_optimzeRadioButtonSize( m_aRB_DontPaint ); + lcl_optimzeRadioButtonSize( m_aRB_AssumeZero ); + lcl_optimzeRadioButtonSize( m_aRB_ContinueLine ); + + Size aControlDistance( m_aFT_MissingValues.LogicToPixel( Size(RSC_SP_CTRL_DESC_X,RSC_SP_CTRL_GROUP_Y), MapMode(MAP_APPFONT) ) ); + long nXOffset = m_aFT_MissingValues.GetPosPixel().getX() + m_aFT_MissingValues.GetSizePixel().getWidth() + aControlDistance.getWidth() - m_aRB_DontPaint.GetPosPixel().getX(); + lcl_offsetControl(m_aRB_DontPaint, nXOffset, 0); + lcl_offsetControl(m_aRB_AssumeZero, nXOffset, 0); + lcl_offsetControl(m_aRB_ContinueLine, nXOffset, 0); + + if( !m_aFT_MissingValues.IsVisible() ) { - m_aRB_ContinueLine.SetPosPixel( m_aRB_AssumeZero.GetPosPixel() ); - m_aRB_AssumeZero.SetPosPixel( m_aRB_DontPaint.GetPosPixel() ); + //for example for stock charts + m_aCBIncludeHiddenCells.SetPosPixel( m_aFT_MissingValues.GetPosPixel() ); } } //............................................................................. diff --git a/chart2/source/controller/dialogs/tp_SeriesToAxis.hrc b/chart2/source/controller/dialogs/tp_SeriesToAxis.hrc new file mode 100644 index 000000000..2e96dc7c5 --- /dev/null +++ b/chart2/source/controller/dialogs/tp_SeriesToAxis.hrc @@ -0,0 +1,48 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ,v $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "ResourceIds.hrc" + +#define GRP_OPT_AXIS 1 +#define RBT_OPT_AXIS_1 2 +#define RBT_OPT_AXIS_2 3 +#define MT_GAP 4 +#define MT_OVERLAP 5 +#define FT_GAP 6 +#define FT_OVERLAP 7 +#define GB_BAR 8 +#define CB_CONNECTOR 9 +#define CB_BARS_SIDE_BY_SIDE 10 +#define FL_PLOT_OPTIONS 11 +#define FT_MISSING_VALUES 12 +#define RB_DONT_PAINT 13 +#define RB_ASSUME_ZERO 14 +#define RB_CONTINUE_LINE 15 +#define CB_INCLUDE_HIDDEN_CELLS 16 diff --git a/chart2/source/controller/dialogs/tp_SeriesToAxis.hxx b/chart2/source/controller/dialogs/tp_SeriesToAxis.hxx index af1f7037d..d6516a07d 100644 --- a/chart2/source/controller/dialogs/tp_SeriesToAxis.hxx +++ b/chart2/source/controller/dialogs/tp_SeriesToAxis.hxx @@ -74,11 +74,14 @@ private: //member CheckBox aCBConnect; CheckBox aCBAxisSideBySide; - FixedLine m_aFL_EmptyCells; + FixedLine m_aFL_PlotOptions; + FixedText m_aFT_MissingValues; RadioButton m_aRB_DontPaint; RadioButton m_aRB_AssumeZero; RadioButton m_aRB_ContinueLine; + CheckBox m_aCBIncludeHiddenCells; + DECL_LINK(EnableHdl, RadioButton * ); sal_Int32 m_nAllSeriesAxisIndex; diff --git a/chart2/source/controller/dialogs/tp_SeriesToAxis.src b/chart2/source/controller/dialogs/tp_SeriesToAxis.src index 850e795ca..422e07b5a 100644 --- a/chart2/source/controller/dialogs/tp_SeriesToAxis.src +++ b/chart2/source/controller/dialogs/tp_SeriesToAxis.src @@ -28,7 +28,7 @@ * ************************************************************************/ #include "HelpIds.hrc" -#include "TabPages.hrc" +#include "tp_SeriesToAxis.hrc" TabPage TP_OPTIONS { @@ -120,7 +120,7 @@ TabPage TP_OPTIONS Pos = MAP_APPFONT ( 12 , 97 ) ; Size = MAP_APPFONT ( 200 , 10 ) ; TabStop = TRUE ; - Text [ en-US ] = "Connection Lines"; + Text [ en-US ] = "Connection lines"; }; CheckBox CB_BARS_SIDE_BY_SIDE @@ -131,16 +131,23 @@ TabPage TP_OPTIONS Text [ en-US ] = "Show ~bars side by side"; }; - FixedLine FL_PLOT_MISSING_VALUES + FixedLine FL_PLOT_OPTIONS { Pos = MAP_APPFONT ( 6 , 113 ) ; Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "Plot options"; + }; + + FixedText FT_MISSING_VALUES + { + Pos = MAP_APPFONT ( 12 , 127 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; Text [ en-US ] = "Plot missing values"; }; RadioButton RB_DONT_PAINT { - Pos = MAP_APPFONT ( 12 , 127 ) ; + Pos = MAP_APPFONT ( 82 , 127 ) ; Size = MAP_APPFONT ( 80 , 10 ) ; TabStop = TRUE ; Text [ en-US ] = "~Leave gap"; @@ -148,7 +155,7 @@ TabPage TP_OPTIONS RadioButton RB_ASSUME_ZERO { - Pos = MAP_APPFONT ( 12 , 141 ) ; + Pos = MAP_APPFONT ( 82 , 141 ) ; Size = MAP_APPFONT ( 80 , 10 ) ; TabStop = TRUE ; Text [ en-US ] = "~Assume zero"; @@ -156,9 +163,17 @@ TabPage TP_OPTIONS RadioButton RB_CONTINUE_LINE { - Pos = MAP_APPFONT ( 12 , 155 ) ; + Pos = MAP_APPFONT ( 82 , 155 ) ; Size = MAP_APPFONT ( 80 , 10 ) ; TabStop = TRUE ; Text [ en-US ] = "~Continue line"; - }; + }; + + CheckBox CB_INCLUDE_HIDDEN_CELLS + { + Pos = MAP_APPFONT ( 12 , 172 ) ; + Size = MAP_APPFONT ( 200 , 10 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Include ~values from hidden cells"; + }; }; diff --git a/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx b/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx index 59664495b..1f5ddc3db 100644 --- a/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx +++ b/chart2/source/controller/inc/SeriesOptionsItemConverter.hxx @@ -93,6 +93,9 @@ private: ::com::sun::star::uno::Sequence< sal_Int32 > m_aSupportedMissingValueTreatments; sal_Int32 m_nMissingValueTreatment; + + bool m_bSupportingPlottingOfHiddenCells; + bool m_bIncludeHiddenCells; }; } // namespace wrapper diff --git a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx index 806565f9d..a9910e8d9 100644 --- a/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx +++ b/chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx @@ -163,7 +163,8 @@ const USHORT nDataPointWhichPairs[] = SCHATTR_STARTING_ANGLE,SCHATTR_STARTING_ANGLE, \ SCHATTR_CLOCKWISE,SCHATTR_CLOCKWISE, \ SCHATTR_MISSING_VALUE_TREATMENT,SCHATTR_MISSING_VALUE_TREATMENT, \ - SCHATTR_AVAILABLE_MISSING_VALUE_TREATMENTS,SCHATTR_AVAILABLE_MISSING_VALUE_TREATMENTS + SCHATTR_AVAILABLE_MISSING_VALUE_TREATMENTS,SCHATTR_AVAILABLE_MISSING_VALUE_TREATMENTS, \ + SCHATTR_INCLUDE_HIDDEN_CELLS,SCHATTR_INCLUDE_HIDDEN_CELLS const USHORT nSeriesOptionsWhichPairs[] = { diff --git a/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx b/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx index eae94e82c..ad2aca805 100644 --- a/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx +++ b/chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx @@ -93,6 +93,8 @@ SeriesOptionsItemConverter::SeriesOptionsItemConverter( , m_bClockwise(false) , m_aSupportedMissingValueTreatments() , m_nMissingValueTreatment(0) + , m_bSupportingPlottingOfHiddenCells(false) + , m_bIncludeHiddenCells(true) { try { @@ -159,6 +161,23 @@ SeriesOptionsItemConverter::SeriesOptionsItemConverter( m_aSupportedMissingValueTreatments = ChartTypeHelper::getSupportedMissingValueTreatments( xChartType ); m_nMissingValueTreatment = DiagramHelper::getCorrectedMissingValueTreatment( ChartModelHelper::findDiagram(m_xChartModel), xChartType ); + + uno::Reference< XChartDocument > xChartDoc( m_xChartModel, uno::UNO_QUERY ); + uno::Reference< beans::XPropertySet > xProp( xChartDoc->getDataProvider(), uno::UNO_QUERY ); + if( xProp.is() ) + { + try + { + //test whether the data provider offers this property + xProp->getPropertyValue(C2U("IncludeHiddenCells")); + //if not exception is thrown the property is offered + m_bSupportingPlottingOfHiddenCells = true; + xDiagramProperties->getPropertyValue( C2U("IncludeHiddenCells") ) >>= m_bIncludeHiddenCells; + } + catch( const beans::UnknownPropertyException& ) + { + } + } } catch( uno::Exception ex ) { @@ -341,6 +360,16 @@ bool SeriesOptionsItemConverter::ApplySpecialItem( USHORT nWhichId, const SfxIte } } break; + case SCHATTR_INCLUDE_HIDDEN_CELLS: + { + if( m_bSupportingPlottingOfHiddenCells ) + { + bool bIncludeHiddenCells = static_cast<const SfxBoolItem &>(rItemSet.Get(nWhichId)).GetValue(); + if (bIncludeHiddenCells != m_bIncludeHiddenCells) + bChanged = ChartModelHelper::setIncludeHiddenCells( bIncludeHiddenCells, m_xChartModel ); + } + } + break; } return bChanged; } @@ -412,6 +441,12 @@ void SeriesOptionsItemConverter::FillSpecialItem( rOutItemSet.Put( SfxIntegerListItem( nWhichId, aList ) ); break; } + case SCHATTR_INCLUDE_HIDDEN_CELLS: + { + if( m_bSupportingPlottingOfHiddenCells ) + rOutItemSet.Put( SfxBoolItem(nWhichId, m_bIncludeHiddenCells) ); + break; + } default: break; } diff --git a/chart2/source/inc/CachedDataSequence.hxx b/chart2/source/inc/CachedDataSequence.hxx index e655e7d72..35f444ce0 100644 --- a/chart2/source/inc/CachedDataSequence.hxx +++ b/chart2/source/inc/CachedDataSequence.hxx @@ -167,8 +167,6 @@ protected: // <properties> sal_Int32 m_nNumberFormatKey; ::rtl::OUString m_sRole; - sal_Bool m_bIsHidden; - ::com::sun::star::uno::Sequence< sal_Int32 > m_aHiddenValues; // </properties> enum DataType diff --git a/chart2/source/inc/ChartModelHelper.hxx b/chart2/source/inc/ChartModelHelper.hxx index 0eb3aba39..6f68c7bae 100644 --- a/chart2/source/inc/ChartModelHelper.hxx +++ b/chart2/source/inc/ChartModelHelper.hxx @@ -87,6 +87,12 @@ public: static void triggerRangeHighlighting( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xModel ); + + static bool isIncludeHiddenCells( const ::com::sun::star::uno::Reference< + ::com::sun::star::frame::XModel >& xChartModel ); + + static bool setIncludeHiddenCells( bool bIncludeHiddenCells, const ::com::sun::star::uno::Reference< + ::com::sun::star::frame::XModel >& xChartModel ); }; //............................................................................. diff --git a/chart2/source/inc/DataSeriesHelper.hxx b/chart2/source/inc/DataSeriesHelper.hxx index 699c51c4f..48b520ee5 100644 --- a/chart2/source/inc/DataSeriesHelper.hxx +++ b/chart2/source/inc/DataSeriesHelper.hxx @@ -42,6 +42,7 @@ #include <vector> #include <functional> +#include <hash_set> namespace chart { @@ -180,6 +181,13 @@ OOO_DLLPUBLIC_CHARTTOOLS bool areAllSeriesAttachedToSameAxis( const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartType >& xChartType, sal_Int32 & rOutAxisIndex ); +OOO_DLLPUBLIC_CHARTTOOLS bool hasUnhiddenData( const ::com::sun::star::uno::Reference< + ::com::sun::star::chart2::XDataSeries >& xSeries ); + +OOO_DLLPUBLIC_CHARTTOOLS +sal_Int32 translateIndexFromHiddenToFullSequence( sal_Int32 nClippedIndex, const ::com::sun::star::uno::Reference< + ::com::sun::star::chart2::data::XDataSequence >& xDataSequence, bool bTranslate ); + } // namespace DataSeriesHelper } // namespace chart diff --git a/chart2/source/inc/RangeHighlighter.hxx b/chart2/source/inc/RangeHighlighter.hxx index a23752e74..eaec0a7b6 100644 --- a/chart2/source/inc/RangeHighlighter.hxx +++ b/chart2/source/inc/RangeHighlighter.hxx @@ -111,6 +111,7 @@ private: ::com::sun::star::uno::Sequence< ::com::sun::star::chart2::data::HighlightedRange > m_aSelectedRanges; sal_Int32 m_nAddedListenerCount; + bool m_bIncludeHiddenCells; }; } // namespace chart diff --git a/chart2/source/inc/UncachedDataSequence.hxx b/chart2/source/inc/UncachedDataSequence.hxx index 733c3eda9..3ced152f2 100644 --- a/chart2/source/inc/UncachedDataSequence.hxx +++ b/chart2/source/inc/UncachedDataSequence.hxx @@ -186,8 +186,6 @@ protected: // <properties> sal_Int32 m_nNumberFormatKey; ::rtl::OUString m_sRole; - sal_Bool m_bIsHidden; - ::com::sun::star::uno::Sequence< sal_Int32 > m_aHiddenValues; ::rtl::OUString m_aXMLRange; // </properties> diff --git a/chart2/source/inc/chartview/ChartSfxItemIds.hxx b/chart2/source/inc/chartview/ChartSfxItemIds.hxx index 52e47c0df..067389e57 100644 --- a/chart2/source/inc/chartview/ChartSfxItemIds.hxx +++ b/chart2/source/inc/chartview/ChartSfxItemIds.hxx @@ -209,8 +209,9 @@ #define SCHATTR_CLOCKWISE (SCHATTR_CHARTTYPE_START + 10) #define SCHATTR_MISSING_VALUE_TREATMENT (SCHATTR_CHARTTYPE_START + 11) #define SCHATTR_AVAILABLE_MISSING_VALUE_TREATMENTS (SCHATTR_CHARTTYPE_START + 12) +#define SCHATTR_INCLUDE_HIDDEN_CELLS (SCHATTR_CHARTTYPE_START + 13) -#define SCHATTR_CHARTTYPE_END SCHATTR_AVAILABLE_MISSING_VALUE_TREATMENTS +#define SCHATTR_CHARTTYPE_END SCHATTR_INCLUDE_HIDDEN_CELLS // items for transporting information to dialogs #define SCHATTR_MISC_START (SCHATTR_CHARTTYPE_END + 1) diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx index 6753bbc52..d89cdb3b5 100644 --- a/chart2/source/model/main/ChartModel.cxx +++ b/chart2/source/model/main/ChartModel.cxx @@ -43,6 +43,8 @@ #include "DisposeHelper.hxx" #include "ControllerLockGuard.hxx" #include "ObjectIdentifier.hxx" +#include "ChartModelHelper.hxx" + #include <comphelper/InlineContainer.hxx> #include <comphelper/processfactory.hxx> @@ -703,6 +705,19 @@ sal_Bool SAL_CALL ChartModel::hasInternalDataProvider() { // /-- MutexGuard aGuard( m_aModelMutex ); + uno::Reference< beans::XPropertySet > xProp( xProvider, uno::UNO_QUERY ); + if( xProp.is() ) + { + try + { + sal_Bool bIncludeHiddenCells = ChartModelHelper::isIncludeHiddenCells( Reference< frame::XModel >(this) ); + xProp->setPropertyValue(C2U("IncludeHiddenCells"), uno::makeAny(bIncludeHiddenCells)); + } + catch( const beans::UnknownPropertyException& ) + { + } + } + m_pImplChartModel->SetDataProvider( xProvider ); // \-- } diff --git a/chart2/source/model/main/ChartModel_Persistence.cxx b/chart2/source/model/main/ChartModel_Persistence.cxx index 23ca9206f..0fb90e043 100644 --- a/chart2/source/model/main/ChartModel_Persistence.cxx +++ b/chart2/source/model/main/ChartModel_Persistence.cxx @@ -37,6 +37,7 @@ #include "ChartDebugTrace.hxx" #include "macros.hxx" #include "ChartViewHelper.hxx" +#include "ChartModelHelper.hxx" #include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/document/XExporter.hpp> #include <com/sun/star/document/XImporter.hpp> @@ -407,6 +408,7 @@ void SAL_CALL ChartModel::initNew() try { m_pImplChartModel->CreateDefaultChart(); + ChartModelHelper::setIncludeHiddenCells( false, this ); } catch( uno::Exception & ex ) { diff --git a/chart2/source/model/main/Diagram.cxx b/chart2/source/model/main/Diagram.cxx index 02bf2b768..308ed191a 100644 --- a/chart2/source/model/main/Diagram.cxx +++ b/chart2/source/model/main/Diagram.cxx @@ -78,6 +78,7 @@ enum PROP_DIAGRAM_SORT_BY_X_VALUES, PROP_DIAGRAM_CONNECT_BARS, PROP_DIAGRAM_GROUP_BARS_PER_AXIS, + PROP_DIAGRAM_INCLUDE_HIDDEN_CELLS, PROP_DIAGRAM_STARTING_ANGLE, PROP_DIAGRAM_RIGHT_ANGLED_AXES, PROP_DIAGRAM_PERSPECTIVE, @@ -125,6 +126,13 @@ void lcl_AddPropertiesToVector( | beans::PropertyAttribute::MAYBEDEFAULT )); rOutProperties.push_back( + Property( C2U("IncludeHiddenCells"), + PROP_DIAGRAM_INCLUDE_HIDDEN_CELLS, + ::getBooleanCppuType(), + beans::PropertyAttribute::BOUND + | beans::PropertyAttribute::MAYBEDEFAULT )); + + rOutProperties.push_back( Property( C2U( "StartingAngle" ), PROP_DIAGRAM_STARTING_ANGLE, ::getCppuType( reinterpret_cast< const sal_Int32 * >(0) ), @@ -170,6 +178,7 @@ void lcl_AddDefaultsToMap( ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DIAGRAM_SORT_BY_X_VALUES, false ); ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DIAGRAM_CONNECT_BARS, false ); ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DIAGRAM_GROUP_BARS_PER_AXIS, true ); + ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DIAGRAM_INCLUDE_HIDDEN_CELLS, true ); ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DIAGRAM_RIGHT_ANGLED_AXES, false ); ::chart::PropertyHelper::setPropertyValueDefault< sal_Int32 >( rOutMap, PROP_DIAGRAM_STARTING_ANGLE, 90 ); } diff --git a/chart2/source/tools/CachedDataSequence.cxx b/chart2/source/tools/CachedDataSequence.cxx index 5d899bae9..736a82a6a 100644 --- a/chart2/source/tools/CachedDataSequence.cxx +++ b/chart2/source/tools/CachedDataSequence.cxx @@ -68,9 +68,7 @@ enum { // PROP_SOURCE_IDENTIFIER, PROP_NUMBERFORMAT_KEY, - PROP_PROPOSED_ROLE, - PROP_HIDDEN, - PROP_HIDDEN_VALUES + PROP_PROPOSED_ROLE }; } // anonymous namespace @@ -82,7 +80,6 @@ namespace chart CachedDataSequence::CachedDataSequence() : OPropertyContainer( GetBroadcastHelper()), CachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_eCurrentDataType( NUMERICAL ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) { @@ -91,7 +88,6 @@ CachedDataSequence::CachedDataSequence() CachedDataSequence::CachedDataSequence( const Reference< uno::XComponentContext > & /*xContext*/ ) : OPropertyContainer( GetBroadcastHelper()), CachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_eCurrentDataType( MIXED ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder( )) { @@ -101,7 +97,6 @@ CachedDataSequence::CachedDataSequence( const Reference< uno::XComponentContext CachedDataSequence::CachedDataSequence( const ::std::vector< double > & rVector ) : OPropertyContainer( GetBroadcastHelper()), CachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_eCurrentDataType( NUMERICAL ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) { @@ -112,7 +107,6 @@ CachedDataSequence::CachedDataSequence( const ::std::vector< double > & rVector CachedDataSequence::CachedDataSequence( const ::std::vector< OUString > & rVector ) : OPropertyContainer( GetBroadcastHelper()), CachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_eCurrentDataType( TEXTUAL ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) { @@ -123,7 +117,6 @@ CachedDataSequence::CachedDataSequence( const ::std::vector< OUString > & rVecto CachedDataSequence::CachedDataSequence( const OUString & rSingleText ) : OPropertyContainer( GetBroadcastHelper()), CachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_eCurrentDataType( TEXTUAL ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) { @@ -135,7 +128,6 @@ CachedDataSequence::CachedDataSequence( const OUString & rSingleText ) CachedDataSequence::CachedDataSequence( const ::std::vector< Any > & rVector ) : OPropertyContainer( GetBroadcastHelper()), CachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_eCurrentDataType( MIXED ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) { @@ -150,8 +142,6 @@ CachedDataSequence::CachedDataSequence( const CachedDataSequence & rSource ) CachedDataSequence_Base( GetMutex()), m_nNumberFormatKey( rSource.m_nNumberFormatKey ), m_sRole( rSource.m_sRole ), - m_bIsHidden( rSource.m_bIsHidden ), - m_aHiddenValues( rSource.m_aHiddenValues ), m_eCurrentDataType( rSource.m_eCurrentDataType ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) { @@ -187,18 +177,6 @@ void CachedDataSequence::registerProperties() 0, // PropertyAttributes & m_sRole, ::getCppuType( & m_sRole ) ); - - registerProperty( C2U( "IsHidden" ), - PROP_HIDDEN, - 0, // PropertyAttributes - & m_bIsHidden, - ::getCppuType( & m_bIsHidden ) ); - - registerProperty( C2U( "HiddenValues" ), - PROP_HIDDEN_VALUES, - 0, // PropertyAttributes - & m_aHiddenValues, - ::getCppuType( & m_aHiddenValues ) ); } Sequence< double > CachedDataSequence::Impl_getNumericalData() const diff --git a/chart2/source/tools/ChartModelHelper.cxx b/chart2/source/tools/ChartModelHelper.cxx index 1129fb488..b6d2ce9ba 100644 --- a/chart2/source/tools/ChartModelHelper.cxx +++ b/chart2/source/tools/ChartModelHelper.cxx @@ -33,6 +33,9 @@ #include "ChartModelHelper.hxx" #include "macros.hxx" #include "DiagramHelper.hxx" +#include "DataSourceHelper.hxx" +#include "ControllerLockGuard.hxx" + #include <com/sun/star/chart2/data/XDataReceiver.hpp> #include <com/sun/star/chart2/XChartDocument.hpp> #include <com/sun/star/chart2/XChartTypeContainer.hpp> @@ -137,6 +140,96 @@ void ChartModelHelper::triggerRangeHighlighting( const uno::Reference< frame::XM } } +bool ChartModelHelper::isIncludeHiddenCells( const uno::Reference< frame::XModel >& xChartModel ) +{ + bool bIncluded = true; // hidden cells are included by default. + + uno::Reference< chart2::XDiagram > xDiagram( ChartModelHelper::findDiagram(xChartModel) ); + if (!xDiagram.is()) + return bIncluded; + + uno::Reference< beans::XPropertySet > xProp( xDiagram, uno::UNO_QUERY ); + if (!xProp.is()) + return bIncluded; + + try + { + xProp->getPropertyValue(C2U("IncludeHiddenCells")) >>= bIncluded; + } + catch( const beans::UnknownPropertyException& ) + { + } + + return bIncluded; +} + +bool ChartModelHelper::setIncludeHiddenCells( bool bIncludeHiddenCells, const uno::Reference< frame::XModel >& xChartModel ) +{ + bool bChanged = false; + try + { + ControllerLockGuard aLockedControllers( xChartModel ); + + uno::Reference< beans::XPropertySet > xDiagramProperties( ChartModelHelper::findDiagram(xChartModel), uno::UNO_QUERY ); + if (xDiagramProperties.is()) + { + bool bOldValue = bIncludeHiddenCells; + xDiagramProperties->getPropertyValue( C2U("IncludeHiddenCells") ) >>= bOldValue; + if( bOldValue == bIncludeHiddenCells ) + bChanged = true; + + //set the property on all instances in all cases to get the different objects in sync! + + uno::Any aNewValue = uno::makeAny(bIncludeHiddenCells); + + try + { + uno::Reference< chart2::XChartDocument > xChartDoc( xChartModel, uno::UNO_QUERY ); + if( xChartDoc.is() ) + { + uno::Reference< beans::XPropertySet > xDataProviderProperties( xChartDoc->getDataProvider(), uno::UNO_QUERY ); + if( xDataProviderProperties.is() ) + xDataProviderProperties->setPropertyValue(C2U("IncludeHiddenCells"), aNewValue ); + } + } + catch( const beans::UnknownPropertyException& ) + { + //the property is optional! + } + + try + { + uno::Reference< chart2::data::XDataSource > xUsedData( DataSourceHelper::getUsedData( xChartModel ) ); + if( xUsedData.is() ) + { + uno::Reference< beans::XPropertySet > xProp; + uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aData( xUsedData->getDataSequences()); + for( sal_Int32 i=0; i<aData.getLength(); ++i ) + { + xProp.set( uno::Reference< beans::XPropertySet >( aData[i]->getValues(), uno::UNO_QUERY ) ); + if(xProp.is()) + xProp->setPropertyValue(C2U("IncludeHiddenCells"), aNewValue ); + xProp.set( uno::Reference< beans::XPropertySet >( aData[i]->getLabel(), uno::UNO_QUERY ) ); + if(xProp.is()) + xProp->setPropertyValue(C2U("IncludeHiddenCells"), aNewValue ); + } + } + } + catch( const beans::UnknownPropertyException& ) + { + //the property is optional! + } + + xDiagramProperties->setPropertyValue( C2U("IncludeHiddenCells"), aNewValue); + } + } + catch (uno::Exception& e) + { + ASSERT_EXCEPTION(e); + } + return bChanged; +} + //............................................................................. } //namespace chart //............................................................................. diff --git a/chart2/source/tools/DataSeriesHelper.cxx b/chart2/source/tools/DataSeriesHelper.cxx index daba96d2b..5d27ec144 100644 --- a/chart2/source/tools/DataSeriesHelper.cxx +++ b/chart2/source/tools/DataSeriesHelper.cxx @@ -644,5 +644,96 @@ bool areAllSeriesAttachedToSameAxis( const uno::Reference< chart2::XChartType >& } } +namespace +{ + +bool lcl_SequenceHasUnhiddenData( const uno::Reference< chart2::data::XDataSequence >& xDataSequence ) +{ + if( !xDataSequence.is() ) + return false; + uno::Reference< beans::XPropertySet > xProp( xDataSequence, uno::UNO_QUERY ); + if( xProp.is() ) + { + uno::Sequence< sal_Int32 > aHiddenValues; + try + { + xProp->getPropertyValue( C2U( "HiddenValues" ) ) >>= aHiddenValues; + if( !aHiddenValues.getLength() ) + return true; + } + catch( uno::Exception& e ) + { + (void)e; // avoid warning + return true; + } + } + if( xDataSequence->getData().getLength() ) + return true; + return false; +} + +} + +bool hasUnhiddenData( const uno::Reference< chart2::XDataSeries >& xSeries ) +{ + uno::Reference< chart2::data::XDataSource > xDataSource = + uno::Reference< chart2::data::XDataSource >( xSeries, uno::UNO_QUERY ); + + uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aDataSequences = xDataSource->getDataSequences(); + + for(sal_Int32 nN = aDataSequences.getLength();nN--;) + { + if( !aDataSequences[nN].is() ) + continue; + if( lcl_SequenceHasUnhiddenData( aDataSequences[nN]->getValues() ) ) + return true; + if( lcl_SequenceHasUnhiddenData( aDataSequences[nN]->getLabel() ) ) + return true; + } + return false; +} + +struct lcl_LessIndex +{ + inline bool operator() ( const sal_Int32& first, const sal_Int32& second ) + { + return ( first < second ); + } +}; + +sal_Int32 translateIndexFromHiddenToFullSequence( sal_Int32 nIndex, const Reference< chart2::data::XDataSequence >& xDataSequence, bool bTranslate ) +{ + if( !bTranslate ) + return nIndex; + + try + { + uno::Reference<beans::XPropertySet> xProp( xDataSequence, uno::UNO_QUERY ); + if( xProp.is()) + { + Sequence<sal_Int32> aHiddenIndicesSeq; + xProp->getPropertyValue( C2U("HiddenValues") ) >>= aHiddenIndicesSeq; + if( aHiddenIndicesSeq.getLength() ) + { + ::std::vector< sal_Int32 > aHiddenIndices( ContainerHelper::SequenceToVector( aHiddenIndicesSeq ) ); + ::std::sort( aHiddenIndices.begin(), aHiddenIndices.end(), lcl_LessIndex() ); + + sal_Int32 nHiddenCount = static_cast<sal_Int32>(aHiddenIndices.size()); + for( sal_Int32 nN = 0; nN < nHiddenCount; ++nN) + { + if( aHiddenIndices[nN] <= nIndex ) + nIndex += 1; + else + break; + } + } + } + } + catch (const beans::UnknownPropertyException&) + { + } + return nIndex; +} + } // namespace DataSeriesHelper } // namespace chart diff --git a/chart2/source/tools/ImplUndoManager.cxx b/chart2/source/tools/ImplUndoManager.cxx index d169091fa..f2309a90c 100644 --- a/chart2/source/tools/ImplUndoManager.cxx +++ b/chart2/source/tools/ImplUndoManager.cxx @@ -37,6 +37,7 @@ #include "ControllerLockGuard.hxx" #include "PropertyHelper.hxx" #include "DataSourceHelper.hxx" +#include "ChartModelHelper.hxx" #include <com/sun/star/chart/XChartDataArray.hpp> #include <com/sun/star/chart2/XChartDocument.hpp> @@ -170,6 +171,9 @@ void UndoElement::applyModelContentToModel( Reference< chart2::XChartDocument > xSource( xModelToCopyFrom, uno::UNO_QUERY_THROW ); Reference< chart2::XChartDocument > xDestination( xInOutModelToChange, uno::UNO_QUERY_THROW ); + // propagate the correct flag for plotting of hidden values to the data provider and all used sequences + ChartModelHelper::setIncludeHiddenCells( ChartModelHelper::isIncludeHiddenCells( xModelToCopyFrom ) , xInOutModelToChange ); + // diagram xDestination->setFirstDiagram( xSource->getFirstDiagram()); diff --git a/chart2/source/tools/RangeHighlighter.cxx b/chart2/source/tools/RangeHighlighter.cxx index c53b589d7..427312966 100644 --- a/chart2/source/tools/RangeHighlighter.cxx +++ b/chart2/source/tools/RangeHighlighter.cxx @@ -38,6 +38,7 @@ #include "ContainerHelper.hxx" #include "macros.hxx" #include "ObjectIdentifier.hxx" +#include "DataSeriesHelper.hxx" #include <com/sun/star/chart2/XDataSeries.hpp> #include <com/sun/star/chart/ErrorBarStyle.hpp> @@ -78,7 +79,8 @@ RangeHighlighter::RangeHighlighter( const Reference< view::XSelectionSupplier > & xSelectionSupplier ) : impl::RangeHighlighter_Base( m_aMutex ), m_xSelectionSupplier( xSelectionSupplier ), - m_nAddedListenerCount( 0 ) + m_nAddedListenerCount( 0 ), + m_bIncludeHiddenCells(true) { } @@ -104,6 +106,8 @@ void RangeHighlighter::determineRanges() if( xController.is()) xChartModel.set( xController->getModel()); + m_bIncludeHiddenCells = ChartModelHelper::isIncludeHiddenCells( xChartModel ); + uno::Any aSelection( m_xSelectionSupplier->getSelection()); OUString aCID; if(( aSelection >>= aCID ) && @@ -271,11 +275,13 @@ void RangeHighlighter::fillRangesForDataPoint( const Reference< uno::XInterface -1, nPreferredColor, sal_False )); + + sal_Int32 nUnhiddenIndex = DataSeriesHelper::translateIndexFromHiddenToFullSequence( nIndex, xValues, !m_bIncludeHiddenCells ); if( xValues.is()) aHilightedRanges.push_back( chart2::data::HighlightedRange( xValues->getSourceRangeRepresentation(), - nIndex, + nUnhiddenIndex, nPreferredColor, sal_False )); } diff --git a/chart2/source/tools/UncachedDataSequence.cxx b/chart2/source/tools/UncachedDataSequence.cxx index 704ca26e9..8eb7bd539 100644 --- a/chart2/source/tools/UncachedDataSequence.cxx +++ b/chart2/source/tools/UncachedDataSequence.cxx @@ -63,8 +63,6 @@ enum // PROP_SOURCE_IDENTIFIER, PROP_NUMBERFORMAT_KEY, PROP_PROPOSED_ROLE, - PROP_HIDDEN, - PROP_HIDDEN_VALUES, PROP_XML_RANGE }; } // anonymous namespace @@ -79,7 +77,6 @@ UncachedDataSequence::UncachedDataSequence( const OUString & rRangeRepresentation ) : OPropertyContainer( GetBroadcastHelper()), UncachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_xDataProvider( xIntDataProv ), m_aSourceRepresentation( rRangeRepresentation ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) @@ -93,7 +90,6 @@ UncachedDataSequence::UncachedDataSequence( const OUString & rRole ) : OPropertyContainer( GetBroadcastHelper()), UncachedDataSequence_Base( GetMutex()), - m_bIsHidden( true ), m_xDataProvider( xIntDataProv ), m_aSourceRepresentation( rRangeRepresentation ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) @@ -109,8 +105,6 @@ UncachedDataSequence::UncachedDataSequence( const UncachedDataSequence & rSource UncachedDataSequence_Base( GetMutex()), m_nNumberFormatKey( rSource.m_nNumberFormatKey ), m_sRole( rSource.m_sRole ), - m_bIsHidden( rSource.m_bIsHidden ), - m_aHiddenValues( rSource.m_aHiddenValues ), m_xDataProvider( rSource.m_xDataProvider ), m_aSourceRepresentation( rSource.m_aSourceRepresentation ), m_xModifyEventForwarder( new ModifyListenerHelper::ModifyEventForwarder()) @@ -135,18 +129,6 @@ void UncachedDataSequence::registerProperties() & m_sRole, ::getCppuType( & m_sRole ) ); - registerProperty( C2U( "IsHidden" ), - PROP_HIDDEN, - 0, // PropertyAttributes - & m_bIsHidden, - ::getCppuType( & m_bIsHidden ) ); - - registerProperty( C2U( "HiddenValues" ), - PROP_HIDDEN_VALUES, - 0, // PropertyAttributes - & m_aHiddenValues, - ::getCppuType( & m_aHiddenValues ) ); - registerProperty( C2U( "CachedXMLRange" ), PROP_XML_RANGE, 0, // PropertyAttributes diff --git a/chart2/source/view/axes/ScaleAutomatism.cxx b/chart2/source/view/axes/ScaleAutomatism.cxx index 7c5823621..3e412c4bc 100644 --- a/chart2/source/view/axes/ScaleAutomatism.cxx +++ b/chart2/source/view/axes/ScaleAutomatism.cxx @@ -134,7 +134,7 @@ void ScaleAutomatism::calculateExplicitScaleAndIncrement( if( m_aSourceScale.AxisType==AxisType::PERCENT ) rExplicitScale.Minimum = 0.0; else if( ::rtl::math::isNan( m_fValueMinimum ) ) - rExplicitScale.Minimum = 0.0; //@todo get Minimum from scsaling or from plotter???? + rExplicitScale.Minimum = 0.0; //@todo get Minimum from scaling or from plotter???? else rExplicitScale.Minimum = m_fValueMinimum; } @@ -143,7 +143,7 @@ void ScaleAutomatism::calculateExplicitScaleAndIncrement( if( bAutoMaximum ) { if( m_aSourceScale.AxisType==AxisType::PERCENT ) - rExplicitScale.Minimum = 1.0; + rExplicitScale.Maximum = 1.0; else if( ::rtl::math::isNan( m_fValueMaximum ) ) rExplicitScale.Maximum = 10.0; //@todo get Maximum from scaling or from plotter???? else diff --git a/chart2/source/view/inc/VDataSeries.hxx b/chart2/source/view/inc/VDataSeries.hxx index e41340c7c..7e11efdac 100644 --- a/chart2/source/view/inc/VDataSeries.hxx +++ b/chart2/source/view/inc/VDataSeries.hxx @@ -59,7 +59,7 @@ class VDataSequence { public: void init( const ::com::sun::star::uno::Reference< - ::com::sun::star::chart2::data::XDataSequence >& xModel); + ::com::sun::star::chart2::data::XDataSequence >& xModel ); bool is() const; void clear(); double getValue( sal_Int32 index ) const; diff --git a/chart2/source/view/main/ChartItemPool.cxx b/chart2/source/view/main/ChartItemPool.cxx index e00deac2d..4cc869967 100644 --- a/chart2/source/view/main/ChartItemPool.cxx +++ b/chart2/source/view/main/ChartItemPool.cxx @@ -184,6 +184,7 @@ ChartItemPool::ChartItemPool(): ppPoolDefaults[SCHATTR_DIAGRAM_STYLE - SCHATTR_START] = new SvxChartStyleItem( CHSTYLE_2D_COLUMN, SCHATTR_DIAGRAM_STYLE ); ppPoolDefaults[SCHATTR_TEXTBREAK - SCHATTR_START] = new SfxBoolItem( SCHATTR_TEXTBREAK, FALSE ); ppPoolDefaults[SCHATTR_GROUP_BARS_PER_AXIS - SCHATTR_START] = new SfxBoolItem(SCHATTR_GROUP_BARS_PER_AXIS, FALSE); + ppPoolDefaults[SCHATTR_INCLUDE_HIDDEN_CELLS - SCHATTR_START] = new SfxBoolItem(SCHATTR_INCLUDE_HIDDEN_CELLS, TRUE); ppPoolDefaults[SCHATTR_STARTING_ANGLE - SCHATTR_START] = new SfxInt32Item( SCHATTR_STARTING_ANGLE, 90 ); ppPoolDefaults[SCHATTR_CLOCKWISE - SCHATTR_START] = new SfxBoolItem( SCHATTR_CLOCKWISE, FALSE ); diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx index 69bd598c6..4e8eac0ed 100644 --- a/chart2/source/view/main/ChartView.cxx +++ b/chart2/source/view/main/ChartView.cxx @@ -631,6 +631,7 @@ void SeriesPlotterContainer::initializeCooSysAndSeriesPlotter( sal_Bool bSortByXValues = sal_False; sal_Bool bConnectBars = sal_False; sal_Bool bGroupBarsPerAxis = sal_True; + sal_Bool bIncludeHiddenCells = sal_True; sal_Int32 nStartingAngle = 90; try { @@ -638,6 +639,7 @@ void SeriesPlotterContainer::initializeCooSysAndSeriesPlotter( xDiaProp->getPropertyValue( C2U( "SortByXValues" ) ) >>= bSortByXValues; xDiaProp->getPropertyValue( C2U( "ConnectBars" ) ) >>= bConnectBars; xDiaProp->getPropertyValue( C2U( "GroupBarsPerAxis" ) ) >>= bGroupBarsPerAxis; + xDiaProp->getPropertyValue( C2U( "IncludeHiddenCells" ) ) >>= bIncludeHiddenCells; xDiaProp->getPropertyValue( C2U( "StartingAngle" ) ) >>= nStartingAngle; } catch( const uno::Exception & ex ) @@ -703,6 +705,9 @@ void SeriesPlotterContainer::initializeCooSysAndSeriesPlotter( uno::Reference< XDataSeries > xDataSeries( aSeriesList[nS], uno::UNO_QUERY ); if(!xDataSeries.is()) continue; + if( !bIncludeHiddenCells && !DataSeriesHelper::hasUnhiddenData(xDataSeries) ) + continue; + VDataSeries* pSeries = new VDataSeries( xDataSeries ); pSeries->setGlobalSeriesIndex(nGlobalSeriesIndex); diff --git a/chart2/source/view/main/VDataSeries.cxx b/chart2/source/view/main/VDataSeries.cxx index f7a81e9a5..eb90adbd5 100644 --- a/chart2/source/view/main/VDataSeries.cxx +++ b/chart2/source/view/main/VDataSeries.cxx @@ -37,6 +37,7 @@ #include "LabelPositionHelper.hxx" #include "ChartTypeHelper.hxx" #include "ContainerHelper.hxx" +#include "DataSeriesHelper.hxx" #include "MeanValueRegressionCurveCalculator.hxx" #include <com/sun/star/chart/MissingValueTreatment.hpp> @@ -61,87 +62,10 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::chart2; using ::com::sun::star::uno::Reference; -namespace -{ - struct lcl_LessIndex - { - inline bool operator() ( const sal_Int32& first, - const sal_Int32& second ) - { - return ( first < second ); - } - }; - - void lcl_removeIndices( uno::Sequence< double >& rValues, const uno::Sequence< sal_Int32 >& rIndicesToRemove ) - { - if( !rIndicesToRemove.getLength() ) - return; - - ::std::vector< sal_Int32 > aIndicesToRemove( ContainerHelper::SequenceToVector( rIndicesToRemove) ); - ::std::sort( aIndicesToRemove.begin(), aIndicesToRemove.end(), lcl_LessIndex() ); - - sal_Int32 nTarget=0; - sal_Int32 nR = 0; - sal_Int32 nRemove = aIndicesToRemove[nR]; - for( sal_Int32 nSource=0; nSource<rValues.getLength(); nSource++ ) - { - if( nSource<nRemove || nRemove==-1 ) - { - if( nTarget < nSource ) - rValues[nTarget]=rValues[nSource]; - nTarget++; - continue; - } - if( nSource==nRemove ) - { - ++nR; - if( nR<static_cast<sal_Int32>(aIndicesToRemove.size()) ) - nRemove = aIndicesToRemove[nR]; - else - nRemove = -1; - } - } - - if( nTarget>0 ) - rValues.realloc( nTarget ); - else - rValues.realloc(0); - } -} - void VDataSequence::init( const uno::Reference< data::XDataSequence >& xModel ) { - bool bDisplayHiddenCells = true; //todo: make this configurable in future - bool bIsHidden = false; - uno::Sequence< sal_Int32 > aHiddenValues; - if( !bDisplayHiddenCells ) - { - uno::Reference<beans::XPropertySet> xProp(xModel, uno::UNO_QUERY ); - if( xProp.is()) - { - try - { - xProp->getPropertyValue( C2U( "IsHidden" ) ) >>= bIsHidden; - xProp->getPropertyValue( C2U( "HiddenValues" ) ) >>= aHiddenValues; - } - catch( uno::Exception& e ) - { - ASSERT_EXCEPTION( e ); - } - } - } - Model = xModel; - if( bDisplayHiddenCells || !bIsHidden ) - Doubles = DataSequenceToDoubleSequence( xModel ); - - if( !bDisplayHiddenCells ) - { - if( bIsHidden ) - Doubles.realloc(0); - else if( aHiddenValues.getLength() ) - lcl_removeIndices( Doubles, aHiddenValues ); - } + Doubles = DataSequenceToDoubleSequence( xModel ); } bool VDataSequence::is() const diff --git a/sc/inc/chart2uno.hxx b/sc/inc/chart2uno.hxx index 288de0003..93afe6491 100644 --- a/sc/inc/chart2uno.hxx +++ b/sc/inc/chart2uno.hxx @@ -35,6 +35,7 @@ #include "rangelst.hxx" #include "externalrefmgr.hxx" #include "token.hxx" +#include "chartlis.hxx" #include <svtools/lstner.hxx> #include <com/sun/star/chart/ChartDataRowSource.hpp> @@ -54,7 +55,6 @@ // #include <com/sun/star/lang/XUnoTunnel.hpp> // #endif #include <cppuhelper/implbase2.hxx> -#include <cppuhelper/implbase3.hxx> #include <cppuhelper/implbase4.hxx> #include <cppuhelper/implbase6.hxx> #include <cppuhelper/implbase7.hxx> @@ -74,9 +74,10 @@ class ScDocument; // DataProvider ============================================================== class ScChart2DataProvider : public - ::cppu::WeakImplHelper3< + ::cppu::WeakImplHelper4< ::com::sun::star::chart2::data::XDataProvider, ::com::sun::star::chart2::data::XRangeXMLConversion, + ::com::sun::star::beans::XPropertySet, ::com::sun::star::lang::XServiceInfo>, SfxListener { @@ -125,6 +126,59 @@ public: virtual ::rtl::OUString SAL_CALL convertRangeFromXML( const ::rtl::OUString& sXMLRange ) throw ( ::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IllegalArgumentException ); + // XPropertySet ---------------------------------------------------------- + + virtual ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertySetInfo> SAL_CALL + getPropertySetInfo() throw( ::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL setPropertyValue( + const ::rtl::OUString& rPropertyName, + const ::com::sun::star::uno::Any& rValue) + throw( ::com::sun::star::beans::UnknownPropertyException, + ::com::sun::star::beans::PropertyVetoException, + ::com::sun::star::lang::IllegalArgumentException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException); + + virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( + const ::rtl::OUString& rPropertyName) + throw( ::com::sun::star::beans::UnknownPropertyException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL addPropertyChangeListener( + const ::rtl::OUString& rPropertyName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertyChangeListener>& xListener) + throw( ::com::sun::star::beans::UnknownPropertyException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL removePropertyChangeListener( + const ::rtl::OUString& rPropertyName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XPropertyChangeListener>& rListener) + throw( ::com::sun::star::beans::UnknownPropertyException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL addVetoableChangeListener( + const ::rtl::OUString& rPropertyName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XVetoableChangeListener>& rListener) + throw( ::com::sun::star::beans::UnknownPropertyException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL removeVetoableChangeListener( + const ::rtl::OUString& rPropertyName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::beans::XVetoableChangeListener>& rListener) + throw( ::com::sun::star::beans::UnknownPropertyException, + ::com::sun::star::lang::WrappedTargetException, + ::com::sun::star::uno::RuntimeException); + // XServiceInfo ---------------------------------------------------------- virtual ::rtl::OUString SAL_CALL getImplementationName() throw( @@ -158,6 +212,8 @@ private: private: ScDocument* m_pDocument; + SfxItemPropertySet m_aPropSet; + sal_Bool m_bIncludeHiddenCells; }; @@ -287,7 +343,7 @@ class ScChart2DataSequence : public public: explicit ScChart2DataSequence( ScDocument* pDoc, const com::sun::star::uno::Reference< com::sun::star::chart2::data::XDataProvider >& xDP, - ::std::vector<ScSharedTokenRef>* pTokens); + ::std::vector<ScSharedTokenRef>* pTokens, bool bIncludeHiddenCells ); virtual ~ScChart2DataSequence(); virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); @@ -404,6 +460,9 @@ public: // static ScChart2DataSequence* getImplementation( const com::sun::star::uno::Reference< // com::sun::star::uno::XInterface> xObj ); +private: + void setDataChangedHint(bool b); + // Implementation -------------------------------------------------------- void RefChanged(); @@ -461,12 +520,24 @@ private: Item(); }; + class HiddenRangeListener : public ScChartHiddenRangeListener + { + public: + HiddenRangeListener(ScChart2DataSequence& rParent); + virtual ~HiddenRangeListener(); + + virtual void notify(); + + private: + ScChart2DataSequence& mrParent; + }; + ::std::list<Item> m_aDataArray; ::com::sun::star::uno::Sequence<sal_Int32> m_aHiddenValues; // properties ::com::sun::star::chart2::data::DataSequenceRole m_aRole; - sal_Bool m_bHidden; + sal_Bool m_bIncludeHiddenCells; // internals typedef ::std::auto_ptr< ::std::vector<ScSharedTokenRef> > TokenListPtr; @@ -481,6 +552,7 @@ private: com::sun::star::uno::Reference < com::sun::star::chart2::data::XDataProvider > m_xDataProvider; SfxItemPropertySet m_aPropSet; + ::std::auto_ptr<HiddenRangeListener> m_pHiddenListener; ScLinkListener* m_pValueListener; XModifyListenerArr_Impl m_aValueListeners; @@ -625,7 +697,7 @@ private: // properties ::com::sun::star::chart2::data::DataSequenceRole m_aRole; - sal_Bool m_bHidden; + sal_Bool m_bIncludeHiddenCells; // internals ScRangeListRef m_xRanges; ScDocument* m_pDocument; diff --git a/sc/inc/chartlis.hxx b/sc/inc/chartlis.hxx index 33650ddb4..a8a97d3b4 100644 --- a/sc/inc/chartlis.hxx +++ b/sc/inc/chartlis.hxx @@ -41,6 +41,7 @@ #include <memory> #include <vector> +#include <list> #include <hash_set> class ScDocument; @@ -131,9 +132,31 @@ public: { return !operator==( r ); } }; +// ============================================================================ + +class ScChartHiddenRangeListener +{ +public: + ScChartHiddenRangeListener(); + virtual ~ScChartHiddenRangeListener(); + virtual void notify() = 0; +}; + +// ============================================================================ + class ScChartListenerCollection : public ScStrCollection { +public: + struct RangeListenerItem + { + ScRange maRange; + ScChartHiddenRangeListener* mpListener; + explicit RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p); + }; + private: + ::std::list<RangeListenerItem> maHiddenListeners; + Timer aTimer; ScDocument* pDoc; @@ -173,6 +196,24 @@ public: void UpdateChartsContainingTab( SCTAB nTab ); BOOL operator==( const ScChartListenerCollection& ); + + /** + * Start listening on hide/show change within specified cell range. A + * single listener may listen on multiple ranges when the caller passes + * the same pointer multiple times with different ranges. + * + * Note that the caller is responsible for managing the life-cycle of the + * listener instance. + */ + void StartListeningHiddenRange( const ScRange& rRange, + ScChartHiddenRangeListener* pListener ); + + /** + * Remove all ranges associated with passed listener instance from the + * list of hidden range listeners. This does not delete the passed + * listener instance. + */ + void EndListeningHiddenRange( ScChartHiddenRangeListener* pListener ); }; diff --git a/sc/inc/unonames.hxx b/sc/inc/unonames.hxx index 9cccc82a0..9df643fa0 100644 --- a/sc/inc/unonames.hxx +++ b/sc/inc/unonames.hxx @@ -608,8 +608,9 @@ #define SC_UNO_COMPILEFAP "CompileFAP" // Chart2 -#define SC_UNONAME_ISHIDDEN "IsHidden" -#define SC_UNONAME_ROLE "Role" +#define SC_UNONAME_ROLE "Role" +#define SC_UNONAME_HIDDENVALUES "HiddenValues" +#define SC_UNONAME_INCLUDEHIDDENCELLS "IncludeHiddenCells" #define SC_UNONAME_HIDDENVALUES "HiddenValues" // Solver diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index 707e34683..e84d3e43f 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -623,8 +623,6 @@ void ScTable::CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, { // Charts muessen beim Ein-/Ausblenden angepasst werden ScChartListenerCollection* pCharts = pDestTab->pDocument->GetChartListenerCollection(); - if ( pCharts && !pCharts->GetCount() ) - pCharts = NULL; BOOL bWidth = (nRow1==0 && nRow2==MAXROW && pColWidth && pDestTab->pColWidth); BOOL bHeight = (nCol1==0 && nCol2==MAXCOL && pRowHeight && pDestTab->pRowHeight); @@ -2254,7 +2252,7 @@ void ScTable::ShowCol(SCCOL nCol, BOOL bShow) SetDrawPageSize(); ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection(); - if ( pCharts && pCharts->GetCount() ) + if ( pCharts ) pCharts->SetRangeDirty(ScRange( nCol, 0, nTab, nCol, MAXROW, nTab )); } } @@ -2291,7 +2289,7 @@ void ScTable::ShowRow(SCROW nRow, BOOL bShow) SetDrawPageSize(); ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection(); - if ( pCharts && pCharts->GetCount() ) + if ( pCharts ) pCharts->SetRangeDirty(ScRange( 0, nRow, nTab, MAXCOL, nRow, nTab )); } } @@ -2332,7 +2330,7 @@ void ScTable::DBShowRow(SCROW nRow, BOOL bShow) if (bWasVis != bShow) { ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection(); - if ( pCharts && pCharts->GetCount() ) + if ( pCharts ) pCharts->SetRangeDirty(ScRange( 0, nRow, nTab, MAXCOL, nRow, nTab )); if (pOutlineTable) @@ -2380,7 +2378,7 @@ void ScTable::DBShowRows(SCROW nRow1, SCROW nRow2, BOOL bShow) if ( bChanged ) { ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection(); - if ( pCharts && pCharts->GetCount() ) + if ( pCharts ) pCharts->SetRangeDirty(ScRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab )); } @@ -2432,7 +2430,7 @@ void ScTable::ShowRows(SCROW nRow1, SCROW nRow2, BOOL bShow) if ( bChanged ) { ScChartListenerCollection* pCharts = pDocument->GetChartListenerCollection(); - if ( pCharts && pCharts->GetCount() ) + if ( pCharts ) pCharts->SetRangeDirty(ScRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab )); } diff --git a/sc/source/core/tool/chartlis.cxx b/sc/source/core/tool/chartlis.cxx index 8c4e87638..00af942cd 100644 --- a/sc/source/core/tool/chartlis.cxx +++ b/sc/source/core/tool/chartlis.cxx @@ -42,6 +42,7 @@ using namespace com::sun::star; using ::std::vector; +using ::std::list; using ::std::hash_set; using ::std::auto_ptr; using ::std::unary_function; @@ -454,9 +455,24 @@ BOOL ScChartListener::operator==( const ScChartListener& r ) return *mpTokens == *r.mpTokens; } +// ============================================================================ + +ScChartHiddenRangeListener::ScChartHiddenRangeListener() +{ +} + +ScChartHiddenRangeListener::~ScChartHiddenRangeListener() +{ + // empty d'tor +} // === ScChartListenerCollection ====================================== +ScChartListenerCollection::RangeListenerItem::RangeListenerItem(const ScRange& rRange, ScChartHiddenRangeListener* p) : + maRange(rRange), mpListener(p) +{ +} + ScChartListenerCollection::ScChartListenerCollection( ScDocument* pDocP ) : ScStrCollection( 4, 4, FALSE ), pDoc( pDocP ) @@ -643,6 +659,14 @@ void ScChartListenerCollection::SetRangeDirty( const ScRange& rRange ) } if ( bDirty ) StartTimer(); + + // New hidden range listener implementation + for (list<RangeListenerItem>::iterator itr = maHiddenListeners.begin(), itrEnd = maHiddenListeners.end(); + itr != itrEnd; ++itr) + { + if (itr->maRange.Intersects(rRange)) + itr->mpListener->notify(); + } } @@ -682,6 +706,34 @@ BOOL ScChartListenerCollection::operator==( const ScChartListenerCollection& r ) return TRUE; } +void ScChartListenerCollection::StartListeningHiddenRange( const ScRange& rRange, ScChartHiddenRangeListener* pListener ) +{ + RangeListenerItem aItem(rRange, pListener); + maHiddenListeners.push_back(aItem); +} + +namespace { + +struct MatchListener : public ::std::unary_function< + ScChartListenerCollection::RangeListenerItem, bool> +{ + MatchListener(const ScChartHiddenRangeListener* pMatch) : + mpMatch(pMatch) + { + } + + bool operator() (const ScChartListenerCollection::RangeListenerItem& rItem) const + { + return mpMatch == rItem.mpListener; + } +private: + const ScChartHiddenRangeListener* mpMatch; +}; +} +void ScChartListenerCollection::EndListeningHiddenRange( ScChartHiddenRangeListener* pListener ) +{ + maHiddenListeners.remove_if(MatchListener(pListener)); +} diff --git a/sc/source/core/tool/chartpos.cxx b/sc/source/core/tool/chartpos.cxx index 36ea08299..2327555de 100644 --- a/sc/source/core/tool/chartpos.cxx +++ b/sc/source/core/tool/chartpos.cxx @@ -307,27 +307,18 @@ void ScChartPositioner::CheckColRowHeaders() if ( aRangeListRef->Count() == 1 ) { aRangeListRef->First()->GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); - // Beschriftungen auch nach hidden Cols/Rows finden - while ( nCol1 <= nCol2 && (pDocument->GetColFlags( - nCol1, nTab1) & CR_HIDDEN) != 0 ) - nCol1++; - while ( nRow1 <= nRow2 && (pDocument->GetRowFlags( - nRow1, nTab1) & CR_HIDDEN) != 0 ) - nRow1++; if ( nCol1 > nCol2 || nRow1 > nRow2 ) bColStrings = bRowStrings = FALSE; else { for (iCol=nCol1; iCol<=nCol2 && bColStrings; iCol++) { - if ( iCol==nCol1 || (pDocument->GetColFlags( iCol, nTab1) & CR_HIDDEN) == 0 ) - if (pDocument->HasValueData( iCol, nRow1, nTab1 )) + if (pDocument->HasValueData( iCol, nRow1, nTab1 )) bColStrings = FALSE; } for (iRow=nRow1; iRow<=nRow2 && bRowStrings; iRow++) { - if ( iRow==nRow1 || (pDocument->GetRowFlags( iRow, nTab1) & CR_HIDDEN) == 0 ) - if (pDocument->HasValueData( nCol1, iRow, nTab1 )) + if (pDocument->HasValueData( nCol1, iRow, nTab1 )) bRowStrings = FALSE; } } @@ -341,43 +332,22 @@ void ScChartPositioner::CheckColRowHeaders() { pR->GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); BOOL bTopRow = (nRow1 == nStartRow); - BOOL bHidOk; if ( bRowStrings && (bVert || nCol1 == nStartCol) ) { // NONE oder ROWS: RowStrings in jeder Selektion moeglich // COLS oder BOTH: nur aus der ersten Spalte - while ( nCol1 <= nCol2 && (pDocument->GetColFlags( - nCol1, nTab1) & CR_HIDDEN) != 0 ) - nCol1++; - while ( nRow1 <= nRow2 && (pDocument->GetRowFlags( - nRow1, nTab1) & CR_HIDDEN) != 0 ) - nRow1++; if ( nCol1 <= nCol2 ) for (iRow=nRow1; iRow<=nRow2 && bRowStrings; iRow++) { - if ( iRow==nRow1 || (pDocument->GetRowFlags( iRow, nTab1) & CR_HIDDEN) == 0 ) - if (pDocument->HasValueData( nCol1, iRow, nTab1 )) + if (pDocument->HasValueData( nCol1, iRow, nTab1 )) bRowStrings = FALSE; } - bHidOk = TRUE; } - else - bHidOk = FALSE; if ( bColStrings && bTopRow ) { // ColStrings nur aus der ersten Zeile - if ( !bHidOk ) - { - while ( nCol1 <= nCol2 && (pDocument->GetColFlags( - nCol1, nTab1) & CR_HIDDEN) != 0 ) - nCol1++; - while ( nRow1 <= nRow2 && (pDocument->GetRowFlags( - nRow1, nTab1) & CR_HIDDEN) != 0 ) - nRow1++; - } if ( nRow1 <= nRow2 ) for (iCol=nCol1; iCol<=nCol2 && bColStrings; iCol++) { - if ( iCol==nCol1 || (pDocument->GetColFlags( iCol, nTab1) & CR_HIDDEN) == 0 ) - if (pDocument->HasValueData( iCol, nRow1, nTab1 )) + if (pDocument->HasValueData( iCol, nRow1, nTab1 )) bColStrings = FALSE; } } @@ -439,40 +409,34 @@ void ScChartPositioner::CreatePositionMap() static_cast<ULONG>(nCol1)); for ( nCol = nCol1; nCol <= nCol2; ++nCol, ++nInsCol ) { - if ( (pDocument->GetColFlags( nCol, nTab) & CR_HIDDEN) == 0 ) - { - if ( bNoGlue || eGlue == SC_CHARTGLUE_ROWS ) - { // meistens gleiche Cols - if ( (pCol = (Table*) pCols->Get( nInsCol ))==NULL ) - { - pCols->Insert( nInsCol, pNewRowTable ); - pCol = pNewRowTable; - pNewRowTable = new Table; - } + if ( bNoGlue || eGlue == SC_CHARTGLUE_ROWS ) + { // meistens gleiche Cols + if ( (pCol = (Table*) pCols->Get( nInsCol ))==NULL ) + { + pCols->Insert( nInsCol, pNewRowTable ); + pCol = pNewRowTable; + pNewRowTable = new Table; } - else - { // meistens neue Cols - if ( pCols->Insert( nInsCol, pNewRowTable ) ) - { - pCol = pNewRowTable; - pNewRowTable = new Table; - } - else - pCol = (Table*) pCols->Get( nInsCol ); + } + else + { // meistens neue Cols + if ( pCols->Insert( nInsCol, pNewRowTable ) ) + { + pCol = pNewRowTable; + pNewRowTable = new Table; } - // bei anderer Tabelle wurde bereits neuer ColKey erzeugt, - // die Zeilen muessen fuer's Dummy fuellen gleich sein! - ULONG nInsRow = (bNoGlue ? nNoGlueRow : nRow1); - for ( nRow = nRow1; nRow <= nRow2; nRow++, nInsRow++ ) + else + pCol = (Table*) pCols->Get( nInsCol ); + } + // bei anderer Tabelle wurde bereits neuer ColKey erzeugt, + // die Zeilen muessen fuer's Dummy fuellen gleich sein! + ULONG nInsRow = (bNoGlue ? nNoGlueRow : nRow1); + for ( nRow = nRow1; nRow <= nRow2; nRow++, nInsRow++ ) + { + if ( pCol->Insert( nInsRow, pNewAddress ) ) { - if ( (pDocument->GetRowFlags( nRow, nTab) & CR_HIDDEN) == 0 ) - { - if ( pCol->Insert( nInsRow, pNewAddress ) ) - { - pNewAddress->Set( nCol, nRow, nTab ); - pNewAddress = new ScAddress; - } - } + pNewAddress->Set( nCol, nRow, nTab ); + pNewAddress = new ScAddress; } } } diff --git a/sc/source/filter/excel/xechart.cxx b/sc/source/filter/excel/xechart.cxx index 36e528f86..a1ccd4ed1 100644 --- a/sc/source/filter/excel/xechart.cxx +++ b/sc/source/filter/excel/xechart.cxx @@ -2740,7 +2740,7 @@ XclExpChChart::XclExpChChart( const XclExpRoot& rRoot, maRect.mnWidth = static_cast< sal_Int32 >( aPtSize.Width() << 16 ); maRect.mnHeight = static_cast< sal_Int32 >( aPtSize.Height() << 16 ); - // global chart properties + // global chart properties (default values) ::set_flag( maProps.mnFlags, EXC_CHPROPS_MANSERIES ); ::set_flag( maProps.mnFlags, EXC_CHPROPS_SHOWVISIBLEONLY, false ); maProps.mnEmptyMode = EXC_CHPROPS_EMPTY_SKIP; @@ -2751,6 +2751,13 @@ XclExpChChart::XclExpChChart( const XclExpRoot& rRoot, if( xChartDoc.is() ) { + Reference< XDiagram > xDiagram = xChartDoc->getFirstDiagram(); + + // global chart properties (only 'include hidden cells' attribute for now) + ScfPropertySet aDiagramProp( xDiagram ); + bool bIncludeHidden = aDiagramProp.GetBoolProperty( EXC_CHPROP_INCLUDEHIDDENCELLS ); + ::set_flag( maProps.mnFlags, EXC_CHPROPS_SHOWVISCELLS, !bIncludeHidden ); + // initialize API conversion (remembers xChartDoc internally) InitConversion( xChartDoc ); @@ -2763,7 +2770,6 @@ XclExpChChart::XclExpChChart( const XclExpRoot& rRoot, mxTitle = lclCreateTitle( GetChRoot(), xTitled, EXC_CHOBJLINK_TITLE ); // diagrams (axes sets) - Reference< XDiagram > xDiagram = xChartDoc->getFirstDiagram(); sal_uInt16 nFreeGroupIdx = mxPrimAxesSet->Convert( xDiagram, 0 ); if( !mxPrimAxesSet->Is3dChart() ) mxSecnAxesSet->Convert( xDiagram, nFreeGroupIdx ); diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx index a4e518c87..9aac9dcca 100644 --- a/sc/source/filter/excel/xichart.cxx +++ b/sc/source/filter/excel/xichart.cxx @@ -40,6 +40,7 @@ #include <com/sun/star/drawing/ProjectionMode.hpp> #include <com/sun/star/drawing/ShadeMode.hpp> #include <com/sun/star/chart/ChartAxisPosition.hpp> +#include <com/sun/star/chart/XChartDocument.hpp> #include <com/sun/star/chart2/XChartDocument.hpp> #include <com/sun/star/chart2/XDiagram.hpp> #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp> @@ -3415,6 +3416,15 @@ void XclImpChChart::Convert( Reference< XChartDocument > xChartDoc, ScfProgressB if( xDiagram.is() && mxLegend.is() ) xDiagram->setLegend( mxLegend->CreateLegend() ); + // set the IncludeHiddenCells property via the old API as only this ensures that the data provider and al created sequences get this flag correctly + Reference< com::sun::star::chart::XChartDocument > xStandardApiChartDoc( xChartDoc, UNO_QUERY ); + if( xStandardApiChartDoc.is() ) + { + ScfPropertySet aDiagramProp( xStandardApiChartDoc->getDiagram() ); + bool bShowVisCells = (maProps.mnFlags & EXC_CHPROPS_SHOWVISCELLS); + aDiagramProp.SetBoolProperty( EXC_CHPROP_INCLUDEHIDDENCELLS, !bShowVisCells ); + } + // unlock the model FinishConversion( rProgress ); } @@ -3427,6 +3437,11 @@ void XclImpChChart::ReadChSeries( XclImpStream& rStrm ) maSeries.push_back( xSeries ); } +void XclImpChChart::ReadChProperties( XclImpStream& rStrm ) +{ + rStrm >> maProps.mnFlags >> maProps.mnEmptyMode; +} + void XclImpChChart::ReadChAxesSet( XclImpStream& rStrm ) { XclImpChAxesSetRef xAxesSet( new XclImpChAxesSet( GetChRoot(), EXC_CHAXESSET_NONE ) ); diff --git a/sc/source/filter/inc/xichart.hxx b/sc/source/filter/inc/xichart.hxx index b87eaf58b..d85f25167 100644 --- a/sc/source/filter/inc/xichart.hxx +++ b/sc/source/filter/inc/xichart.hxx @@ -1348,6 +1348,8 @@ public: private: /** Reads a CHSERIES group (data series source and formatting). */ void ReadChSeries( XclImpStream& rStrm ); + /** Reads a CHPROPERTIES record. */ + void ReadChProperties( XclImpStream& rStrm ); /** Reads a CHAXESSET group (primary/secondary axes set). */ void ReadChAxesSet( XclImpStream& rStrm ); /** Reads a CHTEXT group (chart title and series/point captions). */ diff --git a/sc/source/filter/inc/xlchart.hxx b/sc/source/filter/inc/xlchart.hxx index ffc7d8264..7038fc1c5 100644 --- a/sc/source/filter/inc/xlchart.hxx +++ b/sc/source/filter/inc/xlchart.hxx @@ -97,6 +97,7 @@ namespace com { namespace sun { namespace star { #define EXC_CHPROP_FILLSTYLE CREATE_OUSTRING( "FillStyle" ) #define EXC_CHPROP_GAPWIDTHSEQ CREATE_OUSTRING( "GapwidthSequence" ) #define EXC_CHPROP_GEOMETRY3D CREATE_OUSTRING( "Geometry3D" ) +#define EXC_CHPROP_INCLUDEHIDDENCELLS CREATE_OUSTRING( "IncludeHiddenCells" ) #define EXC_CHPROP_JAPANESE CREATE_OUSTRING( "Japanese" ) #define EXC_CHPROP_LABEL CREATE_OUSTRING( "Label" ) #define EXC_CHPROP_LABELPLACEMENT CREATE_OUSTRING( "LabelPlacement" ) diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx index f73ca2064..a4439bb40 100644 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ b/sc/source/ui/unoobj/chart2uno.cxx @@ -45,6 +45,7 @@ #include "unoreflist.hxx" #include "compiler.hxx" #include "reftokenhelper.hxx" +#include "chartlis.hxx" #include <sfx2/objsh.hxx> #include <tools/table.hxx> @@ -89,12 +90,23 @@ using ::boost::shared_ptr; namespace { +const SfxItemPropertyMap* lcl_GetDataProviderPropertyMap() +{ + static SfxItemPropertyMap aDataProviderPropertyMap_Impl[] = + { + {MAP_CHAR_LEN(SC_UNONAME_INCLUDEHIDDENCELLS), 0, &getBooleanCppuType(), 0, 0 }, + {0,0,0,0,0,0} + }; + return aDataProviderPropertyMap_Impl; +} + const SfxItemPropertyMap* lcl_GetDataSequencePropertyMap() { static SfxItemPropertyMap aDataSequencePropertyMap_Impl[] = { - {MAP_CHAR_LEN(SC_UNONAME_ISHIDDEN), 0, &getBooleanCppuType(), 0, 0 }, + {MAP_CHAR_LEN(SC_UNONAME_HIDDENVALUES), 0, &getCppuType((uno::Sequence<sal_Int32>*)0 ), 0, 0 }, {MAP_CHAR_LEN(SC_UNONAME_ROLE), 0, &getCppuType((::com::sun::star::chart2::data::DataSequenceRole*)0), 0, 0 }, + {MAP_CHAR_LEN(SC_UNONAME_INCLUDEHIDDENCELLS), 0, &getBooleanCppuType(), 0, 0 }, {0,0,0,0,0,0} }; return aDataSequencePropertyMap_Impl; @@ -656,9 +668,6 @@ void Chart2Positioner::createPositionMap() (bNoGlue ? 0 : static_cast<sal_uInt32>(nCol1)); for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol, ++nInsCol) { - if ((mpDoc->GetColFlags(nCol, nTab) & CR_HIDDEN) != 0) - continue; - if (bNoGlue || meGlue == GLUETYPE_ROWS) { pCol = static_cast<Table*>(pCols->Get(nInsCol)); @@ -683,9 +692,6 @@ void Chart2Positioner::createPositionMap() sal_uInt32 nInsRow = static_cast<sal_uInt32>(bNoGlue ? nNoGlueRow : nRow1); for (SCROW nRow = nRow1; nRow <= nRow2; ++nRow, ++nInsRow) { - if ((mpDoc->GetRowFlags(nRow, nTab) & CR_HIDDEN) != 0) - continue; - ScSingleRefData aCellData; aCellData.InitFlags(); aCellData.SetFlag3D(true); @@ -966,6 +972,8 @@ void lcl_convertTokenToString(OUString& rStr, const ScSharedTokenRef& rToken, Sc ScChart2DataProvider::ScChart2DataProvider( ScDocument* pDoc ) : m_pDocument( pDoc) + , m_aPropSet(lcl_GetDataProviderPropertyMap()) + , m_bIncludeHiddenCells( sal_True) { if ( m_pDocument ) m_pDocument->AddUnoObject( *this); @@ -1348,7 +1356,7 @@ private: { bool bExternal = ScRefTokenHelper::isExternalRef(mpHeaderCell); if (bExternal != ScRefTokenHelper::isExternalRef(pRange)) - // internval vs external. + // internal vs external. return false; if (bExternal) @@ -1498,7 +1506,7 @@ ScChart2DataProvider::createDataSource( { auto_ptr< vector<ScSharedTokenRef> > pTokens(new vector<ScSharedTokenRef>); pTokens->push_back(pLabelToken); - Reference < chart2::data::XDataSequence > xLabelSeq(new ScChart2DataSequence(m_pDocument, this, pTokens.release())); + Reference < chart2::data::XDataSequence > xLabelSeq(new ScChart2DataSequence(m_pDocument, this, pTokens.release(), m_bIncludeHiddenCells)); Reference< beans::XPropertySet > xLabelProps(xLabelSeq, uno::UNO_QUERY); if (xLabelProps.is()) xLabelProps->setPropertyValue( @@ -1511,7 +1519,7 @@ ScChart2DataProvider::createDataSource( } auto_ptr< vector<ScSharedTokenRef> > pTokens(new vector<ScSharedTokenRef>); pTokens->swap(aRefTokens2); - uno::Reference< chart2::data::XDataSequence > xSeq( new ScChart2DataSequence( m_pDocument, this, pTokens.release()) ); + uno::Reference< chart2::data::XDataSequence > xSeq( new ScChart2DataSequence( m_pDocument, this, pTokens.release(), m_bIncludeHiddenCells) ); pHeader->setValues(xSeq); } if (pHeader) @@ -1569,7 +1577,7 @@ ScChart2DataProvider::createDataSource( auto_ptr< vector<ScSharedTokenRef> > pTokens(new vector<ScSharedTokenRef>); pTokens->reserve(1); pTokens->push_back(pHeaderCell); - xLabelSeq.set(new ScChart2DataSequence(m_pDocument, this, pTokens.release())); + xLabelSeq.set(new ScChart2DataSequence(m_pDocument, this, pTokens.release(), m_bIncludeHiddenCells)); uno::Reference< beans::XPropertySet > xLabelProps(xLabelSeq, uno::UNO_QUERY); if (xLabelProps.is()) xLabelProps->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ROLE)), uno::makeAny(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("label")))); @@ -1586,7 +1594,7 @@ ScChart2DataProvider::createDataSource( // FIXME: if there are no labels the column or row name should be taken - uno::Reference < chart2::data::XDataSequence > xSeq(new ScChart2DataSequence(m_pDocument, this, pRanges.release())); + uno::Reference < chart2::data::XDataSequence > xSeq(new ScChart2DataSequence(m_pDocument, this, pRanges.release(), m_bIncludeHiddenCells)); pLabeled->setValues(xSeq); pLabeled->setLabel(xLabelSeq); @@ -2197,7 +2205,7 @@ uno::Reference< chart2::data::XDataSequence > SAL_CALL // ScChart2DataSequence manages the life cycle of pRefTokens. vector<ScSharedTokenRef>* pRefTokens = new vector<ScSharedTokenRef>(); pRefTokens->swap(aRefTokens); - xResult.set(new ScChart2DataSequence(m_pDocument, this, pRefTokens)); + xResult.set(new ScChart2DataSequence(m_pDocument, this, pRefTokens, m_bIncludeHiddenCells)); return xResult; } @@ -2375,6 +2383,88 @@ private: } +// DataProvider XPropertySet ------------------------------------------------- + +uno::Reference< beans::XPropertySetInfo> SAL_CALL +ScChart2DataProvider::getPropertySetInfo() throw( uno::RuntimeException) +{ + ScUnoGuard aGuard; + static uno::Reference<beans::XPropertySetInfo> aRef = + new SfxItemPropertySetInfo( m_aPropSet.getPropertyMap() ); + return aRef; +} + + +void SAL_CALL ScChart2DataProvider::setPropertyValue( + const ::rtl::OUString& rPropertyName, const uno::Any& rValue) + throw( beans::UnknownPropertyException, + beans::PropertyVetoException, + lang::IllegalArgumentException, + lang::WrappedTargetException, uno::RuntimeException) +{ + if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) + { + if ( !(rValue >>= m_bIncludeHiddenCells)) + throw lang::IllegalArgumentException(); + } + else + throw beans::UnknownPropertyException(); +} + + +uno::Any SAL_CALL ScChart2DataProvider::getPropertyValue( + const ::rtl::OUString& rPropertyName) + throw( beans::UnknownPropertyException, + lang::WrappedTargetException, uno::RuntimeException) +{ + uno::Any aRet; + if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) + aRet <<= m_bIncludeHiddenCells; + else + throw beans::UnknownPropertyException(); + return aRet; +} + + +void SAL_CALL ScChart2DataProvider::addPropertyChangeListener( + const ::rtl::OUString& /*rPropertyName*/, + const uno::Reference< beans::XPropertyChangeListener>& /*xListener*/) + throw( beans::UnknownPropertyException, + lang::WrappedTargetException, uno::RuntimeException) +{ + OSL_ENSURE( false, "Not yet implemented" ); +} + + +void SAL_CALL ScChart2DataProvider::removePropertyChangeListener( + const ::rtl::OUString& /*rPropertyName*/, + const uno::Reference< beans::XPropertyChangeListener>& /*rListener*/) + throw( beans::UnknownPropertyException, + lang::WrappedTargetException, uno::RuntimeException) +{ + OSL_ENSURE( false, "Not yet implemented" ); +} + + +void SAL_CALL ScChart2DataProvider::addVetoableChangeListener( + const ::rtl::OUString& /*rPropertyName*/, + const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/) + throw( beans::UnknownPropertyException, + lang::WrappedTargetException, uno::RuntimeException) +{ + OSL_ENSURE( false, "Not yet implemented" ); +} + + +void SAL_CALL ScChart2DataProvider::removeVetoableChangeListener( + const ::rtl::OUString& /*rPropertyName*/, + const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/ ) + throw( beans::UnknownPropertyException, + lang::WrappedTargetException, uno::RuntimeException) +{ + OSL_ENSURE( false, "Not yet implemented" ); +} + void ScChart2DataProvider::detectRangesFromDataSource(vector<ScSharedTokenRef>& rRefTokens, chart::ChartDataRowSource& rRowSource, bool& rRowSourceDetected, @@ -2660,10 +2750,25 @@ ScChart2DataSequence::Item::Item() : ::rtl::math::setNan(&mfValue); } +ScChart2DataSequence::HiddenRangeListener::HiddenRangeListener(ScChart2DataSequence& rParent) : + mrParent(rParent) +{ +} + +ScChart2DataSequence::HiddenRangeListener::~HiddenRangeListener() +{ +} + +void ScChart2DataSequence::HiddenRangeListener::notify() +{ + mrParent.setDataChangedHint(true); +} + ScChart2DataSequence::ScChart2DataSequence( ScDocument* pDoc, const uno::Reference < chart2::data::XDataProvider >& xDP, - vector<ScSharedTokenRef>* pTokens) - : m_bHidden( sal_False) + vector<ScSharedTokenRef>* pTokens, + bool bIncludeHiddenCells ) + : m_bIncludeHiddenCells( bIncludeHiddenCells) , m_nObjectId( 0 ) , m_pDocument( pDoc) , m_pTokens(pTokens) @@ -2671,6 +2776,7 @@ ScChart2DataSequence::ScChart2DataSequence( ScDocument* pDoc, , m_pExtRefListener(NULL) , m_xDataProvider( xDP) , m_aPropSet(lcl_GetDataSequencePropertyMap()) + , m_pHiddenListener(NULL) , m_pValueListener( NULL ) , m_bGotDataChangedHint(false) , m_bExtDataRebuildQueued(false) @@ -2700,6 +2806,12 @@ ScChart2DataSequence::~ScChart2DataSequence() if ( m_pDocument ) { m_pDocument->RemoveUnoObject( *this); + if (m_pHiddenListener.get()) + { + ScChartListenerCollection* pCLC = m_pDocument->GetChartListenerCollection(); + if (pCLC) + pCLC->EndListeningHiddenRange(m_pHiddenListener.get()); + } StopListeningToAllExternalRefs(); } @@ -2714,6 +2826,14 @@ void ScChart2DataSequence::RefChanged() if( m_pDocument ) { + ScChartListenerCollection* pCLC = NULL; + if (m_pHiddenListener.get()) + { + pCLC = m_pDocument->GetChartListenerCollection(); + if (pCLC) + pCLC->EndListeningHiddenRange(m_pHiddenListener.get()); + } + vector<ScSharedTokenRef>::const_iterator itr = m_pTokens->begin(), itrEnd = m_pTokens->end(); for (; itr != itrEnd; ++itr) { @@ -2722,6 +2842,8 @@ void ScChart2DataSequence::RefChanged() continue; m_pDocument->StartListeningArea(aRange, m_pValueListener); + if (pCLC) + pCLC->StartListeningHiddenRange(aRange, m_pHiddenListener.get()); } } } @@ -2765,17 +2887,21 @@ void ScChart2DataSequence::BuildDataCache() { for (SCROW nRow = aRange.aStart.Row(); nRow <= aRange.aEnd.Row(); ++nRow) { - m_aDataArray.push_back(Item()); - Item& rItem = m_aDataArray.back(); - ++nDataCount; - USHORT nWidth = m_pDocument->GetColWidth(nCol, nTab); - USHORT nHeight = m_pDocument->GetRowHeight(nRow, nTab); - if (!nWidth || !nHeight) + bool bColHidden = (m_pDocument->GetColFlags(nCol, nTab) & CR_HIDDEN); + bool bRowHidden = (m_pDocument->GetRowFlags(nRow, nTab) & CR_HIDDEN); + if (bColHidden || bRowHidden) { // hidden cell ++nHiddenValueCount; aHiddenValues.push_back(nDataCount-1); + + if( !m_bIncludeHiddenCells ) + continue; } + + m_aDataArray.push_back(Item()); + Item& rItem = m_aDataArray.back(); + ++nDataCount; ScAddress aAdr(nCol, nRow, nTab); ScBaseCell* pCell = m_pDocument->GetCell(aAdr); @@ -2987,7 +3113,6 @@ void ScChart2DataSequence::CopyData(const ScChart2DataSequence& r) m_aHiddenValues = r.m_aHiddenValues; m_aRole = r.m_aRole; - m_bHidden = r.m_bHidden; if (r.m_pRangeIndices.get()) m_pRangeIndices.reset(new vector<sal_uInt32>(*r.m_pRangeIndices)); @@ -3023,7 +3148,8 @@ void ScChart2DataSequence::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint // delayed broadcast as in ScCellRangesBase if ( m_bGotDataChangedHint && m_pDocument ) - { + { + m_aDataArray.clear(); m_aDataArray.clear(); lang::EventObject aEvent; aEvent.Source.set((cppu::OWeakObject*)this); @@ -3124,7 +3250,7 @@ IMPL_LINK( ScChart2DataSequence, ValueListenerHdl, SfxHint*, pHint ) // in the range are notified. So only a flag is set that is checked when // SFX_HINT_DATACHANGED is received. - m_bGotDataChangedHint = true; + setDataChangedHint(true); } return 0; } @@ -3513,7 +3639,7 @@ uno::Reference< util::XCloneable > SAL_CALL ScChart2DataSequence::createClone() } } - auto_ptr<ScChart2DataSequence> p(new ScChart2DataSequence(m_pDocument, m_xDataProvider, pTokensNew.release())); + auto_ptr<ScChart2DataSequence> p(new ScChart2DataSequence(m_pDocument, m_xDataProvider, pTokensNew.release(), m_bIncludeHiddenCells)); p->CopyData(*this); Reference< util::XCloneable > xClone(p.release()); @@ -3541,11 +3667,23 @@ void SAL_CALL ScChart2DataSequence::addModifyListener( const uno::Reference< uti if (!m_pValueListener) m_pValueListener = new ScLinkListener( LINK( this, ScChart2DataSequence, ValueListenerHdl ) ); + if (!m_pHiddenListener.get()) + m_pHiddenListener.reset(new HiddenRangeListener(*this)); + if( m_pDocument ) { - ULONG nCount = aRanges.Count(); - for (ULONG i=0; i<nCount; i++) - m_pDocument->StartListeningArea( *aRanges.GetObject(i), m_pValueListener ); + ScChartListenerCollection* pCLC = m_pDocument->GetChartListenerCollection(); + vector<ScSharedTokenRef>::const_iterator itr = m_pTokens->begin(), itrEnd = m_pTokens->end(); + for (; itr != itrEnd; ++itr) + { + ScRange aRange; + if (!ScRefTokenHelper::getRangeFromToken(aRange, *itr)) + continue; + + m_pDocument->StartListeningArea( aRange, m_pValueListener ); + if (pCLC) + pCLC->StartListeningHiddenRange(aRange, m_pHiddenListener.get()); + } } acquire(); // don't lose this object (one ref for all listeners) @@ -3576,6 +3714,13 @@ void SAL_CALL ScChart2DataSequence::removeModifyListener( const uno::Reference< if (m_pValueListener) m_pValueListener->EndListeningAll(); + if (m_pHiddenListener.get() && m_pDocument) + { + ScChartListenerCollection* pCLC = m_pDocument->GetChartListenerCollection(); + if (pCLC) + pCLC->EndListeningHiddenRange(m_pHiddenListener.get()); + } + release(); // release the ref for the listeners } @@ -3610,10 +3755,13 @@ void SAL_CALL ScChart2DataSequence::setPropertyValue( if ( !(rValue >>= m_aRole)) throw lang::IllegalArgumentException(); } - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISHIDDEN))) + else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) { - if ( !(rValue >>= m_bHidden)) + sal_Bool bOldValue = m_bIncludeHiddenCells; + if ( !(rValue >>= m_bIncludeHiddenCells)) throw lang::IllegalArgumentException(); + if( bOldValue != m_bIncludeHiddenCells ) + m_aDataArray.clear();//data array is dirty now } else throw beans::UnknownPropertyException(); @@ -3629,8 +3777,8 @@ uno::Any SAL_CALL ScChart2DataSequence::getPropertyValue( uno::Any aRet; if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ROLE))) aRet <<= m_aRole; - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISHIDDEN))) - aRet <<= m_bHidden; + else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) + aRet <<= m_bIncludeHiddenCells; else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(SC_UNONAME_HIDDENVALUES))) { // This property is read-only thus cannot be set externally via @@ -3692,6 +3840,11 @@ void SAL_CALL ScChart2DataSequence::removeVetoableChangeListener( OSL_ENSURE( false, "Not yet implemented" ); } +void ScChart2DataSequence::setDataChangedHint(bool b) +{ + m_bGotDataChangedHint = b; +} + // XUnoTunnel // sal_Int64 SAL_CALL ScChart2DataSequence::getSomething( @@ -3740,7 +3893,7 @@ ScChart2EmptyDataSequence::ScChart2EmptyDataSequence( ScDocument* pDoc, const uno::Reference < chart2::data::XDataProvider >& xDP, const ScRangeListRef& rRangeList, sal_Bool bColumn) - : m_bHidden( sal_False) + : m_bIncludeHiddenCells( sal_True) , m_xRanges( rRangeList) , m_pDocument( pDoc) , m_xDataProvider( xDP) @@ -3889,8 +4042,8 @@ uno::Reference< util::XCloneable > SAL_CALL ScChart2EmptyDataSequence::createClo { xProp->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ROLE )), uno::makeAny( m_aRole )); - xProp->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ISHIDDEN )), - uno::makeAny( m_bHidden )); + xProp->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS )), + uno::makeAny( m_bIncludeHiddenCells )); } return xClone; } @@ -3935,9 +4088,9 @@ void SAL_CALL ScChart2EmptyDataSequence::setPropertyValue( if ( !(rValue >>= m_aRole)) throw lang::IllegalArgumentException(); } - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISHIDDEN))) + else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) { - if ( !(rValue >>= m_bHidden)) + if ( !(rValue >>= m_bIncludeHiddenCells)) throw lang::IllegalArgumentException(); } else @@ -3954,8 +4107,8 @@ uno::Any SAL_CALL ScChart2EmptyDataSequence::getPropertyValue( uno::Any aRet; if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ROLE))) aRet <<= m_aRole; - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISHIDDEN))) - aRet <<= m_bHidden; + else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) + aRet <<= m_bIncludeHiddenCells; else throw beans::UnknownPropertyException(); // TODO: support optional properties |