]> git.lyx.org Git - lyx.git/blobdiff - src/text3.C
Rearrange GTK icon lookup code, get rid of comboBoxTextSet
[lyx.git] / src / text3.C
index 671f7e6cc4cbbaca2af6d090b701478b01f77533..1dc903f7cf3006e262ede13f7cb3ab0a28d783d9 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "lyxtext.h"
 
+#include "BranchList.h"
 #include "FloatList.h"
 #include "FuncStatus.h"
 #include "buffer.h"
@@ -192,8 +193,10 @@ bool LyXText::cursorPrevious(LCursor & cur)
 
        int x = cur.x_target();
 
-       setCursorFromCoordinates(cur, x, 0);
-       bool updated = cursorUp(cur);
+       bool updated = setCursorFromCoordinates(cur, x, 0);
+       if (updated)
+               cur.bv().update();
+       updated |= cursorUp(cur);
 
        if (cpar == cur.pit() && cpos == cur.pos()) {
                // we have a row which is taller than the workarea. The
@@ -213,8 +216,10 @@ bool LyXText::cursorNext(LCursor & cur)
        lyx::pit_type cpar = cur.pit();
 
        int x = cur.x_target();
-       setCursorFromCoordinates(cur, x, cur.bv().workHeight() - 1);
-       bool updated = cursorDown(cur);
+       bool updated = setCursorFromCoordinates(cur, x, cur.bv().workHeight() - 1);
+       if (updated)
+               cur.bv().update();
+       updated |= cursorDown(cur);
 
        if (cpar == cur.pit() && cpos == cur.pos()) {
                // we have a row which is taller than the workarea. The
@@ -303,8 +308,8 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        // Signals that a full-screen update is required
        bool needsUpdate = !(lyxaction.funcHasFlag(cmd.action, 
                LyXAction::NoUpdate) || singleParUpdate);
-       // Remember the old paragraph metric
-       Dimension olddim = cur.paragraph().dim();
+       // Remember the old paragraph metric (_outer_ paragraph!)
+       Dimension olddim = cur.bottom().paragraph().dim();
 
        switch (cmd.action) {
 
@@ -616,7 +621,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_DELETE:
                if (!cur.selection()) {
-                       Delete(cur);
+                       needsUpdate = Delete(cur);
                        cur.resetAnchor();
                        // It is possible to make it a lot faster still
                        // just comment out the line below...
@@ -644,7 +649,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_BACKSPACE:
                if (!cur.selection()) {
                        if (bv->owner()->getIntl().getTransManager().backspace()) {
-                               backspace(cur);
+                               needsUpdate = backspace(cur);
                                cur.resetAnchor();
                                // It is possible to make it a lot faster still
                                // just comment out the line below...
@@ -751,20 +756,26 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_NEXT_INSET_TOGGLE: {
                InsetBase * inset = cur.nextInset();
+               // this is the real function we want to invoke
+               cmd = FuncRequest(LFUN_INSET_TOGGLE);
+               cur.undispatched();
+               // if there is an inset at cursor, see whether it
+               // wants to toggle.
                if (inset) {
-                       cur.clearSelection();
-                       FuncRequest fr = cmd;
-                       fr.action = LFUN_INSET_TOGGLE;
-                       inset->dispatch(cur, fr);
+                       LCursor tmpcur = cur;
+                       tmpcur.pushLeft(*inset);
+                       inset->dispatch(tmpcur, cmd);
+                       if (tmpcur.result().dispatched()) {
+                               cur.clearSelection();
+                               cur.dispatched();
+                       }
                }
+               // if it did not work, try the underlying inset.
+               if (!cur.result().dispatched())
+                       cur.inset().dispatch(cur, cmd);
                break;
        }
 
-       case LFUN_KEYMAP_TOGGLE:
-               cur.clearSelection();
-               bv->switchKeyMap();
-               break;
-
        case LFUN_SPACE_INSERT:
                if (cur.paragraph().layout()->free_spacing)
                        insertChar(cur, ' ');
@@ -814,9 +825,6 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_PASTE:
                cur.message(_("Paste"));
                lyx::cap::replaceSelection(cur);
-#ifdef WITH_WARNINGS
-#warning FIXME Check if the arg is in the domain of available selections.
-#endif
                if (isStrUnsignedInt(cmd.argument))
                        pasteSelection(cur, convert<unsigned int>(cmd.argument));
                else
@@ -960,12 +968,10 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                                cur.insert(new InsetQuotes(c,
                                    bufparams.quotes_language,
                                    InsetQuotes::SingleQ));
-                       else if (arg == "double")
+                       else
                                cur.insert(new InsetQuotes(c,
                                    bufparams.quotes_language,
                                    InsetQuotes::DoubleQ));
-                       else
-                               cur.insert(new InsetQuotes(c, bufparams));
                        cur.posRight();
                }
                else
@@ -1019,20 +1025,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                        paste_internally = true;
                }
 
-               // Clear the selection
-               cur.clearSelection();
-
-               setCursorFromCoordinates(cur, cmd.x, cmd.y);
-               cur.resetAnchor();
-               finishUndo();
-               cur.setTargetX();
-
-               // Has the cursor just left the inset?
-               if (bv->cursor().inMathed() && !cur.inMathed())
-                       bv->cursor().inset().notifyCursorLeaves(bv->cursor());
-
-               // Set cursor here.
-               bv->cursor() = cur;
+               bv->mouseSetCursor(cur);
 
                // Insert primary selection with middle mouse
                // if there is a local selection in the current buffer,
@@ -1121,12 +1114,6 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                cur.clearSelection();
                LyXFont const old_font = real_current_font;
 
-               // Prevents language turds in new lyxtexts under non-english
-               BufferParams const & bufparams = cur.buffer().params();
-               Language const * lang = cur.paragraph().getParLanguage(bufparams);
-               current_font.setLanguage(lang);
-               real_current_font.setLanguage(lang);
-
                string::const_iterator cit = cmd.argument.begin();
                string::const_iterator end = cmd.argument.end();
                for (; cit != end; ++cit)
@@ -1211,11 +1198,18 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                cur.dispatch(FuncRequest(LFUN_LAYOUT, "Caption"));
                break;
 
-       case LFUN_INDEX_INSERT:
-               // Just open the inset
-               doInsertInset(cur, this, cmd, true, false);
+       case LFUN_INDEX_INSERT: {
+               InsetBase * inset = createInset(&cur.bv(), cmd);
+               if (!inset)
+                       break;
+
+               recordUndo(cur);
+               cur.clearSelection();
+               insertInset(cur, inset);
+               inset->edit(cur, true);
                cur.posRight();
                break;
+       }
 
        case LFUN_INDEX_PRINT:
        case LFUN_TOC_INSERT:
@@ -1405,8 +1399,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                params2string(cur.paragraph(), data);
 
                // Will the paragraph accept changes from the dialog?
-               InsetBase & inset = cur.inset();
-               bool const accept = !inset.forceDefaultParagraphs(&inset);
+               bool const accept = !cur.inset().forceDefaultParagraphs(cur.idx());
 
                data = "update " + convert<string>(accept) + '\n' + data;
                bv->owner()->getDialogs().update("paragraph", data);
@@ -1532,8 +1525,8 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        if (singleParUpdate)
                // Inserting characters does not change par height
-               if (cur.paragraph().dim().asc == olddim.asc
-                && cur.paragraph().dim().des == olddim.des) {
+               if (cur.bottom().paragraph().dim().height() 
+                   == olddim.height()) {
                        // if so, update _only_ this paragraph
                        cur.bv().update(Update::SinglePar | Update::Force);
                } else
@@ -1553,8 +1546,10 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                        FuncStatus & flag) const
 {
        BOOST_ASSERT(cur.text() == this);
+
        LyXFont const & font = real_current_font;
        bool enable = true;
+       InsetBase::Code code = InsetBase::NO_CODE;
 
        switch (cmd.action) {
 
@@ -1566,11 +1561,6 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                enable = changeDepthAllowed(cur, INC_DEPTH);
                break;
 
-       case LFUN_INSET_OPTARG:
-               enable = numberOfOptArgs(cur.paragraph())
-                       < cur.paragraph().layout()->optionalargs;
-               break;
-
        case LFUN_APPENDIX:
                flag.setOnOff(cur.paragraph().params().startOfAppendix());
                return true;
@@ -1579,10 +1569,6 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                enable = (cur.paragraph().layout()->labeltype == LABEL_BIBLIO);
                break;
 
-#if 0
-       // the functions which insert insets
-       InsetBase::Code code = InsetBase::NO_CODE;
-       switch (cmd.action) {
        case LFUN_DIALOG_SHOW_NEW_INSET:
                if (cmd.argument == "bibitem")
                        code = InsetBase::BIBITEM_CODE;
@@ -1660,7 +1646,7 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                break;
        case LFUN_INSERT_CHARSTYLE:
                code = InsetBase::CHARSTYLE_CODE;
-               if (buf->params().getLyXTextClass().charstyles().empty())
+               if (cur.buffer().params().getLyXTextClass().charstyles().empty())
                        enable = false;
                break;
        case LFUN_INSERT_BOX:
@@ -1668,7 +1654,7 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                break;
        case LFUN_INSERT_BRANCH:
                code = InsetBase::BRANCH_CODE;
-               if (buf->params().branchlist().empty())
+               if (cur.buffer().getMasterBuffer()->params().branchlist().empty())
                        enable = false;
                break;
        case LFUN_INSERT_LABEL:
@@ -1676,6 +1662,8 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                break;
        case LFUN_INSET_OPTARG:
                code = InsetBase::OPTARG_CODE;
+               enable = numberOfOptArgs(cur.paragraph())
+                       < cur.paragraph().layout()->optionalargs;
                break;
        case LFUN_ENVIRONMENT_INSERT:
                code = InsetBase::BOX_CODE;
@@ -1710,6 +1698,11 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                if (cur.inTexted())
                        code = InsetBase::SPACE_CODE;
                break;
+
+#ifdef WITH_WARNINGS
+#warning This LFUN is not used anymore and should be nuked (JMarc 29/10/2005)
+#endif
+#if 0
        case LFUN_INSET_DIALOG_SHOW: {
                InsetBase * inset = cur.nextInset();
                enable = inset;
@@ -1723,37 +1716,8 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                }
                break;
        }
-       default:
-               break;
-       }
-
-       if (code != InsetBase::NO_CODE
-                       && (cur.empty() || !cur.inset().insetAllowed(code)))
-               enable = false;
-
 #endif
 
-       case LFUN_DIALOG_SHOW_NEW_INSET:
-       case LFUN_INSET_ERT:
-       case LFUN_INSERT_BOX:
-       case LFUN_INSERT_BRANCH:
-       case LFUN_ENVIRONMENT_INSERT:
-       case LFUN_INDEX_INSERT:
-       case LFUN_INDEX_PRINT:
-       case LFUN_TOC_INSERT:
-       case LFUN_HTMLURL:
-       case LFUN_URL:
-       case LFUN_QUOTE:
-       case LFUN_HYPHENATION:
-       case LFUN_LIGATURE_BREAK:
-       case LFUN_HFILL:
-       case LFUN_MENU_SEPARATOR:
-       case LFUN_LDOTS:
-       case LFUN_END_OF_SENTENCE:
-       case LFUN_SPACE_INSERT:
-       case LFUN_INSET_DIALOG_SHOW:
-               break;
-
        case LFUN_INSET_MODIFY:
                // We need to disable this, because we may get called for a
                // tabular cell via
@@ -1786,6 +1750,15 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
                flag.setOnOff(font.family() == LyXFont::TYPEWRITER_FAMILY);
                return true;
 
+       case LFUN_CUT:
+       case LFUN_COPY:
+               enable = cur.selection();
+               break;
+
+       case LFUN_PASTE:
+               enable = lyx::cap::numberOfSelections() > 0;
+               break;
+
        case LFUN_DELETE_WORD_FORWARD:
        case LFUN_DELETE_WORD_BACKWARD:
        case LFUN_DELETE_LINE_FORWARD:
@@ -1829,9 +1802,6 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
        case LFUN_LOWCASE_WORD:
        case LFUN_CAPITALIZE_WORD:
        case LFUN_TRANSPOSE_CHARS:
-       case LFUN_PASTE:
-       case LFUN_CUT:
-       case LFUN_COPY:
        case LFUN_GETXY:
        case LFUN_SETXY:
        case LFUN_GETFONT:
@@ -1840,15 +1810,6 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
        case LFUN_PASTESELECTION:
        case LFUN_DATE_INSERT:
        case LFUN_SELFINSERT:
-       case LFUN_INSERT_LABEL:
-       case LFUN_INSERT_NOTE:
-       case LFUN_INSERT_CHARSTYLE:
-       case LFUN_INSET_FLOAT:
-       case LFUN_INSET_FOOTNOTE:
-       case LFUN_INSET_MARGINAL:
-       case LFUN_INSET_WIDE_FLOAT:
-       case LFUN_INSET_WRAP:
-       case LFUN_TABULAR_INSERT:
        case LFUN_INSERT_LINE:
        case LFUN_INSERT_PAGEBREAK:
        case LFUN_MATH_DISPLAY:
@@ -1885,13 +1846,11 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
        case LFUN_HUNG_UMLAUT:
        case LFUN_CIRCLE:
        case LFUN_OGONEK:
-       case LFUN_FLOAT_LIST:
        case LFUN_ACCEPT_CHANGE:
        case LFUN_REJECT_CHANGE:
        case LFUN_THESAURUS_ENTRY:
        case LFUN_PARAGRAPH_APPLY:
        case LFUN_ESCAPE:
-       case LFUN_KEYMAP_TOGGLE:
        case LFUN_ENDBUF:
        case LFUN_BEGINNINGBUF:
        case LFUN_BEGINNINGBUFSEL:
@@ -1903,6 +1862,11 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd,
        default:
                return false;
        }
+
+       if (code != InsetBase::NO_CODE
+           && (cur.empty() || !cur.inset().insetAllowed(code)))
+               enable = false;
+
        flag.enabled(enable);
        return true;
 }