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"