]> git.lyx.org Git - lyx.git/blobdiff - src/text3.C
27 moved, 19 killed...
[lyx.git] / src / text3.C
index e59ac3bd0a981b52b6740d7822ba5a68ad60f713..007e0ab6e066d463e24fcf184c1c0748d03d7714 100644 (file)
 #include "ParagraphParameters.h"
 #include "gettext.h"
 #include "intl.h"
+#include "language.h"
 #include "support/lstrings.h"
 #include "frontends/LyXView.h"
 #include "frontends/screen.h"
 #include "frontends/WorkArea.h"
 #include "insets/insetspecialchar.h"
 #include "insets/insettext.h"
+#include "insets/insetquotes.h"
+#include "insets/insetcommand.h"
 #include "undo_funcs.h"
 
+#include <ctime>
+#include <clocale>
+
 using std::endl;
 
 extern string current_layout;
 
-
 namespace {
 
-void cursorPrevious(LyXText * text, BufferView * bv)
+       void finishChange(BufferView * bv, bool fitcur = false)
+       {
+               finishUndo();
+               bv->moveCursorUpdate(fitcur);
+               bv->owner()->view_state_changed();
+       }
+
+}
+
+
+bool LyXText::gotoNextInset(BufferView * bv,
+       vector<Inset::Code> const & codes, string const & contents) const
+{
+       LyXCursor res = cursor;
+       Inset * inset;
+       do {
+               if (res.pos() < res.par()->size() - 1) {
+                       res.pos(res.pos() + 1);
+               } else  {
+                       res.par(res.par()->next());
+                       res.pos(0);
+               }
+
+       } while (res.par() &&
+                !(res.par()->isInset(res.pos())
+                  && (inset = res.par()->getInset(res.pos())) != 0
+                  && find(codes.begin(), codes.end(), inset->lyxCode())
+                  != codes.end()
+                  && (contents.empty() ||
+                      static_cast<InsetCommand *>(
+                                                       res.par()->getInset(res.pos()))->getContents()
+                      == contents)));
+
+       if (res.par()) {
+               setCursor(bv, res.par(), res.pos(), false);
+               return true;
+       }
+       return false;
+}
+
+
+void LyXText::gotoInset(BufferView * bv, vector<Inset::Code> const & codes,
+                                 bool same_content)
+{
+       bv->hideCursor();
+       bv->beforeChange(this);
+       update(bv, false);
+
+       string contents;
+       if (same_content && cursor.par()->isInset(cursor.pos())) {
+               Inset const * inset = cursor.par()->getInset(cursor.pos());
+               if (find(codes.begin(), codes.end(), inset->lyxCode())
+                   != codes.end())
+                       contents = static_cast<InsetCommand const *>(inset)->getContents();
+       }
+
+       if (!gotoNextInset(bv, codes, contents)) {
+               if (cursor.pos() || cursor.par() != ownerParagraph()) {
+                       LyXCursor tmp = cursor;
+                       cursor.par(ownerParagraph());
+                       cursor.pos(0);
+                       if (!gotoNextInset(bv, codes, contents)) {
+                               cursor = tmp;
+                               bv->owner()->message(_("No more insets"));
+                       }
+               } else {
+                       bv->owner()->message(_("No more insets"));
+               }
+       }
+       update(bv, false);
+       selection.cursor = cursor;
+}
+
+
+void LyXText::gotoInset(BufferView * bv, Inset::Code code, bool same_content)
+{
+       gotoInset(bv, vector<Inset::Code>(1, code), same_content);
+}
+
+
+void LyXText::cursorPrevious(BufferView * bv)
 {
-       if (!text->cursor.row()->previous()) {
-               if (text->first_y > 0) {
+       if (!cursor.row()->previous()) {
+               if (first_y > 0) {
                        int new_y = bv->text->first_y - bv->workarea().workHeight();
                        bv->screen().draw(bv->text, bv, new_y < 0 ? 0 : new_y);
                        bv->updateScrollbar();
@@ -48,10 +133,10 @@ void cursorPrevious(LyXText * text, BufferView * bv)
                return;
        }
 
-       int y = text->first_y;
-       Row * cursorrow = text->cursor.row();
+       int y = first_y;
+       Row * cursorrow = cursor.row();
 
-       text->setCursorFromCoordinates(bv, text->cursor.x_fix(), y);
+       setCursorFromCoordinates(bv, cursor.x_fix(), y);
        finishUndo();
 
        int new_y;
@@ -63,37 +148,37 @@ void cursorPrevious(LyXText * text, BufferView * bv)
                // is better than just jump down and only display part of the row.
                new_y = bv->text->first_y - bv->workarea().workHeight();
        } else {
-               if (text->inset_owner) {
+               if (inset_owner) {
                        new_y = bv->text->cursor.iy()
                                + bv->theLockingInset()->insetInInsetY() + y
-                               + text->cursor.row()->height()
+                               + cursor.row()->height()
                                - bv->workarea().workHeight() + 1;
                } else {
-                       new_y = text->cursor.y()
-                               - text->cursor.row()->baseline()
-                               + text->cursor.row()->height()
+                       new_y = cursor.y()
+                               - cursor.row()->baseline()
+                               + cursor.row()->height()
                                - bv->workarea().workHeight() + 1;
                }
        }
        bv->screen().draw(bv->text, bv, new_y < 0 ? 0 : new_y);
-       if (text->cursor.row()->previous()) {
+       if (cursor.row()->previous()) {
                LyXCursor cur;
-               text->setCursor(bv, cur, text->cursor.row()->previous()->par(),
-                                               text->cursor.row()->previous()->pos(), false);
-               if (cur.y() > text->first_y) {
-                       text->cursorUp(bv, true);
+               setCursor(bv, cur, cursor.row()->previous()->par(),
+                                               cursor.row()->previous()->pos(), false);
+               if (cur.y() > first_y) {
+                       cursorUp(bv, true);
                }
        }
        bv->updateScrollbar();
 }
 
 
-void cursorNext(LyXText * text, BufferView * bv)
+void LyXText::cursorNext(BufferView * bv)
 {
-       if (!text->cursor.row()->next()) {
-               int y = text->cursor.y() - text->cursor.row()->baseline() +
-                       text->cursor.row()->height();
-               if (y > int(text->first_y + bv->workarea().workHeight())) {
+       if (!cursor.row()->next()) {
+               int y = cursor.y() - cursor.row()->baseline() +
+                       cursor.row()->height();
+               if (y > int(first_y + bv->workarea().workHeight())) {
                        bv->screen().draw(bv->text, bv,
                                                  bv->text->first_y + bv->workarea().workHeight());
                        bv->updateScrollbar();
@@ -101,17 +186,17 @@ void cursorNext(LyXText * text, BufferView * bv)
                return;
        }
 
-       int y = text->first_y + bv->workarea().workHeight();
-       if (text->inset_owner && !text->first_y) {
+       int y = first_y + bv->workarea().workHeight();
+       if (inset_owner && !first_y) {
                y -= (bv->text->cursor.iy()
                          - bv->text->first_y
                          + bv->theLockingInset()->insetInInsetY());
        }
 
-       text->getRowNearY(y);
+       getRowNearY(y);
 
-       Row * cursorrow = text->cursor.row();
-       text->setCursorFromCoordinates(bv, text->cursor.x_fix(), y);
+       Row * cursorrow = cursor.row();
+       setCursorFromCoordinates(bv, cursor.x_fix(), y);
        // + workarea().workHeight());
        finishUndo();
 
@@ -124,28 +209,26 @@ void cursorNext(LyXText * text, BufferView * bv)
                // is better than just jump down and only display part of the row.
                new_y = bv->text->first_y + bv->workarea().workHeight();
        } else {
-               if (text->inset_owner) {
+               if (inset_owner) {
                        new_y = bv->text->cursor.iy()
                                + bv->theLockingInset()->insetInInsetY()
-                               + y - text->cursor.row()->baseline();
+                               + y - cursor.row()->baseline();
                } else {
-                       new_y =  text->cursor.y() - text->cursor.row()->baseline();
+                       new_y =  cursor.y() - cursor.row()->baseline();
                }
        }
        bv->screen().draw(bv->text, bv, new_y);
-       if (text->cursor.row()->next()) {
+       if (cursor.row()->next()) {
                LyXCursor cur;
-               text->setCursor(bv, cur, text->cursor.row()->next()->par(),
-                                               text->cursor.row()->next()->pos(), false);
-               if (cur.y() < int(text->first_y + bv->workarea().workHeight())) {
-                       text->cursorDown(bv, true);
+               setCursor(bv, cur, cursor.row()->next()->par(),
+                                               cursor.row()->next()->pos(), false);
+               if (cur.y() < int(first_y + bv->workarea().workHeight())) {
+                       cursorDown(bv, true);
                }
        }
        bv->updateScrollbar();
 }
 
-}
-
 
 void LyXText::update(BufferView * bv, bool changed)
 {
@@ -204,7 +287,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                update(bv, false);
                deleteWordForward(bv);
                update(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_DELETE_WORD_BACKWARD:
@@ -212,7 +295,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                update(bv, false);
                deleteWordBackward(bv);
                update(bv, true);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_DELETE_LINE_FORWARD:
@@ -220,7 +303,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                update(bv, false);
                deleteLineForward(bv);
                update(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_SHIFT_TAB:
@@ -229,7 +312,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                update(bv, false);
                cursorTab(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_WORDRIGHT:
@@ -240,7 +323,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        cursorLeftOneWord(bv);
                else
                        cursorRightOneWord(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_WORDLEFT:
@@ -251,7 +334,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        cursorRightOneWord(bv);
                else
                        cursorLeftOneWord(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_BEGINNINGBUF:
@@ -259,7 +342,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                update(bv, false);
                cursorTop(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_ENDBUF:
@@ -267,7 +350,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                update(bv, false);
                cursorBottom(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_RIGHTSEL:
@@ -276,7 +359,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        cursorLeft(bv);
                else
                        cursorRight(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_LEFTSEL:
@@ -285,55 +368,55 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        cursorRight(bv);
                else
                        cursorLeft(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_UPSEL:
                update(bv, false);
                cursorUp(bv, true);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_DOWNSEL:
                update(bv, false);
                cursorDown(bv, true);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_UP_PARAGRAPHSEL:
                update(bv, false);
                cursorUpParagraph(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_DOWN_PARAGRAPHSEL:
                update(bv, false);
                cursorDownParagraph(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_PRIORSEL:
                update(bv, false);
-               cursorPrevious(this, bv);
-               bv->finishChange(true);
+               cursorPrevious(bv);
+               finishChange(bv, true);
                break;
 
        case LFUN_NEXTSEL:
                update(bv, false);
-               cursorNext(this, bv);
-               bv->finishChange();
+               cursorNext(bv);
+               finishChange(bv, true);
                break;
 
        case LFUN_HOMESEL:
                update(bv, false);
                cursorHome(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_ENDSEL:
                update(bv, false);
                cursorEnd(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_WORDRIGHTSEL:
@@ -342,7 +425,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        cursorLeftOneWord(bv);
                else
                        cursorRightOneWord(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_WORDLEFTSEL:
@@ -351,7 +434,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        cursorRightOneWord(bv);
                else
                        cursorLeftOneWord(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_RIGHT: {
@@ -371,7 +454,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                }
                if (!is_rtl)
                        cursorRight(bv, false);
-               bv->finishChange(false);
+               finishChange(bv);
                break;
        }
 
@@ -396,7 +479,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                }
                if (is_rtl)
                        cursorRight(bv, false);
-               bv->finishChange(false);
+               finishChange(bv);
                break;
        }
 
@@ -405,7 +488,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                bv->update(this, BufferView::UPDATE);
                cursorUp(bv);
-               bv->finishChange(false);
+               finishChange(bv);
                break;
 
        case LFUN_DOWN:
@@ -413,7 +496,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                bv->update(this, BufferView::UPDATE);
                cursorDown(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_UP_PARAGRAPH:
@@ -421,7 +504,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                bv->update(this, BufferView::UPDATE);
                cursorUpParagraph(bv);
-               bv->finishChange();
+               finishChange(bv);
                break;
 
        case LFUN_DOWN_PARAGRAPH:
@@ -429,15 +512,15 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                bv->update(this, BufferView::UPDATE);
                cursorDownParagraph(bv);
-               bv->finishChange(false);
+               finishChange(bv, false);
                break;
 
        case LFUN_PRIOR:
                if (!selection.mark())
                        bv->beforeChange(this);
                bv->update(this, BufferView::UPDATE);
-               cursorPrevious(this, bv);
-               bv->finishChange(false);
+               cursorPrevious(bv);
+               finishChange(bv, false);
                // was:
                // finishUndo();
                // moveCursorUpdate(false, false);
@@ -448,8 +531,8 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                if (!selection.mark())
                        bv->beforeChange(this);
                bv->update(this, BufferView::UPDATE);
-               cursorNext(this, bv);
-               bv->finishChange(false);
+               cursorNext(bv);
+               finishChange(bv, false);
                break;
 
        case LFUN_HOME:
@@ -457,7 +540,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                update(bv);
                cursorHome(bv);
-               bv->finishChange(false);
+               finishChange(bv, false);
                break;
 
        case LFUN_END:
@@ -465,7 +548,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        bv->beforeChange(this);
                update(bv);
                cursorEnd(bv);
-               bv->finishChange(false);
+               finishChange(bv, false);
                break;
 
        case LFUN_BREAKLINE:
@@ -808,7 +891,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        return Inset::UNDISPATCHED;
                update(bv, false);
                cursorTop(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_ENDBUFSEL:
@@ -816,7 +899,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                        return Inset::UNDISPATCHED;
                update(bv, false);
                cursorBottom(bv);
-               bv->finishChange(true);
+               finishChange(bv, true);
                break;
 
        case LFUN_GETXY:
@@ -926,6 +1009,68 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd)
                break;
        }
 
+       case LFUN_GOTOERROR:
+               gotoInset(bv, Inset::ERROR_CODE, false);
+               break;
+
+       case LFUN_GOTONOTE:
+               gotoInset(bv, Inset::NOTE_CODE, false);
+               break;
+
+       case LFUN_REFERENCE_GOTO:
+       {
+               vector<Inset::Code> tmp;
+               tmp.push_back(Inset::LABEL_CODE);
+               tmp.push_back(Inset::REF_CODE);
+               gotoInset(bv, tmp, true);
+               break;
+       }
+
+       case LFUN_QUOTE: {
+               Paragraph const * par = cursor.par();
+               lyx::pos_type pos = cursor.pos();
+               char c;
+
+               if (!pos)
+                       c = ' ';
+               else if (par->isInset(pos - 1) && par->getInset(pos - 1)->isSpace())
+                       c = ' ';
+               else
+                       c = par->getChar(pos - 1);
+
+               bv->hideCursor();
+               LyXLayout_ptr const & style = par->layout();
+
+               if (style->pass_thru ||
+                               par->getFontSettings(bv->buffer()->params,
+                                        pos).language()->lang() == "hebrew" ||
+                       (!bv->insertInset(new InsetQuotes(c, bv->buffer()->params))))
+                       bv->owner()->dispatch(FuncRequest(LFUN_SELFINSERT, "\""));
+               break;
+       }
+
+       case LFUN_DATE_INSERT:  { // jdblair: date-insert cmd
+               time_t now_time_t = time(NULL);
+               struct tm * now_tm = localtime(&now_time_t);
+               setlocale(LC_TIME, "");
+               string arg;
+               if (!cmd.argument.empty())
+                       arg = cmd.argument;
+               else
+                       arg = lyxrc.date_insert_format;
+               char datetmp[32];
+               int const datetmp_len =
+                       ::strftime(datetmp, 32, arg.c_str(), now_tm);
+
+               for (int i = 0; i < datetmp_len; i++) {
+                       insertChar(bv, datetmp[i]);
+                       update(bv, true);
+               }
+               selection.cursor = cursor;
+               bv->moveCursorUpdate(false);
+               break;
+       }
+
        case LFUN_SELFINSERT: {
                if (cmd.argument.empty())
                        break;