You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
qalculate-tde/src/qalculatedatasetsdialog.cpp

507 lines
16 KiB

/***************************************************************************
* Copyright (C) 2005 by Niklas Knutsson *
* nq@altern.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "qalculatedatasetsdialog.h"
#include "qalculateeditdatasetdialog.h"
#include "qalculateeditdataobjectdialog.h"
#include "qalculate_tde_utils.h"
#include "qalculatebuttonwithdata.h"
#include <kpushbutton.h>
#include <qsplitter.h>
#include <qvbox.h>
#include <qhbox.h>
#include <qgrid.h>
#include <klistview.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <qlayout.h>
#include <qgroupbox.h>
#include <qscrollview.h>
#include <ktextbrowser.h>
#include <qlabel.h>
#include <kactivelabel.h>
#include <kiconloader.h>
#include <klineedit.h>
extern PrintOptions printops;
extern QWidget *expressionWidget;
QalculateDataSetsDialog::QalculateDataSetsDialog(QWidget *parent, const char *name) : KDialogBase(parent, name, false, i18n("Data Sets"), Close, Close, false) {
dataset_edit_dialog = NULL;
object_edit_dialog = NULL;
QVBox *box = makeVBoxMainWidget();
QSplitter *splitter = new QSplitter(Qt::Vertical, box);
QVBox *group1 = new QVBox(splitter);
QVBox *group2 = new QVBox(splitter);
splitter = new QSplitter(Qt::Horizontal, group1);
QWidget *widget = new QWidget(splitter);
widget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
QVBoxLayout *vbox = new QVBoxLayout(widget, spacingHint(), spacingHint());
vbox->addWidget(new QLabel(i18n("Data Sets:"), widget));
dataSetsView = new KListView(widget);
vbox->addWidget(dataSetsView);
dataSetsView->addColumn(i18n("Data Set"));
dataSetsView->setRootIsDecorated(false);
QHBoxLayout *hbox = new QHBoxLayout(vbox);
hbox->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
newDataSetButton = new QPushButton(i18n("New"), widget);
hbox->addWidget(newDataSetButton);
editDataSetButton = new QPushButton(i18n("Edit"), widget);
hbox->addWidget(editDataSetButton);
deleteDataSetButton = new QPushButton(i18n("Delete"), widget);
hbox->addWidget(deleteDataSetButton);
QVBox *vbox2 = new QVBox(splitter);
vbox2->setMargin(spacingHint());
vbox2->setSpacing(spacingHint());
new QLabel(i18n("Description:"), vbox2);
descriptionBrowser = new KTextBrowser(vbox2);
splitter = new QSplitter(Qt::Horizontal, group2);
widget = new QWidget(splitter);
widget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
vbox = new QVBoxLayout(widget, spacingHint(), spacingHint());
vbox->addWidget(new QLabel(i18n("Objects:"), widget));
objectsView = new KListView(widget);
vbox->addWidget(objectsView);
objectsView->addColumn(i18n("Object"));
objectsView->setRootIsDecorated(false);
hbox = new QHBoxLayout(vbox);
hbox->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
newObjectButton = new QPushButton(i18n("New"), widget);
hbox->addWidget(newObjectButton);
editObjectButton = new QPushButton(i18n("Edit"), widget);
hbox->addWidget(editObjectButton);
deleteObjectButton = new QPushButton(i18n("Delete"), widget);
hbox->addWidget(deleteObjectButton);
vbox2 = new QVBox(splitter);
vbox2->setMargin(spacingHint());
vbox2->setSpacing(spacingHint());
new QLabel(i18n("Attributes:"), vbox2);
attributesView = new QScrollView(vbox2);
attributesView->setResizePolicy(QScrollView::AutoOneFit);
attributesView->setFrameStyle(QFrame::NoFrame);
attributesGrid = new QGrid(3, Qt::Horizontal, attributesView->viewport());
attributesGrid->setSpacing(spacingHint());
attributesView->addChild(attributesGrid);
resize(QSize(675, 525).expandedTo(size()));
connect(newDataSetButton, SIGNAL(clicked()), this, SLOT(newDataSet()));
connect(editDataSetButton, SIGNAL(clicked()), this, SLOT(editDataSet()));
connect(deleteDataSetButton, SIGNAL(clicked()), this, SLOT(deleteDataSet()));
connect(dataSetsView, SIGNAL(selectionChanged()), this, SLOT(dataSetSelected()));
connect(dataSetsView, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(dataSetDoubleClicked(QListViewItem*)));
connect(newObjectButton, SIGNAL(clicked()), this, SLOT(newObject()));
connect(editObjectButton, SIGNAL(clicked()), this, SLOT(editObject()));
connect(deleteObjectButton, SIGNAL(clicked()), this, SLOT(deleteObject()));
connect(objectsView, SIGNAL(selectionChanged()), this, SLOT(objectSelected()));
connect(objectsView, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(objectDoubleClicked(QListViewItem*)));
}
QalculateDataSetsDialog::~QalculateDataSetsDialog() {}
void QalculateDataSetsDialog::updateDataSetTree() {
dataSetItems.clear();
objectItems.clear();
dataSetsView->clear();
DataSet *ds;
QListViewItem *i;
bool b = false;
dataSetsView->blockSignals(true);
for(size_t index = 1; ; index++) {
ds = CALCULATOR->getDataSet(index);
if(!ds) break;
i = new KListViewItem(dataSetsView, ds->title().c_str());
dataSetItems[i] = ds;
if(ds == selected_dataset) {
dataSetsView->blockSignals(false);
dataSetsView->setSelected(i, true);
dataSetsView->blockSignals(true);
b = true;
}
}
dataSetsView->blockSignals(false);
if(!b) {
dataSetsView->selectAll(false);
selected_dataset = NULL;
}
}
#define UPDATE_SELECTED_DATASET QListViewItem *i3 = dataSetsView->selectedItem(); if(!i3) return; selected_dataset = dataSetItems[i3]; if(!selected_dataset) return;
#define UPDATE_SELECTED_OBJECT QListViewItem *i2 = objectsView->selectedItem(); if(!i2) return; selected_object = objectItems[i2]; if(!selected_object) return;
#define CHECK_IF_DATASET_STILL_THERE if(!CALCULATOR->stillHasFunction(selected_dataset)) {KMessageBox::error(this, i18n("Data set does not exist anymore.")); emit dataSetsChanged(); return;}
void QalculateDataSetsDialog::deleteDataSet() {
UPDATE_SELECTED_DATASET
CHECK_IF_DATASET_STILL_THERE
if(selected_dataset->isLocal()) {
selected_object = NULL;
//ensure that all references are removed in Calculator
selected_dataset->destroy();
//update menus and trees
emit dataSetsChanged();
}
}
void QalculateDataSetsDialog::editDataSet() {
UPDATE_SELECTED_DATASET
CHECK_IF_DATASET_STILL_THERE
if(!dataset_edit_dialog) {
dataset_edit_dialog = new QalculateEditDataSetDialog(this);
}
DataSet *ds = dataset_edit_dialog->editDataSet(selected_dataset);
if(ds) {
selected_dataset = ds;
emit dataSetsChanged();
}
}
void QalculateDataSetsDialog::newDataSet() {
if(!dataset_edit_dialog) {
dataset_edit_dialog = new QalculateEditDataSetDialog(this);
}
DataSet *ds = dataset_edit_dialog->editDataSet();
if(ds) {
selected_dataset = ds;
emit dataSetsChanged();
}
}
void QalculateDataSetsDialog::dataSetDoubleClicked(QListViewItem*i) {
selected_dataset = dataSetItems[i];
if(!selected_dataset)
return;
CHECK_IF_DATASET_STILL_THERE
if(!dataset_edit_dialog) {
dataset_edit_dialog = new QalculateEditDataSetDialog(this);
}
DataSet *ds = dataset_edit_dialog->editDataSet(selected_dataset);
if(ds) {
selected_dataset = ds;
emit dataSetsChanged();
}
}
void QalculateDataSetsDialog::dataSetSelected() {
QListViewItem *selected = dataSetsView->selectedItem();
objectsView->clear();
if(selected) {
DataSet *ds = dataSetItems[selected];
if(!CALCULATOR->stillHasFunction(ds)) {
KMessageBox::error(this, i18n("Data set does not exist anymore."));
selected_dataset = NULL;
emit dataSetsChanged();
return;
}
//remember selection
selected_dataset = ds;
while(objectsView->columns() > 0) {
objectsView->removeColumn(0);
}
DataObjectIter it;
DataPropertyIter pit;
DataProperty *dp;
DataObject *o = ds->getFirstObject(&it);
bool b = false, b2 = false;
QListViewItem *i;
while(o) {
i = new KListViewItem(objectsView);
objectItems[i] = o;
dp = ds->getFirstProperty(&pit);
int index = 0;
while(dp) {
if(!dp->isHidden() && dp->isKey()) {
if(!b2) {
objectsView->addColumn(dp->title().c_str());
}
i->setText(index, o->getPropertyDisplayString(dp).c_str());
index++;
if(index > 2) break;
}
dp = ds->getNextProperty(&pit);
}
b2 = true;
if(o == selected_object) {
objectsView->setSelected(i, true);
b = true;
}
o = ds->getNextObject(&it);
}
if(!b) {
QListViewItemIterator qit(objectsView);
if(qit.current()) {
objectsView->setSelected(qit.current(), true);
}
}
objectsView->sort();
editDataSetButton->setEnabled(true);
deleteDataSetButton->setEnabled(ds->isLocal());
newObjectButton->setEnabled(true);
QString str, str2;
if(!ds->description().empty()) {
str2 = ds->description().c_str();
str2.replace("<", "&lt;");
str2.replace(">", "&gt;");
str += str2;
str += "<br><br>";
}
str += "<b>";
str += i18n("Properties");
str += "</b><br>";
dp = ds->getFirstProperty(&pit);
while(dp) {
if(!dp->isHidden()) {
if(!dp->title(false).empty()) {
str2 = dp->title().c_str();
str2.replace("<", "&lt;");
str2.replace(">", "&gt;");
str += str2;
str += ": ";
}
for(size_t i = 1; i <= dp->countNames(); i++) {
if(i > 1) str += ", ";
str += dp->getName(i).c_str();
}
if(dp->isKey()) {
str += " (";
//indicating that the property is a data set key
str += i18n("key");
str += ")";
}
str += "<br>";
if(!dp->description().empty()) {
str += "<i>";
str2 = dp->description().c_str();
str2.replace("<", "&lt;");
str2.replace(">", "&gt;");
str += str2;
str += "</i><br>";
}
}
dp = ds->getNextProperty(&pit);
}
str += "<br><b>";
str += i18n("Data Retrieval Function");
str += "</b><br>";
Argument *arg;
Argument default_arg;
const ExpressionName *ename = &ds->preferredName(false, printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) descriptionBrowser);
str += "<i><b>";
str += ename->name.c_str();
str += "</b>";
int iargs = ds->maxargs();
if(iargs < 0) {
iargs = ds->minargs() + 1;
}
str += "(";
if(iargs != 0) {
for(int i2 = 1; i2 <= iargs; i2++) {
if(i2 > ds->minargs()) {
str += "[";
}
if(i2 > 1) {
str += CALCULATOR->getComma().c_str();
str += " ";
}
arg = ds->getArgumentDefinition(i2);
if(arg && !arg->name().empty()) {
str += arg->name().c_str();
} else {
str += i18n("argument");
str += " ";
str += QString::number(i2);
}
if(i2 > ds->minargs()) {
str += "]";
}
}
if(ds->maxargs() < 0) {
str += CALCULATOR->getComma().c_str();
str += " ...";
}
}
str += ")";
for(size_t i2 = 1; i2 <= ds->countNames(); i2++) {
if(&ds->getName(i2) != ename) {
str += "<br>";
str += ds->getName(i2).name.c_str();
}
}
str += "</i>";
str += "<br>";
if(!ds->copyright().empty()) {
str += "<br>";
str2 = ds->copyright().c_str();
str2.replace("<", "&lt;");
str2.replace(">", "&gt;");
str += str2;
str += "<br>";
}
str.replace("\n", "<br>");
descriptionBrowser->setText(str);
} else {
editDataSetButton->setEnabled(false);
deleteDataSetButton->setEnabled(false);
newObjectButton->setEnabled(false);
selected_dataset = NULL;
descriptionBrowser->clear();
}
objectSelected();
}
void QalculateDataSetsDialog::insertObjectData(void *data) {
DataProperty *dp = (DataProperty*) data;
DataSet *ds = dp->parentSet();
if(ds && selected_object) {
QString str = ds->preferredInputName(printops.abbreviate_names, printops.use_unicode_signs, false, false, &can_display_unicode_string_function, (void*) expressionWidget).name.c_str();
str += "(";
str += selected_object->getProperty(ds->getPrimaryKeyProperty()).c_str();
str += CALCULATOR->getComma().c_str();
str += " ";
str += dp->getName().c_str();
str += ")";
insert_text_in_expression(str);
}
}
void QalculateDataSetsDialog::objectSelected() {
QListViewItem *selected = objectsView->selectedItem();
DataObject *o = NULL;
if(selected) o = objectItems[selected];
if(o) {
selected_object = o;
editObjectButton->setEnabled(true);
deleteObjectButton->setEnabled(true);
DataSet *ds = o->parentSet();
if(!ds) return;
DataPropertyIter it;
DataProperty *dp = ds->getFirstProperty(&it);
QString sval;
QString str;
delete attributesGrid;
attributesGrid = new QGrid(3, Qt::Horizontal, attributesView->viewport());
attributesGrid->setSpacing(spacingHint());
attributesView->addChild(attributesGrid);
while(dp) {
if(!dp->isHidden()) {
sval = o->getPropertyDisplayString(dp).c_str();
if(!sval.isEmpty()) {
str = "<b>"; str += dp->title().c_str(); str += ":"; str += "</b>";
new QLabel(str, attributesGrid);
KLineEdit *le = new KLineEdit(sval, attributesGrid);
le->setReadOnly(true);
le->setFrameStyle(QFrame::NoFrame | QFrame::Plain);
QalculateButtonWithData *button = new QalculateButtonWithData((void*) dp, QIconSet(SmallIcon("editpaste")), "", attributesGrid);
QObject::connect(button, SIGNAL(clickedWithData(void*)), SLOT(insertObjectData(void*)));
}
}
dp = ds->getNextProperty(&it);
}
QWidget *widget = new QWidget(attributesGrid);
widget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
attributesGrid->show();
} else {
delete attributesGrid;
attributesGrid = new QGrid(3, Qt::Horizontal, attributesView->viewport());
attributesGrid->setSpacing(spacingHint());
attributesView->addChild(attributesGrid);
attributesGrid->show();
selected_object = NULL;
editObjectButton->setEnabled(false);
deleteObjectButton->setEnabled(false);
}
}
void QalculateDataSetsDialog::deleteObject() {
UPDATE_SELECTED_DATASET
UPDATE_SELECTED_OBJECT
selected_dataset->delObject(selected_object);
selected_object = NULL;
updateObjects();
}
void QalculateDataSetsDialog::updateObjects() {
dataSetSelected();
}
void QalculateDataSetsDialog::editObject() {
UPDATE_SELECTED_DATASET
UPDATE_SELECTED_OBJECT
if(!object_edit_dialog) {
object_edit_dialog = new QalculateEditDataObjectDialog(this);
}
DataObject *o = object_edit_dialog->editDataObject(selected_dataset, selected_object);
if(o) {
selected_object = o;
updateObjects();
}
}
void QalculateDataSetsDialog::newObject() {
UPDATE_SELECTED_DATASET
if(!object_edit_dialog) {
object_edit_dialog = new QalculateEditDataObjectDialog(this);
}
DataObject *o = object_edit_dialog->editDataObject(selected_dataset);
if(o) {
selected_object = o;
updateObjects();
}
}
void QalculateDataSetsDialog::objectDoubleClicked(QListViewItem*i) {
UPDATE_SELECTED_DATASET
selected_object = objectItems[i];
if(!selected_object)
return;
if(!object_edit_dialog) {
object_edit_dialog = new QalculateEditDataObjectDialog(this);
}
DataObject *o = object_edit_dialog->editDataObject(selected_dataset, selected_object);
if(o) {
selected_object = o;
updateObjects();
}
}
#include "qalculatedatasetsdialog.moc"