2 Copyright (c) 2013-2015 Montel Laurent <montel@kde.org>
4 This library is free software; you can redistribute it and/or modify it
5 under the terms of the GNU Library General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or (at your
7 option) any later version.
9 This library is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12 License for more details.
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the
16 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 #include "sieveeditormainwindow.h"
22 #include "sieveeditormainwidget.h"
23 #include "sieveeditorconfiguredialog.h"
24 #include "serversievesettingsdialog.h"
25 #include "sieveserversettings.h"
26 #include "sieveeditorcentralwidget.h"
27 #include "sieveeditorglobalconfig.h"
28 #include "sieveeditorbookmarks.h"
29 #include "PimCommon/KActionMenuChangeCase"
31 #include <KStandardGuiItem>
32 #include <KSharedConfig>
33 #include <KIconEngine>
34 #include <KIconLoader>
36 #include <KLocalizedString>
37 #include <KConfigGroup>
38 #include <KStandardAction>
39 #include <KActionCollection>
46 #include <QCloseEvent>
47 #include <QNetworkConfigurationManager>
49 SieveEditorMainWindow::SieveEditorMainWindow()
52 mMainWidget
= new SieveEditorCentralWidget(this);
53 connect(mMainWidget
, &SieveEditorCentralWidget::configureClicked
, this, &SieveEditorMainWindow::slotConfigure
);
54 connect(mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::updateButtons
, this, &SieveEditorMainWindow::slotUpdateButtons
);
55 setCentralWidget(mMainWidget
);
60 mNetworkConfigurationManager
= new QNetworkConfigurationManager();
61 connect(mNetworkConfigurationManager
, &QNetworkConfigurationManager::onlineStateChanged
, this, &SieveEditorMainWindow::slotSystemNetworkOnlineStateChanged
);
63 connect(mMainWidget
->sieveEditorMainWidget()->tabWidget(), &QTabWidget::currentChanged
, this, &SieveEditorMainWindow::slotUpdateActions
);
64 connect(mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::modeEditorChanged
, this, &SieveEditorMainWindow::slotUpdateActions
);
65 slotSystemNetworkOnlineStateChanged(mNetworkConfigurationManager
->isOnline());
66 connect(mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::undoAvailable
, this, &SieveEditorMainWindow::slotUndoAvailable
);
67 connect(mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::redoAvailable
, this, &SieveEditorMainWindow::slotRedoAvailable
);
68 connect(mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::copyAvailable
, this, &SieveEditorMainWindow::slotCopyAvailable
);
72 SieveEditorMainWindow::~SieveEditorMainWindow()
74 KSharedConfig::Ptr config
= KSharedConfig::openConfig();
76 KConfigGroup group
= config
->group(QStringLiteral("SieveEditorMainWindow"));
77 group
.writeEntry("Size", size());
78 if (SieveEditorGlobalConfig::self()->closeWallet()) {
79 SieveServerSettings::self()->closeWallet();
83 void SieveEditorMainWindow::initStatusBar()
85 mStatusBarInfo
= new QLabel
;
86 statusBar()->insertWidget(0, mStatusBarInfo
, 4);
89 void SieveEditorMainWindow::slotSystemNetworkOnlineStateChanged(bool state
)
92 mStatusBarInfo
->setText(i18n("Network is Up."));
94 mStatusBarInfo
->setText(i18n("Network is Down."));
96 mMainWidget
->sieveEditorMainWidget()->setEnabled(state
);
100 void SieveEditorMainWindow::slotUpdateButtons(bool newScriptAction
, bool editScriptAction
, bool deleteScriptAction
, bool desactivateScriptAction
)
102 mDeleteScript
->setEnabled(deleteScriptAction
);
103 mNewScript
->setEnabled(newScriptAction
);
104 mEditScript
->setEnabled(editScriptAction
);
105 mDesactivateScript
->setEnabled(desactivateScriptAction
);
108 void SieveEditorMainWindow::readConfig()
110 KSharedConfig::Ptr config
= KSharedConfig::openConfig();
111 KConfigGroup group
= KConfigGroup(config
, "SieveEditorMainWindow");
112 const QSize sizeDialog
= group
.readEntry("Size", QSize(800, 600));
113 if (sizeDialog
.isValid()) {
118 void SieveEditorMainWindow::setupActions()
120 KActionCollection
*ac
= actionCollection();
122 KStandardAction::quit(this, SLOT(close()), ac
);
123 KStandardAction::preferences(this, SLOT(slotConfigure()), ac
);
125 mUploadScript
= KStandardAction::save(this, SLOT(slotUploadScript()), ac
);
126 mUploadScript
->setText(i18n("Upload"));
127 mUploadScript
->setEnabled(false);
129 QAction
*act
= ac
->addAction(QStringLiteral("add_server_sieve"), this, SLOT(slotAddServerSieve()));
130 act
->setText(i18n("Add Sieve Server..."));
132 mDeleteScript
= ac
->addAction(QStringLiteral("delete_script"), this, SLOT(slotDeleteScript()));
133 mDeleteScript
->setText(i18n("Delete Script"));
134 ac
->setDefaultShortcut(mDeleteScript
, QKeySequence(Qt::Key_Delete
));
135 mDeleteScript
->setEnabled(false);
137 mNewScript
= ac
->addAction(QStringLiteral("create_new_script"), this, SLOT(slotCreateNewScript()));
138 ac
->setDefaultShortcut(mNewScript
, QKeySequence(Qt::CTRL
+ Qt::Key_N
));
139 mNewScript
->setText(i18n("Create New Script..."));
140 mNewScript
->setEnabled(false);
142 mEditScript
= ac
->addAction(QStringLiteral("edit_script"), this, SLOT(slotEditScript()));
143 mEditScript
->setText(i18n("Edit Script..."));
144 mEditScript
->setEnabled(false);
146 mDesactivateScript
= ac
->addAction(QStringLiteral("desactivate_script"), this, SLOT(slotDesactivateScript()));
147 mDesactivateScript
->setText(i18n("Deactivate Script"));
148 mDesactivateScript
->setEnabled(false);
150 mRefreshList
= ac
->addAction(QStringLiteral("refresh_list"), this, SLOT(slotRefreshList()));
151 mRefreshList
->setText(i18n("Refresh List"));
152 mRefreshList
->setIcon(QIcon::fromTheme(QStringLiteral("view-refresh")));
153 ac
->setDefaultShortcut(mRefreshList
, QKeySequence(Qt::Key_F5
));
155 mGoToLine
= ac
->addAction(QStringLiteral("gotoline"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotGoToLine()));
156 mGoToLine
->setText(i18n("Go to Line..."));
157 mGoToLine
->setIcon(QIcon::fromTheme(QStringLiteral("go-jump")));
158 ac
->setDefaultShortcut(mGoToLine
, QKeySequence(Qt::CTRL
+ Qt::Key_G
));
159 mGoToLine
->setEnabled(false);
161 mFindAction
= KStandardAction::find(mMainWidget
->sieveEditorMainWidget(), SLOT(slotFind()), ac
);
162 mReplaceAction
= KStandardAction::replace(mMainWidget
->sieveEditorMainWidget(), SLOT(slotReplace()), ac
);
163 mUndoAction
= KStandardAction::undo(mMainWidget
->sieveEditorMainWidget(), SLOT(slotUndo()), ac
);
164 mRedoAction
= KStandardAction::redo(mMainWidget
->sieveEditorMainWidget(), SLOT(slotRedo()), ac
);
165 mCopyAction
= KStandardAction::copy(mMainWidget
->sieveEditorMainWidget(), SLOT(slotCopy()), ac
);
166 mPasteAction
= KStandardAction::paste(mMainWidget
->sieveEditorMainWidget(), SLOT(slotPaste()), ac
);
167 mCutAction
= KStandardAction::cut(mMainWidget
->sieveEditorMainWidget(), SLOT(slotCut()), ac
);
168 mSelectAllAction
= KStandardAction::selectAll(mMainWidget
->sieveEditorMainWidget(), SLOT(slotSelectAll()), ac
);
169 mSaveAsAction
= KStandardAction::saveAs(mMainWidget
->sieveEditorMainWidget(), SLOT(slotSaveAs()), ac
);
171 mImportAction
= ac
->addAction(QStringLiteral("import_script"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotImport()));
172 mImportAction
->setText(i18n("Import..."));
173 mImportAction
->setEnabled(false);
175 mShareAction
= ac
->addAction(QStringLiteral("share_script"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotShare()));
176 mShareAction
->setText(i18n("Share..."));
177 const QStringList overlays
= QStringList() << QStringLiteral("list-add");
178 mShareAction
->setIcon(QIcon(new KIconEngine(QStringLiteral("get-hot-new-stuff"), KIconLoader::global(), overlays
)));
179 mShareAction
->setEnabled(false);
181 mSpellCheckAction
= ac
->addAction(QStringLiteral("check_spelling"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotCheckSpelling()));
182 mSpellCheckAction
->setIcon(QIcon::fromTheme(QStringLiteral("tools-check-spelling")));
183 mSpellCheckAction
->setText(i18n("Check Spelling..."));
184 mSpellCheckAction
->setEnabled(false);
186 mCheckSyntaxAction
= ac
->addAction(QStringLiteral("check_syntax"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotCheckSyntax()));
187 mCheckSyntaxAction
->setText(i18n("Check Syntax"));
188 mCheckSyntaxAction
->setEnabled(false);
190 mAutoGenerateScriptAction
= ac
->addAction(QStringLiteral("autogenerate_script"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotAutoGenerateScript()));
191 mAutoGenerateScriptAction
->setText(i18n("Autogenerate Script..."));
192 mAutoGenerateScriptAction
->setEnabled(false);
194 mCommentAction
= ac
->addAction(QStringLiteral("comment_code"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotComment()));
195 ac
->setDefaultShortcut(mCommentAction
, Qt::CTRL
+ Qt::Key_D
);
196 mCommentAction
->setText(i18n("Comment"));
198 mUncommentAction
= ac
->addAction(QStringLiteral("uncomment_code"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotUncomment()));
199 ac
->setDefaultShortcut(mUncommentAction
, Qt::CTRL
+ Qt::SHIFT
+ Qt::Key_D
);
200 mUncommentAction
->setText(i18n("Uncomment"));
202 mZoomInAction
= new QAction(QIcon::fromTheme(QStringLiteral("zoom-in")), i18n("&Zoom In"), this);
203 ac
->addAction(QStringLiteral("zoom_in"), mZoomInAction
);
204 connect(mZoomInAction
, &QAction::triggered
, mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::slotZoomIn
);
205 ac
->setDefaultShortcut(mZoomInAction
, QKeySequence(Qt::CTRL
+ Qt::Key_Plus
));
207 mZoomOutAction
= new QAction(QIcon::fromTheme(QStringLiteral("zoom-out")), i18n("Zoom &Out"), this);
208 ac
->addAction(QStringLiteral("zoom_out"), mZoomOutAction
);
209 connect(mZoomOutAction
, &QAction::triggered
, mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::slotZoomOut
);
210 ac
->setDefaultShortcut(mZoomOutAction
, QKeySequence(Qt::CTRL
+ Qt::Key_Minus
));
212 mZoomResetAction
= ac
->addAction(QStringLiteral("zoom_reset"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotZoomReset()));
213 ac
->setDefaultShortcut(mZoomResetAction
, QKeySequence(Qt::CTRL
+ Qt::Key_0
));
214 mZoomResetAction
->setText(i18nc("Reset the zoom", "Reset"));
216 mMenuChangeCaseAction
= new PimCommon::KActionMenuChangeCase(this);
217 ac
->addAction(QStringLiteral("change_case_menu"), mMenuChangeCaseAction
);
218 mMenuChangeCaseAction
->appendInActionCollection(ac
);
219 connect(mMenuChangeCaseAction
, &PimCommon::KActionMenuChangeCase::upperCase
, mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::slotUpperCase
);
220 connect(mMenuChangeCaseAction
, &PimCommon::KActionMenuChangeCase::lowerCase
, mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::slotLowerCase
);
221 connect(mMenuChangeCaseAction
, &PimCommon::KActionMenuChangeCase::sentenceCase
, mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::slotSentenceCase
);
222 connect(mMenuChangeCaseAction
, &PimCommon::KActionMenuChangeCase::reverseCase
, mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::slotReverseCase
);
224 mBookmarkMenu
= new KActionMenu(i18nc("@title:menu", "&Bookmarks"), ac
);
225 mSieveEditorBookmarks
= new SieveEditorBookmarks(this, ac
, mBookmarkMenu
->menu(), this);
226 ac
->addAction(QStringLiteral("bookmark"), mBookmarkMenu
);
227 connect(mSieveEditorBookmarks
, &SieveEditorBookmarks::openUrl
, this, &SieveEditorMainWindow::slotOpenBookmarkUrl
);
229 mDebugSieveScriptAction
= ac
->addAction(QStringLiteral("debug_sieve"), mMainWidget
->sieveEditorMainWidget(), SLOT(slotDebugSieveScript()));
230 mDebugSieveScriptAction
->setText(i18n("Debug Sieve Script..."));
231 ac
->setDefaultShortcut(mDebugSieveScriptAction
, QKeySequence(Qt::SHIFT
+ Qt::ALT
+ Qt::Key_D
));
233 mWrapTextAction
= new QAction(i18n("Wordwarp"), this);
234 mWrapTextAction
->setCheckable(true);
235 ac
->addAction(QStringLiteral("wordwrap"), mWrapTextAction
);
236 connect(mWrapTextAction
, &QAction::triggered
, mMainWidget
->sieveEditorMainWidget(), &SieveEditorMainWidget::slotWordWrap
);
239 void SieveEditorMainWindow::slotRefreshList()
241 if (mNetworkConfigurationManager
->isOnline()) {
242 mMainWidget
->sieveEditorMainWidget()->refreshList();
246 void SieveEditorMainWindow::slotUploadScript()
248 mMainWidget
->sieveEditorMainWidget()->uploadScript();
251 void SieveEditorMainWindow::slotDesactivateScript()
253 mMainWidget
->sieveEditorMainWidget()->desactivateScript();
256 void SieveEditorMainWindow::slotEditScript()
258 mMainWidget
->sieveEditorMainWidget()->editScript();
261 void SieveEditorMainWindow::slotCreateNewScript()
263 mMainWidget
->sieveEditorMainWidget()->createNewScript();
266 void SieveEditorMainWindow::slotDeleteScript()
268 mMainWidget
->sieveEditorMainWidget()->deleteScript();
271 void SieveEditorMainWindow::closeEvent(QCloseEvent
*e
)
273 if (mMainWidget
->sieveEditorMainWidget()->needToSaveScript()) {
281 void SieveEditorMainWindow::slotConfigure()
283 QPointer
<SieveEditorConfigureDialog
> dlg
= new SieveEditorConfigureDialog(this);
285 dlg
->saveServerSieveConfig();
286 mMainWidget
->sieveEditorMainWidget()->updateServerList();
291 void SieveEditorMainWindow::slotAddServerSieve()
293 QPointer
<ServerSieveSettingsDialog
> dlg
= new ServerSieveSettingsDialog(this);
295 const SieveEditorUtil::SieveServerConfig conf
= dlg
->serverSieveConfig();
296 SieveEditorUtil::addServerSieveConfig(conf
);
297 mMainWidget
->sieveEditorMainWidget()->updateServerList();
302 void SieveEditorMainWindow::slotUpdateActions()
304 const bool hasPage
= (mMainWidget
->sieveEditorMainWidget()->tabWidget()->count() > 0);
305 mUploadScript
->setEnabled(hasPage
);
306 const bool editActionEnabled
= (hasPage
&& mMainWidget
->sieveEditorMainWidget()->pageMode() == KSieveUi::SieveEditorWidget::TextMode
);
307 mGoToLine
->setEnabled(editActionEnabled
);
308 mFindAction
->setEnabled(editActionEnabled
);
309 mReplaceAction
->setEnabled(editActionEnabled
);
310 mUndoAction
->setEnabled(editActionEnabled
&& mMainWidget
->sieveEditorMainWidget()->isUndoAvailable());
311 mRedoAction
->setEnabled(editActionEnabled
&& mMainWidget
->sieveEditorMainWidget()->isRedoAvailable());
313 mCopyAction
->setEnabled(editActionEnabled
&& mMainWidget
->sieveEditorMainWidget()->hasSelection());
314 mPasteAction
->setEnabled(editActionEnabled
);
315 mCutAction
->setEnabled(editActionEnabled
&& mMainWidget
->sieveEditorMainWidget()->hasSelection());
317 mSelectAllAction
->setEnabled(editActionEnabled
);
319 mUploadScript
->setEnabled(hasPage
&& !mNetworkIsDown
);
320 mRefreshList
->setEnabled(!mNetworkIsDown
);
321 mSaveAsAction
->setEnabled(hasPage
);
322 mImportAction
->setEnabled(hasPage
);
323 mShareAction
->setEnabled(hasPage
&& !mNetworkIsDown
);
324 mSpellCheckAction
->setEnabled(editActionEnabled
);
325 mCheckSyntaxAction
->setEnabled(editActionEnabled
&& !mNetworkIsDown
);
326 mAutoGenerateScriptAction
->setEnabled(editActionEnabled
);
327 mCommentAction
->setEnabled(editActionEnabled
);
328 mUncommentAction
->setEnabled(editActionEnabled
);
329 mMenuChangeCaseAction
->setEnabled(editActionEnabled
);
330 mZoomInAction
->setEnabled(editActionEnabled
);
331 mZoomOutAction
->setEnabled(editActionEnabled
);
332 mZoomResetAction
->setEnabled(editActionEnabled
);
334 mBookmarkMenu
->setEnabled(editActionEnabled
);
335 mDebugSieveScriptAction
->setEnabled(editActionEnabled
);
336 mWrapTextAction
->setEnabled(editActionEnabled
);
337 mWrapTextAction
->setChecked(mMainWidget
->sieveEditorMainWidget()->isWordWrap());
340 void SieveEditorMainWindow::slotUndoAvailable(bool b
)
342 const bool hasPage
= (mMainWidget
->sieveEditorMainWidget()->tabWidget()->count() > 0);
343 const bool editActionEnabled
= (hasPage
&& mMainWidget
->sieveEditorMainWidget()->pageMode() == KSieveUi::SieveEditorWidget::TextMode
);
344 mUndoAction
->setEnabled(editActionEnabled
&& b
);
347 void SieveEditorMainWindow::slotRedoAvailable(bool b
)
349 const bool hasPage
= (mMainWidget
->sieveEditorMainWidget()->tabWidget()->count() > 0);
350 const bool editActionEnabled
= (hasPage
&& mMainWidget
->sieveEditorMainWidget()->pageMode() == KSieveUi::SieveEditorWidget::TextMode
);
351 mRedoAction
->setEnabled(editActionEnabled
&& b
);
354 void SieveEditorMainWindow::slotCopyAvailable(bool b
)
356 const bool hasPage
= (mMainWidget
->sieveEditorMainWidget()->tabWidget()->count() > 0);
357 const bool editActionEnabled
= (hasPage
&& mMainWidget
->sieveEditorMainWidget()->pageMode() == KSieveUi::SieveEditorWidget::TextMode
);
358 mCopyAction
->setEnabled(editActionEnabled
&& b
);
359 mCutAction
->setEnabled(editActionEnabled
&& b
);
362 void SieveEditorMainWindow::slotOpenBookmarkUrl(const QUrl
&url
)
364 mMainWidget
->sieveEditorMainWidget()->openBookmarkUrl(url
);
367 QString
SieveEditorMainWindow::currentHelpTitle() const
369 return mMainWidget
->sieveEditorMainWidget()->currentHelpTitle();
372 QUrl
SieveEditorMainWindow::currentHelpUrl() const
374 return mMainWidget
->sieveEditorMainWidget()->currentHelpUrl();