summaryrefslogtreecommitdiffstats
path: root/kpackage/pkgOptions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpackage/pkgOptions.cpp')
-rw-r--r--kpackage/pkgOptions.cpp372
1 files changed, 372 insertions, 0 deletions
diff --git a/kpackage/pkgOptions.cpp b/kpackage/pkgOptions.cpp
new file mode 100644
index 0000000..19a3c5e
--- /dev/null
+++ b/kpackage/pkgOptions.cpp
@@ -0,0 +1,372 @@
+/*
+** Copyright (C) 1999,2000 Toivo Pedaste <toivo@ucs.uwa.edu.au>
+**
+*/
+
+/*
+** 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 in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to kde-devel@kde.org
+*/
+
+
+#include "../config.h"
+// qt headers
+#include <qlabel.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klistview.h>
+#include <kseparator.h>
+#include <kdebug.h>
+#include <kpushbutton.h>
+#include <kstdguiitem.h>
+
+#include "pkgOptions.h"
+#include "managementWidget.h"
+#include "debInterface.h"
+#include "kpackage.h"
+#include "options.h"
+
+///////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////
+
+pkgOptions::pkgOptions(pkgInterface *pki, QWidget *parent, const QString &caption)
+ : KDialog(parent,0,TRUE)
+{
+ // setFrameStyle(QFrame::Raised | QFrame::Panel);
+
+ pkgInt = pki;
+
+ hide();
+
+ setCaption(caption);
+}
+
+// Destructor
+pkgOptions::~pkgOptions()
+{
+ // int i;
+ // for (i = 0; i < bnumber; i++) {
+ // delete(Boxs[i]);
+ // }
+}
+
+// Set up the sub-widgets
+void pkgOptions::setupWidgets(QPtrList<param> &pars)
+{
+ int i;
+
+ // Create widgets
+ title = new QLabel("", this);
+ QFont f( KGlobalSettings::generalFont());
+ f.setBold(true);
+ f.setPointSize(f.pointSize()+6);
+ title->setFont(f);
+ // title->setAutoResize(TRUE);
+ // title->update();
+
+ installButton = new QPushButton(insType,this);
+ cancelButton = new KPushButton(KStdGuiItem::cancel(),this);
+ // count number of buttons
+ bnumber = pars.count();
+
+ Boxs = new QCheckBox *[bnumber];
+ param *p;
+ i = 0;
+ for ( p=pars.first(); p != 0; p=pars.next(), i++ ) {
+ Boxs[i] = new QCheckBox(p->name, this);
+ Boxs[i]->setChecked(p->init);
+ }
+
+ Keep = new QCheckBox(i18n("Keep this window"), this);
+
+ // Connections
+ connect(installButton,SIGNAL(clicked()),SLOT(pkginstallButtonClicked()));
+ connect(cancelButton,SIGNAL(clicked()),SLOT(cancelButtonClicked()));
+ connect(Keep, SIGNAL(toggled(bool)), SLOT(keepToggle(bool)));
+
+ // Do the layout
+ vlayout = new QBoxLayout(this, QBoxLayout::TopToBottom, marginHint(), spacingHint());
+ vlayout->addWidget(title,0);
+
+ {
+ hlayout = new QBoxLayout(vlayout,QBoxLayout::LeftToRight, spacingHint());
+
+ {
+ layout = new QBoxLayout(hlayout,QBoxLayout::TopToBottom, spacingHint());
+
+ packages = new KListView(this);
+ layout->addWidget(packages,20);
+ packages->addColumn(i18n("PACKAGES"),200);
+
+ connect(packages, SIGNAL(selectionChanged ( QListViewItem * )),
+ this, SLOT(slotSearch( QListViewItem * )));
+
+ layout->addStretch(1);
+ for (i = 0; i < bnumber; i++) {
+ layout->addWidget(Boxs[i],1);
+ }
+ layout->addWidget(new KSeparator(KSeparator::HLine, this), 2);
+
+ QBoxLayout *slayout = new QBoxLayout(layout, QBoxLayout::LeftToRight);
+ slayout->addStretch(1);
+ slayout->addWidget(Keep, 1);
+ slayout->addStretch(1);
+
+ layout->addWidget(new KSeparator(KSeparator::HLine, this), 2);
+
+ QBoxLayout *buttons = new QBoxLayout(QBoxLayout::LeftToRight);
+ layout->addLayout(buttons);
+
+ buttons->addWidget(installButton,2);
+ buttons->addStretch(1);
+ buttons->addWidget(cancelButton,2);
+ }
+ {
+ term = new kpTerm(kpty,this);
+ hlayout->addWidget(term, 1000);
+ }
+ }
+ resize(800, 400);
+}
+
+void pkgOptions::setup(packageInfo *p, const QString &type) {
+ QPtrList<packageInfo> *pl = new QPtrList<packageInfo>;
+ pl->append(p);
+ setup(pl,type);
+}
+
+bool pkgOptions::setup(QPtrList<packageInfo> *pl, const QString &)
+{
+ QString s;
+ modified = FALSE;
+
+ packList = pl;
+
+ packages->clear();
+ packageInfo *p;
+
+ QStringList plist, rlist, clist;
+ QDict<QString> dict;
+ QString mark("x");
+ for ( p = pl->first(); p != 0; p = pl->next() ) {
+ QString file = p->getFilename();
+ plist += p->getProperty("name");
+ if (file.isEmpty()) {
+ clist += p->getProperty("name");
+ }
+ dict.insert(p->getProperty("name"), &mark);
+ }
+
+ packageInfo *pk;
+ bool cancel;
+ if (clist.count() > 0) {
+ rlist = pkgInt->listInstalls(clist, installer, cancel);
+ if (cancel) {
+ reject();
+ return false;
+ }
+ for ( QStringList::Iterator it = rlist.begin(); it != rlist.end(); ++it ) {
+ if (!dict[*it]) {
+ plist.append(*it);
+ QString dirIndex = *it + pkgInt->typeID;
+ if (installer) {
+ pk = kpackage->management->dirUninstPackages->find(dirIndex);
+ } else {
+ pk = kpackage->management->dirInstPackages->find(dirIndex);
+ }
+ if (pk) {
+ // kdDebug() << "FF=" << dirIndex << "\n";
+ pl->append(pk);
+ } else {
+ // kdDebug() << "uF=" << dirIndex << "\n";
+ }
+ }
+ }
+ }
+
+ s = i18n("%1: 1 %2 Package","%1: %n %2 Packages",plist.count()).arg(insType,pkgInt->name);
+ title->setText(s);
+
+ for (QStringList::Iterator pit = plist.begin(); pit != plist.end(); ++pit ) {
+ // kdDebug() << "P=" << *pit << "\n";
+ new QListViewItem(packages, *pit);
+ }
+ cancelButton->setGuiItem(KStdGuiItem::cancel());
+ return TRUE;
+}
+
+// install button has been clicked....so install the package
+void pkgOptions::pkginstallButtonClicked()
+{
+ int i;
+ QStringList r;
+ modified = TRUE;
+
+ // Collect data from check boxes
+ int installFlags = 0;
+
+ for (i = 0; i < bnumber; i++) {
+ installFlags |= (Boxs[i]->isChecked()) << i;
+ }
+
+ test = FALSE;
+ QString s = doPackages(installFlags, packList, test);
+ // A "0=" or "1=" indicates it was actually (un)installed by the doPackages
+ // routine instead of just returning a command to execute
+
+ kdDebug() << "S=" << s << "\n";
+ if (s == "0=") {
+ cancelButtonClicked();
+ } else if (s.left(2) == "1=") {
+ term->textIn(s.mid(2), true);
+ } else {
+ connect(term,SIGNAL(result(QStringList &, int)),
+ this,SLOT(slotResult(QStringList &, int)));
+
+ installButton->setEnabled(FALSE);
+
+ if (term->run(s, r)) {
+ running = TRUE;
+ cancelButton->setGuiItem(KStdGuiItem::cancel());
+ } else {
+ reset();
+ }
+ }
+}
+
+void pkgOptions::slotSearch(QListViewItem *item)
+{
+ QString s = item->text(0);
+ kdDebug() << "searchI=" << s << "h=" << pkgInt->head <<"\n";
+
+ packageInfo *p;
+ for ( p = packList->first(); p != 0; p = packList->next() ) {
+ if (s == p->getProperty("name")) {
+ kpackage->management->doChangePackage(p);
+ break;
+ }
+ }
+}
+
+void pkgOptions::reset() {
+ installButton->setEnabled(TRUE);
+ cancelButton->setGuiItem(KGuiItem(i18n("Done"))); //clear icon
+ disconnect(term,SIGNAL(result(QStringList &, int)),
+ this,SLOT(slotResult(QStringList &, int)));
+ running = FALSE;
+}
+
+void pkgOptions::slotResult(QStringList &, int ret)
+{
+ reset();
+ if (ret == 0 && !test && !keep) {
+ term->done();
+ accept();
+ }
+}
+
+void pkgOptions::terminate() {
+ if (running) {
+ term->cancel();
+ reset();
+ }
+}
+
+void pkgOptions::cancelButtonClicked()
+{
+ terminate();
+ term->done();
+
+ if (!modified || test)
+ reject();
+ else
+ accept();
+}
+
+void pkgOptions::closeEvent ( QCloseEvent * e ) {
+ kdDebug() << "pkgOptions::QCloseEvent\n";
+ terminate();
+
+ QWidget::closeEvent (e);
+}
+
+void pkgOptions::showEvent ( QShowEvent *e ) {
+ // kdDebug() << "pkgOptions::showEvent\n";
+ getKeep();
+
+ modified = FALSE;
+ running = FALSE;
+
+ QWidget::showEvent(e);
+}
+
+void pkgOptions::keepToggle(bool kp)
+{
+ // kdDebug() << "KEEP " << kp << "\n";
+
+ KConfig *config = kapp->config();
+
+ config->setGroup("Kpackage");
+ config->writeEntry("keepIWin", kp);
+
+ keep = kp;
+}
+
+void pkgOptions::getKeep()
+{
+ KConfig *config = kapp->config();
+ config->setGroup("Kpackage");
+ keep = config->readBoolEntry("keepIWin", true);
+ kdDebug() << "getKEEP " << keep << "\n";
+ Keep->setChecked(keep);
+
+}
+
+///////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////
+pkgOptionsI::pkgOptionsI(pkgInterface *pkg, QWidget *parent):
+ pkgOptions(pkg, parent, i18n("Install"))
+{
+ insType = i18n("Install");
+ installer = TRUE;
+ setupWidgets(pkg->paramsInst);
+}
+
+QString pkgOptionsI::doPackages(int installFlags, QPtrList<packageInfo> *p, bool &test)
+{
+ return pkgInt->install(installFlags, p, test);
+}
+
+///////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////
+pkgOptionsU::pkgOptionsU(pkgInterface *pkg, QWidget *parent):
+ pkgOptions(pkg, parent, i18n("Uninstall"))
+{
+ insType = i18n("Uninstall");
+ installer = FALSE;
+ setupWidgets(pkg->paramsUninst);
+}
+
+QString pkgOptionsU::doPackages(int installFlags, QPtrList<packageInfo> *p, bool &test)
+{
+ return pkgInt->uninstall(installFlags, p, test);
+}
+#include "pkgOptions.moc"