File indexing completed on 2024-04-21 05:45:50

0001 /*
0002     KT main GUI view implementation
0003     --------------------------------------------------------------------
0004     SPDX-FileCopyrightText: 1999 Gary Meyer <gary@meyer.net>
0005     --------------------------------------------------------------------
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "crontabWidget.h"
0010 
0011 #include <stdlib.h>
0012 #include <unistd.h>
0013 
0014 #include <QApplication>
0015 #include <QButtonGroup>
0016 #include <QClipboard>
0017 #include <QHBoxLayout>
0018 #include <QLabel>
0019 #include <QRadioButton>
0020 #include <QSplitter>
0021 #include <QVBoxLayout>
0022 
0023 #include <KLocalizedString>
0024 #include <KStandardAction>
0025 #include <QAction>
0026 
0027 #include "ctcron.h"
0028 #include "cthost.h"
0029 #include "cttask.h"
0030 #include "ctvariable.h"
0031 
0032 #include "crontabPrinter.h"
0033 #include "taskWidget.h"
0034 
0035 #include "variableWidget.h"
0036 
0037 #include "kcm_cron_debug.h"
0038 
0039 CrontabWidget::CrontabWidget(QWidget *parent, CTHost *ctHost)
0040     : QWidget(parent)
0041 {
0042     mCtHost = ctHost;
0043 
0044     setupActions();
0045 
0046     initialize();
0047 
0048     qCDebug(KCM_CRON_LOG) << "Clipboard Status " << hasClipboardContent();
0049 
0050     mTasksWidget->setFocus();
0051 
0052     QTreeWidgetItem *item = mTasksWidget->treeWidget()->topLevelItem(0);
0053     if (item != nullptr) {
0054         qCDebug(KCM_CRON_LOG) << "First item found" << mTasksWidget->treeWidget()->topLevelItemCount();
0055         item->setSelected(true);
0056     }
0057 
0058     mTasksWidget->changeCurrentSelection();
0059     mVariablesWidget->changeCurrentSelection();
0060 }
0061 
0062 CrontabWidget::~CrontabWidget()
0063 {
0064     delete mTasksWidget;
0065     delete mVariablesWidget;
0066 }
0067 
0068 bool CrontabWidget::hasClipboardContent()
0069 {
0070     if (!mClipboardTasks.isEmpty()) {
0071         return true;
0072     }
0073 
0074     if (!mClipboardVariables.isEmpty()) {
0075         return true;
0076     }
0077 
0078     return false;
0079 }
0080 
0081 QHBoxLayout *CrontabWidget::createCronSelector()
0082 {
0083     auto layout = new QHBoxLayout();
0084 
0085     layout->addWidget(new QLabel(i18n("Show the following Cron:"), this));
0086 
0087     auto group = new QButtonGroup(this);
0088 
0089     mCurrentUserCronRadio = new QRadioButton(i18n("Personal Cron"), this);
0090     mCurrentUserCronRadio->setChecked(true);
0091     group->addButton(mCurrentUserCronRadio);
0092     layout->addWidget(mCurrentUserCronRadio);
0093 
0094     mSystemCronRadio = new QRadioButton(i18n("System Cron"), this);
0095     group->addButton(mSystemCronRadio);
0096     layout->addWidget(mSystemCronRadio);
0097 
0098     connect(group, static_cast<void (QButtonGroup::*)(QAbstractButton *)>(&QButtonGroup::buttonClicked), this, &CrontabWidget::refreshCron);
0099 
0100     layout->addStretch(1);
0101 
0102     return layout;
0103 }
0104 
0105 void CrontabWidget::initialize()
0106 {
0107     auto layout = new QVBoxLayout(this);
0108 
0109     qCDebug(KCM_CRON_LOG) << "Begin view refresh";
0110 
0111     qCDebug(KCM_CRON_LOG) << "Creating Tasks list...";
0112 
0113     QHBoxLayout *cronSelector = createCronSelector();
0114     layout->addLayout(cronSelector);
0115 
0116     auto splitter = new QSplitter(this);
0117     splitter->setOrientation(Qt::Vertical);
0118     layout->addWidget(splitter);
0119 
0120     mTasksWidget = new TasksWidget(this);
0121     splitter->addWidget(mTasksWidget);
0122     splitter->setStretchFactor(0, 2);
0123 
0124     mVariablesWidget = new VariablesWidget(this);
0125     splitter->addWidget(mVariablesWidget);
0126     splitter->setStretchFactor(1, 1);
0127 
0128     refreshCron();
0129 }
0130 
0131 void CrontabWidget::refreshCron()
0132 {
0133     // Refreshes the main GUI.
0134     CTCron *ctCron = currentCron();
0135 
0136     mTasksWidget->refreshTasks(ctCron);
0137     mVariablesWidget->refreshVariables(ctCron);
0138 
0139 
0140     mTasksWidget->treeWidget()->setEnabled(true);
0141     mVariablesWidget->treeWidget()->setEnabled(true);
0142 
0143     toggleNewEntryActions(true);
0144     togglePasteAction(hasClipboardContent());
0145 }
0146 
0147 void CrontabWidget::copy()
0148 {
0149     qDeleteAll(mClipboardTasks);
0150     mClipboardTasks.clear();
0151 
0152     qDeleteAll(mClipboardVariables);
0153     mClipboardVariables.clear();
0154 
0155     QString clipboardText;
0156 
0157     if (mTasksWidget->treeWidget()->hasFocus()) {
0158         qCDebug(KCM_CRON_LOG) << "Tasks copying";
0159 
0160         const QList<TaskWidget *> tasksWidget = mTasksWidget->selectedTasksWidget();
0161         for (TaskWidget *taskWidget : tasksWidget) {
0162             auto task = new CTTask(*(taskWidget->getCTTask()));
0163             mClipboardTasks.append(task);
0164 
0165             clipboardText += task->exportTask() + QLatin1String("\n");
0166         }
0167     }
0168 
0169     if (mVariablesWidget->treeWidget()->hasFocus()) {
0170         qCDebug(KCM_CRON_LOG) << "Variables copying";
0171 
0172         const QList<VariableWidget *> variablesWidget = mVariablesWidget->selectedVariablesWidget();
0173         for (VariableWidget *variableWidget : variablesWidget) {
0174             auto variable = new CTVariable(*(variableWidget->getCTVariable()));
0175             mClipboardVariables.append(variable);
0176 
0177             clipboardText += variable->exportVariable() + QLatin1String("\n");
0178         }
0179     }
0180 
0181     QApplication::clipboard()->setText(clipboardText, QClipboard::Clipboard);
0182     QApplication::clipboard()->setText(clipboardText, QClipboard::Selection);
0183 
0184     qCDebug(KCM_CRON_LOG) << "Clipboard Status " << hasClipboardContent();
0185     togglePasteAction(hasClipboardContent());
0186 }
0187 
0188 void CrontabWidget::cut()
0189 {
0190     qCDebug(KCM_CRON_LOG) << "Cut content";
0191 
0192     copy();
0193 
0194     if (mTasksWidget->treeWidget()->hasFocus()) {
0195         qCDebug(KCM_CRON_LOG) << "Tasks cutting";
0196         mTasksWidget->deleteSelection();
0197     }
0198 
0199     if (mVariablesWidget->treeWidget()->hasFocus()) {
0200         qCDebug(KCM_CRON_LOG) << "Variables cutting";
0201         mVariablesWidget->deleteSelection();
0202     }
0203 }
0204 
0205 void CrontabWidget::paste()
0206 {
0207     qCDebug(KCM_CRON_LOG) << "Paste content";
0208 
0209     if (mTasksWidget->treeWidget()->hasFocus()) {
0210         for (CTTask *task : std::as_const(mClipboardTasks)) {
0211             mTasksWidget->addTask(new CTTask(*task));
0212         }
0213     }
0214 
0215     if (mVariablesWidget->treeWidget()->hasFocus()) {
0216         for (CTVariable *variable : std::as_const(mClipboardVariables)) {
0217             mVariablesWidget->addVariable(new CTVariable(*variable));
0218         }
0219     }
0220 }
0221 
0222 CTCron *CrontabWidget::currentCron() const
0223 {
0224     // Checks which mode the gui is in, either user cron or system cron,
0225     // returning the appropriate cron.
0226     if (mCurrentUserCronRadio->isChecked()) {
0227         return mCtHost->findCurrentUserCron();
0228     } else {
0229         return mCtHost->findSystemCron();
0230     }
0231 }
0232 
0233 TasksWidget *CrontabWidget::tasksWidget() const
0234 {
0235     return mTasksWidget;
0236 }
0237 
0238 VariablesWidget *CrontabWidget::variablesWidget() const
0239 {
0240     return mVariablesWidget;
0241 }
0242 
0243 CTHost *CrontabWidget::ctHost() const
0244 {
0245     return mCtHost;
0246 }
0247 
0248 void CrontabWidget::checkOtherUsers()
0249 {
0250     mOtherUserCronRadio->setChecked(true);
0251 
0252     refreshCron();
0253 }
0254 
0255 void CrontabWidget::setupActions()
0256 {
0257     qCDebug(KCM_CRON_LOG) << "Setup actions";
0258 
0259     // Edit menu
0260     mCutAction = KStandardAction::cut(this, SLOT(cut()), this);
0261     mCopyAction = KStandardAction::copy(this, SLOT(copy()), this);
0262     mPasteAction = KStandardAction::paste(this, SLOT(paste()), this);
0263     togglePasteAction(false);
0264 
0265     qCDebug(KCM_CRON_LOG) << "Actions initialized";
0266 }
0267 
0268 QList<QAction *> CrontabWidget::cutCopyPasteActions()
0269 {
0270     QList<QAction *> actions;
0271     actions.append(mCutAction);
0272     actions.append(mCopyAction);
0273     actions.append(mPasteAction);
0274 
0275     return actions;
0276 }
0277 
0278 void CrontabWidget::togglePasteAction(bool state)
0279 {
0280     mPasteAction->setEnabled(state);
0281 }
0282 
0283 void CrontabWidget::toggleModificationActions(bool state)
0284 {
0285     mCutAction->setEnabled(state);
0286     mCopyAction->setEnabled(state);
0287 
0288     mTasksWidget->toggleModificationActions(state);
0289     mVariablesWidget->toggleModificationActions(state);
0290 }
0291 
0292 void CrontabWidget::toggleNewEntryActions(bool state)
0293 {
0294     mTasksWidget->toggleNewEntryAction(state);
0295     mVariablesWidget->toggleNewEntryAction(state);
0296 }
0297 
0298 void CrontabWidget::print()
0299 {
0300     CrontabPrinter printer(this);
0301 
0302     if (!printer.start()) {
0303         qCDebug(KCM_CRON_LOG) << "Unable to start printer";
0304         return;
0305     }
0306     printer.printTasks();
0307     printer.printVariables();
0308 
0309     printer.finish();
0310 }
0311 
0312 #include "moc_crontabWidget.cpp"