]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
LFUN_CLOSE_TAB_GROUP: bug fixes.
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 263215812aa5761c13e449701df261a5fd20a919..42b96807048a8fc66e7641e82e788306be053ae0 100644 (file)
@@ -84,6 +84,7 @@
 #include <QTimer>
 #include <QToolBar>
 #include <QUrl>
+#include <QScrollBar>
 
 #include <boost/assert.hpp>
 #include <boost/bind.hpp>
@@ -99,9 +100,6 @@ using namespace std;
 using namespace lyx::support;
 
 namespace lyx {
-
-extern bool quitting;
-
 namespace frontend {
 
 namespace {
@@ -226,17 +224,14 @@ struct GuiView::GuiViewPrivate
                        // The first TabWorkArea is always the first one, if any.
                        return tabWorkArea(0);
 
-               TabWorkArea * tab_widget = 0;
                for (int i = 0; i != splitter_->count(); ++i) {
-                       QWidget * w = splitter_->widget(i);
-                       if (!w->hasFocus())
-                               continue;
-                       tab_widget = dynamic_cast<TabWorkArea *>(w);
-                       if (tab_widget)
-                               break;
+                       TabWorkArea * twa = tabWorkArea(i);
+                       if (current_work_area_ == twa->currentWorkArea())
+                               return twa;
                }
 
-               return tab_widget;
+               // None has the focus so we just take the first one.
+               return tabWorkArea(0);
        }
 
 public:
@@ -397,10 +392,19 @@ void GuiView::closeEvent(QCloseEvent * close_event)
 
        // Make sure that no LFUN use this close to be closed View.
        theLyXFunc().setLyXView(0);
+
+       // Save toolbars configuration
+       if (isFullScreen()) {
+        d.toolbars_->toggleFullScreen(!isFullScreen());
+        updateToolbars();
+       }
+
        // Make sure the timer time out will not trigger a statusbar update.
        d.statusbar_timer_.stop();
 
-       if (lyxrc.allow_geometry_session) {
+       // Saving fullscreen requires additional tweaks in the toolbar code.
+       // It wouldn't also work under linux natively.
+       if (lyxrc.allow_geometry_session && !isFullScreen()) {
                QSettings settings;
                QString const key = "view-" + QString::number(id_);
 #ifdef Q_WS_X11
@@ -537,6 +541,7 @@ void GuiView::updateStatusBar()
        if (d.statusbar_timer_.isActive())
                return;
 
+       theLyXFunc().setLyXView(this);
        statusBar()->showMessage(toqstr(theLyXFunc().viewStatusMessage()));
 }
 
@@ -575,10 +580,14 @@ bool GuiView::event(QEvent * e)
                        // The document structure, name and dialogs might have
                        // changed in another view.
                        updateBufferDependent(true);
+                       updateToolbars();
+                       updateLayoutList();
+                       updateStatusBar();
                } else {
                        setWindowTitle(qt_("LyX"));
                        setWindowIconText(qt_("LyX"));
                }
+               setFocus();
                return QMainWindow::event(e);
        }
 
@@ -684,34 +693,29 @@ GuiToolbar * GuiView::makeToolbar(ToolbarInfo const & tbinfo, bool newline)
 
 GuiWorkArea * GuiView::workArea(Buffer & buffer)
 {
-       for (int i = 0; i != d.splitter_->count(); ++i) {
-               GuiWorkArea * wa = d.tabWorkArea(i)->workArea(buffer);
-               if (wa)
-                       return wa;
-       }
+       if (TabWorkArea * twa = d.currentTabWorkArea())
+               return twa->workArea(buffer);
        return 0;
 }
 
 
 GuiWorkArea * GuiView::addWorkArea(Buffer & buffer)
 {
-
        // Automatically create a TabWorkArea if there are none yet.
-       if (!d.splitter_->count())
-               addTabWorkArea();
-
-       TabWorkArea * tab_widget = d.currentTabWorkArea();
+       TabWorkArea * tab_widget = d.splitter_->count() 
+               ? d.currentTabWorkArea() : addTabWorkArea();
        return tab_widget->addWorkArea(buffer, *this);
 }
 
 
-void GuiView::addTabWorkArea()
+TabWorkArea * GuiView::addTabWorkArea()
 {
        TabWorkArea * twa = new TabWorkArea;
        QObject::connect(twa, SIGNAL(currentWorkAreaChanged(GuiWorkArea *)),
                this, SLOT(on_currentWorkAreaChanged(GuiWorkArea *)));
        d.splitter_->addWidget(twa);
        d.stack_widget_->setCurrentWidget(d.splitter_);
+       return twa;
 }
 
 
@@ -956,6 +960,14 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                enable = buf;
                break;
 
+       case LFUN_SPLIT_VIEW:
+               enable = buf;
+               break;
+
+       case LFUN_CLOSE_TAB_GROUP:
+               enable = d.currentTabWorkArea();
+               break;
+
        case LFUN_TOOLBAR_TOGGLE:
                flag.setOnOff(d.toolbars_->visible(cmd.getArg(0)));
                break;
@@ -981,6 +993,14 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                                enable = ic != ERT_CODE && ic != LISTINGS_CODE;
                        }
                }
+               else if (name == "symbols") {
+                       if (!view() || view()->cursor().inMathed())
+                               enable = false;
+                       else {
+                               InsetCode ic = view()->cursor().inset().lyxCode();
+                               enable = ic != ERT_CODE && ic != LISTINGS_CODE;
+                       }
+               }
                else if (name == "latexlog")
                        enable = FileName(buf->logName()).isReadableFile();
                else if (name == "spellchecker")
@@ -1156,12 +1176,9 @@ void GuiView::openDocument(string const & fname)
 }
 
 // FIXME: clean that
-static bool import(LyXView * lv, FileName const & filename,
-                     string const & format, ErrorList & errorList)
+static bool import(GuiView * lv, FileName const & filename,
+       string const & format, ErrorList & errorList)
 {
-       docstring const displaypath = makeDisplayPath(filename.absFilename());
-       lv->message(bformat(_("Importing %1$s..."), displaypath));
-
        FileName const lyxfile(changeExtension(filename.absFilename(), ".lyx"));
 
        string loader_format;
@@ -1169,16 +1186,17 @@ static bool import(LyXView * lv, FileName const & filename,
        if (find(loaders.begin(), loaders.end(), format) == loaders.end()) {
                for (vector<string>::const_iterator it = loaders.begin();
                     it != loaders.end(); ++it) {
-                       if (theConverters().isReachable(format, *it)) {
-                               string const tofile =
-                                       changeExtension(filename.absFilename(),
-                                               formats.extension(*it));
-                               if (!theConverters().convert(0, filename, FileName(tofile),
-                                                       filename, format, *it, errorList))
-                                       return false;
-                               loader_format = *it;
-                               break;
-                       }
+                       if (!theConverters().isReachable(format, *it))
+                               continue;
+
+                       string const tofile =
+                               changeExtension(filename.absFilename(),
+                               formats.extension(*it));
+                       if (!theConverters().convert(0, filename, FileName(tofile),
+                               filename, format, *it, errorList))
+                               return false;
+                       loader_format = *it;
+                       break;
                }
                if (loader_format.empty()) {
                        frontend::Alert::error(_("Couldn't import file"),
@@ -1186,26 +1204,21 @@ static bool import(LyXView * lv, FileName const & filename,
                                         formats.prettyName(format)));
                        return false;
                }
-       } else {
+       } else
                loader_format = format;
-       }
 
        if (loader_format == "lyx") {
                Buffer * buf = lv->loadDocument(lyxfile);
-               if (!buf) {
-                       // we are done
-                       lv->message(_("file not imported!"));
+               if (!buf)
                        return false;
-               }
                updateLabels(*buf);
                lv->setBuffer(buf);
                buf->errors("Parse");
        } else {
                Buffer * const b = newFile(lyxfile.absFilename(), string(), true);
-               if (b)
-                       lv->setBuffer(b);
-               else
+               if (!b)
                        return false;
+               lv->setBuffer(b);
                bool as_paragraphs = loader_format == "textparagraph";
                string filename2 = (loader_format == format) ? filename.absFilename()
                        : changeExtension(filename.absFilename(),
@@ -1215,8 +1228,6 @@ static bool import(LyXView * lv, FileName const & filename,
                lyx::dispatch(FuncRequest(LFUN_MARK_OFF));
        }
 
-       // we are done
-       lv->message(_("imported."));
        return true;
 }
 
@@ -1287,13 +1298,14 @@ void GuiView::importDocument(string const & argument)
                }
        }
 
+       docstring const displaypath = makeDisplayPath(lyxfile.absFilename(), 30);
+
        // if the file exists already, and we didn't do
        // -i lyx thefile.lyx, warn
        if (lyxfile.exists() && fullname != lyxfile) {
-               docstring const file = makeDisplayPath(lyxfile.absFilename(), 30);
 
                docstring text = bformat(_("The document %1$s already exists.\n\n"
-                                                    "Do you want to overwrite that document?"), file);
+                       "Do you want to overwrite that document?"), displaypath);
                int const ret = Alert::prompt(_("Overwrite document?"),
                        text, 0, 1, _("&Overwrite"), _("&Cancel"));
 
@@ -1303,8 +1315,13 @@ void GuiView::importDocument(string const & argument)
                }
        }
 
+       message(bformat(_("Importing %1$s..."), displaypath));
        ErrorList errorList;
-       import(this, fullname, format, errorList);
+       if (import(this, fullname, format, errorList))
+               message(_("imported."));
+       else
+               message(_("file not imported!"));
+
        // FIXME (Abdel 12/08/06): Is there a need to display the error list here?
 }
 
@@ -1770,6 +1787,10 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                                string const data = "vc " +
                                        Lexer::quoteString(buffer()->lyxvc().getLogFile());
                                showDialog("log", data);
+                       } else if (name == "symbols") {
+                               data = bv->cursor().getEncoding()->name();
+                               if (!data.empty())
+                                       showDialog("symbols", data);
                        } else
                                showDialog(name, data);
                        break;
@@ -1788,12 +1809,33 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        break;
                }
 
-               case LFUN_MENUBAR_TOGGLE:
-                       menuBar()->setVisible(!menuBar()->isVisible());
+               case LFUN_UI_TOGGLE:
+                       lfunUiToggle(cmd);
+                       // Make sure the keyboard focus stays in the work area.
+                       setFocus();
+                       break;
+
+               case LFUN_SPLIT_VIEW:
+                       if (Buffer * buf = buffer()) {
+                               string const orientation = cmd.getArg(0);
+                               d.splitter_->setOrientation(orientation == "vertical"
+                                       ? Qt::Vertical : Qt::Horizontal);
+                               TabWorkArea * twa = addTabWorkArea();
+                               GuiWorkArea * wa = twa->addWorkArea(*buf, *this);
+                               setCurrentWorkArea(wa);
+                       }
                        break;
 
-               case LFUN_STATUSBAR_TOGGLE:
-                       statusBar()->setVisible(!statusBar()->isVisible());
+               case LFUN_CLOSE_TAB_GROUP:
+                       if (TabWorkArea * twa = d.currentTabWorkArea()) {
+                               delete twa;
+                               twa = d.currentTabWorkArea();
+                               // Switch to the next GuiWorkArea in the found TabWorkArea.
+                               d.current_work_area_ = twa? twa->currentWorkArea() : 0;
+                               if (d.splitter_->count() == 0)
+                                       // No more work area, switch to the background widget.
+                                       d.setBackground();
+                       }
                        break;
 
                default:
@@ -1804,6 +1846,74 @@ bool GuiView::dispatch(FuncRequest const & cmd)
 }
 
 
+void GuiView::lfunUiToggle(FuncRequest const & cmd)
+{
+       string const arg = cmd.getArg(0);
+       if (arg == "scrollbar") {
+               // hide() is of no help
+               if (d.current_work_area_->verticalScrollBarPolicy() ==
+                       Qt::ScrollBarAlwaysOff)
+
+                       d.current_work_area_->setVerticalScrollBarPolicy(
+                               Qt::ScrollBarAsNeeded);
+               else
+                       d.current_work_area_->setVerticalScrollBarPolicy(
+                               Qt::ScrollBarAlwaysOff);
+               return;
+       }
+       if (arg == "statusbar") {
+               statusBar()->setVisible(!statusBar()->isVisible());
+               return;
+       }
+       if (arg == "menubar") {
+               menuBar()->setVisible(!menuBar()->isVisible());
+               return;
+       }
+#if QT_VERSION >= 0x040300
+       if (arg == "frame") {
+               int l, t, r, b;
+               getContentsMargins(&l, &t, &r, &b);
+               //are the frames in default state?
+               if (l == 0) {
+                       d.current_work_area_->setFrameStyle(QFrame::NoFrame);
+                       setContentsMargins(-2, -2, -2, -2);
+               } else {
+                       d.current_work_area_->setFrameStyle(QFrame::NoFrame);
+                       setContentsMargins(0, 0, 0, 0);
+               }
+               return;
+       }
+#endif
+       if (arg != "fullscreen") {
+               message(bformat(_("LFUN_UI_TOGGLE %1$s unknown command!"), from_utf8(arg)));
+               return;
+       }
+
+       if (lyxrc.full_screen_toolbars)
+               d.toolbars_->toggleFullScreen(!isFullScreen());
+
+       if (isFullScreen()) {
+               for (int i = 0; i != d.splitter_->count(); ++i)
+                       d.tabWorkArea(i)->setFullScreen(false);
+#if QT_VERSION >= 0x040300
+               setContentsMargins(0, 0, 0, 0);
+#endif
+               showNormal();
+               menuBar()->show();
+               statusBar()->show();
+       } else {
+               for (int i = 0; i != d.splitter_->count(); ++i)
+                       d.tabWorkArea(i)->setFullScreen(true);
+#if QT_VERSION >= 0x040300
+               setContentsMargins(-2, -2, -2, -2);
+#endif
+               showFullScreen();
+               statusBar()->hide();
+               menuBar()->hide();
+       }
+}
+
+
 Buffer const * GuiView::updateInset(Inset const * inset)
 {
        if (!d.current_work_area_)
@@ -1839,8 +1949,8 @@ char const * const dialognames[] = {
 "aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character",
 "citation", "document", "embedding", "errorlist", "ert", "external", "file",
 "findreplace", "float", "graphics", "include", "index", "nomenclature", "label", "log",
-"mathdelimiter", "mathmatrix", "note", "paragraph",
-"prefs", "print", "ref", "sendto", "spellchecker","tabular", "tabularcreate",
+"mathdelimiter", "mathmatrix", "note", "paragraph", "prefs", "print", 
+"ref", "sendto", "spellchecker", "symbols", "tabular", "tabularcreate",
 
 #ifdef HAVE_LIBAIKSAURUS
 "thesaurus",
@@ -2052,7 +2162,6 @@ 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);
@@ -2067,6 +2176,7 @@ Dialog * createGuiSearch(GuiView & lv);
 Dialog * createGuiSendTo(GuiView & lv);
 Dialog * createGuiShowFile(GuiView & lv);
 Dialog * createGuiSpellchecker(GuiView & lv);
+Dialog * createGuiSymbols(GuiView & lv);
 Dialog * createGuiTabularCreate(GuiView & lv);
 Dialog * createGuiTabular(GuiView & lv);
 Dialog * createGuiTexInfo(GuiView & lv);
@@ -2116,8 +2226,6 @@ Dialog * GuiView::build(string const & name)
                return createGuiGraphics(*this);
        if (name == "include")
                return createGuiInclude(*this);
-       if (name == "index")
-               return createGuiIndex(*this);
        if (name == "nomenclature")
                return createGuiNomenclature(*this);
        if (name == "label")
@@ -2144,6 +2252,8 @@ Dialog * GuiView::build(string const & name)
                return createGuiSendTo(*this);
        if (name == "spellchecker")
                return createGuiSpellchecker(*this);
+       if (name == "symbols")
+               return createGuiSymbols(*this);
        if (name == "tabular")
                return createGuiTabular(*this);
        if (name == "tabularcreate")