]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
John's splash patch
[lyx.git] / src / BufferView_pimpl.C
index 48c36c73c772edf3938608ed23666eaaa75dfb0b..617abc67fb2b99ccbf1b5765158dccb17f0ee71e 100644 (file)
@@ -3,6 +3,7 @@
 #include <ctime>
 #include <unistd.h>
 #include <sys/wait.h>
+#include <locale.h>
 
 #ifdef __GNUG__
 #pragma implementation
@@ -30,7 +31,7 @@
 #include "insets/insettext.h"
 /// added for Dispatch functions
 #include "lyx_cb.h"
-#include "filedlg.h"
+#include "frontends/FileDialog.h"
 #include "lyx_main.h"
 #include "FloatList.h"
 #include "support/filetools.h"
@@ -64,6 +65,7 @@ extern int greek_kb_flag;
 using SigC::slot;
 #endif
 
+using std::vector;
 using std::find_if;
 using std::pair;
 using std::endl;
@@ -106,47 +108,47 @@ void SetXtermCursor(Window win)
 
 BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o,
             int xpos, int ypos, int width, int height)
-       : bv_(b), owner_(o), cursor_timeout(400)
+       : bv_(b), owner_(o), buffer_(0),
+         current_scrollbar_value(0), cursor_timeout(400),
+         workarea_(xpos, ypos, width, height), using_xterm_cursor(false)
 {
-       buffer_ = 0;
-       workarea_ = new WorkArea(xpos, ypos, width, height);
        // Setup the signals
-       workarea_->scrollCB.connect(slot(this, &BufferView::Pimpl::scrollCB));
-       workarea_->workAreaExpose
+       workarea_.scrollCB.connect(slot(this, &BufferView::Pimpl::scrollCB));
+       workarea_.workAreaExpose
                .connect(slot(this, &BufferView::Pimpl::workAreaExpose));
-       workarea_->workAreaEnter
+       workarea_.workAreaEnter
                .connect(slot(this, &BufferView::Pimpl::enterView));
-       workarea_->workAreaLeave
+       workarea_.workAreaLeave
                .connect(slot(this, &BufferView::Pimpl::leaveView));
-       workarea_->workAreaButtonPress
+       workarea_.workAreaButtonPress
                .connect(slot(this, &BufferView::Pimpl::workAreaButtonPress));
-       workarea_->workAreaButtonRelease
+       workarea_.workAreaButtonRelease
                .connect(slot(this,
                              &BufferView::Pimpl::workAreaButtonRelease));
-       workarea_->workAreaMotionNotify
+       workarea_.workAreaMotionNotify
                .connect(slot(this, &BufferView::Pimpl::workAreaMotionNotify));
-       workarea_->workAreaDoubleClick
+       workarea_.workAreaDoubleClick
                .connect(slot(this, &BufferView::Pimpl::doubleClick));
-       workarea_->workAreaTripleClick
+       workarea_.workAreaTripleClick
                .connect(slot(this, &BufferView::Pimpl::tripleClick));
-       workarea_->workAreaKeyPress
+       workarea_.workAreaKeyPress
                .connect(slot(this, &BufferView::Pimpl::workAreaKeyPress));
        
-       screen_ = 0;
+       //screen_ = 0;
 
        cursor_timeout.timeout.connect(slot(this,
                                            &BufferView::Pimpl::cursorToggle));
-       current_scrollbar_value = 0;
+       //current_scrollbar_value = 0;
        cursor_timeout.start();
-       workarea_->setFocus();
-       using_xterm_cursor = false;
+       workarea_.setFocus();
+       //using_xterm_cursor = false;
        saved_positions.resize(saved_positions_num);
 }
 
 
 Painter & BufferView::Pimpl::painter() 
 {
-       return workarea_->getPainter();
+       return workarea_.getPainter();
 }
 
 
@@ -162,7 +164,7 @@ void BufferView::Pimpl::buffer(Buffer * b)
                // only if the buffer is still loaded.
                // Also set the owner of the test to 0
                //              bv_->text->owner(0);
-               textcache.add(buffer_, workarea_->workWidth(), bv_->text);
+               textcache.add(buffer_, workarea_.workWidth(), bv_->text);
                if (lyxerr.debugging())
                        textcache.show(lyxerr, "BufferView::buffer");
                
@@ -176,8 +178,9 @@ void BufferView::Pimpl::buffer(Buffer * b)
        
        // Nuke old image
        // screen is always deleted when the buffer is changed.
-       delete screen_;
-       screen_ = 0;
+       screen_.reset(0);
+       //delete screen_;
+       //screen_ = 0;
 
        // If we are closing the buffer, use the first buffer as current
        if (!buffer_) {
@@ -209,7 +212,7 @@ void BufferView::Pimpl::buffer(Buffer * b)
                owner_->updateToolbar();
                owner_->getDialogs()->hideBufferDependent();
                updateScrollbar();
-               workarea_->redraw();
+               workarea_.redraw();
 
                // Also remove all remaining text's from the testcache.
                // (there should not be any!) (if there is any it is a
@@ -227,7 +230,7 @@ void BufferView::Pimpl::buffer(Buffer * b)
 
 void BufferView::Pimpl::resize(int xpos, int ypos, int width, int height)
 {
-       workarea_->resize(xpos, ypos, width, height);
+       workarea_.resize(xpos, ypos, width, height);
        update(bv_->text, SELECT);
        redraw();
 }
@@ -243,13 +246,13 @@ void BufferView::Pimpl::resize()
 void BufferView::Pimpl::redraw()
 {
        lyxerr[Debug::INFO] << "BufferView::redraw()" << endl;
-       workarea_->redraw();
+       workarea_.redraw();
 }
 
 
 bool BufferView::Pimpl::fitCursor(LyXText * text)
 {
-       Assert(screen_);
+       Assert(screen_.get());
  
        bool ret = screen_->FitCursor(text, bv_);
        if (ret)
@@ -277,11 +280,11 @@ int BufferView::Pimpl::resizeCurrentBuffer()
        LyXParagraph * selendpar = 0;
        UpdatableInset * the_locking_inset = 0;
        
-       int pos = 0;
-       int selstartpos = 0;
-       int selendpos = 0;
-       int selection = 0;
-       int mark_set = 0;
+       LyXParagraph::size_type pos = 0;
+       LyXParagraph::size_type selstartpos = 0;
+       LyXParagraph::size_type selendpos = 0;
+       bool selection = false;
+       bool mark_set  = false;
 
        ProhibitInput(bv_);
 
@@ -302,11 +305,11 @@ int BufferView::Pimpl::resizeCurrentBuffer()
        } else {
                // See if we have a text in TextCache that fits
                // the new buffer_ with the correct width.
-               bv_->text = textcache.findFit(buffer_, workarea_->workWidth());
+               bv_->text = textcache.findFit(buffer_, workarea_.workWidth());
                if (bv_->text) {
                        if (lyxerr.debugging()) {
                                lyxerr << "Found a LyXText that fits:\n";
-                               textcache.show(lyxerr, make_pair(buffer_, make_pair(workarea_->workWidth(), bv_->text)));
+                               textcache.show(lyxerr, make_pair(buffer_, make_pair(workarea_.workWidth(), bv_->text)));
                        }
                        // Set the owner of the newly found text
                        //      bv_->text->owner(bv_);
@@ -346,7 +349,8 @@ int BufferView::Pimpl::resizeCurrentBuffer()
        bv_->setState();
        AllowInput(bv_);
 
-       owner_->getDialogs()->hideSplash();
+       /// get rid of the splash screen if it's not gone already
+       owner_->getDialogs()->destroySplash();
  
        return 0;
 }
@@ -355,8 +359,9 @@ int BufferView::Pimpl::resizeCurrentBuffer()
 void BufferView::Pimpl::updateScreen()
 {
        // Regenerate the screen.
-       delete screen_;
-       screen_ = new LyXScreen(*workarea_);
+       screen_.reset(new LyXScreen(workarea_));
+       //delete screen_;
+       //screen_ = new LyXScreen(workarea_);
 }
 
 
@@ -367,7 +372,7 @@ void BufferView::Pimpl::updateScrollbar()
         * be possible */
 
        if (!buffer_) {
-               workarea_->setScrollbar(0, 1.0);
+               workarea_.setScrollbar(0, 1.0);
                return;
        }
        
@@ -384,31 +389,31 @@ void BufferView::Pimpl::updateScrollbar()
 
        // check if anything has changed.
        if (max2 == cbth &&
-           height2 == workarea_->height() &&
+           height2 == workarea_.height() &&
            current_scrollbar_value == cbsf)
                return; // no
        max2 = cbth;
-       height2 = workarea_->height();
+       height2 = workarea_.height();
        current_scrollbar_value = cbsf;
 
        if (cbth <= height2) { // text is smaller than screen
-               workarea_->setScrollbar(0, 1.0); // right?
+               workarea_.setScrollbar(0, 1.0); // right?
                return;
        }
 
-       long maximum_height = workarea_->height() * 3 / 4 + cbth;
+       long maximum_height = workarea_.height() * 3 / 4 + cbth;
        long value = cbsf;
 
        // set the scrollbar
-       double hfloat = workarea_->height();
+       double hfloat = workarea_.height();
        double maxfloat = maximum_height;
 
        float slider_size = 0.0;
        int slider_value = value;
 
-       workarea_->setScrollbarBounds(0, bv_->text->height - workarea_->height());
-       double lineh = bv_->text->DefaultHeight();
-       workarea_->setScrollbarIncrements(lineh);
+       workarea_.setScrollbarBounds(0, bv_->text->height - workarea_.height());
+       double const lineh = bv_->text->DefaultHeight();
+       workarea_.setScrollbarIncrements(lineh);
        if (maxfloat > 0.0) {
                if ((hfloat / maxfloat) * float(height2) < 3)
                        slider_size = 3.0/float(height2);
@@ -417,7 +422,7 @@ void BufferView::Pimpl::updateScrollbar()
        } else
                slider_size = hfloat;
 
-       workarea_->setScrollbar(slider_value, slider_size / workarea_->height());
+       workarea_.setScrollbar(slider_value, slider_size / workarea_.height());
 }
 
 
@@ -430,7 +435,7 @@ void BufferView::Pimpl::scrollCB(double value)
        if (current_scrollbar_value < 0)
                current_scrollbar_value = 0;
    
-       if (!screen_)
+       if (!screen_.get())
                return;
 
        screen_->Draw(bv_->text, bv_, current_scrollbar_value);
@@ -444,7 +449,7 @@ void BufferView::Pimpl::scrollCB(double value)
  
        int const height = vbt->DefaultHeight();
        int const first = static_cast<int>((bv_->text->first + height));
-       int const last = static_cast<int>((bv_->text->first + workarea_->height() - height));
+       int const last = static_cast<int>((bv_->text->first + workarea_.height() - height));
 
        if (vbt->cursor.y() < first)
                vbt->SetCursorFromCoordinates(bv_, 0, first);
@@ -458,17 +463,17 @@ void BufferView::Pimpl::scrollCB(double value)
 int BufferView::Pimpl::scrollUp(long time)
 {
        if (!buffer_) return 0;
-       if (!screen_) return 0;
+       if (!screen_.get()) return 0;
    
-       double value = workarea_->getScrollbarValue();
+       double value = workarea_.getScrollbarValue();
    
        if (value == 0) return 0;
 
        float add_value =  (bv_->text->DefaultHeight()
                            + float(time) * float(time) * 0.125);
    
-       if (add_value > workarea_->height())
-               add_value = float(workarea_->height() -
+       if (add_value > workarea_.height())
+               add_value = float(workarea_.height() -
                                  bv_->text->DefaultHeight());
    
        value -= add_value;
@@ -476,7 +481,7 @@ int BufferView::Pimpl::scrollUp(long time)
        if (value < 0)
                value = 0;
    
-       workarea_->setScrollbarValue(value);
+       workarea_.setScrollbarValue(value);
    
        scrollCB(value); 
        return 0;
@@ -486,10 +491,10 @@ int BufferView::Pimpl::scrollUp(long time)
 int BufferView::Pimpl::scrollDown(long time)
 {
        if (!buffer_) return 0;
-       if (!screen_) return 0;
+       if (!screen_.get()) return 0;
    
-       double value= workarea_->getScrollbarValue();
-       pair<float, float> p = workarea_->getScrollbarBounds();
+       double value = workarea_.getScrollbarValue();
+       pair<float, float> p = workarea_.getScrollbarBounds();
        double max = p.second;
        
        if (value == max) return 0;
@@ -497,8 +502,8 @@ int BufferView::Pimpl::scrollDown(long time)
        float add_value =  (bv_->text->DefaultHeight()
                            + float(time) * float(time) * 0.125);
    
-       if (add_value > workarea_->height())
-               add_value = float(workarea_->height() -
+       if (add_value > workarea_.height())
+               add_value = float(workarea_.height() -
                                  bv_->text->DefaultHeight());
    
        value += add_value;
@@ -506,7 +511,7 @@ int BufferView::Pimpl::scrollDown(long time)
        if (value > max)
                value = max;
 
-       workarea_->setScrollbarValue(value);
+       workarea_.setScrollbarValue(value);
        
        scrollCB(value); 
        return 0;
@@ -525,7 +530,7 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state)
        if (!(state & Button1MotionMask))
                return;
 
-       if (!buffer_ || !screen_) return;
+       if (!buffer_ || !screen_.get()) return;
 
        // Check for inset locking
        if (bv_->theLockingInset()) {
@@ -570,7 +575,7 @@ void BufferView::Pimpl::workAreaButtonPress(int xpos, int ypos,
        last_click_x = -1;
        last_click_y = -1;
 
-       if (!buffer_ || !screen_) return;
+       if (!buffer_ || !screen_.get()) return;
 
        Inset * inset_hit = checkInsetHit(bv_->text, xpos, ypos, button);
 
@@ -679,7 +684,7 @@ void BufferView::Pimpl::doubleClick(int /*x*/, int /*y*/, unsigned int button)
        if (text->bv_owner && bv_->theLockingInset())
            return;
 
-       if (screen_ && button == 1) {
+       if (screen_.get() && button == 1) {
            if (text->bv_owner) {
                screen_->HideCursor();
                screen_->ToggleSelection(text, bv_);
@@ -706,7 +711,7 @@ void BufferView::Pimpl::tripleClick(int /*x*/, int /*y*/, unsigned int button)
        if (text->bv_owner && bv_->theLockingInset())
            return;
 
-       if (screen_ && (button == 1)) {
+       if (screen_.get() && (button == 1)) {
                screen_->HideCursor();
                screen_->ToggleSelection(text, bv_);
                text->CursorHome(bv_);
@@ -724,7 +729,7 @@ void BufferView::Pimpl::tripleClick(int /*x*/, int /*y*/, unsigned int button)
 void BufferView::Pimpl::enterView()
 {
        if (active() && available()) {
-               SetXtermCursor(workarea_->getWin());
+               SetXtermCursor(workarea_.getWin());
                using_xterm_cursor = true;
        }
 }
@@ -733,7 +738,7 @@ void BufferView::Pimpl::enterView()
 void BufferView::Pimpl::leaveView()
 {
        if (using_xterm_cursor) {
-               XUndefineCursor(fl_get_display(), workarea_->getWin());
+               XUndefineCursor(fl_get_display(), workarea_.getWin());
                using_xterm_cursor = false;
        }
 }
@@ -742,7 +747,7 @@ void BufferView::Pimpl::leaveView()
 void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                                              unsigned int button)
 {
-       if (!buffer_ || !screen_) return;
+       if (!buffer_ || !screen_.get()) return;
 
        // If we hit an inset, we have the inset coordinates in these
        // and inset_hit points to the inset.  If we do not hit an
@@ -803,6 +808,7 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                return;
        }
 
+#ifndef NEW_INSETS
        // check whether we want to open a float
        if (bv_->text) {
                bool hit = false;
@@ -812,7 +818,6 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                        c = bv_->text->cursor.par()->
                                GetChar(bv_->text->cursor.pos());
                }
-#ifndef NEW_INSETS
               if(!bv_->text->selection)
                if (c == LyXParagraph::META_FOOTNOTE
                    || c == LyXParagraph::META_MARGIN
@@ -823,11 +828,9 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                     || c == LyXParagraph::META_ALGORITHM){
                        hit = true;
                } else
-#endif
                        if (bv_->text->cursor.pos() - 1 >= 0) {
                        c = bv_->text->cursor.par()->
                                GetChar(bv_->text->cursor.pos() - 1);
-#ifndef NEW_INSETS
                        if (c == LyXParagraph::META_FOOTNOTE
                            || c == LyXParagraph::META_MARGIN
                            || c == LyXParagraph::META_FIG
@@ -839,18 +842,13 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                                bv_->text->CursorLeft(bv_);
                                hit = true;
                        }
-#endif
                }
                if (hit == true) {
-#ifndef NEW_INSETS
                        bv_->toggleFloat();
-#endif
                        selection_possible = false;
                        return;
                }
        }
-
-#ifndef NEW_INSETS
        // Do we want to close a float? (click on the float-label)
        if (bv_->text->cursor.row()->par()->footnoteflag == 
            LyXParagraph::OPEN_FOOTNOTE
@@ -876,8 +874,26 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
                        return;
                }
        }
+#else
+       // check whether we want to open a float
+       if (bv_->text) {
+               bool hit = false;
+               char c = ' ';
+               if (bv_->text->cursor.pos() <
+                   bv_->text->cursor.par()->size()) {
+                       c = bv_->text->cursor.par()->
+                               GetChar(bv_->text->cursor.pos());
+               }
+                       if (bv_->text->cursor.pos() - 1 >= 0) {
+                       c = bv_->text->cursor.par()->
+                               GetChar(bv_->text->cursor.pos() - 1);
+               }
+               if (hit == true) {
+                       selection_possible = false;
+                       return;
+               }
+       }
 #endif
-
        // Maybe we want to edit a bibitem ale970302
        if (bv_->text->cursor.par()->bibkey && x < 20 + 
            bibitemMaxWidth(bv_, textclasslist.
@@ -898,7 +914,7 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y,
 Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y,
                                         unsigned int /* button */)
 {
-       if (!screen_)
+       if (!screen_.get())
                return 0;
   
        int y_tmp = y + text->first;
@@ -906,7 +922,11 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y,
        LyXCursor cursor;
        text->SetCursorFromCoordinates(bv_, cursor, x, y_tmp);
 
+#ifndef NEW_INSETS
        if (cursor.pos() < cursor.par()->Last()
+#else
+       if (cursor.pos() < cursor.par()->size()
+#endif
            && cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET
            && cursor.par()->GetInset(cursor.pos())
            && cursor.par()->GetInset(cursor.pos())->Editable()) {
@@ -967,12 +987,12 @@ void BufferView::Pimpl::workAreaExpose()
        static int work_area_width = 0;
        static unsigned int work_area_height = 0;
 
-       bool widthChange = workarea_->workWidth() != work_area_width;
-       bool heightChange = workarea_->height() != work_area_height;
+       bool widthChange = workarea_.workWidth() != work_area_width;
+       bool heightChange = workarea_.height() != work_area_height;
 
        // update from work area
-       work_area_width = workarea_->workWidth();
-       work_area_height = workarea_->height();
+       work_area_width = workarea_.workWidth();
+       work_area_height = workarea_.height();
        if (buffer_ != 0) {
                if (widthChange) {
                        // All buffers need a resize
@@ -1000,11 +1020,11 @@ void BufferView::Pimpl::workAreaExpose()
                        // ...including the minibuffer
                        owner_->getMiniBuffer()->Init();
 
-               } else if (screen_)
+               } else if (screen_.get())
                    screen_->Redraw(bv_->text, bv_);
        } else {
                // Grey box when we don't have a buffer
-               workarea_->greyOut();
+               workarea_.greyOut();
        }
 
        // always make sure that the scrollbar is sane.
@@ -1016,7 +1036,7 @@ void BufferView::Pimpl::workAreaExpose()
 
 void BufferView::Pimpl::update()
 {
-       if (screen_) screen_->Update(bv_->text, bv_);
+       if (screen_.get()) screen_->Update(bv_->text, bv_);
 }
 
 // Values used when calling update:
@@ -1107,7 +1127,7 @@ void BufferView::Pimpl::cursorToggle()
 
        updatelist.update(bv_);
        
-       if (!screen_) {
+       if (!screen_.get()) {
                cursor_timeout.restart();
                return;
        }
@@ -1138,12 +1158,12 @@ void BufferView::Pimpl::cursorPrevious(LyXText * text)
                text->CursorUp(bv_);
        
        if (text->inset_owner ||
-           text->cursor.row()->height() < workarea_->height())
+           text->cursor.row()->height() < workarea_.height())
                screen_->Draw(bv_->text, bv_,
                              text->cursor.y()
                              - text->cursor.row()->baseline()
                              + text->cursor.row()->height()
-                             - workarea_->height() + 1 );
+                             - workarea_.height() + 1 );
        updateScrollbar();
 }
 
@@ -1153,7 +1173,7 @@ void BufferView::Pimpl::cursorNext(LyXText * text)
        if (!text->cursor.row()->next())
                return;
        
-       int y = text->first + workarea_->height();
+       int y = text->first + workarea_.height();
 //     if (text->inset_owner)
 //             y += bv_->text->first;
        text->GetRowNearY(y);
@@ -1166,7 +1186,7 @@ void BufferView::Pimpl::cursorNext(LyXText * text)
                text->CursorDown(bv_);
        
        if (text->inset_owner ||
-           text->cursor.row()->height() < workarea_->height())
+           text->cursor.row()->height() < workarea_.height())
                screen_->Draw(bv_->text, bv_, text->cursor.y() -
                              text->cursor.row()->baseline());
        updateScrollbar();
@@ -1219,8 +1239,13 @@ void BufferView::Pimpl::restorePosition(unsigned int i)
        if (!par)
                return;
 
+#ifndef NEW_INSETS
        bv_->text->SetCursor(bv_, par,
                             min(par->Last(), saved_positions[i].par_pos));
+#else
+       bv_->text->SetCursor(bv_, par,
+                            min(par->size(), saved_positions[i].par_pos));
+#endif
        update(bv_->text, BufferView::SELECT|BufferView::FITCUR);
        if (i > 0)
                owner_->getMiniBuffer()->Set(_("Moved to bookmark ") + tostr(i));
@@ -1286,52 +1311,52 @@ void BufferView::Pimpl::insetUnlock()
 
 bool BufferView::Pimpl::focus() const
 {
-       return workarea_->hasFocus();
+       return workarea_.hasFocus();
 }
 
 
 void BufferView::Pimpl::focus(bool f)
 {
-       if (f) workarea_->setFocus();
+       if (f) workarea_.setFocus();
 }
 
 
 bool BufferView::Pimpl::active() const
 {
-       return workarea_->active();
+       return workarea_.active();
 }
 
 
 bool BufferView::Pimpl::belowMouse() const 
 {
-       return workarea_->belowMouse();
+       return workarea_.belowMouse();
 }
 
 
 void BufferView::Pimpl::showCursor()
 {
-       if (screen_)
+       if (screen_.get())
                screen_->ShowCursor(bv_->text, bv_);
 }
 
 
 void BufferView::Pimpl::hideCursor()
 {
-       if (screen_)
+       if (screen_.get())
                screen_->HideCursor();
 }
 
 
 void BufferView::Pimpl::toggleSelection(bool b)
 {
-       if (screen_)
+       if (screen_.get())
                screen_->ToggleSelection(bv_->text, bv_, b);
 }
 
 
 void BufferView::Pimpl::toggleToggle()
 {
-       if (screen_)
+       if (screen_.get())
                screen_->ToggleToggle(bv_->text, bv_);
 }
 
@@ -1339,8 +1364,8 @@ void BufferView::Pimpl::toggleToggle()
 void BufferView::Pimpl::center() 
 {
        beforeChange(bv_->text);
-       if (bv_->text->cursor.y() > static_cast<int>((workarea_->height() / 2))) {
-               screen_->Draw(bv_->text, bv_, bv_->text->cursor.y() - workarea_->height() / 2);
+       if (bv_->text->cursor.y() > static_cast<int>((workarea_.height() / 2))) {
+               screen_->Draw(bv_->text, bv_, bv_->text->cursor.y() - workarea_.height() / 2);
        } else {
                screen_->Draw(bv_->text, bv_, 0);
        }
@@ -1356,7 +1381,7 @@ void BufferView::Pimpl::pasteClipboard(bool asPara)
        screen_->HideCursor();
        beforeChange(bv_->text);
        
-       string const clip(workarea_->getClipboard());
+       string const clip(workarea_.getClipboard());
        
        if (clip.empty()) return;
 
@@ -1371,7 +1396,7 @@ void BufferView::Pimpl::pasteClipboard(bool asPara)
 
 void BufferView::Pimpl::stuffClipboard(string const & stuff) const
 {
-       workarea_->putClipboard(stuff);
+       workarea_.putClipboard(stuff);
 }
 
 
@@ -1419,7 +1444,6 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen)
        if (filename.empty()) {
                // Launch a file browser
                string initpath = lyxrc.document_path;
-               LyXFileDlg fileDlg;
 
                if (available()) {
                        string const trypath = owner_->buffer()->filepath;
@@ -1428,21 +1452,24 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen)
                                initpath = trypath;
                }
 
-               // launches dialog
-               ProhibitInput(bv_);
-               fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
-               fileDlg.SetButton(1, _("Examples"), 
-                                 AddPath(system_lyxdir, "examples"));
-               filename = fileDlg.Select(_("Select Document to Insert"),
-                                         initpath, "*.lyx");
-               AllowInput(bv_);
+               FileDialog fileDlg(bv_->owner(), _("Select LyX document to insert"),
+                       LFUN_FILE_INSERT,
+                       make_pair(string(_("Documents")), string(lyxrc.document_path)),
+                       make_pair(string(_("Examples")), string(AddPath(system_lyxdir, "examples"))));
+
+               FileDialog::Result result = fileDlg.Select(initpath, _("*.lyx| LyX Documents (*.lyx)"));
+               if (result.first == FileDialog::Later)
+                       return;
+
+               filename = result.second;
 
                // check selected filename
                if (filename.empty()) {
                        owner_->getMiniBuffer()->Set(_("Canceled."));
                        return;
                }
-       } 
+       }
 
        // get absolute path of file and make sure the filename ends
        // with .lyx
@@ -1613,12 +1640,13 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
        }
        break;
        
+       case LFUN_FILE_INSERT_ASCII_PARA:
+               InsertAsciiFile(bv_, argument, true);
+               break;
+
        case LFUN_FILE_INSERT_ASCII:
-       {
-               bool asPara = (argument == "paragraph");
-               InsertAsciiFile(bv_, string(), asPara);
-       }
-       break;
+               InsertAsciiFile(bv_, argument, false);
+               break;
                
        case LFUN_LAYOUT:
        {
@@ -1802,7 +1830,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR);
                if (is_rtl)
                        TEXT(bv_)->CursorLeft(bv_, false);
+#ifndef NEW_INSETS
                if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last()
+#else
+               if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size()
+#endif
                    && TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos())
                    == LyXParagraph::META_INSET
                    && TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos())
@@ -1840,7 +1872,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                if (!is_rtl)
                        TEXT(bv_)->CursorLeft(bv_, false);
                if ((is_rtl || cur != TEXT(bv_)->cursor) && // only if really moved!
+#ifndef NEW_INSETS
                    TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last() &&
+#else
+                   TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size() &&
+#endif
                    (TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos()) ==
                     LyXParagraph::META_INSET) &&
                    TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()) &&
@@ -2211,22 +2247,26 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                LyXCursor cursor = TEXT(bv_)->cursor;
 
                if (!TEXT(bv_)->selection) {
+#ifndef NEW_INSETS
                        if (cursor.pos() == cursor.par()->Last()) {
+#else
+                       if (cursor.pos() == cursor.par()->size()) {
+#endif
                                TEXT(bv_)->CursorRight(bv_);
                                cursor = TEXT(bv_)->cursor;
                                if (cursor.pos() == 0
-                                   && !(cursor.par()->added_space_top 
+                                   && !(cursor.par()->params.spaceTop()
                                         == VSpace (VSpace::NONE))) {
                                        TEXT(bv_)->SetParagraph
                                                (bv_,
-                                                cursor.par()->line_top,
-                                                cursor.par()->line_bottom,
-                                                cursor.par()->pagebreak_top
-                                                cursor.par()->pagebreak_bottom,
+                                                cursor.par()->params.lineTop(),
+                                                cursor.par()->params.lineBottom(),
+                                                cursor.par()->params.pagebreakTop()
+                                                cursor.par()->params.pagebreakBottom(),
                                                 VSpace(VSpace::NONE), 
-                                                cursor.par()->added_space_bottom,
-                                                cursor.par()->align
-                                                cursor.par()->labelwidthstring, 0);
+                                                cursor.par()->params.spaceBottom(),
+                                                cursor.par()->params.align()
+                                                cursor.par()->params.labelWidthString(), 0);
                                        TEXT(bv_)->CursorLeft(bv_);
                                        update(TEXT(bv_), 
                                               BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
@@ -2323,17 +2363,17 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                
                if (!TEXT(bv_)->selection) {
                        if (cursor.pos() == 0 
-                           && !(cursor.par()->added_space_top 
+                           && !(cursor.par()->params.spaceTop() 
                                 == VSpace (VSpace::NONE))) {
                                TEXT(bv_)->SetParagraph 
                                        (bv_,
-                                        cursor.par()->line_top,      
-                                        cursor.par()->line_bottom,
-                                        cursor.par()->pagebreak_top
-                                        cursor.par()->pagebreak_bottom,
-                                        VSpace(VSpace::NONE), cursor.par()->added_space_bottom,
-                                        cursor.par()->align
-                                        cursor.par()->labelwidthstring, 0);
+                                        cursor.par()->params.lineTop(),      
+                                        cursor.par()->params.lineBottom(),
+                                        cursor.par()->params.pagebreakTop()
+                                        cursor.par()->params.pagebreakBottom(),
+                                        VSpace(VSpace::NONE), cursor.par()->params.spaceBottom(),
+                                        cursor.par()->params.align()
+                                        cursor.par()->params.labelWidthString(), 0);
                                update(TEXT(bv_),
                                       BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
                        } else {
@@ -2382,16 +2422,16 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                
                beforeChange(TEXT(bv_));
                if (cursor.pos() == 0) {
-                       if (cursor.par()->added_space_top == VSpace(VSpace::NONE)) {
+                       if (cursor.par()->params.spaceTop() == VSpace(VSpace::NONE)) {
                                TEXT(bv_)->SetParagraph
                                        (bv_,
-                                        cursor.par()->line_top,      
-                                        cursor.par()->line_bottom,
-                                        cursor.par()->pagebreak_top
-                                        cursor.par()->pagebreak_bottom,
-                                        VSpace(VSpace::DEFSKIP), cursor.par()->added_space_bottom,
-                                        cursor.par()->align
-                                        cursor.par()->labelwidthstring, 1);
+                                        cursor.par()->params.lineTop(),      
+                                        cursor.par()->params.lineBottom(),
+                                        cursor.par()->params.pagebreakTop()
+                                        cursor.par()->params.pagebreakBottom(),
+                                        VSpace(VSpace::DEFSKIP), cursor.par()->params.spaceBottom(),
+                                        cursor.par()->params.align()
+                                        cursor.par()->params.labelWidthString(), 1);
                                //update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
                        } 
                }
@@ -2411,10 +2451,10 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
        case LFUN_PARAGRAPH_SPACING:
        {
                LyXParagraph * par = TEXT(bv_)->cursor.par();
-               Spacing::Space cur_spacing = par->spacing.getSpace();
+               Spacing::Space cur_spacing = par->params.spacing().getSpace();
                float cur_value = 1.0;
                if (cur_spacing == Spacing::Other) {
-                       cur_value = par->spacing.getValue();
+                       cur_value = par->params.spacing().getValue();
                }
                
                istringstream istr(argument.c_str());
@@ -2446,7 +2486,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                               << argument << endl;
                }
                if (cur_spacing != new_spacing || cur_value != new_value) {
-                       par->spacing.set(new_spacing, new_value);
+                       par->params.spacing(Spacing(new_spacing, new_value));
                        TEXT(bv_)->RedoParagraph(bv_);
                        update(TEXT(bv_),
                               BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);