/* Klat - A LaTeX editor for KDE Copyright (C) 2002-2004 Jori Liesenborgs (jori@lumumba.luc.ac.be) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "klat.h" #include "klat.moc" #include "klatedittab.h" #include "klattooltab.h" #include "klatoutputtab.h" #include "klatexecsettingsdlgimpl.h" #include "klatsplashdialogimpl.h" #include #include #include #include #include #include #include #include #include #include #include #define ID_EXEC_SETTINGS_BASE 17000 #define ID_STATUS_CURSPOS 16000 #define ID_STATUS_LATEXCODE 16001 Klat::Klat() { config = KApplication::kApplication()->config(); execConfig.read(config); createWindows(); readDockConfig(config); createMenuBarAndToolbarAndStatusBar(); tooltab->connectToEditTab(edittab); tooltab->connectToKlatWidget(this); connect(edittab,SIGNAL(signalCursorPositionChanged(int,int)),this,SLOT(slotCursorPositionChanged(int,int))); connect(edittab,SIGNAL(signalFileOpened(const KURL &)),this,SLOT(slotFileReferenced(const KURL &))); connect(edittab,SIGNAL(signalFileSaved(const KURL &)),this,SLOT(slotFileReferenced(const KURL &))); connect(toolDock,SIGNAL(headerCloseButtonClicked()),this,SLOT(slotViewCloseTools())); connect(outputDock,SIGNAL(headerCloseButtonClicked()),this,SLOT(slotViewCloseOutput())); KlatSplashDialogImpl dlg(0,0); dlg.exec(); menuBar()->show(); toolBar()->show(); statusBar()->show(); show(); } Klat::~Klat() { } void Klat::createWindows() { KDockWidget *mainDock; QPixmap p; // Create the main dock widget mainDock = createDockWidget("mainDock",p,0,"Edit windows"); edittab = new KlatEditTab(mainDock); mainDock->setWidget(edittab); mainDock->setEnableDocking(KDockWidget::DockNone); setView(mainDock); setMainDockWidget(mainDock); // Create the docking tool tab toolDock = createDockWidget("toolDock",p,0,"Tool windows"); tooltab = new KlatToolTab(toolDock); toolDock->setWidget(tooltab); toolDock->manualDock(mainDock,KDockWidget::DockLeft,30); // Create the output tool tab outputDock = createDockWidget("outputDock",p,0,"Output windows"); outputtab = new KlatOutputTab(outputDock); outputDock->setWidget(outputtab); outputDock->manualDock(mainDock,KDockWidget::DockBottom,70); edittab->setOutputWidget(outputtab); edittab->setToolWidget(tooltab); resize(640,480); } void Klat::createMenuBarAndToolbarAndStatusBar() { KPopupMenu *m; KAction *tmpAct; m = new KPopupMenu(); tmpAct = KStdAction::openNew(edittab,SLOT(slotFileNew()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::open(edittab,SLOT(slotFileOpen()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); recentFiles = KStdAction::openRecent(edittab,SLOT(slotOpenURL(const KURL &)),actionCollection()); recentFiles->loadEntries(config); recentFiles->plug(m); m->insertSeparator(); tmpAct = KStdAction::save(edittab,SLOT(slotFileSave()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::saveAs(edittab,SLOT(slotFileSaveAs()),actionCollection()); tmpAct->plug(m); m->insertSeparator(); tmpAct = KStdAction::close(edittab,SLOT(slotFileClose()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); m->insertSeparator(); tmpAct = KStdAction::quit(KApplication::kApplication(),SLOT(closeAllWindows()),actionCollection()); connect(KApplication::kApplication(),SIGNAL(lastWindowClosed()),KApplication::kApplication(),SLOT(quit())); tmpAct->plug(m); tmpAct->plug(toolBar()); menuBar()->insertItem(i18n("&File"),m); toolBar()->insertLineSeparator(); m = new KPopupMenu(); tmpAct = KStdAction::undo(edittab,SLOT(slotEditUndo()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::redo(edittab,SLOT(slotEditRedo()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); m->insertSeparator(); tmpAct = KStdAction::copy(edittab,SLOT(slotEditCopy()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::cut(edittab,SLOT(slotEditCut()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::paste(edittab,SLOT(slotEditPaste()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); m->insertSeparator(); tmpAct = KStdAction::find(edittab,SLOT(slotEditFind()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::findNext(edittab,SLOT(slotEditFindNext()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::findPrev(edittab,SLOT(slotEditFindPrev()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); tmpAct = KStdAction::replace(edittab,SLOT(slotEditReplace()),actionCollection()); tmpAct->plug(m); tmpAct = KStdAction::gotoLine(edittab,SLOT(slotEditGotoLine()),actionCollection()); tmpAct->plug(m); tmpAct = KStdAction::spelling(edittab,SLOT(slotEditSpelling()),actionCollection()); tmpAct->plug(m); tmpAct->plug(toolBar()); menuBar()->insertItem(i18n("&Edit"),m); m = new KPopupMenu(); viewToolsAction = new KAction(i18n("Show/Hide &Tools"),0,0,this,SLOT(slotViewToggleTools()),actionCollection()); viewToolsAction->plug(m); viewOutputAction = new KAction(i18n("Show/Hide &Output"),0,0,this,SLOT(slotViewToggleOutput()),actionCollection()); viewOutputAction->plug(m); menuBar()->insertItem(i18n("&View"),m); slotUpdateViewMenu(); execMenu = new KPopupMenu(); connect(execMenu,SIGNAL(activated(int)),this,SLOT(slotExecMenuItemClicked(int))); menuBar()->insertItem("E&xecute",execMenu); buildExecMenu(); m = new KPopupMenu(); tmpAct = new KAction(i18n("&Configure execute menu"),0,0,this,SLOT(slotExecuteSettings()),actionCollection()); tmpAct->plug(m); tmpAct = new KAction(i18n("Configure editor"),0,0,edittab,SLOT(slotConfigKateEditor()),actionCollection()); tmpAct->plug(m); menuBar()->insertItem("&Settings",m); m = new KPopupMenu(); tmpAct = new KAction(i18n("Next document"),KStdGuiItem::stdItem(KStdGuiItem::Forward),KStdAccel::shortcut(KStdAccel::Forward),edittab,SLOT(slotNextDocument()),actionCollection()); tmpAct->plug(m); tmpAct = new KAction(i18n("Previous document"),KStdGuiItem::stdItem(KStdGuiItem::Back),KStdAccel::shortcut(KStdAccel::Back),edittab,SLOT(slotPrevDocument()),actionCollection()); tmpAct->plug(m); menuBar()->insertItem("&Windows",m); m = customHelpMenu(false); menuBar()->insertItem(i18n("&Help"),m); // set up the status bar statusBar()->insertItem("", ID_STATUS_LATEXCODE,80); statusBar()->setItemAlignment(ID_STATUS_LATEXCODE,AlignLeft|AlignVCenter); statusBar()->insertItem("", ID_STATUS_CURSPOS,20); statusBar()->setItemAlignment(ID_STATUS_CURSPOS,AlignRight|AlignVCenter); } void Klat::showAboutApplication() { KAboutApplication dlg; dlg.exec(); } void Klat::slotExecuteSettings() { KlatExecSettingsDlgImpl dlg(this); int status; dlg.setExecConfig(execConfig); status = dlg.exec(); if (status != QDialog::Accepted) return; execConfig = dlg.getNewConfig(); buildExecMenu(); } void Klat::buildExecMenu() { int i = 0; execMenu->clear(); if (!execConfig.gotoFirstEntry()) return; do { QString str = execConfig.menuName(); if (str.length() == 0) execMenu->insertSeparator(); else { KShortcut cut = execConfig.shortcut(); if (cut.count() == 0) execMenu->insertItem(str,this,SLOT(slotDummy()),0,ID_EXEC_SETTINGS_BASE+i); else { QString seq; QKeySequence kseq; seq = cut.seq(0).toString(); kseq = QKeySequence(seq); execMenu->insertItem(str,this,SLOT(slotDummy()),kseq,ID_EXEC_SETTINGS_BASE+i); } } i++; } while (execConfig.gotoNextEntry()); } void Klat::slotExecMenuItemClicked(int id) { if (id < ID_EXEC_SETTINGS_BASE) return; int index = id-ID_EXEC_SETTINGS_BASE; if (!execConfig.gotoEntry(index)) return; edittab->executeCommand(execConfig.commandLine(),execConfig.saveFirst()); } void Klat::slotDummy() { } bool Klat::queryClose() { if (!edittab->areAllDocumentsSaved()) { int status = KMessageBox::warningYesNo(this,"One or more documents are not saved. Do you still want to quit?","File(s) not saved"); if (status != KMessageBox::Yes) return false; } recentFiles->saveEntries(config); writeDockConfig(config); execConfig.write(config); return true; } void Klat::slotCursorPositionChanged(int line,int col) { if (line < 0 || col < 0) statusBar()->changeItem("",ID_STATUS_CURSPOS); else { QString str = "Line: " + QString::number(line+1) + " Col: " + QString::number(col+1); statusBar()->changeItem(str,ID_STATUS_CURSPOS); } } void Klat::slotLaTeXCodeChanged(const QString &s) { statusBar()->changeItem(s,ID_STATUS_LATEXCODE); } void Klat::slotLaTeXCodeClear() { statusBar()->changeItem("",ID_STATUS_LATEXCODE); } void Klat::slotFileReferenced(const KURL &url) { recentFiles->addURL(url); } void Klat::openCommandLineFile(const QString &fname) { KURL url(fname); if (url.isValid()) edittab->slotOpenURL(url); } void Klat::slotViewToggleOutput() { outputDock->changeHideShowState(); slotUpdateViewMenu(); } void Klat::slotViewToggleTools() { toolDock->changeHideShowState(); slotUpdateViewMenu(); } void Klat::slotUpdateViewMenu() { if (toolDock->isHidden()) viewToolsAction->setText("Show &tools"); else viewToolsAction->setText("Hide &tools"); if (outputDock->isHidden()) viewOutputAction->setText("Show &output"); else viewOutputAction->setText("Hide &output"); } void Klat::slotViewCloseTools() { viewToolsAction->setText("Show &tools"); } void Klat::slotViewCloseOutput() { viewOutputAction->setText("Show &output"); }