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.