[Libreoffice-commits] core.git: Branch 'feature/chart-opengl2' - 16 commits - chart2/inc chart2/Library_chartcore.mk chart2/source offapi/com offapi/UnoApi_offapi.mk sc/inc sc/source

Markus Mohrhard markus.mohrhard at googlemail.com
Wed Jan 1 21:23:34 PST 2014


 chart2/Library_chartcore.mk                          |    1 
 chart2/inc/ChartModel.hxx                            |   12 +
 chart2/inc/ChartView.hxx                             |   34 +++++
 chart2/source/controller/dialogs/DialogModel.cxx     |   12 +
 chart2/source/controller/dialogs/DialogModel.hxx     |    6 
 chart2/source/controller/dialogs/tp_RangeChooser.cxx |   20 +++
 chart2/source/controller/dialogs/tp_RangeChooser.hrc |    5 
 chart2/source/controller/dialogs/tp_RangeChooser.hxx |    5 
 chart2/source/controller/dialogs/tp_RangeChooser.src |   26 +++-
 chart2/source/model/main/ChartModel.cxx              |   57 ++++++++
 chart2/source/view/inc/VDataSeries.hxx               |   19 ++
 chart2/source/view/inc/VSeriesPlotter.hxx            |    4 
 chart2/source/view/main/ChartView.cxx                |   90 +++++++++++++
 chart2/source/view/main/DummyXShape.cxx              |    3 
 chart2/source/view/main/OpenglShapeFactory.cxx       |    1 
 chart2/source/view/main/VDataSeries.cxx              |   52 +++++++-
 offapi/UnoApi_offapi.mk                              |    1 
 offapi/com/sun/star/chart2/XTimeBased.idl            |   39 ++++++
 sc/inc/chart2uno.hxx                                 |   18 ++
 sc/source/ui/unoobj/chart2uno.cxx                    |  123 ++++++++++++++++++-
 20 files changed, 510 insertions(+), 18 deletions(-)

New commits:
commit c4b918c34c327c62c92a4bfadb41026b2321b867
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Jan 2 08:04:03 2014 +0100

    give up with the nice solutions and enjoy the ugly hack
    
    I was always hitting a corner case so it seems that this need some
    drastic measures.
    
    Change-Id: I3fdd278b9c3fed178513d653ef24ad8adf20cbd2

diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx
index b251920..c04a5b8 100644
--- a/chart2/inc/ChartModel.hxx
+++ b/chart2/inc/ChartModel.hxx
@@ -587,6 +587,11 @@ public:
     void setTimeBased(bool bTimeBased);
 
     void getNextTimePoint();
+    void setTimeBasedRange(sal_Int32 nStart, sal_Int32 nEnd);
+
+    sal_Int32 mnStart;
+    sal_Int32 mnEnd;
+    bool bSet;
 };
 
 }  // namespace chart
diff --git a/chart2/source/controller/dialogs/DialogModel.cxx b/chart2/source/controller/dialogs/DialogModel.cxx
index c6d4f84..0285548 100644
--- a/chart2/source/controller/dialogs/DialogModel.cxx
+++ b/chart2/source/controller/dialogs/DialogModel.cxx
@@ -716,6 +716,11 @@ bool DialogModel::setData(
     return true;
 }
 
+void DialogModel::setTimeBasedRange(sal_Int32 nStart, sal_Int32 nEnd) const
+{
+    getModel().setTimeBasedRange(nStart, nEnd);
+}
+
 OUString DialogModel::ConvertRoleFromInternalToUI( const OUString & rRoleString )
 {
     return lcl_ConvertRole( rRoleString, true );
@@ -820,6 +825,13 @@ sal_Int32 DialogModel::countSeries() const
     return ::std::accumulate( aCnt.begin(), aCnt.end(), 0, lcl_addSeriesNumber());
 }
 
+ChartModel& DialogModel::getModel() const
+{
+    uno::Reference< frame::XModel > xModel = getChartModel();
+    ChartModel* pModel = dynamic_cast<ChartModel*>(xModel.get());
+    return *pModel;
+}
+
 } //  namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/dialogs/DialogModel.hxx b/chart2/source/controller/dialogs/DialogModel.hxx
index ee236cf..f6735f5 100644
--- a/chart2/source/controller/dialogs/DialogModel.hxx
+++ b/chart2/source/controller/dialogs/DialogModel.hxx
@@ -24,6 +24,8 @@
 #include <com/sun/star/frame/XModel.hpp>
 #include <com/sun/star/uno/XComponentContext.hpp>
 
+#include "ChartModel.hxx"
+
 #include <vector>
 #include <map>
 #include <boost/shared_ptr.hpp>
@@ -140,6 +142,8 @@ public:
     bool setData( const ::com::sun::star::uno::Sequence<
                       ::com::sun::star::beans::PropertyValue > & rArguments );
 
+    void setTimeBasedRange( sal_Int32 nStart, sal_Int32 nEnd) const;
+
     void startControllerLockTimer();
 
     static OUString ConvertRoleFromInternalToUI( const OUString & rRoleString );
@@ -177,6 +181,8 @@ private:
         bool bSetStyles );
 
     sal_Int32 countSeries() const;
+
+    ChartModel& getModel() const;
 };
 
 } //  namespace chart
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.cxx b/chart2/source/controller/dialogs/tp_RangeChooser.cxx
index a7e429e..39467e7 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.cxx
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.cxx
@@ -90,6 +90,9 @@ RangeChooserTabPage::RangeChooserTabPage( Window* pParent
         , m_aCB_FirstRowAsLabel( this, SchResId( CB_FIRST_ROW_ASLABELS ) )
         , m_aCB_FirstColumnAsLabel( this, SchResId( CB_FIRST_COLUMN_ASLABELS ) )
         , m_aCB_TimeBased( this, SchResId( CB_TIME_BASED ) )
+        , m_aFt_TimeBased( this, SchResId(FT_TIME_BASED ) )
+        , m_aEd_TimeStart( this, SchResId( ED_TIME_START ) )
+        , m_aEd_TimeEnd( this, SchResId( ED_TIME_END ) )
         , m_nChangingControlCalls(0)
         , m_bIsDirty(false)
         , m_xDataProvider( 0 )
@@ -267,6 +270,13 @@ void RangeChooserTabPage::changeDialogModelAccordingToControls()
                                       beans::PropertyState_DIRECT_VALUE );
             m_rDialogModel.setData( aArguments );
             m_bIsDirty = false;
+
+            if(bTimeBased)
+            {
+                sal_Int32 nStart = m_aEd_TimeStart.GetText().toInt32();
+                sal_Int32 nEnd = m_aEd_TimeEnd.GetText().toInt32();
+                m_rDialogModel.setTimeBasedRange(nStart, nEnd);
+            }
         }
 
         //@todo warn user that the selected range is not valid
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.hrc b/chart2/source/controller/dialogs/tp_RangeChooser.hrc
index 7d7e6ba..8318183 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.hrc
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.hrc
@@ -32,5 +32,8 @@
 #define CB_FIRST_COLUMN_ASLABELS    2
 
 #define CB_TIME_BASED         3
+#define FT_TIME_BASED         4
+#define ED_TIME_START         5
+#define ED_TIME_END           6
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.hxx b/chart2/source/controller/dialogs/tp_RangeChooser.hxx
index c6f5c61..54fcb519 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.hxx
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.hxx
@@ -90,6 +90,9 @@ protected: //member
     CheckBox        m_aCB_FirstColumnAsLabel;
 
     CheckBox        m_aCB_TimeBased;
+    FixedText       m_aFt_TimeBased;
+    Edit            m_aEd_TimeStart;
+    Edit            m_aEd_TimeEnd;
 
     sal_Int32       m_nChangingControlCalls;
     bool            m_bIsDirty;
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.src b/chart2/source/controller/dialogs/tp_RangeChooser.src
index d19af78..dc4d200 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.src
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.src
@@ -28,7 +28,7 @@ TabPage TP_RANGECHOOSER
     HelpID = "chart2:TabPage:TP_RANGECHOOSER";
     Hide = TRUE ;
     SVLook = TRUE ;
-    Size = MAP_APPFONT ( 248, 140 ) ;
+    Size = MAP_APPFONT ( 248, 160 ) ;
 
     FixedText FT_CAPTION_FOR_WIZARD
     {
@@ -92,6 +92,24 @@ TabPage TP_RANGECHOOSER
         Size = MAP_APPFONT( 236, 10 );
         Text [ en-US ] = "Use time based charting";
     };
+    FixedText FT_TIME_BASED
+    {
+        Pos = MAP_APPFONT( 6, 128 );
+        Size = MAP_APPFONT( 40, 10 );
+        Text[ en-US ] = "Start and End point";
+    };
+    Edit ED_TIME_START
+    {
+        Pos = MAP_APPFONT( 60, 128 );
+        Size = MAP_APPFONT( 40, 10 );
+        Text[ en-US ] = "Start";
+    };
+    Edit ED_TIME_END
+    {
+        Pos = MAP_APPFONT( 110, 128 );
+        Size = MAP_APPFONT( 40, 10 );
+        Text[ en-US ] = "End";
+    };
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/inc/LabeledDataSequence.hxx b/chart2/source/inc/LabeledDataSequence.hxx
index 41b7e26..3cd8258 100644
--- a/chart2/source/inc/LabeledDataSequence.hxx
+++ b/chart2/source/inc/LabeledDataSequence.hxx
@@ -21,23 +21,21 @@
 #include "ServiceMacros.hxx"
 #include "MutexContainer.hxx"
 #include <comphelper/uno3.hxx>
-#include <cppuhelper/implbase3.hxx>
+#include <cppuhelper/implbase2.hxx>
 
 #include <com/sun/star/chart2/data/XLabeledDataSequence2.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/util/XCloneable.hpp>
 #include <com/sun/star/uno/XComponentContext.hpp>
 #include <com/sun/star/util/XModifyBroadcaster.hpp>
-#include <com/sun/star/chart2/XTimeBased.hpp>
 
 namespace chart
 {
 
 namespace impl
 {
-typedef cppu::WeakImplHelper3<
+typedef cppu::WeakImplHelper2<
         ::com::sun::star::chart2::data::XLabeledDataSequence2,
-        com::sun::star::chart2::XTimeBased,
         ::com::sun::star::lang::XServiceInfo >
     LabeledDataSequence_Base;
 }
@@ -79,10 +77,6 @@ protected:
         const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence >& xSequence )
         throw (::com::sun::star::uno::RuntimeException);
 
-    // XTimeBased
-    virtual sal_Bool switchToNext() throw (::com::sun::star::uno::RuntimeException);
-    virtual sal_Bool setToPointInTime(sal_Int32 nPoint) throw (::com::sun::star::uno::RuntimeException);
-
     // ____ XCloneable ____
     virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone()
         throw (::com::sun::star::uno::RuntimeException);
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index a0d93d1..2625668 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -93,7 +93,7 @@ ChartModel::ChartModel(uno::Reference<uno::XComponentContext > const & xContext)
     , m_bModified( sal_False )
     , m_nInLoad(0)
     , m_bUpdateNotificationsPending(false)
-    , mbTimeBased(true)
+    , mbTimeBased(false)
     , mpChartView(NULL)
     , m_pUndoManager( NULL )
     , m_aControllers( m_aModelMutex )
@@ -105,6 +105,9 @@ ChartModel::ChartModel(uno::Reference<uno::XComponentContext > const & xContext)
     , m_xPageBackground( new PageBackground( m_xContext ) )
     , m_xXMLNamespaceMap( createNameContainer( ::getCppuType( (const OUString*) 0 ),
                 "com.sun.star.xml.NamespaceMap", "com.sun.star.comp.chart.XMLNameSpaceMap" ), uno::UNO_QUERY)
+    , mnStart(0)
+    , mnEnd(0)
+    ,bSet(false)
 {
     OSL_TRACE( "ChartModel: CTOR called" );
 
@@ -147,6 +150,9 @@ ChartModel::ChartModel( const ChartModel & rOther )
     , m_aGraphicObjectVector( rOther.m_aGraphicObjectVector )
     , m_xDataProvider( rOther.m_xDataProvider )
     , m_xInternalDataProvider( rOther.m_xInternalDataProvider )
+    , mnStart(rOther.mnStart)
+    , mnEnd(rOther.mnEnd)
+    , bSet(false)
 {
     OSL_TRACE( "ChartModel: Copy-CTOR called" );
 
@@ -1382,9 +1388,19 @@ void ChartModel::getNextTimePoint()
         SAL_WARN_IF(!xTimeBased.is(), "chart2", "does not support time based charting");
         if(xTimeBased.is())
         {
-            xTimeBased->switchToNext();
+            if(!bSet)
+                xTimeBased->setRange(mnStart, mnEnd);
+            xTimeBased->switchToNext(sal_True);
         }
     }
+    bSet = true;
+}
+
+void ChartModel::setTimeBasedRange(sal_Int32 nStart, sal_Int32 nEnd)
+{
+    bSet = false;
+    mnStart = nStart;
+    mnEnd = nEnd;
 }
 
 }  // namespace chart
diff --git a/chart2/source/tools/LabeledDataSequence.cxx b/chart2/source/tools/LabeledDataSequence.cxx
index cc0a6c1..68df3c8 100644
--- a/chart2/source/tools/LabeledDataSequence.cxx
+++ b/chart2/source/tools/LabeledDataSequence.cxx
@@ -101,37 +101,6 @@ void SAL_CALL LabeledDataSequence::setLabel(
     }
 }
 
-// XTimeBased
-
-sal_Bool LabeledDataSequence::switchToNext()
-    throw (uno::RuntimeException)
-{
-    uno::Reference< chart2::XTimeBased > xTimeBasedValues(m_xData, uno::UNO_QUERY);
-    if(xTimeBasedValues.is())
-        xTimeBasedValues->switchToNext();
-
-    uno::Reference< chart2::XTimeBased > xTimeBasedLabels(m_xLabel, uno::UNO_QUERY);
-    if(xTimeBasedLabels.is())
-        xTimeBasedLabels->switchToNext();
-
-    return sal_True;
-}
-
-sal_Bool LabeledDataSequence::setToPointInTime(sal_Int32 nPoint)
-    throw (uno::RuntimeException)
-{
-    sal_Bool bRet = sal_False;
-    uno::Reference< chart2::XTimeBased > xTimeBasedValues(m_xData, uno::UNO_QUERY);
-    if(xTimeBasedValues.is())
-        bRet = xTimeBasedValues->setToPointInTime(nPoint);
-
-    uno::Reference< chart2::XTimeBased > xTimeBasedLabels(m_xLabel, uno::UNO_QUERY);
-    if(xTimeBasedLabels.is())
-        xTimeBasedLabels->setToPointInTime(nPoint);
-
-    return bRet;
-}
-
 // ____ XCloneable ____
 uno::Reference< util::XCloneable > SAL_CALL LabeledDataSequence::createClone()
     throw (uno::RuntimeException)
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 26a1e66..b0d6768 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -192,6 +192,7 @@ void SAL_CALL ChartView::initialize( const uno::Sequence< uno::Any >& )
 
 ChartView::~ChartView()
 {
+    maTimeBased.maTimer.Stop();
     // #i120831#. In ChartView::initialize(), m_xShapeFactory is created from SdrModel::getUnoModel() and indirectly
     //   from SfxBaseModel, it needs call dispose() to make sure SfxBaseModel object is freed correctly.
     uno::Reference< lang::XComponent > xComp( m_xShapeFactory, uno::UNO_QUERY);
@@ -2582,7 +2583,10 @@ void ChartView::createShapes()
             }
 
             if(maTimeBased.eMode != MANUAL)
+            {
+                mrChartModel.setTimeBased(true);
                 mrChartModel.getNextTimePoint();
+            }
             else
                 maTimeBased.maTimer.Stop();
         }
diff --git a/chart2/source/view/main/VDataSeries.cxx b/chart2/source/view/main/VDataSeries.cxx
index 981d832..52b510f 100644
--- a/chart2/source/view/main/VDataSeries.cxx
+++ b/chart2/source/view/main/VDataSeries.cxx
@@ -469,7 +469,7 @@ double VDataSeries::getXValue( sal_Int32 index ) const
         if( 0<=index && index<m_aValues_X.getLength() )
         {
             fRet = m_aValues_X.Doubles[index];
-            if(mpOldSeries)
+            if(mpOldSeries && index < mpOldSeries->m_aValues_X.getLength())
             {
                 double nOldVal = mpOldSeries->m_aValues_X.Doubles[index];
                 fRet = nOldVal + (fRet - nOldVal) * mnPercent;
@@ -498,7 +498,7 @@ double VDataSeries::getYValue( sal_Int32 index ) const
         if( 0<=index && index<m_aValues_Y.getLength() )
         {
             fRet = m_aValues_Y.Doubles[index];
-            if(mpOldSeries)
+            if(mpOldSeries && index < mpOldSeries->m_aValues_Y.getLength())
             {
                 double nOldVal = mpOldSeries->m_aValues_Y.Doubles[index];
                 fRet = nOldVal + (fRet - nOldVal) * mnPercent;
@@ -565,7 +565,7 @@ double VDataSeries::getY_Last( sal_Int32 index ) const
 double VDataSeries::getBubble_Size( sal_Int32 index ) const
 {
     double nNewVal = m_aValues_Bubble_Size.getValue( index );
-    if(mpOldSeries)
+    if(mpOldSeries && index < mpOldSeries->m_aValues_Bubble_Size.getLength())
     {
         double nOldVal = mpOldSeries->m_aValues_Bubble_Size.getValue( index );
         nNewVal = nOldVal + (nNewVal - nOldVal) * mnPercent;
diff --git a/offapi/com/sun/star/chart2/XTimeBased.idl b/offapi/com/sun/star/chart2/XTimeBased.idl
index 328b54c..487e22e 100644
--- a/offapi/com/sun/star/chart2/XTimeBased.idl
+++ b/offapi/com/sun/star/chart2/XTimeBased.idl
@@ -20,7 +20,7 @@ interface XTimeBased : com::sun::star::uno::XInterface
      * @return
      *      FALSE if the data wrapped around
      */
-    boolean switchToNext();
+    boolean switchToNext( [in] boolean wrap);
 
     /**
      * point is the zero based index into the time based array
@@ -28,6 +28,8 @@ interface XTimeBased : com::sun::star::uno::XInterface
      * @return FALSE if the point is outside of the supported array
      */
     boolean setToPointInTime( [in] long point );
+
+    void setRange( [in] long start, [in] long end );
 };
 
 }; }; }; };
diff --git a/sc/inc/chart2uno.hxx b/sc/inc/chart2uno.hxx
index a6e9a9e..820b6626 100644
--- a/sc/inc/chart2uno.hxx
+++ b/sc/inc/chart2uno.hxx
@@ -272,9 +272,11 @@ public:
         SAL_CALL getTextualData(  ) throw (::com::sun::star::uno::RuntimeException);
 
     // XTimeBased
-    virtual sal_Bool switchToNext() throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool switchToNext(sal_Bool bWrap) throw (::com::sun::star::uno::RuntimeException);
     virtual sal_Bool setToPointInTime(sal_Int32 nPoint) throw (::com::sun::star::uno::RuntimeException);
 
+    virtual void setRange(sal_Int32 nStart, sal_Int32 nEnd) throw (::com::sun::star::uno::RuntimeException);
+
     // XPropertySet
     virtual ::com::sun::star::uno::Reference<
         ::com::sun::star::beans::XPropertySetInfo> SAL_CALL
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index 510960c..b4ca187 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -2491,6 +2491,10 @@ ScChart2DataSequence::ScChart2DataSequence( ScDocument* pDoc,
     , m_pValueListener( NULL )
     , m_bGotDataChangedHint(false)
     , m_bExtDataRebuildQueued(false)
+    , mbTimeBased(false)
+    , mnTimeBasedStart(0)
+    , mnTimeBasedEnd(0)
+    , mnCurrentTab(0)
 {
     OSL_ENSURE(pTokens, "reference token list is null");
 
@@ -3587,14 +3591,18 @@ void ScChart2DataSequence::setDataChangedHint(bool b)
     m_bGotDataChangedHint = b;
 }
 
-sal_Bool ScChart2DataSequence::switchToNext()
+sal_Bool ScChart2DataSequence::switchToNext(sal_Bool bWrap)
     throw (uno::RuntimeException)
 {
-    if(!m_pTokens)
+    if(!m_pTokens || !mbTimeBased)
         return sal_True;
 
     if(mnCurrentTab >= mnTimeBasedEnd)
+    {
+        if(bWrap)
+            setToPointInTime(0);
         return false;
+    }
 
     for(vector<ScTokenRef>::iterator itr = m_pTokens->begin(),
             itrEnd = m_pTokens->end(); itr != itrEnd; ++itr)
@@ -3610,11 +3618,21 @@ sal_Bool ScChart2DataSequence::switchToNext()
         e.IncTab(1);
     }
 
+    ++mnCurrentTab;
+
     RebuildDataCache();
 
     return sal_True;
 }
 
+void ScChart2DataSequence::setRange(sal_Int32 nStart, sal_Int32 nEnd)
+    throw (uno::RuntimeException)
+{
+    mnTimeBasedStart = nStart;
+    mnTimeBasedEnd = nEnd;
+    mnCurrentTab = mnTimeBasedStart;
+}
+
 sal_Bool ScChart2DataSequence::setToPointInTime(sal_Int32 nPoint)
     throw (uno::RuntimeException)
 {
@@ -3639,6 +3657,8 @@ sal_Bool ScChart2DataSequence::setToPointInTime(sal_Int32 nPoint)
         e.SetAbsTab(nTab);
     }
 
+    mnCurrentTab = nTab;
+
     RebuildDataCache();
 
     return sal_True;
commit 9a83748ba802509e6be4199427a8514607070948
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Jan 2 05:08:32 2014 +0100

    some improvements for the time based charting
    
    The updating seems to work. It just does not update the references yet.
    
    Change-Id: I0a971dbe2beb113c1c3e9ef103d77d5d8c7174a0

diff --git a/chart2/inc/ChartView.hxx b/chart2/inc/ChartView.hxx
index b1c6b5f..766563a 100644
--- a/chart2/inc/ChartView.hxx
+++ b/chart2/inc/ChartView.hxx
@@ -45,7 +45,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
 
-#include <salhelper/thread.hxx>
+#include <vcl/timer.hxx>
 
 class SdrPage;
 
@@ -68,13 +68,12 @@ struct TimeBasedInfo
     TimeBasedInfo():
         bTimeBased(false),
         nFrame(0),
-        eMode(AUTOMATIC),
-        mpThread(NULL) {}
+        eMode(AUTOMATIC) {}
 
     bool bTimeBased;
     size_t nFrame;
     TimeBasedMode eMode;
-    salhelper::Thread* mpThread;
+    Timer maTimer;
 
     // only valid when we are in the time based mode
     ::std::vector< std::vector< VDataSeries* > > m_aDataSeriesList;
@@ -220,6 +219,8 @@ private: //methods
         , bool bUseFixedInnerSize
         , const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape>& xDiagram_MarkHandles );
 
+    DECL_LINK( UpdateTimeBased, void* );
+
 private: //member
     ::osl::Mutex m_aMutex;
 
diff --git a/chart2/source/inc/LabeledDataSequence.hxx b/chart2/source/inc/LabeledDataSequence.hxx
index 3cd8258..41b7e26 100644
--- a/chart2/source/inc/LabeledDataSequence.hxx
+++ b/chart2/source/inc/LabeledDataSequence.hxx
@@ -21,21 +21,23 @@
 #include "ServiceMacros.hxx"
 #include "MutexContainer.hxx"
 #include <comphelper/uno3.hxx>
-#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/implbase3.hxx>
 
 #include <com/sun/star/chart2/data/XLabeledDataSequence2.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/util/XCloneable.hpp>
 #include <com/sun/star/uno/XComponentContext.hpp>
 #include <com/sun/star/util/XModifyBroadcaster.hpp>
+#include <com/sun/star/chart2/XTimeBased.hpp>
 
 namespace chart
 {
 
 namespace impl
 {
-typedef cppu::WeakImplHelper2<
+typedef cppu::WeakImplHelper3<
         ::com::sun::star::chart2::data::XLabeledDataSequence2,
+        com::sun::star::chart2::XTimeBased,
         ::com::sun::star::lang::XServiceInfo >
     LabeledDataSequence_Base;
 }
@@ -77,6 +79,10 @@ protected:
         const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence >& xSequence )
         throw (::com::sun::star::uno::RuntimeException);
 
+    // XTimeBased
+    virtual sal_Bool switchToNext() throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool setToPointInTime(sal_Int32 nPoint) throw (::com::sun::star::uno::RuntimeException);
+
     // ____ XCloneable ____
     virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone()
         throw (::com::sun::star::uno::RuntimeException);
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index d65ab67..a0d93d1 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -1357,14 +1357,34 @@ bool ChartModel::isTimeBased() const
 void ChartModel::setTimeBased(bool bTimeBased)
 {
     mbTimeBased = bTimeBased;
+    uno::Sequence<Reference< chart2::data::XLabeledDataSequence > >
+        xDataSequences = getDataSequences();
+    sal_Int32 n = xDataSequences.getLength();
+    for(sal_Int32 i = 0; i < n; ++i)
+    {
+        uno::Reference< chart2::XTimeBased > xTimeBased(xDataSequences[i]->getValues(), uno::UNO_QUERY);
+        SAL_WARN_IF(!xTimeBased.is(), "chart2", "does not support time based charting");
+        if(xTimeBased.is())
+        {
+            uno::Reference< beans::XPropertySet > xPropSet(xTimeBased, uno::UNO_QUERY_THROW);
+            xPropSet->setPropertyValue("TimeBased", uno::makeAny(bTimeBased));
+        }
+    }
 }
 
 void ChartModel::getNextTimePoint()
 {
-    uno::Reference< chart2::XTimeBased > xTimeBased(getUsedData(), uno::UNO_QUERY);
-    SAL_WARN_IF(!xTimeBased.is(), "chart2", "does not support time based charting");
-    if(xTimeBased.is())
-        xTimeBased->switchToNext();
+    uno::Sequence< Reference< chart2::data::XLabeledDataSequence > > xDataSequences = getDataSequences();
+    sal_Int32 n = xDataSequences.getLength();
+    for(sal_Int32 i = 0; i < n; ++i)
+    {
+        uno::Reference< chart2::XTimeBased > xTimeBased(xDataSequences[i]->getValues(), uno::UNO_QUERY);
+        SAL_WARN_IF(!xTimeBased.is(), "chart2", "does not support time based charting");
+        if(xTimeBased.is())
+        {
+            xTimeBased->switchToNext();
+        }
+    }
 }
 
 }  // namespace chart
diff --git a/chart2/source/tools/LabeledDataSequence.cxx b/chart2/source/tools/LabeledDataSequence.cxx
index 68df3c8..cc0a6c1 100644
--- a/chart2/source/tools/LabeledDataSequence.cxx
+++ b/chart2/source/tools/LabeledDataSequence.cxx
@@ -101,6 +101,37 @@ void SAL_CALL LabeledDataSequence::setLabel(
     }
 }
 
+// XTimeBased
+
+sal_Bool LabeledDataSequence::switchToNext()
+    throw (uno::RuntimeException)
+{
+    uno::Reference< chart2::XTimeBased > xTimeBasedValues(m_xData, uno::UNO_QUERY);
+    if(xTimeBasedValues.is())
+        xTimeBasedValues->switchToNext();
+
+    uno::Reference< chart2::XTimeBased > xTimeBasedLabels(m_xLabel, uno::UNO_QUERY);
+    if(xTimeBasedLabels.is())
+        xTimeBasedLabels->switchToNext();
+
+    return sal_True;
+}
+
+sal_Bool LabeledDataSequence::setToPointInTime(sal_Int32 nPoint)
+    throw (uno::RuntimeException)
+{
+    sal_Bool bRet = sal_False;
+    uno::Reference< chart2::XTimeBased > xTimeBasedValues(m_xData, uno::UNO_QUERY);
+    if(xTimeBasedValues.is())
+        bRet = xTimeBasedValues->setToPointInTime(nPoint);
+
+    uno::Reference< chart2::XTimeBased > xTimeBasedLabels(m_xLabel, uno::UNO_QUERY);
+    if(xTimeBasedLabels.is())
+        xTimeBasedLabels->setToPointInTime(nPoint);
+
+    return bRet;
+}
+
 // ____ XCloneable ____
 uno::Reference< util::XCloneable > SAL_CALL LabeledDataSequence::createClone()
     throw (uno::RuntimeException)
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 5816927..26a1e66 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -125,32 +125,6 @@ namespace
 {
     class theExplicitValueProviderUnoTunnelId  : public rtl::Static< UnoTunnelIdInit, theExplicitValueProviderUnoTunnelId > {};
 
-class UpdateTimeBasedThread : public salhelper::Thread
-{
-public:
-    UpdateTimeBasedThread(ChartView& rChartView, TimeBasedInfo& rTimeBasedInfo):
-        salhelper::Thread("ChartUpdate"),
-        mrChartView(rChartView),
-        mrTimeBasedInfo(rTimeBasedInfo) {}
-private:
-    virtual void execute()
-    {
-        TimeValue const aTime = { 0, 100 };
-        for(size_t i = 0; i < 60; ++i)
-        {
-            mrChartView.setViewDirty();
-            {
-                SolarMutexGuard aSolarGuard;
-                mrChartView.update();
-            }
-            wait(aTime);
-        }
-    }
-
-    ChartView& mrChartView;
-    TimeBasedInfo& mrTimeBasedInfo;
-};
-
 }
 
 const uno::Sequence<sal_Int8>& ExplicitValueProvider::getUnoTunnelId()
@@ -2404,13 +2378,6 @@ void ChartView::createShapes()
     if(mrChartModel.isTimeBased())
     {
         maTimeBased.bTimeBased = true;
-
-        if(!maTimeBased.mpThread)
-        {
-            maTimeBased.mpThread = new UpdateTimeBasedThread(*this, maTimeBased);
-            maTimeBased.mpThread->launch();
-        }
-
     }
 
     //make sure add-in is refreshed after creating the shapes
@@ -2606,7 +2573,7 @@ void ChartView::createShapes()
                     rSeriesPlotter[i]->getAllSeries();
                 std::vector< VDataSeries* >& rAllOldDataSeries =
                     maTimeBased.m_aDataSeriesList[i];
-                size_t m = std::min(aAllNewDataSeries.size(), rAllOldDataSeries.size());
+                size_t m = aAllNewDataSeries.size();
                 for(size_t j = 0; j < m; ++j)
                 {
                     rAllOldDataSeries.push_back( aAllNewDataSeries[j]->
@@ -2614,7 +2581,17 @@ void ChartView::createShapes()
                 }
             }
 
-            mrChartModel.getNextTimePoint();
+            if(maTimeBased.eMode != MANUAL)
+                mrChartModel.getNextTimePoint();
+            else
+                maTimeBased.maTimer.Stop();
+        }
+
+        if(maTimeBased.bTimeBased && maTimeBased.eMode != MANUAL && !maTimeBased.maTimer.IsActive())
+        {
+            maTimeBased.maTimer.SetTimeout(15);
+            maTimeBased.maTimer.SetTimeoutHdl(LINK(this, ChartView, UpdateTimeBased));
+            maTimeBased.maTimer.Start();
         }
     }
 
@@ -3055,6 +3032,14 @@ void ChartView::setViewDirty()
     m_bViewDirty = true;
 }
 
+IMPL_LINK_NOARG(ChartView, UpdateTimeBased)
+{
+    setViewDirty();
+    update();
+
+    return 0;
+}
+
 } //namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/offapi/com/sun/star/chart2/XTimeBased.idl b/offapi/com/sun/star/chart2/XTimeBased.idl
index 70ce701..328b54c 100644
--- a/offapi/com/sun/star/chart2/XTimeBased.idl
+++ b/offapi/com/sun/star/chart2/XTimeBased.idl
@@ -21,6 +21,13 @@ interface XTimeBased : com::sun::star::uno::XInterface
      *      FALSE if the data wrapped around
      */
     boolean switchToNext();
+
+    /**
+     * point is the zero based index into the time based array
+     *
+     * @return FALSE if the point is outside of the supported array
+     */
+    boolean setToPointInTime( [in] long point );
 };
 
 }; }; }; };
diff --git a/sc/inc/chart2uno.hxx b/sc/inc/chart2uno.hxx
index 81a23dc..a6e9a9e 100644
--- a/sc/inc/chart2uno.hxx
+++ b/sc/inc/chart2uno.hxx
@@ -42,7 +42,7 @@
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/util/XCloneable.hpp>
 #include <com/sun/star/util/XModifyBroadcaster.hpp>
-#include <cppuhelper/implbase3.hxx>
+#include <cppuhelper/implbase2.hxx>
 #include <cppuhelper/implbase5.hxx>
 #include <cppuhelper/implbase8.hxx>
 #include <rtl/ustring.hxx>
@@ -190,9 +190,8 @@ private:
 
 // DataSource
 class ScChart2DataSource : public
-                ::cppu::WeakImplHelper3<
+                ::cppu::WeakImplHelper2<
                     ::com::sun::star::chart2::data::XDataSource,
-                    com::sun::star::chart2::XTimeBased,
                     ::com::sun::star::lang::XServiceInfo>,
                 SfxListener
 {
@@ -207,10 +206,6 @@ public:
             ::com::sun::star::chart2::data::XLabeledDataSequence > > SAL_CALL
         getDataSequences() throw (::com::sun::star::uno::RuntimeException);
 
-    // XTimeBased
-    virtual sal_Bool switchToNext() throw(
-            ::com::sun::star::uno::RuntimeException);
-
     // XServiceInfo
     virtual OUString SAL_CALL getImplementationName() throw(
             ::com::sun::star::uno::RuntimeException);
@@ -226,19 +221,12 @@ public:
 
     void AddLabeledSequence(const com::sun::star::uno::Reference < com::sun::star::chart2::data::XLabeledDataSequence >& xNew);
 
-    void SetTimeBased(SCTAB nTimeBasedStart, SCTAB nTimeBasedEnd);
-
 private:
 
     ScDocument*                 m_pDocument;
     typedef std::list < com::sun::star::uno::Reference< com::sun::star::chart2::data::XLabeledDataSequence > >  LabeledList;
     LabeledList                 m_aLabeledSequences;
 
-    bool bTimeBased;
-    SCTAB mnTimeBasedStart;
-    SCTAB mnTimeBasedEnd;
-    SCTAB mnCurrentTab;
-
 };
 
 // DataSequence
@@ -285,6 +273,7 @@ public:
 
     // XTimeBased
     virtual sal_Bool switchToNext() throw (::com::sun::star::uno::RuntimeException);
+    virtual sal_Bool setToPointInTime(sal_Int32 nPoint) throw (::com::sun::star::uno::RuntimeException);
 
     // XPropertySet
     virtual ::com::sun::star::uno::Reference<
@@ -467,6 +456,12 @@ private:
 
     bool                        m_bGotDataChangedHint;
     bool                        m_bExtDataRebuildQueued;
+
+    bool mbTimeBased;
+    SCTAB mnTimeBasedStart;
+    SCTAB mnTimeBasedEnd;
+    SCTAB mnCurrentTab;
+
 };
 
 #endif // SC_CHART2UNO_HXX
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index 9a887fa..510960c 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -1579,8 +1579,6 @@ ScChart2DataProvider::createDataSource(
     }
 
     pDS = new ScChart2DataSource(m_pDocument);
-    if(bTimeBased)
-        pDS->SetTimeBased(nTimeBasedStart, nTimeBasedEnd);
     ::std::list< Reference< chart2::data::XLabeledDataSequence > >::iterator aItr( aSeqs.begin() );
     ::std::list< Reference< chart2::data::XLabeledDataSequence > >::iterator aEndItr( aSeqs.end() );
 
@@ -2455,33 +2453,6 @@ void ScChart2DataSource::AddLabeledSequence(const uno::Reference < chart2::data:
     m_aLabeledSequences.push_back(xNew);
 }
 
-sal_Bool ScChart2DataSource::switchToNext() throw ( uno::RuntimeException)
-{
-    if(mnCurrentTab != mnTimeBasedEnd)
-    {
-        for(LabeledList::iterator itr = m_aLabeledSequences.begin(),
-                itrEnd = m_aLabeledSequences.end(); itr != itrEnd; ++itr)
-        {
-            uno::Reference< chart2::XTimeBased> xTimeBased(*itr, uno::UNO_QUERY);
-            if(xTimeBased.is())
-                xTimeBased->switchToNext();
-        }
-        ++mnCurrentTab;
-        return sal_True;
-    }
-
-    return sal_False;
-}
-
-void ScChart2DataSource::SetTimeBased(SCTAB nTimeBasedStart, SCTAB nTimeBasedEnd)
-{
-    mnCurrentTab = nTimeBasedStart;
-    mnTimeBasedStart = nTimeBasedStart;
-    mnTimeBasedEnd = nTimeBasedEnd;
-    bTimeBased = true;
-}
-
-
 // DataSequence ==============================================================
 
 ScChart2DataSequence::Item::Item() :
@@ -3528,6 +3499,12 @@ void SAL_CALL ScChart2DataSequence::setPropertyValue(
         if( bOldValue != m_bIncludeHiddenCells )
             m_aDataArray.clear();//data array is dirty now
     }
+    else if( rPropertyName == "TimeBased" )
+    {
+        sal_Bool bTimeBased = mbTimeBased;
+        rValue>>= bTimeBased;
+        mbTimeBased = bTimeBased;
+    }
     else
         throw beans::UnknownPropertyException();
     // TODO: support optional properties
@@ -3551,6 +3528,10 @@ uno::Any SAL_CALL ScChart2DataSequence::getPropertyValue(
         BuildDataCache();
         aRet <<= m_aHiddenValues;
     }
+    else if (rPropertyName == "TimeBased")
+    {
+        aRet <<= mbTimeBased;
+    }
     else
         throw beans::UnknownPropertyException();
     // TODO: support optional properties
@@ -3612,6 +3593,9 @@ sal_Bool ScChart2DataSequence::switchToNext()
     if(!m_pTokens)
         return sal_True;
 
+    if(mnCurrentTab >= mnTimeBasedEnd)
+        return false;
+
     for(vector<ScTokenRef>::iterator itr = m_pTokens->begin(),
             itrEnd = m_pTokens->end(); itr != itrEnd; ++itr)
     {
@@ -3631,4 +3615,33 @@ sal_Bool ScChart2DataSequence::switchToNext()
     return sal_True;
 }
 
+sal_Bool ScChart2DataSequence::setToPointInTime(sal_Int32 nPoint)
+    throw (uno::RuntimeException)
+{
+    if(!m_pTokens)
+        return sal_True;
+
+    if(nPoint > mnTimeBasedEnd - mnTimeBasedStart)
+        return false;
+
+    SCTAB nTab = mnTimeBasedStart + nPoint;
+    for(vector<ScTokenRef>::iterator itr = m_pTokens->begin(),
+            itrEnd = m_pTokens->end(); itr != itrEnd; ++itr)
+    {
+        if ((*itr)->GetType() != svDoubleRef)
+            continue;
+
+        ScComplexRefData& rData = (*itr)->GetDoubleRef();
+        ScSingleRefData& s = rData.Ref1;
+        ScSingleRefData& e = rData.Ref2;
+
+        s.SetAbsTab(nTab);
+        e.SetAbsTab(nTab);
+    }
+
+    RebuildDataCache();
+
+    return sal_True;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit e762bd987f8f2cb9452fd20490dd1ee70e9debfc
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Dec 31 21:06:05 2013 +0100

    we need to take the solar mutex
    
    Change-Id: Iacaeaab565a5c823cef6664042566ad10d3e0841

diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 72b0d95..5816927 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -139,7 +139,10 @@ private:
         for(size_t i = 0; i < 60; ++i)
         {
             mrChartView.setViewDirty();
-            mrChartView.update();
+            {
+                SolarMutexGuard aSolarGuard;
+                mrChartView.update();
+            }
             wait(aTime);
         }
     }
commit beecb188501e827925672af8a8276b0e14e50a59
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Dec 31 20:59:28 2013 +0100

    first try at implementing time based updates in new chart implementation
    
    Change-Id: I3d03e44a415023ca12548ea99a3732cba49c8074

diff --git a/chart2/Library_chartcore.mk b/chart2/Library_chartcore.mk
index bcad947..de4c888 100644
--- a/chart2/Library_chartcore.mk
+++ b/chart2/Library_chartcore.mk
@@ -46,6 +46,7 @@ $(eval $(call gb_Library_use_libraries,chartcore,\
     fwe \
     i18nlangtag \
     sal \
+	salhelper \
 	sfx \
     svl \
     svt \
diff --git a/chart2/inc/ChartView.hxx b/chart2/inc/ChartView.hxx
index 66925ab..b1c6b5f 100644
--- a/chart2/inc/ChartView.hxx
+++ b/chart2/inc/ChartView.hxx
@@ -45,6 +45,8 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/ptr_container/ptr_vector.hpp>
 
+#include <salhelper/thread.hxx>
+
 class SdrPage;
 
 namespace chart {
@@ -54,14 +56,25 @@ class DrawModelWrapper;
 class SeriesPlotterContainer;
 class VDataSeries;
 
+enum TimeBasedMode
+{
+    MANUAL,
+    AUTOMATIC,
+    AUTOMATIC_WRAP
+};
+
 struct TimeBasedInfo
 {
     TimeBasedInfo():
         bTimeBased(false),
-        nFrame(0) {}
+        nFrame(0),
+        eMode(AUTOMATIC),
+        mpThread(NULL) {}
 
     bool bTimeBased;
     size_t nFrame;
+    TimeBasedMode eMode;
+    salhelper::Thread* mpThread;
 
     // only valid when we are in the time based mode
     ::std::vector< std::vector< VDataSeries* > > m_aDataSeriesList;
@@ -181,6 +194,8 @@ public:
     virtual OUString SAL_CALL dump()
             throw(::com::sun::star::uno::RuntimeException);
 
+    void setViewDirty();
+
 private: //methods
     ChartView();
 
@@ -254,6 +269,7 @@ private: //member
     ::com::sun::star::awt::Rectangle m_aResultingDiagramRectangleExcludingAxes;
 
     TimeBasedInfo maTimeBased;
+    osl::Mutex maTimeMutex;
 };
 
 }
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index 4e6d245..d65ab67 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -93,6 +93,7 @@ ChartModel::ChartModel(uno::Reference<uno::XComponentContext > const & xContext)
     , m_bModified( sal_False )
     , m_nInLoad(0)
     , m_bUpdateNotificationsPending(false)
+    , mbTimeBased(true)
     , mpChartView(NULL)
     , m_pUndoManager( NULL )
     , m_aControllers( m_aModelMutex )
@@ -131,6 +132,7 @@ ChartModel::ChartModel( const ChartModel & rOther )
     , m_bModified( rOther.m_bModified )
     , m_nInLoad(0)
     , m_bUpdateNotificationsPending(false)
+    , mbTimeBased(rOther.mbTimeBased)
     , mpChartView(NULL)
     , m_aResource( rOther.m_aResource )
     , m_aMediaDescriptor( rOther.m_aMediaDescriptor )
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index c7db1b1..72b0d95 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -108,6 +108,9 @@
 #include <rtl/strbuf.hxx>
 #include <rtl/ustring.hxx>
 
+#include <osl/conditn.hxx>
+#include <osl/time.h>
+
 #include <boost/shared_ptr.hpp>
 
 namespace chart {
@@ -121,6 +124,30 @@ using ::com::sun::star::uno::Any;
 namespace
 {
     class theExplicitValueProviderUnoTunnelId  : public rtl::Static< UnoTunnelIdInit, theExplicitValueProviderUnoTunnelId > {};
+
+class UpdateTimeBasedThread : public salhelper::Thread
+{
+public:
+    UpdateTimeBasedThread(ChartView& rChartView, TimeBasedInfo& rTimeBasedInfo):
+        salhelper::Thread("ChartUpdate"),
+        mrChartView(rChartView),
+        mrTimeBasedInfo(rTimeBasedInfo) {}
+private:
+    virtual void execute()
+    {
+        TimeValue const aTime = { 0, 100 };
+        for(size_t i = 0; i < 60; ++i)
+        {
+            mrChartView.setViewDirty();
+            mrChartView.update();
+            wait(aTime);
+        }
+    }
+
+    ChartView& mrChartView;
+    TimeBasedInfo& mrTimeBasedInfo;
+};
+
 }
 
 const uno::Sequence<sal_Int8>& ExplicitValueProvider::getUnoTunnelId()
@@ -2369,9 +2396,20 @@ void ChartView::createShapes()
     clock_t nStart = clock();
     OSL_TRACE( "\nPPPPPPPPP>>>>>>>>>>>> chart view :: createShapes()" );
 #endif
+
+    osl::ResettableMutexGuard aTimedGuard(maTimeMutex);
     if(mrChartModel.isTimeBased())
+    {
         maTimeBased.bTimeBased = true;
 
+        if(!maTimeBased.mpThread)
+        {
+            maTimeBased.mpThread = new UpdateTimeBasedThread(*this, maTimeBased);
+            maTimeBased.mpThread->launch();
+        }
+
+    }
+
     //make sure add-in is refreshed after creating the shapes
     const ::comphelper::ScopeGuard aGuard( boost::bind( &ChartView::impl_refreshAddIn, this ) );
     if( impl_AddInDrawsAllByItself() )
@@ -2444,7 +2482,7 @@ void ChartView::createShapes()
 
         SeriesPlotterContainer aSeriesPlotterContainer( m_aVCooSysList );
         aSeriesPlotterContainer.initializeCooSysAndSeriesPlotter( mrChartModel );
-        if(maTimeBased.bTimeBased)
+        if(maTimeBased.bTimeBased && maTimeBased.nFrame != 0)
         {
             std::vector<VSeriesPlotter*>& rSeriesPlotter =
                 aSeriesPlotterContainer.getSeriesPlotterList();
@@ -2549,6 +2587,8 @@ void ChartView::createShapes()
         //cleanup: remove all empty group shapes to avoid grey border lines:
         lcl_removeEmptyGroupShapes( mxRootShape );
 
+        pShapeFactory->render( mxRootShape );
+
         if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0)
         {
             // create copy of the data for next frame
@@ -2582,7 +2622,6 @@ void ChartView::createShapes()
         m_pDrawModelWrapper->getSdrModel().EnableUndo( true );
     }
 
-    pShapeFactory->render( mxRootShape );
 
     if(maTimeBased.bTimeBased)
     {
@@ -3007,6 +3046,12 @@ OUString ChartView::dump() throw (uno::RuntimeException)
 
 }
 
+void ChartView::setViewDirty()
+{
+    osl::ResettableMutexGuard aGuard(maTimeMutex);
+    m_bViewDirty = true;
+}
+
 } //namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit cb6fa3870eae98fef7bd3b19ee986bcf5d8c1073
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Dec 31 16:05:10 2013 +0100

    add time based option to UI
    
    we still need to notify ChartModel but I have no idea how
    
    Change-Id: Iac5e09f2bdbcb1d4bc18d4a9dcc30db3a7ab36af

diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.cxx b/chart2/source/controller/dialogs/tp_RangeChooser.cxx
index 2eb5f5e..a7e429e 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.cxx
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.cxx
@@ -89,6 +89,7 @@ RangeChooserTabPage::RangeChooserTabPage( Window* pParent
         , m_aRB_Columns( this, SchResId( RB_DATACOLS ) )
         , m_aCB_FirstRowAsLabel( this, SchResId( CB_FIRST_ROW_ASLABELS ) )
         , m_aCB_FirstColumnAsLabel( this, SchResId( CB_FIRST_COLUMN_ASLABELS ) )
+        , m_aCB_TimeBased( this, SchResId( CB_TIME_BASED ) )
         , m_nChangingControlCalls(0)
         , m_bIsDirty(false)
         , m_xDataProvider( 0 )
@@ -241,11 +242,20 @@ void RangeChooserTabPage::changeDialogModelAccordingToControls()
             || ( m_aCB_FirstRowAsLabel.IsChecked()    && !m_aRB_Rows.IsChecked() );
         sal_Bool bHasCategories = ( m_aCB_FirstColumnAsLabel.IsChecked() && m_aRB_Columns.IsChecked() )
             || ( m_aCB_FirstRowAsLabel.IsChecked()    && m_aRB_Rows.IsChecked() );
+        sal_Bool bTimeBased = m_aCB_TimeBased.IsChecked();
 
         Sequence< beans::PropertyValue > aArguments(
             DataSourceHelper::createArguments(
                 m_aRB_Columns.IsChecked(), bFirstCellAsLabel, bHasCategories ) );
 
+        if(bTimeBased)
+        {
+            aArguments.realloc( aArguments.getLength() + 1 );
+            aArguments[aArguments.getLength() - 1] =
+                beans::PropertyValue( "TimeBased", -1, uno::makeAny(bTimeBased),
+                        beans::PropertyState_DIRECT_VALUE );
+        }
+
         // only if range is valid
         if( m_aLastValidRangeString.equals(m_aED_Range.GetText()))
         {
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.hrc b/chart2/source/controller/dialogs/tp_RangeChooser.hrc
index b9953ba..7d7e6ba 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.hrc
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.hrc
@@ -31,4 +31,6 @@
 #define CB_FIRST_ROW_ASLABELS       1
 #define CB_FIRST_COLUMN_ASLABELS    2
 
+#define CB_TIME_BASED         3
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.hxx b/chart2/source/controller/dialogs/tp_RangeChooser.hxx
index 5d074fc..c6f5c61 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.hxx
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.hxx
@@ -89,6 +89,8 @@ protected: //member
     CheckBox        m_aCB_FirstRowAsLabel;
     CheckBox        m_aCB_FirstColumnAsLabel;
 
+    CheckBox        m_aCB_TimeBased;
+
     sal_Int32       m_nChangingControlCalls;
     bool            m_bIsDirty;
 
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.src b/chart2/source/controller/dialogs/tp_RangeChooser.src
index 0865c9b..d19af78 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.src
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.src
@@ -86,6 +86,12 @@ TabPage TP_RANGECHOOSER
         Size = MAP_APPFONT ( 236 , 10 ) ;
         Text [ en-US ] = "F~irst column as label" ;
     };
+    CheckBox CB_TIME_BASED
+    {
+        Pos = MAP_APPFONT ( 6, 112 );
+        Size = MAP_APPFONT( 236, 10 );
+        Text [ en-US ] = "Use time based charting";
+    };
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 988f1d0368fc1f72d1e0ef8e0a90959302287ab9
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Dec 30 08:58:18 2013 +0100

    simlplify
    
    Change-Id: I8ff774d9f26ff0c9a2241ee14935a86085a3209d

diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index 75ce9b3..9a887fa 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -1540,8 +1540,8 @@ ScChart2DataProvider::createDataSource(
             pValueTokens.reset(pChartMap->getAllColHeaderRanges());
 
         SAL_WNODEPRECATED_DECLARATIONS_PUSH
-        auto_ptr< vector<ScTokenRef> > pLabelTokens(NULL);
-            pLabelTokens.reset(pChartMap->getLeftUpperCornerRanges());
+        auto_ptr< vector<ScTokenRef> > pLabelTokens(
+                pChartMap->getLeftUpperCornerRanges());
         SAL_WNODEPRECATED_DECLARATIONS_POP
 
         Reference< chart2::data::XLabeledDataSequence > xCategories = lcl_createLabeledDataSequenceFromTokens(
commit e5e1e1565b8242477b910a9d4d1899679fd2a428
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Dec 30 08:39:19 2013 +0100

    remaining chart work for time based charting
    
    Change-Id: Iac33c81df199a942ddf073f9eb1b34e147a34f3c

diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx
index 748e5f6..b251920 100644
--- a/chart2/inc/ChartModel.hxx
+++ b/chart2/inc/ChartModel.hxx
@@ -585,6 +585,8 @@ public:
 
     bool isTimeBased() const;
     void setTimeBased(bool bTimeBased);
+
+    void getNextTimePoint();
 };
 
 }  // namespace chart
diff --git a/chart2/inc/ChartView.hxx b/chart2/inc/ChartView.hxx
index 80f0d27..66925ab 100644
--- a/chart2/inc/ChartView.hxx
+++ b/chart2/inc/ChartView.hxx
@@ -43,6 +43,7 @@
 
 #include <vector>
 #include <boost/shared_ptr.hpp>
+#include <boost/ptr_container/ptr_vector.hpp>
 
 class SdrPage;
 
@@ -51,20 +52,19 @@ namespace chart {
 class VCoordinateSystem;
 class DrawModelWrapper;
 class SeriesPlotterContainer;
-class VDataSeriesGroup;
+class VDataSeries;
 
 struct TimeBasedInfo
 {
     TimeBasedInfo():
         bTimeBased(false),
-        nFrame(0),
-        m_pZSlots(NULL) {}
+        nFrame(0) {}
 
     bool bTimeBased;
     size_t nFrame;
 
     // only valid when we are in the time based mode
-    ::std::vector< ::std::vector< VDataSeriesGroup > >* m_pZSlots;
+    ::std::vector< std::vector< VDataSeries* > > m_aDataSeriesList;
 };
 
 /**
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index 842501f..4e6d245 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -58,6 +58,7 @@
 #include <com/sun/star/drawing/LineDash.hpp>
 #include <com/sun/star/drawing/XShapes.hpp>
 #include <com/sun/star/document/DocumentProperties.hpp>
+#include <com/sun/star/chart2/XTimeBased.hpp>
 
 // header for class SvNumberFormatter
 #include <svl/zforlist.hxx>
@@ -1356,6 +1357,14 @@ void ChartModel::setTimeBased(bool bTimeBased)
     mbTimeBased = bTimeBased;
 }
 
+void ChartModel::getNextTimePoint()
+{
+    uno::Reference< chart2::XTimeBased > xTimeBased(getUsedData(), uno::UNO_QUERY);
+    SAL_WARN_IF(!xTimeBased.is(), "chart2", "does not support time based charting");
+    if(xTimeBased.is())
+        xTimeBased->switchToNext();
+}
+
 }  // namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/inc/VDataSeries.hxx b/chart2/source/view/inc/VDataSeries.hxx
index 94827d1..7989b3e 100644
--- a/chart2/source/view/inc/VDataSeries.hxx
+++ b/chart2/source/view/inc/VDataSeries.hxx
@@ -40,7 +40,7 @@
 namespace chart
 {
 
-class VDataSequence : boost::noncopyable
+class VDataSequence
 {
 public:
     void init( const ::com::sun::star::uno::Reference<
@@ -62,10 +62,6 @@ class VDataSeries SAL_FINAL : boost::noncopyable
 public:
     VDataSeries( const ::com::sun::star::uno::Reference<
         ::com::sun::star::chart2::XDataSeries >& xDataSeries );
-    // for time based charting
-    VDataSeries( const ::com::sun::star::uno::Reference<
-        ::com::sun::star::chart2::XDataSeries >& xDataSeries,
-        VDataSeries* pOldSeries, double nPercent);
 
     ~VDataSeries();
 
@@ -176,11 +172,17 @@ public:
     void setMissingValueTreatment( sal_Int32 nMissingValueTreatment );
     sal_Int32 getMissingValueTreatment() const;
 
+    void setOldTimeBased( VDataSeries* pOldSeries, double nPercent );
+    VDataSeries* createCopyForTimeBased() const;
+
 private: //methods
     ::com::sun::star::chart2::DataPointLabel*
                         getDataPointLabel( sal_Int32 index ) const;
     void adaptPointCache( sal_Int32 nNewPointIndex ) const;
 
+    // for copies for time based charting
+    VDataSeries();
+
 public: //member
     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > m_xGroupShape;
     ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > m_xLabelsGroupShape;
diff --git a/chart2/source/view/inc/VSeriesPlotter.hxx b/chart2/source/view/inc/VSeriesPlotter.hxx
index 521903e..098bbe1 100644
--- a/chart2/source/view/inc/VSeriesPlotter.hxx
+++ b/chart2/source/view/inc/VSeriesPlotter.hxx
@@ -384,9 +384,6 @@ protected:
 
     VDataSeries* getFirstSeries() const;
 
-    // ugly hack to cache the data for the next turn
-    const std::vector< std::vector< VDataSeriesGroup > >& getData();
-
 protected:
     PlottingPositionHelper*    m_pMainPosHelper;
 
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 3e23991..c7db1b1 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -2444,6 +2444,25 @@ void ChartView::createShapes()
 
         SeriesPlotterContainer aSeriesPlotterContainer( m_aVCooSysList );
         aSeriesPlotterContainer.initializeCooSysAndSeriesPlotter( mrChartModel );
+        if(maTimeBased.bTimeBased)
+        {
+            std::vector<VSeriesPlotter*>& rSeriesPlotter =
+                aSeriesPlotterContainer.getSeriesPlotterList();
+            size_t n = rSeriesPlotter.size();
+            for(size_t i = 0; i < n; ++i)
+            {
+                std::vector< VDataSeries* > aAllNewDataSeries =
+                    rSeriesPlotter[i]->getAllSeries();
+                std::vector< VDataSeries* >& rAllOldDataSeries =
+                    maTimeBased.m_aDataSeriesList[i];
+                size_t m = std::min(aAllNewDataSeries.size(), rAllOldDataSeries.size());
+                for(size_t j = 0; j < m; ++j)
+                {
+                    aAllNewDataSeries[j]->setOldTimeBased(
+                            rAllOldDataSeries[j], (maTimeBased.nFrame % 60)/60.0);
+                }
+            }
+        }
 
         lcl_createLegend( LegendHelper::getLegend( mrChartModel ), mxRootShape, m_xShapeFactory, m_xCC
                     , aRemainingSpace, aPageSize, mrChartModel, aSeriesPlotterContainer.getLegendEntryProviderList()
@@ -2529,6 +2548,31 @@ void ChartView::createShapes()
 
         //cleanup: remove all empty group shapes to avoid grey border lines:
         lcl_removeEmptyGroupShapes( mxRootShape );
+
+        if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0)
+        {
+            // create copy of the data for next frame
+            std::vector<VSeriesPlotter*>& rSeriesPlotter =
+                aSeriesPlotterContainer.getSeriesPlotterList();
+            size_t n = rSeriesPlotter.size();
+            maTimeBased.m_aDataSeriesList.clear();
+            maTimeBased.m_aDataSeriesList.resize(n);
+            for(size_t i = 0; i < n; ++i)
+            {
+                std::vector< VDataSeries* > aAllNewDataSeries =
+                    rSeriesPlotter[i]->getAllSeries();
+                std::vector< VDataSeries* >& rAllOldDataSeries =
+                    maTimeBased.m_aDataSeriesList[i];
+                size_t m = std::min(aAllNewDataSeries.size(), rAllOldDataSeries.size());
+                for(size_t j = 0; j < m; ++j)
+                {
+                    rAllOldDataSeries.push_back( aAllNewDataSeries[j]->
+                            createCopyForTimeBased() );
+                }
+            }
+
+            mrChartModel.getNextTimePoint();
+        }
     }
 
     // #i12587# support for shapes in chart
@@ -2540,11 +2584,6 @@ void ChartView::createShapes()
 
     pShapeFactory->render( mxRootShape );
 
-    if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0)
-    {
-        // create copy of the data for next frame
-
-    }
     if(maTimeBased.bTimeBased)
     {
         maTimeBased.nFrame++;
diff --git a/chart2/source/view/main/VDataSeries.cxx b/chart2/source/view/main/VDataSeries.cxx
index 2f170eb..981d832 100644
--- a/chart2/source/view/main/VDataSeries.cxx
+++ b/chart2/source/view/main/VDataSeries.cxx
@@ -182,6 +182,8 @@ VDataSeries::VDataSeries( const uno::Reference< XDataSeries >& xDataSeries )
     , m_nCurrentAttributedPoint(-1)
     , m_nMissingValueTreatment(::com::sun::star::chart::MissingValueTreatment::LEAVE_GAP)
     , m_bAllowPercentValueInDataLabel(false)
+    , mpOldSeries(NULL)
+    , mnPercent(0.0)
 {
     ::rtl::math::setNan( & m_fXMeanValue );
     ::rtl::math::setNan( & m_fYMeanValue );
@@ -1053,6 +1055,33 @@ sal_Int32 VDataSeries::getMissingValueTreatment() const
     return m_nMissingValueTreatment;
 }
 
+VDataSeries::VDataSeries()
+{
+}
+
+void VDataSeries::setOldTimeBased( VDataSeries* pOldSeries, double nPercent )
+{
+    mnPercent = nPercent;
+    mpOldSeries = pOldSeries;
+}
+
+VDataSeries* VDataSeries::createCopyForTimeBased() const
+{
+    VDataSeries* pNew = new VDataSeries();
+    pNew->m_aValues_X = m_aValues_X;
+    pNew->m_aValues_Y = m_aValues_Y;
+    pNew->m_aValues_Z = m_aValues_Z;
+    pNew->m_aValues_Y_Min = m_aValues_Y_Min;
+    pNew->m_aValues_Y_Max = m_aValues_Y_Max;
+    pNew->m_aValues_Y_First = m_aValues_Y_First;
+    pNew->m_aValues_Y_Last = m_aValues_Y_Last;
+    pNew->m_aValues_Bubble_Size = m_aValues_Bubble_Size;
+
+    pNew->m_nPointCount = m_nPointCount;
+
+    return pNew;
+}
+
 } //namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 1dd601a0fd118456d83818b1c1b30fe9e3a4c264
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue Dec 31 15:15:19 2013 +0100

    time based charting calc side
    
    Change-Id: I0d5963a691e4495ee14e4d1228ea0ba2b1dd66d7

diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index a1ad831..48eb8de 100755
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -2023,6 +2023,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/chart2,\
 	XRegressionCurveContainer \
 	XScaling \
 	XTarget \
+	XTimeBased \
 	XTitle \
 	XTitled \
 	XTransformation \
diff --git a/offapi/com/sun/star/chart2/XTimeBased.idl b/offapi/com/sun/star/chart2/XTimeBased.idl
new file mode 100644
index 0000000..70ce701
--- /dev/null
+++ b/offapi/com/sun/star/chart2/XTimeBased.idl
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#ifndef com_sun_star_chart2_XTimeBased_idl
+#define com_sun_star_chart2_XTimeBased_idl
+
+#include <com/sun/star/uno/XInterface.idl>
+
+module com { module sun { module star { module chart2 {
+
+interface XTimeBased : com::sun::star::uno::XInterface
+{
+
+    /**
+     * @return
+     *      FALSE if the data wrapped around
+     */
+    boolean switchToNext();
+};
+
+}; }; }; };
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/chart2uno.hxx b/sc/inc/chart2uno.hxx
index 4f54357..81a23dc 100644
--- a/sc/inc/chart2uno.hxx
+++ b/sc/inc/chart2uno.hxx
@@ -37,13 +37,14 @@
 #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
 #include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
 #include <com/sun/star/chart2/data/DataSequenceRole.hpp>
+#include <com/sun/star/chart2/XTimeBased.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/util/XCloneable.hpp>
 #include <com/sun/star/util/XModifyBroadcaster.hpp>
-#include <cppuhelper/implbase2.hxx>
+#include <cppuhelper/implbase3.hxx>
 #include <cppuhelper/implbase5.hxx>
-#include <cppuhelper/implbase7.hxx>
+#include <cppuhelper/implbase8.hxx>
 #include <rtl/ustring.hxx>
 #include <svl/itemprop.hxx>
 
@@ -189,8 +190,9 @@ private:
 
 // DataSource
 class ScChart2DataSource : public
-                ::cppu::WeakImplHelper2<
+                ::cppu::WeakImplHelper3<
                     ::com::sun::star::chart2::data::XDataSource,
+                    com::sun::star::chart2::XTimeBased,
                     ::com::sun::star::lang::XServiceInfo>,
                 SfxListener
 {
@@ -205,6 +207,10 @@ public:
             ::com::sun::star::chart2::data::XLabeledDataSequence > > SAL_CALL
         getDataSequences() throw (::com::sun::star::uno::RuntimeException);
 
+    // XTimeBased
+    virtual sal_Bool switchToNext() throw(
+            ::com::sun::star::uno::RuntimeException);
+
     // XServiceInfo
     virtual OUString SAL_CALL getImplementationName() throw(
             ::com::sun::star::uno::RuntimeException);
@@ -220,20 +226,28 @@ public:
 
     void AddLabeledSequence(const com::sun::star::uno::Reference < com::sun::star::chart2::data::XLabeledDataSequence >& xNew);
 
+    void SetTimeBased(SCTAB nTimeBasedStart, SCTAB nTimeBasedEnd);
+
 private:
 
     ScDocument*                 m_pDocument;
     typedef std::list < com::sun::star::uno::Reference< com::sun::star::chart2::data::XLabeledDataSequence > >  LabeledList;
     LabeledList                 m_aLabeledSequences;
 
+    bool bTimeBased;
+    SCTAB mnTimeBasedStart;
+    SCTAB mnTimeBasedEnd;
+    SCTAB mnCurrentTab;
+
 };
 
 // DataSequence
 class ScChart2DataSequence : public
-                ::cppu::WeakImplHelper7<
+                ::cppu::WeakImplHelper8<
                     ::com::sun::star::chart2::data::XDataSequence,
                     ::com::sun::star::chart2::data::XTextualDataSequence,
                     ::com::sun::star::chart2::data::XNumericalDataSequence,
+                    com::sun::star::chart2::XTimeBased,
                     ::com::sun::star::util::XCloneable,
                     ::com::sun::star::util::XModifyBroadcaster,
                     ::com::sun::star::beans::XPropertySet,
@@ -269,6 +283,9 @@ public:
     virtual ::com::sun::star::uno::Sequence< OUString >
         SAL_CALL getTextualData(  ) throw (::com::sun::star::uno::RuntimeException);
 
+    // XTimeBased
+    virtual sal_Bool switchToNext() throw (::com::sun::star::uno::RuntimeException);
+
     // XPropertySet
     virtual ::com::sun::star::uno::Reference<
         ::com::sun::star::beans::XPropertySetInfo> SAL_CALL
diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx
index 1057fb5..75ce9b3 100644
--- a/sc/source/ui/unoobj/chart2uno.cxx
+++ b/sc/source/ui/unoobj/chart2uno.cxx
@@ -1441,6 +1441,7 @@ ScChart2DataProvider::createDataSource(
     bool bOrientCol = true;
     OUString aRangeRepresentation;
     uno::Sequence< sal_Int32 > aSequenceMapping;
+    sal_Bool bTimeBased = false;
     for(sal_Int32 i = 0; i < aArguments.getLength(); ++i)
     {
         if ( aArguments[i].Name == "DataRowSource" )
@@ -1470,6 +1471,10 @@ ScChart2DataProvider::createDataSource(
         {
             aArguments[i].Value >>= aSequenceMapping;
         }
+        else if ( aArguments[i].Name == "TimeBased" )
+        {
+            aArguments[i].Value >>= bTimeBased;
+        }
     }
 
     vector<ScTokenRef> aRefTokens;
@@ -1480,7 +1485,31 @@ ScChart2DataProvider::createDataSource(
         // Invalid range representation.  Bail out.
         throw lang::IllegalArgumentException();
 
-    shrinkToDataRange(m_pDocument, aRefTokens);
+    SCTAB nTimeBasedStart = MAXTAB;
+    SCTAB nTimeBasedEnd = 0;
+    if(bTimeBased)
+    {
+        // limit to first sheet
+        for(vector<ScTokenRef>::iterator itr = aRefTokens.begin(),
+                itrEnd = aRefTokens.end(); itr != itrEnd; ++itr)
+        {
+            if ((*itr)->GetType() != svDoubleRef)
+                continue;
+
+            ScComplexRefData& rData = (*itr)->GetDoubleRef();
+            ScSingleRefData& s = rData.Ref1;
+            ScSingleRefData& e = rData.Ref2;
+
+            nTimeBasedStart = std::min(nTimeBasedStart, s.Tab());
+            nTimeBasedEnd = std::min(nTimeBasedEnd, e.Tab());
+
+            if(s.Tab() != e.Tab())
+                e.SetAbsTab(s.Tab());
+        }
+    }
+
+    if(!bTimeBased)
+        shrinkToDataRange(m_pDocument, aRefTokens);
 
     if (bLabel)
         lcl_addUpperLeftCornerIfMissing(aRefTokens); //#i90669#
@@ -1550,6 +1579,8 @@ ScChart2DataProvider::createDataSource(
     }
 
     pDS = new ScChart2DataSource(m_pDocument);
+    if(bTimeBased)
+        pDS->SetTimeBased(nTimeBasedStart, nTimeBasedEnd);
     ::std::list< Reference< chart2::data::XLabeledDataSequence > >::iterator aItr( aSeqs.begin() );
     ::std::list< Reference< chart2::data::XLabeledDataSequence > >::iterator aEndItr( aSeqs.end() );
 
@@ -2424,6 +2455,32 @@ void ScChart2DataSource::AddLabeledSequence(const uno::Reference < chart2::data:
     m_aLabeledSequences.push_back(xNew);
 }
 
+sal_Bool ScChart2DataSource::switchToNext() throw ( uno::RuntimeException)
+{
+    if(mnCurrentTab != mnTimeBasedEnd)
+    {
+        for(LabeledList::iterator itr = m_aLabeledSequences.begin(),
+                itrEnd = m_aLabeledSequences.end(); itr != itrEnd; ++itr)
+        {
+            uno::Reference< chart2::XTimeBased> xTimeBased(*itr, uno::UNO_QUERY);
+            if(xTimeBased.is())
+                xTimeBased->switchToNext();
+        }
+        ++mnCurrentTab;
+        return sal_True;
+    }
+
+    return sal_False;
+}
+
+void ScChart2DataSource::SetTimeBased(SCTAB nTimeBasedStart, SCTAB nTimeBasedEnd)
+{
+    mnCurrentTab = nTimeBasedStart;
+    mnTimeBasedStart = nTimeBasedStart;
+    mnTimeBasedEnd = nTimeBasedEnd;
+    bTimeBased = true;
+}
+
 
 // DataSequence ==============================================================
 
@@ -3549,4 +3606,29 @@ void ScChart2DataSequence::setDataChangedHint(bool b)
     m_bGotDataChangedHint = b;
 }
 
+sal_Bool ScChart2DataSequence::switchToNext()
+    throw (uno::RuntimeException)
+{
+    if(!m_pTokens)
+        return sal_True;
+
+    for(vector<ScTokenRef>::iterator itr = m_pTokens->begin(),
+            itrEnd = m_pTokens->end(); itr != itrEnd; ++itr)
+    {
+        if ((*itr)->GetType() != svDoubleRef)
+            continue;
+
+        ScComplexRefData& rData = (*itr)->GetDoubleRef();
+        ScSingleRefData& s = rData.Ref1;
+        ScSingleRefData& e = rData.Ref2;
+
+        s.IncTab(1);
+        e.IncTab(1);
+    }
+
+    RebuildDataCache();
+
+    return sal_True;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 5003eda85a9bad041375f1b911a2f1c8465cce9d
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Dec 30 06:47:30 2013 +0100

    kill two virtual destructors
    
    we know that there are no subclasses so the virtual destructors are
    unnecessary
    
    Change-Id: Idad45370035004224d4128fb095aefac6b9acad0

diff --git a/chart2/source/view/inc/VDataSeries.hxx b/chart2/source/view/inc/VDataSeries.hxx
index 37d512f..94827d1 100644
--- a/chart2/source/view/inc/VDataSeries.hxx
+++ b/chart2/source/view/inc/VDataSeries.hxx
@@ -67,7 +67,7 @@ public:
         ::com::sun::star::chart2::XDataSeries >& xDataSeries,
         VDataSeries* pOldSeries, double nPercent);
 
-    virtual ~VDataSeries();
+    ~VDataSeries();
 
     ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >
         getModel() const;
diff --git a/chart2/source/view/inc/VSeriesPlotter.hxx b/chart2/source/view/inc/VSeriesPlotter.hxx
index e685700..521903e 100644
--- a/chart2/source/view/inc/VSeriesPlotter.hxx
+++ b/chart2/source/view/inc/VSeriesPlotter.hxx
@@ -78,7 +78,7 @@ class VDataSeriesGroup SAL_FINAL
 public:
     VDataSeriesGroup();
     VDataSeriesGroup( VDataSeries* pSeries );
-    virtual ~VDataSeriesGroup();
+    ~VDataSeriesGroup();
 
     void addSeries( VDataSeries* pSeries );//takes ownership of pSeries
     sal_Int32 getSeriesCount() const;
commit 3d23c3b5e1704cab9f4cf3e0829b08928d1cc8c9
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Dec 30 06:45:50 2013 +0100

    one more place for time based charting
    
    Change-Id: I977c02af8517fb747d526535bb1dc5aa0f3e485c

diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 9a2a949..3e23991 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -2369,6 +2369,8 @@ void ChartView::createShapes()
     clock_t nStart = clock();
     OSL_TRACE( "\nPPPPPPPPP>>>>>>>>>>>> chart view :: createShapes()" );
 #endif
+    if(mrChartModel.isTimeBased())
+        maTimeBased.bTimeBased = true;
 
     //make sure add-in is refreshed after creating the shapes
     const ::comphelper::ScopeGuard aGuard( boost::bind( &ChartView::impl_refreshAddIn, this ) );
@@ -2538,6 +2540,16 @@ void ChartView::createShapes()
 
     pShapeFactory->render( mxRootShape );
 
+    if(maTimeBased.bTimeBased && maTimeBased.nFrame % 60 == 0)
+    {
+        // create copy of the data for next frame
+
+    }
+    if(maTimeBased.bTimeBased)
+    {
+        maTimeBased.nFrame++;
+    }
+
 #if OSL_DEBUG_LEVEL > 0
     clock_t nEnd = clock();
     double fDuration =(double(nEnd-nStart)*1000.0)/double(CLOCKS_PER_SEC);
commit de83fa08f1f46ddbf0bb7e5bfa4b3076a7e1c642
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Dec 30 06:45:14 2013 +0100

    add SAL_FINAL to assert that there are no subclasses
    
    we can now remove all the virtual keywords
    
    Change-Id: I494b25d7a1ba7f30d319025c92040d0f882d6c63

diff --git a/chart2/source/view/inc/VDataSeries.hxx b/chart2/source/view/inc/VDataSeries.hxx
index bbd903c..37d512f 100644
--- a/chart2/source/view/inc/VDataSeries.hxx
+++ b/chart2/source/view/inc/VDataSeries.hxx
@@ -57,7 +57,7 @@ public:
     mutable ::com::sun::star::uno::Sequence< double > Doubles;
 };
 
-class VDataSeries : boost::noncopyable
+class VDataSeries SAL_FINAL : boost::noncopyable
 {
 public:
     VDataSeries( const ::com::sun::star::uno::Reference<
diff --git a/chart2/source/view/inc/VSeriesPlotter.hxx b/chart2/source/view/inc/VSeriesPlotter.hxx
index 0d68cdf..e685700 100644
--- a/chart2/source/view/inc/VSeriesPlotter.hxx
+++ b/chart2/source/view/inc/VSeriesPlotter.hxx
@@ -73,7 +73,7 @@ private:
  * A list of series that have the same CoordinateSystem. They are used to be
  * plotted maybe in a stacked manner by a plotter.
  */
-class VDataSeriesGroup
+class VDataSeriesGroup SAL_FINAL
 {
 public:
     VDataSeriesGroup();
commit 6e1afbb3eeaa6b98717078d77c9093c8379d9b85
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Dec 30 06:22:04 2013 +0100

    implement time based charting based on new approach
    
    The old approach does not work with the current implementation of the
    OpenGL backend. We now need to repaing every time the whole chart.
    
    Change-Id: I2151a3f016c6ceecaec2d45db0cb967cfee59af6

diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx
index 7d61d1d..748e5f6 100644
--- a/chart2/inc/ChartModel.hxx
+++ b/chart2/inc/ChartModel.hxx
@@ -120,6 +120,8 @@ private:
     sal_Int32               m_nInLoad;
     sal_Bool volatile       m_bUpdateNotificationsPending;
 
+    bool mbTimeBased;
+
     com::sun::star::uno::Reference< com::sun::star::uno::XInterface > xChartView; // for the ref count
     ChartView* mpChartView;
 
@@ -580,6 +582,9 @@ public:
     // normal methods
     ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >
         getNumberFormatsSupplier();
+
+    bool isTimeBased() const;
+    void setTimeBased(bool bTimeBased);
 };
 
 }  // namespace chart
diff --git a/chart2/inc/ChartView.hxx b/chart2/inc/ChartView.hxx
index 80ef459..80f0d27 100644
--- a/chart2/inc/ChartView.hxx
+++ b/chart2/inc/ChartView.hxx
@@ -51,6 +51,21 @@ namespace chart {
 class VCoordinateSystem;
 class DrawModelWrapper;
 class SeriesPlotterContainer;
+class VDataSeriesGroup;
+
+struct TimeBasedInfo
+{
+    TimeBasedInfo():
+        bTimeBased(false),
+        nFrame(0),
+        m_pZSlots(NULL) {}
+
+    bool bTimeBased;
+    size_t nFrame;
+
+    // only valid when we are in the time based mode
+    ::std::vector< ::std::vector< VDataSeriesGroup > >* m_pZSlots;
+};
 
 /**
  * The ChartView is responsible to manage the generation of Drawing Objects
@@ -237,6 +252,8 @@ private: //member
     sal_Bool m_bSdrViewIsInEditMode;
 
     ::com::sun::star::awt::Rectangle m_aResultingDiagramRectangleExcludingAxes;
+
+    TimeBasedInfo maTimeBased;
 };
 
 }
diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx
index c29a10e..842501f 100644
--- a/chart2/source/model/main/ChartModel.cxx
+++ b/chart2/source/model/main/ChartModel.cxx
@@ -1346,6 +1346,16 @@ OUString SAL_CALL ChartModel::dump()
     return OUString();
 }
 
+bool ChartModel::isTimeBased() const
+{
+    return mbTimeBased;
+}
+
+void ChartModel::setTimeBased(bool bTimeBased)
+{
+    mbTimeBased = bTimeBased;
+}
+
 }  // namespace chart
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/chart2/source/view/inc/VDataSeries.hxx b/chart2/source/view/inc/VDataSeries.hxx
index be0fab6..bbd903c 100644
--- a/chart2/source/view/inc/VDataSeries.hxx
+++ b/chart2/source/view/inc/VDataSeries.hxx
@@ -62,6 +62,11 @@ class VDataSeries : boost::noncopyable
 public:
     VDataSeries( const ::com::sun::star::uno::Reference<
         ::com::sun::star::chart2::XDataSeries >& xDataSeries );
+    // for time based charting
+    VDataSeries( const ::com::sun::star::uno::Reference<
+        ::com::sun::star::chart2::XDataSeries >& xDataSeries,
+        VDataSeries* pOldSeries, double nPercent);
+
     virtual ~VDataSeries();
 
     ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries >
@@ -140,7 +145,7 @@ public:
 
     void setRoleOfSequenceForDataLabelNumberFormatDetection( const OUString& rRole );
 
-    //this is only temporarily here for area chart:
+    //this is only tempohttps://www.google.de/search?q=minka+kelly&safe=off&tbm=isch&tbo=u&source=univ&sa=X&ei=x36_Uv6ZF9Kf7ga-rYGIAg&ved=0CK4BEIke&biw=1920&bih=1043#q=minka+kelly&safe=off&tbm=isch&tbs=isz:lrarily here for area chart:
     ::com::sun::star::drawing::PolyPolygonShape3D       m_aPolyPolygonShape3D;
     sal_Int32   m_nPolygonIndex;
     double m_fLogicMinX;
@@ -250,6 +255,10 @@ private: //member
 
     sal_Int32   m_nMissingValueTreatment;
     bool        m_bAllowPercentValueInDataLabel;
+
+    // for time based charting
+    VDataSeries* mpOldSeries;
+    double mnPercent;
 };
 
 } //namespace chart
diff --git a/chart2/source/view/inc/VSeriesPlotter.hxx b/chart2/source/view/inc/VSeriesPlotter.hxx
index 6a087de..0d68cdf 100644
--- a/chart2/source/view/inc/VSeriesPlotter.hxx
+++ b/chart2/source/view/inc/VSeriesPlotter.hxx
@@ -384,6 +384,9 @@ protected:
 
     VDataSeries* getFirstSeries() const;
 
+    // ugly hack to cache the data for the next turn
+    const std::vector< std::vector< VDataSeriesGroup > >& getData();
+
 protected:
     PlottingPositionHelper*    m_pMainPosHelper;
 
diff --git a/chart2/source/view/main/VDataSeries.cxx b/chart2/source/view/main/VDataSeries.cxx
index 72cefde..2f170eb 100644
--- a/chart2/source/view/main/VDataSeries.cxx
+++ b/chart2/source/view/main/VDataSeries.cxx
@@ -465,7 +465,14 @@ double VDataSeries::getXValue( sal_Int32 index ) const
     if(m_aValues_X.is())
     {
         if( 0<=index && index<m_aValues_X.getLength() )
+        {
             fRet = m_aValues_X.Doubles[index];
+            if(mpOldSeries)
+            {
+                double nOldVal = mpOldSeries->m_aValues_X.Doubles[index];
+                fRet = nOldVal + (fRet - nOldVal) * mnPercent;
+            }
+        }
         else
             ::rtl::math::setNan( &fRet );
     }
@@ -487,7 +494,14 @@ double VDataSeries::getYValue( sal_Int32 index ) const
     if(m_aValues_Y.is())
     {
         if( 0<=index && index<m_aValues_Y.getLength() )
+        {
             fRet = m_aValues_Y.Doubles[index];
+            if(mpOldSeries)
+            {
+                double nOldVal = mpOldSeries->m_aValues_Y.Doubles[index];
+                fRet = nOldVal + (fRet - nOldVal) * mnPercent;
+            }
+        }
         else
             ::rtl::math::setNan( &fRet );
     }
@@ -548,7 +562,14 @@ double VDataSeries::getY_Last( sal_Int32 index ) const
 }
 double VDataSeries::getBubble_Size( sal_Int32 index ) const
 {
-    return m_aValues_Bubble_Size.getValue( index );
+    double nNewVal = m_aValues_Bubble_Size.getValue( index );
+    if(mpOldSeries)
+    {
+        double nOldVal = mpOldSeries->m_aValues_Bubble_Size.getValue( index );
+        nNewVal = nOldVal + (nNewVal - nOldVal) * mnPercent;
+    }
+
+    return nNewVal;
 }
 
 bool VDataSeries::hasExplicitNumberFormat( sal_Int32 nPointIndex, bool bForPercentage ) const
commit cb6c0767078f676d596b9c417ba7697a19dbd071
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Dec 29 05:49:58 2013 +0100

    Revert "that code looked strange and might explain some artifacts"
    
    Apparently this code was not so strange. It looks even worse after my
    change. Maybe I should make it clearer that I'm just guessing right now.
    Where is this big black rectangle coming from?
    
    This reverts commit d55dfdb9b48196b9907a7023cb338a62bac99127.

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 0fc8fb2..8743327 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -1045,12 +1045,16 @@ void DummyChart::setSize( const awt::Size& aSize )
 //    DummyXShape::setSize(aSize);
 //    mpWindow->SetSizePixel(Size(aSize.Width, aSize.Height));
 //    pWindow->SetSizePixel(Size(aSize.Width, aSize.Height));
-    mpWindow->SetSizePixel(Size(0,0));
-    pWindow->SetSizePixel(Size(0,0));
+    int width = aSize.Width / 10;
+    int height = aSize.Height / 10;
+    width = (width + 3) & ~3;
+    height = (height + 3) & ~3;
+    mpWindow->SetSizePixel(Size(width, height));
+    pWindow->SetSizePixel(Size(width, height));
     DummyXShape::setSize(awt::Size(0,0));
-    m_GLRender.SetWidth(aSize.Width);
-    m_GLRender.SetHeight(aSize.Height);
-    SAL_WARN("chart2.opengl", "DummyChart::GLRender.Width = " << aSize.Width << ", GLRender.Height = " << aSize.Height);
+    m_GLRender.SetWidth(width);
+    m_GLRender.SetHeight(height);
+    SAL_WARN("chart2.opengl", "DummyChart::GLRender.Width = " << width << ", GLRender.Height = " << height);
 #endif
  //[mod] by gaowei end
 
commit 0363222d9255e9d7dba62f7b4375cfbac8b4e666
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Dec 29 05:41:29 2013 +0100

    that code looked strange and might explain some artifacts
    
    Change-Id: I069728620b741cc62218eff8ca10c0950166d6db

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 8743327..0fc8fb2 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -1045,16 +1045,12 @@ void DummyChart::setSize( const awt::Size& aSize )
 //    DummyXShape::setSize(aSize);
 //    mpWindow->SetSizePixel(Size(aSize.Width, aSize.Height));
 //    pWindow->SetSizePixel(Size(aSize.Width, aSize.Height));
-    int width = aSize.Width / 10;
-    int height = aSize.Height / 10;
-    width = (width + 3) & ~3;
-    height = (height + 3) & ~3;
-    mpWindow->SetSizePixel(Size(width, height));
-    pWindow->SetSizePixel(Size(width, height));
+    mpWindow->SetSizePixel(Size(0,0));
+    pWindow->SetSizePixel(Size(0,0));
     DummyXShape::setSize(awt::Size(0,0));
-    m_GLRender.SetWidth(width);
-    m_GLRender.SetHeight(height);
-    SAL_WARN("chart2.opengl", "DummyChart::GLRender.Width = " << width << ", GLRender.Height = " << height);
+    m_GLRender.SetWidth(aSize.Width);
+    m_GLRender.SetHeight(aSize.Height);
+    SAL_WARN("chart2.opengl", "DummyChart::GLRender.Width = " << aSize.Width << ", GLRender.Height = " << aSize.Height);
 #endif
  //[mod] by gaowei end
 
commit 0fc308400a3b9a08498bf0a54356d848f6f4f0b5
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Dec 29 05:37:53 2013 +0100

    remove unused variable
    
    Change-Id: I45418cd15bab69083824561a005263ae0908aa52

diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx
index 2fe8e79..8743327 100644
--- a/chart2/source/view/main/DummyXShape.cxx
+++ b/chart2/source/view/main/DummyXShape.cxx
@@ -1049,9 +1049,6 @@ void DummyChart::setSize( const awt::Size& aSize )
     int height = aSize.Height / 10;
     width = (width + 3) & ~3;
     height = (height + 3) & ~3;
-    awt::Size tempSize;
-    tempSize.Width = width;
-    tempSize.Height = height;
     mpWindow->SetSizePixel(Size(width, height));
     pWindow->SetSizePixel(Size(width, height));
     DummyXShape::setSize(awt::Size(0,0));
commit 30ac7befe324679a75caa594fe502eaca3e033b4
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Dec 29 05:31:58 2013 +0100

    next try
    
    Change-Id: If55af315576f3dd0b19687f83b6e259974123582

diff --git a/chart2/source/view/main/OpenglShapeFactory.cxx b/chart2/source/view/main/OpenglShapeFactory.cxx
index 16516c2..f22dc84 100644
--- a/chart2/source/view/main/OpenglShapeFactory.cxx
+++ b/chart2/source/view/main/OpenglShapeFactory.cxx
@@ -123,6 +123,7 @@ uno::Reference< drawing::XShapes > OpenglShapeFactory::getOrCreateChartRootShape
                 "com.sun.star.drawing.GraphicObjectShape" ), uno::UNO_QUERY );
         dummy::DummyChart *pChart = new dummy::DummyChart(xTarget);
         SvxDummyShapeContainer* pContainer = new SvxDummyShapeContainer(pChart);
+        pContainer->setSize(awt::Size(0,0));
         xRet = pChart;
         xDrawPage->add(xTarget);
         xDrawPage->add(pContainer);


More information about the Libreoffice-commits mailing list