]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Prevent warning when pressing OKAY while the dialog is in AUTOAPPLY_INITIAL state...
[lyx.git] / src / Text3.cpp
index 08827fe31ba678669e8291dac34968c7a5ea4369..f306a6d2de1eb862c69e8ef2ba4f09d2174b7522 100644 (file)
@@ -25,6 +25,7 @@
 #include "buffer_funcs.h"
 #include "BufferParams.h"
 #include "BufferView.h"
+#include "Changes.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
 #include "DispatchResult.h"
@@ -68,6 +69,7 @@
 #include "support/gettext.h"
 #include "support/lstrings.h"
 #include "support/lyxtime.h"
+#include "support/os.h"
 
 #include "mathed/InsetMathHull.h"
 #include "mathed/MathMacroTemplate.h"
@@ -447,8 +449,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        BufferView * bv = &cur.bv();
        TextMetrics & tm = bv->textMetrics(this);
-       if (!tm.contains(cur.pit()))
-               lyx::dispatch(FuncRequest(LFUN_SCREEN_RECENTER));
+       if (!tm.contains(cur.pit())) {
+               lyx::dispatch(FuncRequest(LFUN_SCREEN_SHOW_CURSOR));
+               tm = bv->textMetrics(this);
+       }
 
        // FIXME: We use the update flag to indicates wether a singlePar or a
        // full screen update is needed. We reset it here but shall we restore it
@@ -559,6 +563,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.updateFlags(Update::FitCursor);
                break;
 
+       case LFUN_INSET_BEGIN:
+       case LFUN_INSET_BEGIN_SELECT:
+               needsUpdate |= cur.selHandle(cmd.action == LFUN_INSET_BEGIN_SELECT);
+               if (cur.depth() == 1 || cur.pos() > 0)
+                       needsUpdate |= cursorTop(cur);
+               else
+                       cur.undispatched();
+               cur.updateFlags(Update::FitCursor);
+               break;
+
+       case LFUN_INSET_END:
+       case LFUN_INSET_END_SELECT:
+               needsUpdate |= cur.selHandle(cmd.action == LFUN_INSET_END_SELECT);
+               if (cur.depth() == 1 || cur.pos() < cur.lastpos())
+                       needsUpdate |= cursorBottom(cur);
+               else
+                       cur.undispatched();
+               cur.updateFlags(Update::FitCursor);
+               break;
+
        case LFUN_CHAR_FORWARD:
        case LFUN_CHAR_FORWARD_SELECT:
                //LYXERR0(" LFUN_CHAR_FORWARD[SEL]:\n" << cur);
@@ -922,24 +946,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_INSET_SETTINGS: {
-               Inset & inset = cur.inset();
-               if (cmd.getArg(0) == insetName(inset.lyxCode())) {
-                       // This inset dialog has been explicitely requested.
-                       inset.showInsetDialog(bv);
-                       break;
-               }
-               // else, if there is an inset at the cursor, access this
-               Inset * next_inset = cur.nextInset();
-               if (next_inset) {
-                       next_inset->showInsetDialog(bv);
-                       break;
-               }
-               // if not then access the underlying inset.
-               inset.showInsetDialog(bv);
-               break;
-       }
-
        case LFUN_SET_GRAPHICS_GROUP: {
                InsetGraphics * ins = graphics::getCurrentGraphicsInset(cur);
                if (!ins)
@@ -1040,6 +1046,11 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                type = Clipboard::JpegGraphicsType;
                        else if (arg == "linkback")
                                type = Clipboard::LinkBackGraphicsType;
+                       else if (arg == "emf")
+                               type = Clipboard::EmfGraphicsType;
+                       else if (arg == "wmf")
+                               type = Clipboard::WmfGraphicsType;
+
                        else
                                LASSERT(false, /**/);
 
@@ -1187,7 +1198,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                pos_type pos = cur.pos();
                BufferParams const & bufparams = bv->buffer().params();
                Layout const & style = par.layout();
-               if (!style.pass_thru
+               InsetLayout const & ilayout = cur.inset().getLayout(bufparams);
+               if (!style.pass_thru && !ilayout.isPassThru()
                    && par.getFontSettings(bufparams, pos).language()->lang() != "hebrew") {
                        // this avoids a double undo
                        // FIXME: should not be needed, ideally
@@ -1383,6 +1395,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                cur.resetAnchor();
                moveCursor(cur, false);
+               bv->bookmarkEditPosition();
                break;
        }
 
@@ -1445,6 +1458,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_FLEX_INSERT:
        case LFUN_BOX_INSERT:
        case LFUN_BRANCH_INSERT:
+       case LFUN_PHANTOM_INSERT:
        case LFUN_ERT_INSERT:
        case LFUN_LISTING_INSERT:
        case LFUN_MARGINALNOTE_INSERT:
@@ -1529,7 +1543,18 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_INDEX_PRINT:
+       case LFUN_INDEX_PRINT: {
+               InsetCommandParams p(INDEX_PRINT_CODE);
+               if (cmd.argument().empty())
+                       p["type"] = from_ascii("idx");
+               else
+                       p["type"] = cmd.argument();
+               string const data = InsetCommand::params2string("index_print", p);
+               FuncRequest fr(LFUN_INSET_INSERT, data);
+               dispatch(cur, fr);
+               break;
+       }
+
        case LFUN_NOMENCL_PRINT:
        case LFUN_TOC_INSERT:
        case LFUN_LINE_INSERT:
@@ -1998,12 +2023,16 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        code = INCLUDE_CODE;
                else if (cmd.argument() == "index")
                        code = INDEX_CODE;
+               else if (cmd.argument() == "index_print")
+                       code = INDEX_PRINT_CODE;
                else if (cmd.argument() == "nomenclature")
                        code = NOMENCL_CODE;
                else if (cmd.argument() == "label")
                        code = LABEL_CODE;
                else if (cmd.argument() == "note")
                        code = NOTE_CODE;
+               else if (cmd.argument() == "phantom")
+                       code = PHANTOM_CODE;
                else if (cmd.argument() == "ref")
                        code = REF_CODE;
                else if (cmd.argument() == "space")
@@ -2082,6 +2111,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                if (cur.buffer()->masterBuffer()->params().branchlist().empty())
                        enable = false;
                break;
+       case LFUN_PHANTOM_INSERT:
+               code = PHANTOM_CODE;
+               break;
        case LFUN_LABEL_INSERT:
                code = LABEL_CODE;
                break;
@@ -2193,11 +2225,14 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                }
 
                // explicit graphics type?
-               if ((arg == "pdf" && theClipboard().hasGraphicsContents(Clipboard::PdfGraphicsType))
-                   || (arg == "png" && theClipboard().hasGraphicsContents(Clipboard::PngGraphicsType))
-                   || (arg == "jpeg" && theClipboard().hasGraphicsContents(Clipboard::JpegGraphicsType))
-                   || (arg == "linkback" && theClipboard().hasGraphicsContents(Clipboard::LinkBackGraphicsType))) {
-                       enable = true;
+               Clipboard::GraphicsType type = Clipboard::AnyGraphicsType;
+               if ((arg == "pdf" && (type = Clipboard::PdfGraphicsType))
+                         || (arg == "png" && (type = Clipboard::PngGraphicsType))
+                         || (arg == "jpeg" && (type = Clipboard::JpegGraphicsType))
+                         || (arg == "linkback" &&  (type = Clipboard::LinkBackGraphicsType))
+                         || (arg == "emf" &&  (type = Clipboard::EmfGraphicsType))
+                         || (arg == "wmf" &&  (type = Clipboard::WmfGraphicsType))) {
+                       enable = theClipboard().hasGraphicsContents(type);
                        break;
                }
 
@@ -2243,13 +2278,18 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_CHANGE_ACCEPT:
        case LFUN_CHANGE_REJECT:
-               // TODO: context-sensitive enabling of LFUN_CHANGE_ACCEPT/REJECT
                // In principle, these LFUNs should only be enabled if there
                // is a change at the current position/in the current selection.
                // However, without proper optimizations, this will inevitably
                // result in unacceptable performance - just imagine a user who
                // wants to select the complete content of a long document.
-               enable = true;
+               if (!cur.selection()) {
+                       Change const & change = cur.paragraph().lookupChange(cur.pos());
+                       enable = change.changed();
+               } else
+                       // TODO: context-sensitive enabling of LFUN_CHANGE_ACCEPT/REJECT
+                       // for selections.
+                       enable = true;
                break;
 
        case LFUN_OUTLINE_UP:
@@ -2280,6 +2320,21 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                enable = !inDescriptionItem(cur);
                break;
 
+       case LFUN_MATH_INSERT:
+       case LFUN_MATH_MATRIX:
+       case LFUN_MATH_DELIM:
+       case LFUN_MATH_BIGDELIM:
+               // not allowed in ERT, for example.
+               enable = cur.inset().insetAllowed(MATH_CODE);
+               break;
+
+       case LFUN_DATE_INSERT: {
+               string const format = cmd.argument().empty()
+                       ? lyxrc.date_insert_format : to_utf8(cmd.argument());
+               enable = support::os::is_valid_strftime(format);
+               break;
+       }
+
        case LFUN_WORD_DELETE_FORWARD:
        case LFUN_WORD_DELETE_BACKWARD:
        case LFUN_LINE_DELETE:
@@ -2325,16 +2380,11 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_SERVER_SET_XY:
        case LFUN_SERVER_GET_LAYOUT:
        case LFUN_LAYOUT:
-       case LFUN_DATE_INSERT:
        case LFUN_SELF_INSERT:
        case LFUN_LINE_INSERT:
        case LFUN_MATH_DISPLAY:
        case LFUN_MATH_MODE:
        case LFUN_MATH_MACRO:
-       case LFUN_MATH_MATRIX:
-       case LFUN_MATH_DELIM:
-       case LFUN_MATH_BIGDELIM:
-       case LFUN_MATH_INSERT:
        case LFUN_MATH_SUBSCRIPT:
        case LFUN_MATH_SUPERSCRIPT:
        case LFUN_FONT_DEFAULT:
@@ -2365,10 +2415,14 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_PARAGRAPH_PARAMS_APPLY:
        case LFUN_PARAGRAPH_PARAMS:
        case LFUN_ESCAPE:
-       case LFUN_BUFFER_END:
        case LFUN_BUFFER_BEGIN:
+       case LFUN_BUFFER_END:
        case LFUN_BUFFER_BEGIN_SELECT:
        case LFUN_BUFFER_END_SELECT:
+       case LFUN_INSET_BEGIN:
+       case LFUN_INSET_END:
+       case LFUN_INSET_BEGIN_SELECT:
+       case LFUN_INSET_END_SELECT:
        case LFUN_UNICODE_INSERT:
                // these are handled in our dispatch()
                enable = true;