summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chart2/inc/ChartView.hxx9
-rw-r--r--chart2/source/inc/LabeledDataSequence.hxx10
-rw-r--r--chart2/source/model/main/ChartModel.cxx28
-rw-r--r--chart2/source/tools/LabeledDataSequence.cxx31
-rw-r--r--chart2/source/view/main/ChartView.cxx55
-rw-r--r--offapi/com/sun/star/chart2/XTimeBased.idl7
-rw-r--r--sc/inc/chart2uno.hxx23
-rw-r--r--sc/source/ui/unoobj/chart2uno.cxx71
8 files changed, 146 insertions, 88 deletions
diff --git a/chart2/inc/ChartView.hxx b/chart2/inc/ChartView.hxx
index b1c6b5f3eb25..766563a43c97 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 3cd8258b0017..41b7e2647dc4 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 d65ab67ddf3c..a0d93d171e7b 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 68df3c83520c..cc0a6c199e17 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 53ac9fc9702a..e462d7f9a707 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 70ce70152487..328b54c28d6c 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 8f7e5dc67761..ce36c268dea1 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
@@ -292,6 +280,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<
@@ -475,6 +464,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 3df59af73c28..0dfd65f1f00e 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
@@ -3552,6 +3529,10 @@ uno::Any SAL_CALL ScChart2DataSequence::getPropertyValue(const OUString& rProper
BuildDataCache();
aRet <<= m_aHiddenValues;
}
+ else if (rPropertyName == "TimeBased")
+ {
+ aRet <<= mbTimeBased;
+ }
else
throw beans::UnknownPropertyException();
// TODO: support optional properties
@@ -3613,6 +3594,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)
{
@@ -3632,4 +3616,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: */