]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
redraw fix 1.
[lyx.git] / src / BufferView_pimpl.C
index cd2b197a73dc34b6f6d9a0c333229fd269317c3c..f2a70a68db3e8ef36a40172cfbb3992a9dc13701 100644 (file)
@@ -70,6 +70,8 @@
 
 #include "mathed/formulabase.h"
 
+#include "graphics/Previews.h"
+
 #include "support/LAssert.h"
 #include "support/lstrings.h"
 #include "support/filetools.h"
@@ -130,7 +132,7 @@ BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o,
 {
        workarea_.reset(WorkAreaFactory::create(xpos, ypos, width, height));
        screen_.reset(LyXScreenFactory::create(workarea()));
+
        // Setup the signals
        workarea().scrollDocView.connect(boost::bind(&BufferView::Pimpl::scrollDocView, this, _1));
        workarea().workAreaResize
@@ -163,7 +165,7 @@ WorkArea & BufferView::Pimpl::workarea() const
        return *workarea_.get();
 }
 
+
 LyXScreen & BufferView::Pimpl::screen() const
 {
        return *screen_.get();
@@ -207,28 +209,22 @@ void BufferView::Pimpl::buffer(Buffer * b)
        if (buffer_) {
                lyxerr[Debug::INFO] << "Buffer addr: " << buffer_ << endl;
                buffer_->addUser(bv_);
+
                // If we don't have a text object for this, we make one
                if (bv_->text == 0) {
                        resizeCurrentBuffer();
-               } else {
-                       updateScreen();
-                       updateScrollbar();
                }
+
+               // FIXME: needed when ?
                bv_->text->first_y = screen().topCursorVisible(bv_->text->cursor, bv_->text->first_y);
-               owner_->updateMenubar();
-               owner_->updateToolbar();
+
                // Similarly, buffer-dependent dialogs should be updated or
                // hidden. This should go here because some dialogs (eg ToC)
                // require bv_->text.
                owner_->getDialogs()->updateBufferDependent(true);
-               redraw();
        } else {
                lyxerr[Debug::INFO] << "  No Buffer!" << endl;
-               owner_->updateMenubar();
-               owner_->updateToolbar();
                owner_->getDialogs()->hideBufferDependent();
-               updateScrollbar();
-               workarea().redraw();
 
                // Also remove all remaining text's from the testcache.
                // (there should not be any!) (if there is any it is a
@@ -237,17 +233,16 @@ void BufferView::Pimpl::buffer(Buffer * b)
                        textcache.show(lyxerr, "buffer delete all");
                textcache.clear();
        }
-       // should update layoutchoice even if we don't have a buffer.
-       owner_->updateLayoutChoice();
 
+       repaint();
+       updateScrollbar();
+       owner_->updateMenubar();
+       owner_->updateToolbar();
+       owner_->updateLayoutChoice();
        owner_->updateWindowTitle();
-}
 
-
-void BufferView::Pimpl::redraw()
-{
-       lyxerr[Debug::INFO] << "BufferView::redraw()" << endl;
-       workarea().redraw();
+       if (grfx::Previews::activated() && buffer_)
+               grfx::Previews::get().generateBufferPreviews(buffer_);
 }
 
 
@@ -264,7 +259,7 @@ bool BufferView::Pimpl::fitCursor()
 
        bv_->owner()->getDialogs()->updateParagraph();
        if (ret)
-           updateScrollbar();
+               updateScrollbar();
        return ret;
 }
 
@@ -356,10 +351,6 @@ int BufferView::Pimpl::resizeCurrentBuffer()
 
        bv_->text->first_y = screen().topCursorVisible(bv_->text->cursor, bv_->text->first_y);
 
-       // this will scroll the screen such that the cursor becomes visible
-       updateScrollbar();
-       redraw();
-
        setState();
        owner_->allowInput();
 
@@ -370,7 +361,7 @@ int BufferView::Pimpl::resizeCurrentBuffer()
 }
 
 
-void BufferView::Pimpl::updateScreen()
+void BufferView::Pimpl::repaint()
 {
        // Regenerate the screen.
        screen().redraw(bv_->text, bv_);
@@ -387,6 +378,9 @@ void BufferView::Pimpl::updateScrollbar()
 
        LyXText const & t = *bv_->text;
  
+       lyxerr[Debug::GUI] << "Updating scrollbar: h " << t.height << ", first_y "
+               << t.first_y << ", default height " << t.defaultHeight() << endl;
+
        workarea().setScrollbarParams(t.height, t.first_y, t.defaultHeight());
 }
 
@@ -422,10 +416,10 @@ int BufferView::Pimpl::scroll(long time)
                return 0;
 
        LyXText const * t = bv_->text;
-       double const diff = t->defaultHeight() 
+
+       double const diff = t->defaultHeight()
                + double(time) * double(time) * 0.125;
+
        scrollDocView(int(diff));
        workarea().setScrollbarParams(t->height, t->first_y, t->defaultHeight());
        return 0;
@@ -902,7 +896,7 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y)
 void BufferView::Pimpl::workAreaResize()
 {
        static int work_area_width;
-       static unsigned int work_area_height;
+       static int work_area_height;
 
        bool const widthChange = workarea().workWidth() != work_area_width;
        bool const heightChange = workarea().workHeight() != work_area_height;
@@ -910,6 +904,7 @@ void BufferView::Pimpl::workAreaResize()
        // update from work area
        work_area_width = workarea().workWidth();
        work_area_height = workarea().workHeight();
+
        if (buffer_ != 0) {
                if (widthChange) {
                        // The visible LyXView need a resize
@@ -924,21 +919,18 @@ void BufferView::Pimpl::workAreaResize()
                        if (lyxerr.debugging())
                                textcache.show(lyxerr, "Expose delete all");
                        textcache.clear();
-                       // FIXME: this is aalready done in resizeCurrentBuffer() ?? 
+                       // FIXME: this is aalready done in resizeCurrentBuffer() ??
                        buffer_->resizeInsets(bv_);
                } else if (heightChange) {
                        // fitCursor() ensures we don't jump back
                        // to the start of the document on vertical
                        // resize
                        fitCursor();
-
-                       // The main window size has changed, repaint most stuff
-                       redraw();
-               } else {
-                       screen().redraw(bv_->text, bv_);
                }
-       } else {
-               screen().redraw(bv_->text, bv_);
+       }
+
+       if (widthChange || heightChange) {
+               repaint();
        }
 
        // always make sure that the scrollbar is sane.
@@ -1029,9 +1021,9 @@ void BufferView::Pimpl::update(LyXText * text, BufferView::UpdateCodes f)
 
        if (text->inset_owner) {
                text->inset_owner->setUpdateStatus(bv_, InsetText::NONE);
-           updateInset(text->inset_owner, false);
+               updateInset(text->inset_owner, false);
        } else {
-           update();
+               update();
        }
 
        if ((f & FITCUR)) {
@@ -1226,7 +1218,7 @@ void BufferView::Pimpl::restorePosition(unsigned int i)
        bv_->text->setCursor(bv_, par,
                             min(par->size(), saved_positions[i].par_pos));
 
-       update(bv_->text, BufferView::SELECT|BufferView::FITCUR);
+       update(bv_->text, BufferView::SELECT | BufferView::FITCUR);
        if (i > 0) {
                ostringstream str;
                str << _("Moved to bookmark") << ' ' << i;
@@ -1305,14 +1297,28 @@ void BufferView::Pimpl::toggleToggle()
 
 void BufferView::Pimpl::center()
 {
-       beforeChange(bv_->text);
-       if (bv_->text->cursor.y() > static_cast<int>((workarea().workHeight() / 2))) {
-               screen().draw(bv_->text, bv_, bv_->text->cursor.y() - workarea().workHeight() / 2);
-       } else {
-               screen().draw(bv_->text, bv_, 0);
+       LyXText * t = bv_->text;
+       beforeChange(t);
+       int const half_height = workarea().workHeight() / 2;
+       int new_y = 0;
+       if (t->cursor.y() > half_height) {
+               new_y = t->cursor.y() - half_height;
        }
-       update(bv_->text, BufferView::SELECT|BufferView::FITCUR);
-       redraw();
+       // FIXME: can we do this w/o calling screen directly ?
+       // This updates first_y but means the fitCursor() call
+       // from the update(FITCUR) doesn't realise that we might
+       // have moved (e.g. from GOTOPARAGRAPH), so doesn't cause
+       // the scrollbar to be updated as it should, so we have
+       // to do it manually. Any operation that does a center()
+       // and also might have moved first_y must make sure to call
+       // updateScrollbar() currently. Never mind that this is a 
+       // pretty obfuscated way of updating t->first_y
+       screen().draw(t, bv_, new_y);
+       update(t, BufferView::SELECT | BufferView::FITCUR);
 }
 
 
@@ -1377,7 +1383,7 @@ void BufferView::Pimpl::moveCursorUpdate(bool selecting, bool fitcur)
 
        if (!lt->selection.set())
                workarea().haveSelection(false);
-       
+
        /* ---> Everytime the cursor is moved, show the current font state. */
        // should this too me moved out of this func?
        //owner->showState();
@@ -1631,7 +1637,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
 
                // If the entry is obsolete, use the new one instead.
                if (hasLayout) {
-                       string const & obs = tclass[layout].obsoleted_by();
+                       string const & obs = tclass[layout]->obsoleted_by();
                        if (!obs.empty())
                                layout = obs;
                }
@@ -1651,7 +1657,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                        Paragraph * spar = lt->selection.start.par();
                        Paragraph * epar = lt->selection.end.par()->next();
                        while(spar != epar) {
-                               if (spar->layout() != current_layout) {
+                               if (spar->layout()->name() != current_layout) {
                                        change_layout = true;
                                        break;
                                }
@@ -2309,10 +2315,9 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
        case LFUN_PROTECTEDSPACE:
        {
                LyXText * lt = bv_->getLyXText();
+               LyXLayout_ptr const & style = lt->cursor.par()->layout();
 
-               LyXLayout const & style = tclass[lt->cursor.par()->layout()];
-
-               if (style.free_spacing) {
+               if (style->free_spacing) {
                        lt->insertChar(bv_, ' ');
                        update(lt,
                               BufferView::SELECT
@@ -3000,7 +3005,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument)
                }
 
                InsetIndex * inset = new InsetIndex(InsetCommandParams("index", entry));
-       
+
                if (!insertInset(inset)) {
                        delete inset;
                } else {
@@ -3234,10 +3239,9 @@ void BufferView::Pimpl::smartQuote()
 
        hideCursor();
 
-       LyXLayout const & style =
-               textclasslist[bv_->buffer()->params.textclass][par->layout()];
+       LyXLayout_ptr const & style = par->layout();
 
-       if (style.pass_thru ||
+       if (style->pass_thru ||
                (!insertInset(new InsetQuotes(c, bv_->buffer()->params))))
                bv_->owner()->getLyXFunc()->dispatch(LFUN_SELFINSERT, "\"");
 }
@@ -3245,10 +3249,27 @@ void BufferView::Pimpl::smartQuote()
 
 void BufferView::Pimpl::insertAndEditInset(Inset * inset)
 {
+#if 0
        if (insertInset(inset))
                inset->edit(bv_);
        else
                delete inset;
+#else
+       bool gotsel = false;
+
+       if (bv_->getLyXText()->selection.set()) {
+               bv_->getLyXText()->cutSelection(bv_, true, false);
+               gotsel = true;
+       }
+
+       if (insertInset(inset)) {
+               inset->edit(bv_);
+               if (gotsel)
+                       owner_->getLyXFunc()->dispatch(LFUN_PASTESELECTION);
+       }
+       else 
+               delete inset;
+#endif
 }