1 /****************************************************************************************
2   Copyright (C) 2003 by Jeroen Wijnhout (Jeroen.Wijnhout@kdemail.net)
3             (C) 2007-2018 by Michel Ludwig (michel.ludwig@kdemail.net)
4             (C) 2007 Holger Danielsson (holger.danielsson@versanet.de)
5             (C) 2009 Thomas Braun (thomas.braun@virtuell-zuhause.de)
6  ****************************************************************************************/
7 
8 /***************************************************************************
9  *                                                                         *
10  *   This program is free software; you can redistribute it and/or modify  *
11  *   it under the terms of the GNU General Public License as published by  *
12  *   the Free Software Foundation; either version 2 of the License, or     *
13  *   (at your option) any later version.                                   *
14  *                                                                         *
15  ***************************************************************************/
16 
17 // 2007-03-12 dani
18 //  - use KileDocument::Extensions
19 
20 #include "kile.h"
21 
22 #include <config.h>
23 
24 #include <QAction>
25 #include <QHideEvent>
26 #include <QMenuBar>
27 #include <QPointer>
28 #include <QShowEvent>
29 #include <QSplashScreen>
30 #include <QStandardPaths>
31 #include <QStatusBar>
32 #include <QXmlStreamWriter>
33 
34 #include <KAboutApplicationDialog>
35 #include <KAboutData>
36 #include <KActionMenu>
37 #include <KConfigGroup>
38 #include <KEditToolBar>
39 #include <KHelpMenu>
40 #include <KIconLoader>
41 #include <KLocalizedString>
42 #include <KMessageBox>
43 #include <KRecentFilesAction>
44 #include <KRun>
45 #include <KShortcutsDialog>
46 #include <KToggleAction>
47 #include <KXMLGUIFactory>
48 #include <KXmlGuiWindow>
49 #include <KSelectAction>
50 #include <KWindowSystem>
51 
52 #include "abbreviationmanager.h"
53 #include "configurationmanager.h"
54 #include "documentinfo.h"
55 #include "errorhandler.h"
56 #include "kileactions.h"
57 #include "kiledebug.h"
58 #include "kilestdactions.h"
59 #include "widgets/statusbar.h"
60 #include "dialogs/configurationdialog.h"
61 #include "kileproject.h"
62 #include "widgets/projectview.h"
63 #include "dialogs/projectdialogs.h"
64 #include "kilelyxserver.h"
65 #include "dialogs/findfilesdialog.h"
66 #include "kiletool_enums.h"
67 #include "kiletool.h"
68 #include "kiletoolmanager.h"
69 #include "kilestdtools.h"
70 #include "widgets/outputview.h"
71 #include "widgets/konsolewidget.h"
72 #include "dialogs/quickdocumentdialog.h"
73 #include "dialogs/tabbingdialog.h"
74 #include "widgets/structurewidget.h"
75 #include "convert.h"
76 #include "dialogs/includegraphicsdialog.h"
77 #include "kiledocmanager.h"
78 #include "kileversion.h"
79 #include "kileviewmanager.h"
80 #include "kileconfig.h"
81 #include "dialogs/configcheckerdialog.h"
82 #include "widgets/sidebar.h"
83 #include "dialogs/floatdialog.h"
84 #include "dialogs/mathenvironmentdialog.h"
85 #include "dialogs/tabular/newtabulardialog.h"
86 #include "dialogs/postscriptdialog.h"
87 #include "dialogs/pdf-wizard/pdfdialog.h"
88 #include "latexcmd.h"
89 #include "mainadaptor.h"
90 #include "dialogs/statisticsdialog.h"
91 #include "widgets/scriptsmanagementwidget.h"
92 #include "scriptmanager.h"
93 #include "widgets/previewwidget.h"
94 #include "symbolviewclasses.h"
95 #include "livepreview.h"
96 #include "parser/parsermanager.h"
97 
98 #include "dialogs/usermenu/usermenudialog.h"
99 #include "usermenu/usermenudata.h"
100 #include "usermenu/usermenu.h"
101 #include "utilities.h"
102 
103 #define LOG_TAB     0
104 #define OUTPUT_TAB  1
105 #define KONSOLE_TAB 2
106 #define PREVIEW_TAB 3
107 
108 /*
109  * Class Kile.
110  */
111 
Kile(bool allowRestore,QWidget * parent)112 Kile::Kile(bool allowRestore, QWidget *parent)
113     : KParts::MainWindow(),
114       KileInfo(this),
115       m_toolsToolBar(Q_NULLPTR),       // we have to set all of these to null as the constructor
116       m_userHelpActionMenu(Q_NULLPTR), // might return early
117       m_bibTagSettings(Q_NULLPTR),
118       m_compilerActions(Q_NULLPTR),
119       m_viewActions(Q_NULLPTR),
120       m_convertActions(Q_NULLPTR),
121       m_quickActions(Q_NULLPTR),
122       m_bibTagActionMenu(Q_NULLPTR),
123       ModeAction(Q_NULLPTR),
124       WatchFileAction(Q_NULLPTR),
125       m_actionMessageView(Q_NULLPTR),
126       m_actRecentFiles(Q_NULLPTR),
127       m_pFullScreen(Q_NULLPTR),
128       m_sideBar(Q_NULLPTR),
129       m_kileAbbrevView(Q_NULLPTR),
130       m_topWidgetStack(Q_NULLPTR),
131       m_horizontalSplitter(Q_NULLPTR),
132       m_verticalSplitter(Q_NULLPTR),
133       m_toolBox(Q_NULLPTR),
134       m_commandViewToolBox(Q_NULLPTR),
135       m_symbolViewMFUS(Q_NULLPTR),
136       m_symbolViewRelation(Q_NULLPTR),
137       m_symbolViewArrows(Q_NULLPTR),
138       m_symbolViewMiscMath(Q_NULLPTR),
139       m_symbolViewMiscText(Q_NULLPTR),
140       m_symbolViewOperators(Q_NULLPTR),
141       m_symbolViewUser(Q_NULLPTR),
142       m_symbolViewDelimiters(Q_NULLPTR),
143       m_symbolViewGreek(Q_NULLPTR),
144       m_symbolViewSpecial(Q_NULLPTR),
145       m_symbolViewCyrillic(Q_NULLPTR),
146       m_commandView(Q_NULLPTR),
147       m_latexOutputErrorToolBar(Q_NULLPTR),
148       m_buildMenuTopLevel(Q_NULLPTR),
149       m_buildMenuCompile(Q_NULLPTR),
150       m_buildMenuConvert(Q_NULLPTR),
151       m_buildMenuViewer(Q_NULLPTR),
152       m_buildMenuOther(Q_NULLPTR),
153       m_buildMenuQuickPreview(Q_NULLPTR),
154       m_actRecentProjects(Q_NULLPTR),
155       m_lyxserver(Q_NULLPTR)
156 {
157     setObjectName("Kile");
158 
159     m_config = KSharedConfig::openConfig();
160 
161     setStandardToolBarMenuEnabled(true);
162 
163     m_singlemode = true;
164 
165     m_viewManager= new KileView::Manager(this, actionCollection(), parent, "KileView::Manager");
166     viewManager()->setClient(this);
167 
168     // fail gracefully if we cannot instantiate Okular part correctly
169     if(!m_viewManager->viewerPart()) {
170         return;
171     }
172 
173     QSplashScreen splashScreen(QPixmap(KileUtilities::locate(QStandardPaths::AppDataLocation, "pics/kile_splash.png")), Qt::WindowStaysOnTopHint);
174     if(KileConfig::showSplashScreen()) {
175         splashScreen.show();
176         qApp->processEvents();
177     }
178 
179     m_codeCompletionManager = new KileCodeCompletion::Manager(this, parent);
180 
181     // process events for correctly displaying the splash screen
182     qApp->processEvents();
183 
184     m_latexCommands = new KileDocument::LatexCommands(m_config.data(), this);  // at first (dani)
185     m_edit = new KileDocument::EditorExtension(this);
186     m_help = new KileHelp::Help(m_edit, this);
187     m_errorHandler = new KileErrorHandler(this, this, actionCollection());
188     m_quickPreview = new KileTool::QuickPreview(this);
189     m_extensions = new KileDocument::Extensions();
190     m_jScriptManager = new KileScript::Manager(this, m_config.data(), actionCollection(), parent, "KileScript::Manager");
191 
192     // do initializations first
193     m_bWatchFile = false;
194 
195     setStatusBar(new KileWidget::StatusBar(m_errorHandler, parent));
196 
197     // process events for correctly displaying the splash screen
198     qApp->processEvents();
199 
200     connect(viewManager(), &KileView::Manager::currentViewChanged, this, &Kile::newCaption);
201     connect(viewManager(), &KileView::Manager::currentViewChanged, this, [this](QWidget* view) { activateView(view); });
202     connect(viewManager(), &KileView::Manager::currentViewChanged, this, &Kile::updateModeStatus);
203     connect(viewManager(), &KileView::Manager::updateCaption, this, &Kile::newCaption);
204     connect(viewManager(), &KileView::Manager::updateModeStatus, this, &Kile::updateModeStatus);
205     connect(viewManager(), &KileView::Manager::cursorPositionChanged, this, &Kile::updateStatusBarCursorPosition);
206     connect(viewManager(), &KileView::Manager::viewModeChanged,
207             this, &Kile::updateStatusBarViewMode);
208     connect(viewManager(), &KileView::Manager::informationMessage,
209             this, &Kile::updateStatusBarInformationMessage);
210     connect(viewManager(), &KileView::Manager::selectionChanged,
211             this, &Kile::updateStatusBarSelection);
212 
213     connect(docManager(), &KileDocument::Manager::documentNameChanged, this, &Kile::newCaption);
214     connect(docManager(), &KileDocument::Manager::documentUrlChanged, this, &Kile::newCaption);
215     connect(docManager(), &KileDocument::Manager::documentReadWriteStateChanged, this, &Kile::newCaption);
216 
217     m_topWidgetStack = new QStackedWidget();
218     m_topWidgetStack->setFocusPolicy(Qt::NoFocus);
219 
220     m_horizontalSplitter = new QSplitter(Qt::Horizontal);
221 
222     setupSideBar();
223     m_horizontalSplitter->addWidget(m_sideBar);
224 
225     m_verticalSplitter = new QSplitter(Qt::Vertical);
226     m_horizontalSplitter->addWidget(m_verticalSplitter);
227     viewManager()->createTabs(m_verticalSplitter);
228 
229     connect(viewManager(), &KileView::Manager::activateView, this, &Kile::activateView);
230     connect(viewManager(), &KileView::Manager::startQuickPreview, this, &Kile::slotQuickPreview);
231 
232     connect(parserManager(), &KileParser::Manager::documentParsingStarted, this, &Kile::handleDocumentParsingStarted);
233     connect(parserManager(), &KileParser::Manager::documentParsingComplete, this, &Kile::handleDocumentParsingComplete);
234 
235     // process events for correctly displaying the splash screen
236     qApp->processEvents();
237 
238     setupBottomBar();
239     m_verticalSplitter->addWidget(m_bottomBar);
240     m_topWidgetStack->addWidget(m_horizontalSplitter);
241     setCentralWidget(m_topWidgetStack);
242 
243     // Parser manager and view manager must be created before the tool manager!
244     m_manager = new KileTool::Manager(this, m_config.data(), m_outputWidget, m_topWidgetStack, 10000, actionCollection()); //FIXME make timeout configurable
245     connect(m_manager, &KileTool::Manager::jumpToFirstError, m_errorHandler, &KileErrorHandler::jumpToFirstError);
246     connect(m_manager, &KileTool::Manager::previewDone, this, &Kile::focusPreview);
247 
248     m_latexOutputErrorToolBar->addAction(actionCollection()->action(QLatin1String("Stop")));
249     errorHandler()->setErrorHandlerToolBar(m_latexOutputErrorToolBar); // add the remaining actions to m_latexOutputErrorToolBar
250 
251     m_bottomBar->addExtraWidget(viewManager()->getViewerControlToolBar());
252 
253     m_livePreviewManager = new KileTool::LivePreviewManager(this, actionCollection());
254     connect(this, &Kile::masterDocumentChanged, m_livePreviewManager, &KileTool::LivePreviewManager::handleMasterDocumentChanged);
255 
256     m_toolFactory = new KileTool::Factory(m_manager, m_config.data(), actionCollection());
257     m_manager->setFactory(m_toolFactory);
258 
259     setupGraphicTools();
260     setupPreviewTools();
261     setupActions();
262 
263     initSelectActions();
264 
265     newCaption();
266 
267     m_help->setUserhelp(m_manager, m_userHelpActionMenu);     // kile user help (dani)
268 
269     // process events for correctly displaying the splash screen
270     qApp->processEvents();
271     connect(docManager(), &KileDocument::Manager::updateModeStatus, this, &Kile::updateModeStatus);
272     connect(docManager(), &KileDocument::Manager::updateStructure, viewManager(), &KileView::Manager::updateStructure);
273     connect(docManager(), &KileDocument::Manager::closingDocument,
274             m_kwStructure, &KileWidget::StructureWidget::closeDocumentInfo);
275     connect(docManager(), &KileDocument::Manager::documentInfoCreated,
276             m_kwStructure, &KileWidget::StructureWidget::addDocumentInfo);
277     connect(docManager(), &KileDocument::Manager::updateReferences,
278             m_kwStructure, &KileWidget::StructureWidget::updateReferences);
279     connect(docManager(), &KileDocument::Manager::documentModificationStatusChanged,
280             viewManager(), &KileView::Manager::reflectDocumentModificationStatus);
281 
282     if(KileConfig::rCVersion() < 8) {
283         transformOldUserSettings();
284         transformOldUserTags();
285 
286         // before Kile 2.1 shortcuts were stored in a "Shortcuts" group inside
287         // Kile's configuration file, but this led to problems with the way of how shortcuts
288         // are generally stored in kdelibs; we now delete the "Shortcuts" group if it
289         // still present in Kile's configuration file.
290         if(m_config->hasGroup("Shortcuts")) {
291             KConfigGroup shortcutGroup = m_config->group("Shortcuts");
292             actionCollection()->readSettings(&shortcutGroup);
293             m_config->deleteGroup("Shortcuts");
294         }
295 
296         if(m_config->hasGroup("Complete")) {
297             KConfigGroup completionGroup = m_config->group("Complete");
298             completionGroup.deleteEntry("maxCwlFiles"); // in Kile 3.0 the UI has been changed so that this setting is no longer
299             // needed
300         }
301     }
302     readGUISettings();
303     readRecentFileSettings();
304     readConfig();
305 
306     createToolActions(); // this creates the actions for the tools and user tags, which is required before 'activePartGUI' is called
307 
308     setupGUI(KXmlGuiWindow::StatusBar | KXmlGuiWindow::Save, "kileui.rc");
309     createShellGUI(true); // do not call guiFactory()->refreshActionProperties() after this! (bug 314580)
310 
311     m_userMenu = new KileMenu::UserMenu(this, this);
312     connect(m_userMenu, &KileMenu::UserMenu::sendText, this, static_cast<void (Kile::*)(const QString &)>(&Kile::insertText));
313     connect(m_userMenu, &KileMenu::UserMenu::updateStatus, this, &Kile::slotUpdateUserMenuStatus);
314 
315     updateUserDefinedMenus();
316 
317     // we can only do this here after the main GUI has been set up
318     {
319         guiFactory()->addClient(viewManager()->viewerPart());
320 
321         QMenu *documentViewerMenu = static_cast<QMenu*>(guiFactory()->container("menu_document_viewer", this));
322         QMenu *popup = static_cast<QMenu*>(guiFactory()->container("menu_okular_part_viewer", viewManager()->viewerPart()));
323         if(documentViewerMenu && popup) {
324             // we populate our menu with the actions from the part's menu
325             documentViewerMenu->addActions(popup->actions());
326             documentViewerMenu->setEnabled(false);
327             connect(viewManager()->viewerPart(), SIGNAL(viewerMenuStateChange(bool)), documentViewerMenu, SLOT(setEnabled(bool)));
328         }
329         else {
330             if(documentViewerMenu) {
331                 documentViewerMenu->setVisible(false);
332             }
333             delete popup;
334         }
335     }
336 
337     resize(KileConfig::mainwindowWidth(), KileConfig::mainwindowHeight());
338     applyMainWindowSettings(m_config->group("KileMainWindow"));
339 
340     restoreLastSelectedAction(); // don't call this inside 'setupTools' as it is not compatible with KParts switching!
341     QList<int> sizes;
342     int verSplitTop = KileConfig::verticalSplitterTop();
343     int verSplitBottom = KileConfig::verticalSplitterBottom();
344     sizes << verSplitTop << verSplitBottom;
345     m_verticalSplitter->setSizes(sizes);
346     sizes.clear();
347     int horSplitLeft = KileConfig::horizontalSplitterLeft();
348     int horSplitRight = KileConfig::horizontalSplitterRight();
349     if(horSplitLeft <= 0 && horSplitRight <= 0) { // compute default values
350         horSplitLeft = m_sideBar->width();
351         horSplitRight = width() / 2; // leave some room for the viewer part
352     }
353     // the size of the third widget is computed from the sizes of the two other widgets
354     sizes << horSplitLeft << horSplitRight << width() - (horSplitLeft + horSplitRight);
355     m_horizontalSplitter->setSizes(sizes);
356 
357     show();
358     if(KileConfig::showSplashScreen()) {
359         splashScreen.finish(this);
360     }
361 
362     // Due to 'processEvents' being called earlier we only create the DBUS adaptor and
363     // the LyX server when all of Kile's structures have been set up.
364     // publish the D-Bus interfaces
365     new MainAdaptor(this);
366     QDBusConnection dbus = QDBusConnection::sessionBus();
367     dbus.registerObject("/main", this);
368     dbus.registerService("net.sourceforge.kile"); // register under a constant name
369 
370     m_lyxserver = new KileLyxServer(KileConfig::runLyxServer());
371     connect(m_lyxserver, &KileLyxServer::insert, this, [this](const KileAction::TagData &data) { insertTag(data); });
372 
373     if(m_listUserTools.count() > 0) {
374         KMessageBox::information(0, i18n("You have defined some tools in the User menu. From now on these tools will be available from the Build->Other menu and can be configured in the configuration dialog (go to the Settings menu and choose Configure Kile). This has some advantages; your own tools can now be used in a QuickBuild command if you wish."), i18n("User Tools Detected"));
375         m_listUserTools.clear();
376     }
377 
378     if(KileConfig::rCVersion() < 8) {
379         // if KileConfig::rCVersion() <= 0, then 'kilerc' is (most likely) fresh or empty,
380         // otherwise, we have to ask the user if she wants to reset the tools
381         if ((KileConfig::rCVersion() <= 0) || (KMessageBox::questionYesNo(mainWindow(),
382                                                i18n("<p>The tool settings need to be reset for this version of Kile to function properly.<br/>"
383                                                        "This will overwrite any changes you have made.</p>"
384                                                        "<p>Do you want to reset the tools now?</p>"),
385                                                i18n("Tools need to be reset"))  == KMessageBox::Yes)) {
386             m_toolFactory->resetToolConfigurations();
387         }
388     }
389 
390     restoreFilesAndProjects(allowRestore);
391     initMenu();
392     updateModeStatus();
393 
394     // finally init all actions for the ScriptManager
395     m_jScriptManager->initScriptActions();
396 
397     setUpdatesEnabled(false);
398     setAutoSaveSettings(QLatin1String("KileMainWindow"),true);
399 
400     m_userMenu->refreshActionProperties();
401     setUpdatesEnabled(true);
402 
403     // finally, we check whether the system check assistant should be run, which is important for
404     // version 3.0 regarding the newly introduced live preview feature
405     const QString& lastVersionRunFor = KileConfig::systemCheckLastVersionRunForAtStartUp();
406     if(lastVersionRunFor.isEmpty() || compareVersionStrings(lastVersionRunFor, "2.9.91") < 0) {
407         slotPerformCheck();
408         KileConfig::setSystemCheckLastVersionRunForAtStartUp(kileFullVersion);
409     }
410 
411     if(m_livePreviewManager) {
412         m_livePreviewManager->buildLivePreviewMenu(m_config.data());
413         m_livePreviewManager->disableBootUpMode();
414     }
415 }
416 
~Kile()417 Kile::~Kile()
418 {
419     KILE_DEBUG_MAIN << "cleaning up..." << endl;
420 
421     guiFactory()->removeClient(viewManager()->viewerPart());
422 
423     delete m_userMenu;
424     delete m_livePreviewManager;
425     delete m_toolFactory;
426     delete m_manager;
427     delete m_quickPreview;
428     delete m_edit;
429     delete m_help;
430     delete m_lyxserver; //QObject without parent, have to delete it ourselves
431     delete m_latexCommands;
432     delete m_extensions;
433     delete m_viewManager;
434 }
435 
436 // currently not usable due to https://bugs.kde.org/show_bug.cgi?id=194732
437 // void Kile::plugActionList(const QString& name, const QList<QAction*>& actionList)
438 // {
439 // 	plugActionList(name, actionList);
440 // }
441 //
442 // void Kile::unplugActionList(const QString& name)
443 // {
444 // 	unplugActionList(name);
445 // }
446 
setupSideBar()447 void Kile::setupSideBar()
448 {
449     m_sideBar = new KileWidget::SideBar(m_horizontalSplitter);
450 
451     m_fileBrowserWidget = new KileWidget::FileBrowserWidget(m_extensions, m_sideBar);
452     m_sideBar->addPage(m_fileBrowserWidget, QIcon::fromTheme("document-open"), i18n("Open File"));
453     connect(m_fileBrowserWidget, &KileWidget::FileBrowserWidget::fileSelected,
454             docManager(), [this](const KFileItem& item) { docManager()->fileSelected(item); });
455 
456     setupProjectView();
457     setupStructureView();
458     setupSymbolViews();
459     setupScriptsManagementView();
460     setupCommandViewToolbox();
461     setupAbbreviationView();
462 
463     m_sideBar->switchToTab(KileConfig::selectedLeftView());
464     m_sideBar->setVisible(KileConfig::sideBar());
465     m_sideBar->setDirectionalSize(KileConfig::sideBarSize());
466 }
467 
setupProjectView()468 void Kile::setupProjectView()
469 {
470     KileWidget::ProjectView *projectView = new KileWidget::ProjectView(m_sideBar, this);
471 // 	viewManager()->setProjectView(projectView);
472     m_sideBar->addPage(projectView, QIcon::fromTheme("relation"), i18n("Files and Projects"));
473     connect(projectView, QOverload<const KileProjectItem*>::of(&KileWidget::ProjectView::fileSelected),
474             docManager(), QOverload<const KileProjectItem*>::of(&KileDocument::Manager::fileSelected));
475 
476     connect(projectView, QOverload<const QUrl&>::of(&KileWidget::ProjectView::fileSelected),
477             docManager(), QOverload<const QUrl&>::of(&KileDocument::Manager::fileSelected));
478 
479     connect(projectView, &KileWidget::ProjectView::closeURL,
480             docManager(), [this](const QUrl& url) { docManager()->fileClose(url); });
481 
482     connect(projectView, &KileWidget::ProjectView::closeProject,
483             docManager(), [this](const QUrl& url) { docManager()->projectClose(url); });
484 
485     connect(projectView, &KileWidget::ProjectView::projectOptions,
486             docManager(), [this](const QUrl& url) { docManager()->projectOptions(url); });
487 
488     connect(projectView, &KileWidget::ProjectView::projectArchive,
489             this, [this](const QUrl& url) { runArchiveTool(url); });
490 
491     connect(projectView, &KileWidget::ProjectView::removeFromProject,
492             docManager(), &KileDocument::Manager::removeFromProject);
493 
494     connect(projectView, &KileWidget::ProjectView::addFiles,
495             docManager(), [this](const QUrl &url) { docManager()->projectAddFiles(url); });
496 
497     connect(projectView, &KileWidget::ProjectView::openAllFiles,
498             docManager(), [this](const QUrl &url) { docManager()->projectOpenAllFiles(url); });
499 
500     connect(projectView, &KileWidget::ProjectView::toggleArchive,
501             docManager(), &KileDocument::Manager::toggleArchive);
502 
503     connect(projectView, &KileWidget::ProjectView::addToProject,
504             docManager(), [this](const QUrl &url) { docManager()->addToProject(url); });
505 
506     connect(projectView, &KileWidget::ProjectView::saveURL,
507             docManager(), &KileDocument::Manager::saveURL);
508 
509     connect(projectView, &KileWidget::ProjectView::buildProjectTree,
510             docManager(), [this](const QUrl &url) { docManager()->buildProjectTree(url); });
511 
512     connect(docManager(), &KileDocument::Manager::projectTreeChanged,
513             projectView, &KileWidget::ProjectView::refreshProjectTree);
514 
515     connect(docManager(), QOverload<const QUrl&>::of(&KileDocument::Manager::removeFromProjectView),
516             projectView, QOverload<const QUrl&>::of(&KileWidget::ProjectView::remove));
517 
518     connect(docManager(), QOverload<const KileProject*>::of(&KileDocument::Manager::removeFromProjectView),
519             projectView, QOverload<const KileProject*>::of(&KileWidget::ProjectView::remove));
520 
521     connect(docManager(), QOverload<const QUrl&>::of(&KileDocument::Manager::addToProjectView),
522             projectView, QOverload<const QUrl&>::of(&KileWidget::ProjectView::add));
523 
524     connect(docManager(), QOverload<const KileProject*>::of(&KileDocument::Manager::addToProjectView),
525             projectView, QOverload<const KileProject*>::of(&KileWidget::ProjectView::add));
526 
527     connect(docManager(), &KileDocument::Manager::removeItemFromProjectView,
528             projectView, &KileWidget::ProjectView::removeItem);
529 
530     connect(docManager(), QOverload<KileProjectItem*>::of(&KileDocument::Manager::addToProjectView),
531             projectView, [projectView](KileProjectItem *item) { projectView->add(item); });
532 }
533 
setupStructureView()534 void Kile::setupStructureView()
535 {
536     m_kwStructure = new KileWidget::StructureWidget(this, m_sideBar);
537     m_sideBar->addPage(m_kwStructure, QIcon::fromTheme("view-list-tree"), i18n("Structure"));
538     m_kwStructure->setFocusPolicy(Qt::ClickFocus);
539     connect(configurationManager(), &KileConfiguration::Manager::configChanged,
540             m_kwStructure, &KileWidget::StructureWidget::configChanged);
541 
542     connect(m_kwStructure, &KileWidget::StructureWidget::setCursor, this, &Kile::setCursor);
543 
544     connect(m_kwStructure, &KileWidget::StructureWidget::fileOpen,
545             docManager(), [this](const QUrl &url, const QString &encoding) { docManager()->fileOpen(url, encoding); });
546 
547     connect(m_kwStructure, &KileWidget::StructureWidget::fileNew,
548             docManager(), [this](const QUrl &url) { docManager()->fileNew(url); });
549 
550     connect(m_kwStructure, &KileWidget::StructureWidget::sendText,
551             this, [this](const QString &text) { insertText(text); });
552 
553     connect(m_kwStructure, &KileWidget::StructureWidget::sectioningPopup,
554             m_edit, &KileDocument::EditorExtension::sectioningCommand);
555 }
556 
setupScriptsManagementView()557 void Kile::setupScriptsManagementView()
558 {
559     m_scriptsManagementWidget = new KileWidget::ScriptsManagement(this, m_sideBar);
560     m_sideBar->addPage(m_scriptsManagementWidget, QIcon::fromTheme("preferences-plugin-script"), i18n("Scripts"));
561 }
562 
enableSymbolViewMFUS()563 void Kile::enableSymbolViewMFUS()
564 {
565     m_toolBox->setItemEnabled(m_toolBox->indexOf(m_symbolViewMFUS),true);
566 
567     connect(m_symbolViewRelation, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
568     connect(m_symbolViewOperators, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
569     connect(m_symbolViewArrows, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
570     connect(m_symbolViewMiscMath, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
571     connect(m_symbolViewMiscText, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
572     connect(m_symbolViewDelimiters, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
573     connect(m_symbolViewGreek, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
574     connect(m_symbolViewSpecial, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
575     connect(m_symbolViewCyrillic, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
576     connect(m_symbolViewUser, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
577 }
578 
disableSymbolViewMFUS()579 void Kile::disableSymbolViewMFUS()
580 {
581     m_toolBox->setItemEnabled(m_toolBox->indexOf(m_symbolViewMFUS),false);
582     m_toolBox->setItemToolTip(m_toolBox->indexOf(m_symbolViewMFUS),QString());
583 
584     disconnect(m_symbolViewRelation, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
585     disconnect(m_symbolViewOperators, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
586     disconnect(m_symbolViewArrows, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
587     disconnect(m_symbolViewMiscMath, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
588     disconnect(m_symbolViewMiscText, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
589     disconnect(m_symbolViewDelimiters, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
590     disconnect(m_symbolViewGreek, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
591     disconnect(m_symbolViewSpecial, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
592     disconnect(m_symbolViewCyrillic, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
593     disconnect(m_symbolViewUser, &KileWidget::SymbolView::addToList, m_symbolViewMFUS, &KileWidget::SymbolView::slotAddToList);
594 }
595 
setupSymbolViews()596 void Kile::setupSymbolViews()
597 {
598     m_toolBox = new QToolBox(m_sideBar);
599     m_sideBar->addPage(m_toolBox,QIcon::fromTheme("math0"),i18n("Symbols"));
600 
601     m_symbolViewMFUS = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::MFUS);
602     m_toolBox->addItem(m_symbolViewMFUS,i18n("Most Frequently Used"));
603     m_toolBox->setItemEnabled(m_toolBox->indexOf(m_symbolViewMFUS),false);
604     connect(m_symbolViewMFUS, &KileWidget::SymbolView::insertText,
605             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
606 
607     m_symbolViewRelation = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::Relation);
608     m_toolBox->addItem(m_symbolViewRelation,QIcon::fromTheme("math1"),i18n("Relation"));
609     connect(m_symbolViewRelation, &KileWidget::SymbolView::insertText,
610             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
611 
612     m_symbolViewOperators = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::Operator);
613     m_toolBox->addItem(m_symbolViewOperators,QIcon::fromTheme("math2"),i18n("Operators"));
614     connect(m_symbolViewOperators, &KileWidget::SymbolView::insertText,
615             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
616 
617     m_symbolViewArrows = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::Arrow);
618     m_toolBox->addItem(m_symbolViewArrows,QIcon::fromTheme("math3"),i18n("Arrows"));
619     connect(m_symbolViewArrows, &KileWidget::SymbolView::insertText,
620             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
621 
622     m_symbolViewMiscMath = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::MiscMath);
623     m_toolBox->addItem(m_symbolViewMiscMath,QIcon::fromTheme("math4"),i18n("Miscellaneous Math"));
624     connect(m_symbolViewMiscMath, &KileWidget::SymbolView::insertText,
625             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
626 
627     m_symbolViewMiscText = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::MiscText);
628     m_toolBox->addItem(m_symbolViewMiscText,QIcon::fromTheme("math5"),i18n("Miscellaneous Text"));
629     connect(m_symbolViewMiscText, &KileWidget::SymbolView::insertText,
630             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
631 
632     m_symbolViewDelimiters= new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::Delimiters);
633     m_toolBox->addItem(m_symbolViewDelimiters,QIcon::fromTheme("math6"),i18n("Delimiters"));
634     connect(m_symbolViewDelimiters, &KileWidget::SymbolView::insertText,
635             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
636 
637     m_symbolViewGreek = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::Greek);
638     m_toolBox->addItem(m_symbolViewGreek,QIcon::fromTheme("math7"),i18n("Greek"));
639     connect(m_symbolViewGreek, &KileWidget::SymbolView::insertText,
640             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
641 
642     m_symbolViewSpecial = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::Special);
643     m_toolBox->addItem(m_symbolViewSpecial,QIcon::fromTheme("math8"),i18n("Special Characters"));
644     connect(m_symbolViewSpecial, &KileWidget::SymbolView::insertText,
645             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
646 
647     m_symbolViewCyrillic = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::Cyrillic);
648     m_toolBox->addItem(m_symbolViewCyrillic,QIcon::fromTheme("math10"),i18n("Cyrillic Characters"));
649     connect(m_symbolViewCyrillic, &KileWidget::SymbolView::insertText,
650             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
651 
652     m_symbolViewUser = new KileWidget::SymbolView(this, m_toolBox, KileWidget::SymbolView::User);
653     m_toolBox->addItem(m_symbolViewUser,QIcon::fromTheme("math9"),i18n("User Defined"));
654     connect(m_symbolViewUser, &KileWidget::SymbolView::insertText,
655             this, static_cast<void (Kile::*)(const QString&, const QList<Package>&)>(&Kile::insertText));
656 
657     for(int i = 0; i < m_toolBox->count(); ++i) {
658         m_toolBox->setItemToolTip(i, i18n("<p>Move the mouse over the icons to see the corresponding LaTeX commands.<br/>"
659                                           "Click on an image to insert the corresponding command, additionally pressing \"Shift\" inserts "
660                                           "it in math mode, pressing \"Ctrl\" in curly brackets.</p>"));
661     }
662 }
663 
setupCommandViewToolbox()664 void Kile::setupCommandViewToolbox()
665 {
666     m_commandViewToolBox = new KileWidget::CommandViewToolBox(this, m_sideBar);
667     m_sideBar->addPage(m_commandViewToolBox, QIcon::fromTheme("texlion"), i18n("LaTeX"));
668 
669     connect(m_commandViewToolBox, &KileWidget::CommandViewToolBox::sendText,
670             this, QOverload<const QString&>::of(&Kile::insertText));
671 }
672 
setupAbbreviationView()673 void Kile::setupAbbreviationView()
674 {
675     m_kileAbbrevView = new KileWidget::AbbreviationView(abbreviationManager(), m_sideBar);
676     connect(abbreviationManager(), &KileAbbreviation::Manager::abbreviationsChanged,
677             m_kileAbbrevView, &KileWidget::AbbreviationView::updateAbbreviations);
678     m_sideBar->addPage(m_kileAbbrevView, QIcon::fromTheme("complete3"), i18n("Abbreviation"));
679 
680     connect(m_kileAbbrevView, &KileWidget::AbbreviationView::sendText,
681             this, QOverload<const QString&>::of(&Kile::insertText));
682 }
683 
setupBottomBar()684 void Kile::setupBottomBar()
685 {
686     m_bottomBar = new KileWidget::BottomBar(this);
687     m_bottomBar->setFocusPolicy(Qt::ClickFocus);
688 
689     connect(errorHandler(), &KileErrorHandler::showingErrorMessage, this, &Kile::focusLog);
690 
691     QWidget *widget = new QWidget(this);
692     QHBoxLayout *layout = new QHBoxLayout(widget);
693     layout->setMargin(0);
694     widget->setLayout(layout);
695 
696     m_latexOutputErrorToolBar = new KToolBar(widget);
697     m_latexOutputErrorToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
698     m_latexOutputErrorToolBar->setIconDimensions(KIconLoader::SizeSmall);
699     m_latexOutputErrorToolBar->setOrientation(Qt::Vertical);
700 
701     layout->addWidget(errorHandler()->outputWidget());
702     layout->addWidget(m_latexOutputErrorToolBar);
703     m_bottomBar->addPage(widget, QIcon::fromTheme("utilities-log-viewer"), i18n("Log and Messages"));
704 
705     m_outputWidget = new KileWidget::OutputView(this);
706     m_outputWidget->setFocusPolicy(Qt::ClickFocus);
707     m_outputWidget->setMinimumHeight(40);
708     m_outputWidget->setReadOnly(true);
709     m_bottomBar->addPage(m_outputWidget, QIcon::fromTheme("output_win"), i18n("Output"));
710 
711     m_texKonsole = new KileWidget::Konsole(this, this);
712     m_bottomBar->addPage(m_texKonsole, QIcon::fromTheme("utilities-terminal"),i18n("Konsole"));
713     connect(viewManager(), static_cast<void (KileView::Manager::*)(QWidget*)>(&KileView::Manager::currentViewChanged),
714             m_texKonsole, static_cast<void (KileWidget::Konsole::*)(void)>(&KileWidget::Konsole::sync));
715 
716     m_previewWidget = new KileWidget::PreviewWidget(this, m_bottomBar);
717     m_bottomBar->addPage(m_previewWidget, QIcon::fromTheme ("document-preview"), i18n ("Preview"));
718 
719     m_bottomBar->setVisible(true);
720     m_bottomBar->switchToTab(KileConfig::bottomBarIndex());
721     m_bottomBar->setDirectionalSize(KileConfig::bottomBarSize());
722 }
723 
setupGraphicTools()724 void Kile::setupGraphicTools()
725 {
726     KileConfig::setImagemagick(!(QStandardPaths::findExecutable("identify").isNull()));
727 }
728 
setupPreviewTools()729 void Kile::setupPreviewTools()
730 {
731     // search for tools
732     bool dvipng = !(QStandardPaths::findExecutable("dvipng").isNull());
733     bool convert = !(QStandardPaths::findExecutable("convert").isNull());
734 
735     KileConfig::setDvipng(dvipng);
736     KileConfig::setConvert(convert);
737 
738     // disable some previews, if tools are missing
739     if ( ! dvipng )
740     {
741         KileConfig::setMathgroupPreviewInWidget(false);  // no mathgroup preview in bottom bar
742         if ( ! convert )
743         {
744             KileConfig::setEnvPreviewInWidget(false);     // no preview in bottom bar at all
745             KileConfig::setSelPreviewInWidget(false);
746         }
747     }
748 }
749 
750 template<class ContextType, class Func>
createAction(const QString & text,const QString & actionName,const QString & iconName,const QKeySequence & shortcut,const ContextType * context,Func function)751 QAction* Kile::createAction(const QString &text, const QString &actionName, const QString& iconName, const QKeySequence& shortcut,
752                             const ContextType* context, Func function)
753 {
754     QAction *action = new QAction(this);
755     action->setText(text);
756 
757     connect(action, &QAction::triggered, context, function);
758     actionCollection()->addAction(actionName, action);
759 
760     if(!shortcut.isEmpty()) {
761         actionCollection()->setDefaultShortcut(action, shortcut);
762     }
763     if(!iconName.isEmpty()) {
764         action->setIcon(QIcon::fromTheme(iconName));
765     }
766 
767     return action;
768 }
769 
770 template<class ContextType, class Func>
createAction(KStandardAction::StandardAction actionType,const QString & actionName,const ContextType * context,Func function)771 QAction* Kile::createAction(KStandardAction::StandardAction actionType, const QString &actionName, const ContextType* context, Func function)
772 {
773     QAction *action = KStandardAction::create(actionType, context, function, this);
774     if(!actionName.isEmpty()) {
775         action->setObjectName(actionName);
776     }
777     actionCollection()->addAction(actionName, action);
778 
779     return action;
780 }
781 
setupActions()782 void Kile::setupActions()
783 {
784     QAction *act;
785 
786     createAction(KStandardAction::New, "file_new", docManager(), [this]() { docManager()->fileNew(); });
787     createAction(KStandardAction::Open, "file_open", docManager(), [this]() { docManager()->fileOpen(); });
788 
789     m_actRecentFiles = KStandardAction::openRecent(docManager(), [this](const QUrl& url) { docManager()->fileOpen(url); }, this);
790     m_actRecentFiles->setObjectName("file_open_recent");
791     actionCollection()->addAction("file_open_recent", m_actRecentFiles);
792     connect(docManager(), &KileDocument::Manager::addToRecentFiles, this, &Kile::addRecentFile);
793     m_actRecentFiles->loadEntries(m_config->group("Recent Files"));
794 
795     createAction(i18n("Save All"), "file_save_all", "document-save-all", docManager(), &KileDocument::Manager::fileSaveAll);
796 
797     createAction(i18n("Create Template From Document..."), "template_create", docManager(), &KileDocument::Manager::createTemplate);
798     createAction(i18n("&Remove Template..."), "template_remove", docManager(), &KileDocument::Manager::removeTemplate);
799     createAction(KStandardAction::Close, "file_close", docManager(), [this]() { docManager()->fileClose();} );
800     createAction(i18n("Close All"), "file_close_all", docManager(), &KileDocument::Manager::fileCloseAll);
801     createAction(i18n("Close All Ot&hers"), "file_close_all_others", docManager(), [this]() { docManager()->fileCloseAllOthers(); });
802     createAction(i18n("S&tatistics"), "Statistics", this, [this]() { showDocInfo(); });
803     createAction(i18n("&ASCII"), "file_export_ascii", this, [this]() { convertToASCII(); });
804     createAction(i18n("Latin-&1 (iso 8859-1)"), "file_export_latin1", this, [this]() { convertToEnc(); });
805     createAction(i18n("Latin-&2 (iso 8859-2)"), "file_export_latin2", this, [this]() { convertToEnc(); });
806     createAction(i18n("Latin-&3 (iso 8859-3)"), "file_export_latin3", this, [this]() { convertToEnc(); });
807     createAction(i18n("Latin-&4 (iso 8859-4)"), "file_export_latin4", this, [this]() { convertToEnc(); });
808     createAction(i18n("Latin-&5 (iso 8859-5)"), "file_export_latin5", this, [this]() { convertToEnc(); });
809     createAction(i18n("Latin-&9 (iso 8859-9)"), "file_export_latin9", this, [this]() { convertToEnc(); });
810     createAction(i18n("&Central European (cp-1250)"), "file_export_cp1250", this, [this]() { convertToEnc(); });
811     createAction(i18n("&Western European (cp-1252)"), "file_export_cp1252", this, [this]() { convertToEnc(); });
812     createAction(KStandardAction::Quit, "file_quit", this, &Kile::close);
813 
814     createAction(i18n("Move Tab Left"), "move_view_tab_left", "arrow-left", viewManager(), [this]() { viewManager()->moveTabLeft(); });
815     createAction(i18n("Move Tab Right"), "move_view_tab_right", "arrow-right", viewManager(), [this]() { viewManager()->moveTabRight(); });
816 
817     createAction(i18n("Next section"), "edit_next_section", "nextsection", QKeySequence(Qt::ALT + Qt::Key_Down),
818                  m_edit, &KileDocument::EditorExtension::gotoNextSectioning);
819     createAction(i18n("Prev section"), "edit_prev_section", "prevsection", QKeySequence(Qt::ALT + Qt::Key_Up),
820                  m_edit, &KileDocument::EditorExtension::gotoPrevSectioning);
821     createAction(i18n("Next paragraph"), "edit_next_paragraph", "nextparagraph", QKeySequence(Qt::ALT + Qt::SHIFT + Qt::Key_Down),
822                  m_edit, [this]() { m_edit->gotoNextParagraph(); });
823     createAction(i18n("Prev paragraph"), "edit_prev_paragraph", "prevparagraph", QKeySequence(Qt::ALT + Qt::SHIFT + Qt::Key_Up),
824                  m_edit, [this]() { m_edit->gotoPrevParagraph(); });
825 
826     createAction(i18n("Find &in Files..."), "FindInFiles", "filegrep", this, &Kile::findInFiles);
827 
828     createAction(i18n("Refresh Str&ucture"), "RefreshStructure", "refreshstructure", QKeySequence(Qt::Key_F12), this, &Kile::refreshStructure);
829 
830     //project actions
831     createAction(i18n("&New Project..."), "project_new", "window-new", docManager(), &KileDocument::Manager::projectNew);
832     createAction(i18n("&Open Project..."), "project_open", "project-open", docManager(), [this]() { docManager()->projectOpen(); });
833 
834     m_actRecentProjects = new KRecentFilesAction(i18n("Open &Recent Project"), actionCollection());
835     actionCollection()->addAction("project_openrecent", m_actRecentProjects);
836     connect(m_actRecentProjects, &KRecentFilesAction::urlSelected, docManager(), [this](const QUrl& url) { docManager()->projectOpen(url); });
837     connect(docManager(), &KileDocument::Manager::removeFromRecentProjects, this, &Kile::removeRecentProject);
838     connect(docManager(), &KileDocument::Manager::addToRecentProjects, this, &Kile::addRecentProject);
839     m_actRecentProjects->loadEntries(m_config->group("Projects"));
840 
841     createAction(i18n("A&dd Files to Project..."), "project_add", "project_add", docManager(), [this]() { m_docManager->projectAddFiles(); });
842     createAction(i18n("Refresh Project &Tree"), "project_buildtree", "project_rebuild", docManager(), [this]() { m_docManager->buildProjectTree(); });
843     createAction(i18n("&Archive"), "project_archive", "project_archive", this, [this]() { runArchiveTool(); });
844     createAction(i18n("Project &Options"), "project_options", "configure_project", docManager(), [this]() { m_docManager->projectOptions(); });
845     createAction(i18n("&Close Project"), "project_close", "project-development-close", docManager(), [this]() { m_docManager->projectClose(); });
846 
847     // new project actions (dani)
848     createAction(i18n("&Show Projects..."), "project_show", docManager(), &KileDocument::Manager::projectShow);
849     createAction(i18n("Re&move Files From Project..."), "project_remove", "project_remove", docManager(), &KileDocument::Manager::projectRemoveFiles);
850     createAction(i18n("Show Project &Files..."), "project_showfiles", "project_show", docManager(), &KileDocument::Manager::projectShowFiles);
851     // tbraun
852     createAction(i18n("Open All &Project Files"), "project_openallfiles", docManager(), [this]() { docManager()->projectOpenAllFiles(); });
853     createAction(i18n("Find in &Project..."), "project_findfiles", "projectgrep", this, &Kile::findInProjects);
854 
855     //build actions
856     act = createAction(i18n("Clean"), "CleanAll", "user-trash", this, [this]() { cleanAll(); });
857 
858     createAction(i18n("Next Document"), "gotoNextDocument", "go-next-view-page", QKeySequence(Qt::ALT + Qt::Key_Right),
859                  viewManager(), &KileView::Manager::gotoNextView);
860     createAction(i18n("Previous Document"), "gotoPrevDocument", "go-previous-view-page", QKeySequence(Qt::ALT + Qt::Key_Left),
861                  viewManager(), &KileView::Manager::gotoPrevView);
862     createAction(i18n("Focus Log/Messages View"), "focus_log", QKeySequence("CTRL+Alt+M"), this, &Kile::focusLog);
863     createAction(i18n("Focus Output View"), "focus_output", QKeySequence("CTRL+Alt+O"), this, &Kile::focusOutput);
864     createAction(i18n("Focus Konsole View"), "focus_konsole", QKeySequence("CTRL+Alt+K"), this, &Kile::focusKonsole);
865     createAction(i18n("Focus Editor View"), "focus_editor", QKeySequence("CTRL+Alt+F"), this, &Kile::focusEditor);
866 
867     createAction(i18nc("@action: Starts the completion of the current LaTeX command", "Complete (La)TeX Command"), "edit_complete_word", "complete1",
868                  QKeySequence(Qt::SHIFT + Qt::CTRL + Qt::Key_Space), codeCompletionManager(), [this]() { codeCompletionManager()->startLaTeXCompletion(); });
869     createAction(i18nc("@action: Starts the input (and completion) of a LaTeX environment", "Complete LaTeX Environment"), "edit_complete_env", "complete2",
870                  QKeySequence(Qt::SHIFT + Qt::ALT + Qt::Key_Space), codeCompletionManager(), [this]() { codeCompletionManager()->startLaTeXEnvironment(); });
871     createAction(i18nc("@action: Starts the completion of the current abbreviation", "Complete Abbreviation"), "edit_complete_abbrev", "complete3",
872                  QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Space), codeCompletionManager(), [this]() { codeCompletionManager()->startAbbreviationCompletion(); });
873 
874     createAction(i18n("Next Bullet"), "edit_next_bullet", "nextbullet", QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Right),
875                  m_edit, [this]() { m_edit->nextBullet(); });
876     createAction(i18n("Prev Bullet"), "edit_prev_bullet", "prevbullet", QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_Left),
877                  m_edit, [this]() { m_edit->prevBullet(); });
878 
879 // advanced editor (dani)
880     createAction(i18n("Environment (inside)"), "edit_select_inside_env", "selenv_i", QKeySequence("CTRL+Alt+S, E"),
881                  m_edit, &KileDocument::EditorExtension::selectEnvInside);
882     createAction(i18n("Environment (outside)"), "edit_select_outside_env", "selenv_o", QKeySequence("CTRL+Alt+S, F"),
883                  m_edit, &KileDocument::EditorExtension::selectEnvOutside);
884     createAction(i18n("TeX Group (inside)"), "edit_select_inside_group", "selgroup_i", QKeySequence("CTRL+Alt+S, T"),
885                  m_edit, &KileDocument::EditorExtension::selectTexgroupInside);
886     createAction(i18n("TeX Group (outside)"), "edit_select_outside_group", "selgroup_o", QKeySequence("CTRL+Alt+S, U"),
887                  m_edit, &KileDocument::EditorExtension::selectTexgroupOutside);
888     createAction(i18n("Math Group"), "edit_select_mathgroup", "selmath", QKeySequence("CTRL+Alt+S, M"),
889                  m_edit, [this]() { m_edit->selectMathgroup(); });
890     createAction(i18n("Paragraph"), "edit_select_paragraph", "selpar", QKeySequence("CTRL+Alt+S, P"),
891                  m_edit, [this]() { m_edit->selectParagraph(); });
892     createAction(i18n("Line"), "edit_select_line", "selline", QKeySequence("CTRL+Alt+S, L"),
893                  m_edit, [this]() { m_edit->selectLine(); });
894     createAction(i18n("TeX Word"), "edit_select_word", "selword", QKeySequence("CTRL+Alt+S, W"),
895                  m_edit, [this]() { m_edit->selectWord(); });
896 
897     createAction(i18n("Environment (inside)"), "edit_delete_inside_env", "delenv_i", QKeySequence("CTRL+Alt+T, E"),
898                  m_edit, &KileDocument::EditorExtension::deleteEnvInside);
899     createAction(i18n("Environment (outside)"), "edit_delete_outside_env", "delenv_o", QKeySequence("CTRL+Alt+T, F"),
900                  m_edit, &KileDocument::EditorExtension::deleteEnvOutside);
901     createAction(i18n("TeX Group (inside)"), "edit_delete_inside_group", "delgroup_i", QKeySequence("CTRL+Alt+T, T"),
902                  m_edit, &KileDocument::EditorExtension::deleteTexgroupInside);
903     createAction(i18n("TeX Group (outside)"), "edit_delete_outside_group", "delgroup_o",QKeySequence("CTRL+Alt+T, U"),
904                  m_edit, &KileDocument::EditorExtension::deleteTexgroupInside);
905     createAction(i18n("Math Group"), "edit_delete_mathgroup", "delmath", QKeySequence("CTRL+Alt+T, M"),
906                  m_edit, [this]() { m_edit->deleteMathgroup(); });
907     createAction(i18n("Paragraph"), "edit_delete_paragraph", "delpar", QKeySequence("CTRL+Alt+T, P"),
908                  m_edit, [this]() { m_edit->deleteParagraph(); });
909     createAction(i18n("To End of Line"), "edit_delete_eol", "deleol", QKeySequence("CTRL+Alt+T, L"),
910                  m_edit, [this]() { m_edit->deleteEndOfLine(); });
911     createAction(i18n("TeX Word"), "edit_delete_word", "delword", QKeySequence("CTRL+Alt+T, W"),
912                  m_edit, [this]() { m_edit->deleteWord(); });
913 
914     createAction(i18n("Go to Begin"), "edit_begin_env", "gotobeginenv", QKeySequence("CTRL+Alt+E, B"),
915                  m_edit, &KileDocument::EditorExtension::gotoBeginEnv);
916     createAction(i18n("Go to End"), "edit_end_env", "gotoendenv", QKeySequence("CTRL+Alt+E, E"),
917                  m_edit, &KileDocument::EditorExtension::gotoEndEnv);
918     createAction(i18n("Match"), "edit_match_env", "matchenv", QKeySequence("CTRL+Alt+E, M"),
919                  m_edit, &KileDocument::EditorExtension::matchEnv);
920     createAction(i18n("Close"), "edit_close_env", "closeenv", QKeySequence("CTRL+Alt+E, C"),
921                  m_edit, &KileDocument::EditorExtension::closeEnv);
922     createAction(i18n("Close All"), "edit_closeall_env", "closeallenv", QKeySequence("CTRL+Alt+E, A"),
923                  m_edit, &KileDocument::EditorExtension::closeAllEnv);
924 
925     createAction(i18n("Go to Begin"), "edit_begin_group", "gotobegingroup", QKeySequence("CTRL+Alt+G, B"),
926                  m_edit, &KileDocument::EditorExtension::gotoBeginTexgroup);
927     createAction(i18n("Go to End"), "edit_end_group", "gotoendgroup", QKeySequence("CTRL+Alt+G, E"),
928                  m_edit, &KileDocument::EditorExtension::gotoEndTexgroup);
929     createAction(i18n("Match"), "edit_match_group", "matchgroup", QKeySequence("CTRL+Alt+G, M"),
930                  m_edit, [this]() { m_edit->matchTexgroup(); });
931     createAction(i18n("Close"), "edit_close_group", "closegroup", QKeySequence("CTRL+Alt+G, C"),
932                  m_edit, [this]() { m_edit->closeTexgroup(); });
933 
934     createAction(i18n("Selection"), "quickpreview_selection", "preview_sel", QKeySequence("CTRL+Alt+P, S"), this, &Kile::quickPreviewSelection);
935     createAction(i18n("Environment"), "quickpreview_environment", "preview_env",QKeySequence("CTRL+Alt+P, E"), this, &Kile::quickPreviewEnvironment);
936     createAction(i18n("Subdocument"), "quickpreview_subdocument", "preview_subdoc",QKeySequence("CTRL+Alt+P, D"), this, &Kile::quickPreviewSubdocument);
937     createAction(i18n("Mathgroup"), "quickpreview_math", "preview_math", QKeySequence("CTRL+Alt+P, M"), this, &Kile::quickPreviewMathgroup);
938 
939     KileStdActions::setupStdTags(this, this, actionCollection(), this);
940     KileStdActions::setupMathTags(this, actionCollection());
941 
942     m_bibTagActionMenu = new KActionMenu(i18n("&Bibliography"), actionCollection());
943     m_bibTagActionMenu->setDelayed(false);
944     actionCollection()->addAction("menu_bibliography", m_bibTagActionMenu);
945 
946     createAction(i18n("Clean"), "CleanBib", this, &Kile::cleanBib);
947 
948     m_bibTagSettings = new KSelectAction(i18n("&Settings"),actionCollection());
949     actionCollection()->addAction("settings_menu_bibliography", m_bibTagSettings);
950 
951     act = createAction(i18n("Settings for BibTeX"), "setting_bibtex", this, &Kile::rebuildBibliographyMenu);
952     act->setCheckable(true);
953     m_bibTagSettings->addAction(act);
954 
955     act = createAction(i18n("Settings for Biblatex"), "setting_biblatex", this, &Kile::rebuildBibliographyMenu);
956     act->setCheckable(true);
957     m_bibTagSettings->addAction(act);
958     m_bibTagSettings->setCurrentAction(action((QString("setting_") + KileConfig::bibliographyType()).toLatin1()));
959 
960     rebuildBibliographyMenu();
961 
962     createAction(i18n("Quick Start"), "wizard_document", "quickwizard", this, &Kile::quickDocument);
963     connect(docManager(), &KileDocument::Manager::startWizard, this, &Kile::quickDocument);
964     createAction(i18n("Tabular"), "wizard_tabular", "wizard_tabular", this, &Kile::quickTabular);
965     createAction(i18n("Array"), "wizard_array", "wizard_array", this, &Kile::quickArray);
966     createAction(i18n("Tabbing"), "wizard_tabbing", "wizard_tabbing", this, &Kile::quickTabbing);
967     createAction(i18n("Floats"), "wizard_float", "wizard_float", this, &Kile::quickFloat);
968     createAction(i18n("Math"), "wizard_mathenv", "wizard_math", this, &Kile::quickMathenv);
969     createAction(i18n("Postscript Tools"), "wizard_postscript", "wizard_pstools", this, &Kile::quickPostscript);
970     createAction(i18n("PDF Tools"), "wizard_pdf", "wizard_pdftools", this, &Kile::quickPdf);
971 
972     ModeAction = new KToggleAction(i18n("Define Current Document as '&Master Document'"), actionCollection());
973     actionCollection()->addAction("Mode", ModeAction);
974     ModeAction->setIcon(QIcon::fromTheme("master"));
975     connect(ModeAction, &KToggleAction::triggered, this, &Kile::toggleMasterDocumentMode);
976 
977     KToggleAction *showDocumentViewer = new KToggleAction(i18n("Show Document Viewer"), actionCollection());
978     actionCollection()->addAction("ShowDocumentViewer", showDocumentViewer);
979     showDocumentViewer->setChecked(KileConfig::showDocumentViewer());
980     connect(showDocumentViewer, &KToggleAction::toggled, viewManager(), &KileView::Manager::setDocumentViewerVisible);
981     connect(viewManager(), &KileView::Manager::documentViewerWindowVisibilityChanged,
982             showDocumentViewer, &KToggleAction::setChecked);
983 
984     KToggleAction *tact = new KToggleAction(i18n("Show S&ide Bar"), actionCollection());
985     actionCollection()->addAction("StructureView", tact);
986     tact->setChecked(KileConfig::sideBar());
987     connect(tact, &KToggleAction::toggled, m_sideBar, &Kile::setVisible);
988     connect(m_sideBar, &KileWidget::SideBar::visibilityChanged, this, &Kile::sideOrBottomBarChanged);
989 
990     m_actionMessageView = new KToggleAction(i18n("Show Mess&ages Bar"), actionCollection());
991     actionCollection()->addAction("MessageView", m_actionMessageView);
992     m_actionMessageView->setChecked(true);
993     connect(m_actionMessageView, &KToggleAction::toggled, m_bottomBar, &Kile::setVisible);
994     connect(m_bottomBar, &KileWidget::SideBar::visibilityChanged, this, &Kile::sideOrBottomBarChanged);
995     if(m_singlemode) {
996         ModeAction->setChecked(false);
997     }
998     else {
999         ModeAction->setChecked(true);
1000     }
1001 
1002     WatchFileAction = new KToggleAction(i18n("Watch File Mode"), actionCollection());
1003     actionCollection()->addAction("WatchFile", WatchFileAction);
1004     WatchFileAction->setIcon(QIcon::fromTheme("watchfile"));
1005     connect(WatchFileAction, &KToggleAction::toggled, this, &Kile::toggleWatchFile);
1006     if(m_bWatchFile) {
1007         WatchFileAction->setChecked(true);
1008     }
1009     else {
1010         WatchFileAction->setChecked(false);
1011     }
1012 
1013     createAction(i18n("TeX Guide"), "help_tex_guide", QKeySequence("CTRL+Alt+H, G"), m_help, &KileHelp::Help::helpTexGuide);
1014     createAction(i18n("LaTeX"), "help_latex_index", QKeySequence("CTRL+Alt+H, L"), m_help, &KileHelp::Help::helpLatexIndex);
1015     createAction(i18n("LaTeX Command"), "help_latex_command", QKeySequence("CTRL+Alt+H, C"), m_help, &KileHelp::Help::helpLatexCommand);
1016     createAction(i18n("LaTeX Subject"), "help_latex_subject", QKeySequence("CTRL+Alt+H, S"), m_help, &KileHelp::Help::helpLatexSubject);
1017     createAction(i18n("LaTeX Env"), "help_latex_env", QKeySequence("CTRL+Alt+H, E"), m_help, &KileHelp::Help::helpLatexEnvironment);
1018     createAction(i18n("Context Help"), "help_context", QKeySequence("CTRL+Alt+H, K"), m_help, [this]() { m_help->helpKeyword(); });
1019     createAction(i18n("Documentation Browser"), "help_docbrowser", QKeySequence("CTRL+Alt+H, B"), m_help, &KileHelp::Help::helpDocBrowser);
1020 
1021     createAction(i18n("LaTeX Reference"), "help_latex_reference", "help-latex", this, &Kile::helpLaTex);
1022 
1023     createAction(i18n("&About Editor Component"), "help_about_editor", this, &Kile::aboutEditorComponent);
1024 
1025     QAction *kileconfig = KStandardAction::preferences(this, &Kile::generalOptions, actionCollection());
1026     kileconfig->setIcon(QIcon::fromTheme("configure-kile"));
1027 
1028     createAction(KStandardAction::KeyBindings, this, &Kile::configureKeys);
1029     createAction(KStandardAction::ConfigureToolbars, this, &Kile::configureToolbars);
1030 
1031     createAction(i18n("&System Check..."), "settings_perform_check", this, &Kile::slotPerformCheck);
1032 
1033     m_userHelpActionMenu = new KActionMenu(i18n("User Help"), actionCollection());
1034     actionCollection()->addAction("help_userhelp", m_userHelpActionMenu);
1035 
1036     m_pFullScreen = KStandardAction::fullScreen(this, &Kile::slotToggleFullScreen, this, actionCollection());
1037 }
1038 
rebuildBibliographyMenu()1039 void Kile::rebuildBibliographyMenu() {
1040 
1041     KILE_DEBUG_MAIN << " current is " << m_bibTagSettings->currentText();
1042 
1043     QString currentItem = m_bibTagSettings->currentText();
1044     QString name;
1045 
1046     if( currentItem == i18n("BibTeX") ) { // avoid writing i18n'ed strings to config file
1047         name = QString("bibtex");
1048     }
1049     else if ( currentItem == i18n("Biblatex") ) {
1050         name = QString("biblatex");
1051     }
1052     else {
1053         KILE_DEBUG_MAIN << "wrong currentItem in bibliography settings menu";
1054         name = QString("bibtex");
1055     }
1056 
1057     KileConfig::setBibliographyType(name);
1058     m_bibTagActionMenu->menu()->clear();
1059 
1060     KileStdActions::setupBibTags(this, actionCollection(),m_bibTagActionMenu);
1061     m_bibTagActionMenu->addSeparator();
1062     m_bibTagActionMenu->addAction(action("CleanBib"));
1063     m_bibTagActionMenu->addSeparator();
1064     m_bibTagActionMenu->addAction(action("settings_menu_bibliography"));
1065 }
1066 
createToolAction(const QString & toolName)1067 QAction* Kile::createToolAction(const QString& toolName)
1068 {
1069     return createAction(toolName, "tool_" + toolName,
1070                         KileTool::iconFor(toolName, m_config.data()), this, [this, toolName]() { runTool(toolName); });
1071 }
1072 
createToolActions()1073 void Kile::createToolActions()
1074 {
1075     QStringList tools = KileTool::toolList(m_config.data());
1076     for (QStringList::iterator i = tools.begin(); i != tools.end(); ++i) {
1077         QString toolName = *i;
1078         if(!actionCollection()->action("tool_" + toolName)) {
1079             KILE_DEBUG_MAIN << "Creating action for tool" << toolName;
1080             createToolAction(toolName);
1081         }
1082     }
1083 }
1084 
setupTools()1085 void Kile::setupTools()
1086 {
1087     KILE_DEBUG_MAIN << "==Kile::setupTools()===================" << endl;
1088 
1089     if(!m_buildMenuCompile || !m_buildMenuConvert ||  !m_buildMenuTopLevel || !m_buildMenuQuickPreview || !m_buildMenuViewer || !m_buildMenuOther) {
1090         KILE_DEBUG_MAIN << "BUG, menu pointers are Q_NULLPTR"
1091                         << (m_buildMenuCompile == Q_NULLPTR)
1092                         << (m_buildMenuConvert == Q_NULLPTR)
1093                         << (m_buildMenuTopLevel == Q_NULLPTR)
1094                         << (m_buildMenuQuickPreview == Q_NULLPTR)
1095                         << (m_buildMenuViewer == Q_NULLPTR)
1096                         << (m_buildMenuOther == Q_NULLPTR);
1097         return;
1098     }
1099 
1100     QStringList tools = KileTool::toolList(m_config.data());
1101     QString toolMenu, grp;
1102     QList<QAction*> *pl;
1103     QAction *act;
1104     ToolbarSelectAction *pSelectAction = Q_NULLPTR;
1105 
1106     m_compilerActions->saveCurrentAction();
1107     m_viewActions->saveCurrentAction();
1108     m_convertActions->saveCurrentAction();
1109     m_quickActions->saveCurrentAction();
1110 
1111     // do plugActionList by hand ...
1112     foreach(act, m_listQuickActions) {
1113         m_buildMenuTopLevel->removeAction(act);
1114     }
1115 
1116     m_buildMenuCompile->clear();
1117     m_buildMenuConvert->clear();
1118     m_buildMenuViewer->clear();
1119     m_buildMenuOther->clear();
1120 
1121     m_compilerActions->removeAllActions();
1122     m_viewActions->removeAllActions();
1123     m_convertActions->removeAllActions();
1124     m_quickActions->removeAllActions();
1125 
1126     for (int i = 0; i < tools.count(); ++i) {
1127         grp = KileTool::groupFor(tools[i], m_config.data());
1128         toolMenu = KileTool::menuFor(tools[i], m_config.data());
1129 
1130         KILE_DEBUG_MAIN << tools[i] << " is using group: " << grp << " and menu: "<< toolMenu;
1131         if(toolMenu == "none") {
1132             continue;
1133         }
1134 
1135         if ( toolMenu == "Compile" ) {
1136             pl = &m_listCompilerActions;
1137             pSelectAction = m_compilerActions;
1138         }
1139         else if ( toolMenu == "View" ) {
1140             pl = &m_listViewerActions;
1141             pSelectAction = m_viewActions;
1142         }
1143         else if ( toolMenu == "Convert" ) {
1144             pl = &m_listConverterActions;
1145             pSelectAction = m_convertActions;
1146         }
1147         else if ( toolMenu == "Quick" ) {
1148             pl = &m_listQuickActions;
1149             pSelectAction = m_quickActions;
1150         }
1151         else {
1152             pl = &m_listOtherActions;
1153             pSelectAction = Q_NULLPTR;
1154         }
1155 
1156         KILE_DEBUG_MAIN << "\tadding " << tools[i] << " " << toolMenu << " #" << pl->count() << endl;
1157 
1158         act = actionCollection()->action("tool_" + tools[i]);
1159         if(!act) {
1160             KILE_DEBUG_MAIN << "no tool for " << tools[i];
1161             createToolAction(tools[i]);
1162         }
1163         pl->append(act);
1164 
1165         if(pSelectAction) {
1166             pSelectAction->addAction(actionCollection()->action("tool_" + tools[i]));
1167         }
1168     }
1169 
1170     m_quickActions->addSeparator();
1171     m_quickActions->addAction(action("quickpreview_selection"));
1172     m_quickActions->addAction(action("quickpreview_environment"));
1173     m_quickActions->addAction(action("quickpreview_subdocument"));
1174     m_quickActions->addSeparator();
1175     m_quickActions->addAction(action("quickpreview_math"));
1176 
1177     cleanUpActionList(m_listCompilerActions, tools);
1178     cleanUpActionList(m_listViewerActions, tools);
1179     cleanUpActionList(m_listConverterActions, tools);
1180     cleanUpActionList(m_listQuickActions, tools);
1181     cleanUpActionList(m_listOtherActions, tools);
1182 
1183     m_buildMenuTopLevel->insertActions(m_buildMenuQuickPreview->menuAction(),m_listQuickActions);
1184     m_buildMenuCompile->addActions(m_listCompilerActions);
1185     m_buildMenuConvert->addActions(m_listConverterActions);
1186     m_buildMenuViewer->addActions(m_listViewerActions);
1187     m_buildMenuOther->addActions(m_listOtherActions);
1188 
1189     m_compilerActions->restoreCurrentAction();
1190     m_viewActions->restoreCurrentAction();
1191     m_convertActions->restoreCurrentAction();
1192     m_quickActions->restoreCurrentAction();
1193 }
1194 
initSelectActions()1195 void Kile::initSelectActions() {
1196 
1197     m_compilerActions = new ToolbarSelectAction(i18n("Compile"), this);
1198     m_viewActions = new ToolbarSelectAction(i18n("View"), this);
1199     m_convertActions = new ToolbarSelectAction(i18n("Convert"), this);
1200     m_quickActions = new ToolbarSelectAction(i18n("Quick"), this);
1201 
1202     actionCollection()->setShortcutsConfigurable(m_compilerActions, false);
1203     actionCollection()->setShortcutsConfigurable(m_viewActions, false);
1204     actionCollection()->setShortcutsConfigurable(m_convertActions, false);
1205     actionCollection()->setShortcutsConfigurable(m_quickActions, false);
1206 
1207     actionCollection()->addAction("list_compiler_select", m_compilerActions);
1208     actionCollection()->addAction("list_convert_select", m_convertActions);
1209     actionCollection()->addAction("list_view_select", m_viewActions);
1210     actionCollection()->addAction("list_quick_select", m_quickActions);
1211 }
1212 
saveLastSelectedAction()1213 void Kile::saveLastSelectedAction() {
1214 
1215     KILE_DEBUG_MAIN << "Kile::saveLastSelectedAction()" << endl;
1216     QStringList list;
1217     list << "Compile" << "Convert" << "View" << "Quick";
1218 
1219     ToolbarSelectAction *pSelectAction = Q_NULLPTR ;
1220 
1221     KConfigGroup grp = m_config->group("ToolSelectAction");
1222 
1223     for(QStringList::Iterator it = list.begin(); it != list.end() ; ++it) {
1224         if ( *it == "Compile" ) {
1225             pSelectAction = m_compilerActions;
1226         }
1227         else if ( *it == "View" ) {
1228             pSelectAction = m_viewActions;
1229         }
1230         else if ( *it == "Convert" ) {
1231             pSelectAction = m_convertActions;
1232         }
1233         else if ( *it == "Quick" ) {
1234             pSelectAction = m_quickActions;
1235         }
1236 
1237         KILE_DEBUG_MAIN << "current item is " << pSelectAction->currentItem();
1238 
1239         grp.writeEntry(*it, pSelectAction->currentItem());
1240     }
1241 }
1242 
restoreLastSelectedAction()1243 void Kile::restoreLastSelectedAction() {
1244 
1245     QStringList list;
1246     list << "Compile" << "Convert" << "View" << "Quick";
1247 
1248     ToolbarSelectAction *pSelectAction = Q_NULLPTR;
1249     int defaultAction = 0;
1250 
1251     KConfigGroup grp = m_config->group("ToolSelectAction");
1252 
1253     for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) {
1254         if ( *it == "Compile" ) {
1255             pSelectAction = m_compilerActions;
1256             defaultAction = 9; // PDFLatex
1257         }
1258         else if ( *it == "View" ) {
1259             pSelectAction = m_viewActions;
1260             defaultAction = 4; // ViewPDF
1261         }
1262         else if ( *it == "Convert" ) {
1263             pSelectAction = m_convertActions;
1264             defaultAction = 0;
1265         }
1266         else if ( *it == "Quick" ) {
1267             pSelectAction = m_quickActions;
1268             defaultAction = 0;
1269         }
1270 
1271         int actIndex = grp.readEntry(*it, defaultAction);
1272         KILE_DEBUG_MAIN << "selecting" << actIndex << "for" << *it;
1273         pSelectAction->setCurrentItem(actIndex);
1274     }
1275 }
1276 
cleanUpActionList(QList<QAction * > & list,const QStringList & tools)1277 void Kile::cleanUpActionList(QList<QAction*> &list, const QStringList &tools)
1278 {
1279 //  	KILE_DEBUG_MAIN << "cleanUpActionList tools are" << tools.join("; ");
1280     QList<QAction*>::iterator it, testIt;
1281     for ( it= list.begin(); it != list.end(); ++it) {
1282         QAction *act = *it;
1283         if ( act != Q_NULLPTR && !act->objectName().isEmpty() && !tools.contains(act->objectName().mid(5)) ) {
1284             if (act->associatedWidgets().contains(toolBar("toolsToolBar"))) {
1285                 toolBar("toolsToolBar")->removeAction(act);
1286             }
1287 //             KILE_DEBUG_MAIN << "about to delete action: " << act->objectName();
1288             testIt = list.erase(it);
1289             if( testIt == list.end()) {
1290                 break;
1291             }
1292         }
1293     }
1294 }
1295 
restoreFilesAndProjects(bool allowRestore)1296 void Kile::restoreFilesAndProjects(bool allowRestore)
1297 {
1298     if (!(allowRestore && KileConfig::restore())) {
1299         return;
1300     }
1301 
1302     QUrl url;
1303     for (int i=0; i < m_listProjectsOpenOnStart.count(); ++i) {
1304         // don't open project files as they will be opened later in this method
1305         docManager()->projectOpen(QUrl::fromUserInput(m_listProjectsOpenOnStart[i]), i, m_listProjectsOpenOnStart.count(), false);
1306     }
1307 
1308     for (int i = 0; i < m_listDocsOpenOnStart.count(); ++i) {
1309         docManager()->fileOpen(QUrl::fromUserInput(m_listDocsOpenOnStart[i]), m_listEncodingsOfDocsOpenOnStart[i]);
1310     }
1311 
1312     if (ModeAction) {
1313         ModeAction->setChecked(!m_singlemode);
1314     }
1315     updateModeStatus();
1316 
1317     m_listProjectsOpenOnStart.clear();
1318     m_listDocsOpenOnStart.clear();
1319     m_listEncodingsOfDocsOpenOnStart.clear();
1320 
1321     KILE_DEBUG_MAIN << "lastDocument=" << KileConfig::lastDocument() << endl;
1322     KTextEditor::Document *doc = docManager()->docFor(QUrl::fromUserInput(KileConfig::lastDocument()));
1323     if (doc) {
1324         viewManager()->switchToTextView(doc->url(), true); // request the focus on the view
1325     }
1326     setMasterDocumentFileName(KileConfig::singleFileMasterDocument());
1327 }
1328 
setActive()1329 void Kile::setActive()
1330 {
1331     KILE_DEBUG_MAIN << "Activating" << endl;
1332     raise();
1333     activateWindow();
1334     show();
1335 }
1336 
setLine(const QString & line)1337 void Kile::setLine(const QString &line)
1338 {
1339     bool ok;
1340     uint l = line.toUInt(&ok, 10);
1341     KTextEditor::View *view = viewManager()->currentTextView();
1342     if (view && ok) {
1343         show();
1344         raise();
1345         activateWindow();
1346         // be very aggressive when it comes to raising the main window to the top
1347         KWindowSystem::forceActiveWindow(winId());
1348         focusTextView(view);
1349         editorExtension()->goToLine(l - 1, view);
1350     }
1351 }
1352 
setCursor(const QUrl & url,int parag,int index)1353 void Kile::setCursor(const QUrl &url, int parag, int index)
1354 {
1355     KTextEditor::Document *doc = docManager()->docFor(url);
1356     if(doc) {
1357         KTextEditor::View *view = (KTextEditor::View*)doc->views().first();
1358         if(view) {
1359             view->setCursorPosition(KTextEditor::Cursor(parag, index));
1360             focusTextView(view);
1361         }
1362     }
1363 }
1364 
runArchiveTool()1365 void Kile::runArchiveTool()
1366 {
1367     runArchiveTool(QUrl());
1368 }
1369 
runArchiveTool(const QUrl & url)1370 void Kile::runArchiveTool(const QUrl &url)
1371 {
1372     KileTool::Archive *tool = dynamic_cast<KileTool::Archive*>(m_manager->createTool("Archive", QString(), false));
1373     if(!tool) {
1374         KMessageBox::error(mainWindow(), i18n("It was impossible to create the \"Archive\" tool.\n\n"
1375                                               "Please check and repair your installation of Kile."),
1376                            i18n("Unable to Create Archive Tool"));
1377         return;
1378     }
1379     if(url.isValid()) {
1380         tool->setSource(url.toLocalFile());
1381     }
1382     tool->prepareToRun();
1383     m_manager->run(tool);
1384 }
1385 
1386 //TODO: move to KileView::Manager
activateView(QWidget * w,bool updateStruct)1387 void Kile::activateView(QWidget* w, bool updateStruct /* = true */ )  //Needs to be QWidget because of QTabWidget::currentChanged
1388 {
1389     //KILE_DEBUG_MAIN << "==Kile::activateView==========================" << endl;
1390     if (!w || !w->inherits("KTextEditor::View")) {
1391         return;
1392     }
1393 
1394     //disable gui updates to avoid flickering of toolbars
1395     setUpdatesEnabled(false);
1396 
1397     QList<KToolBar*> toolBarsList = toolBars();
1398     QHash<KToolBar*, bool> toolBarVisibilityHash;
1399 
1400     for(QList<KToolBar*>::iterator i = toolBarsList.begin();
1401             i != toolBarsList.end(); ++i) {
1402         KToolBar *toolBar = *i;
1403         toolBarVisibilityHash[toolBar] = toolBar->isVisible();
1404     }
1405 
1406     KTextEditor::View* view = dynamic_cast<KTextEditor::View*>(w);
1407     Q_ASSERT(view);
1408 
1409     for(int i = 0; i < viewManager()->textViewCount(); ++i) {
1410         KTextEditor::View *view2 = viewManager()->textView(i);
1411         if(view == view2) {
1412             continue;
1413         }
1414         guiFactory()->removeClient(view2);
1415         view2->clearFocus();
1416     }
1417 
1418     guiFactory()->addClient(view);
1419 
1420     for(QList<KToolBar*>::iterator i = toolBarsList.begin();
1421             i != toolBarsList.end(); ++i) {
1422         KToolBar *toolBar = *i;
1423         toolBar->setVisible(toolBarVisibilityHash[*i]);
1424     }
1425 
1426     setUpdatesEnabled(true);
1427 
1428     if(updateStruct) {
1429         viewManager()->updateStructure();
1430     }
1431 
1432     focusTextView(view);
1433 }
1434 
updateModeStatus()1435 void Kile::updateModeStatus()
1436 {
1437     KILE_DEBUG_MAIN << "==Kile::updateModeStatus()==========";
1438     KileProject *project = docManager()->activeProject();
1439     QString shortName = m_masterDocumentFileName;
1440     int pos = shortName.lastIndexOf('/');
1441     shortName.remove(0, pos + 1);
1442 
1443     if(project) {
1444         if (m_singlemode) {
1445             statusBar()->setHintText(i18n("Project: %1", project->name()));
1446         }
1447         else {
1448             statusBar()->setHintText(i18n("Project: %1 (Master document: %2)", project->name(), shortName));
1449         }
1450     }
1451     else {
1452         if (m_singlemode) {
1453             statusBar()->setHintText(i18n("Normal mode"));
1454         }
1455         else {
1456             statusBar()->setHintText(i18n("Master document: %1", shortName));
1457         }
1458     }
1459 
1460     if(m_singlemode) {
1461         ModeAction->setText(i18n("Define Current Document as 'Master Document'"));
1462         ModeAction->setChecked(false);
1463     }
1464     else {
1465         ModeAction->setText(i18n("Normal mode (current master document: %1)", shortName));
1466         ModeAction->setChecked(true);
1467     }
1468 
1469     // enable or disable entries in Kile'S menu
1470     updateMenu();
1471 
1472     KTextEditor::View *view = viewManager()->currentTextView();
1473     // Passing Q_NULLPTR is ok
1474     updateStatusBarCursorPosition(view, (view ? view->cursorPosition() : KTextEditor::Cursor()));
1475     updateStatusBarViewMode(view);
1476     updateStatusBarSelection(view);
1477 }
1478 
openDocument(const QUrl & url)1479 void Kile::openDocument(const QUrl &url)
1480 {
1481     docManager()->fileSelected(url);
1482 }
1483 
openDocument(const QString & s)1484 void Kile::openDocument(const QString& s)
1485 {
1486     openDocument(QUrl::fromUserInput(s));
1487 }
1488 
closeDocument()1489 void Kile::closeDocument()
1490 {
1491     docManager()->fileClose();
1492 }
1493 
openProject(const QUrl & url)1494 void Kile::openProject(const QUrl &url)
1495 {
1496     docManager()->projectOpen(url);
1497 }
1498 
openProject(const QString & proj)1499 void Kile::openProject(const QString& proj)
1500 {
1501     openProject(QUrl::fromUserInput(proj));
1502 }
1503 
focusPreview()1504 void Kile::focusPreview()
1505 {
1506     m_bottomBar->switchToTab(PREVIEW_TAB);
1507 }
1508 
focusLog()1509 void Kile::focusLog()
1510 {
1511     m_bottomBar->switchToTab(LOG_TAB);
1512 }
1513 
focusOutput()1514 void Kile::focusOutput()
1515 {
1516     m_bottomBar->switchToTab(OUTPUT_TAB);
1517 }
1518 
focusKonsole()1519 void Kile::focusKonsole()
1520 {
1521     m_bottomBar->switchToTab(KONSOLE_TAB);
1522 }
1523 
focusEditor()1524 void Kile::focusEditor()
1525 {
1526     KTextEditor::View *view = viewManager()->currentTextView();
1527     if(view) {
1528         focusTextView(view);
1529     }
1530 }
1531 
sideOrBottomBarChanged(bool visible)1532 void Kile::sideOrBottomBarChanged(bool visible)
1533 {
1534     if ( ! visible )
1535     {
1536         focusEditor();
1537     }
1538 }
1539 
1540 //FIXME: documents probably shouldn't be closed in this method yet (also see API doc of 'queryClose')
queryClose()1541 bool Kile::queryClose()
1542 {
1543     KTextEditor::View *view = viewManager()->currentTextView();
1544     if(view) {
1545         KileConfig::setLastDocument(view->document()->url().toLocalFile());
1546     }
1547     else {
1548         KileConfig::setLastDocument("");
1549     }
1550 
1551     //don't close Kile if embedded viewers are present
1552     KILE_DEBUG_MAIN << "==bool Kile::queryClose==========" << endl;
1553 
1554     m_listProjectsOpenOnStart.clear();
1555     m_listDocsOpenOnStart.clear();
1556     m_listEncodingsOfDocsOpenOnStart.clear();
1557 
1558     for(int i = 0; i < viewManager()->textViewCount(); ++i) {
1559         KTextEditor::Document *doc = viewManager()->textView(i)->document();
1560         const QUrl url = doc->url();
1561         if(url.isEmpty()) {
1562             continue;
1563         }
1564         m_listDocsOpenOnStart.append(url.toLocalFile());
1565         m_listEncodingsOfDocsOpenOnStart.append(doc->encoding());
1566     }
1567 
1568     KILE_DEBUG_MAIN << "#projects = " << docManager()->projects().count() << endl;
1569     QList<KileProject*> projectList = docManager()->projects();
1570     for(QList<KileProject*>::iterator i = projectList.begin(); i != projectList.end(); ++i) {
1571         const QUrl url = (*i)->url();
1572         if(url.isEmpty()) { // shouldn't happen, but just in case...
1573             continue;
1574         }
1575         m_listProjectsOpenOnStart.append(url.toLocalFile());
1576     }
1577 
1578     bool stage1 = docManager()->projectCloseAll();
1579     bool stage2 = true;
1580 
1581     if(stage1) {
1582         stage2 = docManager()->fileCloseAll();
1583     }
1584 
1585     bool close = stage1 && stage2;
1586     if(close) {
1587         saveSettings();
1588     }
1589 
1590     return close;
1591 }
1592 
showDocInfo(KTextEditor::View * view)1593 void Kile::showDocInfo(KTextEditor::View *view)
1594 {
1595     if(!view) {
1596         view = viewManager()->currentTextView();
1597     }
1598 
1599     if(!view) {
1600         return;
1601     }
1602 
1603     KileDocument::TextInfo *docinfo = docManager()->textInfoFor(view->document());
1604     KileProject *project = KileInfo::docManager()->activeProject();
1605     if(docinfo) { // we have to ensure that we always get a _valid_ docinfo object
1606         KileDialog::StatisticsDialog *dlg = new KileDialog::StatisticsDialog(project,
1607                 docinfo,
1608                 this,
1609                 view);
1610         dlg->exec();
1611         delete dlg;
1612     }
1613     else {
1614         qWarning() << "There is no KileDocument::Info object belonging to this document!";
1615     }
1616 }
1617 
convertToASCII(KTextEditor::Document * doc)1618 void Kile::convertToASCII(KTextEditor::Document *doc)
1619 {
1620     if(!doc) {
1621         KTextEditor::View *view = viewManager()->currentTextView();
1622 
1623         if(view) {
1624             doc = view->document();
1625         }
1626         else {
1627             return;
1628         }
1629     }
1630 
1631     ConvertIO io(doc);
1632     ConvertEncToASCII conv = ConvertEncToASCII(doc->encoding(), &io);
1633     doc->setEncoding("ISO 8859-1");
1634     conv.convert();
1635 }
1636 
convertToEnc(KTextEditor::Document * doc)1637 void Kile::convertToEnc(KTextEditor::Document *doc)
1638 {
1639     if(!doc) {
1640         KTextEditor::View *view = viewManager()->currentTextView();
1641 
1642         if (view) doc = view->document();
1643         else return;
1644     }
1645 
1646     if(sender()) {
1647         ConvertIO io(doc);
1648         QString name = QString(sender()->objectName()).section('_', -1);
1649         ConvertASCIIToEnc conv = ConvertASCIIToEnc(name, &io);
1650         conv.convert();
1651         doc->setEncoding(ConvertMap::encodingNameFor(name));
1652     }
1653 }
1654 
statusBar()1655 KileWidget::StatusBar * Kile::statusBar()
1656 {
1657     return static_cast<KileWidget::StatusBar *>(KXmlGuiWindow::statusBar());
1658 }
1659 
1660 ////////////////// GENERAL SLOTS //////////////
lineNumber()1661 int Kile::lineNumber()
1662 {
1663     KTextEditor::View *view = viewManager()->currentTextView();
1664 
1665     int para = 0;
1666 
1667     if (view) {
1668         para = view->cursorPosition().line();
1669     }
1670 
1671     return para;
1672 }
1673 
newCaption()1674 void Kile::newCaption()
1675 {
1676     KTextEditor::View *view = viewManager()->currentTextView();
1677     if(view) {
1678         const bool showFullPath = KileConfig::showFullPathInWindowTitle();
1679 
1680         KTextEditor::Document *doc = view->document();
1681         const QString caption = (doc->isReadWrite() ? getName(doc, !showFullPath)
1682                                  : i18nc("Window caption in read-only mode: <file name> [Read-Only]",
1683                                          "%1 [Read-Only]", getName(doc, !showFullPath)));
1684         setWindowTitle(caption);
1685         if (m_bottomBar->currentPage() && m_bottomBar->currentPage()->inherits("KileWidget::Konsole")) {
1686             m_texKonsole->sync();
1687         }
1688     }
1689     else {
1690         setWindowTitle("");
1691     }
1692 }
1693 
grepItemSelected(const QString & abs_filename,int line)1694 void Kile::grepItemSelected(const QString &abs_filename, int line)
1695 {
1696     KILE_DEBUG_MAIN << "Open file: "
1697                     << abs_filename << " (" << line << ")" << endl;
1698     docManager()->fileOpen(QUrl::fromUserInput(abs_filename));
1699     setLine(QString::number(line));
1700 }
1701 
findInFiles()1702 void Kile::findInFiles()
1703 {
1704     static QPointer<KileDialog::FindFilesDialog> dlg = 0;
1705 
1706     if (!dlg) {
1707         KILE_DEBUG_MAIN << "grep guard: create findInFiles dlg" << endl;
1708         dlg = new KileDialog::FindFilesDialog(mainWindow(), this, KileGrep::Directory);
1709         dlg->show();
1710         connect(dlg, &KileDialog::FindFilesDialog::itemSelected, this, &Kile::grepItemSelected);
1711     }
1712     else {
1713         KILE_DEBUG_MAIN << "grep guard: show findInFiles dlg" << endl;
1714         dlg->activateWindow();
1715         dlg->raise();
1716     }
1717 }
1718 
findInProjects()1719 void Kile::findInProjects()
1720 {
1721     static QPointer<KileDialog::FindFilesDialog> project_dlg = Q_NULLPTR;
1722 
1723     if(!project_dlg) {
1724         KILE_DEBUG_MAIN << "grep guard: create findInProjects dlg" << endl;
1725         project_dlg = new KileDialog::FindFilesDialog(mainWindow(), this, KileGrep::Project);
1726         project_dlg->show();
1727         connect(project_dlg, &KileDialog::FindFilesDialog::itemSelected, this, &Kile::grepItemSelected);
1728     }
1729     else {
1730         KILE_DEBUG_MAIN << "grep guard: show findInProjects dlg" << endl;
1731         project_dlg->activateWindow();
1732         project_dlg->raise();
1733     }
1734 }
1735 
1736 /////////////////// PART & EDITOR WIDGET //////////
resetPart()1737 bool Kile::resetPart()
1738 {
1739     KILE_DEBUG_MAIN << "==Kile::resetPart()=============================" << endl;
1740 
1741     statusBar()->reset();
1742     updateModeStatus();
1743     newCaption();
1744 
1745     KTextEditor::View *view = viewManager()->currentTextView();
1746     if (view) {
1747         activateView(view);
1748     }
1749 
1750     return true;
1751 }
1752 
updateUserDefinedMenus()1753 void Kile::updateUserDefinedMenus()
1754 {
1755     m_buildMenuTopLevel = dynamic_cast<QMenu*>(m_mainWindow->guiFactory()->container("menu_build", m_mainWindow));
1756     m_buildMenuCompile  = dynamic_cast<QMenu*>(m_mainWindow->guiFactory()->container("menu_compile", m_mainWindow));
1757     m_buildMenuConvert  = dynamic_cast<QMenu*>(m_mainWindow->guiFactory()->container("menu_convert", m_mainWindow));
1758     m_buildMenuViewer  = dynamic_cast<QMenu*>(m_mainWindow->guiFactory()->container("menu_viewer", m_mainWindow));
1759     m_buildMenuOther   = dynamic_cast<QMenu*>(m_mainWindow->guiFactory()->container("menu_other", m_mainWindow));
1760     m_buildMenuQuickPreview   = dynamic_cast<QMenu*>(m_mainWindow->guiFactory()->container("quickpreview", m_mainWindow));
1761 
1762     m_userMenu->updateGUI();
1763 
1764     setupTools();
1765 }
1766 
enableGUI(bool enable)1767 void Kile::enableGUI(bool enable)
1768 {
1769     // update action lists
1770     QList<QAction *> actions = actionCollection()->actions();
1771     for(QList<QAction *>::iterator itact = actions.begin(); itact != actions.end(); ++itact) {
1772         if (m_dictMenuAction.contains((*itact)->objectName())
1773                 || m_dictMenuFile.contains((*itact)->objectName())) {
1774             (*itact)->setEnabled(enable);
1775         }
1776     }
1777 
1778     // update latex usermenu actions
1779     if ( m_userMenu ) {
1780         QList<QAction *> useractions = m_userMenu->menuActions();
1781         foreach ( QAction *action, useractions ) {
1782             action->setEnabled(enable);
1783         }
1784     }
1785 
1786     // enable or disable userhelp entries
1787     m_help->enableUserhelpEntries(enable);
1788 
1789     QList<QAction*> actionList;
1790     actionList << m_listQuickActions
1791                << m_listCompilerActions
1792                << m_listConverterActions
1793                << m_listViewerActions
1794                << m_listOtherActions;
1795     // enable or disable list actions
1796     for(QList<QAction*>::iterator i = actionList.begin(); i != actionList.end(); ++i) {
1797         (*i)->setEnabled(enable);
1798     }
1799 
1800     // enable or disable bibliography menu entries
1801     actionList = m_bibTagActionMenu->menu()->actions();
1802     for(QList<QAction*>::iterator it = actionList.begin(); it != actionList.end(); ++it) {
1803         (*it)->setEnabled(enable);
1804     }
1805 
1806     QStringList menuList;
1807     menuList << "file" << "edit" << "view" << "menu_build" << "menu_project" << "menu_latex" << "wizard" << "tools";
1808     for(QStringList::iterator it = menuList.begin(); it != menuList.end(); ++it) {
1809         QMenu *menu = dynamic_cast<QMenu*>(guiFactory()->container(*it, this));
1810         if(menu) {
1811             updateMenuActivationStatus(menu);
1812         }
1813     }
1814 
1815     updateUserMenuStatus(enable);
1816 }
1817 
1818 // adds action names to their lists
1819 
initMenu()1820 void Kile::initMenu()
1821 {
1822     QStringList projectlist,filelist,actionlist;
1823 
1824     projectlist
1825             << "project_add" << "project_remove"
1826             << "project_showfiles"
1827             << "project_buildtree" << "project_options" << "project_findfiles"
1828             << "project_archive" << "project_close" << "project_openallfiles"
1829             ;
1830 
1831     filelist
1832     // file
1833             << "convert"
1834             // edit
1835             << "goto_menu" << "complete" << "bullet" << "select"
1836             << "delete" << "environment" << "texgroup"
1837             // build
1838             << "quickpreview" << "menu_compile" << "menu_convert"
1839             << "menu_viewers" << "menu_other"
1840             // latex
1841             << "menu_preamble" << "menu_lists" << "menu_sectioning" << "references"
1842             << "menu_environment" << "menu_listenv" << "menu_tabularenv" << "menu_floatenv"
1843             << "menu_code" << "menu_math" << "menu_mathenv" << "menu_mathamsenv"
1844             << "menu_bibliography" << "menu_fontstyles" << "menu_spacing"
1845             ;
1846 
1847     actionlist
1848     // file
1849             << "file_save_copy_as" << "file_save_all" << "template_create" << "Statistics"
1850             << "file_close" << "file_close_all" << "file_close_all_others"
1851             // edit
1852             << "RefreshStructure"
1853             // view
1854             << "gotoPrevDocument" << "gotoNextDocument"
1855             // build
1856             << "quickpreview_selection" << "quickpreview_environment"
1857             << "quickpreview_subdocument" << "quickpreview_math"
1858             << "WatchFile" << "CleanAll"
1859             // latex
1860             << "tag_documentclass" << "tag_usepackage" << "tag_amspackages" << "tag_env_document"
1861             << "tag_author" << "tag_title" << "tag_maketitle" << "tag_titlepage" << "tag_env_abstract"
1862             << "tag_tableofcontents" << "tag_listoffigures" << "tag_listoftables"
1863             << "tag_makeindex" << "tag_printindex" << "tag_makeglossary" << "tag_env_thebibliography"
1864             << "tag_part" << "tag_chapter" << "tag_section" << "tag_subsection" << "tag_subsubsection"
1865             << "tag_paragraph" << "tag_subparagraph" << "tag_label"
1866             << "tag_ref" << "tag_pageref" << "tag_index" << "tag_footnote" << "tag_cite" // << "citeViewBib"
1867             << "tag_center" << "tag_flushleft" << "tag_flushright"
1868             << "tag_env_minipage" << "tag_quote" << "tag_quotation" << "tag_verse"
1869             << "tag_env_itemize" << "tag_env_enumerate" << "tag_env_description" << "tag_item"
1870             << "tag_env_tabular" << "tag_env_tabular*" << "tag_env_tabbing"
1871             << "tag_multicolumn" << "tag_hline" << "tag_vline" << "tag_cline"
1872             << "tag_figure" << "tag_table"
1873             << "tag_verbatim" << "tag_env_verbatim*" << "tag_verb" << "tag_verb*"
1874             << "tag_mathmode" << "tag_equation" << "tag_subscript" << "tag_superscript"
1875             << "tag_sqrt" << "tag_nroot" << "tag_left" << "tag_right" << "tag_leftright"
1876             << "tag_bigl" << "tag_bigr" << "tag_Bigl" << "tag_Bigr"
1877             << "tag_biggl" << "tag_biggr" << "tag_Biggl" << "tag_Biggr"
1878             << "tag_text" << "tag_intertext" << "tag_boxed"
1879             << "tag_frac" << "tag_dfrac" << "tag_tfrac"
1880             << "tag_binom" << "tag_dbinom" << "tag_tbinom"
1881             << "tag_xleftarrow" << "tag_xrightarrow"
1882             << "tag_mathrm" << "tag_mathit" << "tag_mathbf" << "tag_mathsf"
1883             << "tag_mathtt" << "tag_mathcal" << "tag_mathbb" << "tag_mathfrak"
1884             << "tag_acute" << "tag_grave" << "tag_tilde" << "tag_bar" << "tag_vec"
1885             << "tag_hat" << "tag_check" << "tag_breve" << "tag_dot" << "tag_ddot"
1886             << "tag_space_small" << "tag_space_medium" << "tag_space_large"
1887             << "tag_quad" << "tag_qquad" << "tag_enskip"
1888             << "tag_env_displaymath" << "tag_env_equation" << "tag_env_equation*"
1889             << "tag_env_array"
1890             << "tag_env_multline" << "tag_env_multline*" << "tag_env_split"
1891             << "tag_env_gather" << "tag_env_gather*" << "tag_env_align" << "tag_env_align*"
1892             << "tag_env_flalign" << "tag_env_flalign*" << "tag_env_alignat" << "tag_env_alignat*"
1893             << "tag_env_aligned" << "tag_env_gathered" << "tag_env_alignedat" << "tag_env_cases"
1894             << "tag_env_matrix" << "tag_env_pmatrix" << "tag_env_vmatrix"
1895             << "tag_env_VVmatrix" << "tag_env_bmatrix" << "tag_env_BBmatrix"
1896             // bibliography stuff
1897             << "menu_bibliography"
1898             << "setting_bibtex" << "setting_biblatex"
1899             << "tag_textit" << "tag_textsl" << "tag_textbf" << "tag_underline"
1900             << "tag_texttt" << "tag_textsc" << "tag_emph" << "tag_strong"
1901             << "tag_rmfamily" << "tag_sffamily" << "tag_ttfamily"
1902             << "tag_mdseries" << "tag_bfseries" << "tag_upshape"
1903             << "tag_itshape" << "tag_slshape" << "tag_scshape"
1904             << "tag_newline" << "tag_newpage" << "tag_linebreak" << "tag_pagebreak"
1905             << "tag_bigskip" << "tag_medskip" << "tag_smallskip"
1906             << "tag_hspace" << "tag_hspace*" << "tag_vspace" << "tag_vspace*"
1907             << "tag_hfill" << "tag_hrulefill" << "tag_dotfill" << "tag_vfill"
1908             << "tag_includegraphics" << "tag_include" << "tag_input"
1909             // wizard
1910             << "wizard_tabular" << "wizard_array" << "wizard_tabbing"
1911             << "wizard_float" << "wizard_mathenv"
1912             << "wizard_usermenu" << "wizard_usermenu2"
1913             // settings
1914             << "Mode"
1915             // help
1916             << "help_context"
1917             // action lists
1918             << "structure_list" << "size_list" << "other_list"
1919             << "left_list" << "right_list"
1920             // tool lists
1921             << "list_compiler_select" << "list_convert_select" << "list_view_select" << "list_quick_select"
1922             // user help
1923             << "help_userhelp"
1924             << "edit_next_bullet" << "edit_prev_bullet"
1925             << "edit_next_section" << "edit_prev_section" << "edit_next_paragraph" << "edit_prev_paragraph"
1926 
1927             << "edit_select_inside_env" << "edit_select_outside_env" << "edit_select_inside_group"
1928             << "edit_select_outside_group" << "edit_select_mathgroup" << "edit_select_paragraph"
1929             << "edit_select_line" << "edit_select_word"
1930 
1931             << "edit_delete_inside_env" << "edit_delete_outside_env" << "edit_delete_inside_group"
1932             << "edit_delete_outside_group" << "edit_delete_mathgroup" << "edit_delete_paragraph"
1933             << "edit_delete_eol" << "edit_delete_word"
1934 
1935             << "edit_complete_word" << "edit_complete_env" << "edit_complete_abbrev"
1936 
1937             << "edit_begin_env" << "edit_end_env" << "edit_match_env" << "edit_close_env" << "edit_closeall_env"
1938 
1939             << "edit_begin_group" << "edit_end_group" << "edit_match_group" << "edit_close_group"
1940 
1941             << "file_export_ascii" << "file_export_latin1" << "file_export_latin2" << "file_export_latin3"
1942             << "file_export_latin4" << "file_export_latin5" << "file_export_latin9" << "file_export_cp1250"
1943             << "file_export_cp1252"
1944             ;
1945 
1946     setMenuItems(projectlist,m_dictMenuProject);
1947     setMenuItems(filelist,m_dictMenuFile);
1948     setMenuItems(actionlist,m_dictMenuAction);
1949 }
1950 
setMenuItems(QStringList & list,QMap<QString,bool> & dict)1951 void Kile::setMenuItems(QStringList &list, QMap<QString,bool> &dict)
1952 {
1953     for ( QStringList::Iterator it=list.begin(); it!=list.end(); ++it ) {
1954         dict[(*it)] = true;
1955     }
1956 }
1957 
updateMenu()1958 void Kile::updateMenu()
1959 {
1960     KILE_DEBUG_MAIN << "==Kile::updateMenu()====================" << endl;
1961     QAction *a;
1962     QMap<QString,bool>::Iterator it;
1963 
1964     // update project menus
1965     m_actRecentProjects->setEnabled( m_actRecentProjects->items().count() > 0 );
1966     bool project_open = ( docManager()->isProjectOpen() ) ;
1967 
1968     for ( it=m_dictMenuProject.begin(); it!=m_dictMenuProject.end(); ++it ) {
1969         a = actionCollection()->action(it.key());
1970         if(a) {
1971             a->setEnabled(project_open);
1972         }
1973     }
1974 
1975     // project_show is only enabled, when more than 1 project is opened
1976     a = actionCollection()->action("project_show");
1977     if(a) {
1978         a->setEnabled(project_open && docManager()->projects().count() > 1);
1979     }
1980 
1981     // update file menus
1982     m_actRecentFiles->setEnabled( m_actRecentFiles->items().count() > 0 );
1983     bool file_open = ( viewManager()->currentTextView() );
1984     KILE_DEBUG_MAIN << "\tprojectopen=" << project_open << " fileopen=" << file_open << endl;
1985 
1986     enableGUI(file_open);
1987 }
1988 
updateMenuActivationStatus(QMenu * menu)1989 bool Kile::updateMenuActivationStatus(QMenu *menu)
1990 {
1991     return updateMenuActivationStatus(menu, QSet<QMenu*>());
1992 }
1993 
1994 
updateMenuActivationStatus(QMenu * menu,const QSet<QMenu * > & visited)1995 bool Kile::updateMenuActivationStatus(QMenu *menu, const QSet<QMenu*>& visited)
1996 {
1997     if(visited.contains(menu)) {
1998         qWarning() << "Recursive menu structure detected - aborting!";
1999         return true;
2000     }
2001     if(menu->objectName() == "usermenu-submenu") {
2002         menu->setEnabled(true);
2003         return true;
2004     }
2005 
2006     bool enabled = false;
2007     QList<QAction*> actionList = menu->actions();
2008 
2009     for(QList<QAction*>::iterator it = actionList.begin(); it != actionList.end(); ++it) {
2010         QAction *action = *it;
2011         QMenu *subMenu = action->menu();
2012         if(subMenu) {
2013             QSet<QMenu*> newVisited(visited);
2014             newVisited.insert(menu);
2015             if(updateMenuActivationStatus(subMenu, newVisited)) {
2016                 enabled = true;
2017             }
2018         }
2019         else if(!action->isSeparator() && action->isEnabled()) {
2020             enabled = true;
2021         }
2022     }
2023     menu->setEnabled(enabled);
2024     return enabled;
2025 }
2026 
updateLatexenuActivationStatus(QMenu * menu,bool state)2027 void Kile::updateLatexenuActivationStatus(QMenu *menu, bool state)
2028 {
2029     if ( menu->isEmpty() || !viewManager()->currentTextView() ) {
2030         state = false;
2031     }
2032     menu->menuAction()->setVisible(state);
2033 }
2034 
runTool(const QString & tool)2035 void Kile::runTool(const QString& tool)
2036 {
2037     runToolWithConfig(tool, QString());
2038 }
2039 
runToolWithConfig(const QString & toolName,const QString & config)2040 void Kile::runToolWithConfig(const QString &toolName, const QString &config)
2041 {
2042     KILE_DEBUG_MAIN << toolName << config;
2043 
2044     focusLog();
2045     KileTool::Base *tool = m_manager->createTool(toolName, config);
2046 
2047     if(!tool || (tool->requestSaveAll() && !m_docManager->fileSaveAll())) {
2048         delete tool;
2049         return;
2050     }
2051 
2052     return m_manager->run(tool);
2053 }
2054 
cleanAll(KileDocument::TextInfo * docinfo)2055 void Kile::cleanAll(KileDocument::TextInfo *docinfo)
2056 {
2057     const QString noactivedoc = i18n("There is no active document or it is not saved.");
2058     if(!docinfo) {
2059         KTextEditor::Document *doc = activeTextDocument();
2060         if (doc) {
2061             docinfo = docManager()->textInfoFor(doc);
2062         }
2063         else {
2064             errorHandler()->printMessage(KileTool::Error, noactivedoc, i18n("Clean"));
2065             return;
2066         }
2067     }
2068 
2069     if (docinfo) {
2070         docManager()->cleanUpTempFiles(docinfo->url(), false);
2071     }
2072 }
2073 
refreshStructure()2074 void Kile::refreshStructure()
2075 {
2076     viewManager()->updateStructure(true);
2077 }
2078 
insertTag(const KileAction::TagData & data)2079 void Kile::insertTag(const KileAction::TagData& data)
2080 {
2081     errorHandler()->clearMessages();
2082 
2083     if(data.description.length() > 0) {
2084         focusLog();
2085         errorHandler()->printMessage(data.description);
2086     }
2087 
2088     KTextEditor::View *view = viewManager()->currentTextView();
2089 
2090     if(!view) {
2091         return;
2092     }
2093 
2094     focusTextView(view);
2095 
2096     editorExtension()->insertTag(data, view);
2097 }
2098 
insertTag(const QString & tagB,const QString & tagE,int dx,int dy)2099 void Kile::insertTag(const QString& tagB, const QString& tagE, int dx, int dy)
2100 {
2101     insertTag(KileAction::TagData(QString(), tagB, tagE, dx, dy));
2102 }
2103 
insertAmsTag(const KileAction::TagData & data)2104 void Kile::insertAmsTag(const KileAction::TagData& data)
2105 {
2106     insertTag(data, QStringList("amsmath"));
2107 }
2108 
insertTag(const KileAction::TagData & data,const QList<Package> & pkgs)2109 void Kile::insertTag(const KileAction::TagData& data,const QList<Package> &pkgs) {
2110 
2111     QStringList packages;
2112     QString pkgName;
2113 
2114     QList<Package>::const_iterator it;
2115     for(it = pkgs.begin(); it != pkgs.end() ; it++) {
2116         pkgName = (*it).name;
2117         if(!pkgName.isEmpty()) {
2118             packages.append(pkgName);
2119         }
2120     }
2121 
2122     insertTag(data,packages);
2123 }
2124 
insertTag(const KileAction::TagData & data,const QStringList & pkgs)2125 void Kile::insertTag(const KileAction::TagData& data,const QStringList &pkgs)
2126 {
2127     KILE_DEBUG_MAIN << "void Kile::insertTag(const KileAction::TagData& data,const QStringList " << pkgs.join(",") << ")" << endl;
2128     insertTag(data);
2129 
2130     KileDocument::TextInfo *docinfo = docManager()->textInfoFor(getCompileName());
2131     if(docinfo) {
2132         QStringList packagelist = allPackages(docinfo);
2133         QStringList::const_iterator it;
2134         QStringList warnPkgs;
2135 
2136         for ( it = pkgs.begin(); it != pkgs.end(); ++it) {
2137             if(!packagelist.contains(*it)) {
2138                 warnPkgs.append(*it);
2139             }
2140         }
2141 
2142         if(warnPkgs.count() > 0) {
2143             if(warnPkgs.count() == 1) {
2144                 errorHandler()->printMessage(KileTool::Error, i18n("You have to include the package %1.", warnPkgs.join(",")), i18n("Insert text"));
2145             }
2146             else {
2147                 errorHandler()->printMessage(KileTool::Error, i18n("You have to include the packages %1.", warnPkgs.join(",")), i18n("Insert text"));
2148             }
2149         }
2150     }
2151 }
2152 
insertText(const QString & text)2153 void Kile::insertText(const QString &text)
2154 {
2155     if(text.indexOf("%C")>=0)
2156         insertTag(KileAction::TagData(QString(), text, QString(), 0, 0));
2157     else
2158         insertTag(KileAction::TagData(QString(), text, "%C", 0, 0));
2159 }
2160 
insertText(const QString & text,const QStringList & pkgs)2161 void Kile::insertText(const QString &text, const QStringList &pkgs)
2162 {
2163     insertTag(KileAction::TagData(QString(), text, "%C", 0, 0), pkgs);
2164 }
2165 
insertText(const QString & text,const QList<Package> & pkgs)2166 void Kile::insertText(const QString &text, const QList<Package> &pkgs)
2167 {
2168     insertTag(KileAction::TagData(QString(), text, "%C", 0, 0), pkgs);
2169 }
2170 
quickDocument()2171 void Kile::quickDocument()
2172 {
2173     KileDialog::QuickDocument *dlg = new KileDialog::QuickDocument(m_config.data(), this, "Quick Start", i18n("Quick Start"));
2174 
2175     if(dlg->exec()) {
2176         if(!viewManager()->currentTextView()) {
2177             docManager()->createNewLaTeXDocument();
2178         }
2179         insertTag( dlg->tagData() );
2180         viewManager()->updateStructure(true);
2181     }
2182     delete dlg;
2183 }
2184 
quickArray()2185 void Kile::quickArray()
2186 {
2187     quickTabulardialog(false);
2188 }
2189 
quickTabular()2190 void Kile::quickTabular()
2191 {
2192     quickTabulardialog(true);
2193 }
2194 
quickTabulardialog(bool tabularenv)2195 void Kile::quickTabulardialog(bool tabularenv)
2196 {
2197     if(!viewManager()->currentTextView()) {
2198         return;
2199     }
2200 
2201     QString env;
2202     if(tabularenv) {
2203         KConfigGroup group = m_config->group("Wizard");
2204         env = group.readEntry("TabularEnvironment", "tabular");
2205     } else {
2206         env = "array";
2207     }
2208 
2209     KileDialog::NewTabularDialog dlg(env, m_latexCommands, m_config.data(), this);
2210     if(dlg.exec()) {
2211         insertTag(dlg.tagData(), dlg.requiredPackages());
2212         if(tabularenv) {
2213             KConfigGroup group = m_config->group("Wizard");
2214             group.writeEntry("TabularEnvironment", dlg.environment());
2215             m_config->sync();
2216         }
2217     }
2218 }
2219 
quickTabbing()2220 void Kile::quickTabbing()
2221 {
2222     if(!viewManager()->currentTextView()) {
2223         return;
2224     }
2225     KileDialog::QuickTabbing *dlg = new KileDialog::QuickTabbing(m_config.data(), this, this, "Tabbing", i18n("Tabbing"));
2226     if(dlg->exec()) {
2227         insertTag(dlg->tagData());
2228     }
2229     delete dlg;
2230 }
2231 
quickFloat()2232 void Kile::quickFloat()
2233 {
2234     if(!viewManager()->currentTextView()) {
2235         return;
2236     }
2237 
2238     KileDialog::FloatEnvironmentDialog *dlg = new KileDialog::FloatEnvironmentDialog(m_config.data(), this, this);
2239     if(dlg->exec()) {
2240         insertTag(dlg->tagData());
2241     }
2242     delete dlg;
2243 }
2244 
quickMathenv()2245 void Kile::quickMathenv()
2246 {
2247     if(!viewManager()->currentTextView()) {
2248         return;
2249     }
2250 
2251     KileDialog::MathEnvironmentDialog *dlg = new KileDialog::MathEnvironmentDialog(this, m_config.data(), this, m_latexCommands);
2252     if(dlg->exec()) {
2253         insertTag(dlg->tagData());
2254     }
2255     delete dlg;
2256 }
2257 
quickPostscript()2258 void Kile::quickPostscript()
2259 {
2260     QString startdir = QDir::homePath();
2261     QString texfilename;
2262 
2263     KTextEditor::View *view = viewManager()->currentTextView();
2264     if(view) {
2265         startdir = QFileInfo(view->document()->url().toLocalFile()).path();
2266         texfilename = getCompileName();
2267     }
2268 
2269     KileDialog::PostscriptDialog *dlg = new KileDialog::PostscriptDialog(this, texfilename, startdir, m_extensions->latexDocuments(), errorHandler(), m_outputWidget);
2270     dlg->exec();
2271     delete dlg;
2272 }
2273 
quickPdf()2274 void Kile::quickPdf()
2275 {
2276     QString startDir = QDir::homePath();
2277     QString texFileName;
2278 
2279     KTextEditor::View *view = viewManager()->currentTextView();
2280     if(view) {
2281         startDir = QFileInfo(view->document()->url().toLocalFile()).path();
2282         texFileName = getCompileName();
2283     }
2284 
2285     KileDialog::PdfDialog *dlg = new KileDialog::PdfDialog(m_mainWindow, texFileName, startDir, m_extensions->latexDocuments(), m_manager, errorHandler(), m_outputWidget);
2286     connect(dlg, &QDialog::finished, dlg, &QObject::deleteLater);
2287 
2288     dlg->open();
2289 }
2290 
quickUserMenuDialog()2291 void Kile::quickUserMenuDialog()
2292 {
2293     m_userMenu->removeShortcuts();
2294     QPointer<KileMenu::UserMenuDialog> dlg = new KileMenu::UserMenuDialog(m_config.data(), this, m_userMenu, m_userMenu->xmlFile(), m_mainWindow);
2295 
2296     dlg->exec();
2297 
2298     connect(dlg, &QDialog::finished, this, [this] (int result) {
2299         Q_UNUSED(result);
2300 
2301         // tell all the documents and views to update their action shortcuts (bug 247646)
2302         docManager()->reloadXMLOnAllDocumentsAndViews();
2303 
2304         // a new usermenu could have been installed, even if the return value is QDialog::Rejected
2305         m_userMenu->refreshActionProperties();
2306     });
2307 
2308     delete dlg;
2309 }
2310 
slotUpdateUserMenuStatus()2311 void Kile::slotUpdateUserMenuStatus()
2312 {
2313     KILE_DEBUG_MAIN << "slot update usermenu status";
2314     updateUserMenuStatus(true);
2315 }
2316 
updateUserMenuStatus(bool state)2317 void Kile::updateUserMenuStatus(bool state)
2318 {
2319     KILE_DEBUG_MAIN << "update usermenu status";
2320 
2321     if(m_userMenu) {
2322         QMenu *menu = m_userMenu->getMenuItem();
2323         if(menu) {
2324             updateLatexenuActivationStatus(menu,state);
2325         }
2326     }
2327 }
2328 
helpLaTex()2329 void Kile::helpLaTex()
2330 {
2331     QString loc = KileUtilities::locate(QStandardPaths::AppDataLocation, "help/latexhelp.html");
2332     KileTool::Base *tool = toolManager()->createTool("ViewHTML", QString(), false);
2333     if(!tool) {
2334         errorHandler()->printMessage(KileTool::Error, i18n("Could not create the \"ViewHTML\" tool. Please reset the tools."));
2335         return;
2336     }
2337     tool->setFlags(KileTool::NeedSourceExists | KileTool::NeedSourceRead);
2338     tool->setSource(loc);
2339     tool->setTargetPath(loc);
2340     tool->prepareToRun();
2341     m_manager->run(tool);
2342 }
2343 
readGUISettings()2344 void Kile::readGUISettings()
2345 {
2346 }
2347 
2348 // transform old user tags to xml file
transformOldUserTags()2349 void Kile::transformOldUserTags()
2350 {
2351     KILE_DEBUG_MAIN << "Convert old user tags";
2352     QString xmldir = KileUtilities::writableLocation(QStandardPaths::AppDataLocation) + "/usermenu/";
2353     // create dir if not existing
2354     QDir testDir(xmldir);
2355     if (!testDir.exists()) {
2356         testDir.mkpath(xmldir);
2357     }
2358 
2359     KConfigGroup userGroup = m_config->group("User");
2360     int len = userGroup.readEntry("nUserTags", 0);
2361 
2362     if ( len > 0) {
2363         QString usertagfile = "usertags.xml";
2364         QString  filename = xmldir + usertagfile;
2365         KILE_DEBUG_MAIN << "-convert user tags " << filename;
2366 
2367         QFile file(filename);
2368         if ( !file.open(QFile::WriteOnly | QFile::Text) ) {
2369             KILE_DEBUG_MAIN << "-Error - could not open file to write: " << filename;
2370             return;
2371         }
2372 
2373         KILE_DEBUG_MAIN << "Write xml: " << filename;
2374         QXmlStreamWriter xml(&file);
2375         xml.setAutoFormatting(true);
2376         xml.setAutoFormattingIndent(2) ;
2377 
2378         xml.writeStartDocument();
2379         xml.writeStartElement("UserMenu");
2380 
2381         for (int i = 0; i < len; ++i) {
2382             const QString tagNameConfigKey = "userTagName" + QString::number(i);
2383             const QString tagname = userGroup.readEntry(tagNameConfigKey, i18n("No Name"));
2384             const QString tagConfigKey = "userTag" + QString::number(i);
2385             QString tag = userGroup.readEntry(tagConfigKey, "");
2386             tag = tag.replace('\n',"\\n");
2387 
2388             xml.writeStartElement("menu");
2389             xml.writeAttribute("type", "text");
2390             xml.writeTextElement(KileMenu::UserMenuData::xmlMenuTagName(KileMenu::UserMenuData::XML_TITLE), tagname);
2391             xml.writeTextElement(KileMenu::UserMenuData::xmlMenuTagName(KileMenu::UserMenuData::XML_PLAINTEXT), tag);
2392             xml.writeTextElement(KileMenu::UserMenuData::xmlMenuTagName(KileMenu::UserMenuData::XML_SHORTCUT), QString("Ctrl+Shift+%1").arg(i+1));
2393             xml.writeEndElement();
2394 
2395             userGroup.deleteEntry(tagNameConfigKey);
2396             userGroup.deleteEntry(tagConfigKey);
2397         }
2398         xml.writeEndDocument();
2399         file.close();
2400 
2401         // save current xml file
2402         KileConfig::setUserMenuFile(usertagfile);
2403     }
2404     userGroup.deleteEntry("nUserTags");
2405 }
2406 
transformOldUserSettings()2407 void Kile::transformOldUserSettings()
2408 {
2409     //delete old editor key
2410     if(m_config->hasGroup("Editor")) {
2411         m_config->deleteGroup("Editor");
2412     }
2413 
2414     //convert user tools to new KileTool classes
2415     KConfigGroup userGroup = m_config->group("User");
2416     userItem tempItem;
2417     int len = userGroup.readEntry("nUserTools", 0);
2418     for (int i=0; i< len; ++i) {
2419         tempItem.name = userGroup.readEntry("userToolName" + QString::number(i), i18n("no name"));
2420         tempItem.tag = userGroup.readEntry("userTool" + QString::number(i), "");
2421         m_listUserTools.append(tempItem);
2422     }
2423     if(len > 0) {
2424         //move the tools
2425         userGroup.writeEntry("nUserTools", 0);
2426         for(int i = 0; i < len; ++i) {
2427             tempItem = m_listUserTools[i];
2428             KConfigGroup toolsGroup = m_config->group("Tools");
2429             toolsGroup.writeEntry(tempItem.name, "Default");
2430 
2431             KileTool::setGUIOptions(tempItem.name, "Other", "preferences-other", m_config.data());
2432 
2433             KConfigGroup group = m_config->group(KileTool::groupFor(tempItem.name, "Default"));
2434             QString bin = KRun::binaryName(tempItem.tag, false);
2435             group.writeEntry("command", bin);
2436             group.writeEntry("options", tempItem.tag.mid(bin.length()));
2437             group.writeEntry("class", "Base");
2438             group.writeEntry("type", "Process");
2439             group.writeEntry("from", "");
2440             group.writeEntry("to", "");
2441 
2442             if(i < 10) {
2443                 QAction *toolAction = static_cast<QAction*>(actionCollection()->action("tool_" + tempItem.name));
2444                 actionCollection()->setDefaultShortcut(toolAction, "Alt+Shift+" + QString::number(i + 1)); //should be alt+shift+
2445             }
2446         }
2447     }
2448 }
2449 
readRecentFileSettings()2450 void Kile::readRecentFileSettings()
2451 {
2452     KConfigGroup group = m_config->group("FilesOpenOnStart");
2453     int n = group.readEntry("NoDOOS", 0);
2454     for (int i = 0; i < n; ++i) {
2455         const QString urlString = group.readPathEntry("DocsOpenOnStart" + QString::number(i), "");
2456         if(urlString.isEmpty()) {
2457             continue;
2458         }
2459         m_listDocsOpenOnStart.append(urlString);
2460         m_listEncodingsOfDocsOpenOnStart.append(group.readPathEntry("EncodingsOfDocsOpenOnStart" + QString::number(i), ""));
2461     }
2462 
2463     n = group.readEntry("NoPOOS", 0);
2464     for(int i = 0; i < n; ++i) {
2465         const QString urlString = group.readPathEntry("ProjectsOpenOnStart" + QString::number(i), "");
2466         if(urlString.isEmpty()) {
2467             continue;
2468         }
2469         m_listProjectsOpenOnStart.append(urlString);
2470     }
2471 }
2472 
readConfig()2473 void Kile::readConfig()
2474 {
2475     m_codeCompletionManager->readConfig(m_config.data());
2476 
2477     if(m_livePreviewManager) {
2478         m_livePreviewManager->readConfig(m_config.data());
2479     }
2480 
2481     //m_edit->initDoubleQuotes();
2482     m_edit->readConfig();
2483     docManager()->updateInfos();
2484     m_jScriptManager->readConfig();
2485     docManager()->readConfig();
2486     viewManager()->readConfig(m_horizontalSplitter);
2487 
2488     // set visible views in sidebar
2489     m_sideBar->setPageVisible(m_scriptsManagementWidget, KileConfig::scriptingEnabled());
2490     m_sideBar->setPageVisible(m_commandViewToolBox, KileConfig::showCwlCommands());
2491     m_sideBar->setPageVisible(m_kileAbbrevView, KileConfig::completeShowAbbrev());
2492 
2493     m_scriptsManagementWidget->setScriptNameColumnWidth(KileConfig::scriptNameColumnWidth());
2494 
2495     if(KileConfig::displayMFUS()) {
2496         enableSymbolViewMFUS();
2497     }
2498     else {
2499         disableSymbolViewMFUS();
2500     }
2501     m_commandViewToolBox->readCommandViewFiles();
2502     abbreviationManager()->readAbbreviationFiles();
2503 }
2504 
saveSettings()2505 void Kile::saveSettings()
2506 {
2507     m_fileBrowserWidget->writeConfig();
2508 
2509     if(m_livePreviewManager) {
2510         m_livePreviewManager->writeConfig();
2511     }
2512 
2513     m_symbolViewMFUS->writeConfig();
2514     saveLastSelectedAction();
2515     // Store recent files
2516     m_actRecentFiles->saveEntries(m_config->group("Recent Files"));
2517     m_actRecentProjects->saveEntries(m_config->group("Projects"));
2518 
2519     m_config->deleteGroup("FilesOpenOnStart");
2520     if (KileConfig::restore())
2521     {
2522         KConfigGroup configGroup = m_config->group("FilesOpenOnStart");
2523         KileConfig::setSingleFileMasterDocument(getMasterDocumentFileName());
2524         configGroup.writeEntry("NoDOOS", m_listDocsOpenOnStart.count());
2525         for (int i = 0; i < m_listDocsOpenOnStart.count(); ++i) {
2526             configGroup.writePathEntry("DocsOpenOnStart" + QString::number(i), m_listDocsOpenOnStart[i]);
2527             configGroup.writePathEntry("EncodingsOfDocsOpenOnStart" + QString::number(i), m_listEncodingsOfDocsOpenOnStart[i]);
2528         }
2529 
2530         configGroup.writeEntry("NoPOOS", m_listProjectsOpenOnStart.count());
2531         for (int i = 0; i < m_listProjectsOpenOnStart.count(); ++i) {
2532             configGroup.writePathEntry("ProjectsOpenOnStart"+QString::number(i), m_listProjectsOpenOnStart[i]);
2533         }
2534     }
2535 
2536     KConfigGroup configGroup = KSharedConfig::openConfig()->group("KileMainWindow");
2537     saveMainWindowSettings(configGroup);
2538 
2539     docManager()->writeConfig();
2540     viewManager()->writeConfig();
2541 
2542     scriptManager()->writeConfig();
2543     KileConfig::setScriptNameColumnWidth(m_scriptsManagementWidget->scriptNameColumnWidth());
2544 
2545     KileConfig::setRCVersion(KILERC_VERSION);
2546     KileConfig::setMainwindowWidth(width());
2547     KileConfig::setMainwindowHeight(height());
2548 
2549     QList<int> sizes;
2550     QList<int>::Iterator it;
2551     sizes = m_horizontalSplitter->sizes();
2552     it = sizes.begin();
2553     KileConfig::setHorizontalSplitterLeft(*it);
2554     ++it;
2555     KileConfig::setHorizontalSplitterRight(*it);
2556     sizes.clear();
2557     sizes = m_verticalSplitter->sizes();
2558     it = sizes.begin();
2559     KileConfig::setVerticalSplitterTop(*it);
2560     ++it;
2561     KileConfig::setVerticalSplitterBottom(*it);
2562 
2563     KileConfig::setSideBar(!m_sideBar->isHidden()); // do not use 'isVisible()'!
2564     KileConfig::setSideBarSize(m_sideBar->directionalSize());
2565     KileConfig::setBottomBar(!m_bottomBar->isHidden()); // do not use 'isVisible()'!
2566     KileConfig::setBottomBarSize(m_bottomBar->directionalSize());
2567     KileConfig::setBottomBarIndex(m_bottomBar->currentTab());
2568 
2569     KileConfig::setSelectedLeftView(m_sideBar->currentTab());
2570 
2571     abbreviationManager()->saveLocalAbbreviations();
2572 
2573     KileConfig::self()->save();
2574     m_config->sync();
2575 }
2576 
2577 /////////////////  OPTIONS ////////////////////
setMasterDocumentFileName(const QString & fileName)2578 void Kile::setMasterDocumentFileName(const QString& fileName)
2579 {
2580     if(fileName.isEmpty() || !viewManager()->viewForLocalFilePresent(fileName)) {
2581         return;
2582     }
2583 
2584     m_masterDocumentFileName = fileName;
2585 
2586     QString shortName = QFileInfo(m_masterDocumentFileName).fileName();
2587 
2588     ModeAction->setText(i18n("Normal mode (current master document: %1)", shortName));
2589     ModeAction->setChecked(true);
2590     m_singlemode = false;
2591     updateModeStatus();
2592     emit masterDocumentChanged();
2593     KILE_DEBUG_MAIN << "SETTING master to " << m_masterDocumentFileName << " singlemode = " << m_singlemode << endl;
2594 }
2595 
clearMasterDocument()2596 void Kile::clearMasterDocument()
2597 {
2598     ModeAction->setText(i18n("Define Current Document as 'Master Document'"));
2599     ModeAction->setChecked(false);
2600     m_singlemode = true;
2601     m_masterDocumentFileName.clear();
2602     updateModeStatus();
2603     emit masterDocumentChanged();
2604     KILE_DEBUG_MAIN << "CLEARING master document";
2605 }
2606 
toggleMasterDocumentMode()2607 void Kile::toggleMasterDocumentMode()
2608 {
2609     if (!m_singlemode) {
2610         clearMasterDocument();
2611     }
2612     else if (m_singlemode && viewManager()->currentTextView()) {
2613         QString name = getName();
2614         if(name.isEmpty()) {
2615             ModeAction->setChecked(false);
2616             KMessageBox::error(this, i18n("In order to define the current document as a master document, it has to be saved first."));
2617             return;
2618         }
2619         setMasterDocumentFileName(name);
2620     }
2621     else {
2622         ModeAction->setChecked(false);
2623         updateModeStatus();
2624     }
2625 }
2626 
toggleWatchFile()2627 void Kile::toggleWatchFile()
2628 {
2629     m_bWatchFile=!m_bWatchFile;
2630 
2631     if (m_bWatchFile) {
2632         WatchFileAction->setChecked(true);
2633     }
2634     else {
2635         WatchFileAction->setChecked(false);
2636     }
2637 }
2638 
2639 // execute configuration dialog
2640 
generalOptions()2641 void Kile::generalOptions()
2642 {
2643     KileDialog::Config *dlg = new KileDialog::Config(m_config.data(), this, this);
2644     KileUtilities::scheduleCenteringOfWidget(dlg);
2645 
2646     if (dlg->exec()) {
2647         // update new settings
2648         readConfig();
2649         saveLastSelectedAction(); // save the old current tools before calling setupTools() which calls restoreLastSelectedActions()
2650         setupTools();
2651         m_help->update();
2652         newCaption(); // for the 'showFullPathInWindowTitle' setting
2653 
2654         configurationManager()->emitConfigChanged();
2655 
2656         //stop/restart LyX server if necessary
2657         if(KileConfig::runLyxServer() && !m_lyxserver->isRunning()) {
2658             m_lyxserver->start();
2659         }
2660 
2661         if(!KileConfig::runLyxServer() && m_lyxserver->isRunning()) {
2662             m_lyxserver->stop();
2663         }
2664     }
2665 
2666     delete dlg;
2667 }
2668 
slotPerformCheck()2669 void Kile::slotPerformCheck()
2670 {
2671     // first we have to disable the live preview that may be running, and clear the master document
2672     const bool livePreviewEnabledForFreshlyOpenedDocuments = KileConfig::previewEnabledForFreshlyOpenedDocuments();
2673     const bool livePreviewEnabledForCurrentDocument = livePreviewManager() && livePreviewManager()->isLivePreviewEnabledForCurrentDocument();
2674     if (livePreviewManager()) {
2675         KileConfig::setPreviewEnabledForFreshlyOpenedDocuments(false);
2676         livePreviewManager()->setLivePreviewEnabledForCurrentDocument(false);
2677     }
2678 
2679     // we show the message output widget in the bottom bar and shrink the side bar
2680     int sideBarTab = m_sideBar->currentTab();
2681     int bottomBarTab = m_bottomBar->currentTab();
2682 
2683     m_sideBar->shrink();
2684     m_bottomBar->switchToTab(0); // show the log widget
2685 
2686     int outputTab = m_errorHandler->currentOutputTabIndex();
2687     m_errorHandler->showMessagesOutput();
2688 
2689     QString currentMasterDocument = m_masterDocumentFileName;
2690     if(!m_singlemode) {
2691         clearMasterDocument();
2692     }
2693     // we hide the editor pane and tabs
2694     m_viewManager->setTabsAndEditorVisible(false);
2695 
2696     // now, we can run the tests
2697     KileDialog::ConfigChecker *dlg = new KileDialog::ConfigChecker(this);
2698     dlg->exec();
2699     delete dlg;
2700 
2701     m_errorHandler->clearMessages();
2702     m_errorHandler->clearErrorOutput();
2703 
2704     // finally, we restore the rest to what it was before launching the tests
2705     m_viewManager->setTabsAndEditorVisible(true);
2706     if(!currentMasterDocument.isEmpty()) {
2707         setMasterDocumentFileName(currentMasterDocument);
2708     }
2709 
2710     m_errorHandler->setCurrentOutputTab(outputTab);
2711 
2712     if(sideBarTab >= 0) {
2713         m_sideBar->switchToTab(sideBarTab);
2714     }
2715     if(bottomBarTab < 0) {
2716         m_bottomBar->shrink();
2717     }
2718     else {
2719         m_bottomBar->switchToTab(bottomBarTab);
2720     }
2721 
2722     if (livePreviewManager()) {
2723         KileConfig::setPreviewEnabledForFreshlyOpenedDocuments(livePreviewEnabledForFreshlyOpenedDocuments);
2724         if(livePreviewEnabledForCurrentDocument) {
2725             livePreviewManager()->setLivePreviewEnabledForCurrentDocument(true);
2726         }
2727     }
2728 }
2729 
aboutEditorComponent()2730 void Kile::aboutEditorComponent()
2731 {
2732     KTextEditor::Editor *editor = m_docManager->getEditor();
2733     if(!editor) {
2734         return;
2735     }
2736     KAboutApplicationDialog dialog(editor->aboutData(), this);
2737     dialog.exec();
2738 }
2739 
2740 /////////////// KEYS - TOOLBARS CONFIGURATION ////////////////
configureKeys()2741 void Kile::configureKeys()
2742 {
2743     KShortcutsDialog dlg(KShortcutsEditor::AllActions, KShortcutsEditor::LetterShortcutsAllowed, this);
2744 // due to bug 280988, we can't add all the clients...
2745 // 	QList<KXMLGUIClient*> clients = guiFactory()->clients();
2746 // 	for(QList<KXMLGUIClient*>::iterator it = clients.begin(); it != clients.end(); ++it) {
2747 // 		dlg.addCollection((*it)->actionCollection());
2748 // 	}
2749     dlg.addCollection(mainWindow()->actionCollection());
2750     KTextEditor::View *view = m_viewManager->currentTextView();
2751     if(view) {
2752         dlg.addCollection(view->actionCollection());
2753     }
2754     KParts::ReadOnlyPart *part = viewManager()->viewerPart();
2755     if(part) {
2756         dlg.addCollection(part->actionCollection());
2757     }
2758     dlg.configure();
2759 
2760     // tell all the documents and views to update their action shortcuts (bug 247646)
2761     docManager()->reloadXMLOnAllDocumentsAndViews();
2762 
2763     // tell m_userMenu that key bindings may have been changed
2764     m_userMenu->updateKeyBindings();
2765 }
2766 
configureToolbars()2767 void Kile::configureToolbars()
2768 {
2769     {
2770         KConfigGroup configGroup = KSharedConfig::openConfig()->group("KileMainWindow");
2771         saveMainWindowSettings(configGroup);
2772     }
2773 
2774     KEditToolBar dlg(factory());
2775     connect(&dlg, &KEditToolBar::newToolBarConfig, this, [this] () {
2776         setUpdatesEnabled(false);
2777         applyMainWindowSettings(m_config->group("KileMainWindow"));
2778 
2779         updateUserDefinedMenus();
2780         setUpdatesEnabled(true);
2781     });
2782     dlg.exec();
2783 }
2784 
2785 //////////////////// CLEAN BIB /////////////////////
cleanBib()2786 void Kile::cleanBib()
2787 {
2788     KTextEditor::View *view = viewManager()->currentTextView();
2789     if ( ! view )
2790         return;
2791 
2792     QRegExp reOptional( "(ALT|OPT)(\\w+)\\s*=\\s*(\\S.*)" );
2793     QRegExp reNonEmptyEntry( ".*\\w.*" );
2794 
2795     QString s;
2796     int i = 0;
2797     while(i < view->document()->lines()) {
2798         s = view->document()->line(i);
2799 
2800         // do we have a line that starts with ALT or OPT?
2801         if(reOptional.indexIn(s) >= 0) {
2802             // yes! capture type and entry
2803             QString type = reOptional.cap( 2 );
2804             QString entry = reOptional.cap( 3 );
2805             view->document()->removeLine( i );
2806             view->document()->setModified(true);
2807             if(reNonEmptyEntry.indexIn(entry) >= 0) {
2808                 type.append(" = ");
2809                 type.append(entry);
2810                 view->document()->insertLine(i, type);
2811                 ++i;
2812             }
2813         }
2814         else {
2815             ++i;
2816         }
2817     }
2818     int j = 0;
2819     for (i = 0; i < view->document()->lines(); ++i) {
2820         j = i+1;
2821         if(j < view->document()->lines() && view->document()->line(j).contains(QRegExp("^\\s*\\}\\s*$"))) {
2822             s =  view->document()->line(i);
2823             view->document()->removeLine(i);
2824             s.remove(QRegExp(",\\s*$"));
2825             view->document()->setModified(true);
2826             view->document()->insertLine(i, s);
2827         }
2828     }
2829 }
2830 
includeGraphics()2831 void Kile::includeGraphics()
2832 {
2833     KTextEditor::View *view = viewManager()->currentTextView();
2834     if ( !view ) return;
2835 
2836     QFileInfo fi( view->document()->url().toLocalFile() );
2837     KileDialog::IncludeGraphics *dialog = new KileDialog::IncludeGraphics(this, fi.path(), this);
2838 
2839     if ( dialog->exec() == QDialog::Accepted )
2840     {
2841         insertTag(dialog->getTemplate(), "%C", 0,0);
2842         docManager()->projectAddFile( dialog->getFilename(),true );
2843     }
2844 
2845     delete dialog;
2846 }
2847 
slotToggleFullScreen()2848 void Kile::slotToggleFullScreen()
2849 {
2850     if (!m_pFullScreen->isChecked()) {
2851         setWindowState( windowState() & ~Qt::WindowFullScreen );
2852     }
2853     else {
2854         setWindowState( windowState() | Qt::WindowFullScreen );
2855     }
2856 }
2857 
2858 /////////////// QuickPreview (dani) ////////////////
2859 
2860 // all calls of QuickPreview will get here, so we can decide what to do
2861 // rewritten Sep 05 2006 to work together with preview in the bottom bar
2862 
slotQuickPreview(int type)2863 void Kile::slotQuickPreview(int type)
2864 {
2865     KILE_DEBUG_MAIN << "==Kile::slotQuickPreview()=========================="  << endl;
2866 
2867     KTextEditor::View *view = viewManager()->currentTextView();
2868     if ( ! view) return;
2869 
2870     KTextEditor::Document *doc = view->document();
2871     if ( ! doc )
2872         return;
2873 
2874     switch ( type )
2875     {
2876     case KileTool::qpSelection:
2877         m_quickPreview->previewSelection(view);
2878         break;
2879     case KileTool::qpEnvironment:
2880         m_quickPreview->previewEnvironment(doc);
2881         break;
2882     case KileTool::qpSubdocument:
2883         m_quickPreview->previewSubdocument(doc);
2884         break;
2885     case KileTool::qpMathgroup:
2886         m_quickPreview->previewMathgroup(doc);
2887         break;
2888     }
2889 }
2890 
2891 /* FIXME
2892  Port the citeViewBib function as soon as we got a kbib version for KDE4.
2893 void Kile::citeViewBib()
2894 {
2895 	KILE_DEBUG_MAIN  << "===void Kile::citeViewBib()===" << endl;
2896 
2897 	DCOPClient *client = kapp->dcopClient();
2898 	QByteArray params, replyData;
2899 	Q3CString replyType;
2900 
2901 	QDataStream stream(params, QIODevice::WriteOnly);
2902 	QCStringList functions,remoteApps,remoteObjs;
2903 
2904  	const Q3CString viewBibApp = "kbib"; // currently these things are hardcoded because only kbib supports it
2905  	const Q3CString viewBibObj = "kbibapp";
2906 	const Q3CString viewBibFncDef = "QString cite()";
2907 	const Q3CString viewBibFnc = "cite()";
2908 
2909 	remoteApps = client->registeredApplications();
2910 	if( !remoteApps.contains(viewBibApp) )
2911 	{
2912 		errorHandler()->printMessage(KileTool::Warning,
2913 		i18n("No ViewBib tool running, trying to start it now"),
2914 		i18n("ViewBib Citation"));
2915 		uint ret = runWith("ViewBib","KBib");
2916 		if( ret == 0 )
2917 			errorHandler()->printMessage(KileTool::Info,
2918 				i18n("Please select the desired bibliographies and re-execute this command"),
2919 				i18n("ViewBib Citation"));
2920 		return;
2921 	}
2922 
2923 	remoteObjs = client->remoteObjects(viewBibApp);
2924 	if( !remoteObjs.contains(viewBibObj) )
2925 	{
2926 		errorHandler()->printMessage(KileTool::Warning,
2927 				      i18n("The ViewBib tool does not have the correct interface"),
2928 				      i18n("ViewBib Citation"));
2929 		return;
2930 	}
2931 
2932 	functions = client->remoteFunctions(viewBibApp,viewBibObj);
2933 	if( !functions.contains(viewBibFncDef) )
2934 	{
2935 		errorHandler()->printMessage(KileTool::Warning,
2936 					i18n("The ViewBib tool does not have the correct definition of the cite function"),
2937 					i18n("ViewBib Citation"));
2938 		return;
2939 	}
2940 
2941 	if ( !client->call(viewBibApp, viewBibObj, viewBibFnc, params, replyType, replyData) )
2942 	{
2943 		// we should never get here
2944 		qWarning() << "internal error in viewbib citation" << endl;
2945 		return;
2946 	}
2947 	else{
2948 		QDataStream reply(replyData, QIODevice::ReadOnly);
2949 		if (replyType == "QString")
2950 		{
2951 			QString result;
2952 			reply >> result;
2953 
2954 			if (result.isEmpty())
2955 			{
2956 				errorHandler()->printMessage(KileTool::Warning,
2957 						i18n("No reference selected.\nPlease select a reference first!"),
2958 						i18n("ViewBib Citation"));
2959 			}
2960 			else
2961 			{
2962 				insertTag(KileAction::TagData(i18n("ViewBib Citation"), result, QString(), result.length()));
2963 
2964 			}
2965 		}
2966 	}
2967 }
2968 */
2969 
addRecentFile(const QUrl & url)2970 void Kile::addRecentFile(const QUrl &url)
2971 {
2972     m_actRecentFiles->addUrl(url);
2973 }
2974 
removeRecentFile(const QUrl & url)2975 void Kile::removeRecentFile(const QUrl &url)
2976 {
2977     m_actRecentFiles->removeUrl(url);
2978 }
2979 
addRecentProject(const QUrl & url)2980 void Kile::addRecentProject(const QUrl &url)
2981 {
2982     m_actRecentProjects->addUrl(url);
2983 }
2984 
removeRecentProject(const QUrl & url)2985 void Kile::removeRecentProject(const QUrl &url)
2986 {
2987     m_actRecentProjects->removeUrl(url);
2988 }
2989 
updateStatusBarCursorPosition(KTextEditor::View * view,const KTextEditor::Cursor & newPosition)2990 void Kile::updateStatusBarCursorPosition(KTextEditor::View *view,
2991         const KTextEditor::Cursor &newPosition)
2992 {
2993     if(!view) {
2994         statusBar()->clearLineColumn();
2995     }
2996     else {
2997         statusBar()->setLineColumn(newPosition.line() + 1, newPosition.column() + 1);
2998     }
2999 }
3000 
updateStatusBarViewMode(KTextEditor::View * view)3001 void Kile::updateStatusBarViewMode(KTextEditor::View *view)
3002 {
3003     if(!view) {
3004         statusBar()->clearViewMode();
3005     }
3006     else {
3007         statusBar()->setViewMode(view->viewModeHuman());
3008     }
3009 }
3010 
updateStatusBarInformationMessage(KTextEditor::View *,const QString & message)3011 void Kile::updateStatusBarInformationMessage(KTextEditor::View * /* view */, const QString &message)
3012 {
3013     statusBar()->showMessage(message, 5000);
3014 }
3015 
updateStatusBarSelection(KTextEditor::View * view)3016 void Kile::updateStatusBarSelection(KTextEditor::View *view)
3017 {
3018     if(!view) {
3019         statusBar()->clearSelectionMode();
3020     }
3021     else {
3022         const QString text = view->blockSelection() ?
3023                              i18nc("@info:status status bar label for block selection mode", "BLOCK") + ' ' :
3024                              i18nc("@info:status status bar label for line selection mode", "LINE") + ' ';
3025         statusBar()->setSelectionMode(text);
3026     }
3027 }
3028 
handleDocumentParsingStarted()3029 void Kile::handleDocumentParsingStarted()
3030 {
3031     statusBar()->setParserStatus(i18n("Refreshing structure..."));
3032 }
3033 
handleDocumentParsingComplete()3034 void Kile::handleDocumentParsingComplete()
3035 {
3036     statusBar()->clearParserStatus();
3037 }
3038