summaryrefslogtreecommitdiffstats
path: root/kdict/sets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdict/sets.cpp')
-rw-r--r--kdict/sets.cpp326
1 files changed, 326 insertions, 0 deletions
diff --git a/kdict/sets.cpp b/kdict/sets.cpp
new file mode 100644
index 00000000..0a252cec
--- /dev/null
+++ b/kdict/sets.cpp
@@ -0,0 +1,326 @@
+/* -------------------------------------------------------------
+
+ sets.cpp (part of The KDE Dictionary Client)
+
+ Copyright (C) 2000-2001 Christian Gebauer <gebauer@kde.org>
+
+ This file is distributed under the Artistic License.
+ See LICENSE for details.
+
+ -------------------------------------------------------------
+
+ DbSetsDialog dialog for editing the user defined database sets
+
+ ------------------------------------------------------------- */
+
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+
+#include <kiconloader.h>
+#include <kseparator.h>
+#include <klocale.h>
+
+#include "options.h"
+#include "sets.h"
+
+
+//********* DbSetsDialog ******************************************
+
+
+DbSetsDialog::DbSetsDialog(QWidget *parent, const char *name)
+ : KDialogBase(Plain, i18n("Database Sets"),Close | Help, Close, parent, name, false, true)
+{
+ QFrame* page=plainPage();
+
+ QStringList sets;
+ for(unsigned int i=1;i<global->databaseSets.count()+1;i++)
+ sets.append(global->databases[i]);
+
+ QVBoxLayout * topLayout = new QVBoxLayout(page, 0, 0);
+
+ QHBoxLayout * subLayout1 = new QHBoxLayout(5);
+ topLayout->addLayout(subLayout1,0);
+
+ w_set = new QComboBox(true,page);
+ w_set->setFixedHeight(w_set->sizeHint().height());
+ w_set->setInsertionPolicy (QComboBox::NoInsertion);
+ w_set->insertStringList(sets);
+ connect(w_set, SIGNAL(activated(int)),this, SLOT(activateSet(int)));
+ QLabel *l = new QLabel(w_set, i18n("&Set:"),page);
+ l->setMinimumSize(l->sizeHint());
+ subLayout1->addWidget(l,0);
+ subLayout1->addWidget(w_set,1);
+
+ subLayout1->addSpacing(8);
+
+ w_save = new QPushButton(i18n("S&ave"),page);
+ connect(w_save,SIGNAL(clicked()),this, SLOT(transferSet()));
+ subLayout1->addWidget(w_save,0);
+
+ QPushButton *btn = new QPushButton(i18n("&New"),page);
+ btn->setMinimumSize(btn->sizeHint());
+ connect(btn, SIGNAL(clicked()),this, SLOT(newPressed()));
+ subLayout1->addWidget(btn,0);
+
+ w_delete = new QPushButton(i18n("&Delete"),page);
+ w_delete->setMinimumSize(w_delete->sizeHint());
+ connect(w_delete, SIGNAL(clicked()),this, SLOT(deletePressed()));
+ subLayout1->addWidget(w_delete,0);
+
+ topLayout->addSpacing(8);
+
+ KSeparator *sep = new KSeparator(page);
+ topLayout->addWidget(sep,0);
+
+ topLayout->addSpacing(8);
+
+ QGridLayout * subLayout2 = new QGridLayout(7,3,6);
+ topLayout->addLayout(subLayout2,1);
+
+ w_leftBox = new QListBox(page);
+ connect(w_leftBox, SIGNAL(selected(int)),this, SLOT(leftSelected(int)));
+ connect(w_leftBox, SIGNAL(highlighted(int)),this, SLOT(leftHighlighted(int)));
+ QLabel *leftLabel = new QLabel(w_leftBox, i18n("S&elected databases:"),page);
+ leftLabel->setMinimumSize(leftLabel->sizeHint());
+ subLayout2->addWidget(leftLabel,0,0);
+ subLayout2->addMultiCellWidget(w_leftBox,1,6,0,0);
+
+ w_allLeft = new QPushButton(page);
+ w_allLeft->setIconSet(BarIconSet("2leftarrow"));
+ connect(w_allLeft, SIGNAL(clicked()),this, SLOT(allLeftPressed()));
+ subLayout2->addWidget(w_allLeft,2,1);
+
+ w_left = new QPushButton(page);
+ w_left->setIconSet(BarIconSet("1leftarrow"));
+ connect(w_left, SIGNAL(clicked()),this, SLOT(leftPressed()));
+ subLayout2->addWidget(w_left,3,1);
+
+ w_right = new QPushButton(page);
+ w_right->setIconSet(BarIconSet("1rightarrow"));
+ connect(w_right, SIGNAL(clicked()),this, SLOT(rightPressed()));
+ subLayout2->addWidget(w_right,4,1);
+
+ w_allRight = new QPushButton(page);
+ w_allRight->setIconSet(BarIconSet("2rightarrow"));
+ connect(w_allRight, SIGNAL(clicked()),this, SLOT(allRightPressed()));
+ subLayout2->addWidget(w_allRight,5,1);
+
+ w_rightBox = new QListBox(page);
+ connect(w_rightBox, SIGNAL(selected(int)),this, SLOT(rightSelected(int)));
+ connect(w_rightBox, SIGNAL(highlighted(int)),this, SLOT(rightHighlighted(int)));
+ QLabel *rightLabel = new QLabel(w_rightBox, i18n("A&vailable databases:"),page);
+ rightLabel->setMinimumSize(rightLabel->sizeHint());
+ subLayout2->addWidget(rightLabel,0,2);
+ subLayout2->addMultiCellWidget(w_rightBox,1,6,2,2);
+
+ subLayout2->setRowStretch(1,1);
+ subLayout2->setRowStretch(6,1);
+ subLayout2->setColStretch(0,1);
+ subLayout2->setColStretch(2,1);
+
+ setHelp("database-sets");
+
+ if (global->setsSize.isValid())
+ resize(global->setsSize);
+ else
+ resize(300,200);
+
+ if ((global->currentDatabase>=1)&&(global->currentDatabase<=global->databaseSets.count()))
+ activateSet(global->currentDatabase-1);
+ else
+ activateSet(0);
+ w_set->setFocus();
+}
+
+
+void DbSetsDialog::hideEvent(QHideEvent *)
+{
+ global->setsSize = size();
+ emit(dialogClosed());
+}
+
+
+void DbSetsDialog::newPressed()
+{
+ QStringList *temp = new QStringList;
+ temp->append(i18n("New Set"));
+ global->databaseSets.append(temp);
+ global->databases.insert(global->databases.at(global->databaseSets.count()),i18n("New Set"));
+ if (global->currentDatabase >= global->databaseSets.count())
+ global->currentDatabase++;
+
+ QStringList sets; // reread sets, because w_sets internal list is not correct in all cases
+ for(unsigned int i=1;i<global->databaseSets.count()+1;i++)
+ sets.append(global->databases[i]);
+ w_set->clear();
+ w_set->insertStringList(sets);
+ emit(setsChanged());
+ activateSet(global->databaseSets.count()-1);
+ w_set->setFocus();
+}
+
+
+void DbSetsDialog::deletePressed()
+{
+ int pos = w_set->currentItem();
+ if (pos>=0) {
+ global->databaseSets.remove(global->databaseSets.at(pos));
+ global->databases.remove(global->databases.at(pos+1));
+ if ((int)global->currentDatabase >= pos+1)
+ global->currentDatabase--;
+ w_set->removeItem(pos);
+ if (pos >= w_set->count())
+ pos--;
+ emit(setsChanged());
+ activateSet(pos);
+ w_set->setFocus();
+ }
+}
+
+
+void DbSetsDialog::allLeftPressed()
+{
+ while (w_rightBox->count()) {
+ w_leftBox->insertItem(w_rightBox->text(0));
+ w_rightBox->removeItem(0);
+ }
+ w_leftBox->sort();
+ checkButtons();
+}
+
+
+void DbSetsDialog::leftPressed()
+{
+ int pos = w_rightBox->currentItem();
+ if (pos>=0) {
+ w_leftBox->insertItem(w_rightBox->text(pos));
+ w_leftBox->sort();
+ w_rightBox->removeItem(pos);
+ if (pos >= (int)w_rightBox->count())
+ pos--;
+ if (pos>=0)
+ w_rightBox->setCurrentItem(pos);
+ checkButtons();
+ }
+}
+
+
+void DbSetsDialog::rightPressed()
+{
+ int pos = w_leftBox->currentItem();
+ if (pos>=0) {
+ w_rightBox->insertItem(w_leftBox->text(pos));
+ w_rightBox->sort();
+ w_leftBox->removeItem(pos);
+ if (pos >= (int)w_leftBox->count())
+ pos--;
+ if (pos>=0)
+ w_leftBox->setCurrentItem(pos);
+ checkButtons();
+ }
+}
+
+
+void DbSetsDialog::allRightPressed()
+{
+ while (w_leftBox->count()) {
+ w_rightBox->insertItem(w_leftBox->text(0));
+ w_leftBox->removeItem(0);
+ }
+ w_rightBox->sort();
+ checkButtons();
+}
+
+
+void DbSetsDialog::closePressed()
+{
+ accept();
+ global->setsSize = size();
+ emit(dialogClosed());
+}
+
+
+void DbSetsDialog::transferSet()
+{
+ global->databaseSets.at(w_set->currentItem())->clear();
+ global->databaseSets.at(w_set->currentItem())->append(w_set->currentText());
+ for (unsigned int i = 0;i<w_leftBox->count();i++)
+ global->databaseSets.at(w_set->currentItem())->append(w_leftBox->text(i));
+ global->databases.remove(global->databases.at(w_set->currentItem()+1));
+ global->databases.insert(global->databases.at(w_set->currentItem()+1),w_set->currentText());
+ w_set->changeItem(w_set->currentText(),w_set->currentItem());
+ emit(setsChanged());
+}
+
+
+void DbSetsDialog::activateSet(int num)
+{
+ w_leftBox->clear();
+ w_rightBox->clear();
+
+ if ((num < 0)||(num>=(int)global->databaseSets.count())) {
+ w_set->clearEdit();
+ w_delete->setEnabled(false);
+ w_save->setEnabled(false);
+ w_rightBox->repaint(true); // Workaround for repaint-bug
+ w_leftBox->repaint(true); // Workaround for repaint-bug
+ } else {
+ w_set->setCurrentItem(num);
+ for (unsigned int i=0;i<global->serverDatabases.count();i++)
+ if (global->databaseSets.at(num)->findIndex(global->serverDatabases[i])>0)
+ w_leftBox->insertItem(global->serverDatabases[i]);
+ else
+ w_rightBox->insertItem(global->serverDatabases[i]);
+ w_leftBox->sort();
+ w_rightBox->sort();
+ w_delete->setEnabled(true);
+ w_save->setEnabled(true);
+ if (w_rightBox->count()==0)
+ w_rightBox->repaint(true); // Workaround for repaint-bug
+ if (w_leftBox->count()==0)
+ w_leftBox->repaint(true); // Workaround for repaint-bug
+ w_leftBox->clearSelection();
+ w_leftBox->centerCurrentItem();
+ w_rightBox->clearSelection();
+ w_rightBox->centerCurrentItem();
+ }
+ checkButtons();
+}
+
+
+void DbSetsDialog::leftSelected(int)
+{
+ rightPressed();
+}
+
+
+void DbSetsDialog::rightSelected(int)
+{
+ leftPressed();
+}
+
+
+void DbSetsDialog::leftHighlighted(int)
+{
+ w_right->setEnabled(true);
+}
+
+
+void DbSetsDialog::rightHighlighted(int)
+{
+ w_left->setEnabled(true);
+}
+
+void DbSetsDialog::checkButtons()
+{
+ w_allLeft->setEnabled((w_rightBox->count()>0));
+ w_allRight->setEnabled((w_leftBox->count()>0));
+ w_right->setEnabled((w_leftBox->currentItem()>=0));
+ w_left->setEnabled((w_rightBox->currentItem()>=0));
+}
+
+//--------------------------------
+
+#include "sets.moc"