diff options
Diffstat (limited to 'kpackage/updateLoc.cpp')
-rw-r--r-- | kpackage/updateLoc.cpp | 761 |
1 files changed, 761 insertions, 0 deletions
diff --git a/kpackage/updateLoc.cpp b/kpackage/updateLoc.cpp new file mode 100644 index 0000000..cf4e582 --- /dev/null +++ b/kpackage/updateLoc.cpp @@ -0,0 +1,761 @@ +/* +** 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" + +#include "kpackage.h" +#include "updateLoc.h" +#include "pkgInterface.h" +#include "options.h" +#include "cache.h" + +#include <qvbox.h> +#include <qscrollview.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kcombobox.h> + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +apanel::apanel( QWidget *parent, + const char * name ) + : QWidget( parent, name ) +{ + puse = 0; + + pack = new QHBoxLayout(this); + { + puse = new QCheckBox(i18n("Use"),this); + pack->addWidget(puse,0); + + pent = new QLineEdit(this); + pent->setMinimumWidth(600); + pack->addWidget(pent,0); + + } +} + +apanel::~apanel() +{ +} + +QString apanel::getText() const +{ + QString s = pent->text(); + return s; +} + +void apanel::setText(const QString &s) +{ + pent->setText(s); +} + +bool apanel::getUse() +{ + if (puse) + return puse->isChecked(); + else + return FALSE; +} + +void apanel::setUse(int n) +{ + if (puse) { + if (n) + puse->setChecked(TRUE); + else + puse->setChecked(FALSE); + } +} + +void apanel::clear() +{ + puse->setChecked(FALSE); + pent->clear(); +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +dpanel::dpanel( QWidget *parent, const char * name ) + : QWidget( parent, name ) +{ + puse = 0; + psubdirs = 0; + + pack = new QHBoxLayout(this); + { + pent = new QLineEdit(this); + pent->setMinimumWidth(280); + pack->addWidget(pent,0); + + pbut = new QPushButton("...",this); + pack->addWidget(pbut,0); + + connect(pbut, SIGNAL(clicked()), this, SLOT(dirOpen())); + + } +} + +dpanel::dpanel(dpanel *basep, const QString &Pfilter, bool bsubdirs, + QWidget *parent, const char * name ) + : QWidget( parent, name ) +{ + filter = Pfilter; + puse = 0; + psubdirs = 0; + + base = basep; + + pack = new QHBoxLayout(this); + { + puse = new QCheckBox(i18n("Use"),this); + pack->addWidget(puse,0); + + pent = new QLineEdit(this); + pent->setMinimumWidth(280); + pack->addWidget(pent,0); + + if (bsubdirs) { + psubdirs = new QCheckBox(i18n("Subfolders"),this); + psubdirs->setFixedSize(psubdirs->sizeHint()); + pack->addWidget(psubdirs,0); + } + + pbut = new QPushButton("...",this); + pack->addWidget(pbut,0); + + if (base) + connect(pbut, SIGNAL(clicked()), this, SLOT(fileOpen())); + else + connect(pbut, SIGNAL(clicked()), this, SLOT(dirOpen())); + + } +} + +dpanel::~dpanel() +{ +} + +QString dpanel::getText() const +{ + QString s = pent->text(); + return s; +} + +void dpanel::setText(const QString &s) +{ + pent->setText(s); +} + +bool dpanel::getUse() const +{ + if (puse) + return puse->isChecked(); + else + return FALSE; +} + +void dpanel::setUse(int n) +{ + if (puse) { + if (n) + puse->setChecked(TRUE); + else + puse->setChecked(FALSE); + } +} + +bool dpanel::getSubdirs() const +{ + if (psubdirs) + return psubdirs->isChecked(); + else + return FALSE; +} + +void dpanel::setSubdirs(int n) +{ + if (psubdirs) + { + if (n) + psubdirs->setChecked(TRUE); + else + psubdirs->setChecked(FALSE); + } +} + +void dpanel::fileOpen() +{ + QString st; + + if (base && getText().isEmpty()) { + st = base->getText(); + } else { + st = getText(); + } + if (st.right(8) == "Packages") { + st.truncate(st.length() - 8); + } + + KURL url = KFileDialog::getOpenURL + (st, filter, 0, i18n("Package File")); + + if( url.isEmpty() ) + return; + + pent->setText( url.url() ); +} + +void dpanel::dirOpen() +{ + QString st; + + if (base && getText().isEmpty()) { + st = base->getText(); + } else { + st = getText(); + } + + KURL url = KFileDialog::getExistingURL + (st, 0, i18n("Package Archive")); + + + if( url.isEmpty() ) + return; + + pent->setText( url.url() ); + +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +updateLoc::updateLoc(QWidget *p, int panelNumber, pkgInterface *inter, const QString &iname) + : QWidget(p,"updateLoc",FALSE) +{ + interName = iname; + interface = inter; + panNumber = panelNumber; + + vf = new QVBoxLayout( this, 15, 10, "vf"); +} + +updateLoc::~updateLoc() +{ +} + +void updateLoc::doBase(const QString & bmsg) +{ + base = 0; + if (haveBase) { + fbase = new QGroupBox(bmsg, this); + fbase->setColumnLayout(0, Qt::Vertical ); + fbase->layout()->setSpacing( KDialog::spacingHint() ); + fbase->layout()->setMargin( KDialog::marginHint() ); + vbase = new QVBoxLayout(fbase->layout()); + vf->addWidget(fbase,1); + base = new dpanel(fbase); + vbase->addWidget(base,0); + vbase->activate(); + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +aUpdateLoc::aUpdateLoc(QWidget *p, int panelNumber, pkgInterface *inter, const QString &iname, + int numberLines, const QString &label) + : updateLoc(p, panelNumber, inter, iname) +{ + + if (numberLines > PNUM) + numLines = PNUM; + else + numLines = numberLines; + + ap[0] = 0; + + QGroupBox *floc = new QGroupBox(1,Qt::Vertical, label, this); + vf->addWidget(floc,1); + QScrollView* sv = new QScrollView(floc); + sv->setHScrollBarMode(QScrollView::AlwaysOff); + sv->setResizePolicy(QScrollView::AutoOneFit); + + QFrame *f = new QFrame(sv->viewport()); + sv->addChild(f); + + QVBoxLayout *vloc = new QVBoxLayout(f, 0, 3, "vloc"); + + for (int i = 0; i < numLines; i++) { + ap[i] = new apanel( f); + vloc->addWidget(ap[i],0); + } + +} + + +aUpdateLoc::~aUpdateLoc() +{ +} + +void aUpdateLoc::readSettings() +{ + int i = 0; + QString a,b; + + for (int i = 0; i < numLines; i++) { + ap[i]->clear(); + } + + QStringList list = interface->readApt(); + for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + if (!(*it).isEmpty()) { + if ((*it).left(1) == "#") { + ap[i]->setText(((*it).mid(1)).stripWhiteSpace()); + ap[i]->setUse(0); + } else { + ap[i]->setText((*it)); + ap[i]->setUse(1); + } + i++; + if (i >= numLines) { + ap[numLines - 1]->setText(i18n("File truncated...")); + break; + } + } + } +} + +void aUpdateLoc::writeSettings() { + QStringList list; + QString s; + + QString ln; + for (int i = 0; i < numLines; i++) { + if (!ap[i]) + break; + + ln = ap[i]->getText(); + if (!ln.isEmpty()) { + if (ap[i]->getUse()) { + s = ""; + } else { + s = "# "; + } + s += ln; + list.append(s); + } + } + interface->writeApt(list); +} + +void aUpdateLoc::applyS(LcacheObj *) { +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// + +pdUpdateLoc::pdUpdateLoc(QWidget *p, int panelNumber, pkgInterface *inter, const QString &iname, + int numberLines, const QString &filter, + const QString &lmsg, QString bmsg, + bool subdirs ) + : updateLoc(p, panelNumber, inter, iname) +{ + + if (numberLines > PNUM) + numLines = PNUM; + else + numLines = numberLines; + + haveBase = !bmsg.isNull(); + + dp[0] = 0; + + QString pn; + pn.setNum(panNumber); + pn += "_"; + + packL = "Package_L_"; + packL += pn; + packU = "Package_U_"; + packU += pn; + packS = "Package_S_"; + packS += pn; + availB = "Available_Base"; + availB += pn; + + doBase(bmsg); + + QGroupBox *floc = new QGroupBox(lmsg, this); + floc->setColumnLayout(0, Qt::Vertical ); + floc->layout()->setSpacing( KDialog::spacingHint() ); + floc->layout()->setMargin( KDialog::marginHint() ); + vf->addWidget(floc,1); + QVBoxLayout *vloc = new QVBoxLayout(floc->layout()); + + for (int i = 0; i < numLines; i++) { + dp[i] = new dpanel(base, filter, subdirs, floc); + vloc->addWidget(dp[i],0); + } + + readSettings(); +} + + +pdUpdateLoc::~pdUpdateLoc() +{ +} + +void pdUpdateLoc::applyS(LcacheObj *slist) +{ + QString t,pn,cn,pv,prev,opts; + cacheObj *CObj; + KConfig *config = kapp->config(); + config->setGroup(interName); + + cn = interface->head; + cn += "_"; + cn += pn.setNum(panNumber); + cn += "_"; + + + for (int i = 0; i < numLines; i++) { + // delete chached dir if text changed + pv = packL + pn.setNum(i); + prev = config->readEntry(pv); + if (prev != dp[i]->getText()) + cacheObj::rmDCache(QString(cn + pn.setNum(i))); + + // create cache object corresponding to this entry + if (dp[i]->getUse()) { + t = dp[i]->getText(); + if (!t.isEmpty()) { + CObj = new cacheObj(haveBase ? base->getText() : QString::null, + t, cn + pn.setNum(i), "", dp[i]->getSubdirs()); + slist->append(CObj); + // printf("T=%s\n",t.data()); + } + } + } + // writeSettings(); +} + +void pdUpdateLoc::readSettings() +{ + QString pv, pn; + + KConfig *config = kapp->config(); + + config->setGroup(interName); + + if (haveBase) + base->setText(config->readEntry(availB)); + + for (int i = 0; i < numLines; i++) { + if (!dp[i]) + break; + pv = packL + pn.setNum(i); + dp[i]->setText(config->readEntry(pv)); + pv = packU + pn.setNum(i); + dp[i]->setUse(config->readNumEntry(pv)); + pv = packS + pn.setNum(i); + dp[i]->setSubdirs(config->readNumEntry(pv)); + } +} + +void pdUpdateLoc::writeSettings() +{ + QString pv, pn; + + KConfig *config = kapp->config(); + + config->setGroup(interName); + if (haveBase) { + if (!base->getText().isEmpty()) + config->writeEntry(availB,base->getText()); + } + + for (int i = 0; i < numLines; i++) { + if (!dp[i]) + break; + pv = packL + pn.setNum(i); + config->writeEntry(pv,dp[i]->getText()); + pv = packU + pn.setNum(i); + config->writeEntry(pv,(int)dp[i]->getUse()); + pv = packS + pn.setNum(i); + config->writeEntry(pv,(int)dp[i]->getSubdirs()); + } + +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +cUpdateLoc::cUpdateLoc(QWidget *p, int panelNumber, pkgInterface *inter, const QString &iname, + int numberLines, const QString &baseMsg, + const QString &boxLabels, const QString &boxValues) + : updateLoc(p, panelNumber, inter, iname) +{ + if (numberLines > PNUM) + numLines = PNUM; + else + numLines = numberLines; + + haveBase = !baseMsg.isNull(); + + combo[0] = 0; + + QString pn; + pn.setNum(panNumber); + pn += "_"; + + packC = "Package_C_"; + packC += pn; + availB = "Available_Base"; + availB += pn; + + QStringList kc = QStringList::split('\n', boxLabels); + QStringList::Iterator kcIt = kc.begin(); + + QStringList oc = QStringList::split('\n', boxValues); + QStringList::Iterator ocIt = oc.begin(); + + + doBase(baseMsg); + + for (int i = 0; i < numLines; i++) { + QGroupBox *floc = new QGroupBox(*kcIt, this); + floc->setColumnLayout(0, Qt::Vertical ); + floc->layout()->setSpacing( KDialog::spacingHint() ); + floc->layout()->setMargin( KDialog::marginHint() ); + vf->addWidget(floc,1); + QVBoxLayout *vloc = new QVBoxLayout(floc->layout()); + + combo[i] = new KComboBox( true, floc); + KCompletion *comp = combo[i]->completionObject(); + connect(combo[i],SIGNAL(returnPressed(const QString&)) + ,comp,SLOT(addItem(const QString&))); + combo[i]->insertStringList(QStringList::split(' ',*ocIt)); + vloc->addWidget(combo[i]); + if (kcIt != kc.end()) { + ++kcIt; + } + if (ocIt != oc.end()) { + ++ocIt; + } + } + + readSettings(); +} + +cUpdateLoc::~cUpdateLoc() +{ +} + + void cUpdateLoc::applyS(LcacheObj *slist) +{ + QString t,pn,cn,pv,prev,opts; + cacheObj *CObj; + KConfig *config = kapp->config(); + config->setGroup(interName); + + cn = interface->head; + cn += "_"; + cn += pn.setNum(panNumber); + cn += "_"; + + if (!base->getText().isEmpty()) { + for (int i = 0; i < numLines; i++) { + opts += combo[i]->currentText(); + opts += "\n"; + } + CObj = new cacheObj(base->getText(), + "", cn + ":", opts); + slist->append(CObj); + } + // writeSettings(); +} + +void cUpdateLoc::readSettings() +{ + QString pv, pn; + + KConfig *config = kapp->config(); + + config->setGroup(interName); + + if (haveBase) + base->setText(config->readEntry(availB)); + + for (int i = 0; i < numLines; i++) { + if (!combo[i]) + break; + pv = packC + pn.setNum(i); + if (!config->readEntry(pv).isEmpty()) { + combo[i]->insertItem(config->readEntry(pv), 0); + } + } + +} + +void cUpdateLoc::writeSettings() +{ + QString pv, pn; + + KConfig *config = kapp->config(); + + config->setGroup(interName); + + if (haveBase) { + config->writeEntry(availB,base->getText()); + } + + for (int i = 0; i < numLines; i++) { + if (!combo[i]) + break; + pv = packC + pn.setNum(i); + config->writeEntry(pv,combo[i]->currentText()); + } + +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +Locations::Locations(const QString &msg) + : KDialogBase(Tabbed, msg, Ok | Cancel, Ok, 0, "Locations", false) +{ + numPanels = 0; + + connect( this, SIGNAL(okClicked()), SLOT(write_slot()) ); +} + +void Locations::dLocations(int numberDirs, int numberLines, + pkgInterface *inter, const QString &iname, + const QString &label, const QString &filter, const QString &dirMsg, + bool subdirs) +{ + QString nm; + + for (int i = numPanels ; (i < numPanels + numberDirs) && (i < PANNUM); i++) { + + QString mp = iname; + nm.setNum(i+1); + mp += nm; + QVBox *page = addVBoxPage(mp); + pn[i] = new pdUpdateLoc(page, i, inter, + label, numberLines, + filter, dirMsg, NULL, subdirs); + } + numPanels += numberDirs; +} + +void Locations::pLocations(int numberDirs, int numberLines, + pkgInterface *inter, const QString &iname, const QString &label, + const QString &filter, + const QString &packMsg, QString baseMsg, bool subdirs) +{ + QString nm; + + for (int i = numPanels; (i < numPanels + numberDirs) && (i < PANNUM); i++) { + QString mp = iname; + nm.setNum(i+1); + mp += nm; + QVBox *page = addVBoxPage(mp); + pn[i] = new pdUpdateLoc(page, i, inter, label, + numberLines, + filter, packMsg, baseMsg, subdirs); + } + numPanels += numberDirs; +} + +void Locations::cLocations(int numberDirs, int numberLines, + pkgInterface *inter, const QString &iname, const QString &label, + const QString &boxLables, const QString &baseMsg, const QString &boxValues) +{ + QString nm; + + for (int i = numPanels; (i < numPanels + numberDirs) && (i < PANNUM); i++) { + QString mp = iname; + nm.setNum(i+1); + mp += nm; + QVBox *page = addVBoxPage(mp); + pn[i] = new cUpdateLoc(page, i, inter, label, + numberLines, baseMsg, + boxLables, boxValues); + } + numPanels += numberDirs; +} + +void Locations::aLocations(int numberDirs, int numberLines, + pkgInterface *inter, const QString &iname, const QString &label) +{ + QString nm; + + for (int i = numPanels; (i < numPanels + numberDirs) && (i < PANNUM); i++) { + QString mp = iname; + nm.setNum(i+1); + mp += nm; + QVBox *page = addVBoxPage(mp); + pn[i] = new aUpdateLoc(page, i, inter, iname, + numberLines, label); + } + numPanels += numberDirs; +} + +Locations::~Locations() { + // for (int i = 0; (i < numPanels) && (i < PANNUM) && pn[i]; i++) { + // delete pn[i]; + // } +} + +void Locations::restore() +{ + for (int i = 0; (i < numPanels) && (i < PANNUM); i++) { + pn[i]->readSettings(); + } + show(); +} + +void Locations::apply_slot() +{ + LcacheObj *slist = new LcacheObj(); + + for (int i = 0; (i < numPanels) && (i < PANNUM); i++) { + pn[i]->applyS(slist); + } + emit returnVal(slist); +} + +void Locations::write_slot() +{ + apply_slot(); + + for (int i = 0; (i < numPanels) && (i < PANNUM); i++) { + pn[i]->writeSettings(); + } +} + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +#include "updateLoc.moc" |