]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
no need to cast anymore
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 6b97f33805b977fdf571a248d870f640af8d304b..bdd32b86fc4e642d517148b9721549eeb8f36977 100644 (file)
 #include "GuiView.h"
 #include "Dialog.h"
 
-#include <boost/assert.hpp>
-
-using std::string;
-
-#include "GuiView.h"
-
 #include "GuiApplication.h"
 #include "GuiWorkArea.h"
 #include "GuiKeySymbol.h"
@@ -55,7 +49,6 @@ using std::string;
 #include "ToolbarBackend.h"
 #include "version.h"
 
-#include "support/convert.h"
 #include "support/FileName.h"
 #include "support/lstrings.h"
 #include "support/os.h"
@@ -64,6 +57,7 @@ using std::string;
 #include <QAction>
 #include <QApplication>
 #include <QCloseEvent>
+#include <QDebug>
 #include <QDesktopWidget>
 #include <QDragEnterEvent>
 #include <QDropEvent>
@@ -82,8 +76,8 @@ using std::string;
 #include <QToolBar>
 #include <QUrl>
 
+#include <boost/assert.hpp>
 #include <boost/bind.hpp>
-#include <boost/current_function.hpp>
 
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
@@ -108,43 +102,37 @@ using support::trim;
 
 namespace {
 
-int const statusbar_timer_value = 3000;
-
 class BackgroundWidget : public QWidget
 {
 public:
-       BackgroundWidget(QString const & file, QString const & text)
+       BackgroundWidget()
        {
-               splash_ = new QPixmap(file);
-               if (!splash_) {
-                       lyxerr << "could not load splash screen: '" << fromqstr(file) << "'" << endl;
-                       return;
-               }
+               LYXERR(Debug::GUI, "show banner: " << lyxrc.show_banner);
+               /// The text to be written on top of the pixmap
+               QString const text = lyx_version ? lyx_version : qt_("unknown version");
+               splash_ = QPixmap(":/images/banner.png");
 
-               QPainter pain(splash_);
+               QPainter pain(&splash_);
                pain.setPen(QColor(255, 255, 0));
                QFont font;
                // The font used to display the version info
                font.setStyleHint(QFont::SansSerif);
                font.setWeight(QFont::Bold);
-               font.setPointSize(convert<int>(lyxrc.font_sizes[FONT_SIZE_LARGE]));
+               font.setPointSize(int(toqstr(lyxrc.font_sizes[FONT_SIZE_LARGE]).toDouble()));
                pain.setFont(font);
                pain.drawText(260, 270, text);
        }
 
        void paintEvent(QPaintEvent *)
        {
-               if (!splash_)
-                       return;
-
-               int x = (width() - splash_->width()) / 2;
-               int y = (height() - splash_->height()) / 2;
+               int x = (width() - splash_.width()) / 2;
+               int y = (height() - splash_.height()) / 2;
                QPainter pain(this);
-               pain.drawPixmap(x, y, *splash_);
+               pain.drawPixmap(x, y, splash_);
        }
 
 private:
-       QPixmap splash_;
+       QPixmap splash_;
 };
 
 } // namespace anon
@@ -156,8 +144,7 @@ struct GuiView::GuiViewPrivate
 {
        GuiViewPrivate()
                : current_work_area_(0), layout_(0),
-               autosave_timeout_(new Timeout(5000)), quitting_by_menu_(false),
-               in_show_(false)
+               quitting_by_menu_(false), autosave_timeout_(5000), in_show_(false)
        {
                // hardcode here the platform specific icon size
                smallIconSize = 14;     // scaling problems
@@ -165,7 +152,7 @@ struct GuiView::GuiViewPrivate
                bigIconSize = 26;               // better for some math icons
 
                splitter_ = new QSplitter;
-               initBackground();
+               bg_widget_ = new BackgroundWidget;
                stack_widget_ = new QStackedWidget;
                stack_widget_->addWidget(bg_widget_);
                stack_widget_->addWidget(splitter_);
@@ -179,7 +166,6 @@ struct GuiView::GuiViewPrivate
                delete stack_widget_;
                delete menubar_;
                delete toolbars_;
-               delete autosave_timeout_;
        }
 
        QMenu * toolBarPopup(GuiView * parent)
@@ -220,14 +206,6 @@ struct GuiView::GuiViewPrivate
                return menu;
        }
 
-       void initBackground()
-       {
-               LYXERR(Debug::GUI, "show banner: " << lyxrc.show_banner);
-               /// The text to be written on top of the pixmap
-               QString const text = lyx_version ? QString(lyx_version) : qt_("unknown version");
-               bg_widget_ = new BackgroundWidget(":/images/banner.png", text);
-       }
-
        void setBackground()
        {
                stack_widget_->setCurrentWidget(bg_widget_);
@@ -259,9 +237,6 @@ struct GuiView::GuiViewPrivate
        }
 
 public:
-       ///
-       string cur_title;
-
        GuiWorkArea * current_work_area_;
        QSplitter * splitter_;
        QStackedWidget * stack_widget_;
@@ -295,16 +270,14 @@ public:
        /// are we quitting by the menu?
        bool quitting_by_menu_;
        /// auto-saving of buffers
-       Timeout * const autosave_timeout_;
-       ///
-       /// flag against a race condition due to multiclicks in Qt frontend,
-       /// see bug #1119
+       Timeout autosave_timeout_;
+       /// flag against a race condition due to multiclicks, see bug #1119
        bool in_show_;
 };
 
 
 GuiView::GuiView(int id)
-       : d(*new GuiViewPrivate),  id_(id)
+       : d(*new GuiViewPrivate), id_(id)
 {
        // GuiToolbars *must* be initialised before GuiMenubar.
        d.toolbars_ = new GuiToolbars(*this);
@@ -314,11 +287,11 @@ GuiView::GuiView(int id)
 
        // Start autosave timer
        if (lyxrc.autosave) {
-               d.autosave_timeout_->timeout.connect(boost::bind(&GuiView::autoSave, this));
-               d.autosave_timeout_->setTimeout(lyxrc.autosave * 1000);
-               d.autosave_timeout_->start();
+               d.autosave_timeout_.timeout.connect(boost::bind(&GuiView::autoSave, this));
+               d.autosave_timeout_.setTimeout(lyxrc.autosave * 1000);
+               d.autosave_timeout_.start();
        }
-       QObject::connect(&d.statusbar_timer_, SIGNAL(timeout()),
+       connect(&d.statusbar_timer_, SIGNAL(timeout()),
                this, SLOT(clearMessage()));
 
        // Qt bug? signal lastWindowClosed does not work
@@ -388,7 +361,7 @@ void GuiView::setFocus()
 }
 
 
-QMenu* GuiView::createPopupMenu()
+QMenu * GuiView::createPopupMenu()
 {
        return d.toolBarPopup(this);
 }
@@ -471,7 +444,7 @@ void GuiView::dropEvent(QDropEvent* event)
        if (files.isEmpty())
                return;
 
-       LYXERR(Debug::GUI, BOOST_CURRENT_FUNCTION << " got URLs!");
+       LYXERR(Debug::GUI, "GuiView::dropEvent: got URLs!");
        for (int i = 0; i != files.size(); ++i) {
                string const file = support::os::internal_path(fromqstr(
                        files.at(i).toLocalFile()));
@@ -485,7 +458,7 @@ void GuiView::message(docstring const & str)
 {
        statusBar()->showMessage(toqstr(str));
        d.statusbar_timer_.stop();
-       d.statusbar_timer_.start(statusbar_timer_value);
+       d.statusbar_timer_.start(3000);
 }
 
 
@@ -732,15 +705,14 @@ GuiWorkArea const * GuiView::currentWorkArea() const
 }
 
 
-void GuiView::setCurrentWorkArea(GuiWorkArea * work_area)
+void GuiView::setCurrentWorkArea(GuiWorkArea * wa)
 {
-       BOOST_ASSERT(work_area);
+       BOOST_ASSERT(wa);
 
        // Changing work area can result from opening a file so
        // update the toc in any case.
        updateToc();
 
-       GuiWorkArea * wa = static_cast<GuiWorkArea *>(work_area);
        d.current_work_area_ = wa;
        for (int i = 0; i != d.splitter_->count(); ++i) {
                if (d.tabWorkArea(i)->setCurrentWorkArea(wa))
@@ -749,11 +721,10 @@ void GuiView::setCurrentWorkArea(GuiWorkArea * work_area)
 }
 
 
-void GuiView::removeWorkArea(GuiWorkArea * work_area)
+void GuiView::removeWorkArea(GuiWorkArea * wa)
 {
-       BOOST_ASSERT(work_area);
-       GuiWorkArea * gwa = static_cast<GuiWorkArea *>(work_area);
-       if (gwa == d.current_work_area_) {
+       BOOST_ASSERT(wa);
+       if (wa == d.current_work_area_) {
                disconnectBuffer();
                disconnectBufferView();
                hideBufferDependent();
@@ -766,7 +737,7 @@ void GuiView::removeWorkArea(GuiWorkArea * work_area)
 
        for (int i = 0; i != d.splitter_->count(); ++i) {
                TabWorkArea * twa = d.tabWorkArea(i);
-               if (!twa->removeWorkArea(gwa))
+               if (!twa->removeWorkArea(wa))
                        // Not found in this tab group.
                        continue;
 
@@ -941,7 +912,7 @@ void GuiView::autoSave()
 void GuiView::resetAutosaveTimers()
 {
        if (lyxrc.autosave)
-               d.autosave_timeout_->restart();
+               d.autosave_timeout_.restart();
 }
 
 
@@ -989,7 +960,7 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                        }
                }
                else if (name == "latexlog")
-                       enable = FileName(buf->logName()).isFileReadable();
+                       enable = FileName(buf->logName()).isReadableFile();
                else if (name == "spellchecker")
 #if defined (USE_ASPELL) || defined (USE_ISPELL) || defined (USE_PSPELL)
                        enable = !buf->isReadonly();
@@ -1008,6 +979,29 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                break;
        }
 
+       case LFUN_INSET_APPLY: {
+               if (!buf) {
+                       enable = false;
+                       break;
+               }
+               string const name = cmd.getArg(0);
+               Inset * inset = getOpenInset(name);
+               if (inset) {
+                       FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument());
+                       FuncStatus fs;
+                       if (!inset->getStatus(view()->cursor(), fr, fs)) {
+                               // Every inset is supposed to handle this
+                               BOOST_ASSERT(false);
+                       }
+                       flag |= fs;
+               } else {
+                       FuncRequest fr(LFUN_INSET_INSERT, cmd.argument());
+                       flag |= getStatus(fr);
+               }
+               enable = flag.enabled();
+               break;
+       }
+
        default:
                if (!view()) {
                        enable = false;
@@ -1022,14 +1016,26 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
 }
 
 
-void GuiView::dispatch(FuncRequest const & cmd)
+bool GuiView::dispatch(FuncRequest const & cmd)
 {
-       Buffer * buf = buffer();
+       BufferView * bv = view();       
+       // By default we won't need any update.
+       if (bv)
+               bv->cursor().updateFlags(Update::None);
+
        switch(cmd.action) {
                case LFUN_BUFFER_SWITCH:
                        setBuffer(theBufferList().getBuffer(to_utf8(cmd.argument())));
                        break;
 
+               case LFUN_BUFFER_NEXT:
+                       setBuffer(theBufferList().next(buffer()));
+                       break;
+
+               case LFUN_BUFFER_PREVIOUS:
+                       setBuffer(theBufferList().previous(buffer()));
+                       break;
+
                case LFUN_COMMAND_EXECUTE: {
                        bool const show_it = cmd.argument() != "off";
                        d.toolbars_->showCommandBuffer(show_it);
@@ -1119,7 +1125,7 @@ void GuiView::dispatch(FuncRequest const & cmd)
                                        showDialog("character", data);
                        } else if (name == "latexlog") {
                                Buffer::LogType type; 
-                               string const logfile = buf->logName(&type);
+                               string const logfile = buffer()->logName(&type);
                                switch (type) {
                                case Buffer::latexlog:
                                        data = "latex ";
@@ -1132,17 +1138,31 @@ void GuiView::dispatch(FuncRequest const & cmd)
                                showDialog("log", data);
                        } else if (name == "vclog") {
                                string const data = "vc " +
-                                       Lexer::quoteString(buf->lyxvc().getLogFile());
+                                       Lexer::quoteString(buffer()->lyxvc().getLogFile());
                                showDialog("log", data);
                        } else
                                showDialog(name, data);
                        break;
                }
 
+               case LFUN_INSET_APPLY: {
+                       string const name = cmd.getArg(0);
+                       Inset * inset = getOpenInset(name);
+                       if (inset) {
+                               FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument());
+                               inset->dispatch(view()->cursor(), fr);
+                       } else {
+                               FuncRequest fr(LFUN_INSET_INSERT, cmd.argument());
+                               lyx::dispatch(fr);
+                       }
+                       break;
+               }
+
                default:
-                       theLyXFunc().setLyXView(this);
-                       lyx::dispatch(cmd);
+                       return false;
        }
+
+       return true;
 }
 
 
@@ -1213,6 +1233,20 @@ bool isValidName(string const & name)
 } // namespace anon
 
 
+void GuiView::resetDialogs()
+{
+       // Make sure that no LFUN uses any LyXView.
+       theLyXFunc().setLyXView(0);
+       d.toolbars_->init();
+       d.menubar_->init();
+       if (d.layout_)
+               d.layout_->updateContents(true);
+       // Now update controls with current buffer.
+       theLyXFunc().setLyXView(this);
+       restartCursor();
+}
+
+
 Dialog * GuiView::find_or_build(string const & name)
 {
        if (!isValidName(name))
@@ -1336,7 +1370,7 @@ void GuiView::updateBufferDependent(bool switched) const
                        // A bit clunky, but the dialog will request
                        // that the kernel provides it with the necessary
                        // data.
-                       dialog->slotRestore();
+                       dialog->updateDialog();
                }
        }
 }
@@ -1357,46 +1391,46 @@ void GuiView::checkStatus()
 
 
 // will be replaced by a proper factory...
-Dialog * createGuiAbout(LyXView & lv);
-Dialog * createGuiBibitem(LyXView & lv);
-Dialog * createGuiBibtex(LyXView & lv);
-Dialog * createGuiBox(LyXView & lv);
-Dialog * createGuiBranch(LyXView & lv);
-Dialog * createGuiChanges(LyXView & lv);
-Dialog * createGuiCharacter(LyXView & lv);
-Dialog * createGuiCitation(LyXView & lv);
-Dialog * createGuiDelimiter(LyXView & lv);
-Dialog * createGuiDocument(LyXView & lv);
-Dialog * createGuiErrorList(LyXView & lv);
-Dialog * createGuiERT(LyXView & lv);
-Dialog * createGuiExternal(LyXView & lv);
-Dialog * createGuiFloat(LyXView & lv);
-Dialog * createGuiGraphics(LyXView & lv);
-Dialog * createGuiInclude(LyXView & lv);
-Dialog * createGuiIndex(LyXView & lv);
-Dialog * createGuiLabel(LyXView & lv);
-Dialog * createGuiListings(LyXView & lv);
-Dialog * createGuiLog(LyXView & lv);
-Dialog * createGuiMathMatrix(LyXView & lv);
-Dialog * createGuiNomenclature(LyXView & lv);
-Dialog * createGuiNote(LyXView & lv);
-Dialog * createGuiParagraph(LyXView & lv);
-Dialog * createGuiPreferences(LyXView & lv);
-Dialog * createGuiPrint(LyXView & lv);
-Dialog * createGuiRef(LyXView & lv);
-Dialog * createGuiSearch(LyXView & lv);
-Dialog * createGuiSendTo(LyXView & lv);
-Dialog * createGuiShowFile(LyXView & lv);
-Dialog * createGuiSpellchecker(LyXView & lv);
-Dialog * createGuiTabularCreate(LyXView & lv);
-Dialog * createGuiTabular(LyXView & lv);
-Dialog * createGuiTexInfo(LyXView & lv);
-Dialog * createGuiToc(LyXView & lv);
-Dialog * createGuiThesaurus(LyXView & lv);
-Dialog * createGuiHyperlink(LyXView & lv);
-Dialog * createGuiVSpace(LyXView & lv);
-Dialog * createGuiViewSource(LyXView & lv);
-Dialog * createGuiWrap(LyXView & lv);
+Dialog * createGuiAbout(GuiView & lv);
+Dialog * createGuiBibitem(GuiView & lv);
+Dialog * createGuiBibtex(GuiView & lv);
+Dialog * createGuiBox(GuiView & lv);
+Dialog * createGuiBranch(GuiView & lv);
+Dialog * createGuiChanges(GuiView & lv);
+Dialog * createGuiCharacter(GuiView & lv);
+Dialog * createGuiCitation(GuiView & lv);
+Dialog * createGuiDelimiter(GuiView & lv);
+Dialog * createGuiDocument(GuiView & lv);
+Dialog * createGuiErrorList(GuiView & lv);
+Dialog * createGuiERT(GuiView & lv);
+Dialog * createGuiExternal(GuiView & lv);
+Dialog * createGuiFloat(GuiView & lv);
+Dialog * createGuiGraphics(GuiView & lv);
+Dialog * createGuiInclude(GuiView & lv);
+Dialog * createGuiIndex(GuiView & lv);
+Dialog * createGuiLabel(GuiView & lv);
+Dialog * createGuiListings(GuiView & lv);
+Dialog * createGuiLog(GuiView & lv);
+Dialog * createGuiMathMatrix(GuiView & lv);
+Dialog * createGuiNomenclature(GuiView & lv);
+Dialog * createGuiNote(GuiView & lv);
+Dialog * createGuiParagraph(GuiView & lv);
+Dialog * createGuiPreferences(GuiView & lv);
+Dialog * createGuiPrint(GuiView & lv);
+Dialog * createGuiRef(GuiView & lv);
+Dialog * createGuiSearch(GuiView & lv);
+Dialog * createGuiSendTo(GuiView & lv);
+Dialog * createGuiShowFile(GuiView & lv);
+Dialog * createGuiSpellchecker(GuiView & lv);
+Dialog * createGuiTabularCreate(GuiView & lv);
+Dialog * createGuiTabular(GuiView & lv);
+Dialog * createGuiTexInfo(GuiView & lv);
+Dialog * createGuiToc(GuiView & lv);
+Dialog * createGuiThesaurus(GuiView & lv);
+Dialog * createGuiHyperlink(GuiView & lv);
+Dialog * createGuiVSpace(GuiView & lv);
+Dialog * createGuiViewSource(GuiView & lv);
+Dialog * createGuiWrap(GuiView & lv);
 
 
 Dialog * GuiView::build(string const & name)