Hello,

As the title says...

If I don't get any objection, I'll do the merge tomorrow.

Abdel.
Index: BufferView.C
===================================================================
--- BufferView.C        (revision 14429)
+++ BufferView.C        (working copy)
@@ -96,9 +96,9 @@
 }
 
 
-void BufferView::newFile(string const & fn, string const & tn, bool named)
+string BufferView::firstLayout()
 {
-       pimpl_->newFile(fn, tn, named);
+       return pimpl_->firstLayout();
 }
 
 
Index: BufferView.h
===================================================================
--- BufferView.h        (revision 14429)
+++ BufferView.h        (working copy)
@@ -15,6 +15,8 @@
 #ifndef BUFFER_VIEW_H
 #define BUFFER_VIEW_H
 
+#include "metricsinfo.h"
+
 #include "frontends/LyXKeySym.h"
 
 #include "support/types.h"
@@ -96,6 +98,8 @@
        void setBuffer(Buffer * b);
        /// return the buffer being viewed
        Buffer * buffer() const;
+       /// return the first layout of the Buffer.
+       std::string firstLayout();
 
        /// return the owning main view
        LyXView * owner() const;
@@ -105,9 +109,6 @@
 
        /// reload the contained buffer
        void reload();
-       /// create a new buffer based on template
-       void newFile(std::string const & fname, std::string const & tname,
-                    bool named = true);
        /// load a buffer into the view
        bool loadLyXFile(std::string const & name, bool tolastfiles = true);
 
@@ -220,7 +221,6 @@
         */
        void putSelectionAt(DocIterator const & cur,
                int length, bool backwards);
-
        ///
        ViewMetricsInfo const & viewMetricsInfo();
 
Index: BufferView_pimpl.C
===================================================================
--- BufferView_pimpl.C  (revision 14429)
+++ BufferView_pimpl.C  (working copy)
@@ -108,6 +108,7 @@
 
 unsigned int const saved_positions_num = 20;
 
+
 /// Return an inset of this class if it exists at the current cursor position
 template <class T>
 T * getInsetByCode(LCursor & cur, InsetBase::Code code)
@@ -187,7 +188,7 @@
 
        closingConnection_ =
                buf.closing.connect(
-                       boost::bind(&BufferView::Pimpl::setBuffer, this, 
(Buffer *)0));
+                       boost::bind(&LyXView::setBuffer, owner_, (Buffer *)0));
 }
 
 
@@ -203,13 +204,6 @@
 }
 
 
-void BufferView::Pimpl::newFile(string const & filename, string const & tname,
-       bool isNamed)
-{
-       setBuffer(::newFile(filename, tname, isNamed));
-}
-
-
 bool BufferView::Pimpl::loadLyXFile(string const & filename, bool tolastfiles)
 {
        // Get absolute path of file and add ".lyx"
@@ -257,7 +251,7 @@
                         text, 0, 1, _("&Create"), _("Cancel"));
 
                if (ret == 0)
-                       b = ::newFile(s, string(), true);
+                       b = newFile(s, string(), true);
                else
                        return false;
        }
@@ -376,11 +370,15 @@
        }
 
        update();
-       owner_->updateMenubar();
-       owner_->updateToolbars();
-       owner_->updateLayoutChoice();
-       owner_->updateWindowTitle();
 
+       if (buffer_ && lyx::graphics::Previews::status() != LyXRC::PREVIEW_OFF)
+               lyx::graphics::Previews::get().generateBufferPreviews(*buffer_);
+}
+
+string BufferView::Pimpl::firstLayout()
+{
+       string firstlayout;
+
        // This is done after the layout combox has been populated
        if (buffer_) {
                size_t i = cursor_.depth() - 1;
@@ -389,16 +387,14 @@
                        CursorSlice const & slice = cursor_[i];
                        if (!slice.inset().inMathed()) {
                                LyXLayout_ptr const layout = 
slice.paragraph().layout();
-                               owner_->setLayout(layout->name());
+                               firstlayout = layout->name();
                                break;
                        }
                        BOOST_ASSERT(i>0);
                        --i;
                }
        }
-
-       if (buffer_ && lyx::graphics::Previews::status() != LyXRC::PREVIEW_OFF)
-               lyx::graphics::Previews::get().generateBufferPreviews(*buffer_);
+       return firstlayout;
 }
 
 
@@ -555,7 +551,7 @@
 //     scrollDocView(new_top_y);
 //
 //     // Update the scrollbar.
-//     workArea_->setScrollbarParams(t->height(), top_y(), defaultRowHeight());
+//     workArea_->setScrollbarParams(t->height(), top_y(), 
defaultRowHeight());}
 }
 
 
@@ -669,30 +665,32 @@
        }
 
        // Check needed to survive LyX startup
-       if (buffer_) {
-               // Update macro store
-               buffer_->buildMacros();
+       if (!buffer_)
+               return;
+       
+       // Check if there is already a redraw waiting in the queue.
+       if (needs_redraw_)
+               return;
 
-               // First drawing step
-               bool singlePar = flags & Update::SinglePar;
-               needs_redraw_ = flags & (Update::Force | Update::SinglePar);
+       // Update macro store
+       buffer_->buildMacros();
 
-               updateMetrics(singlePar);
+       // First drawing step
+       bool singlePar = flags & Update::SinglePar;
+       needs_redraw_ = (flags & (Update::Force | Update::SinglePar));
 
-               if ((flags & (Update::FitCursor | Update::MultiParSel))
-                   && (fitCursor() || multiParSel())) {
+       updateMetrics(singlePar);
+
+       if ((flags & (Update::FitCursor | Update::MultiParSel))
+               && (fitCursor() || multiParSel())) {
                        needs_redraw_ = true;
                        singlePar = false;
-               }
-
-               if (needs_redraw_) {
-                       // Second drawing step
-                       updateMetrics(singlePar);
-               }
        }
 
-       owner_->redrawWorkArea();
-       owner_->view_state_changed();
+       if (needs_redraw_) {
+               // Second drawing step
+               updateMetrics(singlePar);
+       }
 }
 
 
@@ -825,7 +823,7 @@
                string initpath = lyxrc.document_path;
 
                if (available()) {
-                       string const trypath = owner_->buffer()->filePath();
+                       string const trypath = buffer_->filePath();
                        // If directory is writeable, use this as default.
                        if (isDirWriteable(trypath))
                                initpath = trypath;
Index: BufferView_pimpl.h
===================================================================
--- BufferView_pimpl.h  (revision 14429)
+++ BufferView_pimpl.h  (working copy)
@@ -34,7 +34,6 @@
 
 class FuncRequest;
 class FuncStatus;
-class ViewMetricsInfo;
 
 namespace lyx {
 namespace frontend {
@@ -50,6 +49,8 @@
        Pimpl(BufferView & bv, LyXView * owner);
        ///
        void setBuffer(Buffer * buf);
+       /// return the first layout of the Buffer.
+       std::string firstLayout();
        ///
        void resizeCurrentBuffer();
        //
@@ -58,9 +59,7 @@
        bool multiParSel();
        ///
        void update(Update::flags flags = Update::Force);
-       ///
-       void newFile(std::string const &, std::string const &, bool);
-       ///
+       /// load a buffer into the view
        bool loadLyXFile(std::string const &, bool);
        ///
        void workAreaResize(int width, int height);
@@ -163,16 +162,15 @@
        /// notify readonly status
        void showReadonly(bool);
 
-
        ///
-       friend class BufferView;
-
-       ///
        ViewMetricsInfo metrics_info_;
        ///
        void updateMetrics(bool singlepar = false);
 
        ///
+       friend class BufferView;
+
+       ///
        BufferView * bv_;
        ///
        LyXView * owner_;
@@ -215,5 +213,6 @@
        lyx::pit_type anchor_ref_;
        ///
        int offset_ref_;
+
 };
 #endif // BUFFERVIEW_PIMPL_H
Index: client/lyxclient.man
===================================================================
--- client/lyxclient.man        (revision 14429)
+++ client/lyxclient.man        (working copy)
@@ -40,8 +40,8 @@
 if LyX is configured to use a temporary directory other than /tmp, you must
 inform \fBlyxclient\fR of this.
 .PP
-If neither \fB\-a\fR nor \fB\-p\fR are invoked, \fBlyxclient\fR will search for
-sockets in /tmp (or \fItmp_dir\fR if the \fB\-t\fR option is used) and use
+If neither \fB-a\fR nor \fB-p\fR are invoked, \fBlyxclient\fR will search for
+sockets in /tmp (or \fItmp_dir\fR if the \fB-t\fR option is used) and use
 the first socket to which it can connect.
 This is safe if you are running only one LyX process at any one time.
 .SH COMMAND MODE OPTIONS
@@ -53,9 +53,9 @@
 send a single \fIcommand\fR, print LyX information to standard output and exit.
 .TP
 .BI \-g " file line"
-this is simply a wrapper for the command 'server\-goto\-file\-row \fIfile\fR 
\fIline\fR'. It is used by the DVI previewer to elicit inverse DVI search.
+this is simply a wrapper for the command 'server-goto-file-row \fIfile\fR 
\fIline\fR'. It is used by the DVI previewer to elicit inverse DVI search.
 .PP
-If neither \fB\-c\fR nor \fB\-g\fR are used, \fBlyxclient\fR will regard any
+If neither \fB-c\fR nor \fB-g\fR are used, \fBlyxclient\fR will regard any
 standard input as commands to be sent to LyX, printing LyX's responses to
 standard output. Commands are
 separated by newlines (the '\\n' character). To finish communication
@@ -75,7 +75,7 @@
 .B LYXSOCKET
 can be used to specify the socket special file that must be used.
 LyX sets this variable.
-It is overridden by the \fB\-a\fR option.
+It is overridden by the \fB-a\fR option.
 .SH SEE ALSO
 lyx(1), xdvi(1), lyx functions <fixme>.
 .SH AUTHORS
Index: coordcache.h
===================================================================
--- coordcache.h        (revision 14429)
+++ coordcache.h        (working copy)
@@ -108,6 +108,7 @@
  */
 class CoordCache {
 public:
+       ///
        void clear();
        Point get(LyXText const *, lyx::pit_type);
 
Index: frontends/controllers/Makefile.am
===================================================================
--- frontends/controllers/Makefile.am   (revision 14429)
+++ frontends/controllers/Makefile.am   (working copy)
@@ -71,6 +71,8 @@
        ControlNote.h \
        ControlParagraph.C \
        ControlParagraph.h \
+       ControlPreamble.C \
+       ControlPreamble.h \
        ControlPrefs.C \
        ControlPrefs.h \
        ControlPrint.C \
Index: frontends/gtk/Dialogs.C
===================================================================
--- frontends/gtk/Dialogs.C     (revision 14429)
+++ frontends/gtk/Dialogs.C     (working copy)
@@ -1,5 +1,5 @@
 /**
-// * \file gtk/Dialogs.C
+// * \file xforms/Dialogs.C
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
Index: frontends/gtk/GCharacter.h
===================================================================
--- frontends/gtk/GCharacter.h  (revision 14429)
+++ frontends/gtk/GCharacter.h  (working copy)
@@ -5,7 +5,7 @@
  * Licence details can be found in the file COPYING.
  *
  * \author John Spray
- * Based on version from former xforms frontend
+ * Based on version from xforms frontend
  *
  * Full author contact details are available in file CREDITS.
  */
Index: frontends/gtk/GDocument.C
===================================================================
--- frontends/gtk/GDocument.C   (revision 14429)
+++ frontends/gtk/GDocument.C   (working copy)
@@ -793,7 +793,7 @@
                        newbranch->setSelected((*row)[branchColActivated_]);
                        Glib::ustring const color = (*row)[branchColColor_];
                        // FIXME: The color should be editable via a color
-                       // chooser, not a text field (see qt frontends)
+                       // chooser, not a text field (see qt/xforms frontends)
                        // setColor will silently ignore an invalid color and
                        // use the normal background color for now.
                        newbranch->setColor(color);
Index: frontends/gtk/GView.C
===================================================================
--- frontends/gtk/GView.C       (revision 14429)
+++ frontends/gtk/GView.C       (working copy)
@@ -98,7 +98,6 @@
 
        focus_command_buffer.connect(
                boost::bind(&GMiniBuffer::editMode, minibuffer_.get()));
-       view_state_changed.connect(boost::bind(&GView::showViewState, this));
        signal_focus_in_event().connect(sigc::mem_fun(*this, 
&GView::onFocusIn));
        //
        int width = 750;
@@ -177,7 +176,7 @@
 }
 
 
-void GView::showViewState()
+void GView::updateStatusBar()
 {
        message(getLyXFunc().viewStatusMessage());
 }
Index: frontends/gtk/GView.h
===================================================================
--- frontends/gtk/GView.h       (revision 14429)
+++ frontends/gtk/GView.h       (working copy)
@@ -55,9 +55,10 @@
 
        // returns true if this view has the focus.
        virtual bool hasFocus() const;
+       ///
+       void updateStatusBar();
 
 private:
-       void showViewState();
        bool onFocusIn(GdkEventFocus * event);
        virtual void setWindowTitle(std::string const & t, std::string const & 
it);
 
Index: frontends/gtk/lyx_gui.C
===================================================================
--- frontends/gtk/lyx_gui.C     (revision 14429)
+++ frontends/gtk/lyx_gui.C     (working copy)
@@ -160,7 +160,7 @@
                          os::internal_path(package().temp_dir() + 
"/lyxsocket"));
 
        for_each(files.begin(), files.end(),
-                bind(&BufferView::loadLyXFile, view.view(), _1, true));
+                bind(&LyXView::loadLyXFile, &view, _1, true));
 
        // handle the batch commands the user asked for
        if (!batch.empty()) {
Index: frontends/Gui.h
===================================================================
--- frontends/Gui.h     (revision 14429)
+++ frontends/Gui.h     (working copy)
@@ -18,6 +18,7 @@
 
 #include <map>
 
+class BufferView;
 class LyXView;
 class BufferView;
 
Index: frontends/LyXView.C
===================================================================
--- frontends/LyXView.C (revision 14429)
+++ frontends/LyXView.C (working copy)
@@ -80,7 +80,6 @@
        lyxerr[Debug::INIT] << "Initializing LyXFunc" << endl;
 }
 
-
 LyXView::~LyXView()
 {
 }
@@ -95,9 +94,16 @@
 void LyXView::redrawWorkArea()
 {
        work_area_->redraw();
+       updateStatusBar();
 }
 
 
+WorkArea * LyXView::workArea()
+{
+       return work_area_;
+}
+
+
 void LyXView::init()
 {
        updateLayoutChoice();
@@ -120,6 +126,32 @@
 }
 
 
+void LyXView::setBuffer(Buffer * b)
+{
+       work_area_->bufferView().setBuffer(b);
+       updateMenubar();
+       updateToolbars();
+       updateLayoutChoice();
+       updateWindowTitle();
+       if (b)
+               setLayout(work_area_->bufferView().firstLayout());
+       redrawWorkArea();
+}
+
+
+bool LyXView::loadLyXFile(string const & filename, bool tolastfiles)
+{
+       bool loaded = work_area_->bufferView().loadLyXFile(filename, 
tolastfiles);
+       updateMenubar();
+       updateToolbars();
+       updateLayoutChoice();
+       updateWindowTitle();
+       if (loaded)
+               setLayout(work_area_->bufferView().firstLayout());
+       redrawWorkArea();
+       return loaded;
+}
+
 BufferView * LyXView::view() const
 {
        return &work_area_->bufferView();
Index: frontends/LyXView.h
===================================================================
--- frontends/LyXView.h (revision 14429)
+++ frontends/LyXView.h (working copy)
@@ -62,6 +62,7 @@
        virtual ~LyXView();
 
        void setWorkArea(lyx::frontend::WorkArea * work_area);
+
        /**
         * This is called after the concrete view has been created.
         * We have to have the toolbar and the other stuff created
@@ -110,6 +111,12 @@
 
        //@}
 
+       /// load a buffer into the current workarea
+       bool loadLyXFile(std::string const &  name, bool tolastfiles = true);
+
+       /// set a buffer to the current workarea
+       void setBuffer(Buffer * b);
+
        /// sets the layout in the toolbar layout selection
        void setLayout(std::string const & layout);
        /// updates the possible layouts selectable
@@ -119,13 +126,12 @@
        void updateToolbars();
        /// update the menubar
        void updateMenubar();
+       /// update the status bar
+       virtual void updateStatusBar() = 0;
 
        /// focus the command buffer (minibuffer)
        boost::signal<void()> focus_command_buffer;
 
-       /// view state string changed
-       boost::signal<void()> view_state_changed;
-
        /// display a message in the view
        virtual void message(std::string const &) = 0;
 
@@ -152,10 +158,13 @@
        ///
        virtual lyx::frontend::Gui & gui();
 
-       lyx::frontend::WorkArea * workArea() const { return work_area_; }
-
        /// Temporary method used by the kernel to redraw the work area.
        virtual void redrawWorkArea();
+
+       /// Temporary method to access the current workArea.
+       /// This is needed for the qt3 and gtk frontend.
+       lyx::frontend::WorkArea * workArea();
+
 protected:
        /// current work area (screen view of a BufferView).
        /**
Index: frontends/qt3/lyx_gui.C
===================================================================
--- frontends/qt3/lyx_gui.C     (revision 14429)
+++ frontends/qt3/lyx_gui.C     (working copy)
@@ -265,7 +265,7 @@
                          os::internal_path(package().temp_dir() + 
"/lyxsocket"));
 
        for_each(files.begin(), files.end(),
-                bind(&BufferView::loadLyXFile, view.view(), _1, true));
+                bind(&LyXView::loadLyXFile, &view, _1, true));
 
        // handle the batch commands the user asked for
        if (!batch.empty()) {
Index: frontends/qt3/QtView.C
===================================================================
--- frontends/qt3/QtView.C      (revision 14429)
+++ frontends/qt3/QtView.C      (working copy)
@@ -81,7 +81,6 @@
 
        statusBar()->setSizeGripEnabled(false);
 
-       view_state_changed.connect(boost::bind(&QtView::update_view_state, 
this));
        connect(&statusbar_timer_, SIGNAL(timeout()), this, 
SLOT(update_view_state_qt()));
 
        // make sure the buttons are disabled if needed
@@ -137,7 +136,7 @@
 }
 
 
-void QtView::update_view_state()
+void QtView::updateStatusBar()
 {
        // let the user see the explicit message
        if (statusbar_timer_.isActive())
Index: frontends/qt3/QtView.h
===================================================================
--- frontends/qt3/QtView.h      (revision 14429)
+++ frontends/qt3/QtView.h      (working copy)
@@ -80,13 +80,12 @@
 protected:
        /// make sure we quit cleanly
        virtual void closeEvent(QCloseEvent * e);
+       /// update status bar
+       void updateStatusBar();
 private:
        /// focus the command buffer widget
        void focus_command_widget();
 
-       /// update status bar
-       void update_view_state();
-
        /**
         * setWindowTitle - set title of window
         * @param t main window title
Index: frontends/qt4/GuiImplementation.C
===================================================================
--- frontends/qt4/GuiImplementation.C   (revision 14429)
+++ frontends/qt4/GuiImplementation.C   (working copy)
@@ -16,6 +16,8 @@
 // of boost/Qt/LyX clash...
 #include "GuiView.h"
 
+// This include must be declared before everything else because
+// of boost/Qt/LyX clash...
 #include "GuiImplementation.h"
 #include "GuiWorkArea.h"
 
Index: frontends/qt4/GuiView.C
===================================================================
--- frontends/qt4/GuiView.C     (revision 14429)
+++ frontends/qt4/GuiView.C     (working copy)
@@ -27,14 +27,16 @@
 #include "debug.h"
 
 #include "frontends/Toolbars.h"
-
+#include "frontends/WorkArea.h"
 #include "support/filetools.h"
-
 #include "support/convert.h"
-#include <boost/bind.hpp>
+#include "support/lstrings.h"
 
+// This include must be declared before everything else because
+// of boost/Qt/LyX clash...
+#include "GuiImplementation.h"
+
 #include "GuiView.h"
-#include "GuiImplementation.h"
 #include "QLMenubar.h"
 #include "FontLoader.h"
 #include "QCommandBuffer.h"
@@ -46,12 +48,11 @@
 #include <QToolBar>
 #include <QCloseEvent>
 #include <QAction>
-//#include <QMenu>
-//#include <QMenuBar>
 
-#include "support/lstrings.h"
 
+#include <boost/bind.hpp>
 
+
 using std::string;
 using std::endl;
 
@@ -103,7 +104,6 @@
 
        statusBar()->setSizeGripEnabled(false);
 
-       view_state_changed.connect(boost::bind(&GuiView::update_view_state, 
this));
        QObject::connect(&statusbar_timer_, SIGNAL(timeout()), this, 
SLOT(update_view_state_qt()));
 
        // make sure the buttons are disabled if needed
@@ -161,7 +161,7 @@
 }
 
 
-void GuiView::update_view_state()
+void GuiView::updateStatusBar()
 {
        // let the user see the explicit message
        if (statusbar_timer_.isActive())
Index: frontends/qt4/GuiView.h
===================================================================
--- frontends/qt4/GuiView.h     (revision 14429)
+++ frontends/qt4/GuiView.h     (working copy)
@@ -66,6 +66,9 @@
        /// clear status message
        virtual void clearMessage();
 
+       /// update the status bar
+       virtual void updateStatusBar();
+
        /// add the command buffer
        void addCommandBuffer(QToolBar * toolbar);
 
@@ -99,9 +102,6 @@
        /// focus the command buffer widget
        void focus_command_widget();
 
-       /// update status bar
-       void update_view_state();
-
        /**
         * setWindowTitle - set title of window
         * @param t main window title
Index: frontends/qt4/GuiWorkArea.C
===================================================================
--- frontends/qt4/GuiWorkArea.C (revision 14429)
+++ frontends/qt4/GuiWorkArea.C (working copy)
@@ -11,13 +11,9 @@
 
 #include <config.h>
 
-#include <boost/current_function.hpp>
 
-// This include must be declared before everything else because
-// of boost/Qt/LyX clash...
-#include "GuiView.h"
-
 #include "GuiWorkArea.h"
+
 #include "QLPainter.h"
 #include "QLyXKeySym.h"
 
@@ -40,6 +36,7 @@
 #include <QScrollBar>
 
 #include <boost/bind.hpp>
+#include <boost/current_function.hpp>
 
 // Abdel (26/06/2006):
 // On windows-XP the UserGuide PageDown scroll test is faster without event 
pruning (16 s)
@@ -208,6 +205,7 @@
                << endl;
        */
        buffer_view_->scrollDocView(verticalScrollBar()->sliderPosition());
+       redraw();
 }
 
 
@@ -231,7 +229,7 @@
        for (int i = 0; i!=files.size(); ++i) {
                string const file = 
os::internal_path(fromqstr(files.at(i).toString()));
                if (!file.empty())
-                       
buffer_view_->workAreaDispatch(FuncRequest(LFUN_FILE_OPEN, file));
+                       dispatch(FuncRequest(LFUN_FILE_OPEN, file));
        }
 }
 
@@ -243,13 +241,13 @@
                FuncRequest cmd(LFUN_MOUSE_TRIPLE,
                        dc_event_.x, dc_event_.y,
                        q_button_state(dc_event_.state));
-               buffer_view_->workAreaDispatch(cmd);
+               dispatch(cmd);
                return;
        }
 
        FuncRequest const cmd(LFUN_MOUSE_PRESS, e->x(), e->y(),
                              q_button_state(e->button()));
-       buffer_view_->workAreaDispatch(cmd);
+       dispatch(cmd);
 }
 
 
@@ -260,7 +258,7 @@
 
        FuncRequest const cmd(LFUN_MOUSE_RELEASE, e->x(), e->y(),
                              q_button_state(e->button()));
-       buffer_view_->workAreaDispatch(cmd);
+       dispatch(cmd);
 }
 
 
@@ -320,7 +318,7 @@
                synthetic_mouse_event_.scrollbar_value_old = scrollbar_value;
 
                // ... and dispatch the event to the LyX core.
-               buffer_view_->workAreaDispatch(cmd);
+               dispatch(cmd);
        }
 }
 
@@ -350,7 +348,7 @@
                synthetic_mouse_event_.scrollbar_value_old = scrollbar_value;
 
                // ... and dispatch the event to the LyX core.
-               buffer_view_->workAreaDispatch(synthetic_mouse_event_.cmd);
+               dispatch(synthetic_mouse_event_.cmd);
        }
 }
 
@@ -423,7 +421,7 @@
        FuncRequest cmd(LFUN_MOUSE_DOUBLE,
                dc_event_.x, dc_event_.y,
                q_button_state(dc_event_.state));
-       buffer_view_->workAreaDispatch(cmd);
+       dispatch(cmd);
 }
 
 
@@ -438,7 +436,7 @@
 //     paint_device_ = QImage(viewport()->width(), viewport()->height(), 
QImage::Format_RGB32);
        paint_device_ = QPixmap(viewport()->width(), viewport()->height());
 
-       buffer_view_->workAreaResize(viewport()->width(), viewport()->height());
+       resizeBufferView();
 
        /*
        lyxerr[Debug::GUI] << BOOST_CURRENT_FUNCTION
@@ -479,6 +477,7 @@
                << "\n QPaintEvent h\t" << e->rect().height()
                << endl;
        */
+
        QPainter q(viewport());
        q.drawPixmap(e->rect(), paint_device_, e->rect());
 
Index: frontends/qt4/lyx_gui.C
===================================================================
--- frontends/qt4/lyx_gui.C     (revision 14429)
+++ frontends/qt4/lyx_gui.C     (working copy)
@@ -29,6 +29,7 @@
 #include "lyxserver.h"
 #include "lyxsocket.h"
 
+
 #include "graphics/LoaderQueue.h"
 
 #include "support/lstrings.h"
@@ -36,8 +37,6 @@
 #include "support/package.h"
 #include "debug.h"
 
-#include <boost/bind.hpp>
-#include <boost/shared_ptr.hpp>
 
 #include "GuiView.h"
 #include "ColorCache.h"
@@ -54,6 +53,8 @@
 #include <QLocale>
 #include <QLibraryInfo>
 
+#include <boost/bind.hpp>
+#include <boost/shared_ptr.hpp>
 
 
 using lyx::support::ltrim;
@@ -239,7 +240,7 @@
                          os::internal_path(package().temp_dir() + 
"/lyxsocket"));
 
        for_each(files.begin(), files.end(),
-                bind(&BufferView::loadLyXFile, view.view(), _1, true));
+                bind(&LyXView::loadLyXFile, &view, _1, true));
 
        // handle the batch commands the user asked for
        if (!batch.empty()) {
Index: frontends/qt4/qfont_metrics.C
===================================================================
--- frontends/qt4/qfont_metrics.C       (revision 14429)
+++ frontends/qt4/qfont_metrics.C       (working copy)
@@ -14,8 +14,8 @@
 #include "frontends/font_metrics.h"
 #include "frontends/lyx_gui.h"
 
+#include "Application.h"
 #include "FontLoader.h"
-#include "Application.h"
 
 #include "language.h"
 
Index: frontends/WorkArea.C
===================================================================
--- frontends/WorkArea.C        (revision 14429)
+++ frontends/WorkArea.C        (working copy)
@@ -44,6 +44,7 @@
 
 #include <boost/utility.hpp>
 #include <boost/bind.hpp>
+#include <boost/current_function.hpp>
 #include <boost/signals/trackable.hpp>
 
 using lyx::support::libFileSearch;
@@ -55,20 +56,12 @@
 using std::string;
 
 
-namespace {
-
-// All the below connection objects are needed because of a bug in some
-// versions of GCC (<=2.96 are on the suspects list.) By having and assigning
-// to these connections we avoid a segfault upon startup, and also at exit.
-// (Lgb)
-
-boost::signals::connection timecon;
-
-} // anon namespace
-
 namespace lyx {
 namespace frontend {
 
+// FIXME: The SplashScreen should be transfered to the
+// LyXView and create a WorkArea only when a new buffer exists. This
+// will allow to call WorkArea::redraw() in the constructor.
 class SplashScreen : boost::noncopyable, boost::signals::trackable {
 public:
        /// This is a singleton class. Get the instance.
@@ -131,9 +124,20 @@
        loader_.reset(file);
 }
 
+namespace {
+
+// All the below connection objects are needed because of a bug in some
+// versions of GCC (<=2.96 are on the suspects list.) By having and assigning
+// to these connections we avoid a segfault upon startup, and also at exit.
+// (Lgb)
+
+boost::signals::connection timecon;
+
+} // anon namespace
+
 WorkArea::WorkArea(BufferView * buffer_view)
-       : buffer_view_(buffer_view), greyed_out_(true),
-         cursor_visible_(false), cursor_timeout_(400)
+       :  buffer_view_(buffer_view), greyed_out_(true),
+       cursor_visible_(false), cursor_timeout(400)
 {
        // Start loading the pixmap as soon as possible
        if (lyxrc.show_banner) {
@@ -143,10 +147,10 @@
        }
 
        // Setup the signals
-       timecon = cursor_timeout_.timeout
+       timecon = cursor_timeout.timeout
                .connect(boost::bind(&WorkArea::toggleCursor, this));
 
-       cursor_timeout_.start();
+       cursor_timeout.start();
 }
 
 
@@ -177,7 +181,8 @@
 
 void WorkArea::redraw()
 {
-       BOOST_ASSERT(buffer_view_);
+       if (!buffer_view_)
+               return;
 
        if (!buffer_view_->buffer()) {
                greyOut();
@@ -187,35 +192,30 @@
        if (!buffer_view_->needsRedraw())
                return;
 
+       ViewMetricsInfo const & vi = buffer_view_->viewMetricsInfo();
        greyed_out_ = false;
-       ViewMetricsInfo const & vi = buffer_view_->viewMetricsInfo();
-
-       Painter & pain = getPainter();
-
-       pain.start();
-       paintText(*buffer_view_, vi, pain);
+       getPainter().start();
+       paintText(*buffer_view_, vi, getPainter());
        lyxerr[Debug::DEBUG] << "Redraw screen" << endl;
        int const ymin = std::max(vi.y1, 0);
        int const ymax =
                ( vi.p2 < vi.size - 1 ?  vi.y2 : height() );
        expose(0, ymin, width(), ymax - ymin);
-       pain.end();
-       //theCoords.doneUpdating();
+       getPainter().end();
        buffer_view_->needsRedraw(false);
 
-       if (lyxerr.debugging(Debug::DEBUG)) {
-               lyxerr[Debug::DEBUG]
-                       << "  ymin = " << ymin << "  width() = " << width()
-                       << "  ymax-ymin = " << ymax-ymin << std::endl;
-       }
+       lyxerr[Debug::DEBUG]
+       << "  ymin = " << ymin << "  width() = " << width()
+               << "  ymax-ymin = " << ymax-ymin << std::endl;
 }
 
 
-void WorkArea::processKeySym(LyXKeySymPtr key, key_modifier::state state)
+void WorkArea::processKeySym(LyXKeySymPtr key,
+                                                        key_modifier::state 
state)
 {
        hideCursor();
+       buffer_view_->workAreaKeyPress(key, state);
 
-       buffer_view_->workAreaKeyPress(key, state);
        /* This is perhaps a bit of a hack. When we move
         * around, or type, it's nice to be able to see
         * the cursor immediately after the keypress. So
@@ -223,12 +223,26 @@
         * of the cursor. Note we cannot do this inside
         * dispatch() itself, because that's called recursively.
         */
-       //     if (buffer_view_->available())
+//     if (buffer_view_->available())
        toggleCursor();
+       redraw();
+}
 
+
+void WorkArea::dispatch(FuncRequest const & cmd0)
+{
+       buffer_view_->workAreaDispatch(cmd0);
+       redraw();
 }
 
 
+void WorkArea::resizeBufferView()
+{
+       buffer_view_->workAreaResize(width(), height());
+       redraw();
+}
+
+
 void WorkArea::greyOut()
 {
        greyed_out_ = true;
@@ -331,9 +345,8 @@
                fcc.handleCompletedProcesses();
        }
 
-       cursor_timeout_.restart();
+       cursor_timeout.restart();
 }
 
-
 } // namespace frontend
 } // namespace lyx
Index: frontends/WorkArea.h
===================================================================
--- frontends/WorkArea.h        (revision 14429)
+++ frontends/WorkArea.h        (working copy)
@@ -11,6 +11,14 @@
  * Full author contact details are available in file CREDITS.
  */
 
+#ifndef BASE_WORKAREA_H
+#define BASE_WORKAREA_H
+
+#include "frontends/key_state.h"
+#include "frontends/LyXKeySym.h"
+#include "frontends/Timeout.h"
+
+
 // X11 use a define called CursorShape, and we really want to use
 // that name our selves. Therefore we do something similar to what is done
 // in kde/fixx11h.h:
@@ -27,14 +35,8 @@
 } // namespace X
 
 
-#ifndef BASE_WORKAREA_H
-#define BASE_WORKAREA_H
-
-#include "frontends/key_state.h"
-#include "frontends/LyXKeySym.h"
-#include "frontends/Timeout.h"
-
 class BufferView;
+class FuncRequest;
 
 namespace lyx {
 namespace frontend {
@@ -51,7 +53,6 @@
        REVERSED_L_SHAPE
 };
 
-
 /**
  * The work area class represents the widget that provides the
  * view onto a document. It is owned by the BufferView, and
@@ -72,6 +73,7 @@
        ///
        BufferView const & bufferView() const;
 
+
        /// return the painter object for this work area
        virtual Painter & getPainter() = 0;
 
@@ -92,29 +94,39 @@
        /// redraw the screen, without using existing pixmap
        virtual void redraw();
 
-       ///
-       void processKeySym(LyXKeySymPtr key, key_modifier::state state);
-
        /// grey out (no buffer)
        void greyOut();
 
-       /// paint the cursor and store the background
-       virtual void showCursor(int x, int y, int h, CursorShape shape) = 0;
+       /// FIXME: should be protected, public until the qt3 and gtk frontends 
are
+       /// cleaned up.
+       void processKeySym(LyXKeySymPtr key, key_modifier::state state);
 
-       /// hide the cursor
-       virtual void removeCursor() = 0;
+protected:
+       /// cause the display of the given area of the work area
+       virtual void expose(int x, int y, int w, int h) = 0;
 
-       /// Show the cursor
+       ///
+       void dispatch(FuncRequest const & cmd0);
+
+       ///
+       void resizeBufferView();
+
+
+       /// hide the visible cursor, if it is visible
+       void hideCursor();
+
+       /// show the cursor if it is not visible
        void showCursor();
-       /// Hide the cursor
-       void hideCursor();
+
        /// toggle the cursor's visibility
        void toggleCursor();
 
-protected:
-       /// cause the display of the given area of the work area
-       virtual void expose(int x, int y, int w, int h) = 0;
+       /// hide the cursor
+       virtual void removeCursor() = 0;
 
+       /// paint the cursor and store the background
+       virtual void showCursor(int x, int y, int h, CursorShape shape) = 0;
+
        ///
        BufferView * buffer_view_;
 
@@ -125,11 +137,11 @@
        ///
        bool greyed_out_;
 
-       ///
+       /// is the cursor currently displayed
        bool cursor_visible_;
 
        ///
-       Timeout cursor_timeout_;
+       Timeout cursor_timeout;
 };
 
 } // namespace frontend
Index: importer.C
===================================================================
--- importer.C  (revision 14429)
+++ importer.C  (working copy)
@@ -24,6 +24,7 @@
 #include "frontends/Alert.h"
 #include "gettext.h"
 #include "BufferView.h"
+#include "buffer_funcs.h"
 
 using lyx::support::bformat;
 using lyx::support::changeExtension;
@@ -69,9 +70,9 @@
 
 
        if (loader_format == "lyx") {
-               lv->view()->loadLyXFile(lyxfile);
+               lv->loadLyXFile(lyxfile);
        } else {
-               lv->view()->newFile(lyxfile, string(), true);
+               lv->setBuffer(newFile(lyxfile, string(), true));
                bool as_paragraphs = loader_format == "textparagraph";
                string filename2 = (loader_format == format) ? filename
                        : changeExtension(filename,
Index: insets/insettabular.C
===================================================================
--- insets/insettabular.C       (revision 14429)
+++ insets/insettabular.C       (working copy)
@@ -603,7 +603,7 @@
 //             //if (hasSelection())
 //             //      cur.selection() = false;
 //             col_type const col = tabular.column_of_cell(cur.idx());
-//             int const t =   cur.bv().top_y() + 
cur.bv().painter().paperHeight();
+//             int const t =   cur.bv().top_y() + cur.bv().height();
 //             if (t < yo() + tabular.getHeightOfTabular()) {
 //                     cur.bv().scrollDocView(t);
 //                     cur.idx() = tabular.getCellBelow(first_visible_cell) + 
col;
@@ -619,7 +619,7 @@
 //             //if (hasSelection())
 //             //      cur.selection() = false;
 //             col_type const col = tabular.column_of_cell(cur.idx());
-//             int const t =   cur.bv().top_y() + 
cur.bv().painter().paperHeight();
+//             int const t =   cur.bv().top_y() + cur.bv().height();
 //             if (yo() < 0) {
 //                     cur.bv().scrollDocView(t);
 //                     if (yo() > 0)
Index: insets/insettabular.h
===================================================================
--- insets/insettabular.h       (revision 14429)
+++ insets/insettabular.h       (working copy)
@@ -74,8 +74,6 @@
        ///
        bool insetAllowed(InsetBase::Code) const { return true; }
        ///
-       bool allowSpellCheck() const { return true; }
-       ///
        bool canTrackChanges() const { return true; }
        /** returns true if, when outputing LaTeX, font changes should
            be closed before generating this inset. This is needed for
Index: lyx_cb.C
===================================================================
--- lyx_cb.C    (revision 14429)
+++ lyx_cb.C    (working copy)
@@ -19,6 +19,7 @@
 #include "buffer.h"
 #include "bufferlist.h"
 #include "BufferView.h"
+#include "buffer_funcs.h"
 #include "cursor.h"
 #include "debug.h"
 #include "gettext.h"
@@ -342,7 +343,7 @@
                            << "\nName is " << name
                            << "\nTemplate is " << tmpname << endl;
 
-       bv->newFile(name, tmpname);
+       bv->setBuffer(newFile(name, tmpname));
 }
 
 
Index: lyxfunc.C
===================================================================
--- lyxfunc.C   (revision 14429)
+++ lyxfunc.C   (working copy)
@@ -1042,7 +1042,7 @@
                        }
                        owner->message(bformat(_("Opening help file %1$s..."),
                                makeDisplayPath(fname)));
-                       view()->loadLyXFile(fname, false);
+                       owner->loadLyXFile(fname, false);
                        break;
                }
 
@@ -1088,15 +1088,15 @@
 
                // --- buffers ----------------------------------------
                case LFUN_BUFFER_SWITCH:
-                       view()->setBuffer(bufferlist.getBuffer(argument));
+                       owner->setBuffer(bufferlist.getBuffer(argument));
                        break;
 
                case LFUN_BUFFER_NEXT:
-                       view()->setBuffer(bufferlist.next(view()->buffer()));
+                       owner->setBuffer(bufferlist.next(view()->buffer()));
                        break;
 
                case LFUN_BUFFER_PREVIOUS:
-                       
view()->setBuffer(bufferlist.previous(view()->buffer()));
+                       owner->setBuffer(bufferlist.previous(view()->buffer()));
                        break;
 
                case LFUN_FILE_NEW:
@@ -1136,16 +1136,16 @@
                        if (prefixIs(file_name, package().temp_dir())) {
                                // Needed by inverse dvi search. If it is a file
                                // in tmpdir, call the apropriated function
-                               
view()->setBuffer(bufferlist.getBufferFromTmp(file_name));
+                               
owner->setBuffer(bufferlist.getBufferFromTmp(file_name));
                        } else {
                                // Must replace extension of the file to be .lyx
                                // and get full path
                                string const s = changeExtension(file_name, 
".lyx");
                                // Either change buffer or load the file
                                if (bufferlist.exists(s)) {
-                                       
view()->setBuffer(bufferlist.getBuffer(s));
+                                       
owner->setBuffer(bufferlist.getBuffer(s));
                                } else {
-                                       view()->loadLyXFile(s);
+                                       owner->loadLyXFile(s);
                                }
                        }
 
@@ -1296,9 +1296,9 @@
                        view()->savePosition(0);
                        string const parentfilename = 
owner->buffer()->fileName();
                        if (bufferlist.exists(filename))
-                               
view()->setBuffer(bufferlist.getBuffer(filename));
+                               
owner->setBuffer(bufferlist.getBuffer(filename));
                        else
-                               view()->loadLyXFile(filename);
+                               owner->loadLyXFile(filename);
                        // Set the parent name of the child document.
                        // This makes insertion of citations and references in 
the child work,
                        // when the target is in the parent or another child 
document.
@@ -1607,6 +1607,8 @@
                        else if (update)
                                view()->update(Update::FitCursor);
 
+                       owner->redrawWorkArea();
+
                        // if we executed a mutating lfun, mark the buffer as 
dirty
                        if (flag.enabled()
                            && !lyxaction.funcHasFlag(cmd.action, 
LyXAction::NoBuffer)
@@ -1733,7 +1735,7 @@
                templname = result.second;
        }
 
-       view()->newFile(filename, templname, !name.empty());
+       owner->setBuffer(newFile(filename, templname, !name.empty()));
 }
 
 
@@ -1787,15 +1789,15 @@
 
        // if the file doesn't exist, let the user create one
        if (!fs::exists(filename)) {
-               // the user specifically chose this name. Believe them.
-               view()->newFile(filename, "", true);
+               // the user specifically chose this name. Believe him.
+               owner->setBuffer(newFile(filename, "", true));
                return;
        }
 
        owner->message(bformat(_("Opening document %1$s..."), disp_fn));
 
        string str2;
-       if (view()->loadLyXFile(filename)) {
+       if (owner->loadLyXFile(filename)) {
                str2 = bformat(_("Document %1$s opened."), disp_fn);
        } else {
                str2 = bformat(_("Could not open document %1$s"), disp_fn);
@@ -1899,7 +1901,7 @@
                        // since there's no current buffer
                        owner->getDialogs().hideBufferDependent();
                } else {
-                       view()->setBuffer(bufferlist.first());
+                       owner->setBuffer(bufferlist.first());
                }
        }
 }
Index: PrinterParams.h
===================================================================
--- PrinterParams.h     (revision 14429)
+++ PrinterParams.h     (working copy)
@@ -70,8 +70,9 @@
        // bool duplex;
 
        /** Test that all the fields contain valid entries.  It's unlikely
-           that the internal code will get this wrong however new ports 
-           and external scripts might drive the wrong values in.
+           that the internal code will get this wrong (at least for the
+           xforms code anyway) however new ports and external scripts
+           might drive the wrong values in.
         */
        void testInvariant() const;
        ///
Index: rowpainter.h
===================================================================
--- rowpainter.h        (revision 14429)
+++ rowpainter.h        (working copy)
@@ -30,7 +30,7 @@
 
 /// paint visible paragraph of main text
 void paintText(BufferView const & bv, ViewMetricsInfo const & vi,
-              lyx::frontend::Painter & pain);
+                          lyx::frontend::Painter & painter);
 
 /// paint the rows of a text inset
 void paintTextInset(LyXText const & text, PainterInfo & pi, int x, int y);

Reply via email to