]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
redraw fix 1.
[lyx.git] / src / lyxfunc.C
index e71a977d1db6b0d9d3221eea704a0aca003be7d8..d1d920895f6c30ff25165657037550bbfdb3a041 100644 (file)
@@ -20,7 +20,7 @@
 #include "lyxrow.h"
 #include "bufferlist.h"
 #include "BufferView.h"
-#include "ColorHandler.h"
+#include "frontends/xforms/ColorHandler.h"
 #include "lyxserver.h"
 #include "intl.h"
 #include "lyx_main.h"
 #include "trans_mgr.h"
 #include "layout.h"
 #include "bufferview_funcs.h"
-#include "minibuffer.h"
+#include "frontends/MiniBuffer.h"
 #include "vspace.h"
-#include "LyXView.h"
+#include "frontends/LyXView.h"
 #include "FloatList.h"
 #include "converter.h"
 #include "exporter.h"
 #include "importer.h"
-#include "FontLoader.h"
+#include "frontends/font_loader.h"
 #include "TextCache.h"
 #include "lyxfind.h"
 #include "undo_funcs.h"
@@ -165,7 +165,7 @@ LyXFunc::LyXFunc(LyXView * o)
        keyseq(toplevel_keymap.get(), toplevel_keymap.get()),
        cancel_meta_seq(toplevel_keymap.get(), toplevel_keymap.get())
 {
-       meta_fake_bit = 0;
+       meta_fake_bit = key_modifier::none;
        lyx_dead_action = LFUN_NOACTION;
        lyx_calling_dead_action = LFUN_NOACTION;
 }
@@ -204,13 +204,13 @@ void LyXFunc::moveCursorUpdate(bool flag, bool selecting)
 
 void LyXFunc::handleKeyFunc(kb_action action)
 {
-       char c = keyseq.getiso();
+       char c = keyseq.getLastKeyEncoded();
 
        if (keyseq.length() > 1) {
                c = 0;
        }
 
-       owner->getIntl()->getTrans()
+       owner->getIntl()->getTransManager()
                .deadkey(c, get_accent(action).accent, TEXT(false));
        // Need to clear, in case the minibuffer calls these
        // actions
@@ -222,33 +222,24 @@ void LyXFunc::handleKeyFunc(kb_action action)
 }
 
 
-void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
+void LyXFunc::processKeySym(LyXKeySymPtr keysym,
+                           key_modifier::state state)
 {
        string argument;
 
        if (lyxerr.debugging(Debug::KEY)) {
-               char const * tmp = XKeysymToString(keysym);
-               string const stm = (tmp ? tmp : "");
                lyxerr << "KeySym is "
-                      << stm
-                      << "["
-                      << keysym << "] State is ["
-                      << state << "]"
+                      << keysym->getSymbolName()
                       << endl;
        }
        // Do nothing if we have nothing (JMarc)
-       if (keysym == NoSymbol) {
+       if ( ! keysym->isOK() ) {
                lyxerr[Debug::KEY] << "Empty kbd action (probably composing)"
                                   << endl;
                return;
        }
 
-       // Can we be sure that this will work for all X Window
-       // implementations? (Lgb)
-       // This code snippet makes lyx ignore some keys. Perhaps
-       // all of them should be explictly mentioned?
-       if ((keysym >= XK_Shift_L && keysym <= XK_Hyper_R)
-           || keysym == XK_Mode_switch || keysym == 0x0) {
+       if (keysym->isModifier()) {
                return;
        }
 
@@ -256,33 +247,24 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
        // cancel and meta-fake keys. RVDK_PATCH_5
        cancel_meta_seq.reset();
 
-       int action = cancel_meta_seq.addkey(keysym, state
-                                           &(ShiftMask|ControlMask
-                                             |Mod1Mask));
+       int action = cancel_meta_seq.addkey(keysym, state);
        if (lyxerr.debugging(Debug::KEY)) {
                lyxerr << "action first set to [" << action << "]" << endl;
        }
 
        // When not cancel or meta-fake, do the normal lookup.
        // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards.
-       // Mostly, meta_fake_bit = 0. RVDK_PATCH_5.
+       // Mostly, meta_fake_bit = key_modifier::none. RVDK_PATCH_5.
        if ((action != LFUN_CANCEL) && (action != LFUN_META_FAKE)) {
-               if (lyxerr.debugging(Debug::KEY)) {
-                       lyxerr << "meta_fake_bit is ["
-                              << meta_fake_bit << "]" << endl;
-               }
                // remove Caps Lock and Mod2 as a modifiers
-               action = keyseq.addkey(keysym,
-                                      (state | meta_fake_bit)
-                                      &(ShiftMask|ControlMask
-                                        |Mod1Mask));
+               action = keyseq.addkey(keysym, (state | meta_fake_bit));
                if (lyxerr.debugging(Debug::KEY)) {
                        lyxerr << "action now set to ["
                               << action << "]" << endl;
                }
        }
        // Dont remove this unless you know what you are doing.
-       meta_fake_bit = 0;
+       meta_fake_bit = key_modifier::none;
 
        // can this happen now ?
        if (action == LFUN_NOACTION) {
@@ -307,7 +289,7 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
        if (action == LFUN_UNKNOWN_ACTION) {
                // It is unknown, but what if we remove all
                // the modifiers? (Lgb)
-               action = keyseq.addkey(keysym, 0);
+               action = keyseq.addkey(keysym, key_modifier::none);
 
                if (lyxerr.debugging(Debug::KEY)) {
                        lyxerr << "Removing modifiers...\n"
@@ -322,20 +304,18 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
 
        if (action == LFUN_SELFINSERT) {
                // This is very X dependent.
-               unsigned int c = keysym;
+               char c = keysym->getISOEncoded();
                string argument;
 
-               c = kb_keymap::getiso(c);
-
-               if (c > 0)
-                       argument = static_cast<char>(c);
+               if (c != 0)
+                       argument = c;
 
                dispatch(LFUN_SELFINSERT, argument);
                lyxerr[Debug::KEY] << "SelfInsert arg[`"
                                   << argument << "']" << endl;
-       }
-       else
+       } else {
                verboseDispatch(action, false);
+       }
 }
 
 
@@ -491,7 +471,7 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                break;
        }
        case LFUN_MATH_VALIGN:
-               if (mathcursor) {
+               if (mathcursor && mathcursor->formula()->hullType() != "simple") {
                        char align = mathcursor->valign();
                        if (align == '\0') {
                                disable = true;
@@ -511,7 +491,7 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                break;
 
        case LFUN_MATH_HALIGN:
-               if (mathcursor) {
+               if (mathcursor && mathcursor->formula()->hullType() != "simple") {
                        char align = mathcursor->halign();
                        if (align == '\0') {
                                disable = true;
@@ -531,20 +511,9 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                break;
 
        case LFUN_MATH_MUTATE:
-               if (tli && (tli->lyxCode() == Inset::MATH_CODE)) {
-                       MathInsetTypes type = mathcursor->formula()->getType();
-                       if (argument == "inline") {
-                               flag.setOnOff(type == LM_OT_SIMPLE);
-                       } else if (argument == "display") {
-                               flag.setOnOff(type == LM_OT_EQUATION);
-                       } else if (argument == "eqnarray") {
-                               flag.setOnOff(type == LM_OT_EQNARRAY);
-                       } else if (argument == "align") {
-                               flag.setOnOff(type == LM_OT_ALIGN);
-                       } else {
-                               disable = true;
-                       }
-               } else
+               if (tli && (tli->lyxCode() == Inset::MATH_CODE))
+                       flag.setOnOff(mathcursor->formula()->hullType() == argument);
+               else
                        disable = true;
                break;
 
@@ -563,7 +532,8 @@ FuncStatus LyXFunc::getStatus(kb_action action,
        case LFUN_MATH_ROW_DELETE:
        case LFUN_MATH_COLUMN_INSERT:
        case LFUN_MATH_COLUMN_DELETE:
-               disable = !mathcursor || !mathcursor->halign();
+               disable = !mathcursor || !mathcursor->halign() ||
+                       mathcursor->formula()->hullType() == "simple";
                break;
 
        default:
@@ -630,8 +600,6 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                code = Inset::BIBTEX_CODE;
                break;
        case LFUN_INDEX_INSERT:
-       case LFUN_INDEX_INSERT_LAST:
-       case LFUN_INDEX_CREATE:
                code = Inset::INDEX_CODE;
                break;
        case LFUN_INDEX_PRINT:
@@ -727,28 +695,28 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                }
        }
        else {
-               MathTextCodes tc = mathcursor->getLastCode();
+               string tc = mathcursor->getLastCode();
                switch (action) {
                case LFUN_BOLD:
-                       flag.setOnOff(tc == LM_TC_BF);
+                       flag.setOnOff(tc == "mathbf");
                        break;
                case LFUN_SANS:
-                       flag.setOnOff(tc == LM_TC_SF);
+                       flag.setOnOff(tc == "mathsf");
                        break;
                case LFUN_EMPH:
-                       flag.setOnOff(tc == LM_TC_CAL);
+                       flag.setOnOff(tc == "mathcal");
                        break;
                case LFUN_ROMAN:
-                       flag.setOnOff(tc == LM_TC_RM);
+                       flag.setOnOff(tc == "mathrm");
                        break;
                case LFUN_CODE:
-                       flag.setOnOff(tc == LM_TC_TT);
+                       flag.setOnOff(tc == "mathtt");
                        break;
                case LFUN_NOUN:
-                       flag.setOnOff(tc == LM_TC_BB);
+                       flag.setOnOff(tc == "mathbb");
                        break;
                case LFUN_DEFAULT:
-                       flag.setOnOff(tc == LM_TC_VAR);
+                       flag.setOnOff(tc == "mathnormal");
                        break;
                default:
                        break;
@@ -804,42 +772,40 @@ void LyXFunc::verboseDispatch(kb_action action,
 
        commandshortcut.erase();
 
-       if (lyxrc.display_shortcuts && show_sc) {
-               if (action != LFUN_SELFINSERT) {
-                       // Put name of command and list of shortcuts
-                       // for it in minibuffer
-                       string comname = lyxaction.getActionName(action);
+       if (show_sc && action != LFUN_SELFINSERT) {
+               // Put name of command and list of shortcuts
+               // for it in minibuffer
+               string comname = lyxaction.getActionName(action);
 
-                       int pseudoaction = action;
-                       bool argsadded = false;
+               int pseudoaction = action;
+               bool argsadded = false;
 
-                       if (!argument.empty()) {
-                               // the pseudoaction is useful for the bindings
-                               pseudoaction =
-                                       lyxaction.searchActionArg(action,
-                                                                 argument);
+               if (!argument.empty()) {
+                       // the pseudoaction is useful for the bindings
+                       pseudoaction =
+                               lyxaction.searchActionArg(action,
+                                                         argument);
 
-                               if (pseudoaction == LFUN_UNKNOWN_ACTION) {
-                                       pseudoaction = action;
-                               } else {
-                                       comname += " " + argument;
-                                       argsadded = true;
-                               }
+                       if (pseudoaction == LFUN_UNKNOWN_ACTION) {
+                               pseudoaction = action;
+                       } else {
+                               comname += " " + argument;
+                               argsadded = true;
                        }
+               }
 
-                       string const shortcuts =
-                               toplevel_keymap->findbinding(pseudoaction);
+               string const shortcuts =
+                       toplevel_keymap->findbinding(pseudoaction);
 
-                       if (!shortcuts.empty()) {
-                               comname += ": " + shortcuts;
-                       } else if (!argsadded && !argument.empty()) {
-                               comname += " " + argument;
-                       }
+               if (!shortcuts.empty()) {
+                       comname += ": " + shortcuts;
+               } else if (!argsadded && !argument.empty()) {
+                       comname += " " + argument;
+               }
 
-                       if (!comname.empty()) {
-                               comname = strip(comname);
-                               commandshortcut = "(" + comname + ')';
-                       }
+               if (!comname.empty()) {
+                       comname = strip(comname);
+                       commandshortcut = "(" + comname + ')';
                }
        }
 
@@ -897,7 +863,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
 #endif
                        if ((action == LFUN_UNKNOWN_ACTION)
                            && argument.empty()) {
-                               argument = keyseq.getiso();
+                               argument = keyseq.getLastKeyEncoded();
                        }
                        // Undo/Redo is a bit tricky for insets.
                        if (action == LFUN_UNDO) {
@@ -1045,7 +1011,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                }
                bool fw = (action == LFUN_WORDFINDBACKWARD);
                if (!searched_string.empty()) {
-                       LyXFind(owner->view(), searched_string, fw);
+                       lyxfind::LyXFind(owner->view(), searched_string, fw);
                }
 //             owner->view()->showCursor();
        }
@@ -1068,14 +1034,13 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                transform(lyxaction.func_begin(), lyxaction.func_end(),
                          back_inserter(allCmds), lyx::firster());
                static vector<string> hist;
-               owner->getMiniBuffer()->getString(MiniBuffer::spaces,
-                                                 allCmds, hist);
+               owner->getMiniBuffer()->prepareForInput(allCmds, hist);
        }
        break;
 
        case LFUN_CANCEL:                   // RVDK_PATCH_5
                keyseq.reset();
-               meta_fake_bit = 0;
+               meta_fake_bit = key_modifier::none;
                if (owner->view()->available())
                        // cancel any selection
                        dispatch(LFUN_MARK_OFF);
@@ -1084,7 +1049,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
 
        case LFUN_META_FAKE:                                 // RVDK_PATCH_5
        {
-               meta_fake_bit = Mod1Mask;
+               meta_fake_bit = key_modifier::alt;
                setMessage(keyseq.print());
        }
        break;
@@ -1216,7 +1181,8 @@ string const LyXFunc::dispatch(kb_action action, string argument)
 
        case LFUN_REMOVEERRORS:
                if (owner->view()->removeAutoInsets()) {
-                       owner->view()->redraw();
+#warning repaint() or update() or nothing ?
+                       owner->view()->repaint();
                        owner->view()->fitCursor();
                }
                break;
@@ -1427,11 +1393,11 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        owner->view()->buffer(bufferlist.loadLyXFile(s));
                }
 
-               // Set the cursor
                owner->view()->setCursorFromRow(row);
 
-               // Recenter screen
                owner->view()->center();
+               // see BufferView_pimpl::center() 
+               owner->view()->updateScrollbar();
        }
        break;
 
@@ -1461,8 +1427,9 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                owner->view()->setState();
                owner->showState();
 
-               // Recenter screen
                owner->view()->center();
+               // see BufferView_pimpl::center() 
+               owner->view()->updateScrollbar();
        }
        break;
 
@@ -1587,7 +1554,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_SEQUENCE:
        {
                // argument contains ';'-terminated commands
-               while (argument.find(';') != string::npos) {
+               while (!argument.empty()) {
                        string first;
                        argument = split(argument, first, ';');
                        verboseDispatch(first, false);
@@ -1615,7 +1582,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                // Of course we should only do the resize and the textcache.clear
                // if values really changed...but not very important right now. (Lgb)
                // All visible buffers will need resize
-               owner->resize();
+               owner->view()->resize();
                // We also need to empty the textcache so that
                // the buffer will be formatted correctly after
                // a zoom change.
@@ -1649,11 +1616,16 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                lyxColorHandler->updateColor(lcolor.getFromLyXName(lyx_name));
 
                if (graphicsbg_changed) {
+#ifdef WITH_WARNINGS
+#warning FIXME!! The graphics cache no longer has a changeDisplay method.
+#endif
+#if 0
                        grfx::GCache & gc = grfx::GCache::get();
                        gc.changeDisplay(true);
+#endif
                }
 
-               owner->view()->redraw();
+               owner->view()->repaint();
                break;
        }
 
@@ -1791,7 +1763,6 @@ void LyXFunc::menuNew(bool fromTemplate)
                            << disp_fn << "...";
 
                        owner->message(str.str().c_str());
-                       //XFlush(fl_get_display());
                        owner->view()->buffer(bufferlist.loadLyXFile(s));
                        ostringstream str2;
                        str2 << _("Document") << ' '
@@ -1914,15 +1885,16 @@ void LyXFunc::open(string const & fname)
 }
 
 
-// checks for running without gui are missing.
 void LyXFunc::doImport(string const & argument)
 {
        string format;
        string filename = split(argument, format, ' ');
+
        lyxerr[Debug::INFO] << "LyXFunc::doImport: " << format
                            << " file: " << filename << endl;
 
-       if (filename.empty()) { // need user interaction
+       // need user interaction
+       if (filename.empty()) {
                string initpath = lyxrc.document_path;
 
                if (owner->view()->available()) {
@@ -1959,7 +1931,6 @@ void LyXFunc::doImport(string const & argument)
                        owner->message(_("Canceled."));
        }
 
-       // still no filename? abort
        if (filename.empty())
                return;
 
@@ -1969,35 +1940,35 @@ void LyXFunc::doImport(string const & argument)
        string const lyxfile = ChangeExtension(filename, ".lyx");
 
        // Check if the document already is open
-       if (bufferlist.exists(lyxfile)) {
+       if (lyxrc.use_gui && bufferlist.exists(lyxfile)) {
                switch (Alert::askConfirmation(_("Document is already open:"),
                                        MakeDisplayPath(lyxfile, 50),
                                        _("Do you want to close that document now?\n"
                                          "('No' will just switch to the open version)")))
                        {
-                       case 1: // Yes: close the document
-                               if (!bufferlist.close(bufferlist.getBuffer(lyxfile)))
+                       case 1:
                                // If close is canceled, we cancel here too.
+                               if (!bufferlist.close(bufferlist.getBuffer(lyxfile)))
                                        return;
                                break;
-                       case 2: // No: switch to the open document
+                       case 2:
                                owner->view()->buffer(bufferlist.getBuffer(lyxfile));
                                return;
-                       case 3: // Cancel: Do nothing
+                       case 3:
                                owner->message(_("Canceled."));
                                return;
                        }
        }
 
-       // Check if a LyX document by the same root exists in filesystem
-       FileInfo const f(lyxfile, true);
-       if (f.exist() && !Alert::askQuestion(_("A document by the name"),
-                                     MakeDisplayPath(lyxfile),
-                                     _("already exists. Overwrite?"))) {
-               owner->message(_("Canceled"));
-               return;
+       // if the file exists already, and we didn't do
+       // -i lyx thefile.lyx, warn
+       if (FileInfo(lyxfile, true).exist() && filename != lyxfile) {
+               if (!Alert::askQuestion(_("A document by the name"),
+                       MakeDisplayPath(lyxfile), _("already exists. Overwrite?"))) {
+                       owner->message(_("Canceled"));
+                       return;
+               }
        }
-       // filename should be valid now
 
        Importer::Import(owner, filename, format);
 }