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