File indexing completed on 2024-05-12 16:33:32

0001 /* This file is part of the KDE project
0002 
0003    Copyright 2007-2008 Johannes Simon <johannes.simon@gmail.com>
0004    Copyright 2009      Inge Wallin    <inge@lysator.liu.se>
0005    Copyright 2018 Dag Andersen <danders@get2net.dk>
0006 
0007    This library is free software; you can redistribute it and/or
0008    modify it under the terms of the GNU Library General Public
0009    License as published by the Free Software Foundation; either
0010    version 2 of the License, or (at your option) any later version.
0011 
0012    This library is distributed in the hope that it will be useful,
0013    but WITHOUT ANY WARRANTY; without even the implied warranty of
0014    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0015    Library General Public License for more details.
0016 
0017    You should have received a copy of the GNU Library General Public License
0018    along with this library; see the file COPYING.LIB.  If not, write to
0019    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0020    Boston, MA 02110-1301, USA.
0021 */
0022 
0023 // Own
0024 #include "DataSetConfigWidget.h"
0025 #include "ui_DataSetConfigWidget.h"
0026 
0027 // Qt
0028 #include <QAction>
0029 #include <QMenu>
0030 #include <QLatin1String>
0031 
0032 // KF5
0033 #include <klocalizedstring.h>
0034 #include <kmessagebox.h>
0035 #include <kfontchooser.h>
0036 
0037 // Calligra
0038 #include <interfaces/KoChartModel.h>
0039 #include <KoIcon.h>
0040 
0041 // KChart
0042 #include <KChartChart>
0043 #include <KChartPosition>
0044 #include <KChartCartesianAxis>
0045 #include <KChartGridAttributes>
0046 #include <KChartAbstractCartesianDiagram>
0047 #include <KChartLegend>
0048 #include <KChartDataValueAttributes>
0049 #include <KChartTextAttributes>
0050 #include <KChartMarkerAttributes>
0051 #include <KChartMeasure>
0052 
0053 // KoChart
0054 #include "ChartProxyModel.h"
0055 #include "PlotArea.h"
0056 #include "Legend.h"
0057 #include "DataSet.h"
0058 #include "Axis.h"
0059 #include "ui_ChartTableEditor.h"
0060 #include "NewAxisDialog.h"
0061 #include "AxisScalingDialog.h"
0062 #include "FontEditorDialog.h"
0063 #include "FormatErrorBarDialog.h"
0064 #include "CellRegionDialog.h"
0065 #include "TableEditorDialog.h"
0066 #include "commands/ChartTypeCommand.h"
0067 #include "CellRegionStringValidator.h"
0068 #include "ChartTableModel.h"
0069 #include "TableSource.h"
0070 #include "ChartDebug.h"
0071 
0072 using namespace KoChart;
0073 
0074 
0075 class DataSetConfigWidget::Private
0076 {
0077 public:
0078     Private(DataSetConfigWidget *parent);
0079     ~Private();
0080 
0081     Ui::DataSetConfigWidget ui;
0082 
0083     QList<Axis*> dataSetAxes;
0084     QList<DataSet*> dataSets;
0085     int selectedDataSet;
0086 
0087     // Menus
0088     QMenu *dataSetBarChartMenu;
0089     QMenu *dataSetLineChartMenu;
0090     QMenu *dataSetAreaChartMenu;
0091     QMenu *dataSetRadarChartMenu;
0092     QMenu *dataSetStockChartMenu;
0093 
0094     // chart type selection actions
0095     QAction  *normalBarChartAction;
0096     QAction  *stackedBarChartAction;
0097     QAction  *percentBarChartAction;
0098 
0099     QAction  *normalLineChartAction;
0100     QAction  *stackedLineChartAction;
0101     QAction  *percentLineChartAction;
0102 
0103     QAction  *normalAreaChartAction;
0104     QAction  *stackedAreaChartAction;
0105     QAction  *percentAreaChartAction;
0106 
0107     QAction  *circleChartAction;
0108     QAction  *ringChartAction;
0109     QAction  *radarChartAction;
0110     QAction  *filledRadarChartAction;
0111 
0112     QAction  *scatterChartAction;
0113     QAction  *bubbleChartAction;
0114 
0115     QAction  *hlcStockChartAction;
0116     QAction  *ohlcStockChartAction;
0117     QAction  *candlestickStockChartAction;
0118 
0119     QAction  *surfaceChartAction;
0120     QAction  *ganttChartAction;
0121 
0122     // chart type selection actions for datasets
0123     QAction  *dataSetNormalBarChartAction;
0124     QAction  *dataSetStackedBarChartAction;
0125     QAction  *dataSetPercentBarChartAction;
0126 
0127     QAction  *dataSetNormalLineChartAction;
0128     QAction  *dataSetStackedLineChartAction;
0129     QAction  *dataSetPercentLineChartAction;
0130 
0131     QAction  *dataSetNormalAreaChartAction;
0132     QAction  *dataSetStackedAreaChartAction;
0133     QAction  *dataSetPercentAreaChartAction;
0134 
0135     QAction  *dataSetCircleChartAction;
0136     QAction  *dataSetRingChartAction;
0137     QAction  *dataSetRadarChartAction;
0138     QAction  *dataSetFilledRadarChartAction;
0139     QAction  *dataSetScatterChartAction;
0140     QAction  *dataSetBubbleChartAction;
0141 
0142     QAction  *dataSetHLCStockChartAction;
0143     QAction  *dataSetOHLCStockChartAction;
0144     QAction  *dataSetCandlestickStockChartAction;
0145 
0146     QAction  *dataSetSurfaceChartAction;
0147     QAction  *dataSetGanttChartAction;
0148 
0149     // marker selection actions for datasets
0150     QAction *dataSetNoMarkerAction;
0151     QAction *dataSetAutomaticMarkerAction;
0152     QAction *dataSetMarkerCircleAction;
0153     QAction *dataSetMarkerSquareAction;
0154     QAction *dataSetMarkerDiamondAction;
0155     QAction *dataSetMarkerRingAction;
0156     QAction *dataSetMarkerCrossAction;
0157     QAction *dataSetMarkerFastCrossAction;
0158     QAction *dataSetMarkerArrowDownAction;
0159     QAction *dataSetMarkerArrowUpAction;
0160     QAction *dataSetMarkerArrowRightAction;
0161     QAction *dataSetMarkerArrowLeftAction;
0162     QAction *dataSetMarkerBowTieAction;
0163     QAction *dataSetMarkerHourGlassAction;
0164     QAction *dataSetMarkerStarAction;
0165     QAction *dataSetMarkerXAction;
0166     QAction *dataSetMarkerAsteriskAction;
0167     QAction *dataSetMarkerHorizontalBarAction;
0168     QAction *dataSetMarkerVerticalBarAction;
0169 
0170     FormatErrorBarDialog formatErrorBarDialog;
0171 };
0172 
0173 
0174 DataSetConfigWidget::Private::Private(DataSetConfigWidget *parent)
0175     : formatErrorBarDialog(parent)
0176 
0177 {
0178     ui.setupUi(parent);
0179 
0180     selectedDataSet = 0;
0181 
0182     dataSetBarChartMenu = 0;
0183     dataSetLineChartMenu = 0;
0184     dataSetAreaChartMenu = 0;
0185     dataSetRadarChartMenu = 0;
0186     dataSetStockChartMenu = 0;
0187     dataSetNormalBarChartAction = 0;
0188     dataSetStackedBarChartAction = 0;
0189     dataSetPercentBarChartAction = 0;
0190     dataSetNormalLineChartAction = 0;
0191     dataSetStackedLineChartAction = 0;
0192     dataSetPercentLineChartAction = 0;
0193     dataSetNormalAreaChartAction = 0;
0194     dataSetStackedAreaChartAction = 0;
0195     dataSetPercentAreaChartAction = 0;
0196     dataSetCircleChartAction = 0;
0197     dataSetRingChartAction = 0;
0198     dataSetScatterChartAction = 0;
0199     dataSetRadarChartAction = 0;
0200     dataSetFilledRadarChartAction = 0;
0201     dataSetHLCStockChartAction = 0;
0202     dataSetOHLCStockChartAction = 0;
0203     dataSetCandlestickStockChartAction = 0;
0204     dataSetBubbleChartAction = 0;
0205     dataSetSurfaceChartAction = 0;
0206     dataSetGanttChartAction = 0;
0207 
0208     // Data set chart type button
0209     QMenu *dataSetChartTypeMenu = new QMenu(i18n("Chart Type"), parent);
0210 
0211     // Default chart type is a bar chart
0212     dataSetChartTypeMenu->setIcon(ICON1(BarChartType));
0213 
0214 
0215     dataSetBarChartMenu = dataSetChartTypeMenu->addMenu(ICON1(BarChartType), i18n("Bar Chart"));
0216     dataSetNormalBarChartAction  = dataSetBarChartMenu->addAction(ICON2(BarChartType, NormalChartSubtype), i18n("Normal"));
0217     dataSetStackedBarChartAction = dataSetBarChartMenu->addAction(ICON2(BarChartType, StackedChartSubtype), i18n("Stacked"));
0218     dataSetPercentBarChartAction = dataSetBarChartMenu->addAction(ICON2(BarChartType, PercentChartSubtype), i18n("Percent"));
0219 
0220     dataSetLineChartMenu = dataSetChartTypeMenu->addMenu(ICON1(LineChartType), i18n("Line Chart"));
0221     dataSetNormalLineChartAction  = dataSetLineChartMenu->addAction(ICON2(LineChartType, NormalChartSubtype), i18n("Normal"));
0222     dataSetStackedLineChartAction = dataSetLineChartMenu->addAction(ICON2(LineChartType, NormalChartSubtype), i18n("Stacked"));
0223     dataSetPercentLineChartAction = dataSetLineChartMenu->addAction(ICON2(LineChartType, NormalChartSubtype), i18n("Percent"));
0224 
0225     dataSetAreaChartMenu = dataSetChartTypeMenu->addMenu(ICON1(AreaChartType), i18n("Area Chart"));
0226     dataSetNormalAreaChartAction  = dataSetAreaChartMenu->addAction(ICON2(AreaChartType, NormalChartSubtype), i18n("Normal"));
0227     dataSetStackedAreaChartAction = dataSetAreaChartMenu->addAction(ICON2(AreaChartType, StackedChartSubtype), i18n("Stacked"));
0228     dataSetPercentAreaChartAction = dataSetAreaChartMenu->addAction(ICON2(AreaChartType, PercentChartSubtype), i18n("Percent"));
0229 
0230     dataSetCircleChartAction = dataSetChartTypeMenu->addAction(ICON1(CircleChartType), i18n("Pie Chart"));
0231     dataSetRingChartAction = dataSetChartTypeMenu->addAction(ICON1(RingChartType), i18n("Ring Chart"));
0232 
0233     dataSetRadarChartMenu = dataSetChartTypeMenu->addMenu(ICON1(RadarChartType), i18n("Polar Chart"));
0234     dataSetRadarChartAction = dataSetRadarChartMenu->addAction(ICON2(RadarChartType, NoChartSubtype), i18n("Normal"));
0235     dataSetFilledRadarChartAction = dataSetRadarChartMenu->addAction(ICON2(FilledRadarChartType, NoChartSubtype), i18n("Filled"));
0236 
0237     dataSetStockChartMenu = dataSetChartTypeMenu->addMenu(ICON1(StockChartType), i18n("Stock Chart"));
0238     dataSetCandlestickStockChartAction = dataSetStockChartMenu->addAction(ICON2(StockChartType, CandlestickChartSubtype), i18n("Candlestick"));
0239     dataSetOHLCStockChartAction = dataSetStockChartMenu->addAction(ICON2(StockChartType, OpenHighLowCloseChartSubtype), i18n("OpenHighLowClose"));
0240     dataSetHLCStockChartAction = dataSetStockChartMenu->addAction(ICON2(StockChartType, HighLowCloseChartSubtype), i18n("HighLowClose"));
0241 
0242     dataSetBubbleChartAction = dataSetChartTypeMenu->addAction(ICON1(BubbleChartType), i18n("Bubble Chart"));
0243 
0244     dataSetScatterChartAction = dataSetChartTypeMenu->addAction(ICON1(ScatterChartType), i18n("Scatter Chart"));
0245 
0246     ui.dataSetChartTypeMenu->setMenu(dataSetChartTypeMenu);
0247 
0248     connect(dataSetChartTypeMenu, SIGNAL(triggered(QAction*)), parent, SLOT(dataSetChartTypeSelected(QAction*)));
0249 
0250     connect(ui.dataSetHasChartType, SIGNAL(toggled(bool)), parent, SLOT(ui_dataSetHasChartTypeChanged(bool)));
0251 
0252     // Setup marker menu
0253     QMenu *datasetMarkerMenu = new QMenu(parent);
0254 
0255     // Default marker is Automatic
0256     datasetMarkerMenu->setIcon(QIcon());
0257 
0258     dataSetNoMarkerAction = datasetMarkerMenu->addAction(i18n("None"));
0259     dataSetAutomaticMarkerAction = datasetMarkerMenu->addAction(i18n("Automatic"));
0260 
0261     QMenu *datasetSelectMarkerMenu = datasetMarkerMenu->addMenu(i18n("Select"));
0262     dataSetMarkerSquareAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0263     dataSetMarkerDiamondAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0264     dataSetMarkerArrowDownAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0265     dataSetMarkerArrowUpAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0266     dataSetMarkerArrowRightAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0267     dataSetMarkerArrowLeftAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0268     dataSetMarkerBowTieAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0269     dataSetMarkerHourGlassAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0270     dataSetMarkerCircleAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0271     dataSetMarkerStarAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0272     dataSetMarkerXAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0273     dataSetMarkerCrossAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0274     dataSetMarkerAsteriskAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0275     dataSetMarkerHorizontalBarAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0276     dataSetMarkerVerticalBarAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0277     dataSetMarkerRingAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0278     dataSetMarkerFastCrossAction = datasetSelectMarkerMenu->addAction(QIcon(), QString());
0279 
0280     ui.datasetMarkerMenu->setMenu(datasetMarkerMenu);
0281     connect(datasetMarkerMenu, SIGNAL(triggered(QAction*)), parent, SLOT(datasetMarkerSelected(QAction*)));
0282 
0283     // Insert error bar button
0284     ui.formatErrorBar->setEnabled(false);
0285 
0286     connect(ui.datasetBrush, SIGNAL(changed(QColor)),parent, SLOT(datasetBrushSelected(QColor)));
0287     connect(ui.datasetPen, SIGNAL(changed(QColor)), parent, SLOT(datasetPenSelected(QColor)));
0288     connect(ui.datasetShowCategory, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowCategoryChanged(bool)));
0289     connect(ui.datasetShowErrorBar, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowErrorBarChanged(bool)));
0290     connect(ui.dataSetShowNumber, SIGNAL(toggled(bool)), parent, SLOT(ui_dataSetShowNumberChanged(bool)));
0291     connect(ui.datasetShowPercent, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowPercentChanged(bool)));
0292 
0293     // TODO
0294     // connect(ui.datasetShowSymbol, SIGNAL(toggled(bool)), parent, SLOT(ui_datasetShowSymbolChanged(bool)));
0295 
0296 
0297     connect(ui.dataSets, SIGNAL(currentIndexChanged(int)), parent, SLOT(ui_dataSetSelectionChanged(int)));
0298     connect(ui.dataSetAxes, SIGNAL(currentIndexChanged(int)), parent, SLOT(ui_dataSetAxisSelectionChanged(int)));
0299 
0300 }
0301 
0302 DataSetConfigWidget::Private::~Private()
0303 {
0304 }
0305 
0306 
0307 // ================================================================
0308 //                     class DataSetConfigWidget
0309 
0310 
0311 DataSetConfigWidget::DataSetConfigWidget(QWidget *parent)
0312     : ConfigSubWidgetBase(parent)
0313     , d(new Private(this))
0314 {
0315     setObjectName("DataSetConfigWidget");
0316 
0317     setupDialogs();
0318     createActions();
0319 }
0320 
0321 DataSetConfigWidget::DataSetConfigWidget(QList<ChartType> types, QWidget *parent)
0322     : ConfigSubWidgetBase(types, parent)
0323     , d(new Private(this))
0324 {
0325     setObjectName("DataSetConfigWidget");
0326 
0327     setupDialogs();
0328     createActions();
0329 }
0330 
0331 DataSetConfigWidget::~DataSetConfigWidget()
0332 {
0333     delete d;
0334 }
0335 
0336 void DataSetConfigWidget::deleteSubDialogs(ChartType type)
0337 {
0338     Q_UNUSED(type)
0339 }
0340 
0341 void DataSetConfigWidget::open(ChartShape* shape)
0342 {
0343     debugChartUiDataSet<<shape;
0344 
0345     // reset these so we do not risc using old, deleted data
0346     // these are recalculated in updateData() anyway
0347     d->dataSetAxes.clear();
0348     d->dataSets.clear();
0349 
0350     ConfigSubWidgetBase::open(shape);
0351 }
0352 
0353 QAction *DataSetConfigWidget::createAction()
0354 {
0355     return 0;
0356 }
0357 
0358 void DataSetConfigWidget::ui_dataSetAxisSelectionChanged(int index)
0359 {
0360     if (index < 0 || d->ui.dataSets->currentIndex() >= d->dataSets.count()) {
0361         return;
0362     }
0363     debugChartUiDataSet<<index<<d->dataSetAxes;
0364     if (index >= d->dataSetAxes.count()) {
0365         // Add the axis
0366         debugChartUiDataSet<<"create secondary y axis";
0367         emit axisAdded(YAxisDimension, i18n("Axistitle"));
0368     }
0369     if (index < 0 || index >= d->dataSetAxes.count()) {
0370         return;
0371     }
0372     DataSet *dataSet = d->dataSets[d->ui.dataSets->currentIndex()];
0373     Axis *axis = d->dataSetAxes[index];
0374     emit dataSetAxisChanged(dataSet, axis);
0375 }
0376 
0377 void DataSetConfigWidget::updateMarkers()
0378 {
0379     DataSet *dataSet = d->dataSets[d->selectedDataSet];
0380 
0381     d->dataSetMarkerCircleAction->setIcon(dataSet->markerIcon(MarkerCircle));
0382     d->dataSetMarkerSquareAction->setIcon(dataSet->markerIcon(MarkerSquare));
0383     d->dataSetMarkerDiamondAction->setIcon(dataSet->markerIcon(MarkerDiamond));
0384     d->dataSetMarkerRingAction->setIcon(dataSet->markerIcon(MarkerRing));
0385     d->dataSetMarkerCrossAction->setIcon(dataSet->markerIcon(MarkerCross));
0386     d->dataSetMarkerFastCrossAction->setIcon(dataSet->markerIcon(MarkerFastCross));
0387     d->dataSetMarkerArrowDownAction->setIcon(dataSet->markerIcon(MarkerArrowDown));
0388     d->dataSetMarkerArrowUpAction->setIcon(dataSet->markerIcon(MarkerArrowUp));
0389     d->dataSetMarkerArrowRightAction->setIcon(dataSet->markerIcon(MarkerArrowRight));
0390     d->dataSetMarkerArrowLeftAction->setIcon(dataSet->markerIcon(MarkerArrowLeft));
0391     d->dataSetMarkerBowTieAction->setIcon(dataSet->markerIcon(MarkerBowTie));
0392     d->dataSetMarkerHourGlassAction->setIcon(dataSet->markerIcon(MarkerHourGlass));
0393     d->dataSetMarkerStarAction->setIcon(dataSet->markerIcon(MarkerStar));
0394     d->dataSetMarkerXAction->setIcon(dataSet->markerIcon(MarkerX));
0395     d->dataSetMarkerAsteriskAction->setIcon(dataSet->markerIcon(MarkerAsterisk));
0396     d->dataSetMarkerHorizontalBarAction->setIcon(dataSet->markerIcon(MarkerHorizontalBar));
0397     d->dataSetMarkerVerticalBarAction->setIcon(dataSet->markerIcon(MarkerVerticalBar));
0398 
0399     switch(dataSet->odfSymbolType()) {
0400         case NoSymbol:
0401             d->ui.datasetMarkerMenu->setText(i18n("None"));
0402             d->ui.datasetMarkerMenu->setIcon(QIcon());
0403             break;
0404         case NamedSymbol:
0405             d->ui.datasetMarkerMenu->setIcon(dataSet->markerIcon(dataSet->markerStyle()));
0406             d->ui.datasetMarkerMenu->setText(QString());
0407             break;
0408         case ImageSymbol:
0409         case AutomaticSymbol:
0410             d->ui.datasetMarkerMenu->setText(i18n("Auto"));
0411             d->ui.datasetMarkerMenu->setIcon(QIcon());
0412             break;
0413     }
0414 }
0415 void DataSetConfigWidget::ui_dataSetErrorBarTypeChanged()
0416 {
0417     if (d->selectedDataSet < 0) {
0418         return;
0419     }
0420     debugChartUiDataSet;
0421     QString type = d->formatErrorBarDialog.widget.errorType->currentText();
0422     d->ui.formatErrorBar->setText(type);
0423 }
0424 
0425 void DataSetConfigWidget::ui_dataSetHasChartTypeChanged(bool b)
0426 {
0427     if (d->selectedDataSet < 0) {
0428         return;
0429     }
0430     debugChartUiDataSet<<b;
0431     DataSet *dataSet = d->dataSets[d->selectedDataSet];
0432     Q_ASSERT(dataSet);
0433     if (!dataSet) {
0434         return;
0435     }
0436     if (b) {
0437         emit dataSetChartTypeChanged(dataSet, chart->chartType(), chart->chartSubType());
0438     } else {
0439         emit dataSetChartTypeChanged(dataSet, LastChartType, NoChartSubtype);
0440     }
0441 }
0442 
0443 void DataSetConfigWidget::dataSetChartTypeSelected(QAction *action)
0444 {
0445     if (d->selectedDataSet < 0)
0446         return;
0447 
0448     debugChartUiDataSet<<action;
0449 
0450     ChartType     type    = LastChartType;
0451     ChartSubtype  subtype = NoChartSubtype;
0452 
0453     if (action == d->dataSetNormalBarChartAction) {
0454         type    = BarChartType;
0455         subtype = NormalChartSubtype;
0456     } else if (action == d->dataSetStackedBarChartAction) {
0457         type    = BarChartType;
0458         subtype = StackedChartSubtype;
0459     } else if (action == d->dataSetPercentBarChartAction) {
0460         type    = BarChartType;
0461         subtype = PercentChartSubtype;
0462     }
0463 
0464     else if (action == d->dataSetNormalLineChartAction) {
0465         type    = LineChartType;
0466         subtype = NormalChartSubtype;
0467     } else if (action == d->dataSetStackedLineChartAction) {
0468         type    = LineChartType;
0469         subtype = StackedChartSubtype;
0470     } else if (action == d->dataSetPercentLineChartAction) {
0471         type    = LineChartType;
0472         subtype = PercentChartSubtype;
0473     }
0474 
0475     else if (action == d->dataSetNormalAreaChartAction) {
0476         type    = AreaChartType;
0477         subtype = NormalChartSubtype;
0478     } else if (action == d->dataSetStackedAreaChartAction) {
0479         type    = AreaChartType;
0480         subtype = StackedChartSubtype;
0481     } else if (action == d->dataSetPercentAreaChartAction) {
0482         type    = AreaChartType;
0483         subtype = PercentChartSubtype;
0484     }
0485 
0486     else if (action == d->dataSetRadarChartAction)
0487         type = RadarChartType;
0488     else if (action == d->dataSetFilledRadarChartAction)
0489         type = FilledRadarChartType;
0490 
0491     else if (action == d->dataSetCircleChartAction)
0492         type = CircleChartType;
0493     else if (action == d->dataSetRingChartAction)
0494         type = RingChartType;
0495     else if (action == d->dataSetScatterChartAction)
0496         type = ScatterChartType;
0497 
0498     else if (action == d->dataSetHLCStockChartAction) {
0499         type    = StockChartType;
0500         subtype = HighLowCloseChartSubtype;
0501     } else if (action == d->dataSetStackedAreaChartAction) {
0502         type    = StockChartType;
0503         subtype = OpenHighLowCloseChartSubtype;
0504     } else if (action == d->dataSetCandlestickStockChartAction) {
0505         type    = StockChartType;
0506         subtype = CandlestickChartSubtype;
0507     }
0508 
0509     else if (action == d->dataSetBubbleChartAction)
0510         type = BubbleChartType;
0511 
0512     // FIXME: Not supported by KoChart yet:
0513     //surface
0514     //gantt
0515 
0516     DataSet *dataSet = d->dataSets[d->selectedDataSet];
0517     Q_ASSERT(dataSet);
0518     if (!dataSet)
0519         return;
0520 
0521     const QLatin1String iconName = chartTypeIconName(type, subtype);
0522     if (iconName.size() > 0)
0523         d->ui.dataSetChartTypeMenu->setIcon(QIcon::fromTheme(iconName));
0524 
0525     emit dataSetChartTypeChanged(dataSet, type, subtype);
0526 
0527     updateData(type, subtype);
0528 }
0529 
0530 void DataSetConfigWidget::datasetMarkerSelected(QAction *action)
0531 {
0532     if (d->selectedDataSet < 0)
0533         return;
0534 
0535     const int numDefaultMarkerTypes = 15;
0536     OdfMarkerStyle style = MarkerSquare;
0537     QString type = QString("");
0538     OdfSymbolType symbolType = NamedSymbol;
0539     if (action == d->dataSetNoMarkerAction) {
0540         symbolType = NoSymbol;
0541         type = "None";
0542     } else if (action == d->dataSetAutomaticMarkerAction) {
0543         style = (OdfMarkerStyle) (d->selectedDataSet % numDefaultMarkerTypes);
0544         type = "Auto";
0545         symbolType = AutomaticSymbol;
0546     } else if (action == d->dataSetMarkerCircleAction) {
0547         style = MarkerCircle;
0548     } else if (action == d->dataSetMarkerSquareAction) {
0549         style = MarkerSquare;
0550     } else if (action == d->dataSetMarkerDiamondAction) {
0551         style = MarkerDiamond;
0552     } else if (action == d->dataSetMarkerRingAction) {
0553         style = MarkerRing;
0554     } else if (action == d->dataSetMarkerCrossAction) {
0555         style = MarkerCross;
0556     } else if (action == d->dataSetMarkerFastCrossAction) {
0557         style = MarkerFastCross;
0558     } else if (action == d->dataSetMarkerArrowDownAction) {
0559         style = MarkerArrowDown;
0560     } else if (action == d->dataSetMarkerArrowUpAction) {
0561         style = MarkerArrowUp;
0562     } else if (action == d->dataSetMarkerArrowRightAction) {
0563         style = MarkerArrowRight;
0564     } else if (action == d->dataSetMarkerArrowLeftAction) {
0565         style = MarkerArrowLeft;
0566     } else if (action == d->dataSetMarkerBowTieAction) {
0567         style = MarkerBowTie;
0568     } else if (action == d->dataSetMarkerHourGlassAction) {
0569         style = MarkerHourGlass;
0570     } else if (action == d->dataSetMarkerStarAction) {
0571         style = MarkerStar;
0572     } else if (action == d->dataSetMarkerXAction) {
0573         style = MarkerX;
0574     } else if (action == d->dataSetMarkerAsteriskAction) {
0575         style = MarkerAsterisk;
0576     } else if (action == d->dataSetMarkerHorizontalBarAction) {
0577         style = MarkerHorizontalBar;
0578     } else if (action == d->dataSetMarkerVerticalBarAction) {
0579         style = MarkerVerticalBar;
0580     }
0581 
0582     DataSet *dataSet = d->dataSets[d->selectedDataSet];
0583     Q_ASSERT(dataSet);
0584     if (!dataSet)
0585         return;
0586 
0587     if (type.isEmpty()) {
0588         d->ui.datasetMarkerMenu->setIcon(dataSet->markerIcon(style));
0589         d->ui.datasetMarkerMenu->setText("");
0590     } else {
0591         d->ui.datasetMarkerMenu->setText(type);
0592         d->ui.datasetMarkerMenu->setIcon(QIcon());
0593     }
0594     emit dataSetMarkerChanged(dataSet, symbolType, style);
0595 
0596     updateData(dataSet->chartType(), dataSet->chartSubType());
0597 }
0598 
0599 void DataSetConfigWidget::datasetBrushSelected(const QColor& color)
0600 {
0601     if (d->selectedDataSet < 0)
0602         return;
0603 
0604     emit datasetBrushChanged(d->dataSets[d->selectedDataSet], color, -1);
0605     updateMarkers();
0606 }
0607 
0608 void DataSetConfigWidget::datasetPenSelected(const QColor& color)
0609 {
0610     if (d->selectedDataSet < 0)
0611         return;
0612 
0613     emit datasetPenChanged(d->dataSets[d->selectedDataSet], color, -1);
0614     updateMarkers();
0615 }
0616 
0617 void DataSetConfigWidget::updateData(ChartType chartType, ChartSubtype subtype)
0618 {
0619     Q_UNUSED(subtype)
0620     if (!chart) {
0621         return;
0622     }
0623     if (!chartTypes.contains(chartType)) {
0624         return;
0625     }
0626     QList<DataSet*> newDataSets = chart->plotArea()->dataSets();
0627     debugChartUiDataSet<<d->selectedDataSet<<d->dataSets<<':'<<newDataSets;
0628 
0629     blockSignals(true);
0630     d->dataSetAxes.clear();
0631     d->ui.dataSets->clear();
0632 
0633     // Update the chart type specific settings in the "Data Sets" tab
0634     d->ui.errorBarProperties->hide();
0635     // TODO: error indication is not implemented
0636 //     if (chartType == BarChartType || chartType == LineChartType || chartType == AreaChartType || chartType == ScatterChartType) {
0637 //         d->ui.errorBarProperties->show();
0638 //     }
0639     // TODO 
0640 //     d->ui.datasetShowSymbol->hide();
0641 //     if (chartType == LineChartType || chartType == AreaChartType || chartType == ScatterChartType || chartType == RadarChartType || chartType == FilledRadarChartType) {
0642 //         d->ui.datasetShowSymbol->show();
0643 //     }
0644     
0645     // Make sure we only allow legal chart type combinations
0646     if (isPolar(chartType)) {
0647         // TODO: check out this claim:
0648         // Pie charts and ring charts have no axes but radar charts do.
0649         // Disable choosing of attached axis if there is none.
0650         bool hasAxes = !(chartType == CircleChartType || chartType == RingChartType);
0651 //         d->ui.axisConfiguration->setEnabled(hasAxes);
0652         d->ui.dataSetAxes->setCurrentIndex(-1);
0653         d->ui.dataSetAxes->setEnabled(false);
0654         d->ui.dataSetHasChartType->setEnabled(hasAxes);
0655         d->ui.dataSetChartTypeMenu->setEnabled(hasAxes);
0656     } else {
0657         // All the cartesian chart types have axes.
0658 //         d->ui.axisConfiguration->setEnabled(true);
0659         d->dataSetAxes.append(chart->plotArea()->yAxis());
0660         if (chart->plotArea()->secondaryYAxis() && chart->plotArea()->secondaryYAxis()->isVisible()) {
0661             d->dataSetAxes.append(chart->plotArea()->secondaryYAxis());
0662         }
0663         d->ui.dataSetAxes->setEnabled(true);
0664         d->ui.dataSetHasChartType->setEnabled(true);
0665         d->ui.dataSetChartTypeMenu->setEnabled(true);
0666     }
0667 
0668     // always update, in case titles have changed
0669     foreach (DataSet *dataSet, newDataSets) {
0670         QString title = dataSet->labelData().toString();
0671         if (title.isEmpty())
0672             title = i18n("Data Set %1", d->ui.dataSets->count() + 1);
0673         d->ui.dataSets->addItem(title);
0674     }
0675     if (newDataSets != d->dataSets) {
0676         d->selectedDataSet = 0; // new datasets, select the first
0677         d->dataSets = newDataSets;
0678         debugChartUiDataSet<<"new datasets"<<newDataSets;
0679     }
0680     d->ui.dataSets->setCurrentIndex(d->selectedDataSet);
0681 
0682     blockSignals(false);
0683 
0684     ui_dataSetSelectionChanged(d->selectedDataSet);
0685 }
0686 
0687 
0688 void DataSetConfigWidget::slotShowFormatErrorBarDialog()
0689 {
0690     d->formatErrorBarDialog.show();
0691 }
0692 
0693 void DataSetConfigWidget::setupDialogs()
0694 {
0695     // Format Error Bars
0696     connect(d->ui.formatErrorBar, SIGNAL(clicked()),
0697              this, SLOT(slotShowFormatErrorBarDialog()));
0698     connect(&d->formatErrorBarDialog, SIGNAL(accepted()),
0699              this, SLOT(ui_dataSetErrorBarTypeChanged()));
0700 }
0701 
0702 void DataSetConfigWidget::createActions()
0703 {
0704 }
0705 
0706 void DataSetConfigWidget::ui_dataSetSelectionChanged(int index)
0707 {
0708     // Check for valid index
0709     debugChartUiDataSet<<index<<d->dataSets;
0710     if (index < 0 || index >= d->dataSets.size()) {
0711         return;
0712     }
0713     blockSignals(true);
0714 
0715     DataSet *dataSet = d->dataSets[index];
0716     //d->ui.datasetColor->setText(axis->titleText());
0717     d->ui.dataSetAxes->setCurrentIndex(d->dataSetAxes.indexOf(dataSet->attachedAxis()));
0718 
0719     d->ui.datasetBrush->setColor(dataSet->brush().color());
0720 
0721     d->ui.datasetPen->setColor(dataSet->pen().color());
0722 
0723     debugChartUiDataSet<<dataSet->valueLabelType();
0724     d->ui.datasetShowCategory->setChecked(dataSet->valueLabelType().category);
0725 
0726     d->ui.dataSetShowNumber->setChecked(dataSet->valueLabelType().number);
0727 
0728     d->ui.datasetShowPercent->setChecked(dataSet->valueLabelType().percentage);
0729 
0730     // TODO
0731     // d->ui.datasetShowSymbol->setChecked(dataSet->valueLabelType().symbol);
0732 
0733     d->ui.dataSetHasChartType->setChecked(dataSet->chartType() != LastChartType);
0734     d->ui.dataSetChartTypeMenu->setEnabled(dataSet->chartType() != LastChartType);
0735 
0736     Q_ASSERT(d->ui.dataSetChartTypeMenu->menu());
0737 
0738     d->ui.dataSetChartTypeMenu->setIcon(ICON2(dataSet->chartType(), dataSet->chartSubType()));
0739 
0740     d->selectedDataSet = index;
0741 
0742     blockSignals(false);
0743 
0744     updateMarkers();
0745 
0746     ChartType chartType = dataSet->chartType();
0747     if (chartType == LastChartType) {
0748         chartType = chart->chartType();
0749     }
0750     bool disableMarkers = chartType == BarChartType || chartType == StockChartType || chartType == CircleChartType
0751                             || chartType == RingChartType || chartType == BubbleChartType;
0752     d->ui.datasetMarkerMenu->setDisabled(disableMarkers);
0753 }
0754 
0755 void DataSetConfigWidget::ui_datasetShowCategoryChanged(bool b)
0756 {
0757     if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) {
0758         return;
0759     }
0760     debugChartUiDataSet<<b;
0761     emit datasetShowCategoryChanged(d->dataSets[d->selectedDataSet], b, -1);
0762 }
0763 
0764 void DataSetConfigWidget::ui_datasetShowErrorBarChanged(bool b)
0765 {
0766     if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) {
0767         return;
0768     }
0769     debugChartUiDataSet<<b;
0770     d->ui.formatErrorBar->setEnabled(b);
0771 }
0772 
0773 void DataSetConfigWidget::ui_dataSetShowNumberChanged(bool b)
0774 {
0775     if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) {
0776         return;
0777     }
0778     debugChartUiDataSet<<b;
0779     emit dataSetShowNumberChanged(d->dataSets[d->selectedDataSet], b, -1);
0780 }
0781 
0782 void DataSetConfigWidget::ui_datasetShowPercentChanged(bool b)
0783 {
0784     if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) {
0785         return;
0786     }
0787     debugChartUiDataSet<<b;
0788     emit datasetShowPercentChanged(d->dataSets[d->selectedDataSet], b, -1);
0789 }
0790 
0791 void DataSetConfigWidget::ui_datasetShowSymbolChanged(bool b)
0792 {
0793     if (d->selectedDataSet < 0 || d->selectedDataSet >= d->dataSets.count()) {
0794         return;
0795     }
0796     debugChartUiDataSet<<b;
0797     emit datasetShowSymbolChanged(d->dataSets[d->selectedDataSet], b, -1);
0798 }