* LyX, The Document Processor
*
* Copyright 1995 Matthias Ettrich
- * Copyright 1995-2000 The LyX Team.
+ * Copyright 1995-2001 The LyX Team.
*
* ====================================================== */
#include <config.h>
-#ifdef HAVE_SSTREAM
-#include <sstream>
-using std::istringstream;
-#else
-#include <strstream>
-#endif
+#include "Lsstream.h"
-#include <time.h>
-#include <locale.h>
+#include <ctime>
+#include <clocale>
+
+#include <utility>
+#include <algorithm>
#include <cstdlib>
#include <cctype>
-#include <cstring>
#ifdef __GNUG__
#pragma implementation
#endif
-#include "lyxlookup.h"
+#include "support/lyxalgo.h"
+#include "support/LAssert.h"
+#include "version.h"
#include "kbmap.h"
#include "lyxfunc.h"
#include "bufferlist.h"
+#include "BufferView.h"
#include "ColorHandler.h"
#include "lyxserver.h"
-#include "lyx.h"
#include "intl.h"
#include "lyx_main.h"
#include "lyx_cb.h"
#include "insets/inseturl.h"
#include "insets/insetlatexaccent.h"
#include "insets/insettoc.h"
-#include "insets/insetlof.h"
-#include "insets/insetloa.h"
-#include "insets/insetlot.h"
#include "insets/insetref.h"
#include "insets/insetparent.h"
#include "insets/insetindex.h"
#include "insets/insetexternal.h"
#include "insets/insetgraphics.h"
#include "insets/insetfoot.h"
+#include "insets/insetmarginal.h"
+#include "insets/insetminipage.h"
+#include "insets/insetfloat.h"
+#if 0
+#include "insets/insetlist.h"
+#include "insets/insettheorem.h"
+#endif
#include "insets/insettabular.h"
+#include "insets/insetcaption.h"
#include "mathed/formulamacro.h"
-#include "toolbar.h"
-#include "spellchecker.h" // RVDK_PATCH_5
+#include "mathed/math_cursor.h"
+#include "mathed/math_inset.h"
#include "minibuffer.h"
#include "vspace.h"
#include "LyXView.h"
-#include "filedlg.h"
#include "lyx_gui_misc.h"
#include "support/filetools.h"
#include "support/FileInfo.h"
#include "support/syscall.h"
#include "support/lstrings.h"
#include "support/path.h"
+#include "support/lyxfunctional.h"
#include "debug.h"
#include "lyxrc.h"
#include "lyxtext.h"
#include "gettext.h"
#include "trans_mgr.h"
-#include "ImportLaTeX.h"
-#include "ImportNoweb.h"
#include "layout.h"
#include "WorkArea.h"
-#include "lyxfr1.h"
-#include "menus.h"
#include "bufferview_funcs.h"
+#include "frontends/FileDialog.h"
#include "frontends/Dialogs.h"
+#include "frontends/Toolbar.h"
+#include "frontends/Menubar.h"
+#include "FloatList.h"
+#include "converter.h"
+#include "exporter.h"
+#include "importer.h"
+#include "FontLoader.h"
+#include "TextCache.h"
+#include "lyxfind.h"
+#include "undo_funcs.h"
+#include "ParagraphParameters.h"
+#include "figureForm.h"
using std::pair;
+using std::make_pair;
using std::endl;
+using std::find_if;
-extern bool cursor_follows_scrollbar;
-
-extern void InsertAsciiFile(BufferView *, string const &, bool);
-extern void math_insert_symbol(char const *);
-extern Bool math_insert_greek(char const); // why "Bool"?
extern BufferList bufferlist;
extern LyXServer * lyxserver;
-extern short greek_kb_flag;
-extern FD_form_toc * fd_form_toc;
+extern int greek_kb_flag;
extern bool selection_possible;
+extern void MenuSendto();
-extern kb_keymap * toplevel_keymap;
+extern boost::scoped_ptr<kb_keymap> toplevel_keymap;
-extern void MenuWrite(Buffer *);
-extern void MenuWriteAs(Buffer *);
-extern int MenuRunLaTeX(Buffer *);
-extern int MenuBuildProg(Buffer *);
-extern int MenuRunChktex(Buffer *);
-extern bool CreatePostscript(Buffer *, bool);
-extern void MenuPrint(Buffer *);
-extern void MenuSendto();
-extern void QuitLyX();
-extern void MenuFax(Buffer *);
-extern void MenuExport(Buffer *, string const &);
+extern void show_symbols_form(LyXFunc *);
extern LyXAction lyxaction;
// (alkis)
extern tex_accent_struct get_accent(kb_action action);
-extern void AutoSave(BufferView *);
-extern bool PreviewDVI(Buffer *);
-extern bool PreviewPostscript(Buffer *);
-extern void MenuInsertLabel(char const *);
-extern void MenuInsertRef();
-extern void MenuLayoutCharacter();
-extern void MenuLayoutParagraph();
-extern void MenuLayoutDocument();
-extern void MenuLayoutPaper();
-extern void MenuLayoutTable(int flag);
-extern void MenuLayoutQuotes();
-extern void MenuLayoutPreamble();
-extern void MenuLayoutSave();
-extern void bulletForm();
-
-extern Buffer * NewLyxFile(string const &);
-extern void LoadLyXFile(string const &);
-extern void Reconfigure(BufferView *);
-
extern LyXTextClass::size_type current_layout;
-extern int getISOCodeFromLaTeX(char *);
extern void ShowLatexLog();
+
+#if 0
+
+///
+class MiniBufferController : public SigC::Object {
+public:
+ ///
+ MiniBufferController() {
+ minibuffer
+ .cmdReady
+ .connect(slot(this,
+ &MiniBufferController::receiveCommand));
+ minibuffer
+ .argReady
+ .connect(slot(this,
+ &MiniBufferController::receiveArg));
+ }
+ ///
+ void receiveCmd(string const & cmd) {}
+ ///
+ void receiveArg(string const & arg) {}
+
+
+private:
+};
+
+namespace {
+
+MiniBufferController mb_ctrl;
+
+}
+#endif
+
+
/* === globals =========================================================== */
+// Initialization of static member var
bool LyXFunc::show_sc = true;
}
+inline
+LyXText * LyXFunc::TEXT(bool flag = true) const
+{
+ if (flag)
+ return owner->view()->text;
+ return owner->view()->getLyXText();
+}
+
+
// I changed this func slightly. I commented out the ...FinishUndo(),
// this means that all places that used to have a moveCursorUpdate, now
// have a ...FinishUndo() as the preceeding statement. I have also added
// a moveCursorUpdate to some of the functions that updated the cursor, but
// that did not show its new position.
inline
-void LyXFunc::moveCursorUpdate(bool selecting)
+void LyXFunc::moveCursorUpdate(bool flag, bool selecting)
{
- if (selecting || owner->view()->text->mark_set) {
- owner->view()->text->SetSelection();
- owner->view()->toggleToggle();
+ if (selecting || TEXT(flag)->selection.mark()) {
+ TEXT(flag)->setSelection(owner->view());
+ if (TEXT(flag)->bv_owner)
+ owner->view()->toggleToggle();
}
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
+ owner->view()->update(TEXT(flag), BufferView::SELECT|BufferView::FITCUR);
owner->view()->showCursor();
/* ---> Everytime the cursor is moved, show the current font state. */
// should this too me moved out of this func?
- //owner->getMiniBuffer()->Set(CurrentState());
owner->view()->setState();
}
-int LyXFunc::processKeyEvent(XEvent * ev)
+void LyXFunc::handleKeyFunc(kb_action action)
{
- char s_r[10];
- string argument;
- XKeyEvent * keyevent = &ev->xkey;
- KeySym keysym_return = 0;
+ char c = keyseq.getiso();
- int num_bytes = LyXLookupString(ev, s_r, 10, &keysym_return);
- s_r[num_bytes] = '\0';
+ if (keyseq.length != -1) c = 0;
+
+ owner->getIntl()->getTrans()
+ .deadkey(c, get_accent(action).accent, TEXT(false));
+ // Need to reset, in case the minibuffer calls these
+ // actions
+ keyseq.reset();
+ keyseq.length = 0;
+ // copied verbatim from do_accent_char
+ owner->view()->update(TEXT(false),
+ BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ TEXT(false)->selection.cursor = TEXT(false)->cursor;
+}
+
+void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
+{
+ string argument;
+
if (lyxerr.debugging(Debug::KEY)) {
- char * tmp = XKeysymToString(keysym_return);
- string stm = (tmp ? tmp : "");
+ char const * tmp = XKeysymToString(keysym);
+ string const stm = (tmp ? tmp : "");
lyxerr << "KeySym is "
<< stm
<< "["
- << keysym_return << "]"
- << " and num_bytes is "
- << num_bytes
- << " the string returned is \""
- << s_r << '\"' << endl;
+ << keysym << "] State is ["
+ << state << "]"
+ << endl;
}
// Do nothing if we have nothing (JMarc)
- if (num_bytes == 0 && keysym_return == NoSymbol) {
+ if (keysym == NoSymbol) {
lyxerr[Debug::KEY] << "Empty kbd action (probably composing)"
<< endl;
- return 0;
- }
-
- // this function should be used always [asierra060396]
- UpdatableInset * tli = owner->view()->the_locking_inset;
- if (owner->view()->available() && tli && (keysym_return==XK_Escape)) {
- if (tli == tli->GetLockingInset()) {
- owner->view()->unlockInset(tli);
- owner->view()->text->CursorRight(owner->view());
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- } else {
- tli->UnlockInsetInInset(owner->view(),
- tli->GetLockingInset(),true);
- }
- return 0;
+ return;
}
// Can we be sure that this will work for all X-Windows
// implementations? (Lgb)
// This code snippet makes lyx ignore some keys. Perhaps
// all of them should be explictly mentioned?
- if((keysym_return >= XK_Shift_L && keysym_return <= XK_Hyper_R)
- || keysym_return == XK_Mode_switch || keysym_return == 0x0)
- return 0;
-
+ if ((keysym >= XK_Shift_L && keysym <= XK_Hyper_R)
+ || keysym == XK_Mode_switch || keysym == 0x0) {
+ return;
+ }
+
// Do a one-deep top-level lookup for
// cancel and meta-fake keys. RVDK_PATCH_5
cancel_meta_seq.reset();
- int action = cancel_meta_seq.addkey(keysym_return, keyevent->state
+ int action = cancel_meta_seq.addkey(keysym, state
&(ShiftMask|ControlMask
|Mod1Mask));
-
+ 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.
- if ( (action != LFUN_CANCEL) && (action != LFUN_META_FAKE) ) {
-
+ 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_return,
- (keyevent->state | meta_fake_bit)
+ action = keyseq.addkey(keysym,
+ (state | meta_fake_bit)
&(ShiftMask|ControlMask
- |Mod1Mask));
+ |Mod1Mask));
+ 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;
if (lyxerr.debugging(Debug::KEY)) {
string buf;
keyseq.print(buf);
- lyxerr << "Key ["
+ lyxerr << "Key [action="
<< action << "]["
- << buf << "]["
- << num_bytes << "]" << endl;
+ << buf << "]"
+ << endl;
}
// already here we know if it any point in going further
// why not return already here if action == -1 and
// num_bytes == 0? (Lgb)
- if(keyseq.length > 1 || keyseq.length < -1) {
+ if (keyseq.length > 1 || keyseq.length < -1) {
string buf;
keyseq.print(buf);
- owner->getMiniBuffer()->Set(buf);
+ owner->message(buf);
}
if (action == -1) {
- if (keyseq.length < -1) { // unknown key sequence...
- string buf;
- LyXBell();
- keyseq.print(buf);
- owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf);
- return 0;
- }
-
- char isochar = keyseq.getiso();
- if (!(keyevent->state&ControlMask) &&
- !(keyevent->state&Mod1Mask) &&
- (isochar && keysym_return < 0xF000)) {
- argument += isochar;
+ // It is unknown, but what if we remove all
+ // the modifiers? (Lgb)
+ action = keyseq.addkey(keysym, 0);
+
+ if (lyxerr.debugging(Debug::KEY)) {
+ lyxerr << "Removing modifiers...\n"
+ << "Action now set to ["
+ << action << "]" << endl;
}
- if (argument.empty()) {
- lyxerr.debug() << "Empty argument!" << endl;
- // This can`t possibly be of any use
- // so we`ll skip the dispatch.
- return 0;
+ if (action == -1) {
+ owner->message(_("Unknown function."));
+ return;
}
- } else
- if (action == LFUN_SELFINSERT) {
- argument = s_r[0];
+ }
+
+ if (action == LFUN_SELFINSERT) {
+ // This is very X dependant.
+ unsigned int c = keysym;
+
+ switch (c & 0x0000FF00) {
+ // latin 1 byte 3 = 0
+ case 0x00000000: break;
+ // latin 2 byte 3 = 1
+ case 0x00000100:
+ // latin 3 byte 3 = 2
+ case 0x00000200:
+ // latin 4 byte 3 = 3
+ case 0x00000300:
+ // latin 8 byte 3 = 18 (0x12)
+ case 0x00001200:
+ // latin 9 byte 3 = 19 (0x13)
+ case 0x00001300:
+ c &= 0x000000FF;
+ break;
+ default:
+ c = 0;
+ break;
}
-
+ if (c > 0)
+ argument = static_cast<char>(c);
+ lyxerr[Debug::KEY] << "SelfInsert arg[`"
+ << argument << "']" << endl;
+ }
+
bool tmp_sc = show_sc;
show_sc = false;
- Dispatch(action, argument.c_str());
+ dispatch(action, argument);
show_sc = tmp_sc;
- return 0;
+ //return 0;
}
-LyXFunc::func_status LyXFunc::getStatus(int ac) const
+func_status::value_type LyXFunc::getStatus(int ac) const
+{
+ return getStatus(ac, string());
+}
+
+
+func_status::value_type LyXFunc::getStatus(int ac,
+ string const & not_to_use_arg) const
{
- kb_action action;
- func_status flag = LyXFunc::OK;
- string argument;
- Buffer * buf = owner->buffer();
+ kb_action action;
+ func_status::value_type flag = func_status::OK;
+ string argument;
+ Buffer * buf = owner->buffer();
- if (lyxaction.isPseudoAction(ac))
+ if (lyxaction.isPseudoAction(ac))
action = lyxaction.retrieveActionArg(ac, argument);
- else
+ else {
action = static_cast<kb_action>(ac);
+ if (!not_to_use_arg.empty())
+ argument = not_to_use_arg; // exept here
+ }
if (action == LFUN_UNKNOWN_ACTION) {
setErrorMessage(N_("Unknown action"));
- return LyXFunc::Unknown;
+ return func_status::Unknown;
}
// Check whether we need a buffer
LyXAction::ReadOnly)) {
// no
setErrorMessage(N_("Document is read-only"));
- flag |= LyXFunc::Disabled;
+ flag |= func_status::Disabled;
}
} else {
// no
setErrorMessage(N_("Command not allowed with"
"out any document open"));
- flag |= LyXFunc::Disabled;
+ flag |= func_status::Disabled;
+ return flag;
}
}
- if (flag & LyXFunc::Disabled)
- return flag;
-
// I would really like to avoid having this switch and rather try to
// encode this in the function itself.
- static bool noLaTeX = lyxrc.latex_command == "none";
bool disable = false;
switch (action) {
- case LFUN_PREVIEW:
- disable = noLaTeX || lyxrc.view_dvi_command == "none";
- break;
- case LFUN_PREVIEWPS:
- disable = noLaTeX || lyxrc.view_ps_command == "none";
- break;
- case LFUN_RUNLATEX:
- case LFUN_RUNDVIPS:
- disable = noLaTeX;
- break;
case LFUN_MENUPRINT:
- disable = noLaTeX || lyxrc.print_command == "none";
- break;
- case LFUN_FAX:
- disable = noLaTeX || lyxrc.fax_command == "none";
- break;
- case LFUN_IMPORT:
- if (argument == "latex")
- disable = lyxrc.relyx_command == "none";
- if (argument == "linuxdoc")
- disable = lyxrc.linuxdoc_to_lyx_command == "none";
+ disable = !Exporter::IsExportable(buf, "dvi")
+ || lyxrc.print_command == "none";
break;
case LFUN_EXPORT:
- if (argument == "dvi" || argument == "postscript")
- disable = noLaTeX;
- if (argument == "html")
- disable = lyxrc.html_command == "none";
- if (argument == "html-linuxdoc")
- disable = lyxrc.linuxdoc_to_html_command == "none";
- if (argument == "html-docbook")
- disable = lyxrc.docbook_to_html_command == "none";
+ disable = argument == "fax" &&
+ !Exporter::IsExportable(buf, argument);
break;
case LFUN_UNDO:
disable = buf->undostack.empty();
case LFUN_RUNCHKTEX:
disable = lyxrc.chktex_command == "none";
break;
- case LFUN_LAYOUT_TABLE:
- disable = ! owner->view()->text->cursor.par()->table;
+ case LFUN_BUILDPROG:
+ disable = !Exporter::IsExportable(buf, "program");
break;
- default:
+
+ 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);
+ }
break;
- }
- if (disable)
- flag |= LyXFunc::Disabled;
-
- if (buf) {
- func_status box = LyXFunc::ToggleOff;
- LyXFont font = owner->view()->text->real_current_font;
- switch (action) {
- case LFUN_EMPH:
- if (font.emph() == LyXFont::ON)
- box = LyXFunc::ToggleOn;
- break;
- case LFUN_NOUN:
- if (font.noun() == LyXFont::ON)
- box = LyXFunc::ToggleOn;
- break;
- case LFUN_BOLD:
- if (font.series() == LyXFont::BOLD_SERIES)
- box = LyXFunc::ToggleOn;
- break;
- case LFUN_TEX:
- if (font.latex() == LyXFont::ON)
- box = LyXFunc::ToggleOn;
- break;
- default:
- box = LyXFunc::OK;
- break;
+
+ case LFUN_TABULAR_FEATURE:
+ disable = true;
+ if (owner->view()->theLockingInset()) {
+ func_status::value_type ret = func_status::Disabled;
+ if (owner->view()->theLockingInset()->lyxCode() == Inset::TABULAR_CODE) {
+ ret = static_cast<InsetTabular *>
+ (owner->view()->theLockingInset())->
+ getStatus(argument);
+ } else if (owner->view()->theLockingInset()->getFirstLockingInsetOfType(Inset::TABULAR_CODE)) {
+ ret = static_cast<InsetTabular *>
+ (owner->view()->theLockingInset()->
+ getFirstLockingInsetOfType(Inset::TABULAR_CODE))->
+ getStatus(argument);
+ }
+ flag |= ret;
+ disable = false;
+ } else {
+ static InsetTabular inset(*owner->buffer(), 1, 1);
+ func_status::value_type ret;
+
+ disable = true;
+ ret = inset.getStatus(argument);
+ if ((ret & func_status::ToggleOn) ||
+ (ret & func_status::ToggleOff))
+ flag |= func_status::ToggleOff;
}
- flag |= box;
+ break;
+
+ case LFUN_VC_REGISTER:
+ disable = buf->lyxvc.inUse();
+ break;
+ case LFUN_VC_CHECKIN:
+ disable = !buf->lyxvc.inUse() || buf->isReadonly();
+ break;
+ case LFUN_VC_CHECKOUT:
+ disable = !buf->lyxvc.inUse() || !buf->isReadonly();
+ break;
+ case LFUN_VC_REVERT:
+ case LFUN_VC_UNDO:
+ case LFUN_VC_HISTORY:
+ disable = !buf->lyxvc.inUse();
+ break;
+ case LFUN_BOOKMARK_GOTO:
+ disable = !owner->view()->
+ isSavedPosition(strToUnsignedInt(argument));
+ break;
+
+
+ case LFUN_INSET_TOGGLE:
+ 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)) {
+ //
+ if (mathcursor) {
+ char align = mathcursor->valign();
+ if (align == '\0') {
+ disable = true;
+ break;
+ }
+ if (argument.empty()) {
+ flag = func_status::OK;
+ break;
+ }
+ if (!contains("tcb", argument[0])) {
+ disable = true;
+ break;
+ }
+ if (argument[0] == align)
+ flag |= func_status::ToggleOn;
+ else
+ flag |= func_status::ToggleOff;
+ } 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)) {
+ if (mathcursor) {
+ char align = mathcursor->halign();
+ if (align == '\0') {
+ disable = true;
+ break;
+ }
+ if (argument.empty()) {
+ flag = func_status::OK;
+ break;
+ }
+ if (!contains("lcr", argument[0])) {
+ disable = true;
+ break;
+ }
+ if (argument[0] == align)
+ flag |= func_status::ToggleOn;
+ else
+ flag |= func_status::ToggleOff;
+ } else
+ disable = true;
+ break;
+ }
+ case LFUN_MATH_MUTATE: {
+ Inset * tli = owner->view()->theLockingInset();
+ if (tli && (tli->lyxCode() == Inset::MATH_CODE)) {
+ MathInsetTypes type = mathcursor->formula()->getType();
+ func_status::value_type box = func_status::ToggleOff;
+ if (argument == "inline") {
+ if (type == LM_OT_SIMPLE)
+ box = func_status::ToggleOn;
+ } else if (argument == "display") {
+ if (type == LM_OT_EQUATION)
+ box = func_status::ToggleOn;
+ } else if (argument == "eqnarray") {
+ if (type == LM_OT_EQNARRAY)
+ box = func_status::ToggleOn;
+ } else if (argument == "align") {
+ if (type == LM_OT_ALIGN)
+ box = func_status::ToggleOn;
+ } else {
+ box = func_status::OK;
+ disable = true;
+ }
+ flag |= box;
+ } else
+ disable = true;
+ break;
+ }
+
+ // we just need to be in math mode to enable that
+ case LFUN_MATH_SIZE:
+ case LFUN_MATH_SPACE:
+ case LFUN_MATH_LIMITS:
+ case LFUN_MATH_NONUMBER:
+ case LFUN_MATH_NUMBER:
+ disable = !mathcursor;
+ break;
+
+ // we need to be math mode and a math array for that
+ // Hack: halign produces non-zero result iff we are in a math array
+ case LFUN_MATH_ROW_INSERT:
+ case LFUN_MATH_ROW_DELETE:
+ case LFUN_MATH_COLUMN_INSERT:
+ case LFUN_MATH_COLUMN_DELETE:
+ disable = !mathcursor || !mathcursor->halign();
+ break;
+
+ default:
+ break;
+ }
+
+ // the functions which insert insets
+ Inset::Code code = Inset::NO_CODE;
+ switch (action) {
+ case LFUN_INSET_TEXT:
+ code = Inset::TEXT_CODE;
+ break;
+ case LFUN_INSET_ERT:
+ code = Inset::ERT_CODE;
+ break;
+ case LFUN_FIGURE:
+ case LFUN_INSET_GRAPHICS:
+ code = Inset::GRAPHICS_CODE;
+ break;
+ case LFUN_INSET_FOOTNOTE:
+ code = Inset::FOOT_CODE;
+ break;
+ case LFUN_DIALOG_TABULAR_INSERT:
+ case LFUN_INSET_TABULAR:
+ code = Inset::TABULAR_CODE;
+ break;
+ case LFUN_INSET_EXTERNAL:
+ code = Inset::EXTERNAL_CODE;
+ break;
+ case LFUN_INSET_MARGINAL:
+ code = Inset::MARGIN_CODE;
+ break;
+ case LFUN_INSET_MINIPAGE:
+ code = Inset::MINIPAGE_CODE;
+ break;
+ case LFUN_INSET_FLOAT:
+ case LFUN_INSET_WIDE_FLOAT:
+ code = Inset::FLOAT_CODE;
+ break;
+ case LFUN_FLOAT_LIST:
+ code = Inset::FLOAT_LIST_CODE;
+ break;
+#if 0
+ case LFUN_INSET_LIST:
+ code = Inset::LIST_CODE;
+ break;
+ case LFUN_INSET_THEOREM:
+ code = Inset::THEOREM_CODE;
+ break;
+#endif
+ case LFUN_INSET_CAPTION:
+ code = Inset::CAPTION_CODE;
+ break;
+ case LFUN_INSERT_NOTE:
+ code = Inset::IGNORE_CODE;
+ break;
+ case LFUN_INSERT_LABEL:
+ code = Inset::LABEL_CODE;
+ break;
+ case LFUN_REF_INSERT:
+ code = Inset::REF_CODE;
+ break;
+ case LFUN_CITATION_CREATE:
+ case LFUN_CITATION_INSERT:
+ code = Inset::CITE_CODE;
+ break;
+ case LFUN_INSERT_BIBTEX:
+ 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:
+ code = Inset::INDEX_PRINT_CODE;
+ break;
+ case LFUN_CHILD_INSERT:
+ code = Inset::INCLUDE_CODE;
+ break;
+ case LFUN_TOC_INSERT:
+ code = Inset::TOC_CODE;
+ break;
+ case LFUN_PARENTINSERT:
+ code = Inset::PARENT_CODE;
+ break;
+ case LFUN_HTMLURL:
+ case LFUN_URL:
+ case LFUN_INSERT_URL:
+ code = Inset::URL_CODE;
+ break;
+ case LFUN_QUOTE:
+ // always allow this, since we will inset a raw quote
+ // if an inset is not allowed.
+ break;
+ case LFUN_HYPHENATION:
+ case LFUN_LIGATURE_BREAK:
+ case LFUN_HFILL:
+ case LFUN_MENU_SEPARATOR:
+ case LFUN_LDOTS:
+ case LFUN_END_OF_SENTENCE:
+ case LFUN_PROTECTEDSPACE:
+ code = Inset::SPECIALCHAR_CODE;
+ break;
+ default:
+ break;
+ }
+ if (code != Inset::NO_CODE
+ && owner->view()->theLockingInset()
+ && !owner->view()->theLockingInset()->insetAllowed(code)) {
+ disable = true;
+ }
+
+ if (disable)
+ flag |= func_status::Disabled;
+
+ // the font related functions (and a few others)
+ func_status::value_type box = func_status::ToggleOff;
+ LyXFont const & font =
+ TEXT(false)->real_current_font;
+ switch (action) {
+ case LFUN_EMPH:
+ if (font.emph() == LyXFont::ON)
+ box = func_status::ToggleOn;
+ break;
+ case LFUN_NOUN:
+ if (font.noun() == LyXFont::ON)
+ box = func_status::ToggleOn;
+ break;
+ case LFUN_BOLD:
+ if (font.series() == LyXFont::BOLD_SERIES)
+ box = func_status::ToggleOn;
+ break;
+ case LFUN_READ_ONLY_TOGGLE:
+ if (buf->isReadonly())
+ box = func_status::ToggleOn;
+ break;
+ case LFUN_APPENDIX:
+ if (TEXT(false)->cursor.par()->params().startOfAppendix())
+ box = func_status::ToggleOn;
+ break;
+ default:
+ box = func_status::OK;
+ break;
}
+ flag |= box;
return flag;
}
-string LyXFunc::Dispatch(string const & s)
+// temporary dispatch method
+void LyXFunc::miniDispatch(string const & s)
+{
+ if (!s.empty()) {
+ dispatch(s);
+ }
+}
+
+
+string const LyXFunc::dispatch(string const & s)
{
// Split command string into command and argument
- string cmd, line = frontStrip(s);
- string arg = strip(frontStrip(split(line, cmd, ' ')));
+ string cmd;
+ string line = frontStrip(s);
+ string const arg = strip(frontStrip(split(line, cmd, ' ')));
- return Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str());
+ return dispatch(lyxaction.LookupFunc(cmd), arg);
}
-string LyXFunc::Dispatch(int ac,
- char const * do_not_use_this_arg)
+string const LyXFunc::dispatch(int ac,
+ string const & do_not_use_this_arg)
{
+ lyxerr[Debug::ACTION] << "LyXFunc::Dispatch: action[" << ac
+ <<"] arg[" << do_not_use_this_arg << "]" << endl;
+
string argument;
kb_action action;
argument = tmparg;
} else {
action = static_cast<kb_action>(ac);
- if (do_not_use_this_arg)
+ if (!do_not_use_this_arg.empty())
argument = do_not_use_this_arg; // except here
}
-
+
+#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(action) & Disabled)
+ if (getStatus(ac, do_not_use_this_arg) & func_status::Disabled) {
+ lyxerr << "LyXFunc::Dispatch: "
+ << lyxaction.getActionName(ac)
+ << " [" << ac << "] is disabled at this location"
+ << endl;
goto 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);
-
- int pseudoaction = action;
- bool argsadded = false;
-
- if (!argument.empty()) {
- // If we have the command with argument,
- // this is better
- pseudoaction =
- lyxaction.searchActionArg(action,
- argument.c_str());
-
- if (pseudoaction == -1) {
- pseudoaction = action;
+ if (owner->view()->available() && owner->view()->theLockingInset()) {
+ UpdatableInset::RESULT result;
+ if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) &&
+ (keyseq.length >= -1)))
+ {
+ if ((action==LFUN_UNKNOWN_ACTION) && argument.empty()){
+ argument = keyseq.getiso();
+ }
+ // Undo/Redo is a bit tricky for insets.
+ if (action == LFUN_UNDO) {
+#ifdef RETHINK_THIS_FOR_NOW_WE_LEAVE_ALL_UNLOCKED
+ int slx;
+ int sly;
+ UpdatableInset * inset =
+ owner->view()->theLockingInset()->getLockingInset();
+ int inset_id = inset->id();
+ inset->getCursorPos(owner->view(), slx, sly);
+ owner->view()->unlockInset(inset);
+#else
+ owner->view()->unlockInset(owner->view()->theLockingInset());
+#endif
+ owner->view()->menuUndo();
+#ifdef RETHINK_THIS_FOR_NOW_WE_LEAVE_ALL_UNLOCKED
+#if 0
+ if (TEXT()->cursor.par()->
+ isInset(TEXT()->cursor.pos())) {
+ inset = static_cast<UpdatableInset*>(
+ TEXT()->cursor.par()->
+ getInset(TEXT()->
+ cursor.pos()));
} else {
- comname += " " + argument;
- argsadded = true;
- }
- }
-
- string shortcuts = toplevel_keymap->findbinding(pseudoaction);
-
- if (!shortcuts.empty()) {
- comname += ": " + shortcuts;
- } else if (!argsadded) {
- comname += " " + argument;
- }
-
- if (!comname.empty()) {
- comname = strip(comname);
- commandshortcut = "(" + comname + ')';
- owner->getMiniBuffer()->Set(commandshortcut);
- // 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)
- }
- }
- }
-
- // If in math mode pass the control to
- // the math inset [asierra060396]
- if (owner->view()->available() &&
- owner->view()->the_locking_inset) {
- UpdatableInset::RESULT result;
- if ((action > 1) || ((action == LFUN_UNKNOWN_ACTION) &&
- (keyseq.length >= -1)))
- {
- if ((action==LFUN_UNKNOWN_ACTION) && argument.empty()){
- argument = keyseq.getiso();
- }
- // Undo/Redo pre 0.13 is a bit tricky for insets.
- if (action == LFUN_UNDO) {
- int slx, sly;
- UpdatableInset * inset =
- owner->view()->the_locking_inset;
- inset->GetCursorPos(owner->view(), slx, sly);
- owner->view()->unlockInset(inset);
- owner->view()->menuUndo();
- if (owner->view()->text->cursor.par()->
- IsInset(owner->view()->text->cursor.pos())) {
- inset = static_cast<UpdatableInset*>(
- owner->view()->text->cursor.par()->
- GetInset(owner->view()->text->
- cursor.pos()));
- } else {
- inset = 0;
+ inset = 0;
}
+#else
+ inset = static_cast<UpdatableInset *>(owner->view()->buffer()->getInsetFromID(inset_id));
+#endif
if (inset)
- inset->Edit(owner->view(),slx,sly,0);
+ inset->edit(owner->view(),slx,sly,0);
+#endif
return string();
} else if (action == LFUN_REDO) {
- int slx, sly;
+ int slx;
+ int sly;
UpdatableInset * inset = owner->view()->
- the_locking_inset;
- inset->GetCursorPos(owner->view(), slx, sly);
+ theLockingInset();
+ inset->getCursorPos(owner->view(), slx, sly);
owner->view()->unlockInset(inset);
owner->view()->menuRedo();
inset = static_cast<UpdatableInset*>(
- owner->view()->text->cursor.par()->
- GetInset(owner->view()->text->
+ TEXT()->cursor.par()->
+ getInset(TEXT()->
cursor.pos()));
if (inset)
- inset->Edit(owner->view(),slx,sly,0);
+ inset->edit(owner->view(),slx,sly,0);
+ return string();
+ } else if (((result=owner->view()->theLockingInset()->
+ localDispatch(owner->view(), action, argument)) ==
+ UpdatableInset::DISPATCHED) ||
+ (result == UpdatableInset::DISPATCHED_NOUPDATE))
+ return string();
+ else if (result == UpdatableInset::FINISHED) {
+ if (TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
+ TEXT()->cursorRight(owner->view());
+ moveCursorUpdate(true, false);
+ owner->showState();
+ }
+ return string();
+ } 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();
+ } else if (result == UpdatableInset::FINISHED_UP) {
+ if (TEXT()->cursor.row()->previous()) {
+ TEXT()->cursorUp(owner->view());
+ moveCursorUpdate(true, false);
+ owner->showState();
+ }
return string();
- } else if (((result=owner->view()->the_locking_inset->
- LocalDispatch(owner->view(), action,
- argument)) ==
- UpdatableInset::DISPATCHED) ||
- (result == UpdatableInset::DISPATCHED_NOUPDATE))
+ } else if (result == UpdatableInset::FINISHED_DOWN) {
+ if (TEXT()->cursor.row()->next())
+ TEXT()->cursorDown(owner->view());
+ else
+ TEXT()->cursorRight(owner->view());
+ moveCursorUpdate(true, false);
+ owner->showState();
return string();
- else {
- setMessage(N_("Text mode"));
- switch(action) {
+ } else {
+ //setMessage(N_("Text mode"));
+ switch (action) {
case LFUN_UNKNOWN_ACTION:
case LFUN_BREAKPARAGRAPH:
case LFUN_BREAKLINE:
- owner->view()->text->CursorRight(owner->view());
+ TEXT()->cursorRight(owner->view());
owner->view()->setState();
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
+ owner->showState();
break;
case LFUN_RIGHT:
- if (!owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
- owner->view()->text->CursorRight(owner->view());
- moveCursorUpdate(false);
- owner->getMiniBuffer()->
- Set(CurrentState(owner->view()));
+ if (!TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
+ TEXT()->cursorRight(owner->view());
+ moveCursorUpdate(true, false);
+ owner->showState();
}
return string();
case LFUN_LEFT:
- if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
- owner->view()->text->CursorRight(owner->view());
- moveCursorUpdate(false);
- owner->getMiniBuffer()->
- Set(CurrentState(owner->view()));
+ if (TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
+ TEXT()->cursorRight(owner->view());
+ moveCursorUpdate(true, false);
+ owner->showState();
}
return string();
case LFUN_DOWN:
- owner->view()->text->CursorDown(owner->view());
- moveCursorUpdate(false);
- owner->getMiniBuffer()->
- Set(CurrentState(owner->view()));
+ if (TEXT()->cursor.row()->next())
+ TEXT()->cursorDown(owner->view());
+ else
+ TEXT()->cursorRight(owner->view());
+ moveCursorUpdate(true, false);
+ owner->showState();
return string();
default:
break;
}
}
- switch(action) {
+ switch (action) {
+
+ case LFUN_ESCAPE:
+ {
+ if (!owner->view()->available()) break;
+
+ // this function should be used always [asierra060396]
+ UpdatableInset * tli =
+ owner->view()->theLockingInset();
+ if (tli) {
+ UpdatableInset * lock = tli->getLockingInset();
+
+ if (tli == lock) {
+ owner->view()->unlockInset(tli);
+ TEXT()->cursorRight(owner->view());
+ moveCursorUpdate(true, false);
+ owner->showState();
+ } else {
+ tli->unlockInsetInInset(owner->view(),
+ lock,
+ true);
+ }
+ }
+ }
+ break;
+
// --- Misc -------------------------------------------
case LFUN_WORDFINDFORWARD :
case LFUN_WORDFINDBACKWARD : {
} else {
searched_string = last_search;
}
-
- LyXText * ltCur = owner->view()->text ;
-
- if (!searched_string.empty() &&
- ((action == LFUN_WORDFINDBACKWARD) ?
- ltCur->SearchBackward(owner->view(), searched_string.c_str()) :
- ltCur->SearchForward(owner->view(), searched_string.c_str()))) {
-
- // ??? What is that ???
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
-
- // ??? Needed ???
- // clear the selection (if there is any)
- owner->view()->toggleSelection();
- owner->view()->text->ClearSelection();
-
- // Move cursor so that successive C-s 's will not stand in place.
- if( action == LFUN_WORDFINDFORWARD )
- owner->view()->text->CursorRightOneWord(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
-
- // ??? Needed ???
- // set the new selection
- // SetSelectionOverLenChars(owner->view()->currentBuffer()->text, iLenSelected);
- owner->view()->toggleSelection(false);
- } else
- LyXBell();
-
- // REMOVED : if (owner->view()->getWorkArea()->focus)
- owner->view()->showCursor();
+ bool fw = (action == LFUN_WORDFINDBACKWARD);
+ if (!searched_string.empty()) {
+ LyXFind(owner->view(), searched_string, fw);
+ }
+// owner->view()->showCursor();
}
break;
-
+
case LFUN_PREFIX:
{
- if (owner->view()->available()) {
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
+ if (owner->view()->available() && !owner->view()->theLockingInset()) {
+ owner->view()->update(TEXT(),
+ BufferView::SELECT|BufferView::FITCUR);
}
string buf;
keyseq.print(buf, true);
- owner->getMiniBuffer()->Set(buf, string(), string(), 1);
+ owner->message(buf);
}
break;
// --- Misc -------------------------------------------
case LFUN_EXEC_COMMAND:
- owner->getMiniBuffer()->ExecCommand();
- break;
+ {
+ std::vector<string> allCmds;
+ std::transform(lyxaction.func_begin(), lyxaction.func_end(),
+ std::back_inserter(allCmds), lyx::firster());
+ static std::vector<string> hist;
+ owner->getMiniBuffer()->getString(MiniBuffer::spaces,
+ allCmds, hist);
+ }
+ break;
case LFUN_CANCEL: // RVDK_PATCH_5
keyseq.reset();
meta_fake_bit = 0;
- if(owner->view()->available())
+ if (owner->view()->available())
// cancel any selection
- Dispatch(LFUN_MARK_OFF, 0);
+ dispatch(LFUN_MARK_OFF);
setMessage(N_("Cancel"));
break;
meta_fake_bit = Mod1Mask;
string buf;
keyseq.print(buf, true);
- string res = string("M-") + buf;
setMessage(buf); // RVDK_PATCH_5
}
break;
owner->view()->center();
break;
- case LFUN_APPENDIX:
- if (owner->view()->available()) {
- owner->view()->text->toggleAppendix(owner->view());
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
- break;
-
// --- Menus -----------------------------------------------
case LFUN_MENUNEW:
- MenuNew(false);
+ menuNew(false);
break;
case LFUN_MENUNEWTMPLT:
- MenuNew(true);
- break;
-
- case LFUN_MENUOPEN:
- MenuOpen();
+ menuNew(true);
break;
case LFUN_CLOSEBUFFER:
- CloseBuffer();
+ closeBuffer();
break;
case LFUN_MENUWRITE:
- owner->getMiniBuffer()->Set(_("Saving document"),
- MakeDisplayPath(owner->buffer()->fileName()),
- "...");
- MenuWrite(owner->buffer());
- //owner->getMiniBuffer()-> {
- // Set(_("Document saved as"),
- // MakeDisplayPath(owner->buffer()->fileName()));
- //} else {
- //owner->getMiniBuffer()->Set(_("Save failed!"));
- //}
+ if (!owner->buffer()->isUnnamed()) {
+ ostringstream s1;
+ s1 << _("Saving document") << ' '
+ << MakeDisplayPath(owner->buffer()->fileName() + "...");
+ owner->message(s1.str().c_str());
+ MenuWrite(owner->view(), owner->buffer());
+ } else
+ WriteAs(owner->view(), owner->buffer());
break;
- case LFUN_MENUWRITEAS:
- MenuWriteAs(owner->buffer());
+ case LFUN_WRITEAS:
+ WriteAs(owner->view(), owner->buffer(), argument);
break;
case LFUN_MENURELOAD:
reloadBuffer();
break;
- case LFUN_PREVIEW:
- PreviewDVI(owner->buffer());
- break;
-
- case LFUN_PREVIEWPS:
- PreviewPostscript(owner->buffer());
+ case LFUN_UPDATE:
+ Exporter::Export(owner->buffer(), argument, true);
break;
-
- case LFUN_RUNLATEX:
- MenuRunLaTeX(owner->buffer());
+
+ case LFUN_PREVIEW:
+ Exporter::Preview(owner->buffer(), argument);
break;
case LFUN_BUILDPROG:
- MenuBuildProg(owner->buffer());
+ Exporter::Export(owner->buffer(), "program", true);
break;
case LFUN_RUNCHKTEX:
MenuRunChktex(owner->buffer());
break;
-
- case LFUN_RUNDVIPS:
- CreatePostscript(owner->buffer(), false);
- break;
-
+
case LFUN_MENUPRINT:
owner->getDialogs()->showPrint();
break;
- case LFUN_FAX:
- MenuFax(owner->buffer());
- break;
-
case LFUN_EXPORT:
- MenuExport(owner->buffer(), argument);
+ if (argument == "custom")
+ MenuSendto();
+ else
+ Exporter::Export(owner->buffer(), argument, false);
break;
case LFUN_IMPORT:
break;
case LFUN_TOCVIEW:
+#if 0
case LFUN_LOFVIEW:
case LFUN_LOTVIEW:
case LFUN_LOAVIEW:
+#endif
{
- Buffer::TocType type = Buffer::TOC_TOC;
- if (action == LFUN_LOFVIEW)
- type = Buffer::TOC_LOF;
- else if (action == LFUN_LOTVIEW)
- type = Buffer::TOC_LOT;
- else if (action == LFUN_LOAVIEW)
- type = Buffer::TOC_LOA;
- fl_set_choice(fd_form_toc->toctype,type + 1);
- TocUpdateCB(0, 0);
- if (fd_form_toc->form_toc->visible) {
- fl_raise_form(fd_form_toc->form_toc);
- } else {
- static int ow = -1, oh;
- fl_show_form(fd_form_toc->form_toc,
- FL_PLACE_MOUSE |
- FL_FREE_SIZE, FL_FULLBORDER,
- _("Table of Contents"));
- if (ow < 0) {
- ow = fd_form_toc->form_toc->w;
- oh = fd_form_toc->form_toc->h;
- }
- fl_set_form_minsize(fd_form_toc->form_toc, ow, oh);
- }
+ InsetCommandParams p;
+
+#if 0
+ if (action == LFUN_TOCVIEW)
+#endif
+ p.setCmdName("tableofcontents");
+#if 0
+ else if (action == LFUN_LOAVIEW )
+ p.setCmdName("listof{algorithm}{List of Algorithms}");
+ else if (action == LFUN_LOFVIEW)
+ p.setCmdName("listoffigures");
+ else
+ p.setCmdName("listoftables");
+#endif
+ owner->getDialogs()->createTOC(p.getAsString());
break;
}
- case LFUN_TOC_INSERT:
- {
- Inset * new_inset = new InsetTOC(owner->buffer());
- if (!owner->view()->insertInset(new_inset, "Standard", true))
- delete new_inset;
- break;
- }
-
- case LFUN_LOF_INSERT:
- {
- Inset * new_inset = new InsetLOF(owner->buffer());
- if (!owner->view()->insertInset(new_inset, "Standard", true))
- delete new_inset;
- break;
- }
-
- case LFUN_LOA_INSERT:
- {
- Inset * new_inset = new InsetLOA(owner->buffer());
- if (!owner->view()->insertInset(new_inset, "Standard", true))
- delete new_inset;
- break;
- }
- case LFUN_LOT_INSERT:
- {
- Inset * new_inset = new InsetLOT(owner->buffer());
- if (!owner->view()->insertInset(new_inset, "Standard", true))
- delete new_inset;
- break;
- }
-
- case LFUN_TABLE:
- Table();
+ case LFUN_DIALOG_TABULAR_INSERT:
+ owner->getDialogs()->showTabularCreate();
break;
case LFUN_FIGURE:
Figure();
break;
- case LFUN_INSERT_GRAPHICS:
- {
- Inset * new_inset = new InsetGraphics;
- if (!owner->view()->insertInset(new_inset))
- delete new_inset;
- break;
- }
-
case LFUN_AUTOSAVE:
AutoSave(owner->view());
break;
break;
case LFUN_MENUSEARCH:
- {
- // Ok this is one _very_ bad solution, but I think that some
- // of this will be rewritten as part of GUI indep anyway.
- // Lgb
- static LyXFindReplace FR_;
- FR_.StartSearch(owner->view());
- }
- break;
-
- case LFUN_PASTE:
- owner->view()->paste();
- owner->view()->setState();
- break;
-
- case LFUN_PASTESELECTION:
- {
- bool asPara = false;
- if (argument == "paragraph") asPara = true;
- owner->view()->pasteClipboard(asPara);
- }
- break;
-
- case LFUN_CUT:
- owner->view()->cut();
- break;
-
- case LFUN_COPY:
- owner->view()->copy();
- break;
-
- case LFUN_LAYOUT_COPY:
- owner->view()->copyEnvironment();
- break;
-
- case LFUN_LAYOUT_PASTE:
- owner->view()->pasteEnvironment();
- owner->view()->setState();
- break;
-
- case LFUN_GOTOERROR:
- owner->view()->gotoError();
+ owner->getDialogs()->showSearch();
break;
case LFUN_REMOVEERRORS:
if (owner->view()->removeAutoInsets()) {
owner->view()->redraw();
owner->view()->fitCursor();
- //owner->view()->updateScrollbar();
}
break;
-
- case LFUN_GOTONOTE:
- owner->view()->gotoNote();
- break;
-
- case LFUN_OPENSTUFF:
- owner->view()->openStuff();
- break;
-
- case LFUN_HYPHENATION:
- owner->view()->hyphenationPoint();
- break;
-
- case LFUN_LDOTS:
- owner->view()->ldots();
- break;
-
- case LFUN_END_OF_SENTENCE:
- owner->view()->endOfSentenceDot();
- break;
- case LFUN_MENU_SEPARATOR:
- owner->view()->menuSeparator();
- break;
-
- case LFUN_HFILL:
- owner->view()->hfill();
- break;
-
case LFUN_DEPTH:
- changeDepth(owner->view(), 0);
+ changeDepth(owner->view(), TEXT(false), 0);
break;
case LFUN_DEPTH_MIN:
- changeDepth(owner->view(), -1);
+ changeDepth(owner->view(), TEXT(false), -1);
break;
case LFUN_DEPTH_PLUS:
- changeDepth(owner->view(), 1);
+ changeDepth(owner->view(), TEXT(false), 1);
break;
case LFUN_FREE:
- Free(owner->view());
- owner->view()->setState();
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_TEX:
- Tex(owner->view());
- owner->view()->setState();
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
+ owner->getDialogs()->setUserFreeFont();
break;
-
- case LFUN_MELT:
- Melt(owner->view());
- break;
-
+
case LFUN_RECONFIGURE:
Reconfigure(owner->view());
break;
- case LFUN_FOOTMELT:
- if (owner->view()->available()
- && !owner->view()->text->selection
- && owner->view()->text->cursor.par()->footnoteflag
- != LyXParagraph::NO_FOOTNOTE)
- { // only melt footnotes with FOOTMELT, not margins etc
- if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::FOOTNOTE)
- Melt(owner->view());
- }
- else
- Foot(owner->view());
- owner->view()->setState();
+#if 0
+ case LFUN_FLOATSOPERATE:
+ if (argument == "openfoot")
+ owner->view()->allFloats(1,0);
+ else if (argument == "closefoot")
+ owner->view()->allFloats(0,0);
+ else if (argument == "openfig")
+ owner->view()->allFloats(1,1);
+ else if (argument == "closefig")
+ owner->view()->allFloats(0,1);
break;
-
- case LFUN_MARGINMELT:
- if (owner->view()->available()
- && !owner->view()->text->selection
- && owner->view()->text->cursor.par()->footnoteflag
- != LyXParagraph::NO_FOOTNOTE) {
- // only melt margins
- if(owner->view()->text->cursor.par()->footnotekind == LyXParagraph::MARGIN)
- Melt(owner->view());
- } else
- Margin(owner->view());
- owner->view()->setState();
+#else
+#ifdef WITH_WARNINGS
+#warning Find another implementation here (or another lyxfunc)!
+#endif
+#endif
+ case LFUN_HELP_ABOUTLYX:
+ owner->getDialogs()->showAboutlyx();
break;
-
+
case LFUN_HELP_COPYRIGHT:
- owner->getDialogs()->showCopyright();
+ case LFUN_HELP_CREDITS:
+
+
+ case LFUN_HELP_OPEN:
+ {
+ string const arg = argument;
+ if (arg.empty()) {
+ setErrorMessage(N_("Missing argument"));
+ break;
+ }
+ owner->prohibitInput();
+ string const fname = i18nLibFileSearch("doc", arg, "lyx");
+ if (fname.empty()) {
+ lyxerr << "LyX: unable to find documentation file `"
+ << arg << "'. Bad installation?" << endl;
+ owner->allowInput();
+ break;
+ }
+ ostringstream str;
+ str << _("Opening help file") << ' '
+ << MakeDisplayPath(fname) << "...";
+ owner->message(str.str().c_str());
+ owner->view()->buffer(bufferlist.loadLyXFile(fname, false));
+ owner->allowInput();
break;
+ }
+ case LFUN_HELP_VERSION:
+
// --- version control -------------------------------
case LFUN_VC_REGISTER:
{
case LFUN_VC_HISTORY:
{
- owner->buffer()->lyxvc.showLog();
+ owner->getDialogs()->showVCLogFile();
break;
}
// --- buffers ----------------------------------------
- case LFUN_FILE_INSERT:
- {
- MenuInsertLyXFile(argument);
- }
- break;
-
- case LFUN_FILE_INSERT_ASCII:
- {
- bool asPara = (argument == "paragraph");
- InsertAsciiFile(owner->view(), string(), asPara);
- }
- break;
-
+ case LFUN_SWITCHBUFFER:
+ owner->view()->buffer(bufferlist.getBuffer(argument));
+ break;
+
case LFUN_FILE_NEW:
{
// servercmd: argument must be <file>:<template>
break;
case LFUN_FILE_OPEN:
- owner->view()->buffer(bufferlist.loadLyXFile(argument));
+ open(argument);
break;
case LFUN_LATEX_LOG:
- ShowLatexLog();
+ owner->getDialogs()->showLogFile();
break;
case LFUN_LAYOUTNO:
{
- lyxerr.debug() << "LFUN_LAYOUTNO: (arg) " << argument << endl;
+ lyxerr[Debug::INFO] << "LFUN_LAYOUTNO: (arg) " << argument << endl;
int sel = strToInt(argument);
- lyxerr.debug() << "LFUN_LAYOUTNO: (sel) "<< sel << endl;
+ lyxerr[Debug::INFO] << "LFUN_LAYOUTNO: (sel) "<< sel << endl;
// Should this give a setMessage instead?
if (sel == 0)
--sel; // sel 1..., but layout 0...
// Pretend we got the name instead.
- Dispatch(int(LFUN_LAYOUT),
+ dispatch(int(LFUN_LAYOUT),
textclasslist.NameOfLayout(owner->view()
->buffer()->params.textclass,
- sel).c_str());
+ sel));
return string();
}
- case LFUN_LAYOUT:
- {
- lyxerr.debug() << "LFUN_LAYOUT: (arg) "
- << argument << endl;
-
- // Derive layout number from given argument (string)
- // and current buffer's textclass (number). */
- LyXTextClassList::ClassList::size_type tclass =
- owner->view()->buffer()->params.textclass;
- pair <bool, LyXTextClass::size_type> layout =
- textclasslist.NumberOfLayout(tclass, argument);
-
- // If the entry is obsolete, use the new one instead.
- if (layout.first) {
- string obs = textclasslist.Style(tclass,layout.second)
- .obsoleted_by();
- if (!obs.empty())
- layout =
- textclasslist.NumberOfLayout(tclass, obs);
- }
-
- // see if we found the layout number:
- if (!layout.first) {
- setErrorMessage(string(N_("Layout ")) + argument +
- N_(" not known"));
- break;
- }
-
- if (current_layout != layout.second) {
- owner->view()->hideCursor();
- current_layout = layout.second;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->
- SetLayout(owner->view(), layout.second);
- owner->getToolbar()->combox->
- select(owner->view()->
- text->cursor.par()->
- GetLayout() + 1);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- owner->view()->setState();
- }
- }
- break;
-
case LFUN_LAYOUT_DOCUMENT:
- MenuLayoutDocument();
+ owner->getDialogs()->showDocument();
break;
case LFUN_LAYOUT_PARAGRAPH:
- MenuLayoutParagraph();
+ owner->getDialogs()->showParagraph();
break;
case LFUN_LAYOUT_CHARACTER:
- MenuLayoutCharacter();
- break;
-
- case LFUN_LAYOUT_TABLE:
- {
- int flag = 0;
- if (argument == "true") flag = 1;
- MenuLayoutTable(flag);
- }
- break;
-
- case LFUN_LAYOUT_PAPER:
- MenuLayoutPaper();
- break;
-
- case LFUN_LAYOUT_QUOTES:
- MenuLayoutQuotes();
- break;
-
+ owner->getDialogs()->showCharacter();
+ break;
+
+ case LFUN_LAYOUT_TABULAR:
+ if (owner->view()->theLockingInset()) {
+ if (owner->view()->theLockingInset()->lyxCode()==Inset::TABULAR_CODE) {
+ InsetTabular * inset = static_cast<InsetTabular *>
+ (owner->view()->theLockingInset());
+ inset->openLayoutDialog(owner->view());
+ } else if (owner->view()->theLockingInset()->
+ getFirstLockingInsetOfType(Inset::TABULAR_CODE)!=0) {
+ InsetTabular * inset = static_cast<InsetTabular *>(
+ owner->view()->theLockingInset()->getFirstLockingInsetOfType(Inset::TABULAR_CODE));
+ inset->openLayoutDialog(owner->view());
+ }
+ }
+ break;
+
case LFUN_LAYOUT_PREAMBLE:
- MenuLayoutPreamble();
+ owner->getDialogs()->showPreamble();
break;
case LFUN_LAYOUT_SAVE_DEFAULT:
- MenuLayoutSave();
+ MenuLayoutSave(owner->view());
break;
case LFUN_DROP_LAYOUTS_CHOICE:
- owner->getToolbar()->combox->Show();
- break;
-
- case LFUN_LANGUAGE:
- Lang(owner->view(), argument);
- owner->view()->setState();
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
+ owner->getToolbar()->openLayoutList();
break;
- case LFUN_EMPH:
- Emph(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_BOLD:
- Bold(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_NOUN:
- Noun(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_CODE:
- Code(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_SANS:
- Sans(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_ROMAN:
- Roman(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_DEFAULT:
- StyleReset(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_UNDERLINE:
- Underline(owner->view());
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_FONT_SIZE:
- FontSize(owner->view(), argument);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_FONT_STATE:
- setMessage(CurrentState(owner->view()));
- break;
-
- case LFUN_UPCASE_WORD:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->ChangeWordCase(owner->view(),
- LyXText::text_uppercase);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- break;
-
- case LFUN_LOWCASE_WORD:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->ChangeWordCase(owner->view(),
- LyXText::text_lowercase);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- break;
-
- case LFUN_CAPITALIZE_WORD:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->ChangeWordCase(owner->view(),
- LyXText::text_capitalization);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- break;
+ case LFUN_MENU_OPEN_BY_NAME:
+ owner->getMenubar()->openByName(argument);
+ break; // RVDK_PATCH_5
- case LFUN_INSERT_LABEL:
- MenuInsertLabel(argument.c_str());
+ case LFUN_SPELLCHECK:
+ if (lyxrc.isp_command != "none")
+ owner->getDialogs()->showSpellchecker();
break;
- case LFUN_INSERT_REF:
- MenuInsertRef();
+ // --- lyxserver commands ----------------------------
+
+
+ case LFUN_GETNAME:
+ setMessage(owner->buffer()->fileName());
+ lyxerr[Debug::INFO] << "FNAME["
+ << owner->buffer()->fileName()
+ << "] " << endl;
break;
- case LFUN_REFTOGGLE:
- {
- InsetRef * inset =
- static_cast<InsetRef*>(getInsetByCode(Inset::REF_CODE));
- if (inset) {
- inset->Toggle();
- owner->view()->updateInset(inset, true);
- } else {
- setErrorMessage(N_("No cross-reference to toggle"));
- }
- }
- break;
-
- case LFUN_REFBACK:
- {
- owner->view()->restorePosition();
- }
- break;
-
- case LFUN_REFGOTO:
- {
- string label(argument);
- if (label.empty()) {
- InsetRef * inset =
- static_cast<InsetRef*>(getInsetByCode(Inset::REF_CODE));
- if (inset)
- label = inset->getContents();
- }
-
- if (!label.empty()) {
- owner->view()->savePosition();
- if (!owner->view()->gotoLabel(label))
- WriteAlert(_("Error"),
- _("Couldn't find this label"),
- _("in current document."));
- }
- }
- break;
-
- case LFUN_MENU_OPEN_BY_NAME:
- owner->getMenus()->openByName(argument);
- break; // RVDK_PATCH_5
-
- case LFUN_SPELLCHECK:
- if (lyxrc.isp_command != "none")
- ShowSpellChecker(owner->view());
- break; // RVDK_PATCH_5
-
- // --- Cursor Movements -----------------------------
- case LFUN_RIGHT:
- {
- LyXText * tmptext = owner->view()->text;
- bool is_rtl = tmptext->cursor.par()->isRightToLeftPar(owner->buffer()->params);
- if(!tmptext->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (is_rtl)
- tmptext->CursorLeft(owner->view(), false);
- if (tmptext->cursor.pos() < tmptext->cursor.par()->Last()
- && tmptext->cursor.par()->GetChar(tmptext->cursor.pos())
- == LyXParagraph::META_INSET
- && tmptext->cursor.par()->GetInset(tmptext->cursor.pos())
- && tmptext->cursor.par()->GetInset(tmptext->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE){
- Inset * tmpinset = tmptext->cursor.par()->GetInset(tmptext->cursor.pos());
- setMessage(tmpinset->EditMessage());
- tmpinset->Edit(owner->view(), 0, 0, 0);
- break;
- }
- if (!is_rtl)
- tmptext->CursorRight(owner->view(), false);
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- }
- break;
-
- case LFUN_LEFT:
- {
- // This is soooo ugly. Isn`t it possible to make
- // it simpler? (Lgb)
- LyXText * txt = owner->view()->text;
- bool is_rtl = txt->cursor.par()->isRightToLeftPar(owner->buffer()->params);
- if(!txt->mark_set) owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (!is_rtl)
- txt->CursorLeft(owner->view(), false);
- if (txt->cursor.pos() < txt->cursor.par()->Last()
- && txt->cursor.par()->GetChar(txt->cursor.pos())
- == LyXParagraph::META_INSET
- && txt->cursor.par()->GetInset(txt->cursor.pos())
- && txt->cursor.par()->GetInset(txt->cursor.pos())->Editable() == Inset::HIGHLY_EDITABLE) {
- Inset * tmpinset = txt->cursor.par()->GetInset(txt->cursor.pos());
- setMessage(tmpinset->EditMessage());
- LyXFont font = txt->GetFont(owner->view()->buffer(),
- txt->cursor.par(),
- txt->cursor.pos());
- tmpinset->Edit(owner->view(),
- tmpinset->x() + tmpinset->width(owner->view()->painter(),font),
- tmpinset->descent(owner->view()->painter(),font),
- 0);
- break;
- }
- if (is_rtl)
- txt->CursorRight(owner->view(), false);
-
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- }
- break;
-
- case LFUN_UP:
- if(!owner->view()->text->mark_set) owner->view()->beforeChange();
- owner->view()->update(BufferView::UPDATE);
- owner->view()->text->CursorUp(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_DOWN:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::UPDATE);
- owner->view()->text->CursorDown(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_UP_PARAGRAPH:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::UPDATE);
- owner->view()->text->CursorUpParagraph(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_DOWN_PARAGRAPH:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::UPDATE);
- owner->view()->text->CursorDownParagraph(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_PRIOR:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::UPDATE);
- owner->view()->cursorPrevious();
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_NEXT:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::UPDATE);
- owner->view()->cursorNext();
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_HOME:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorHome(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_END:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorEnd(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_SHIFT_TAB:
- case LFUN_TAB:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorTab(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_WORDRIGHT:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
- owner->view()->text->CursorLeftOneWord(owner->view());
- else
- owner->view()->text->CursorRightOneWord(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_WORDLEFT:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
- owner->view()->text->CursorRightOneWord(owner->view());
- else
- owner->view()->text->CursorLeftOneWord(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_BEGINNINGBUF:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorTop(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_ENDBUF:
- if(!owner->view()->text->mark_set)
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorBottom(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
-
- /* cursor selection ---------------------------- */
- case LFUN_RIGHTSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
- owner->view()->text->CursorLeft(owner->view());
- else
- owner->view()->text->CursorRight(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_LEFTSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
- owner->view()->text->CursorRight(owner->view());
- else
- owner->view()->text->CursorLeft(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_UPSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorUp(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_DOWNSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorDown(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_UP_PARAGRAPHSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorUpParagraph(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_DOWN_PARAGRAPHSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorDownParagraph(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_PRIORSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->cursorPrevious();
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_NEXTSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->cursorNext();
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_HOMESEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorHome(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_ENDSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorEnd(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_WORDRIGHTSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
- owner->view()->text->CursorLeftOneWord(owner->view());
- else
- owner->view()->text->CursorRightOneWord(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_WORDLEFTSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- if (owner->view()->text->cursor.par()->isRightToLeftPar(owner->buffer()->params))
- owner->view()->text->CursorRightOneWord(owner->view());
- else
- owner->view()->text->CursorLeftOneWord(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_BEGINNINGBUFSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorTop(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- case LFUN_ENDBUFSEL:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->CursorBottom(owner->view());
- owner->view()->text->FinishUndo();
- moveCursorUpdate(true);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- // --- text changing commands ------------------------
- case LFUN_BREAKLINE:
- owner->view()->beforeChange();
- owner->view()->text->InsertChar(owner->view(), LyXParagraph::META_NEWLINE);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- moveCursorUpdate(false);
- break;
-
- case LFUN_PROTECTEDSPACE:
- {
- LyXLayout const & style =
- textclasslist.Style(owner->view()->buffer()->params.textclass,
- owner->view()->text->cursor.par()->GetLayout());
-
- if (style.free_spacing) {
- owner->view()->text->InsertChar(owner->view(), ' ');
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- } else {
- owner->view()->protectedBlank();
- }
- moveCursorUpdate(false);
- }
- break;
-
- case LFUN_SETMARK:
- if(owner->view()->text->mark_set) {
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- setMessage(N_("Mark removed"));
- } else {
- owner->view()->beforeChange();
- owner->view()->text->mark_set = 1;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- setMessage(N_("Mark set"));
- }
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- break;
-
- case LFUN_DELETE:
- if (!owner->view()->text->selection) {
- owner->view()->text->Delete(owner->view());
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- // It is possible to make it a lot faster still
- // just comment out the lone below...
- owner->view()->showCursor();
- } else {
- owner->view()->cut();
- }
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- owner->view()->setState();
- break;
-
- case LFUN_DELETE_SKIP:
- {
- // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
-
- LyXCursor cursor = owner->view()->text->cursor;
-
- if (!owner->view()->text->selection) {
- if (cursor.pos() == cursor.par()->Last()) {
- owner->view()->text->CursorRight(owner->view());
- cursor = owner->view()->text->cursor;
- if (cursor.pos() == 0
- && !(cursor.par()->added_space_top
- == VSpace (VSpace::NONE))) {
- owner->view()->text->SetParagraph
- (owner->view(),
- cursor.par()->line_top,
- cursor.par()->line_bottom,
- cursor.par()->pagebreak_top,
- cursor.par()->pagebreak_bottom,
- VSpace(VSpace::NONE),
- cursor.par()->added_space_bottom,
- cursor.par()->align,
- cursor.par()->labelwidthstring, 0);
- owner->view()->text->CursorLeft(owner->view());
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- } else {
- owner->view()->text->CursorLeft(owner->view());
- owner->view()->text->Delete(owner->view());
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
- } else {
- owner->view()->text->Delete(owner->view());
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
- } else {
- owner->view()->cut();
- }
- }
- break;
-
- /* -------> Delete word forward. */
- case LFUN_DELETE_WORD_FORWARD:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->DeleteWordForward(owner->view());
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- /* -------> Delete word backward. */
- case LFUN_DELETE_WORD_BACKWARD:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->DeleteWordBackward(owner->view());
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- moveCursorUpdate(false);
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
-
- /* -------> Kill to end of line. */
- case LFUN_DELETE_LINE_FORWARD:
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->DeleteLineForward(owner->view());
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- moveCursorUpdate(false);
- break;
-
- /* -------> Set mark off. */
- case LFUN_MARK_OFF:
- owner->view()->beforeChange();
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- setMessage(N_("Mark off"));
- break;
-
- /* -------> Set mark on. */
- case LFUN_MARK_ON:
- owner->view()->beforeChange();
- owner->view()->text->mark_set = 1;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR);
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- setMessage(N_("Mark on"));
- break;
-
- case LFUN_BACKSPACE:
- {
- if (!owner->view()->text->selection) {
- if (owner->getIntl()->getTrans()->backspace()) {
- owner->view()->text->Backspace(owner->view());
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- // It is possible to make it a lot faster still
- // just comment out the lone below...
- owner->view()->showCursor();
- }
- } else {
- owner->view()->cut();
- }
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- owner->view()->setState();
- }
- break;
-
- case LFUN_BACKSPACE_SKIP:
- {
- // Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
-
- LyXCursor cursor = owner->view()->text->cursor;
-
- if (!owner->view()->text->selection) {
- if (cursor.pos() == 0
- && !(cursor.par()->added_space_top
- == VSpace (VSpace::NONE))) {
- owner->view()->text->SetParagraph
- (owner->view(),
- cursor.par()->line_top,
- cursor.par()->line_bottom,
- cursor.par()->pagebreak_top,
- cursor.par()->pagebreak_bottom,
- VSpace(VSpace::NONE), cursor.par()->added_space_bottom,
- cursor.par()->align,
- cursor.par()->labelwidthstring, 0);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- } else {
- owner->view()->text->Backspace(owner->view());
- owner->view()->text->sel_cursor
- = cursor;
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
- } else
- owner->view()->cut();
- }
- break;
-
- case LFUN_BREAKPARAGRAPH:
- {
- owner->view()->beforeChange();
- owner->view()->text->BreakParagraph(owner->view(), 0);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- owner->view()->setState();
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
- }
-
- case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
- {
- owner->view()->beforeChange();
- owner->view()->text->BreakParagraph(owner->view(), 1);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- owner->view()->setState();
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- break;
- }
-
- case LFUN_BREAKPARAGRAPH_SKIP:
- {
- // When at the beginning of a paragraph, remove
- // indentation and add a "defskip" at the top.
- // Otherwise, do the same as LFUN_BREAKPARAGRAPH.
-
- LyXCursor cursor = owner->view()->text->cursor;
-
- owner->view()->beforeChange();
- if (cursor.pos() == 0) {
- if (cursor.par()->added_space_top == VSpace(VSpace::NONE)) {
- owner->view()->text->SetParagraph
- (owner->view(),
- cursor.par()->line_top,
- cursor.par()->line_bottom,
- cursor.par()->pagebreak_top,
- cursor.par()->pagebreak_bottom,
- VSpace(VSpace::DEFSKIP), cursor.par()->added_space_bottom,
- cursor.par()->align,
- cursor.par()->labelwidthstring, 1);
- //owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
- }
- else {
- owner->view()->text->BreakParagraph(owner->view(), 0);
- //owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
-
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- owner->view()->text->sel_cursor = cursor;
- owner->view()->setState();
- owner->getMiniBuffer()->Set(CurrentState(owner->view()));
- }
- break;
-
- case LFUN_PARAGRAPH_SPACING:
- {
- LyXParagraph * par = owner->view()->text->cursor.par();
- Spacing::Space cur_spacing = par->spacing.getSpace();
- float cur_value = 1.0;
- if (cur_spacing == Spacing::Other) {
- cur_value = par->spacing.getValue();
- }
-
-#ifdef HAVE_SSTREAM
- istringstream istr(argument);
-#else
- istrstream istr(argument.c_str());
-#endif
- string tmp;
- istr >> tmp;
- Spacing::Space new_spacing = cur_spacing;
- float new_value = cur_value;
- if (tmp.empty()) {
- lyxerr << "Missing argument to `paragraph-spacing'"
- << endl;
- } else if (tmp == "single") {
- new_spacing = Spacing::Single;
- } else if (tmp == "onehalf") {
- new_spacing = Spacing::Onehalf;
- } else if (tmp == "double") {
- new_spacing = Spacing::Double;
- } else if (tmp == "other") {
- new_spacing = Spacing::Other;
- float tmpval = 0.0;
- istr >> tmpval;
- lyxerr << "new_value = " << tmpval << endl;
- if (tmpval != 0.0)
- new_value = tmpval;
- } else if (tmp == "default") {
- new_spacing = Spacing::Default;
- } else {
- lyxerr << _("Unknown spacing argument: ")
- << argument << endl;
- }
- if (cur_spacing != new_spacing || cur_value != new_value) {
- par->spacing.set(new_spacing, new_value);
- owner->view()->text->RedoParagraph(owner->view());
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
- }
- break;
-
- case LFUN_QUOTE:
- owner->view()->beforeChange();
- owner->view()->text->InsertChar(owner->view(), '\"'); // This " matches the single quote in the code
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- moveCursorUpdate(false);
- break;
-
- case LFUN_HTMLURL:
- case LFUN_URL:
- {
- InsetCommand * new_inset;
- if (action == LFUN_HTMLURL)
- new_inset = new InsetUrl("htmlurl", "", "");
- else
- new_inset = new InsetUrl("url", "", "");
- if (owner->view()->insertInset(new_inset))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
- }
- break;
-
- case LFUN_INSET_TEXT:
- {
- InsetText * new_inset = new InsetText();
- if (owner->view()->insertInset(new_inset))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
- }
- break;
- case LFUN_INSET_ERT:
- {
- InsetERT * new_inset = new InsetERT();
- if (owner->view()->insertInset(new_inset))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
- }
- break;
-
- case LFUN_INSET_EXTERNAL:
- {
- InsetExternal * new_inset = new InsetExternal();
- if (owner->view()->insertInset(new_inset))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
- }
- break;
-
- case LFUN_INSET_FOOTNOTE:
- {
- InsetFoot * new_inset = new InsetFoot();
- if (owner->view()->insertInset(new_inset))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
- }
- break;
-
- case LFUN_INSET_TABULAR:
- {
- int r = 2, c = 2;
- if (!argument.empty())
- sscanf(argument.c_str(),"%d%d",&r,&c);
- InsetTabular * new_inset = new InsetTabular(owner->buffer(),r,c);
- if (owner->view()->insertInset(new_inset))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
- }
- break;
-
- // --- lyxserver commands ----------------------------
-
- case LFUN_CHARATCURSOR:
- {
- LyXParagraph::size_type pos =
- owner->view()->text->cursor.pos();
- if(pos < owner->view()->text->cursor.par()->size())
- //dispatch_buffer = owner->view()->text->
- // cursor.par()->text[pos];
- dispatch_buffer =
- owner->view()->text->
- cursor.par()->GetChar(pos);
- else
- dispatch_buffer = "EOF";
- }
- break;
-
- case LFUN_GETXY:
- dispatch_buffer =
- tostr(owner->view()->text->cursor.x()) + ' '
- + tostr(owner->view()->text->cursor.y());
- break;
-
- case LFUN_SETXY:
- {
- int x;
- long y;
- sscanf(argument.c_str(), " %d %ld", &x, &y);
- owner->view()->text->SetCursorFromCoordinates(owner->view(), x, y);
- }
- break;
-
- case LFUN_GETLAYOUT:
- dispatch_buffer =
- tostr(owner->view()->text->cursor.par()->layout);
- break;
-
- case LFUN_GETFONT:
- {
- LyXFont & font = owner->view()->text->current_font;
- if(font.shape() == LyXFont::ITALIC_SHAPE)
- dispatch_buffer = 'E';
- else if(font.shape() == LyXFont::SMALLCAPS_SHAPE)
- dispatch_buffer = 'N';
- else
- dispatch_buffer = '0';
-
- }
- break;
-
- case LFUN_GETLATEX:
- {
- LyXFont & font = owner->view()->text->current_font;
- if(font.latex() == LyXFont::ON)
- dispatch_buffer = 'L';
- else
- dispatch_buffer = '0';
- }
- break;
-
- case LFUN_GETNAME:
- setMessage(owner->buffer()->fileName());
- lyxerr.debug() << "FNAME["
- << owner->buffer()->fileName()
- << "] " << endl;
- break;
-
- case LFUN_NOTIFY:
+ case LFUN_NOTIFY:
{
string buf;
keyseq.print(buf);
case LFUN_GOTOFILEROW:
{
- char file_name[100];
- int row;
- sscanf(argument.c_str(), " %s %d", file_name, &row);
-
+ string file_name;
+ int row;
+ istringstream istr(argument.c_str());
+ istr >> file_name >> row;
// Must replace extension of the file to be .lyx and get full path
- string s = ChangeExtension(string(file_name), ".lyx");
+ string const s(ChangeExtension(file_name, ".lyx"));
// Either change buffer or load the file
- if (bufferlist.exists(s))
+ if (bufferlist.exists(s)) {
owner->view()->buffer(bufferlist.getBuffer(s));
- else
+ } else {
owner->view()->buffer(bufferlist.loadLyXFile(s));
-
+ }
+
// Set the cursor
owner->view()->setCursorFromRow(row);
}
break;
- case LFUN_APROPOS:
- case LFUN_GETTIP:
- {
- int qa = lyxaction.LookupFunc(argument.c_str());
- setMessage(lyxaction.helpText(static_cast<kb_action>(qa)));
- }
- break;
-
- // --- accented characters ---------------------------
-
- case LFUN_UMLAUT:
- case LFUN_CIRCUMFLEX:
- case LFUN_GRAVE:
- case LFUN_ACUTE:
- case LFUN_TILDE:
- case LFUN_CEDILLA:
- case LFUN_MACRON:
- case LFUN_DOT:
- case LFUN_UNDERDOT:
- case LFUN_UNDERBAR:
- case LFUN_CARON:
- case LFUN_SPECIAL_CARON:
- case LFUN_BREVE:
- case LFUN_TIE:
- case LFUN_HUNG_UMLAUT:
- case LFUN_CIRCLE:
- case LFUN_OGONEK:
+ case LFUN_GOTO_PARAGRAPH:
{
- char c = 0;
-
- if (keyseq.length == -1 && keyseq.getiso() != 0)
- c = keyseq.getiso();
-
- owner->getIntl()->getTrans()->
- deadkey(c, get_accent(action).accent,
- owner->view()->text);
-
- // Need to reset, in case the minibuffer calls these
- // actions
- keyseq.reset();
- keyseq.length = 0;
-
- // copied verbatim from do_accent_char
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ istringstream istr(argument.c_str());
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- }
- break;
-
- // --- toolbar ----------------------------------
- case LFUN_PUSH_TOOLBAR:
- {
- int nth = strToInt(argument);
- if (lyxerr.debugging(Debug::TOOLBAR)) {
- lyxerr << "LFUN_PUSH_TOOLBAR: argument = `"
- << argument << "'\n"
- << "LFUN_PUSH_TOOLBAR: nth = `"
- << nth << "'" << endl;
- }
-
- if (nth <= 0) {
- LyXBell();
- setErrorMessage(N_("Push-toolbar needs argument > 0"));
- } else {
- owner->getToolbar()->push(nth);
- }
- }
- break;
-
- case LFUN_ADD_TO_TOOLBAR:
- {
- if (lyxerr.debugging(Debug::TOOLBAR)) {
- lyxerr << "LFUN_ADD_TO_TOOLBAR:"
- "argument = `" << argument << '\'' << endl;
- }
- string tmp(argument);
- //lyxerr <<string("Argument: ") + argument);
- //lyxerr <<string("Tmp : ") + tmp);
- if (tmp.empty()) {
- LyXBell();
- setErrorMessage(N_("Usage: toolbar-add-to <LyX command>"));
+ int id;
+ istr >> id;
+ Paragraph * par = owner->buffer()->getParFromID(id);
+ if (par == 0) {
+ lyxerr[Debug::INFO] << "No matching paragraph found! ["
+ << id << "]" << std::endl;
+ break;
} else {
- owner->getToolbar()->add(argument, false);
- owner->getToolbar()->set();
+ lyxerr << "Paragraph " << par->id()
+ << " found." << endl;
}
- }
- break;
-
- // --- insert characters ----------------------------------------
- // --- Mathed stuff. If we are here, there is no locked inset yet.
-
- // Greek mode
- case LFUN_GREEK:
- {
- if (!greek_kb_flag) {
- greek_kb_flag = 1;
- setMessage(N_("Math greek mode on"));
- } else
- greek_kb_flag = 0;
- }
- break;
-
- // Greek keyboard
- case LFUN_GREEK_TOGGLE:
- {
- greek_kb_flag = greek_kb_flag ? 0 : 2;
- if (greek_kb_flag) {
- setMessage(N_("Math greek keyboard on"));
- } else {
- setMessage(N_("Math greek keyboard off"));
- }
- }
- break;
-
- case LFUN_MATH_DELIM:
- case LFUN_INSERT_MATRIX:
- {
- if (owner->view()->available()) {
- owner->view()->
- open_new_inset(new InsetFormula(false));
- owner->view()
- ->the_locking_inset
- ->LocalDispatch(owner->view(),
- action,
- argument);
- }
- }
- break;
-
- case LFUN_INSERT_MATH:
- {
- math_insert_symbol(argument.c_str());
- }
- break;
-
- case LFUN_MATH_DISPLAY:
- {
- if (owner->view()->available())
- owner->view()->open_new_inset(new InsetFormula(true));
- break;
- }
-
- case LFUN_MATH_MACRO:
- {
- if (owner->view()->available()) {
- string s(argument);
- if (s.empty())
- setErrorMessage(N_("Missing argument"));
- else {
- string s1 = token(s, ' ', 1);
- int na = s1.empty() ? 0: atoi(s1.c_str());
- owner->view()->
- open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na));
- }
- }
- }
- break;
+ // Set the cursor
+ owner->view()->text->setCursor(owner->view(), par, 0);
+ owner->view()->setState();
+ owner->showState();
- case LFUN_MATH_MODE: // Open or create a math inset
- {
-
- if (owner->view()->available())
- owner->view()->open_new_inset(new InsetFormula);
- setMessage(N_("Math editor mode"));
- }
- break;
-
- case LFUN_MATH_NUMBER:
- case LFUN_MATH_LIMITS:
- {
- setErrorMessage(N_("This is only allowed in math mode!"));
- }
- break;
-
- case LFUN_INSERT_CITATION:
- {
- InsetCitation * new_inset = new InsetCitation();
- // ale970405
- // The note, if any, must be after the key, delimited
- // by a | so both key and remark can have spaces.
- if (!argument.empty()) {
- string lsarg(argument);
- if (contains(lsarg, "|")) {
- new_inset->setContents(token(lsarg, '|', 0));
- new_inset->setOptions(token(lsarg, '|', 1));
- } else
- new_inset->setContents(lsarg);
- if (!owner->view()->insertInset(new_inset))
- delete new_inset;
- } else {
- if (owner->view()->insertInset(new_inset))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
- }
- }
- break;
-
- case LFUN_INSERT_BIBTEX:
- {
- // ale970405+lasgoutt970425
- // The argument can be up to two tokens separated
- // by a space. The first one is the bibstyle.
- string lsarg(argument);
- string bibstyle = token(lsarg, ' ', 1);
- if (bibstyle.empty())
- bibstyle = "plain";
- InsetBibtex * new_inset
- = new InsetBibtex(token(lsarg, ' ', 0),
- bibstyle,
- owner->buffer());
-
- if (owner->view()->insertInset(new_inset)) {
- if (lsarg.empty())
- new_inset->Edit(owner->view(), 0, 0, 0);
- } else
- delete new_inset;
+ // Recenter screen
+ owner->view()->center();
}
break;
-
- // BibTeX data bases
- case LFUN_BIBDB_ADD:
+
+ case LFUN_APROPOS:
+ case LFUN_GETTIP:
{
- InsetBibtex * inset =
- static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
- if (inset) {
- inset->addDatabase(argument);
- }
+ int const qa = lyxaction.LookupFunc(argument);
+ setMessage(lyxaction.helpText(static_cast<kb_action>(qa)));
}
break;
-
- case LFUN_BIBDB_DEL:
+
+ // --- toolbar ----------------------------------
+ case LFUN_PUSH_TOOLBAR:
{
- InsetBibtex * inset =
- static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
- if (inset) {
- inset->delDatabase(argument);
+ int nth = strToInt(argument);
+ if (nth <= 0) {
+ setErrorMessage(N_("Push-toolbar needs argument > 0"));
+ } else {
+ owner->getToolbar()->push(nth);
}
}
break;
- case LFUN_BIBTEX_STYLE:
+ case LFUN_ADD_TO_TOOLBAR:
{
- InsetBibtex * inset =
- static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
- if (inset) {
- inset->setOptions(argument);
+ if (lyxerr.debugging(Debug::GUI)) {
+ lyxerr << "LFUN_ADD_TO_TOOLBAR:"
+ "argument = `" << argument << '\'' << endl;
}
- }
- break;
-
- case LFUN_INDEX_INSERT:
- case LFUN_INDEX_INSERT_LAST:
- {
- // Can't do that at the beginning of a paragraph.
- if (owner->view()->text->cursor.pos() - 1 < 0)
- break;
-
- InsetIndex * new_inset = new InsetIndex();
- if (!argument.empty()) {
- string lsarg(argument);
- new_inset->setContents(lsarg);
- if (!owner->view()->insertInset(new_inset))
- delete new_inset;
+ string tmp(argument);
+ //lyxerr <<string("Argument: ") + argument);
+ //lyxerr <<string("Tmp : ") + tmp);
+ if (tmp.empty()) {
+ setErrorMessage(N_("Usage: toolbar-add-to <LyX command>"));
} else {
- //reh 98/09/21
- //get the current word for an argument
- LyXParagraph::size_type lastpos =
- owner->view()->text->cursor.pos() - 1;
- // Get the current word. note that this must be done
- // before inserting the inset, or the inset will
- // break the word
- string curstring(owner->view()
- ->text->cursor.par()->GetWord(lastpos));
-
- //make the new inset and write the current word into it
- InsetIndex * new_inset = new InsetIndex();
-
- new_inset->setContents(curstring);
-
- //don't edit it if the call was to INSERT_LAST
- if(action != LFUN_INDEX_INSERT_LAST) {
- new_inset->Edit(owner->view(), 0, 0, 0);
- } else {
- //it looks blank on the screen unless
- //we do something. put it here.
-
- // move the cursor to the returned value of lastpos
- // but only for the auto-insert
- owner->view()->text->cursor.pos(lastpos);
- }
-
- //put the new inset into the buffer.
- // there should be some way of knowing the user
- //cancelled & avoiding this, but i don't know how
- if (!owner->view()->insertInset(new_inset))
- delete new_inset;
+ owner->getToolbar()->add(argument, false);
+ owner->getToolbar()->set();
}
}
break;
+
+ // --- insert characters ----------------------------------------
- case LFUN_INDEX_PRINT:
- {
- Inset * new_inset = new InsetPrintIndex(owner->buffer());
- if (!owner->view()->insertInset(new_inset, "Standard", true))
- delete new_inset;
- }
- break;
-
- case LFUN_PARENTINSERT:
+ // --- Mathed stuff. If we are here, there is no locked inset yet.
+ case LFUN_MATH_EXTERN:
+ case LFUN_MATH_NUMBER:
+ case LFUN_MATH_NONUMBER:
+ case LFUN_MATH_LIMITS:
{
- lyxerr << "arg " << argument << endl;
- Inset * new_inset = new InsetParent(argument, owner->buffer());
- if (!owner->view()->insertInset(new_inset, "Standard", true))
- delete new_inset;
+ setErrorMessage(N_("This is only allowed in math mode!"));
}
break;
- case LFUN_CHILDINSERT:
+ case LFUN_MATH_PANEL:
+ owner->getDialogs()->showMathPanel();
+ break;
+
+ case LFUN_CITATION_CREATE:
{
- Inset * new_inset = new InsetInclude(argument,
- owner->buffer());
- if (owner->view()->insertInset(new_inset, "Standard", true))
- new_inset->Edit(owner->view(), 0, 0, 0);
- else
- delete new_inset;
+ InsetCommandParams p( "cite" );
+
+ if (!argument.empty()) {
+ // This should be set at source, ie when typing
+ // "citation-insert foo" in the minibuffer.
+ // Question: would pybibliographer also need to be
+ // changed. Suspect so. Leave as-is therefore.
+ if (contains(argument, "|")) {
+ p.setContents( token(argument, '|', 0) );
+ p.setOptions( token(argument, '|', 1) );
+ } else {
+ p.setContents( argument );
+ }
+ dispatch(LFUN_CITATION_INSERT, p.getAsString());
+ } else
+ owner->getDialogs()->createCitation( p.getAsString() );
}
break;
-
+
case LFUN_CHILDOPEN:
{
- string filename =
+ string const filename =
MakeAbsPath(argument,
OnlyPath(owner->buffer()->fileName()));
setMessage(N_("Opening child document ") +
MakeDisplayPath(filename) + "...");
- owner->view()->savePosition();
+ owner->view()->savePosition(0);
if (bufferlist.exists(filename))
owner->view()->buffer(bufferlist.getBuffer(filename));
else
}
break;
- case LFUN_INSERT_NOTE:
- owner->view()->insertNote();
- break;
-
- case LFUN_INSERTFOOTNOTE:
- {
- LyXParagraph::footnote_kind kind;
- if (argument == "footnote")
- { kind = LyXParagraph::FOOTNOTE; }
- else if (argument == "margin")
- { kind = LyXParagraph::MARGIN; }
- else if (argument == "figure")
- { kind = LyXParagraph::FIG; }
- else if (argument == "table")
- { kind = LyXParagraph::TAB; }
- else if (argument == "wide-fig")
- { kind = LyXParagraph::WIDE_FIG; }
- else if (argument == "wide-tab")
- { kind = LyXParagraph::WIDE_TAB; }
- else if (argument == "algorithm")
- { kind = LyXParagraph::ALGORITHM; }
- else {
- setErrorMessage(N_("Unknown kind of footnote"));
- break;
- }
- owner->view()->text->InsertFootnoteEnvironment(owner->view(), kind);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- owner->view()->setState();
- }
- break;
-
- case LFUN_BUFFERBULLETSSELECT:
- bulletForm();
- break;
-
case LFUN_TOGGLECURSORFOLLOW:
- cursor_follows_scrollbar = !cursor_follows_scrollbar;
+ lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar;
break;
case LFUN_KMAP_OFF: // keymap off
owner->getIntl()->ToggleKeyMap();
break;
- case LFUN_SELFINSERT:
- {
- for (string::size_type i = 0; i < argument.length(); ++i) {
- owner->view()->text->InsertChar(owner->view(), argument[i]);
- // This needs to be in the loop, or else we
- // won't break lines correctly. (Asger)
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- moveCursorUpdate(false);
- }
- break;
-
case LFUN_SEQUENCE:
{
// argument contains ';'-terminated commands
while (argument.find(';') != string::npos) {
string first;
argument = split(argument, first, ';');
- Dispatch(first);
+ dispatch(first);
}
}
break;
- case LFUN_DATE_INSERT: // jdblair: date-insert cmd
- {
- struct tm * now_tm;
+ case LFUN_DIALOG_PREFERENCES:
+ owner->getDialogs()->showPreferences();
+ break;
- time_t now_time_t = time(NULL);
- now_tm = localtime(&now_time_t);
- setlocale(LC_TIME, "");
- string arg;
- if (!argument.empty())
- arg = argument;
- else
- arg = lyxrc.date_insert_format;
- char datetmp[32];
- int datetmp_len = strftime(datetmp, 32, arg.c_str(), now_tm);
- for (int i = 0; i < datetmp_len; i++) {
- owner->view()->text->InsertChar(owner->view(), datetmp[i]);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
- }
-
- owner->view()->text->sel_cursor = owner->view()->text->cursor;
- moveCursorUpdate(false);
- }
- break;
-
case LFUN_SAVEPREFERENCES:
{
Path p(user_lyxdir);
}
break;
+ case LFUN_SCREEN_FONT_UPDATE:
+ {
+ // handle the screen font changes.
+ //
+ lyxrc.set_font_norm_type();
+ fontloader.update();
+ // 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();
+ // We also need to empty the textcache so that
+ // the buffer will be formatted correctly after
+ // a zoom change.
+ textcache.clear();
+ }
+ break;
+
case LFUN_SET_COLOR:
{
- string lyx_name, x11_name;
- x11_name = split(argument, lyx_name, ' ');
+ string lyx_name;
+ string const x11_name = split(argument, lyx_name, ' ');
if (lyx_name.empty() || x11_name.empty()) {
- LyXBell();
setErrorMessage(N_("Syntax: set-color <lyx_name>"
" <x11_name>"));
break;
}
if (!lcolor.setColor(lyx_name, x11_name)) {
- static string err1 (N_("Set-color \""));
- static string err2 (N_("\" failed - color is undefined "
- "or may not be redefined"));
- LyXBell();
- setErrorMessage(err1 + lyx_name + err2);
+ static string const err1 (N_("Set-color \""));
+ static string const err2 (
+ N_("\" failed - color is undefined "
+ "or may not be redefined"));
+ setErrorMessage(_(err1) + lyx_name + _(err2));
break;
}
lyxColorHandler->updateColor(lcolor.getFromLyXName(lyx_name));
break;
}
- case LFUN_UNKNOWN_ACTION:
- {
- if(!owner->buffer()) {
- LyXBell();
- setErrorMessage(N_("No document open"));
- break;
- }
+ case LFUN_MESSAGE:
+ owner->message(argument);
+ break;
- if (owner->buffer()->isReadonly()) {
- LyXBell();
- setErrorMessage(N_("Document is read only"));
- break;
- }
-
- if (!argument.empty()) {
-
- /* Automatically delete the currently selected
- * text and replace it with what is being
- * typed in now. Depends on lyxrc settings
- * "auto_region_delete", which defaults to
- * true (on). */
-
- if ( lyxrc.auto_region_delete ) {
- if (owner->view()->text->selection){
- owner->view()->text->CutSelection(owner->view(), false);
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ case LFUN_MESSAGE_PUSH:
+ owner->messagePush(argument);
+ break;
+
+ case LFUN_MESSAGE_POP:
+ owner->messagePop();
+ break;
+
+ default:
+ // Then if it was none of the above
+ if (!owner->view()->Dispatch(action, argument))
+ lyxerr << "A truly unknown func ["
+ << lyxaction.getActionName(action) << "]!"
+ << endl;
+ break;
+ } // end of switch
+
+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);
+
+ int 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;
}
}
-
- owner->view()->beforeChange();
-
- for (string::size_type i = 0;
- i < argument.length(); ++i) {
- if (greek_kb_flag) {
- if (!math_insert_greek(argument[i]))
- owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text);
- } else
- owner->getIntl()->getTrans()->TranslateAndInsert(argument[i], owner->view()->text);
+
+ string const shortcuts =
+ toplevel_keymap->findbinding(pseudoaction);
+
+ if (!shortcuts.empty()) {
+ comname += ": " + shortcuts;
+ } else if (!argsadded) {
+ comname += " " + argument;
}
- owner->view()->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
+ if (!comname.empty()) {
+ comname = strip(comname);
+ commandshortcut = "(" + comname + ')';
- owner->view()->text->sel_cursor =
- owner->view()->text->cursor;
- moveCursorUpdate(false);
- return string();
- } else {
- // why is an "Unknown action" with empty
- // argument even dispatched in the first
- // place? I`ll probably change that. (Lgb)
- LyXBell();
- setErrorMessage(N_("Unknown action"));
+ // 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)
+ }
}
- break;
- default:
- lyxerr << "A truly unknown func!" << endl;
- break;
- }
- } // end of switch
- exit_with_message:
+ }
- string res = getMessage();
+ string const res = getMessage();
if (res.empty()) {
if (!commandshortcut.empty()) {
- string newbuf = owner->getMiniBuffer()->GetText();
- if (newbuf != commandshortcut) {
- owner->getMiniBuffer()->Set(newbuf
- + " " +
- commandshortcut);
- }
+ owner->getMiniBuffer()->addSet(commandshortcut);
}
} else {
- owner->getMiniBuffer()->Set(string(_(res.c_str()))
- + " " + commandshortcut);
+ string const msg(_(res) + ' ' + commandshortcut);
+ owner->message(msg);
}
return res;
void LyXFunc::setupLocalKeymap()
{
- keyseq.stdmap = keyseq.curmap = toplevel_keymap;
- cancel_meta_seq.stdmap = cancel_meta_seq.curmap = toplevel_keymap;
+ keyseq.stdmap = keyseq.curmap = toplevel_keymap.get();
+ cancel_meta_seq.stdmap = cancel_meta_seq.curmap = toplevel_keymap.get();
}
-void LyXFunc::MenuNew(bool fromTemplate)
+void LyXFunc::menuNew(bool fromTemplate)
{
- string fname, initpath = lyxrc.document_path;
- LyXFileDlg fileDlg;
+ string initpath = lyxrc.document_path;
if (owner->view()->available()) {
- string trypath = owner->buffer()->filepath;
+ string const trypath = owner->buffer()->filepath;
// If directory is writeable, use this as default.
- if (IsDirWriteable(trypath) == 1)
+ if (IsDirWriteable(trypath))
initpath = trypath;
}
- ProhibitInput(owner->view());
- fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
- fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
- fname = fileDlg.Select(_("Enter Filename for new document"),
- initpath, "*.lyx", _("newfile"));
- AllowInput(owner->view());
+ static int newfile_number;
+ string s;
- if (fname.empty()) {
- owner->getMiniBuffer()->Set(_("Canceled."));
- lyxerr.debug() << "New Document Cancelled." << endl;
- return;
- }
-
- // get absolute path of file and make sure the filename ends
- // with .lyx
- string s = MakeAbsPath(fname);
- if (!IsLyXFilename(s))
- s += ".lyx";
-
- // Check if the document already is open
- if (bufferlist.exists(s)){
- switch(AskConfirmation(_("Document is already open:"),
- MakeDisplayPath(s, 50),
- _("Do you want to close that document now?\n"
- "('No' will just switch to the open version)")))
+ if (lyxrc.new_ask_filename) {
+ FileDialog fileDlg(owner, _("Enter filename for new document"),
+ LFUN_SELECT_FILE_SYNC,
+ make_pair(string(_("Documents")),
+ string(lyxrc.document_path)),
+ make_pair(string(_("Templates")),
+ string(lyxrc.template_path)));
+
+ FileDialog::Result result =
+ fileDlg.Select(initpath,
+ _("*.lyx|LyX Documents (*.lyx)"),
+ _("newfile"));
+
+ if (result.second.empty()) {
+ owner->message(_("Canceled."));
+ lyxerr[Debug::INFO] << "New Document Cancelled." << endl;
+ return;
+ }
+
+ // get absolute path of file and make sure the filename ends
+ // with .lyx
+ s = MakeAbsPath(result.second);
+ if (!IsLyXFilename(s))
+ s += ".lyx";
+
+ // Check if the document already is open
+ if (bufferlist.exists(s)) {
+ switch (AskConfirmation(_("Document is already open:"),
+ MakeDisplayPath(s, 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(s)))
owner->view()->buffer(bufferlist.getBuffer(s));
return;
case 3: // Cancel: Do nothing
- owner->getMiniBuffer()->Set(_("Canceled."));
+ owner->message(_("Canceled."));
return;
}
- }
-
- // Check whether the file already exists
- if (IsLyXFilename(s)) {
+ }
+ // Check whether the file already exists
FileInfo fi(s);
if (fi.readable() &&
AskQuestion(_("File already exists:"),
MakeDisplayPath(s, 50),
_("Do you want to open the document?"))) {
- // loads document
- owner->getMiniBuffer()->Set(_("Opening document"),
- MakeDisplayPath(s), "...");
- XFlush(fl_display);
- owner->view()->buffer(
- bufferlist.loadLyXFile(s));
- owner->getMiniBuffer()->Set(_("Document"),
- MakeDisplayPath(s),
- _("opened."));
+ // loads document
+ string const disp_fn(MakeDisplayPath(s));
+
+ ostringstream str;
+ str << _("Opening document") << ' '
+ << disp_fn << "...";
+
+ owner->message(str.str().c_str());
+ //XFlush(fl_get_display());
+ owner->view()->buffer(bufferlist.loadLyXFile(s));
+ ostringstream str2;
+ str2 << _("Document") << ' '
+ << disp_fn << ' ' << _("opened.");
+
+ owner->message(str2.str().c_str());
+
return;
}
+ } else {
+ s = AddName(lyxrc.document_path,
+ "newfile" + tostr(++newfile_number) + ".lyx");
+ FileInfo fi(s);
+ while (bufferlist.exists(s) || fi.readable()) {
+ ++newfile_number;
+ s = AddName(lyxrc.document_path,
+ "newfile" + tostr(newfile_number) +
+ ".lyx");
+ fi.newFile(s);
+ }
}
// The template stuff
string templname;
if (fromTemplate) {
- ProhibitInput(owner->view());
- fname = fileDlg.Select(_("Choose template"),
- lyxrc.template_path,
- "*.lyx");
+ FileDialog fileDlg(owner, _("Select template file"),
+ LFUN_SELECT_FILE_SYNC,
+ make_pair(string(_("Documents")),
+ string(lyxrc.document_path)),
+ make_pair(string(_("Templates")),
+ string(lyxrc.template_path)));
+
+ FileDialog::Result result =
+ fileDlg.Select(lyxrc.template_path,
+ _("*.lyx|LyX Documents (*.lyx)"));
+
+ if (result.first == FileDialog::Later)
+ return;
+
+ string const fname = result.second;
+
+ if (fname.empty())
+ return;
templname = fname;
- AllowInput(owner->view());
}
// find a free buffer
- lyxerr.debug() << "Find a free buffer." << endl;
+ lyxerr[Debug::INFO] << "Find a free buffer." << endl;
owner->view()->buffer(bufferlist.newFile(s, templname));
}
-void LyXFunc::MenuOpen()
+void LyXFunc::open(string const & fname)
{
string initpath = lyxrc.document_path;
- LyXFileDlg fileDlg;
if (owner->view()->available()) {
- string trypath = owner->buffer()->filepath;
+ string const trypath = owner->buffer()->filepath;
// If directory is writeable, use this as default.
- if (IsDirWriteable(trypath) == 1)
+ if (IsDirWriteable(trypath))
initpath = trypath;
}
- // launches dialog
- ProhibitInput(owner->view());
- fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
- fileDlg.SetButton(1, _("Examples"),
- AddPath(system_lyxdir, "examples"));
- string filename = fileDlg.Select(_("Select Document to Open"),
- initpath, "*.lyx");
- AllowInput(owner->view());
+ string filename;
+
+ if (fname.empty()) {
+ FileDialog fileDlg(owner, _("Select document to open"),
+ LFUN_FILE_OPEN,
+ make_pair(string(_("Documents")),
+ string(lyxrc.document_path)),
+ make_pair(string(_("Examples")),
+ string(AddPath(system_lyxdir, "examples"))));
+
+ FileDialog::Result result =
+ fileDlg.Select(initpath,
+ "*.lyx|LyX Documents (*.lyx)");
+
+ if (result.first == FileDialog::Later)
+ return;
+
+ filename = result.second;
- // check selected filename
- if (filename.empty()) {
- owner->getMiniBuffer()->Set(_("Canceled."));
+ // check selected filename
+ if (filename.empty()) {
+ owner->message(_("Canceled."));
+ return;
+ }
+ } else
+ filename = fname;
+
+ // get absolute path of file and add ".lyx" to the filename if
+ // necessary
+ string const fullpath = FileSearch(string(), filename, "lyx");
+ if (fullpath.empty()) {
+ WriteAlert(_("Error"), _("Could not find file"), filename);
return;
}
- // get absolute path of file and make sure the filename ends
- // with .lyx
- filename = MakeAbsPath(filename);
- if (!IsLyXFilename(filename))
- filename += ".lyx";
-
+ filename = fullpath;
+
// loads document
- owner->getMiniBuffer()->Set(_("Opening document"),
- MakeDisplayPath(filename), "...");
+ string const disp_fn(MakeDisplayPath(filename));
+
+ ostringstream str;
+ str << _("Opening document") << ' ' << disp_fn << "...";
+
+ owner->message(str.str().c_str());
+
Buffer * openbuf = bufferlist.loadLyXFile(filename);
if (openbuf) {
owner->view()->buffer(openbuf);
- owner->getMiniBuffer()->Set(_("Document"),
- MakeDisplayPath(filename),
- _("opened."));
+ ostringstream str;
+ str << _("Document") << ' ' << disp_fn << ' ' << _("opened.");
+ owner->message(str.str().c_str());
} else {
- owner->getMiniBuffer()->Set(_("Could not open document"),
- MakeDisplayPath(filename));
+ ostringstream str;
+ str << _("Could not open document") << ' ' << disp_fn;
+ owner->message(str.str().c_str());
}
}
-// returns filename if file must be imported,
-// empty string if either file not found or already loaded
-// checks for running without gui are missing.
-void LyXFunc::doImportHelper(
- string const & file, // filename (possibly empty)
- string const & text, // info when asking for filename
- string const & pattern, // filetype
- bool func(BufferView *, string const &) // the real import function
-)
+// checks for running without gui are missing.
+void LyXFunc::doImport(string const & argument)
{
- string filename = file;
+ string format;
+ string filename = split(argument, format, ' ');
+ lyxerr[Debug::INFO] << "LyXFunc::doImport: " << format
+ << " file: " << filename << endl;
if (filename.empty()) { // need user interaction
string initpath = lyxrc.document_path;
- LyXFileDlg fileDlg;
if (owner->view()->available()) {
- string trypath = owner->buffer()->filepath;
+ string const trypath = owner->buffer()->filepath;
// If directory is writeable, use this as default.
- if (IsDirWriteable(trypath) == 1)
+ if (IsDirWriteable(trypath))
initpath = trypath;
}
- // launches dialog
- ProhibitInput(owner->view());
- fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
- fileDlg.SetButton(1, _("Examples"),
- AddPath(system_lyxdir, "examples"));
- filename = fileDlg.Select(text, initpath, pattern);
- AllowInput(owner->view());
+ string const text = _("Select ") + formats.prettyName(format)
+ + _(" file to import");
+
+ FileDialog fileDlg(owner, text,
+ LFUN_IMPORT,
+ make_pair(string(_("Documents")),
+ string(lyxrc.document_path)),
+ make_pair(string(_("Examples")),
+ string(AddPath(system_lyxdir, "examples"))));
+
+ string const extension = "*." + formats.extension(format)
+ + "| " + formats.prettyName(format)
+ + " (*." + formats.extension(format) + ")";
+
+ FileDialog::Result result = fileDlg.Select(initpath,
+ extension);
+
+ if (result.first == FileDialog::Later)
+ return;
+
+ filename = result.second;
// check selected filename
- if (filename.empty())
- owner->getMiniBuffer()->Set(_("Canceled."));
+ if (filename.empty())
+ owner->message(_("Canceled."));
}
// still no filename? abort
// get absolute path of file
filename = MakeAbsPath(filename);
- string lyxfile = ChangeExtension(filename, ".lyx");
+ string const lyxfile = ChangeExtension(filename, ".lyx");
// Check if the document already is open
if (bufferlist.exists(lyxfile)) {
- switch(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)")))
+ switch (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)))
owner->view()->buffer(bufferlist.getBuffer(lyxfile));
return;
case 3: // Cancel: Do nothing
- owner->getMiniBuffer()->Set(_("Canceled."));
+ owner->message(_("Canceled."));
return;
}
}
// Check if a LyX document by the same root exists in filesystem
- FileInfo f(lyxfile, true);
+ FileInfo const f(lyxfile, true);
if (f.exist() && !AskQuestion(_("A document by the name"),
MakeDisplayPath(lyxfile),
_("already exists. Overwrite?"))) {
- owner->getMiniBuffer()->Set(_("Canceled."));
+ owner->message(_("Canceled"));
return;
}
// filename should be valid now
-
- // notify user of import ahead
- string displaypath = MakeDisplayPath(filename);
- owner->getMiniBuffer()->Set(_("Importing"), displaypath, "...");
-
- // call real importer
- bool result = func(owner->view(), filename);
-
- // we are done
- if (result)
- owner->getMiniBuffer()->Set(displaypath, _("imported."));
- else
- owner->getMiniBuffer()->Set(displaypath, _(": import failed."));
-}
-
-static
-bool doImportASCIIasLines(BufferView * view, string const & filename)
-{
- view->buffer(bufferlist.newFile(filename, string()));
- InsertAsciiFile(view, filename, false);
- return true;
-}
-
-static
-bool doImportASCIIasParagraphs(BufferView * view, string const & filename)
-{
- view->buffer(bufferlist.newFile(filename, string()));
- InsertAsciiFile(view, filename, true);
- return true;
-}
-
-static
-bool doImportLaTeX(BufferView * view, string const & filename)
-{
- ImportLaTeX myImport(filename);
- Buffer * openbuf = myImport.run();
- if (openbuf) {
- view->buffer(openbuf);
- return true;
- }
- else
- return false;
-}
-
-static
-bool doImportNoweb(BufferView * view, string const & filename)
-{
- ImportNoweb myImport(filename);
- Buffer * openbuf = myImport.run();
- if (openbuf) {
- view->buffer(openbuf);
- return true;
- }
- else
- return false;
-}
-
-static
-bool doImportLinuxDoc(BufferView *, string const & filename)
-{
- // run sgml2lyx
- string tmp = lyxrc.linuxdoc_to_lyx_command + filename;
- Systemcalls one;
- Buffer * buf = 0;
-
- int result = one.startscript(Systemcalls::System, tmp);
- if (result == 0) {
- string filename = ChangeExtension(filename, ".lyx");
- // File was generated without problems. Load it.
- buf = bufferlist.loadLyXFile(filename);
- }
-
- return result == 0;
-}
-
-
-void LyXFunc::MenuInsertLyXFile(string const & filen)
-{
- string filename = filen;
-
- if (filename.empty()) {
- // Launch a file browser
- string initpath = lyxrc.document_path;
- LyXFileDlg fileDlg;
-
- if (owner->view()->available()) {
- string trypath = owner->buffer()->filepath;
- // If directory is writeable, use this as default.
- if (IsDirWriteable(trypath) == 1)
- initpath = trypath;
- }
-
- // launches dialog
- ProhibitInput(owner->view());
- fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
- fileDlg.SetButton(1, _("Examples"),
- AddPath(system_lyxdir, "examples"));
- filename = fileDlg.Select(_("Select Document to Insert"),
- initpath, "*.lyx");
- AllowInput(owner->view());
-
- // check selected filename
- if (filename.empty()) {
- owner->getMiniBuffer()->Set(_("Canceled."));
- return;
- }
- }
-
- // get absolute path of file and make sure the filename ends
- // with .lyx
- filename = MakeAbsPath(filename);
- if (!IsLyXFilename(filename))
- filename += ".lyx";
-
- // Inserts document
- owner->getMiniBuffer()->Set(_("Inserting document"),
- MakeDisplayPath(filename), "...");
- bool res = owner->view()->insertLyXFile(filename);
- if (res) {
- owner->getMiniBuffer()->Set(_("Document"),
- MakeDisplayPath(filename),
- _("inserted."));
- } else {
- owner->getMiniBuffer()->Set(_("Could not insert document"),
- MakeDisplayPath(filename));
- }
+
+ Importer::Import(owner, filename, format);
}
-void LyXFunc::doImport(string const & argument)
-{
- string type;
- string filename = split(argument, type, ' ');
- lyxerr.debug() << "LyXFunc::doImport: " << type
- << " file: " << filename << endl;
-
- if (type == "latex")
- doImportHelper(filename,
- _("Select LaTeX file to import"), "*.tex",
- doImportLaTeX);
- else if (type == "ascii")
- doImportHelper(filename,
- _("Select ASCII file to import"), "*.txt",
- doImportASCIIasLines);
- else if (type == "asciiparagraph")
- doImportHelper(filename,
- _("Select ASCII file to import"), "*.txt",
- doImportASCIIasParagraphs);
- else if (type == "noweb")
- doImportHelper(filename,
- _("Select NoWeb file to import"), "*.nw",
- doImportNoweb);
- else if (type == "linuxdoc")
- doImportHelper(filename,
- _("Select LinuxDoc file to import"), "*.doc",
- doImportLinuxDoc);
- else
- setErrorMessage(string(N_("Unknown import type: ")) + type);
-}
void LyXFunc::reloadBuffer()
{
- string fn = owner->buffer()->fileName();
+ string const fn = owner->buffer()->fileName();
if (bufferlist.close(owner->buffer()))
owner->view()->buffer(bufferlist.loadLyXFile(fn));
}
-void LyXFunc::CloseBuffer()
+void LyXFunc::closeBuffer()
{
if (bufferlist.close(owner->buffer()) && !quitting) {
if (bufferlist.empty()) {
// set variables that don't exist
// since there's no current buffer
owner->getDialogs()->hideBufferDependent();
- }
- else {
+ } else {
owner->view()->buffer(bufferlist.first());
}
}
}
-Inset * LyXFunc::getInsetByCode(Inset::Code code)
-{
- LyXCursor cursor = owner->view()->text->cursor;
- Buffer * buffer = owner->view()->buffer();
- for (Buffer::inset_iterator it = Buffer::inset_iterator(cursor.par(),
- cursor.pos());
- it != buffer->inset_iterator_end(); ++it) {
- if ((*it)->LyxCode() == code)
- return *it;
- }
- return 0;
-}
-
-
// Each "owner" should have it's own message method. lyxview and
// the minibuffer would use the minibuffer, but lyxserver would
// send an ERROR signal to its client. Alejandro 970603
{
dispatch_buffer = m;
}
+
+
+void LyXFunc::initMiniBuffer()
+{
+ string text = _("Welcome to LyX!");
+
+ // When meta-fake key is pressed, show the key sequence so far + "M-".
+ if (wasMetaKey()) {
+ keyseqStr();
+ text += "M-";
+ }
+
+ // Else, when a non-complete key sequence is pressed,
+ // show the available options.
+ else if (keyseqUncomplete())
+ text = keyseqOptions();
+
+ // Else, show the buffer state.
+ else if (owner->view()->available()) {
+ Buffer * tmpbuf = owner->buffer();
+
+ string const nicename =
+ MakeDisplayPath(tmpbuf->fileName());
+ // Should we do this instead? (kindo like emacs)
+ // leaves more room for other information
+ text = "LyX: ";
+ text += nicename;
+ if (tmpbuf->lyxvc.inUse()) {
+ text += " [";
+ text += tmpbuf->lyxvc.versionString();
+ text += ' ';
+ text += tmpbuf->lyxvc.locker();
+ if (tmpbuf->isReadonly())
+ text += " (RO)";
+ text += ']';
+ } else if (tmpbuf->isReadonly())
+ text += " [RO]";
+ if (!tmpbuf->isLyxClean())
+ text += _(" (Changed)");
+ } else {
+ if (text != _("Welcome to LyX!")) // this is a hack
+ text = _("* No document open *");
+ }
+
+ owner->message(text);
+}
+