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.
507 lines
16 KiB
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 <tqsplitter.h>
|
|
#include <tqvbox.h>
|
|
#include <tqhbox.h>
|
|
#include <tqgrid.h>
|
|
#include <tdelistview.h>
|
|
#include <tdemessagebox.h>
|
|
#include <tdelocale.h>
|
|
#include <tqlayout.h>
|
|
#include <tqgroupbox.h>
|
|
#include <tqscrollview.h>
|
|
#include <ktextbrowser.h>
|
|
#include <tqlabel.h>
|
|
#include <kactivelabel.h>
|
|
#include <kiconloader.h>
|
|
#include <klineedit.h>
|
|
|
|
extern PrintOptions printops;
|
|
extern TQWidget *expressionWidget;
|
|
|
|
QalculateDataSetsDialog::QalculateDataSetsDialog(TQWidget *parent, const char *name) : KDialogBase(parent, name, false, i18n("Data Sets"), Close, Close, false) {
|
|
|
|
dataset_edit_dialog = NULL;
|
|
object_edit_dialog = NULL;
|
|
|
|
TQVBox *box = makeVBoxMainWidget();
|
|
TQSplitter *splitter = new TQSplitter(TQt::Vertical, box);
|
|
|
|
TQVBox *group1 = new TQVBox(splitter);
|
|
TQVBox *group2 = new TQVBox(splitter);
|
|
|
|
splitter = new TQSplitter(TQt::Horizontal, group1);
|
|
TQWidget *widget = new TQWidget(splitter);
|
|
widget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Expanding);
|
|
TQVBoxLayout *vbox = new TQVBoxLayout(widget, spacingHint(), spacingHint());
|
|
vbox->addWidget(new TQLabel(i18n("Data Sets:"), widget));
|
|
dataSetsView = new TDEListView(widget);
|
|
vbox->addWidget(dataSetsView);
|
|
dataSetsView->addColumn(i18n("Data Set"));
|
|
dataSetsView->setRootIsDecorated(false);
|
|
TQHBoxLayout *hbox = new TQHBoxLayout(vbox);
|
|
hbox->addItem(new TQSpacerItem(0, 0, TQSizePolicy::Expanding, TQSizePolicy::Minimum));
|
|
newDataSetButton = new TQPushButton(i18n("New"), widget);
|
|
hbox->addWidget(newDataSetButton);
|
|
editDataSetButton = new TQPushButton(i18n("Edit"), widget);
|
|
hbox->addWidget(editDataSetButton);
|
|
deleteDataSetButton = new TQPushButton(i18n("Delete"), widget);
|
|
hbox->addWidget(deleteDataSetButton);
|
|
TQVBox *vbox2 = new TQVBox(splitter);
|
|
vbox2->setMargin(spacingHint());
|
|
vbox2->setSpacing(spacingHint());
|
|
new TQLabel(i18n("Description:"), vbox2);
|
|
descriptionBrowser = new KTextBrowser(vbox2);
|
|
|
|
splitter = new TQSplitter(TQt::Horizontal, group2);
|
|
widget = new TQWidget(splitter);
|
|
widget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Expanding);
|
|
vbox = new TQVBoxLayout(widget, spacingHint(), spacingHint());
|
|
vbox->addWidget(new TQLabel(i18n("Objects:"), widget));
|
|
objectsView = new TDEListView(widget);
|
|
vbox->addWidget(objectsView);
|
|
objectsView->addColumn(i18n("Object"));
|
|
objectsView->setRootIsDecorated(false);
|
|
hbox = new TQHBoxLayout(vbox);
|
|
hbox->addItem(new TQSpacerItem(0, 0, TQSizePolicy::Expanding, TQSizePolicy::Minimum));
|
|
newObjectButton = new TQPushButton(i18n("New"), widget);
|
|
hbox->addWidget(newObjectButton);
|
|
editObjectButton = new TQPushButton(i18n("Edit"), widget);
|
|
hbox->addWidget(editObjectButton);
|
|
deleteObjectButton = new TQPushButton(i18n("Delete"), widget);
|
|
hbox->addWidget(deleteObjectButton);
|
|
vbox2 = new TQVBox(splitter);
|
|
vbox2->setMargin(spacingHint());
|
|
vbox2->setSpacing(spacingHint());
|
|
new TQLabel(i18n("Attributes:"), vbox2);
|
|
attributesView = new TQScrollView(vbox2);
|
|
attributesView->setResizePolicy(TQScrollView::AutoOneFit);
|
|
attributesView->setFrameStyle(TQFrame::NoFrame);
|
|
attributesGrid = new TQGrid(3, TQt::Horizontal, attributesView->viewport());
|
|
attributesGrid->setSpacing(spacingHint());
|
|
attributesView->addChild(attributesGrid);
|
|
|
|
resize(TQSize(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(TQListViewItem*)), this, SLOT(dataSetDoubleClicked(TQListViewItem*)));
|
|
|
|
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(TQListViewItem*)), this, SLOT(objectDoubleClicked(TQListViewItem*)));
|
|
|
|
}
|
|
|
|
QalculateDataSetsDialog::~QalculateDataSetsDialog() {}
|
|
|
|
void QalculateDataSetsDialog::updateDataSetTree() {
|
|
|
|
dataSetItems.clear();
|
|
objectItems.clear();
|
|
dataSetsView->clear();
|
|
DataSet *ds;
|
|
TQListViewItem *i;
|
|
bool b = false;
|
|
dataSetsView->blockSignals(true);
|
|
for(size_t index = 1; ; index++) {
|
|
ds = CALCULATOR->getDataSet(index);
|
|
if(!ds) break;
|
|
i = new TDEListViewItem(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 TQListViewItem *i3 = dataSetsView->selectedItem(); if(!i3) return; selected_dataset = dataSetItems[i3]; if(!selected_dataset) return;
|
|
#define UPDATE_SELECTED_OBJECT TQListViewItem *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(TQListViewItem*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() {
|
|
TQListViewItem *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;
|
|
TQListViewItem *i;
|
|
while(o) {
|
|
i = new TDEListViewItem(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) {
|
|
TQListViewItemIterator qit(objectsView);
|
|
if(qit.current()) {
|
|
objectsView->setSelected(qit.current(), true);
|
|
}
|
|
}
|
|
objectsView->sort();
|
|
|
|
editDataSetButton->setEnabled(true);
|
|
deleteDataSetButton->setEnabled(ds->isLocal());
|
|
newObjectButton->setEnabled(true);
|
|
|
|
TQString str, str2;
|
|
|
|
if(!ds->description().empty()) {
|
|
str2 = ds->description().c_str();
|
|
str2.replace("<", "<");
|
|
str2.replace(">", ">");
|
|
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("<", "<");
|
|
str2.replace(">", ">");
|
|
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("<", "<");
|
|
str2.replace(">", ">");
|
|
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 += TQString::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("<", "<");
|
|
str2.replace(">", ">");
|
|
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) {
|
|
TQString 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() {
|
|
|
|
TQListViewItem *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);
|
|
TQString sval;
|
|
TQString str;
|
|
delete attributesGrid;
|
|
attributesGrid = new TQGrid(3, TQt::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 TQLabel(str, attributesGrid);
|
|
KLineEdit *le = new KLineEdit(sval, attributesGrid);
|
|
le->setReadOnly(true);
|
|
le->setFrameStyle(TQFrame::NoFrame | TQFrame::Plain);
|
|
QalculateButtonWithData *button = new QalculateButtonWithData((void*) dp, TQIconSet(SmallIcon("edit-paste")), "", attributesGrid);
|
|
TQObject::connect(button, SIGNAL(clickedWithData(void*)), SLOT(insertObjectData(void*)));
|
|
}
|
|
}
|
|
dp = ds->getNextProperty(&it);
|
|
}
|
|
TQWidget *widget = new TQWidget(attributesGrid);
|
|
widget->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Expanding);
|
|
attributesGrid->show();
|
|
} else {
|
|
delete attributesGrid;
|
|
attributesGrid = new TQGrid(3, TQt::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(TQListViewItem*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"
|