]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
Get rid of GuiApplication::view_ids_
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 6e873a7d75c217ce3246d985464791498eaf7164..63bd54ec63c476087b971512b96e55f65fe1eb06 100644 (file)
 #include "GuiView.h"
 
 #include "Dialog.h"
-#include "frontends/FileDialog.h"
+#include "FileDialog.h"
 #include "GuiApplication.h"
+#include "GuiCompleter.h"
 #include "GuiWorkArea.h"
 #include "GuiKeySymbol.h"
 #include "GuiToolbar.h"
 #include "GuiToolbars.h"
 #include "Menus.h"
+#include "TocModel.h"
 
 #include "qt_helpers.h"
 
 #include "BufferList.h"
 #include "BufferParams.h"
 #include "BufferView.h"
+#include "Converter.h"
 #include "Cursor.h"
-#include "support/debug.h"
+#include "Encoding.h"
 #include "ErrorList.h"
+#include "Format.h"
+#include "FuncStatus.h"
 #include "FuncRequest.h"
-#include "support/gettext.h"
 #include "Intl.h"
 #include "Layout.h"
 #include "Lexer.h"
 #include "ToolbarBackend.h"
 #include "version.h"
 
-#include "support/FileFilterList.h"
+#include "support/lassert.h"
+#include "support/debug.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
+#include "support/gettext.h"
 #include "support/ForkedCalls.h"
 #include "support/lstrings.h"
 #include "support/os.h"
@@ -69,6 +75,7 @@
 #include <QDropEvent>
 #include <QList>
 #include <QMenu>
+#include <QMenuBar>
 #include <QPainter>
 #include <QPixmap>
 #include <QPoint>
@@ -81,8 +88,8 @@
 #include <QTimer>
 #include <QToolBar>
 #include <QUrl>
+#include <QScrollBar>
 
-#include <boost/assert.hpp>
 #include <boost/bind.hpp>
 
 #ifdef HAVE_SYS_TIME_H
@@ -96,9 +103,6 @@ using namespace std;
 using namespace lyx::support;
 
 namespace lyx {
-
-extern bool quitting;
-
 namespace frontend {
 
 namespace {
@@ -110,18 +114,19 @@ public:
        {
                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");
+               QString const text = lyx_version ?
+                       qt_("version ") + lyx_version : qt_("unknown version");
                splash_ = QPixmap(":/images/banner.png");
 
                QPainter pain(&splash_);
-               pain.setPen(QColor(255, 255, 0));
+               pain.setPen(QColor(0, 0, 0));
                QFont font;
                // The font used to display the version info
                font.setStyleHint(QFont::SansSerif);
                font.setWeight(QFont::Bold);
                font.setPointSize(int(toqstr(lyxrc.font_sizes[FONT_SIZE_LARGE]).toDouble()));
                pain.setFont(font);
-               pain.drawText(260, 270, text);
+               pain.drawText(190, 225, text);
        }
 
        void paintEvent(QPaintEvent *)
@@ -144,8 +149,8 @@ typedef boost::shared_ptr<Dialog> DialogPtr;
 struct GuiView::GuiViewPrivate
 {
        GuiViewPrivate()
-               : current_work_area_(0), layout_(0),
-               quitting_by_menu_(false), autosave_timeout_(5000), in_show_(false)
+               : current_work_area_(0), layout_(0), autosave_timeout_(5000),
+               in_show_(false)
        {
                // hardcode here the platform specific icon size
                smallIconSize = 14;     // scaling problems
@@ -223,17 +228,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:
@@ -265,12 +267,13 @@ public:
        unsigned int bigIconSize;
        ///
        QTimer statusbar_timer_;
-       /// are we quitting by the menu?
-       bool quitting_by_menu_;
        /// auto-saving of buffers
        Timeout autosave_timeout_;
        /// flag against a race condition due to multiclicks, see bug #1119
        bool in_show_;
+
+       ///
+       TocModels toc_models_;
 };
 
 
@@ -280,8 +283,13 @@ GuiView::GuiView(int id)
        // GuiToolbars *must* be initialised before the menu bar.
        d.toolbars_ = new GuiToolbars(*this);
 
+       // set ourself as the current view. This is needed for the menu bar
+       // filling, at least for the static special menu item on Mac. Otherwise
+       // they are greyed out.
+       theLyXFunc().setLyXView(this);
+       
        // Fill up the menu bar.
-       guiApp->menus().fillMenuBar(this);
+       guiApp->menus().fillMenuBar(menuBar(), this, true);
 
        setCentralWidget(d.stack_widget_);
 
@@ -294,11 +302,11 @@ GuiView::GuiView(int id)
        connect(&d.statusbar_timer_, SIGNAL(timeout()),
                this, SLOT(clearMessage()));
 
-       // Qt bug? signal lastWindowClosed does not work
-       setAttribute(Qt::WA_QuitOnClose, false);
+       // We don't want to keep the window in memory if it is closed.
        setAttribute(Qt::WA_DeleteOnClose, true);
-#ifndef Q_WS_MACX
-       // assign an icon to main form. We do not do it under Qt/Mac,
+
+#if (!defined(Q_WS_WIN) && !defined(Q_WS_MACX))
+       // assign an icon to main form. We do not do it under Qt/Win or Qt/Mac,
        // since the icon is provided in the application bundle.
        setWindowIcon(QPixmap(":/images/lyx.png"));
 #endif
@@ -334,21 +342,17 @@ GuiView::GuiView(int id)
 
 GuiView::~GuiView()
 {
+       if (guiApp->currentView() == this)
+               guiApp->setCurrentView(0);
+       theLyXFunc().setLyXView(0);
+       
        delete &d;
 }
 
 
-void GuiView::close()
+TocModels & GuiView::tocModels()
 {
-       d.quitting_by_menu_ = true;
-       d.current_work_area_ = 0;
-       for (int i = 0; i != d.splitter_->count(); ++i) {
-               TabWorkArea * twa = d.tabWorkArea(i);
-               if (twa)
-                       twa->closeAll();
-       }
-       QMainWindow::close();
-       d.quitting_by_menu_ = false;
+       return d.toc_models_;
 }
 
 
@@ -383,10 +387,41 @@ void GuiView::showEvent(QShowEvent * e)
 
 void GuiView::closeEvent(QCloseEvent * close_event)
 {
-       // we may have been called through the close window button
-       // which bypasses the LFUN machinery.
-       if (!d.quitting_by_menu_ && guiApp->viewCount() == 1) {
-               if (!quitWriteAll()) {
+       // it can happen that this event arrives without selecting the view,
+       // e.g. when clicking the close button on a background window.
+       theLyXFunc().setLyXView(this);
+
+       while (Buffer * b = buffer()) {
+               if (b->parent()) {
+                       // This is a child document, just close the tab after saving
+                       // but keep the file loaded.
+                       if (!saveBuffer(*b)) {
+                               close_event->ignore();
+                               return;
+                       }
+                       removeWorkArea(d.current_work_area_);
+                       continue;
+               }
+
+               QVector<int> const ids = guiApp->viewIds();
+               for (int i = 0; i != ids.size(); ++i) {
+                       if (id_ == ids[i])
+                               continue;
+                       if (guiApp->view(ids[i]).workArea(*b)) {
+                               // FIXME 1: should we put an alert box here that the buffer
+                               // is viewed elsewhere?
+                               // FIXME 2: should we try to save this buffer in any case?
+                               //saveBuffer(b);
+
+                               // This buffer is also opened in another view, so
+                               // but close the associated work area nevertheless.
+                               removeWorkArea(d.current_work_area_);
+                               // but don't close it.
+                               b = 0;
+                               break;
+                       }
+               }
+               if (b && !closeBuffer(*b, true)) {
                        close_event->ignore();
                        return;
                }
@@ -394,10 +429,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());
+               updateDialogs();
+       }
+
        // 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
@@ -415,20 +459,7 @@ void GuiView::closeEvent(QCloseEvent * close_event)
        }
 
        guiApp->unregisterView(id_);
-       if (guiApp->viewCount() > 0) {
-               // Just close the window and do nothing else if this is not the
-               // last window.
-               close_event->accept();
-               return;
-       }
-
-       quitting = true;
-
-       // this is the place where we leave the frontend.
-       // it is the only point at which we start quitting.
        close_event->accept();
-       // quit the event loop
-       qApp->quit();
 }
 
 
@@ -517,14 +548,35 @@ void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa)
                this, SLOT(updateWindowTitle(GuiWorkArea *)));
        updateWindowTitle(wa);
 
-       updateToc();
-       // Buffer-dependent dialogs should be updated or
-       // hidden. This should go here because some dialogs (eg ToC)
-       // require bv_->text.
-       updateBufferDependent(true);
-       updateToolbars();
-       updateLayoutList();
-       updateStatusBar();
+       structureChanged();
+
+       // The document settings needs to be reinitialised.
+       updateDialog("document", "");
+
+       // Buffer-dependent dialogs must be updated. This is done here because
+       // some dialogs require buffer()->text.
+       updateDialogs();
+}
+
+
+void GuiView::on_lastWorkAreaRemoved()
+{
+#ifdef Q_WS_MACX
+       // On Mac close the view if there is no Tab open anymore,
+       // but only if no splitter is visible
+       if (!lyxrc.open_buffers_in_tabs && d.splitter_->count() == 1) {
+               TabWorkArea * twa = qobject_cast<TabWorkArea *>(d.splitter_->widget(0));
+               if (twa && twa->count() == 0) {
+                       // close the view, as no tab is open anymore
+                       QTimer::singleShot(0, this, SLOT(close()));
+               }
+       }
+#else
+       structureChanged();
+       // The document settings needs to be reinitialised.
+       updateDialog("document", "");
+       updateDialogs();
+#endif
 }
 
 
@@ -534,6 +586,7 @@ void GuiView::updateStatusBar()
        if (d.statusbar_timer_.isActive())
                return;
 
+       theLyXFunc().setLyXView(this);
        statusBar()->showMessage(toqstr(theLyXFunc().viewStatusMessage()));
 }
 
@@ -564,28 +617,47 @@ bool GuiView::event(QEvent * e)
        //      break;
 
        case QEvent::WindowActivate: {
-               guiApp->setCurrentView(*this);
+               if (this == guiApp->currentView()) {
+                       setFocus();
+                       return QMainWindow::event(e);
+               }
+               guiApp->setCurrentView(this);
                if (d.current_work_area_) {
                        BufferView & bv = d.current_work_area_->bufferView();
                        connectBufferView(bv);
                        connectBuffer(bv.buffer());
                        // The document structure, name and dialogs might have
                        // changed in another view.
-                       updateBufferDependent(true);
+                       structureChanged();
+                       // The document settings needs to be reinitialised.
+                       updateDialog("document", "");
+                       updateDialogs();
                } else {
                        setWindowTitle(qt_("LyX"));
                        setWindowIconText(qt_("LyX"));
                }
+               setFocus();
                return QMainWindow::event(e);
        }
 
        case QEvent::ShortcutOverride: {
+
+               if (isFullScreen() && menuBar()->isHidden()) {
+                       QKeyEvent * ke = static_cast<QKeyEvent*>(e);
+                       // FIXME: we should also try to detect special LyX shortcut such as
+                       // Alt-P and Alt-M. Right now there is a hack in
+                       // GuiWorkArea::processKeySym() that hides again the menubar for
+                       // those cases.
+                       if (ke->modifiers() & Qt::AltModifier && ke->key() != Qt::Key_Alt)
+                               menuBar()->show();
+                       return QMainWindow::event(e);
+               }
+
                if (d.current_work_area_)
                        // Nothing special to do.
                        return QMainWindow::event(e);
 
                QKeyEvent * ke = static_cast<QKeyEvent*>(e);
-
                // Let Qt handle menu access and the Tab keys to navigate keys to navigate
                // between controls.
                if (ke->modifiers() & Qt::AltModifier || ke->key() == Qt::Key_Tab 
@@ -618,7 +690,7 @@ bool GuiView::focusNextPrevChild(bool /*next*/)
 void GuiView::setBusy(bool busy)
 {
        if (d.current_work_area_) {
-               d.current_work_area_->setUpdatesEnabled(busy);
+               d.current_work_area_->setUpdatesEnabled(!busy);
                if (busy)
                        d.current_work_area_->stopBlinkingCursor();
                else
@@ -681,34 +753,32 @@ 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 *)));
+       QObject::connect(twa, SIGNAL(lastWorkAreaRemoved()),
+                        this, SLOT(on_lastWorkAreaRemoved()));
+
        d.splitter_->addWidget(twa);
        d.stack_widget_->setCurrentWidget(d.splitter_);
+       return twa;
 }
 
 
@@ -720,12 +790,7 @@ GuiWorkArea const * GuiView::currentWorkArea() const
 
 void GuiView::setCurrentWorkArea(GuiWorkArea * wa)
 {
-       BOOST_ASSERT(wa);
-
-       // Changing work area can result from opening a file so
-       // update the toc in any case.
-       updateToc();
-
+       LASSERT(wa, /**/);
        d.current_work_area_ = wa;
        for (int i = 0; i != d.splitter_->count(); ++i) {
                if (d.tabWorkArea(i)->setCurrentWorkArea(wa))
@@ -736,11 +801,10 @@ void GuiView::setCurrentWorkArea(GuiWorkArea * wa)
 
 void GuiView::removeWorkArea(GuiWorkArea * wa)
 {
-       BOOST_ASSERT(wa);
+       LASSERT(wa, /**/);
        if (wa == d.current_work_area_) {
                disconnectBuffer();
                disconnectBufferView();
-               hideBufferDependent();
                d.current_work_area_ = 0;
        }
 
@@ -801,9 +865,6 @@ void GuiView::updateToolbars()
                d.toolbars_->update(math, table, review, mathmacrotemplate);
        } else
                d.toolbars_->update(false, false, false, false);
-
-       // update read-only status of open dialogs.
-       checkStatus();
 }
 
 
@@ -825,7 +886,7 @@ Buffer const * GuiView::buffer() const
 
 void GuiView::setBuffer(Buffer * newBuffer)
 {
-       BOOST_ASSERT(newBuffer);
+       LASSERT(newBuffer, /**/);
        setBusy(true);
 
        GuiWorkArea * wa = workArea(*newBuffer);
@@ -878,6 +939,15 @@ void GuiView::errors(string const & error_type)
 }
 
 
+void GuiView::structureChanged()
+{
+       d.toc_models_.reset(view());
+       // Navigator needs more than a simple update in this case. It needs to be
+       // rebuilt.
+       updateDialog("toc", "");
+}
+
+
 void GuiView::updateDialog(string const & name, string const & data)
 {
        if (!isDialogVisible(name))
@@ -889,7 +959,7 @@ void GuiView::updateDialog(string const & name, string const & data)
 
        Dialog * const dialog = it->second.get();
        if (dialog->isVisibleView())
-               dialog->updateData(data);
+               dialog->initialiseParams(data);
 }
 
 
@@ -899,18 +969,6 @@ BufferView * GuiView::view()
 }
 
 
-void GuiView::updateToc()
-{
-       updateDialog("toc", "");
-}
-
-
-void GuiView::updateEmbeddedFiles()
-{
-       updateDialog("embedding", "");
-}
-
-
 void GuiView::autoSave()
 {
        LYXERR(Debug::INFO, "Running autoSave()");
@@ -927,9 +985,8 @@ void GuiView::resetAutosaveTimers()
 }
 
 
-FuncStatus GuiView::getStatus(FuncRequest const & cmd)
+bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 {
-       FuncStatus flag;
        bool enable = true;
        Buffer * buf = buffer();
 
@@ -953,10 +1010,22 @@ 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;
 
+       case LFUN_UI_TOGGLE:
+               flag.setOnOff(isFullScreen());
+               break;
+
        case LFUN_DIALOG_TOGGLE:
                flag.setOnOff(isDialogVisible(cmd.getArg(0)));
                // fall through to set "enable"
@@ -978,6 +1047,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")
@@ -999,10 +1076,6 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
        }
 
        case LFUN_INSET_APPLY: {
-               if (!buf) {
-                       enable = false;
-                       break;
-               }
                string const name = cmd.getArg(0);
                Inset * inset = getOpenInset(name);
                if (inset) {
@@ -1010,47 +1083,306 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                        FuncStatus fs;
                        if (!inset->getStatus(view()->cursor(), fr, fs)) {
                                // Every inset is supposed to handle this
-                               BOOST_ASSERT(false);
+                               LASSERT(false, /**/);
                        }
                        flag |= fs;
                } else {
                        FuncRequest fr(LFUN_INSET_INSERT, cmd.argument());
-                       flag |= getStatus(fr);
+                       flag |= lyx::getStatus(fr);
                }
                enable = flag.enabled();
                break;
        }
 
+       case LFUN_COMPLETION_INLINE:
+               if (!d.current_work_area_
+                   || !d.current_work_area_->completer().inlinePossible(view()->cursor()))
+                   enable = false;
+               break;
+
+       case LFUN_COMPLETION_POPUP:
+               if (!d.current_work_area_
+                   || !d.current_work_area_->completer().popupPossible(view()->cursor()))
+                   enable = false;
+               break;
+
+       case LFUN_COMPLETION_COMPLETE:
+               if (!d.current_work_area_
+                       || !d.current_work_area_->completer().inlinePossible(view()->cursor()))
+                   enable = false;
+               break;
+
        default:
-               if (!view()) {
-                       enable = false;
-                       break;
-               }
+               return false;
        }
 
        if (!enable)
                flag.enabled(false);
 
-       return flag;
+       return true;
 }
 
 
 static FileName selectTemplateFile()
 {
-       FileDialog dlg(_("Select template file"));
-       dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-       dlg.setButton1(_("Templates|#T#t"), from_utf8(lyxrc.template_path));
+       FileDialog dlg(qt_("Select template file"));
+       dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+       dlg.setButton1(qt_("Templates|#T#t"), toqstr(lyxrc.template_path));
 
-       FileDialog::Result result =
-               dlg.open(from_utf8(lyxrc.template_path),
-                            FileFilterList(_("LyX Documents (*.lyx)")),
-                            docstring());
+       FileDialog::Result result = dlg.open(toqstr(lyxrc.template_path),
+                            QStringList(qt_("LyX Documents (*.lyx)")));
 
        if (result.first == FileDialog::Later)
                return FileName();
-       if (result.second.empty())
+       if (result.second.isEmpty())
                return FileName();
-       return FileName(to_utf8(result.second));
+       return FileName(fromqstr(result.second));
+}
+
+
+Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles)
+{
+       setBusy(true);
+
+       Buffer * newBuffer = checkAndLoadLyXFile(filename);
+
+       if (!newBuffer) {
+               message(_("Document not loaded."));
+               setBusy(false);
+               return 0;
+       }
+       
+       setBuffer(newBuffer);
+
+       // scroll to the position when the file was last closed
+       if (lyxrc.use_lastfilepos) {
+               LastFilePosSection::FilePos filepos =
+                       LyX::ref().session().lastFilePos().load(filename);
+               view()->moveToPosition(filepos.pit, filepos.pos, 0, 0);
+       }
+
+       if (tolastfiles)
+               LyX::ref().session().lastFiles().add(filename);
+
+       setBusy(false);
+       return newBuffer;
+}
+
+
+void GuiView::openDocument(string const & fname)
+{
+       string initpath = lyxrc.document_path;
+
+       if (buffer()) {
+               string const trypath = buffer()->filePath();
+               // If directory is writeable, use this as default.
+               if (FileName(trypath).isDirWritable())
+                       initpath = trypath;
+       }
+
+       string filename;
+
+       if (fname.empty()) {
+               FileDialog dlg(qt_("Select document to open"), LFUN_FILE_OPEN);
+               dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+               dlg.setButton2(qt_("Examples|#E#e"),
+                               toqstr(addPath(package().system_support().absFilename(), "examples")));
+
+               FileDialog::Result result =
+                       dlg.open(toqstr(initpath), QStringList(qt_("LyX Documents (*.lyx)")));
+
+               if (result.first == FileDialog::Later)
+                       return;
+
+               filename = fromqstr(result.second);
+
+               // check selected filename
+               if (filename.empty()) {
+                       message(_("Canceled."));
+                       return;
+               }
+       } else
+               filename = fname;
+
+       // get absolute path of file and add ".lyx" to the filename if
+       // necessary. 
+       FileName const fullname = 
+                       fileSearch(string(), filename, "lyx", support::may_not_exist);
+       if (!fullname.empty())
+               filename = fullname.absFilename();
+
+       // if the file doesn't exist, let the user create one
+       if (!fullname.exists()) {
+               // the user specifically chose this name. Believe him.
+               Buffer * const b = newFile(filename, string(), true);
+               if (b)
+                       setBuffer(b);
+               return;
+       }
+
+       docstring const disp_fn = makeDisplayPath(filename);
+       message(bformat(_("Opening document %1$s..."), disp_fn));
+
+       docstring str2;
+       Buffer * buf = loadDocument(fullname);
+       if (buf) {
+               updateLabels(*buf);
+               
+               setBuffer(buf);
+               buf->errors("Parse");
+               str2 = bformat(_("Document %1$s opened."), disp_fn);
+       } else {
+               str2 = bformat(_("Could not open document %1$s"), disp_fn);
+       }
+       message(str2);
+}
+
+// FIXME: clean that
+static bool import(GuiView * lv, FileName const & filename,
+       string const & format, ErrorList & errorList)
+{
+       FileName const lyxfile(support::changeExtension(filename.absFilename(), ".lyx"));
+
+       string loader_format;
+       vector<string> loaders = theConverters().loaders();
+       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))
+                               continue;
+
+                       string const tofile =
+                               support::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"),
+                                    bformat(_("No information for importing the format %1$s."),
+                                        formats.prettyName(format)));
+                       return false;
+               }
+       } else
+               loader_format = format;
+
+       if (loader_format == "lyx") {
+               Buffer * buf = lv->loadDocument(lyxfile);
+               if (!buf)
+                       return false;
+               updateLabels(*buf);
+               lv->setBuffer(buf);
+               buf->errors("Parse");
+       } else {
+               Buffer * const b = newFile(lyxfile.absFilename(), string(), true);
+               if (!b)
+                       return false;
+               lv->setBuffer(b);
+               bool as_paragraphs = loader_format == "textparagraph";
+               string filename2 = (loader_format == format) ? filename.absFilename()
+                       : support::changeExtension(filename.absFilename(),
+                                         formats.extension(loader_format));
+               lv->view()->insertPlaintextFile(FileName(filename2), as_paragraphs);
+               theLyXFunc().setLyXView(lv);
+               lyx::dispatch(FuncRequest(LFUN_MARK_OFF));
+       }
+
+       return true;
+}
+
+
+void GuiView::importDocument(string const & argument)
+{
+       string format;
+       string filename = split(argument, format, ' ');
+
+       LYXERR(Debug::INFO, format << " file: " << filename);
+
+       // need user interaction
+       if (filename.empty()) {
+               string initpath = lyxrc.document_path;
+
+               Buffer const * buf = buffer();
+               if (buf) {
+                       string const trypath = buf->filePath();
+                       // If directory is writeable, use this as default.
+                       if (FileName(trypath).isDirWritable())
+                               initpath = trypath;
+               }
+
+               docstring const text = bformat(_("Select %1$s file to import"),
+                       formats.prettyName(format));
+
+               FileDialog dlg(toqstr(text), LFUN_BUFFER_IMPORT);
+               dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+               dlg.setButton2(qt_("Examples|#E#e"),
+                       toqstr(addPath(package().system_support().absFilename(), "examples")));
+
+               docstring filter = formats.prettyName(format);
+               filter += " (*.";
+               // FIXME UNICODE
+               filter += from_utf8(formats.extension(format));
+               filter += ')';
+
+               FileDialog::Result result =
+                       dlg.open(toqstr(initpath), fileFilters(toqstr(filter)));
+
+               if (result.first == FileDialog::Later)
+                       return;
+
+               filename = fromqstr(result.second);
+
+               // check selected filename
+               if (filename.empty())
+                       message(_("Canceled."));
+       }
+
+       if (filename.empty())
+               return;
+
+       // get absolute path of file
+       FileName const fullname(support::makeAbsPath(filename));
+
+       FileName const lyxfile(support::changeExtension(fullname.absFilename(), ".lyx"));
+
+       // Check if the document already is open
+       Buffer * buf = theBufferList().getBuffer(lyxfile.absFilename());
+       if (buf) {
+               setBuffer(buf);
+               if (!closeBuffer()) {
+                       message(_("Canceled."));
+                       return;
+               }
+       }
+
+       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 text = bformat(_("The document %1$s already exists.\n\n"
+                       "Do you want to overwrite that document?"), displaypath);
+               int const ret = Alert::prompt(_("Overwrite document?"),
+                       text, 0, 1, _("&Overwrite"), _("&Cancel"));
+
+               if (ret == 1) {
+                       message(_("Canceled."));
+                       return;
+               }
+       }
+
+       message(bformat(_("Importing %1$s..."), displaypath));
+       ErrorList 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?
 }
 
 
@@ -1103,22 +1435,20 @@ void GuiView::insertLyXFile(docstring const & fname)
                initpath = trypath;
 
        // FIXME UNICODE
-       FileDialog dlg(_("Select LyX document to insert"), LFUN_FILE_INSERT);
-       dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-       dlg.setButton2(_("Examples|#E#e"),
-               from_utf8(addPath(package().system_support().absFilename(),
+       FileDialog dlg(qt_("Select LyX document to insert"), LFUN_FILE_INSERT);
+       dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+       dlg.setButton2(qt_("Examples|#E#e"),
+               toqstr(addPath(package().system_support().absFilename(),
                "examples")));
 
-       FileDialog::Result result =
-               dlg.open(from_utf8(initpath),
-                            FileFilterList(_("LyX Documents (*.lyx)")),
-                            docstring());
+       FileDialog::Result result = dlg.open(toqstr(initpath),
+                            QStringList(qt_("LyX Documents (*.lyx)")));
 
        if (result.first == FileDialog::Later)
                return;
 
        // FIXME UNICODE
-       filename.set(to_utf8(result.second));
+       filename.set(fromqstr(result.second));
 
        // check selected filename
        if (filename.empty()) {
@@ -1146,17 +1476,17 @@ void GuiView::insertPlaintextFile(docstring const & fname,
                return;
        }
 
-       FileDialog dlg(_("Select file to insert"), (asParagraph ?
+       FileDialog dlg(qt_("Select file to insert"), (asParagraph ?
                LFUN_FILE_INSERT_PLAINTEXT_PARA : LFUN_FILE_INSERT_PLAINTEXT));
 
-       FileDialog::Result result = dlg.open(from_utf8(bv->buffer().filePath()),
-               FileFilterList(), docstring());
+       FileDialog::Result result = dlg.open(toqstr(bv->buffer().filePath()),
+               QStringList());
 
        if (result.first == FileDialog::Later)
                return;
 
        // FIXME UNICODE
-       filename.set(to_utf8(result.second));
+       filename.set(fromqstr(result.second));
 
        // check selected filename
        if (filename.empty()) {
@@ -1176,32 +1506,30 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname)
 
        if (!newname.empty()) {
                // FIXME UNICODE
-               fname = makeAbsPath(to_utf8(newname), oldname.onlyPath().absFilename());
+               fname = support::makeAbsPath(to_utf8(newname), oldname.onlyPath().absFilename());
        } else {
                // Switch to this Buffer.
                setBuffer(&b);
 
                /// No argument? Ask user through dialog.
                // FIXME UNICODE
-               FileDialog dlg(_("Choose a filename to save document as"),
+               FileDialog dlg(qt_("Choose a filename to save document as"),
                                   LFUN_BUFFER_WRITE_AS);
-               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-               dlg.setButton2(_("Templates|#T#t"), from_utf8(lyxrc.template_path));
+               dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+               dlg.setButton2(qt_("Templates|#T#t"), toqstr(lyxrc.template_path));
 
                if (!isLyXFilename(fname.absFilename()))
                        fname.changeExtension(".lyx");
 
-               FileFilterList const filter(_("LyX Documents (*.lyx)"));
-
                FileDialog::Result result =
-                       dlg.save(from_utf8(fname.onlyPath().absFilename()),
-                                    filter,
-                                    from_utf8(fname.onlyFileName()));
+                       dlg.save(toqstr(fname.onlyPath().absFilename()),
+                              QStringList(qt_("LyX Documents (*.lyx)")),
+                                    toqstr(fname.onlyFileName()));
 
                if (result.first == FileDialog::Later)
                        return false;
 
-               fname.set(to_utf8(result.second));
+               fname.set(fromqstr(result.second));
 
                if (fname.empty())
                        return false;
@@ -1285,9 +1613,16 @@ bool GuiView::closeBuffer()
 }
 
 
-bool GuiView::closeBuffer(Buffer & buf)
+bool GuiView::closeBuffer(Buffer & buf, bool tolastopened)
 {
+       // goto bookmark to update bookmark pit.
+       //FIXME: we should update only the bookmarks related to this buffer!
+       for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i)
+               theLyXFunc().gotoBookmark(i+1, false, false);
+
        if (buf.isClean() || buf.paragraphs().empty()) {
+               if (buf.masterBuffer() == &buf && tolastopened)
+                       LyX::ref().session().lastOpened().add(buf.fileName());
                theBufferList().release(&buf);
                return true;
        }
@@ -1301,6 +1636,10 @@ bool GuiView::closeBuffer(Buffer & buf)
        else
                file = buf.fileName().displayName(30);
 
+       // Bring this window to top before asking questions.
+       raise();
+       activateWindow();
+
        docstring const text = bformat(_("The document %1$s has unsaved changes."
                "\n\nDo you want to save the document or discard the changes?"), file);
        int const ret = Alert::prompt(_("Save changed document?"),
@@ -1324,7 +1663,7 @@ bool GuiView::closeBuffer(Buffer & buf)
        // save file names to .lyx/session
        // if master/slave are both open, do not save slave since it
        // will be automatically loaded when the master is loaded
-       if (buf.masterBuffer() == &buf)
+       if (buf.masterBuffer() == &buf && tolastopened)
                LyX::ref().session().lastOpened().add(buf.fileName());
 
        theBufferList().release(&buf);
@@ -1332,25 +1671,19 @@ bool GuiView::closeBuffer(Buffer & buf)
 }
 
 
-bool GuiView::quitWriteAll()
-{
-       while (!theBufferList().empty()) {
-               Buffer * b = theBufferList().first();
-               if (!closeBuffer(*b))
-                       return false;
-       }
-       return true;
-}
-
-
 bool GuiView::dispatch(FuncRequest const & cmd)
 {
-       BufferView * bv = view();       
+       BufferView * bv = view();
        // By default we won't need any update.
        if (bv)
                bv->cursor().updateFlags(Update::None);
+       bool dispatched = true;
 
        switch(cmd.action) {
+               case LFUN_BUFFER_IMPORT:
+                       importDocument(to_utf8(cmd.argument()));
+                       break;
+
                case LFUN_BUFFER_SWITCH:
                        setBuffer(theBufferList().getBuffer(to_utf8(cmd.argument())));
                        break;
@@ -1374,7 +1707,7 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_MENU_OPEN:
-                       if (QMenu * menu = guiApp->menus().menu(toqstr(cmd.argument())))
+                       if (QMenu * menu = guiApp->menus().menu(toqstr(cmd.argument()), *this))
                                menu->exec(QCursor::pos());
                        break;
 
@@ -1407,10 +1740,10 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        // We cannot use a for loop as the buffer list cycles.
                        Buffer * b = first;
                        do {
-                               if (b->isClean())
-                                       continue;
-                               saveBuffer(*b);
-                               LYXERR(Debug::ACTION, "Saved " << b->absFileName());
+                               if (!b->isClean()) {
+                                       saveBuffer(*b);
+                                       LYXERR(Debug::ACTION, "Saved " << b->absFileName());
+                               }
                                b = theBufferList().next(b);
                        } while (b != first); 
                        message(_("All documents saved."));
@@ -1476,8 +1809,6 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_DIALOG_HIDE: {
-                       if (quitting)
-                               break;
                        guiApp->hideDialogs(to_utf8(cmd.argument()), 0);
                        break;
                }
@@ -1507,12 +1838,17 @@ 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;
                }
 
                case LFUN_INSET_APPLY: {
+                       view()->cursor().recordUndoFullDocument();
                        string const name = cmd.getArg(0);
                        Inset * inset = getOpenInset(name);
                        if (inset) {
@@ -1525,11 +1861,131 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        break;
                }
 
+               case LFUN_UI_TOGGLE:
+                       lfunUiToggle(cmd);
+                       // Make sure the keyboard focus stays in the work area.
+                       setFocus();
+                       break;
+
+               case LFUN_COMPLETION_INLINE:
+                       if (d.current_work_area_)
+                               d.current_work_area_->completer().showInline();
+                       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_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;
+                       
+               case LFUN_COMPLETION_POPUP:
+                       if (d.current_work_area_)
+                               d.current_work_area_->completer().showPopup();
+                       break;
+
+
+               case LFUN_COMPLETION_COMPLETE:
+                       if (d.current_work_area_)
+                               d.current_work_area_->completer().tab();
+                       break;
+
                default:
-                       return false;
+                       dispatched = false;
+                       break;
        }
 
-       return true;
+       if (isFullScreen()) {
+               if (menuBar()->isVisible())
+                       menuBar()->hide();
+               if (statusBar()->isVisible())
+                       statusBar()->hide();
+       }
+
+       return dispatched;
+}
+
+
+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?
+               d.current_work_area_->setFrameStyle(QFrame::NoFrame);
+               if (l == 0) {
+                       setContentsMargins(-2, -2, -2, -2);
+               } else {
+                       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
+               setWindowState(windowState() ^ Qt::WindowFullScreen);
+               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
+               setWindowState(windowState() ^ Qt::WindowFullScreen);
+               statusBar()->hide();
+               menuBar()->hide();
+       }
 }
 
 
@@ -1553,9 +2009,15 @@ void GuiView::restartCursor()
        if (d.current_work_area_)
                d.current_work_area_->startBlinkingCursor();
 
-       // Take this occasion to update the toobars and layout list.
-       updateLayoutList();
-       updateToolbars();
+       // Take this occasion to update the other GUI elements.
+       updateDialogs();
+}
+
+
+void GuiView::updateCompletion(Cursor & cur, bool start, bool keep)
+{
+       if (d.current_work_area_)
+               d.current_work_area_->completer().updateVisibility(cur, start, keep);
 }
 
 namespace {
@@ -1566,10 +2028,10 @@ namespace {
 
 char const * const dialognames[] = {
 "aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character",
-"citation", "document", "embedding", "errorlist", "ert", "external", "file",
+"citation", "document", "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", "space", "spellchecker", "symbols", "tabular", "tabularcreate",
 
 #ifdef HAVE_LIBAIKSAURUS
 "thesaurus",
@@ -1607,7 +2069,7 @@ void GuiView::resetDialogs()
        // FIXME: the "math panels" toolbar takes an awful lot of time to
        // initialise so we don't do that for the time being.
        //d.toolbars_->init();
-       guiApp->menus().fillMenuBar(this);
+       guiApp->menus().fillMenuBar(menuBar(), this);
        if (d.layout_)
                d.layout_->updateContents(true);
        // Now update controls with current buffer.
@@ -1662,13 +2124,6 @@ bool GuiView::isDialogVisible(string const & name) const
 
 void GuiView::hideDialog(string const & name, Inset * inset)
 {
-       // Don't send the signal if we are quitting, because on MSVC it is
-       // destructed before the cut stack in CutAndPaste.cpp, and this method
-       // is called from some inset destructor if the cut stack is not empty
-       // on exit.
-       if (quitting)
-               return;
-
        map<string, DialogPtr>::const_iterator it = d.dialogs_.find(name);
        if (it == d.dialogs_.end())
                return;
@@ -1713,57 +2168,22 @@ void GuiView::hideAll() const
 }
 
 
-void GuiView::hideBufferDependent() const
-{
-       map<string, DialogPtr>::const_iterator it  = d.dialogs_.begin();
-       map<string, DialogPtr>::const_iterator end = d.dialogs_.end();
-
-       for(; it != end; ++it) {
-               Dialog * dialog = it->second.get();
-               if (dialog->isBufferDependent())
-                       dialog->hideView();
-       }
-}
-
-
-void GuiView::updateBufferDependent(bool switched) const
+void GuiView::updateDialogs()
 {
        map<string, DialogPtr>::const_iterator it  = d.dialogs_.begin();
        map<string, DialogPtr>::const_iterator end = d.dialogs_.end();
 
        for(; it != end; ++it) {
                Dialog * dialog = it->second.get();
-               if (!dialog->isVisibleView())
-                       continue;
-               if (switched && dialog->isBufferDependent()) {
-                       if (dialog->initialiseParams(""))
-                               dialog->updateView();
-                       else
-                               dialog->hideView();
-               } else {
-                       // A bit clunky, but the dialog will request
-                       // that the kernel provides it with the necessary
-                       // data.
-                       dialog->updateDialog();
-               }
-       }
-}
-
-
-void GuiView::checkStatus()
-{
-       map<string, DialogPtr>::const_iterator it  = d.dialogs_.begin();
-       map<string, DialogPtr>::const_iterator end = d.dialogs_.end();
-
-       for(; it != end; ++it) {
-               Dialog * const dialog = it->second.get();
                if (dialog && dialog->isVisibleView())
                        dialog->checkStatus();
        }
+       updateToolbars();
+       updateLayoutList();
+       updateStatusBar();
 }
 
 
-
 // will be replaced by a proper factory...
 Dialog * createGuiAbout(GuiView & lv);
 Dialog * createGuiBibitem(GuiView & lv);
@@ -1780,8 +2200,8 @@ Dialog * createGuiERT(GuiView & lv);
 Dialog * createGuiExternal(GuiView & lv);
 Dialog * createGuiFloat(GuiView & lv);
 Dialog * createGuiGraphics(GuiView & lv);
+Dialog * createGuiHSpace(GuiView & lv);
 Dialog * createGuiInclude(GuiView & lv);
-Dialog * createGuiIndex(GuiView & lv);
 Dialog * createGuiLabel(GuiView & lv);
 Dialog * createGuiListings(GuiView & lv);
 Dialog * createGuiLog(GuiView & lv);
@@ -1796,6 +2216,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);
@@ -1809,7 +2230,7 @@ Dialog * createGuiWrap(GuiView & lv);
 
 Dialog * GuiView::build(string const & name)
 {
-       BOOST_ASSERT(isValidName(name));
+       LASSERT(isValidName(name), /**/);
 
        if (name == "aboutlyx")
                return createGuiAbout(*this);
@@ -1845,8 +2266,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")
@@ -1871,8 +2290,12 @@ Dialog * GuiView::build(string const & name)
                return createGuiRef(*this);
        if (name == "sendto")
                return createGuiSendTo(*this);
+       if (name == "space")
+               return createGuiHSpace(*this);
        if (name == "spellchecker")
                return createGuiSpellchecker(*this);
+       if (name == "symbols")
+               return createGuiSymbols(*this);
        if (name == "tabular")
                return createGuiTabular(*this);
        if (name == "tabularcreate")