How to create an object of type ::com::sun::star::chart2::data::XLabeledDataSequence ?

Jan Rheinländer jrheinlaender at gmx.de
Fri May 15 13:03:06 PDT 2015


Hi,

I'm trying to insert an XYDiagram into a Writer (!) document by code.
But I can't figure out how to get any data into it. All the examples on
the web are always for Calc, never for Writer. The code I have got is below.

Everything works fine until I want to create my sequences.

Reference < XTextContent > insertChart(const Reference < XController >
&xCtrl) {
  Reference < XTextCursor > xModelCursor;
  Reference < XText > xDocumentText = getDocumentText(xCtrl, xModelCursor);
  Reference < XTextContent > xChart = createObject(xCtrl, CLSID_CHART);
 
  // Insert the chart
  Reference < XTextRange > xRange(xModelCursor, UNO_QUERY_THROW);
  xDocumentText->insertTextContent(xRange, xChart, true);

  // Get a factory to create objects for this chart
  Reference < XEmbeddedObjectSupplier > xEOS(xChart, UNO_QUERY_THROW);
  Reference < com::sun::star::chart::XChartDocument >
cDoc(xEOS->getEmbeddedObject(), UNO_QUERY_THROW);
  Reference < XMultiServiceFactory > cDocMSF(cDoc, UNO_QUERY_THROW);

  // Make sure that we have a clear interpretation of where data series are
  Reference < XPropertySet > cDocProps (cDoc, UNO_QUERY_THROW);
  cDocProps->setPropertyValue(OU("DataRowSource"),
makeAny(::com::sun::star::chart::ChartDataRowSource_ROWS));
 
  // Create a new XYDiagram
  Reference < ::com::sun::star::chart::XDiagram >
xyDiagram(cDocMSF->createInstance(OU("com.sun.star.chart.XYDiagram")),
UNO_QUERY_THROW);
  cDoc->setDiagram(xyDiagram);

  // Create two new sequences based on the two first default sequences,
setting the roles correctly for an XYDiagram
  Reference < ::com::sun::star::chart2::XChartDocument >
chart(xEOS->getEmbeddedObject(), UNO_QUERY_THROW);
  chart->createInternalDataProvider(true);
  Reference< XDataProvider > dataProvider = chart->getDataProvider();
  Reference< XDataSequence > seqDataX =
dataProvider->createDataSequenceByRangeRepresentation(OU("0"));
  Reference < XPropertySet > seqProps (seqDataX, UNO_QUERY_THROW);
  seqProps->setPropertyValue(OU("Role"), makeAny(OU("values-x")));
  Reference< XDataSequence > seqLabelX =
dataProvider->createDataSequenceByRangeRepresentation(OU("label 0"));
  Reference< XDataSequence > seqDataY =
dataProvider->createDataSequenceByRangeRepresentation(OU("1"));
  seqProps = Reference< XPropertySet >(seqDataY, UNO_QUERY_THROW);
  seqProps->setPropertyValue(OU("Role"), makeAny(OU("values-y")));
  Reference< XDataSequence > seqLabelY =
dataProvider->createDataSequenceByRangeRepresentation(OU("label 1"));

  // Get write access to the chart series
  Reference< ::com::sun::star::chart2::XDiagram > diagram =
chart->getFirstDiagram();
  Reference< XCoordinateSystemContainer > xCoordCnt(diagram,
UNO_QUERY_THROW);
  Reference< XChartTypeContainer >
xChartTypeCnt(xCoordCnt->getCoordinateSystems()[0], UNO_QUERY_THROW);
  Reference< XDataSeriesContainer >
chartType(xChartTypeCnt->getChartTypes()[0], UNO_QUERY_THROW);

===>
===> Here the problems start: This gives an "unsatisified query" error
===>
  // Create two sequences
  Sequence< Reference< XLabeledDataSequence > > sequences(2);
  sequences[0] = Reference <
::com::sun::star::chart2::data::XLabeledDataSequence >
(cDocMSF->createInstance(OU("com.sun.star.chart2.data.LabeledDataSequence")),
UNO_QUERY_THROW);
  sequences[1] = Reference <
::com::sun::star::chart2::data::XLabeledDataSequence >
(cDocMSF->createInstance(OU("com.sun.star.chart2.data.LabeledDataSequence")),
UNO_QUERY_THROW);
  sequences[0]->setValues(seqDataX);
  sequences[0]->setLabel(seqLabelX);
  sequences[1]->setValues(seqDataY);
  sequences[1]->setLabel(seqLabelY);

  Reference< XDataSeries > xDataSeries = ????;
  Reference< XDataSink > XYSink(xDataSeries, UNO_QUERY_THROW);
  XYSink->setData(sequences);

  chartType->addDataSeries(xDataSeries);

  return xChart;
} // insertChart()




More information about the LibreOffice mailing list