From 37333bf25ad9a4c538250f5af2f9f1d666362883 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeadmin@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kcron/ktview.cpp | 576 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 576 insertions(+) create mode 100644 kcron/ktview.cpp (limited to 'kcron/ktview.cpp') diff --git a/kcron/ktview.cpp b/kcron/ktview.cpp new file mode 100644 index 0000000..87c90c0 --- /dev/null +++ b/kcron/ktview.cpp @@ -0,0 +1,576 @@ +/************************************************************************** + * KT main GUI view implementation * + * -------------------------------------------------------------------- * + * Copyright (C) 1999, Gary Meyer * + * -------------------------------------------------------------------- * + * 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. * + ***************************************************************************/ + +#include "ktview.h" + +#include +#include + +#include + +#ifdef HAVE_SSTREAM +#include +#else +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "cthost.h" +#include "ctcron.h" +#include "ctvariable.h" +#include "cttask.h" + +#include "kticon.h" +#include "ktlistcron.h" +#include "ktlistvars.h" +#include "ktlistvar.h" +#include "ktlisttasks.h" +#include "ktlisttask.h" +#include "ktapp.h" +#include "ktvariable.h" +#include "kttask.h" +#include "ktprint.h" + +KTView::KTView(QWidget *parent, const char* name) : + QWidget(parent, name), + listView(0), + currentCTCron(0), + currentIsTask(true), + currentCTTask(0), + currentCTVariable(0), + clipboardIsTask(true), + clipboardCTTask(0), + clipboardCTVariable(0) +{ + ktapp = (KTApp*)parentWidget(); + setBackgroundMode(PaletteBase); + refresh(); + listView->setSelected(listView->firstChild(), true); + + connect(this, SIGNAL(enableModificationButtons(bool)), parent, + SLOT(slotEnableModificationButtons(bool))); + + connect(this, SIGNAL(enablePaste(bool)), parent, + SLOT(slotEnablePaste(bool))); + + connect(this, SIGNAL(enableRunNow(bool)), parent, + SLOT(slotEnableRunNow(bool))); + + connect(this, SIGNAL(enableEnabled(bool)), parent, + SLOT(slotEnableEnabled(bool))); +} + +void KTView::disableIcons() +{ + emit(enableModificationButtons(false)); + emit(enablePaste(clipboardCTVariable)); + emit(enableRunNow(false)); +} + +void KTView::refresh() +{ + QListView* tmpListView(listView); + + listView = new QListView(this); + + listView->setFrameStyle(QListView::Panel | QListView::Sunken); + listView->setRootIsDecorated(true); + listView->setAllColumnsShowFocus(true); + listView->setShowSortIndicator(true); + + const CTHost& cth(ktapp->getCTHost()); + + if (cth.root()) + listView->addColumn(i18n("Users/Tasks/Variables")); + else + listView->addColumn(i18n("Tasks/Variables")); + + listView->addColumn(i18n("Value")); + listView->addColumn(i18n("Description")); + + for (int item = 0; item <=2; item++) + listView->setColumnWidthMode(item, QListView::Maximum); + + // for each user + for (CTCronIterator i = const_cast(cth).cron.begin(); + i != cth.cron.end(); i++) + { + CTCron* ctcron((CTCron*)*i); + + KTListVars* variables(0); + KTListTasks* tasks(0); + + if (cth.root()) + { + KTListCron* user = new KTListCron(listView, ctcron); + if (currentCTCron == ctcron) + { + listView->setSelected(user, true); + } + + variables = new KTListVars(user, ctcron); + tasks = new KTListTasks(user, ctcron); + } + else + { + variables = new KTListVars(listView, ctcron); + tasks = new KTListTasks(listView, ctcron); + } + + if (currentIsTask) + { + listView->setSelected(tasks, true); + slotSetCurrent(tasks); + } + else + { + listView->setSelected(variables, true); + slotSetCurrent(variables); + } + + for (CTVariableIterator j = (CTVariableIterator)ctcron->variable.begin(); + j != ctcron->variable.end(); j++) + { + new KTListVar(variables, ctcron, (CTVariable*)*j); + } + + for (CTTaskIterator k = (CTTaskIterator)ctcron->task.begin(); + k != ctcron->task.end(); k++) + { + new KTListTask(tasks, ctcron, (CTTask*)*k); + } + } + + resizeEvent(); + + connect(listView, SIGNAL(contextMenuRequested(QListViewItem*, const QPoint&, int)), + SLOT(slotMenu(QListViewItem*, const QPoint&, int))); + + connect(listView, SIGNAL(selectionChanged(QListViewItem*)), + SLOT(slotSetCurrent(QListViewItem*))); + + connect(listView, SIGNAL(doubleClicked(QListViewItem*)), + SLOT(slotEdit(QListViewItem*))); + + connect(listView, SIGNAL(returnPressed(QListViewItem*)), + SLOT(slotEdit(QListViewItem*))); + + // switch to the new view + if (tmpListView) + { + tmpListView->hide(); + listView->show(); + listView->setFocus(); + delete tmpListView; + } +} + +void KTView::print () const +{ + bool crontab, allUsers; + KTListItem *ktli, *user; + + const CTHost& cth(ktapp->getCTHost()); + + KTPrint printer(cth.root()); + + if (printer.start()) + { + crontab = printer.crontab(); + allUsers = printer.allUsers(); + + printer.createColumns(3); + + int copies = printer.numCopies(); + while (copies != 0) + { + if (allUsers || !cth.root()) + { + ktli = (KTListItem*)listView->firstChild(); + } + else + { + ktli = (KTListItem*)listView->currentItem(); + } + + //Check that the correct item is selected, they must + //select the top level entry for all items to print + while (ktli->depth() != 0) + ktli = (KTListItem*)ktli->parent(); + + user = ktli; //Used to store user's name + + if (allUsers) + { + while (ktli) + { + pageHeading(ktli, printer); + ktli->print(printer); + if (crontab) + pageFooter(ktli, printer); + ktli = (KTListItem*)ktli->nextSibling(); + if (ktli) + printer.newPage(); + } + } + else + { + //ktli goes out of range here hence the need for user + pageHeading(user, printer); + if (!cth.root()) + { + while (ktli) + { + ktli->print(printer); + ktli = (KTListItem*)ktli->nextSibling(); + } + } + else + ktli->print(printer); + + if (crontab) + pageFooter(user, printer); + + } + + copies--; //Keep a track of how many copies we have printed + if (copies != 0) printer.newPage(); + }//End printing loop (for more than one copy) + + printer.finished(); //End the print + + }//End Printing if +} + +void KTView :: pageHeading (KTListItem* user, KTPrint &printer) const +{ + QFont stnd; + QString logonInfo; + QDateTime now (QDateTime::currentDateTime()); + char hostName[20]; + + gethostname(hostName, 20); + // SSA : Fix Me user name, logon name and host name musst be + // SSA : not only in us-ascii ?? + logonInfo = i18n("user on host", "%1 <%2> on %3") + .arg(QString::fromLocal8Bit(user->getCTCron()->name.c_str())) + .arg(QString::fromLocal8Bit(user->getCTCron()->login.c_str())) + .arg(QString::fromLocal8Bit(hostName)); + + stnd = printer.getFont(); + printer.setFont(QFont( KGlobalSettings::generalFont().family(), 14, QFont::Bold )); + + printer.print (i18n("Scheduled Tasks"), 2, KTPrint::alignTextCenter, false); + printer.print (logonInfo, 2, KTPrint::alignTextCenter, false); + printer.print (KGlobal::locale()->formatDateTime(now), 2, KTPrint::alignTextCenter, false); + printer.setFont(stnd); + + printer.levelColumns(20); + +} + +void KTView :: pageFooter (KTListItem* user, KTPrint &printer) const +{ +#ifdef HAVE_SSTREAM + ostringstream oss; +#else + char buffer[4096]; + ostrstream oss(buffer, sizeof(buffer)); +#endif + + oss<<*(user->getCTCron())<setFixedWidth(width()); + listView->setFixedHeight(height()); + repaint(); +} + +void KTView::copy() +{ + if (clipboardCTTask) + { + delete clipboardCTTask; + clipboardCTTask = 0; + } + + if (clipboardCTVariable) + { + delete clipboardCTVariable; + clipboardCTVariable = 0; + } + + if (currentIsTask) + { + clipboardCTTask = new CTTask(*currentCTTask); + } + else + { + clipboardCTVariable = new CTVariable(*currentCTVariable); + } + clipboardIsTask = currentIsTask; +} + +void KTView::paste() +{ + KTListItem* qlvi = (KTListItem*)listView->currentItem(); + + if (currentIsTask) + { + CTTask* temptask = new CTTask(*clipboardCTTask); + currentCTCron->task.push_back(temptask); + KTListTask* ktlt = new KTListTask(qlvi, currentCTCron, temptask); + listView->setSelected(ktlt, true); + } + else + { + CTVariable* tempvar = new CTVariable(*clipboardCTVariable); + currentCTCron->variable.push_back(tempvar); + KTListVar* ktlv = new KTListVar(qlvi, currentCTCron, tempvar); + listView->setSelected(ktlv, true); + } +} + +void KTView::create() +{ + KTListItem* ktli = (KTListItem*)listView->currentItem(); + if ((ktli->text(0) != KTListTasks::getDescription()) && (ktli->text(0) != KTListVars::getDescription())) { + ktli = (KTListItem*)ktli->parent(); + } + Q_CHECK_PTR(ktli); + ktli->create(); + listView->triggerUpdate(); +} + +void KTView::edit() +{ + KTListItem* ktli = (KTListItem*)listView->currentItem(); + Q_CHECK_PTR(ktli); + ktli->edit(); + listView->triggerUpdate(); +} + +void KTView::remove() +{ + if (currentIsTask) + { + if (currentCTTask) + { + for (CTTaskIterator i = (CTTaskIterator) + (currentCTCron->task.begin()); + i != currentCTCron->task.end(); i++) + { + if (*i == currentCTTask) + { + currentCTCron->task.erase(i); + delete currentCTTask; + currentCTTask = 0; + break; + } + } + } + } + else + { + if (currentCTVariable) + { + for (CTVariableIterator j = (CTVariableIterator) + (currentCTCron->variable.begin()); + j != currentCTCron->variable.end(); j++) + { + if (*j == currentCTVariable) + { + currentCTCron->variable.erase(j); + delete currentCTVariable; + currentCTVariable = 0; + break; + } + } + } + } + refresh(); +} + +QString KTView::absolute() const +{ + QString fullCommand = QString::fromLocal8Bit(currentCTTask->command.c_str()); + QString command(fullCommand); + int pos(command.find(" ")); + if (pos > 0) command = command.left(pos); + + if (command.find("/") == 0) + return fullCommand; + + QString path = QString::fromLocal8Bit(currentCTCron->path().c_str()); + int begin(0); + int end(0); + QString prefix; + QString full; + + while ((end = path.find(":", begin)) > 0) + { + prefix = path.mid(begin, begin + end) + "/"; + full = prefix + command; + if (QFileInfo(full).isExecutable()) + return QString(prefix + fullCommand); + begin = end + 1; + } + prefix = path.mid(begin, begin + end) + "/"; + full = prefix + command; + if (QFileInfo(full).isExecutable()) + return QString(prefix + fullCommand); + return QString(""); +} + +void KTView::run() const +{ + QString command(absolute() + " &"); + system(QFile::encodeName(command)); +} + +void KTView::enable(bool enable) +{ + QListViewItem* qlvi = listView->currentItem(); + + if (currentIsTask) + { + if (currentCTTask) + { + currentCTTask->enabled = enable; + ((KTListTask*)(qlvi))->refresh(); + } + } + else + { + if (currentCTVariable) + { + currentCTVariable->enabled = enable; + ((KTListVar*)(qlvi))->refresh(); + } + } +} + +void KTView::slotMenu(QListViewItem* qlvi, const QPoint& qp, int /*i*/) +{ + if (qlvi !=0 ) { + listView->setSelected(qlvi, true); + slotSetCurrent(qlvi); + ktapp->slotEdit(qp); + } +} + +void KTView::slotEdit(QListViewItem* /*qlvi*/) +{ + edit(); +} + +void KTView::slotSetCurrent (QListViewItem* qlvi) +{ + QListViewItem* parent = qlvi->parent(); + + if (qlvi->text(0) == KTListVars::getDescription()) + { + // variable label + currentCTCron = ((KTListCron*)qlvi)->getCTCron(); + currentCTVariable = 0; + currentCTTask = 0; + currentIsTask = false; + emit(enableModificationButtons(false)); + emit(enablePaste(clipboardCTVariable)); + emit(enableRunNow(false)); + emit(enableEnabled(false)); + + } + else if (qlvi->text(0) == KTListTasks::getDescription()) + { + // task label + currentCTCron = ((KTListCron*)qlvi)->getCTCron(); + currentCTVariable = 0; + currentCTTask = 0; + currentIsTask = true; + + emit(enableModificationButtons(false)); + emit(enablePaste(clipboardCTTask)); + emit(enableRunNow(false)); + emit(enableEnabled(false)); + + } + else if (parent) + { + if (parent->text(0) == KTListVars::getDescription()) + { + // variable + currentCTCron = ((KTListVar*)qlvi)->getCTCron(); + currentCTVariable = ((KTListVar*)qlvi)->getCTVariable(); + currentCTTask = 0; + currentIsTask = false; + + emit(enableModificationButtons(true)); + emit(enableRunNow(false)); + emit(enableEnabled(currentCTVariable->enabled)); + + } + else if (parent->text(0) == KTListTasks::getDescription()) + { + // task + currentCTCron = ((KTListTask*)qlvi)->getCTCron(); + currentCTVariable = 0; + currentCTTask = ((KTListTask*)qlvi)->getCTTask(); + currentIsTask = true; + + emit(enableModificationButtons(true)); + emit(enableRunNow((currentCTTask->enabled) && + (!absolute().isEmpty()))); + emit(enableEnabled(currentCTTask->enabled)); + + } + } + else + { + // user + currentCTCron = ((KTListCron*)qlvi)->getCTCron(); + currentCTVariable = 0; + currentCTTask = 0; + currentIsTask = true; + + emit(enableModificationButtons(true)); + emit(enablePaste(false)); + emit(enableRunNow(false)); + emit(enableEnabled(false)); + + } +} + +#include "ktview.moc" -- cgit v1.2.1