X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxfunc.C;h=5ca26ab25748ad788cd2e22aa87d8b57d28eb4ae;hb=097595d63c8fc0b3e6c17af7545100247f4ee57d;hp=3c4bd85c6aae1cb1e96b801b8f7c0d8e8494dbc8;hpb=d719688df38b73e915ea36c8357a3c57376c4ef7;p=lyx.git diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 3c4bd85c6a..5ca26ab257 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -158,9 +158,6 @@ MiniBufferController mb_ctrl; /* === globals =========================================================== */ -// Initialization of static member var -bool LyXFunc::show_sc = true; - LyXFunc::LyXFunc(LyXView * o) : owner(o), @@ -325,47 +322,39 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state) if (action == LFUN_SELFINSERT) { // This is very X dependent. unsigned int c = keysym; + string argument; c = kb_keymap::getiso(c); if (c > 0) argument = static_cast(c); + + dispatch(LFUN_SELFINSERT, argument); lyxerr[Debug::KEY] << "SelfInsert arg[`" << argument << "']" << endl; } - - bool tmp_sc = show_sc; - show_sc = false; - dispatch(action, argument); - show_sc = tmp_sc; - - //return 0; + else + verboseDispatch(action, false); } FuncStatus LyXFunc::getStatus(int ac) const { - return getStatus(ac, string()); + kb_action action; + string argument; + action = lyxaction.retrieveActionArg(ac, argument); + return getStatus(action, argument); } -FuncStatus LyXFunc::getStatus(int ac, - string const & not_to_use_arg) const + +FuncStatus LyXFunc::getStatus(kb_action action, + string const & argument) const { - kb_action action; FuncStatus flag; - string argument; Buffer * buf = owner->buffer(); - if (lyxaction.isPseudoAction(ac)) - action = lyxaction.retrieveActionArg(ac, argument); - else { - action = static_cast(ac); - if (!not_to_use_arg.empty()) - argument = not_to_use_arg; // except here - } - if (action == LFUN_UNKNOWN_ACTION) { - setErrorMessage(N_("Unknown action")); + setStatusMessage(N_("Unknown action")); return flag.unknown(true); } @@ -379,17 +368,19 @@ FuncStatus LyXFunc::getStatus(int ac, !lyxaction.funcHasFlag(action, LyXAction::ReadOnly)) { // no - setErrorMessage(N_("Document is read-only")); + setStatusMessage(N_("Document is read-only")); flag.disabled(true); } } else { // no - setErrorMessage(N_("Command not allowed with" + setStatusMessage(N_("Command not allowed with" "out any document open")); return flag.disabled(true); } } + UpdatableInset * tli = owner->view()->theLockingInset(); + // I would really like to avoid having this switch and rather try to // encode this in the function itself. bool disable = false; @@ -424,27 +415,30 @@ FuncStatus LyXFunc::getStatus(int ac, break; case LFUN_LAYOUT_TABULAR: - disable = true; - if (owner->view()->theLockingInset()) { - disable = (owner->view()->theLockingInset()->lyxCode() != Inset::TABULAR_CODE) && - !owner->view()->theLockingInset()->getFirstLockingInsetOfType(Inset::TABULAR_CODE); - } + disable = !tli + || (tli->lyxCode() != Inset::TABULAR_CODE + && !tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE)); break; + case LFUN_LAYOUT: + case LFUN_LAYOUT_PARAGRAPH: { + Inset * inset = TEXT(false)->cursor.par()->inInset(); + disable = inset && inset->forceDefaultParagraphs(inset); + break; + } + case LFUN_TABULAR_FEATURE: disable = true; - if (owner->view()->theLockingInset()) { + if (tli) { FuncStatus ret; - ret.disabled(true); - if (owner->view()->theLockingInset()->lyxCode() == Inset::TABULAR_CODE) { + //ret.disabled(true); + if (tli->lyxCode() == Inset::TABULAR_CODE) { + ret = static_cast(tli) + ->getStatus(argument); + } else if (tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE)) { ret = static_cast - (owner->view()->theLockingInset())-> - getStatus(argument); - } else if (owner->view()->theLockingInset()->getFirstLockingInsetOfType(Inset::TABULAR_CODE)) { - ret = static_cast - (owner->view()->theLockingInset()-> - getFirstLockingInsetOfType(Inset::TABULAR_CODE))-> - getStatus(argument); + (tli->getFirstLockingInsetOfType(Inset::TABULAR_CODE)) + ->getStatus(argument); } flag |= ret; disable = false; @@ -454,7 +448,8 @@ FuncStatus LyXFunc::getStatus(int ac, disable = true; ret = inset.getStatus(argument); - if (ret.onoff(true) || ret.onoff(false)) flag.setOnOff(false); + if (ret.onoff(true) || ret.onoff(false)) + flag.setOnOff(false); } break; @@ -482,13 +477,7 @@ FuncStatus LyXFunc::getStatus(int ac, disable = (TEXT(false)->getInset() == 0); break; - case LFUN_MATH_VALIGN: { - // I think this test can be simplified (Andre') - // mathcursor is != 0 iff we are in math mode - //Inset * tli = owner->view()->theLockingInset(); - //if (tli && (tli->lyxCode() == Inset::MATH_CODE - // || tli->lyxCode() == Inset::MATHMACRO_CODE)) { - // + case LFUN_MATH_VALIGN: if (mathcursor) { char align = mathcursor->valign(); if (align == '\0') { @@ -507,11 +496,8 @@ FuncStatus LyXFunc::getStatus(int ac, } else disable = true; break; - } - case LFUN_MATH_HALIGN: { - //Inset * tli = owner->view()->theLockingInset(); - //if (tli && (tli->lyxCode() == Inset::MATH_CODE - // || tli->lyxCode() == Inset::MATHMACRO_CODE)) { + + case LFUN_MATH_HALIGN: if (mathcursor) { char align = mathcursor->halign(); if (align == '\0') { @@ -530,9 +516,8 @@ FuncStatus LyXFunc::getStatus(int ac, } else disable = true; break; - } - case LFUN_MATH_MUTATE: { - Inset * tli = owner->view()->theLockingInset(); + + case LFUN_MATH_MUTATE: if (tli && (tli->lyxCode() == Inset::MATH_CODE)) { MathInsetTypes type = mathcursor->formula()->getType(); if (argument == "inline") { @@ -549,7 +534,6 @@ FuncStatus LyXFunc::getStatus(int ac, } else disable = true; break; - } // we just need to be in math mode to enable that case LFUN_MATH_SIZE: @@ -674,9 +658,7 @@ FuncStatus LyXFunc::getStatus(int ac, default: break; } - if (code != Inset::NO_CODE - && owner->view()->theLockingInset() - && !owner->view()->theLockingInset()->insetAllowed(code)) { + if (code != Inset::NO_CODE && tli && !tli->insetAllowed(code)) { disable = true; } @@ -760,76 +742,122 @@ void LyXFunc::miniDispatch(string const & s) string s2(frontStrip(strip(s))); if (!s2.empty()) { - dispatch(s2); + verboseDispatch(s2, true); } } -string const LyXFunc::dispatch(string const & s) +void LyXFunc::verboseDispatch(string const & s, bool show_sc) { - // Split command string into command and argument - string cmd; - string line = frontStrip(s); - string const arg = strip(frontStrip(split(line, cmd, ' '))); - - int action = lyxaction.LookupFunc(cmd); + int action = lyxaction.LookupFunc(frontStrip(s)); if (action == LFUN_UNKNOWN_ACTION) { string const msg = string(_("Unknown function (")) - + cmd + ")"; + + s + ")"; owner->message(msg); - return string(); } else { - return dispatch(action, arg); + verboseDispatch(action, show_sc); } } -string const LyXFunc::dispatch(int ac, - string const & do_not_use_this_arg) +void LyXFunc::verboseDispatch(int ac, bool show_sc) { - lyxerr[Debug::ACTION] << "LyXFunc::Dispatch: action[" << ac - <<"] arg[" << do_not_use_this_arg << "]" << endl; - string argument; kb_action action; - // we have not done anything wrong yet. - errorstat = false; - dispatch_buffer.erase(); + // get the real action and argument + action = lyxaction.retrieveActionArg(ac, argument); + + verboseDispatch(action, argument, show_sc); +} + + + +void LyXFunc::verboseDispatch(kb_action action, + string const & argument, bool show_sc) +{ + string res = dispatch(action, argument); + + commandshortcut.erase(); - // if action is a pseudo-action, we need the real action - if (lyxaction.isPseudoAction(ac)) { - string tmparg; - action = static_cast - (lyxaction.retrieveActionArg(ac, tmparg)); - if (!tmparg.empty()) - argument = tmparg; + 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); + + int pseudoaction = action; + bool argsadded = false; + + 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; + } + } + + string const shortcuts = + toplevel_keymap->findbinding(pseudoaction); + + if (!shortcuts.empty()) { + comname += ": " + shortcuts; + } else if (!argsadded && !argument.empty()) { + comname += " " + argument; + } + + if (!comname.empty()) { + comname = strip(comname); + commandshortcut = "(" + comname + ')'; + } + } + } + + if (res.empty()) { + if (!commandshortcut.empty()) { + owner->getMiniBuffer()->addSet(commandshortcut); + } } else { - action = static_cast(ac); - if (!do_not_use_this_arg.empty()) - argument = do_not_use_this_arg; // except here + owner->getMiniBuffer()->addSet(' ' + commandshortcut); } +} + + +string const LyXFunc::dispatch(kb_action action, string argument) +{ + lyxerr[Debug::ACTION] << "LyXFunc::Dispatch: action[" << action + <<"] arg[" << argument << "]" << endl; + + // we have not done anything wrong yet. + errorstat = false; + dispatch_buffer.erase(); - #ifdef NEW_DISPATCHER // We try do call the most specific dispatcher first: // 1. the lockinginset's dispatch // 2. the bufferview's dispatch // 3. the lyxview's dispatch #endif - + selection_possible = false; - + if (owner->view()->available()) owner->view()->hideCursor(); // We cannot use this function here - if (getStatus(ac, do_not_use_this_arg).disabled()) { + if (getStatus(action, argument).disabled()) { lyxerr[Debug::ACTION] << "LyXFunc::Dispatch: " - << lyxaction.getActionName(ac) - << " [" << ac << "] is disabled at this location" + << lyxaction.getActionName(action) + << " [" << action << "] is disabled at this location" << endl; + setErrorMessage(getStatusMessage()); goto exit_with_message; } @@ -838,42 +866,43 @@ string const LyXFunc::dispatch(int ac, if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) && (!keyseq.deleted()))) { - if ((action==LFUN_UNKNOWN_ACTION) && argument.empty()){ + if ((action == LFUN_UNKNOWN_ACTION) + && argument.empty()){ argument = keyseq.getiso(); } // Undo/Redo is a bit tricky for insets. if (action == LFUN_UNDO) { owner->view()->menuUndo(); - return string(); + goto exit_with_message; } else if (action == LFUN_REDO) { owner->view()->menuRedo(); - return string(); + goto exit_with_message; } else if (((result=owner->view()->theLockingInset()-> localDispatch(owner->view(), action, argument)) == UpdatableInset::DISPATCHED) || (result == UpdatableInset::DISPATCHED_NOUPDATE)) - return string(); + goto exit_with_message; else if (result == UpdatableInset::FINISHED) { if (TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { TEXT()->cursorRight(owner->view()); moveCursorUpdate(true, false); owner->showState(); } - return string(); + goto exit_with_message; } else if (result == UpdatableInset::FINISHED_RIGHT) { if (!TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { TEXT()->cursorRight(owner->view()); moveCursorUpdate(true, false); owner->showState(); } - return string(); + goto exit_with_message; } else if (result == UpdatableInset::FINISHED_UP) { if (TEXT()->cursor.row()->previous()) { TEXT()->cursorUp(owner->view()); moveCursorUpdate(true, false); owner->showState(); } - return string(); + goto exit_with_message; } else if (result == UpdatableInset::FINISHED_DOWN) { if (TEXT()->cursor.row()->next()) TEXT()->cursorDown(owner->view()); @@ -881,7 +910,7 @@ string const LyXFunc::dispatch(int ac, TEXT()->cursorRight(owner->view()); moveCursorUpdate(true, false); owner->showState(); - return string(); + goto exit_with_message; } else { //setMessage(N_("Text mode")); switch (action) { @@ -898,14 +927,14 @@ string const LyXFunc::dispatch(int ac, moveCursorUpdate(true, false); owner->showState(); } - return string(); + goto exit_with_message; case LFUN_LEFT: if (TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) { TEXT()->cursorRight(owner->view()); moveCursorUpdate(true, false); owner->showState(); } - return string(); + goto exit_with_message; case LFUN_DOWN: if (TEXT()->cursor.row()->next()) TEXT()->cursorDown(owner->view()); @@ -913,7 +942,7 @@ string const LyXFunc::dispatch(int ac, TEXT()->cursorRight(owner->view()); moveCursorUpdate(true, false); owner->showState(); - return string(); + goto exit_with_message; default: break; } @@ -1361,7 +1390,7 @@ string const LyXFunc::dispatch(int ac, case LFUN_GOTO_PARAGRAPH: { - istringstream istr(argument.c_str()); + istringstream istr(argument.c_str()); int id; istr >> id; @@ -1375,8 +1404,13 @@ string const LyXFunc::dispatch(int ac, << " found." << endl; } + if (owner->view()->theLockingInset()) + owner->view()->unlockInset(owner->view()->theLockingInset()); + if (par->inInset()) { + par->inInset()->edit(owner->view()); + } // Set the cursor - owner->view()->text->setCursor(owner->view(), par, 0); + owner->view()->getLyXText()->setCursor(owner->view(), par, 0); owner->view()->setState(); owner->showState(); @@ -1472,7 +1506,7 @@ string const LyXFunc::dispatch(int ac, { string const filename = MakeAbsPath(argument, - OnlyPath(owner->buffer()->fileName())); + owner->buffer()->filePath()); setMessage(N_("Opening child document ") + MakeDisplayPath(filename) + "..."); owner->view()->savePosition(0); @@ -1509,7 +1543,7 @@ string const LyXFunc::dispatch(int ac, while (argument.find(';') != string::npos) { string first; argument = split(argument, first, ';'); - dispatch(first); + verboseDispatch(first, false); } } break; @@ -1588,66 +1622,13 @@ string const LyXFunc::dispatch(int ac, exit_with_message: - 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); - - kb_action pseudoaction = action; - bool argsadded = false; - - if (!argument.empty()) { - // If we have the command with argument, - // this is better - pseudoaction = - lyxaction.searchActionArg(action, - argument); - - if (pseudoaction == -1) { - pseudoaction = action; - } else { - comname += " " + argument; - argsadded = true; - } - } - - string const shortcuts = - toplevel_keymap->findbinding(pseudoaction); - - if (!shortcuts.empty()) { - comname += ": " + shortcuts; - } else if (!argsadded && !argument.empty()) { - comname += " " + argument; - } - - if (!comname.empty()) { - comname = strip(comname); - commandshortcut = "(" + comname + ')'; - - // Here we could even add a small pause, - // to annoy the user and make him learn - // the shortcuts. - // No! That will just annoy, not teach - // anything. The user will read the messages - // if they are interested. (Asger) - } - } - } - string const res = getMessage(); - if (res.empty()) { - if (!commandshortcut.empty()) { - owner->getMiniBuffer()->addSet(commandshortcut); - } - } else { - string const msg(_(res) + ' ' + commandshortcut); - owner->message(msg); - } - + if (!res.empty()) + owner->message(_(res)); + owner->updateMenubar(); + owner->updateToolbar(); + return res; } @@ -1664,7 +1645,7 @@ void LyXFunc::menuNew(bool fromTemplate) string initpath = lyxrc.document_path; if (owner->view()->available()) { - string const trypath = owner->buffer()->filepath; + string const trypath = owner->buffer()->filePath(); // If directory is writeable, use this as default. if (IsDirWriteable(trypath)) initpath = trypath; @@ -1676,9 +1657,9 @@ void LyXFunc::menuNew(bool fromTemplate) if (lyxrc.new_ask_filename) { FileDialog fileDlg(owner, _("Enter filename for new document"), LFUN_SELECT_FILE_SYNC, - make_pair(string(_("Documents")), + make_pair(string(_("Documents|#o#O")), string(lyxrc.document_path)), - make_pair(string(_("Templates")), + make_pair(string(_("Templates|#T#t")), string(lyxrc.template_path))); FileDialog::Result result = @@ -1760,9 +1741,9 @@ void LyXFunc::menuNew(bool fromTemplate) if (fromTemplate) { FileDialog fileDlg(owner, _("Select template file"), LFUN_SELECT_FILE_SYNC, - make_pair(string(_("Documents")), + make_pair(string(_("Documents|#o#O")), string(lyxrc.document_path)), - make_pair(string(_("Templates")), + make_pair(string(_("Templates|#T#t")), string(lyxrc.template_path))); FileDialog::Result result = @@ -1790,7 +1771,7 @@ void LyXFunc::open(string const & fname) string initpath = lyxrc.document_path; if (owner->view()->available()) { - string const trypath = owner->buffer()->filepath; + string const trypath = owner->buffer()->filePath(); // If directory is writeable, use this as default. if (IsDirWriteable(trypath)) initpath = trypath; @@ -1801,9 +1782,9 @@ void LyXFunc::open(string const & fname) if (fname.empty()) { FileDialog fileDlg(owner, _("Select document to open"), LFUN_FILE_OPEN, - make_pair(string(_("Documents")), + make_pair(string(_("Documents|#o#O")), string(lyxrc.document_path)), - make_pair(string(_("Examples")), + make_pair(string(_("Examples|#E#e")), string(AddPath(system_lyxdir, "examples")))); FileDialog::Result result = @@ -1867,7 +1848,7 @@ void LyXFunc::doImport(string const & argument) string initpath = lyxrc.document_path; if (owner->view()->available()) { - string const trypath = owner->buffer()->filepath; + string const trypath = owner->buffer()->filePath(); // If directory is writeable, use this as default. if (IsDirWriteable(trypath)) initpath = trypath; @@ -1878,9 +1859,9 @@ void LyXFunc::doImport(string const & argument) FileDialog fileDlg(owner, text, LFUN_IMPORT, - make_pair(string(_("Documents")), + make_pair(string(_("Documents|#o#O")), string(lyxrc.document_path)), - make_pair(string(_("Examples")), + make_pair(string(_("Examples|#E#e")), string(AddPath(system_lyxdir, "examples")))); string const extension = "*." + formats.extension(format) @@ -1980,12 +1961,18 @@ void LyXFunc::setErrorMessage(string const & m) const } -void LyXFunc::setMessage(string const & m) +void LyXFunc::setMessage(string const & m) const { dispatch_buffer = m; } +void LyXFunc::setStatusMessage(string const & m) const +{ + status_buffer = m; +} + + void LyXFunc::initMiniBuffer() { string text = _("Welcome to LyX!");