]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
redraw fix 1.
[lyx.git] / src / lyxfunc.C
index c5dfc104133b2ac91f3d19a46c850227ea09ab88..d1d920895f6c30ff25165657037550bbfdb3a041 100644 (file)
@@ -34,7 +34,7 @@
 #include "trans_mgr.h"
 #include "layout.h"
 #include "bufferview_funcs.h"
-#include "minibuffer.h"
+#include "frontends/MiniBuffer.h"
 #include "vspace.h"
 #include "frontends/LyXView.h"
 #include "FloatList.h"
@@ -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,32 +222,24 @@ void LyXFunc::handleKeyFunc(kb_action action)
 }
 
 
-void LyXFunc::processKeySym(KeySym keysym, key_modifier::state 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
+                      << 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;
        }
 
@@ -264,12 +256,6 @@ void LyXFunc::processKeySym(KeySym keysym, key_modifier::state state)
        // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards.
        // Mostly, meta_fake_bit = key_modifier::none. RVDK_PATCH_5.
        if ((action != LFUN_CANCEL) && (action != LFUN_META_FAKE)) {
-#if 0
-               if (lyxerr.debugging(Debug::KEY)) {
-                       lyxerr << "meta_fake_bit is ["
-                              << meta_fake_bit << "]" << endl;
-               }
-#endif
                // remove Caps Lock and Mod2 as a modifiers
                action = keyseq.addkey(keysym, (state | meta_fake_bit));
                if (lyxerr.debugging(Debug::KEY)) {
@@ -318,20 +304,18 @@ void LyXFunc::processKeySym(KeySym keysym, key_modifier::state 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);
+       }
 }
 
 
@@ -487,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;
@@ -507,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;
@@ -527,22 +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 if (argument == "none") {
-                               flag.setOnOff(type == LM_OT_NONE);
-                       } else {
-                               disable = true;
-                       }
-               } else
+               if (tli && (tli->lyxCode() == Inset::MATH_CODE))
+                       flag.setOnOff(mathcursor->formula()->hullType() == argument);
+               else
                        disable = true;
                break;
 
@@ -561,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:
@@ -628,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:
@@ -802,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 + ')';
                }
        }
 
@@ -895,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) {
@@ -1043,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();
        }
@@ -1066,8 +1034,7 @@ 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;
 
@@ -1214,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;
@@ -1425,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;
 
@@ -1459,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;
 
@@ -1585,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);
@@ -1613,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.
@@ -1647,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;
        }
 
@@ -1789,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") << ' '
@@ -1912,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()) {
@@ -1957,7 +1931,6 @@ void LyXFunc::doImport(string const & argument)
                        owner->message(_("Canceled."));
        }
 
-       // still no filename? abort
        if (filename.empty())
                return;
 
@@ -1967,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);
 }