27 #include "../../../color/RGBAColor.h"
28 #include "../../../common/STLUtils.h"
29 #include "../../../dataaccess/utils/Utils.h"
30 #include "../../../dataaccess/query/OrderByItem.h"
31 #include "../../../maptools/Chart.h"
32 #include "../../../maptools/Enums.h"
33 #include "../../../maptools/QueryLayer.h"
34 #include "../utils/ColorPickerToolButton.h"
37 #include "ui_ChartLayerWidgetForm.h"
42 #include <QMessageBox>
43 #include <QPainterPath>
49 #include <boost/lexical_cast.hpp>
54 m_ui(new Ui::ChartLayerWidgetForm)
59 QGridLayout* layout =
new QGridLayout(
m_ui->m_contourColorWidget);
60 layout->setContentsMargins(0, 0, 0, 0);
70 connect(
m_ui->m_contourWidthSpinBox, SIGNAL(valueChanged(
int)),
this, SLOT(
updateUi()));
71 connect(
m_ui->m_tableWidget, SIGNAL(cellClicked(
int,
int)),
this, SLOT(
onItemClicked(
int,
int)));
88 m_ui->m_summaryComboBox->clear();
92 m_ui->m_summaryComboBox->addItem(
"MIN");
93 m_ui->m_summaryComboBox->addItem(
"MAX");
94 m_ui->m_summaryComboBox->addItem(
"SUM");
95 m_ui->m_summaryComboBox->addItem(
"AVERAGE");
96 m_ui->m_summaryComboBox->addItem(
"MEDIAN");
97 m_ui->m_summaryComboBox->addItem(
"STDDEV");
98 m_ui->m_summaryComboBox->addItem(
"VARIANCE");
100 if(m_layer->getChart())
102 int index = m_ui->m_summaryComboBox->findText(QString::fromStdString(m_layer->getChart()->getSummary()));
103 m_ui->m_summaryComboBox->setCurrentIndex(index);
106 m_ui->m_summaryComboBox->setEnabled(
true);
107 m_ui->m_summaryComboBox->show();
108 m_ui->m_summaryLabel->show();
112 m_ui->m_summaryComboBox->addItem(
"NONE");
113 m_ui->m_summaryComboBox->setEnabled(
false);
114 m_ui->m_summaryComboBox->hide();
115 m_ui->m_summaryLabel->hide();
121 if(m_chartVec.empty())
123 QMessageBox::warning(
this, tr(
"Warning"), tr(
"No attribute selected."));
128 int index = m_ui->m_typeComboBox->currentIndex();
129 int chartType = m_ui->m_typeComboBox->itemData(index).toInt();
132 std::vector<std::string> attrs;
133 std::vector<te::color::RGBAColor> colors;
135 for(std::size_t t = 0; t < m_chartVec.size(); ++t)
137 attrs.push_back(m_chartVec[t].first);
143 chart->
setHeight((std::size_t)m_ui->m_sizeSpinBox->value());
144 chart->
setContourWidth((std::size_t)m_ui->m_contourWidthSpinBox->value());
147 chart->
setSummary(m_ui->m_summaryComboBox->currentText().toStdString());
152 double maxValue = getMaxValue(chart);
156 m_layer->setChart(chart);
165 int type = (int)chart->
getType();
167 for(
int i = 0; i < m_ui->m_typeComboBox->count(); ++i)
169 int t = m_ui->m_typeComboBox->itemData(i).toInt();
173 m_ui->m_typeComboBox->setCurrentIndex(i);
178 m_ui->m_sizeSpinBox->setValue((
int)chart->
getHeight());
183 for(std::size_t t = 0; t < chart->
getProperties().size(); ++t)
187 std::pair<std::string, QColor> pair(value, c);
188 m_chartVec.push_back(pair);
197 m_ui->m_typeComboBox->clear();
198 m_ui->m_typeComboBox->addItem(tr(
"Pie Chart"), QVariant(
te::map::Pie));
199 m_ui->m_typeComboBox->addItem(tr(
"Bar Chart"), QVariant(
te::map::Bar));
203 m_ui->m_addToolButton->setIcon(QIcon::fromTheme(
"list-add"));
204 m_ui->m_removeToolButton->setIcon(QIcon::fromTheme(
"list-remove"));
209 m_ui->m_tableWidget->setRowCount(0);
211 for(std::size_t t = 0; t < m_chartVec.size(); ++t)
213 int newrow = m_ui->m_tableWidget->rowCount();
214 m_ui->m_tableWidget->insertRow(newrow);
218 QTableWidgetItem* item =
new QTableWidgetItem(icon,
"");
219 item->setFlags(Qt::ItemIsEnabled);
220 m_ui->m_tableWidget->setItem(newrow, 0, item);
223 QTableWidgetItem* itemAttr =
new QTableWidgetItem(m_chartVec[t].first.c_str());
224 itemAttr->setFlags(Qt::ItemIsEnabled);
225 m_ui->m_tableWidget->setItem(newrow, 1, itemAttr);
231 std::string value = m_ui->m_attrComboBox->currentText().toStdString();
235 for(std::size_t t = 0; t < m_chartVec.size(); ++t)
237 if(m_chartVec[t].first == value)
246 QMessageBox::warning(
this, tr(
"Warning"), tr(
"Attribute already selected."));
250 QColor c(rand() % 255,rand() % 255,rand() % 255);
252 std::pair<std::string, QColor> pair(value, c);
254 m_chartVec.push_back(pair);
261 if(m_ui->m_tableWidget->currentRow() == -1)
264 m_chartVec.erase(m_chartVec.begin() + m_ui->m_tableWidget->currentRow());
274 QColor curColor = m_chartVec[row].second;
276 QColor c = QColorDialog::getColor(curColor,
this);
283 m_chartVec[row].second = curColor;
290 m_ui->m_attrComboBox->clear();
292 std::auto_ptr<te::map::LayerSchema> dsType(m_layer->getSchema());
294 for(
size_t t = 0; t < dsType->getProperties().size(); ++t)
308 m_ui->m_attrComboBox->addItem(p->
getName().c_str(), p->
getType());
318 double maxValue = std::numeric_limits<double>::min();
321 const std::vector<std::string>& properties = chart->
getProperties();
322 bool hasChartNullValue =
false;
324 std::auto_ptr<te::da::DataSetType> schema = m_layer->getSchema();
328 std::auto_ptr<te::da::DataSet> dataset(m_layer->getData());
329 std::vector<size_t> chartPropPos;
330 size_t csize = properties.size();
331 for(std::size_t i = 0; i < csize; ++i)
335 while(dataset->moveNext())
337 for(std::size_t i = 0; i < csize; ++i)
341 hasChartNullValue =
true;
346 if(hasChartNullValue ==
false)
348 for(std::size_t i = 0; i < csize; ++i)
351 maxValue = std::max(maxValue, value);
360 std::vector<std::string> boid;
362 while(++pksize < props.size())
364 boid.push_back(props[pksize-1]->getName());
365 if(props[pksize-1]->getDatasetName() != props[pksize]->getDatasetName())
375 for(
size_t i = 0; i < pksize; ++i)
380 std::auto_ptr<te::da::DataSet> dataset(qlayer->
getData());
383 std::vector<std::string> pkdata(pksize), pkdataaux(pksize);
385 std::map<std::string, std::vector<double> > chartValues;
386 std::map<std::string, double> chartValue;
387 std::vector<size_t> chartPropPos;
388 bool hasChartNullValueAux =
false;
389 size_t csize = properties.size();
390 for(std::size_t i = 0; i < csize; ++i)
392 std::vector<double> v;
393 chartValues[properties[i]] = v;
398 dataset->moveFirst();
403 for(i = 0; i < pksize; ++i)
404 pkdata[i] = dataset->getAsString(boid[i]);
406 for(i = 0; i < pksize; ++i)
408 if(dataset->isAtBegin())
409 pkdataaux[i] = dataset->getAsString(boid[i]);
412 if(pkdata[i] != pkdataaux[i])
421 if(hasChartNullValue ==
false)
424 for(std::size_t i = 0; i < csize; ++i)
431 hasChartNullValue =
true;
442 if(hasChartNullValue ==
false)
444 for(std::size_t i = 0; i < csize; ++i)
449 for(std::size_t i = 0; i < csize; ++i)
450 chartValues[properties[i]].clear();
452 hasChartNullValueAux =
false;
453 for(std::size_t i = 0; i < csize; ++i)
455 if(dataset->isNull(properties[i]))
457 hasChartNullValueAux =
true;
461 if(hasChartNullValueAux ==
false)
463 for(std::size_t i = 0; i < csize; ++i)
464 chartValues[properties[i]].push_back(boost::lexical_cast<double>(dataset->getAsString(properties[i])));
468 if(hasChartNullValue ==
false)
471 std::map<std::string, double>::iterator it = chartValue.begin();
472 while(it != chartValue.end())
474 maxValue = std::max(maxValue, it->second);
479 hasChartNullValue = hasChartNullValueAux;
480 hasChartNullValueAux =
false;
481 }
while(dataset->moveNext());
483 if(hasChartNullValue ==
false)
485 for(std::size_t i = 0; i < csize; ++i)
489 std::map<std::string, double>::iterator it = chartValue.begin();
490 while(it != chartValue.end())
492 maxValue = std::max(maxValue, it->second);
ChartType
The chart types.
ChartType getType() const
const std::vector< std::string > & getProperties() const
void setContourColor(const te::color::RGBAColor &color)
std::string getSummary() const
It gets the grouping summary. It is used only in case 1 to n.
TEDATAACCESSEXPORT bool HasLinkedTable(te::da::DataSetType *type)
It checks if the datasettype has a linked table.
TEDATAACCESSEXPORT std::size_t GetPropertyPos(const DataSet *dataset, const std::string &name)
boost::ptr_vector< OrderByItem > OrderBy
A class that can be used to model an ORDER BY clause.
A layer resulting from a query.
void setHeight(std::size_t height)
TEDATAACCESSEXPORT double GetValueAsDouble(const te::da::DataSet *ds, const size_t pos)
It gets the value as double.
It models a property definition.
const std::vector< te::dt::Property * > & getProperties() const
It returns the properties that take part of the primary key.
void setSummary(const std::string &summary)
It gets the grouping summary. It is used only in case 1 to n.
void setAvoidConflicts(bool on)
const te::color::RGBAColor & getColor(std::size_t i) const
This class represents the informations needed to build map charts.
std::size_t getHeight() const
TEDATAACCESSEXPORT double GetSummarizedValue(std::vector< double > &values, const std::string &summary)
It gets the summarized value.
te::da::Select * getQuery() const
Query * clone() const
It creates a new copy of this query.
void setOrderBy(OrderBy *o)
It sets the list of expressions used to sort the output result.
A Select models a query to be used when retrieving data from a DataSource.
void setPropertiesPos(const std::vector< size_t > &propPos)
int getType() const
It returns the property data type.
std::size_t getContourWidth() const
const te::color::RGBAColor & getContourColor() const
const std::vector< size_t > & getPropertiesPos() const
void setQuery(te::da::Select *s)
It describes a primary key (pk) constraint.
A helper class for 32-bit RGBA (Red-Green-Blue-Alpha channel) color.
bool getAvoidConflicts() const
std::auto_ptr< te::da::DataSet > getData(te::common::TraverseType travType=te::common::FORWARDONLY, const te::common::AccessPolicy accessPolicy=te::common::RAccess) const
It gets the dataset identified by the layer name.
void setMaxValue(double value)
A class that can be used in an ORDER BY clause to sort the items of a resulting query.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void setContourWidth(std::size_t width)
const std::string & getName() const
It returns the property name.