1999-09-27 18:44:28 +00:00
|
|
|
/* This file is part of
|
1999-11-15 12:01:38 +00:00
|
|
|
* ======================================================
|
1999-10-02 16:21:10 +00:00
|
|
|
*
|
|
|
|
* LyX, The Document Processor
|
|
|
|
*
|
|
|
|
* Copyright 1995 Matthias Ettrich
|
2000-02-04 09:38:32 +00:00
|
|
|
* Copyright 1995-2000 The LyX Team.
|
1999-10-02 16:21:10 +00:00
|
|
|
*
|
1999-11-15 12:01:38 +00:00
|
|
|
* ====================================================== */
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
#include <config.h>
|
2000-02-01 11:32:33 +00:00
|
|
|
#include <time.h>
|
|
|
|
#include <locale.h>
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-10-02 16:21:10 +00:00
|
|
|
#include <cstdlib>
|
|
|
|
#include <cctype>
|
|
|
|
#include <cstring>
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
#ifdef __GNUG__
|
|
|
|
#pragma implementation
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "lyxlookup.h"
|
|
|
|
#include "kbmap.h"
|
|
|
|
#include "lyxfunc.h"
|
|
|
|
#include "bufferlist.h"
|
|
|
|
#include "lyxserver.h"
|
|
|
|
#include "lyx.h"
|
|
|
|
#include "intl.h"
|
|
|
|
#include "lyx_main.h"
|
|
|
|
#include "lyx_cb.h"
|
1999-11-22 16:19:48 +00:00
|
|
|
#include "LyXAction.h"
|
1999-09-27 18:44:28 +00:00
|
|
|
#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"
|
1999-11-15 12:01:38 +00:00
|
|
|
#include "insets/insetindex.h"
|
|
|
|
#include "insets/insetinclude.h"
|
|
|
|
#include "insets/insetbib.h"
|
2000-02-25 12:06:15 +00:00
|
|
|
#include "insets/insettext.h"
|
|
|
|
#include "insets/insetert.h"
|
2000-02-29 02:19:17 +00:00
|
|
|
#include "insets/insetgraphics.h"
|
2000-03-08 13:52:57 +00:00
|
|
|
#include "insets/insetfoot.h"
|
1999-09-27 18:44:28 +00:00
|
|
|
#include "mathed/formulamacro.h"
|
|
|
|
#include "toolbar.h"
|
|
|
|
#include "spellchecker.h" // RVDK_PATCH_5
|
|
|
|
#include "minibuffer.h"
|
|
|
|
#include "vspace.h"
|
|
|
|
#include "LyXView.h"
|
|
|
|
#include "filedlg.h"
|
|
|
|
#include "lyx_gui_misc.h"
|
1999-10-02 16:21:10 +00:00
|
|
|
#include "support/filetools.h"
|
|
|
|
#include "support/FileInfo.h"
|
1999-11-15 12:01:38 +00:00
|
|
|
#include "support/syscall.h"
|
|
|
|
#include "support/lstrings.h"
|
|
|
|
#include "support/path.h"
|
1999-10-07 18:44:17 +00:00
|
|
|
#include "debug.h"
|
1999-09-27 18:44:28 +00:00
|
|
|
#include "lyxrc.h"
|
|
|
|
#include "lyxtext.h"
|
|
|
|
#include "gettext.h"
|
|
|
|
#include "trans_mgr.h"
|
|
|
|
#include "ImportLaTeX.h"
|
|
|
|
#include "ImportNoweb.h"
|
1999-11-04 01:40:20 +00:00
|
|
|
#include "layout.h"
|
2000-02-10 17:53:36 +00:00
|
|
|
#include "WorkArea.h"
|
2000-03-01 04:56:55 +00:00
|
|
|
#include "lyxfr1.h"
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
extern bool cursor_follows_scrollbar;
|
|
|
|
|
2000-03-17 10:14:46 +00:00
|
|
|
extern void InsertAsciiFile(BufferView *, string const &, bool);
|
1999-12-16 06:43:25 +00:00
|
|
|
extern void math_insert_symbol(char const *);
|
1999-09-27 18:44:28 +00:00
|
|
|
extern Bool math_insert_greek(char const); // why "Bool"?
|
|
|
|
extern BufferList bufferlist;
|
1999-11-04 01:40:20 +00:00
|
|
|
extern LyXServer * lyxserver;
|
1999-09-27 18:44:28 +00:00
|
|
|
extern short greek_kb_flag;
|
1999-11-04 01:40:20 +00:00
|
|
|
extern FD_form_toc * fd_form_toc;
|
1999-09-27 18:44:28 +00:00
|
|
|
extern bool selection_possible;
|
|
|
|
|
1999-11-04 01:40:20 +00:00
|
|
|
extern kb_keymap * toplevel_keymap;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
extern void MenuWrite(Buffer *);
|
|
|
|
extern void MenuWriteAs(Buffer *);
|
|
|
|
extern int MenuRunLaTeX(Buffer *);
|
|
|
|
extern int MenuBuildProg(Buffer *);
|
|
|
|
extern int MenuRunChktex(Buffer *);
|
2000-01-11 01:59:00 +00:00
|
|
|
extern bool CreatePostscript(Buffer *, bool);
|
1999-12-16 06:43:25 +00:00
|
|
|
extern void MenuPrint(Buffer *);
|
1999-09-27 18:44:28 +00:00
|
|
|
extern void MenuSendto();
|
|
|
|
extern void QuitLyX();
|
|
|
|
extern void MenuFax(Buffer *);
|
2000-01-07 03:42:16 +00:00
|
|
|
extern void MenuExport(Buffer *, string const &);
|
1999-09-27 18:44:28 +00:00
|
|
|
extern void MenuPasteSelection(char at);
|
|
|
|
extern LyXAction lyxaction;
|
|
|
|
// (alkis)
|
|
|
|
extern tex_accent_struct get_accent(kb_action action);
|
|
|
|
|
|
|
|
extern void AutoSave();
|
1999-12-16 06:43:25 +00:00
|
|
|
extern void SetUpdateTimer(float timer = 0.3);
|
1999-09-27 18:44:28 +00:00
|
|
|
extern void FreeUpdateTimer();
|
2000-01-11 01:59:00 +00:00
|
|
|
extern bool PreviewDVI(Buffer *);
|
|
|
|
extern bool PreviewPostscript(Buffer *);
|
1999-11-15 12:01:38 +00:00
|
|
|
extern void MenuInsertLabel(char const *);
|
1999-09-27 18:44:28 +00:00
|
|
|
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();
|
|
|
|
|
1999-10-02 16:21:10 +00:00
|
|
|
extern Buffer * NewLyxFile(string const &);
|
|
|
|
extern void LoadLyXFile(string const &);
|
2000-02-04 09:38:32 +00:00
|
|
|
extern void Reconfigure(BufferView *);
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2000-02-29 02:19:17 +00:00
|
|
|
extern LyXTextClass::size_type current_layout;
|
1999-09-27 18:44:28 +00:00
|
|
|
extern int getISOCodeFromLaTeX(char *);
|
|
|
|
|
|
|
|
extern void ShowLatexLog();
|
|
|
|
|
|
|
|
/* === globals =========================================================== */
|
|
|
|
|
|
|
|
bool LyXFunc::show_sc = true;
|
|
|
|
|
|
|
|
|
1999-11-22 16:19:48 +00:00
|
|
|
LyXFunc::LyXFunc(LyXView * o)
|
1999-12-16 06:43:25 +00:00
|
|
|
: owner(o)
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
|
|
|
meta_fake_bit = 0;
|
|
|
|
lyx_dead_action = LFUN_NOACTION;
|
|
|
|
lyx_calling_dead_action = LFUN_NOACTION;
|
|
|
|
setupLocalKeymap();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 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)
|
|
|
|
{
|
1999-12-10 00:07:59 +00:00
|
|
|
if (selecting || owner->view()->text->mark_set) {
|
|
|
|
owner->view()->text->SetSelection();
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->toggleToggle();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(0);
|
|
|
|
} else {
|
|
|
|
owner->view()->update(-2); // this IS necessary
|
|
|
|
// (Matthias)
|
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->showCursor();
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
/* ---> Everytime the cursor is moved, show the current font state. */
|
|
|
|
// should this too me moved out of this func?
|
|
|
|
//owner->getMiniBuffer()->Set(CurrentState());
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-11-22 16:19:48 +00:00
|
|
|
int LyXFunc::processKeyEvent(XEvent * ev)
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
|
|
|
char s_r[10];
|
1999-10-20 14:35:05 +00:00
|
|
|
string argument;
|
1999-11-22 16:19:48 +00:00
|
|
|
XKeyEvent * keyevent = &ev->xkey;
|
1999-09-27 18:44:28 +00:00
|
|
|
KeySym keysym_return;
|
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
int num_bytes = LyXLookupString(ev, s_r, 10, &keysym_return);
|
2000-01-27 16:17:47 +00:00
|
|
|
s_r[num_bytes] = '\0';
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-10-07 18:44:17 +00:00
|
|
|
if (lyxerr.debugging(Debug::KEY)) {
|
2000-01-27 01:29:01 +00:00
|
|
|
char * tmp = XKeysymToString(keysym_return);
|
|
|
|
string stm = (tmp ? tmp : "");
|
1999-10-07 18:44:17 +00:00
|
|
|
lyxerr << "KeySym is "
|
2000-01-27 01:29:01 +00:00
|
|
|
<< stm
|
1999-10-07 18:44:17 +00:00
|
|
|
<< "["
|
|
|
|
<< keysym_return << "]"
|
|
|
|
<< " and num_bytes is "
|
|
|
|
<< num_bytes
|
|
|
|
<< " the string returned is \""
|
|
|
|
<< s_r << '\"' << endl;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
// Do nothing if we have nothing (JMarc)
|
|
|
|
if (num_bytes == 0 && keysym_return == NoSymbol) {
|
1999-10-07 18:44:17 +00:00
|
|
|
lyxerr[Debug::KEY] << "Empty kbd action (probably composing)"
|
|
|
|
<< endl;
|
1999-09-27 18:44:28 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// this function should be used always [asierra060396]
|
1999-11-22 16:19:48 +00:00
|
|
|
if (owner->view()->available() &&
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->the_locking_inset &&
|
1999-09-27 18:44:28 +00:00
|
|
|
keysym_return == XK_Escape) {
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->unlockInset(owner->view()->the_locking_inset);
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->CursorRight();
|
2000-02-03 19:51:27 +00:00
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-09-27 18:44:28 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
|
|
|
// Do a one-deep top-level lookup for
|
|
|
|
// cancel and meta-fake keys. RVDK_PATCH_5
|
|
|
|
cancel_meta_seq.reset();
|
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
int action = cancel_meta_seq.addkey(keysym_return, keyevent->state
|
|
|
|
&(ShiftMask|ControlMask
|
|
|
|
|Mod1Mask));
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
// 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) ) {
|
|
|
|
|
|
|
|
// remove Caps Lock and Mod2 as a modifiers
|
|
|
|
action = keyseq.addkey(keysym_return,
|
|
|
|
(keyevent->state | meta_fake_bit)
|
|
|
|
&(ShiftMask|ControlMask
|
|
|
|
|Mod1Mask));
|
|
|
|
}
|
|
|
|
// Dont remove this unless you know what you are doing.
|
|
|
|
meta_fake_bit = 0;
|
|
|
|
|
|
|
|
if (action == 0) action = LFUN_PREFIX;
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
if (lyxerr.debugging(Debug::KEY)) {
|
1999-12-16 06:43:25 +00:00
|
|
|
string buf;
|
|
|
|
keyseq.print(buf);
|
1999-12-10 00:07:59 +00:00
|
|
|
lyxerr << "Key ["
|
|
|
|
<< action << "]["
|
|
|
|
<< buf << "]["
|
|
|
|
<< num_bytes << "]" << 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)
|
|
|
|
|
2000-02-04 09:38:32 +00:00
|
|
|
if(keyseq.length > 1 || keyseq.length < -1) {
|
1999-12-16 06:43:25 +00:00
|
|
|
string buf;
|
|
|
|
keyseq.print(buf);
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->getMiniBuffer()->Set(buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (action == -1) {
|
1999-12-16 06:43:25 +00:00
|
|
|
if (keyseq.length < -1) { // unknown key sequence...
|
|
|
|
string buf;
|
1999-12-10 00:07:59 +00:00
|
|
|
LyXBell();
|
1999-12-16 06:43:25 +00:00
|
|
|
keyseq.print(buf);
|
1999-12-10 00:07:59 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
if (argument.empty()) {
|
|
|
|
lyxerr.debug() << "Empty argument!" << endl;
|
|
|
|
// This can`t possibly be of any use
|
|
|
|
// so we`ll skip the dispatch.
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
if (action == LFUN_SELFINSERT) {
|
|
|
|
argument = s_r[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
bool tmp_sc = show_sc;
|
|
|
|
show_sc = false;
|
|
|
|
Dispatch(action, argument.c_str());
|
|
|
|
show_sc = tmp_sc;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LyXFunc::func_status LyXFunc::getStatus(int ac) const
|
|
|
|
{
|
|
|
|
kb_action action;
|
|
|
|
func_status flag = LyXFunc::OK;
|
|
|
|
string argument;
|
|
|
|
Buffer * buf = owner->buffer();
|
|
|
|
|
|
|
|
if (lyxaction.isPseudoAction(ac))
|
|
|
|
action = lyxaction.retrieveActionArg(ac, argument);
|
|
|
|
else
|
|
|
|
action = static_cast<kb_action>(ac);
|
|
|
|
|
|
|
|
if (action == LFUN_UNKNOWN_ACTION) {
|
|
|
|
setErrorMessage(N_("Unknown action"));
|
|
|
|
return LyXFunc::Unknown;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check whether we need a buffer
|
|
|
|
if (!lyxaction.funcHasFlag(action, LyXAction::NoBuffer)) {
|
|
|
|
// Yes we need a buffer, do we have one?
|
|
|
|
if (buf) {
|
|
|
|
// yes
|
|
|
|
// Can we use a readonly buffer?
|
|
|
|
if (buf->isReadonly() &&
|
|
|
|
!lyxaction.funcHasFlag(action,
|
|
|
|
LyXAction::ReadOnly)) {
|
|
|
|
// no
|
|
|
|
setErrorMessage(N_("Document is read-only"));
|
2000-01-06 02:44:26 +00:00
|
|
|
flag |= LyXFunc::Disabled;
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// no
|
|
|
|
setErrorMessage(N_("Command not allowed with"
|
|
|
|
"out any document open"));
|
2000-01-06 02:44:26 +00:00
|
|
|
flag |= LyXFunc::Disabled;
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag & LyXFunc::Disabled)
|
|
|
|
return flag;
|
|
|
|
|
2000-01-06 02:44:26 +00:00
|
|
|
// I would really like to avoid having this switch and rather try to
|
|
|
|
// encode this in the function itself.
|
2000-03-12 10:35:05 +00:00
|
|
|
static bool noLaTeX = lyxrc.latex_command == "none";
|
1999-12-10 00:07:59 +00:00
|
|
|
bool disable = false;
|
|
|
|
switch (action) {
|
1999-12-16 06:43:25 +00:00
|
|
|
case LFUN_PREVIEW:
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = noLaTeX || lyxrc.view_dvi_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_PREVIEWPS:
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = noLaTeX || lyxrc.view_ps_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_RUNLATEX:
|
|
|
|
case LFUN_RUNDVIPS:
|
|
|
|
disable = noLaTeX;
|
|
|
|
break;
|
|
|
|
case LFUN_MENUPRINT:
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = noLaTeX || lyxrc.print_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_FAX:
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = noLaTeX || lyxrc.fax_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_IMPORT:
|
|
|
|
if (argument == "latex")
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = lyxrc.relyx_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_EXPORT:
|
|
|
|
if (argument == "dvi" || argument == "postscript")
|
|
|
|
disable = noLaTeX;
|
|
|
|
if (argument == "html")
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = lyxrc.html_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_UNDO:
|
|
|
|
disable = buf->undostack.empty();
|
|
|
|
break;
|
|
|
|
case LFUN_REDO:
|
|
|
|
disable = buf->redostack.empty();
|
|
|
|
break;
|
|
|
|
case LFUN_SPELLCHECK:
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = lyxrc.isp_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_RUNCHKTEX:
|
2000-03-12 10:35:05 +00:00
|
|
|
disable = lyxrc.chktex_command == "none";
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
|
|
|
case LFUN_LAYOUT_TABLE:
|
|
|
|
disable = ! owner->view()->text->cursor.par->table;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
flag |= box;
|
|
|
|
}
|
|
|
|
|
|
|
|
return flag;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string LyXFunc::Dispatch(string const & s)
|
|
|
|
{
|
|
|
|
// Split command string into command and argument
|
|
|
|
string cmd, line = frontStrip(s);
|
|
|
|
string arg = strip(frontStrip(split(line, cmd, ' ')));
|
|
|
|
|
|
|
|
return Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string LyXFunc::Dispatch(int ac,
|
1999-12-16 06:43:25 +00:00
|
|
|
char const * do_not_use_this_arg)
|
1999-12-10 00:07:59 +00:00
|
|
|
{
|
|
|
|
string argument;
|
|
|
|
kb_action action;
|
|
|
|
|
|
|
|
// we have not done anything wrong yet.
|
|
|
|
errorstat = false;
|
|
|
|
dispatch_buffer.clear();
|
|
|
|
|
|
|
|
// if action is a pseudo-action, we need the real action
|
|
|
|
if (lyxaction.isPseudoAction(ac)) {
|
|
|
|
string tmparg;
|
|
|
|
action = static_cast<kb_action>
|
|
|
|
(lyxaction.retrieveActionArg(ac, tmparg));
|
|
|
|
if (!tmparg.empty())
|
|
|
|
argument = tmparg;
|
|
|
|
} else {
|
|
|
|
action = static_cast<kb_action>(ac);
|
|
|
|
if (do_not_use_this_arg)
|
|
|
|
argument = do_not_use_this_arg; // except here
|
|
|
|
}
|
|
|
|
|
|
|
|
selection_possible = false;
|
|
|
|
|
2000-02-17 19:59:08 +00:00
|
|
|
if (owner->view()->available())
|
|
|
|
owner->view()->hideCursor();
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
// We cannot use this function here
|
|
|
|
if (getStatus(action) & Disabled)
|
|
|
|
goto exit_with_message;
|
|
|
|
|
|
|
|
commandshortcut.clear();
|
|
|
|
|
2000-03-12 10:35:05 +00:00
|
|
|
if (lyxrc.display_shortcuts && show_sc) {
|
1999-12-10 00:07:59 +00:00
|
|
|
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;
|
|
|
|
} 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() &&
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->the_locking_inset) {
|
1999-12-10 00:07:59 +00:00
|
|
|
if (action > 1
|
1999-12-16 06:43:25 +00:00
|
|
|
|| (action == LFUN_UNKNOWN_ACTION
|
|
|
|
&& keyseq.length >= -1)) {
|
|
|
|
if (action == LFUN_UNKNOWN_ACTION
|
|
|
|
&& argument.empty()) {
|
1999-12-10 00:07:59 +00:00
|
|
|
argument = keyseq.getiso();
|
|
|
|
}
|
|
|
|
// Undo/Redo pre 0.13 is a bit tricky for insets.
|
|
|
|
if (action == LFUN_UNDO) {
|
|
|
|
int slx, sly;
|
|
|
|
UpdatableInset * inset =
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->the_locking_inset;
|
1999-12-10 00:07:59 +00:00
|
|
|
inset->GetCursorPos(slx, sly);
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->unlockInset(inset);
|
|
|
|
owner->view()->menuUndo();
|
2000-02-25 12:06:15 +00:00
|
|
|
inset = static_cast<UpdatableInset*>(
|
|
|
|
owner->view()->text->cursor.par->
|
|
|
|
GetInset(owner->view()->text->
|
|
|
|
cursor.pos));
|
|
|
|
if (inset)
|
|
|
|
inset->Edit(owner->view(),slx,sly,0);
|
1999-12-10 00:07:59 +00:00
|
|
|
return string();
|
2000-02-25 12:06:15 +00:00
|
|
|
} else if (action == LFUN_REDO) {
|
|
|
|
int slx, sly;
|
|
|
|
UpdatableInset * inset = owner->view()->
|
|
|
|
the_locking_inset;
|
|
|
|
inset->GetCursorPos(slx, sly);
|
|
|
|
owner->view()->unlockInset(inset);
|
|
|
|
owner->view()->menuRedo();
|
|
|
|
inset = static_cast<UpdatableInset*>(
|
|
|
|
owner->view()->text->cursor.par->
|
|
|
|
GetInset(owner->view()->text->
|
|
|
|
cursor.pos));
|
|
|
|
if (inset)
|
|
|
|
inset->Edit(owner->view(),slx,sly,0);
|
|
|
|
return string();
|
|
|
|
} else if (owner->view()->the_locking_inset->
|
2000-02-25 13:35:38 +00:00
|
|
|
LocalDispatch(owner->view(), action,
|
2000-02-25 12:06:15 +00:00
|
|
|
argument) ==
|
|
|
|
UpdatableInset::DISPATCHED)
|
|
|
|
return string();
|
|
|
|
else {
|
|
|
|
setMessage(N_("Text mode"));
|
|
|
|
LyXDirection direction = owner->view()->text->
|
|
|
|
cursor.par->getParDirection();
|
|
|
|
if ((action == -1) ||
|
|
|
|
((action == LFUN_RIGHT) &&
|
|
|
|
(direction == LYX_DIR_LEFT_TO_RIGHT))) {
|
|
|
|
owner->view()->text->CursorRight();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->
|
|
|
|
Set(CurrentState());
|
|
|
|
}
|
|
|
|
if ((action == LFUN_LEFT) &&
|
|
|
|
(direction == LYX_DIR_RIGHT_TO_LEFT)) {
|
|
|
|
owner->view()->text->CursorRight();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->
|
|
|
|
Set(CurrentState());
|
|
|
|
}
|
|
|
|
if ((action == LFUN_LEFT) ||
|
|
|
|
(action == LFUN_RIGHT))
|
1999-12-10 00:07:59 +00:00
|
|
|
return string();
|
2000-02-25 12:06:15 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(action) {
|
|
|
|
// --- Misc -------------------------------------------
|
|
|
|
case LFUN_WORDFINDFORWARD :
|
|
|
|
case LFUN_WORDFINDBACKWARD : {
|
|
|
|
static string last_search;
|
|
|
|
string searched_string;
|
|
|
|
|
|
|
|
if (!argument.empty()) {
|
|
|
|
last_search = argument;
|
|
|
|
searched_string = argument;
|
|
|
|
} else {
|
|
|
|
searched_string = last_search;
|
|
|
|
}
|
|
|
|
|
|
|
|
LyXText * ltCur = owner->view()->text ;
|
|
|
|
|
|
|
|
if (!searched_string.empty() &&
|
|
|
|
((action == LFUN_WORDFINDBACKWARD) ?
|
|
|
|
ltCur->SearchBackward(searched_string.c_str()) :
|
|
|
|
ltCur->SearchForward(searched_string.c_str()))) {
|
|
|
|
|
|
|
|
// ??? What is that ???
|
|
|
|
owner->view()->update(-2);
|
|
|
|
|
|
|
|
// ??? Needed ???
|
|
|
|
// clear the selection (if there is any)
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->toggleSelection();
|
1999-12-10 00:07:59 +00:00
|
|
|
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()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
|
|
|
|
// ??? Needed ???
|
|
|
|
// set the new selection
|
|
|
|
// SetSelectionOverLenChars(owner->view()->currentBuffer()->text, iLenSelected);
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->toggleSelection(false);
|
1999-12-10 00:07:59 +00:00
|
|
|
} else
|
|
|
|
LyXBell();
|
|
|
|
|
|
|
|
// REMOVED : if (owner->view()->getWorkArea()->focus)
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->showCursor();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PREFIX:
|
|
|
|
{
|
2000-02-17 19:59:08 +00:00
|
|
|
if (owner->view()->available()) {
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
string buf;
|
|
|
|
keyseq.print(buf, true);
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->getMiniBuffer()->Set(buf, string(), string(), 1);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
// --- Misc -------------------------------------------
|
|
|
|
case LFUN_EXEC_COMMAND:
|
|
|
|
owner->getMiniBuffer()->ExecCommand();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_CANCEL: // RVDK_PATCH_5
|
|
|
|
keyseq.reset();
|
|
|
|
meta_fake_bit = 0;
|
|
|
|
if(owner->view()->available())
|
|
|
|
// cancel any selection
|
|
|
|
Dispatch(LFUN_MARK_OFF, 0);
|
|
|
|
setMessage(N_("Cancel"));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_META_FAKE: // RVDK_PATCH_5
|
|
|
|
{
|
|
|
|
meta_fake_bit = Mod1Mask;
|
1999-12-16 06:43:25 +00:00
|
|
|
string buf;
|
|
|
|
keyseq.print(buf, true);
|
1999-12-10 00:07:59 +00:00
|
|
|
string res = string("M-") + buf;
|
|
|
|
setMessage(buf); // RVDK_PATCH_5
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_READ_ONLY_TOGGLE:
|
|
|
|
if (owner->buffer()->lyxvc.inUse()) {
|
|
|
|
owner->buffer()->lyxvc.toggleReadOnly();
|
|
|
|
} else {
|
|
|
|
owner->buffer()->setReadonly(
|
|
|
|
!owner->buffer()->isReadonly());
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_CENTER: // this is center and redraw.
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->center();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_APPENDIX:
|
|
|
|
if (owner->view()->available()) {
|
|
|
|
owner->view()->text->toggleAppendix();
|
|
|
|
owner->view()->update(1);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
// --- Menus -----------------------------------------------
|
1999-12-10 00:07:59 +00:00
|
|
|
case LFUN_MENUNEW:
|
|
|
|
MenuNew(false);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENUNEWTMPLT:
|
|
|
|
MenuNew(true);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENUOPEN:
|
|
|
|
MenuOpen();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_CLOSEBUFFER:
|
|
|
|
CloseBuffer();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENUWRITE:
|
2000-02-22 00:36:17 +00:00
|
|
|
owner->getMiniBuffer()->Set(_("Saving document"),
|
|
|
|
MakeDisplayPath(owner->buffer()->fileName()),
|
|
|
|
"...");
|
1999-12-10 00:07:59 +00:00
|
|
|
MenuWrite(owner->buffer());
|
2000-02-22 00:36:17 +00:00
|
|
|
//owner->getMiniBuffer()->
|
|
|
|
// Set(_("Document saved as"),
|
|
|
|
// MakeDisplayPath(owner->buffer()->fileName()));
|
|
|
|
//} else {
|
|
|
|
//owner->getMiniBuffer()->Set(_("Save failed!"));
|
|
|
|
//}
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENUWRITEAS:
|
|
|
|
MenuWriteAs(owner->buffer());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENURELOAD:
|
|
|
|
reloadBuffer();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PREVIEW:
|
2000-01-11 01:59:00 +00:00
|
|
|
PreviewDVI(owner->buffer());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PREVIEWPS:
|
2000-01-11 01:59:00 +00:00
|
|
|
PreviewPostscript(owner->buffer());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_RUNLATEX:
|
|
|
|
MenuRunLaTeX(owner->buffer());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BUILDPROG:
|
|
|
|
MenuBuildProg(owner->buffer());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_RUNCHKTEX:
|
|
|
|
MenuRunChktex(owner->buffer());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_RUNDVIPS:
|
2000-01-11 01:59:00 +00:00
|
|
|
CreatePostscript(owner->buffer(), false);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENUPRINT:
|
|
|
|
MenuPrint(owner->buffer());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FAX:
|
|
|
|
MenuFax(owner->buffer());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_EXPORT:
|
1999-12-15 17:42:22 +00:00
|
|
|
MenuExport(owner->buffer(), argument);
|
|
|
|
break;
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
case LFUN_IMPORT:
|
|
|
|
{
|
|
|
|
//needs argument as string
|
|
|
|
string imtyp = argument;
|
|
|
|
|
|
|
|
// latex
|
|
|
|
if (imtyp == "latex") {
|
|
|
|
doImportLaTeX(false);
|
|
|
|
}
|
|
|
|
// ascii
|
|
|
|
else if (imtyp == "ascii") {
|
|
|
|
doImportASCII(false);
|
|
|
|
} else if (imtyp == "asciiparagraph") {
|
|
|
|
doImportASCII(true);
|
1999-12-16 06:43:25 +00:00
|
|
|
// noweb
|
1999-12-10 00:07:59 +00:00
|
|
|
} else if (imtyp == "noweb") {
|
|
|
|
doImportLaTeX(true);
|
|
|
|
} else {
|
|
|
|
setErrorMessage(string(N_("Unknown import type: "))
|
|
|
|
+ imtyp);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_QUIT:
|
|
|
|
QuitLyX();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_TOCVIEW:
|
2000-02-04 09:38:32 +00:00
|
|
|
TocUpdateCB(0, 0);
|
1999-12-10 00:07:59 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_TOC_INSERT:
|
|
|
|
{
|
|
|
|
Inset * new_inset = new InsetTOC(owner->buffer());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset, "Standard", true);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_LOF_INSERT:
|
|
|
|
{
|
|
|
|
Inset * new_inset = new InsetLOF(owner->buffer());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset, "Standard", true);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_LOA_INSERT:
|
|
|
|
{
|
|
|
|
Inset * new_inset = new InsetLOA(owner->buffer());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset, "Standard", true);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_LOT_INSERT:
|
|
|
|
{
|
|
|
|
Inset * new_inset = new InsetLOT(owner->buffer());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset, "Standard", true);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_TABLE:
|
2000-02-04 09:38:32 +00:00
|
|
|
Table();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FIGURE:
|
2000-02-04 09:38:32 +00:00
|
|
|
Figure();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
2000-02-29 02:19:17 +00:00
|
|
|
|
|
|
|
case LFUN_INSERT_GRAPHICS:
|
|
|
|
{
|
|
|
|
Inset * new_inset = new InsetGraphics;
|
|
|
|
owner->view()->insertInset(new_inset);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
case LFUN_AUTOSAVE:
|
|
|
|
AutoSave();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_UNDO:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->menuUndo();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_REDO:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->menuRedo();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENUSEARCH:
|
2000-03-01 04:56:55 +00:00
|
|
|
{
|
|
|
|
// 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());
|
|
|
|
}
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PASTE:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->paste();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PASTESELECTION:
|
|
|
|
{
|
|
|
|
bool asPara = false;
|
|
|
|
if (argument == "paragraph") asPara = true;
|
|
|
|
MenuPasteSelection(asPara);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_CUT:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->cut();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_COPY:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->copy();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LAYOUT_COPY:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->copyEnvironment();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LAYOUT_PASTE:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->pasteEnvironment();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_GOTOERROR:
|
|
|
|
owner->view()->gotoError();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_REMOVEERRORS:
|
2000-01-08 21:02:58 +00:00
|
|
|
if (owner->view()->removeAutoInsets()) {
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->redraw();
|
|
|
|
owner->view()->fitCursor();
|
|
|
|
owner->view()->updateScrollbar();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_GOTONOTE:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->gotoNote();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_OPENSTUFF:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->openStuff();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_HYPHENATION:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->hyphenationPoint();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LDOTS:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->ldots();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_END_OF_SENTENCE:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->endOfSentenceDot();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENU_SEPARATOR:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->menuSeparator();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_HFILL:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->hfill();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DEPTH:
|
2000-02-04 09:38:32 +00:00
|
|
|
changeDepth(owner->view(), 0);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DEPTH_MIN:
|
2000-02-04 09:38:32 +00:00
|
|
|
changeDepth(owner->view(), -1);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DEPTH_PLUS:
|
2000-02-04 09:38:32 +00:00
|
|
|
changeDepth(owner->view(), 1);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FREE:
|
2000-02-04 09:38:32 +00:00
|
|
|
Free();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_TEX:
|
2000-02-04 09:38:32 +00:00
|
|
|
Tex();
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MELT:
|
2000-02-04 09:38:32 +00:00
|
|
|
Melt(owner->view());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_RECONFIGURE:
|
2000-02-04 09:38:32 +00:00
|
|
|
Reconfigure(owner->view());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FOOTMELT:
|
|
|
|
if (owner->view()->available()
|
|
|
|
&& !owner->view()->text->selection
|
|
|
|
&& owner->view()->text->cursor.par->footnoteflag
|
|
|
|
!= LyXParagraph::NO_FOOTNOTE)
|
1999-12-16 06:43:25 +00:00
|
|
|
{ // only melt footnotes with FOOTMELT, not margins etc
|
|
|
|
if(owner->view()->text->cursor.par->footnotekind == LyXParagraph::FOOTNOTE)
|
2000-02-04 09:38:32 +00:00
|
|
|
Melt(owner->view());
|
1999-12-16 06:43:25 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
else
|
2000-02-04 09:38:32 +00:00
|
|
|
Foot(owner->view());
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
1999-12-10 00:07:59 +00:00
|
|
|
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)
|
2000-02-04 09:38:32 +00:00
|
|
|
Melt(owner->view());
|
|
|
|
} else
|
|
|
|
Margin(owner->view());
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
// --- version control -------------------------------
|
|
|
|
case LFUN_VC_REGISTER:
|
|
|
|
{
|
|
|
|
if (!owner->buffer()->lyxvc.inUse())
|
|
|
|
owner->buffer()->lyxvc.registrer();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_VC_CHECKIN:
|
|
|
|
{
|
|
|
|
if (owner->buffer()->lyxvc.inUse()
|
|
|
|
&& !owner->buffer()->isReadonly())
|
|
|
|
owner->buffer()->lyxvc.checkIn();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_VC_CHECKOUT:
|
|
|
|
{
|
|
|
|
if (owner->buffer()->lyxvc.inUse()
|
|
|
|
&& owner->buffer()->isReadonly())
|
|
|
|
owner->buffer()->lyxvc.checkOut();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_VC_REVERT:
|
|
|
|
{
|
|
|
|
owner->buffer()->lyxvc.revert();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_VC_UNDO:
|
|
|
|
{
|
|
|
|
owner->buffer()->lyxvc.undoLast();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_VC_HISTORY:
|
|
|
|
{
|
|
|
|
owner->buffer()->lyxvc.showLog();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// --- buffers ----------------------------------------
|
|
|
|
|
|
|
|
case LFUN_FILE_INSERT:
|
|
|
|
{
|
|
|
|
MenuInsertLyXFile(argument);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FILE_INSERT_ASCII:
|
|
|
|
{
|
|
|
|
bool asPara = (argument == "paragraph");
|
2000-03-17 10:14:46 +00:00
|
|
|
InsertAsciiFile(owner->view(), string(), asPara);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FILE_NEW:
|
|
|
|
{
|
|
|
|
// servercmd: argument must be <file>:<template>
|
|
|
|
Buffer * tmpbuf = NewLyxFile(argument);
|
|
|
|
if (tmpbuf)
|
|
|
|
owner->view()->buffer(tmpbuf);
|
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
break;
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
case LFUN_FILE_OPEN:
|
1999-12-16 06:43:25 +00:00
|
|
|
owner->view()->buffer(bufferlist.loadLyXFile(argument));
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LATEX_LOG:
|
|
|
|
ShowLatexLog();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LAYOUTNO:
|
|
|
|
{
|
|
|
|
lyxerr.debug() << "LFUN_LAYOUTNO: (arg) " << argument << endl;
|
|
|
|
int sel = strToInt(argument);
|
|
|
|
lyxerr.debug() << "LFUN_LAYOUTNO: (sel) "<< sel << endl;
|
|
|
|
|
|
|
|
// Should this give a setMessage instead?
|
|
|
|
if (sel == 0)
|
|
|
|
return string(); // illegal argument
|
|
|
|
|
2000-01-24 18:34:46 +00:00
|
|
|
--sel; // sel 1..., but layout 0...
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
// Pretend we got the name instead.
|
|
|
|
Dispatch(int(LFUN_LAYOUT),
|
|
|
|
textclasslist.NameOfLayout(owner->view()->
|
1999-12-16 06:43:25 +00:00
|
|
|
text->parameters->
|
|
|
|
textclass,
|
|
|
|
sel).c_str());
|
1999-12-10 00:07:59 +00:00
|
|
|
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). */
|
2000-02-15 13:30:49 +00:00
|
|
|
LyXTextClassList::ClassList::size_type tclass =
|
|
|
|
owner->view()->text->parameters->textclass;
|
2000-02-29 02:19:17 +00:00
|
|
|
pair <bool, LyXTextClass::size_type> layout =
|
2000-02-15 13:30:49 +00:00
|
|
|
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);
|
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
// see if we found the layout number:
|
2000-02-15 13:30:49 +00:00
|
|
|
if (!layout.first) {
|
1999-12-10 00:07:59 +00:00
|
|
|
setErrorMessage(string(N_("Layout ")) + argument +
|
|
|
|
N_(" not known"));
|
|
|
|
break;
|
|
|
|
}
|
2000-02-15 13:30:49 +00:00
|
|
|
|
|
|
|
if (current_layout != layout.second) {
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->hideCursor();
|
2000-02-15 13:30:49 +00:00
|
|
|
current_layout = layout.second;
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->
|
2000-02-15 13:30:49 +00:00
|
|
|
SetLayout(layout.second);
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->getToolbar()->combox->
|
|
|
|
select(owner->view()->
|
|
|
|
text->cursor.par->
|
|
|
|
GetLayout() + 1);
|
|
|
|
owner->view()->update(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LAYOUT_DOCUMENT:
|
|
|
|
MenuLayoutDocument();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LAYOUT_PARAGRAPH:
|
|
|
|
MenuLayoutParagraph();
|
|
|
|
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;
|
|
|
|
|
|
|
|
case LFUN_LAYOUT_PREAMBLE:
|
|
|
|
MenuLayoutPreamble();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LAYOUT_SAVE_DEFAULT:
|
|
|
|
MenuLayoutSave();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DROP_LAYOUTS_CHOICE:
|
|
|
|
owner->getToolbar()->combox->Show();
|
|
|
|
break;
|
|
|
|
|
2000-03-17 10:14:46 +00:00
|
|
|
case LFUN_LANGUAGE:
|
2000-02-03 19:51:27 +00:00
|
|
|
{
|
2000-03-17 10:14:46 +00:00
|
|
|
LangCB(argument);
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
case LFUN_EMPH:
|
2000-02-04 09:38:32 +00:00
|
|
|
Emph();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BOLD:
|
2000-02-04 09:38:32 +00:00
|
|
|
Bold();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_NOUN:
|
2000-02-04 09:38:32 +00:00
|
|
|
Noun();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_CODE:
|
2000-02-04 09:38:32 +00:00
|
|
|
Code();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_SANS:
|
2000-02-04 09:38:32 +00:00
|
|
|
Sans();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_ROMAN:
|
2000-02-04 09:38:32 +00:00
|
|
|
Roman();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DEFAULT:
|
2000-02-04 09:38:32 +00:00
|
|
|
StyleReset();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_UNDERLINE:
|
2000-02-04 09:38:32 +00:00
|
|
|
Underline();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FONT_SIZE:
|
2000-02-04 09:38:32 +00:00
|
|
|
FontSize(argument);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_FONT_STATE:
|
|
|
|
setMessage(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_UPCASE_WORD:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
FreeUpdateTimer();
|
|
|
|
owner->view()->text->ChangeWordCase(LyXText::text_uppercase);
|
|
|
|
owner->view()->update(1);
|
|
|
|
SetUpdateTimer();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LOWCASE_WORD:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
FreeUpdateTimer();
|
|
|
|
owner->view()->text->ChangeWordCase(LyXText::text_lowercase);
|
|
|
|
owner->view()->update(1);
|
|
|
|
SetUpdateTimer();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_CAPITALIZE_WORD:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
FreeUpdateTimer();
|
|
|
|
owner->view()->text->ChangeWordCase(LyXText::text_capitalization);
|
|
|
|
owner->view()->update(1);
|
|
|
|
SetUpdateTimer();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_INSERT_LABEL:
|
|
|
|
MenuInsertLabel(argument.c_str());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_INSERT_REF:
|
|
|
|
MenuInsertRef();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_REFTOGGLE:
|
|
|
|
{
|
|
|
|
InsetRef * inset =
|
|
|
|
static_cast<InsetRef*>(getInsetByCode(Inset::REF_CODE));
|
|
|
|
if (inset) {
|
|
|
|
if (inset->getFlag() == InsetRef::REF)
|
|
|
|
inset->setFlag(InsetRef::PAGE_REF);
|
|
|
|
else
|
|
|
|
inset->setFlag(InsetRef::REF);
|
2000-02-23 16:39:03 +00:00
|
|
|
owner->view()->updateInset(inset, true);
|
1999-12-10 00:07:59 +00:00
|
|
|
} 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();
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->gotoLabel(label.c_str());
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MENU_OPEN_BY_NAME:
|
|
|
|
owner->getMenus()->openByName(argument);
|
|
|
|
break; // RVDK_PATCH_5
|
|
|
|
|
|
|
|
case LFUN_SPELLCHECK:
|
2000-03-12 10:35:05 +00:00
|
|
|
if (lyxrc.isp_command != "none")
|
2000-02-22 00:36:17 +00:00
|
|
|
ShowSpellChecker(owner->view());
|
1999-12-10 00:07:59 +00:00
|
|
|
break; // RVDK_PATCH_5
|
|
|
|
|
|
|
|
// --- Cursor Movements -----------------------------
|
|
|
|
case LFUN_RIGHT:
|
|
|
|
{
|
|
|
|
LyXText * tmptext = owner->view()->text;
|
2000-02-04 09:38:32 +00:00
|
|
|
LyXDirection direction =
|
|
|
|
tmptext->cursor.par->getParDirection();
|
1999-12-10 00:07:59 +00:00
|
|
|
if(!tmptext->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
2000-02-03 19:51:27 +00:00
|
|
|
if (direction == LYX_DIR_RIGHT_TO_LEFT)
|
|
|
|
tmptext->CursorLeft();
|
1999-12-10 00:07:59 +00:00
|
|
|
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)
|
2000-03-08 13:52:57 +00:00
|
|
|
&& tmptext->cursor.par->GetInset(tmptext->cursor.pos)->Editable() == Inset::HIGHLY_EDITABLE){
|
1999-12-10 00:07:59 +00:00
|
|
|
Inset * tmpinset = tmptext->cursor.par->GetInset(tmptext->cursor.pos);
|
|
|
|
setMessage(tmpinset->EditMessage());
|
2000-02-25 12:06:15 +00:00
|
|
|
tmpinset->Edit(owner->view(), 0, 0, 0);
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
}
|
2000-02-03 19:51:27 +00:00
|
|
|
if (direction == LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
tmptext->CursorRight();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LEFT:
|
|
|
|
{
|
2000-02-10 17:53:36 +00:00
|
|
|
// This is soooo ugly. Isn`t it possible to make
|
|
|
|
// it simpler? (Lgb)
|
|
|
|
LyXText * txt = owner->view()->text;
|
|
|
|
LyXDirection direction = txt->cursor.par->getParDirection();
|
|
|
|
if(!txt->mark_set) owner->view()->beforeChange();
|
|
|
|
owner->view()->update(-2);
|
|
|
|
if (direction == LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
txt->CursorLeft();
|
|
|
|
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)
|
2000-03-08 13:52:57 +00:00
|
|
|
&& txt->cursor.par->GetInset(txt->cursor.pos)->Editable() == Inset::HIGHLY_EDITABLE) {
|
2000-02-10 17:53:36 +00:00
|
|
|
Inset * tmpinset = txt->cursor.par->GetInset(txt->cursor.pos);
|
|
|
|
setMessage(tmpinset->EditMessage());
|
2000-02-22 00:36:17 +00:00
|
|
|
tmpinset->Edit(owner->view(),
|
|
|
|
tmpinset->width(owner->view()->painter(),
|
2000-02-10 17:53:36 +00:00
|
|
|
txt->GetFont(txt->cursor.par,
|
2000-02-25 12:06:15 +00:00
|
|
|
txt->cursor.pos)),
|
|
|
|
0, 0);
|
2000-02-10 17:53:36 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (direction == LYX_DIR_RIGHT_TO_LEFT)
|
|
|
|
txt->CursorRight();
|
|
|
|
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_UP:
|
2000-01-07 03:42:16 +00:00
|
|
|
if(!owner->view()->text->mark_set) owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-3);
|
|
|
|
owner->view()->text->CursorUp();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DOWN:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-3);
|
|
|
|
owner->view()->text->CursorDown();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_UP_PARAGRAPH:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-3);
|
|
|
|
owner->view()->text->CursorUpParagraph();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DOWN_PARAGRAPH:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-3);
|
|
|
|
owner->view()->text->CursorDownParagraph();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PRIOR:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-3);
|
|
|
|
owner->view()->cursorPrevious();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_NEXT:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-3);
|
|
|
|
owner->view()->cursorNext();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_HOME:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorHome();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_END:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorEnd();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_TAB:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorTab();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_WORDRIGHT:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
2000-02-04 09:38:32 +00:00
|
|
|
if (owner->view()->text->cursor.par->getParDirection()
|
2000-02-03 19:51:27 +00:00
|
|
|
== LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
owner->view()->text->CursorRightOneWord();
|
|
|
|
else
|
|
|
|
owner->view()->text->CursorLeftOneWord();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_WORDLEFT:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
2000-02-04 09:38:32 +00:00
|
|
|
if (owner->view()->text->cursor.par->getParDirection()
|
2000-02-03 19:51:27 +00:00
|
|
|
== LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
owner->view()->text->CursorLeftOneWord();
|
|
|
|
else
|
|
|
|
owner->view()->text->CursorRightOneWord();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BEGINNINGBUF:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorTop();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_ENDBUF:
|
|
|
|
if(!owner->view()->text->mark_set)
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorBottom();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
/* cursor selection ---------------------------- */
|
|
|
|
case LFUN_RIGHTSEL:
|
|
|
|
owner->view()->update(-2);
|
2000-02-04 09:38:32 +00:00
|
|
|
if (owner->view()->text->cursor.par->getParDirection()
|
2000-02-03 19:51:27 +00:00
|
|
|
== LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
owner->view()->text->CursorRight();
|
|
|
|
else
|
|
|
|
owner->view()->text->CursorLeft();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_LEFTSEL:
|
|
|
|
owner->view()->update(-2);
|
2000-02-04 09:38:32 +00:00
|
|
|
if (owner->view()->text->cursor.par->getParDirection()
|
2000-02-03 19:51:27 +00:00
|
|
|
== LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
owner->view()->text->CursorLeft();
|
|
|
|
else
|
|
|
|
owner->view()->text->CursorRight();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_UPSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorUp();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DOWNSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorDown();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_UP_PARAGRAPHSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorUpParagraph();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DOWN_PARAGRAPHSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorDownParagraph();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PRIORSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->cursorPrevious();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_NEXTSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->cursorNext();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_HOMESEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorHome();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_ENDSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorEnd();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_WORDRIGHTSEL:
|
|
|
|
owner->view()->update(-2);
|
2000-02-04 09:38:32 +00:00
|
|
|
if (owner->view()->text->cursor.par->getParDirection()
|
2000-02-03 19:51:27 +00:00
|
|
|
== LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
owner->view()->text->CursorRightOneWord();
|
|
|
|
else
|
|
|
|
owner->view()->text->CursorLeftOneWord();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_WORDLEFTSEL:
|
|
|
|
owner->view()->update(-2);
|
2000-02-04 09:38:32 +00:00
|
|
|
if (owner->view()->text->cursor.par->getParDirection()
|
2000-02-03 19:51:27 +00:00
|
|
|
== LYX_DIR_LEFT_TO_RIGHT)
|
|
|
|
owner->view()->text->CursorLeftOneWord();
|
|
|
|
else
|
|
|
|
owner->view()->text->CursorRightOneWord();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BEGINNINGBUFSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorTop();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_ENDBUFSEL:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->CursorBottom();
|
|
|
|
owner->view()->text->FinishUndo();
|
|
|
|
moveCursorUpdate(true);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
// --- text changing commands ------------------------
|
|
|
|
case LFUN_BREAKLINE:
|
2000-02-29 02:19:17 +00:00
|
|
|
#if 1
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->InsertChar(LyXParagraph::META_NEWLINE);
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer(0.01);
|
|
|
|
moveCursorUpdate(false);
|
2000-02-29 02:19:17 +00:00
|
|
|
#else
|
|
|
|
owner->view()->newline();
|
|
|
|
#endif
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PROTECTEDSPACE:
|
2000-02-29 02:19:17 +00:00
|
|
|
#if 1
|
2000-03-09 03:36:48 +00:00
|
|
|
{
|
|
|
|
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()->update(-1);
|
|
|
|
} else {
|
|
|
|
owner->view()->protectedBlank();
|
|
|
|
}
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
}
|
2000-02-29 02:19:17 +00:00
|
|
|
#else
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->
|
|
|
|
InsertChar(LyXParagraph::META_PROTECTED_SEPARATOR);
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer();
|
|
|
|
moveCursorUpdate(false);
|
2000-02-29 02:19:17 +00:00
|
|
|
#endif
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_SETMARK:
|
|
|
|
if(owner->view()->text->mark_set) {
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(0);
|
|
|
|
setMessage(N_("Mark removed"));
|
|
|
|
} else {
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->mark_set = 1;
|
|
|
|
owner->view()->update(0);
|
|
|
|
setMessage(N_("Mark set"));
|
|
|
|
}
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DELETE:
|
|
|
|
FreeUpdateTimer();
|
|
|
|
if (!owner->view()->text->selection) {
|
|
|
|
owner->view()->text->Delete();
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
// It is possible to make it a lot faster still
|
|
|
|
// just comment out the lone below...
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->showCursor();
|
1999-12-10 00:07:59 +00:00
|
|
|
} else {
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->cut();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
SetUpdateTimer();
|
2000-02-03 19:51:27 +00:00
|
|
|
moveCursorUpdate(false);
|
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_DELETE_SKIP:
|
|
|
|
{
|
|
|
|
// Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
|
|
|
|
|
|
|
|
LyXCursor cursor = owner->view()->text->cursor;
|
|
|
|
|
|
|
|
FreeUpdateTimer();
|
|
|
|
if (!owner->view()->text->selection) {
|
|
|
|
if (cursor.pos == cursor.par->Last()) {
|
|
|
|
owner->view()->text->CursorRight();
|
|
|
|
cursor = owner->view()->text->cursor;
|
|
|
|
if (cursor.pos == 0
|
|
|
|
&& !(cursor.par->added_space_top
|
|
|
|
== VSpace (VSpace::NONE))) {
|
|
|
|
owner->view()->text->SetParagraph
|
|
|
|
(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()->update (1);
|
|
|
|
} else {
|
|
|
|
owner->view()->text->CursorLeft();
|
|
|
|
owner->view()->text->Delete();
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
owner->view()->text->Delete();
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
} else {
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->cut();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
SetUpdateTimer();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
/* -------> Delete word forward. */
|
|
|
|
case LFUN_DELETE_WORD_FORWARD:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
FreeUpdateTimer();
|
|
|
|
owner->view()->text->DeleteWordForward();
|
|
|
|
owner->view()->update( 1 );
|
|
|
|
SetUpdateTimer();
|
|
|
|
moveCursorUpdate(false);
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
/* -------> Delete word backward. */
|
|
|
|
case LFUN_DELETE_WORD_BACKWARD:
|
|
|
|
owner->view()->update(-2);
|
|
|
|
FreeUpdateTimer();
|
|
|
|
owner->view()->text->DeleteWordBackward();
|
|
|
|
owner->view()->update( 1 );
|
|
|
|
SetUpdateTimer();
|
|
|
|
moveCursorUpdate(false);
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
/* -------> Kill to end of line. */
|
|
|
|
case LFUN_DELETE_LINE_FORWARD:
|
|
|
|
FreeUpdateTimer();
|
|
|
|
owner->view()->update(-2);
|
|
|
|
owner->view()->text->DeleteLineForward();
|
|
|
|
owner->view()->update( 1 );
|
|
|
|
SetUpdateTimer();
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
break;
|
|
|
|
|
|
|
|
/* -------> Set mark off. */
|
|
|
|
case LFUN_MARK_OFF:
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->update(0);
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
|
|
|
setMessage(N_("Mark off"));
|
|
|
|
break;
|
|
|
|
|
|
|
|
/* -------> Set mark on. */
|
|
|
|
case LFUN_MARK_ON:
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->mark_set = 1;
|
|
|
|
owner->view()->update( 0 );
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
|
|
|
setMessage(N_("Mark on"));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BACKSPACE:
|
|
|
|
{
|
|
|
|
FreeUpdateTimer();
|
|
|
|
if (!owner->view()->text->selection) {
|
|
|
|
if (owner->getIntl()->getTrans()->backspace()) {
|
|
|
|
owner->view()->text->Backspace();
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
// It is possible to make it a lot faster still
|
|
|
|
// just comment out the lone below...
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->showCursor();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
} else {
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->cut();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
SetUpdateTimer();
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BACKSPACE_SKIP:
|
|
|
|
{
|
|
|
|
// Reverse the effect of LFUN_BREAKPARAGRAPH_SKIP.
|
|
|
|
|
|
|
|
LyXCursor cursor = owner->view()->text->cursor;
|
|
|
|
|
|
|
|
FreeUpdateTimer();
|
|
|
|
if (!owner->view()->text->selection) {
|
|
|
|
if (cursor.pos == 0
|
|
|
|
&& !(cursor.par->added_space_top
|
|
|
|
== VSpace (VSpace::NONE))) {
|
|
|
|
owner->view()->text->SetParagraph
|
|
|
|
(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 (1);
|
|
|
|
} else {
|
|
|
|
owner->view()->text->Backspace();
|
|
|
|
owner->view()->text->sel_cursor
|
|
|
|
= cursor;
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate (1);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
} else
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->cut();
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BREAKPARAGRAPH:
|
|
|
|
{
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->BreakParagraph(0);
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer(0.01);
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
|
|
|
|
{
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->BreakParagraph(1);
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer(0.01);
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-12-10 00:07:59 +00:00
|
|
|
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;
|
|
|
|
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
if (cursor.pos == 0) {
|
|
|
|
if (cursor.par->added_space_top == VSpace(VSpace::NONE)) {
|
|
|
|
owner->view()->text->SetParagraph
|
|
|
|
(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(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
owner->view()->text->BreakParagraph(0);
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
SetUpdateTimer(0.01);
|
|
|
|
owner->view()->text->sel_cursor = cursor;
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
2000-02-03 19:51:27 +00:00
|
|
|
owner->getMiniBuffer()->Set(CurrentState());
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_QUOTE:
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
1999-12-10 00:07:59 +00:00
|
|
|
owner->view()->text->InsertChar('\"'); // This " matches the single quote in the code
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer();
|
|
|
|
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", "", "");
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset);
|
2000-02-25 12:06:15 +00:00
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case LFUN_INSET_TEXT:
|
|
|
|
{
|
|
|
|
InsetText * new_inset = new InsetText(owner->buffer());
|
|
|
|
owner->view()->insertInset(new_inset);
|
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case LFUN_INSET_ERT:
|
|
|
|
{
|
|
|
|
InsetERT * new_inset = new InsetERT(owner->buffer());
|
|
|
|
owner->view()->insertInset(new_inset);
|
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
2000-03-08 15:11:29 +00:00
|
|
|
break;
|
2000-03-08 13:52:57 +00:00
|
|
|
case LFUN_INSET_FOOTNOTE:
|
|
|
|
{
|
|
|
|
InsetFoot * new_inset = new InsetFoot(owner->buffer());
|
|
|
|
owner->view()->insertInset(new_inset);
|
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
// --- lyxserver commands ----------------------------
|
|
|
|
|
|
|
|
case LFUN_CHARATCURSOR:
|
|
|
|
{
|
|
|
|
LyXParagraph::size_type pos =
|
1999-12-16 06:43:25 +00:00
|
|
|
owner->view()->text->cursor.pos;
|
1999-12-10 00:07:59 +00:00
|
|
|
if(pos < owner->view()->text->cursor.par->size())
|
2000-03-16 04:29:22 +00:00
|
|
|
//dispatch_buffer = owner->view()->text->
|
|
|
|
// cursor.par->text[pos];
|
|
|
|
dispatch_buffer =
|
|
|
|
owner->view()->text->
|
|
|
|
cursor.par->GetChar(pos);
|
1999-12-10 00:07:59 +00:00
|
|
|
else
|
|
|
|
dispatch_buffer = "EOF";
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_GETXY:
|
|
|
|
dispatch_buffer =
|
1999-12-16 06:43:25 +00:00
|
|
|
tostr(owner->view()->text->cursor.x) + ' '
|
1999-12-10 00:07:59 +00:00
|
|
|
+ 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(x, y);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_GETLAYOUT:
|
|
|
|
dispatch_buffer =
|
|
|
|
tostr(owner->view()->text->cursor.par->layout);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_GETFONT:
|
|
|
|
{
|
1999-12-16 06:43:25 +00:00
|
|
|
LyXFont * font = &(owner->view()->text->current_font);
|
1999-12-10 00:07:59 +00:00
|
|
|
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:
|
|
|
|
{
|
1999-12-16 06:43:25 +00:00
|
|
|
LyXFont * font = &(owner->view()->text->current_font);
|
1999-12-10 00:07:59 +00:00
|
|
|
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:
|
|
|
|
{
|
1999-12-16 06:43:25 +00:00
|
|
|
string buf;
|
|
|
|
keyseq.print(buf);
|
1999-12-10 00:07:59 +00:00
|
|
|
dispatch_buffer = buf;
|
|
|
|
lyxserver->notifyClient(dispatch_buffer);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_GOTOFILEROW:
|
|
|
|
{
|
|
|
|
char file_name[100];
|
|
|
|
int row;
|
|
|
|
sscanf(argument.c_str(), " %s %d", file_name, &row);
|
|
|
|
|
|
|
|
// Must replace extension of the file to be .lyx and get full path
|
|
|
|
string s = ChangeExtension(string(file_name), ".lyx", false);
|
|
|
|
|
|
|
|
// Either change buffer or load the file
|
|
|
|
if (bufferlist.exists(s))
|
|
|
|
owner->view()->buffer(bufferlist.getBuffer(s));
|
|
|
|
else
|
|
|
|
owner->view()->buffer(bufferlist.loadLyXFile(s));
|
|
|
|
|
|
|
|
// Set the cursor
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->setCursorFromRow(row);
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
// Recenter screen
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->center();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_APROPOS:
|
|
|
|
case LFUN_GETTIP:
|
|
|
|
{
|
|
|
|
int qa = lyxaction.LookupFunc(argument.c_str());
|
1999-12-13 00:05:34 +00:00
|
|
|
setMessage(lyxaction.helpText(static_cast<kb_action>(qa)));
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
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:
|
|
|
|
{
|
|
|
|
char c;
|
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
if (keyseq.length == -1 && keyseq.getiso() != 0)
|
|
|
|
c = keyseq.getiso();
|
1999-12-10 00:07:59 +00:00
|
|
|
else
|
1999-12-16 06:43:25 +00:00
|
|
|
c = 0;
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
owner->getIntl()->getTrans()->
|
|
|
|
deadkey(c, get_accent(action).accent,
|
|
|
|
owner->view()->text);
|
|
|
|
|
|
|
|
// Need to reset, in case the minibuffer calls these
|
|
|
|
// actions
|
|
|
|
keyseq.reset();
|
1999-12-16 06:43:25 +00:00
|
|
|
keyseq.length = 0;
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
// copied verbatim from do_accent_char
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer();
|
|
|
|
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>"));
|
|
|
|
} else {
|
|
|
|
owner->getToolbar()->add(argument, false);
|
|
|
|
owner->getToolbar()->set();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
// --- insert characters ----------------------------------------
|
2000-02-04 09:38:32 +00:00
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
// --- 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:
|
|
|
|
{
|
1999-12-16 06:43:25 +00:00
|
|
|
greek_kb_flag = greek_kb_flag ? 0 : 2;
|
1999-12-10 00:07:59 +00:00
|
|
|
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()) {
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->
|
1999-12-10 00:07:59 +00:00
|
|
|
open_new_inset(new InsetFormula(false));
|
2000-02-25 13:35:38 +00:00
|
|
|
owner->view()
|
|
|
|
->the_locking_inset
|
|
|
|
->LocalDispatch(owner->view(),
|
|
|
|
action,
|
|
|
|
argument);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_INSERT_MATH:
|
|
|
|
{
|
|
|
|
math_insert_symbol(argument.c_str());
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MATH_DISPLAY:
|
|
|
|
{
|
|
|
|
if (owner->view()->available())
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->open_new_inset(new InsetFormula(true));
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case LFUN_MATH_MACRO:
|
|
|
|
{
|
|
|
|
if (owner->view()->available()) {
|
|
|
|
string s(argument);
|
|
|
|
if (s.empty())
|
1999-12-16 06:43:25 +00:00
|
|
|
setErrorMessage(N_("Missing argument"));
|
1999-12-10 00:07:59 +00:00
|
|
|
else {
|
1999-12-16 06:43:25 +00:00
|
|
|
string s1 = token(s, ' ', 1);
|
|
|
|
int na = s1.empty() ? 0: atoi(s1.c_str());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->
|
1999-12-16 06:43:25 +00:00
|
|
|
open_new_inset(new InsetFormulaMacro(token(s, ' ', 0), na));
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_MATH_MODE: // Open or create a math inset
|
|
|
|
{
|
|
|
|
|
|
|
|
if (owner->view()->available())
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->open_new_inset(new InsetFormula);
|
1999-12-10 00:07:59 +00:00
|
|
|
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);
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset);
|
1999-12-10 00:07:59 +00:00
|
|
|
} else {
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset);
|
2000-02-25 12:06:15 +00:00
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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());
|
|
|
|
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset);
|
1999-12-10 00:07:59 +00:00
|
|
|
if (lsarg.empty()) {
|
2000-02-25 12:06:15 +00:00
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
// BibTeX data bases
|
|
|
|
case LFUN_BIBDB_ADD:
|
|
|
|
{
|
|
|
|
InsetBibtex * inset =
|
|
|
|
static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
|
|
|
|
if (inset) {
|
|
|
|
inset->addDatabase(argument);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BIBDB_DEL:
|
|
|
|
{
|
|
|
|
InsetBibtex * inset =
|
|
|
|
static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
|
|
|
|
if (inset) {
|
|
|
|
inset->delDatabase(argument);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BIBTEX_STYLE:
|
|
|
|
{
|
|
|
|
InsetBibtex * inset =
|
|
|
|
static_cast<InsetBibtex*>(getInsetByCode(Inset::BIBTEX_CODE));
|
|
|
|
if (inset) {
|
|
|
|
inset->setOptions(argument);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_INDEX_INSERT:
|
|
|
|
case LFUN_INDEX_INSERT_LAST:
|
|
|
|
{
|
|
|
|
// Can't do that at the beginning of a paragraph.
|
1999-12-16 06:43:25 +00:00
|
|
|
if (owner->view()->text->cursor.pos - 1 < 0)
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
InsetIndex * new_inset = new InsetIndex();
|
|
|
|
if (!argument.empty()) {
|
|
|
|
string lsarg(argument);
|
|
|
|
new_inset->setContents(lsarg);
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset);
|
1999-12-10 00:07:59 +00:00
|
|
|
} else {
|
1999-12-16 06:43:25 +00:00
|
|
|
//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) {
|
2000-02-25 12:06:15 +00:00
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
1999-12-16 06:43:25 +00:00
|
|
|
} 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
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_INDEX_PRINT:
|
|
|
|
{
|
|
|
|
Inset * new_inset = new InsetPrintIndex(owner->buffer());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset, "Standard", true);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_PARENTINSERT:
|
|
|
|
{
|
|
|
|
lyxerr << "arg " << argument << endl;
|
|
|
|
Inset * new_inset = new InsetParent(argument, owner->buffer());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset, "Standard", true);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_CHILDINSERT:
|
|
|
|
{
|
|
|
|
Inset * new_inset = new InsetInclude(argument,
|
|
|
|
owner->buffer());
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertInset(new_inset, "Standard", true);
|
2000-02-25 12:06:15 +00:00
|
|
|
new_inset->Edit(owner->view(), 0, 0, 0);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_CHILDOPEN:
|
|
|
|
{
|
|
|
|
string filename =
|
|
|
|
MakeAbsPath(argument,
|
|
|
|
OnlyPath(owner->buffer()->fileName()));
|
|
|
|
setMessage(N_("Opening child document ") +
|
|
|
|
MakeDisplayPath(filename) + "...");
|
|
|
|
owner->view()->savePosition();
|
|
|
|
if (bufferlist.exists(filename))
|
1999-12-16 06:43:25 +00:00
|
|
|
owner->view()->buffer(bufferlist.getBuffer(filename));
|
1999-12-10 00:07:59 +00:00
|
|
|
else
|
1999-12-16 06:43:25 +00:00
|
|
|
owner->view()->buffer(bufferlist.loadLyXFile(filename));
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_INSERT_NOTE:
|
2000-01-08 21:02:58 +00:00
|
|
|
owner->view()->insertNote();
|
1999-12-10 00:07:59 +00:00
|
|
|
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(kind);
|
|
|
|
owner->view()->update(1);
|
2000-02-17 19:59:08 +00:00
|
|
|
owner->view()->setState();
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_BUFFERBULLETSSELECT:
|
|
|
|
bulletForm();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_TOGGLECURSORFOLLOW:
|
|
|
|
cursor_follows_scrollbar = !cursor_follows_scrollbar;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_KMAP_OFF: // keymap off
|
|
|
|
owner->getIntl()->KeyMapOn(false);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_KMAP_PRIM: // primary keymap
|
|
|
|
owner->getIntl()->KeyMapPrim();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_KMAP_SEC: // secondary keymap
|
|
|
|
owner->getIntl()->KeyMapSec();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_KMAP_TOGGLE: // toggle keymap
|
|
|
|
owner->getIntl()->ToggleKeyMap();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case LFUN_SELFINSERT:
|
|
|
|
{
|
|
|
|
for (string::size_type i = 0; i < argument.length(); ++i) {
|
|
|
|
owner->view()->text->InsertChar(argument[i]);
|
|
|
|
// This needs to be in the loop, or else we
|
|
|
|
// won't break lines correctly. (Asger)
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
SetUpdateTimer();
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
|
|
|
moveCursorUpdate(false);
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
case LFUN_SEQUENCE:
|
|
|
|
{
|
|
|
|
// argument contains ';'-terminated commands
|
|
|
|
while (argument.find(';') != string::npos) {
|
|
|
|
string first;
|
|
|
|
argument = split(argument, first, ';');
|
|
|
|
Dispatch(first);
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
2000-02-01 13:58:06 +00:00
|
|
|
case LFUN_DATE_INSERT: // jdblair: date-insert cmd
|
2000-02-01 11:32:33 +00:00
|
|
|
{
|
|
|
|
char datetmp[32];
|
|
|
|
int datetmp_len;
|
|
|
|
time_t now_time_t;
|
|
|
|
struct tm *now_tm;
|
|
|
|
static string arg;
|
|
|
|
|
|
|
|
now_time_t = time(NULL);
|
|
|
|
now_tm = localtime(&now_time_t);
|
|
|
|
(void)setlocale(LC_TIME, "");
|
|
|
|
if (!argument.empty())
|
|
|
|
arg = argument;
|
|
|
|
else if (arg.empty())
|
2000-03-12 10:35:05 +00:00
|
|
|
arg = lyxrc.date_insert_format;
|
2000-02-01 11:32:33 +00:00
|
|
|
datetmp_len = (int) strftime(datetmp, 32, arg.c_str(), now_tm);
|
|
|
|
for (int i = 0; i < datetmp_len; i++) {
|
|
|
|
owner->view()->text->InsertChar(datetmp[i]);
|
|
|
|
owner->view()->smallUpdate(1);
|
|
|
|
}
|
|
|
|
SetUpdateTimer();
|
|
|
|
owner->view()->text->sel_cursor = owner->view()->text->cursor;
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
case LFUN_SAVEPREFERENCES:
|
|
|
|
{
|
|
|
|
Path p(user_lyxdir);
|
2000-03-12 10:35:05 +00:00
|
|
|
lyxrc.write("preferences");
|
1999-12-10 00:07:59 +00:00
|
|
|
}
|
|
|
|
break;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
case LFUN_UNKNOWN_ACTION:
|
|
|
|
{
|
1999-12-20 17:38:37 +00:00
|
|
|
if(!owner->buffer()) {
|
|
|
|
LyXBell();
|
|
|
|
setErrorMessage(N_("No document open"));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
if (owner->buffer()->isReadonly()) {
|
|
|
|
LyXBell();
|
|
|
|
setErrorMessage(N_("Document is read only"));
|
|
|
|
break;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
|
|
|
|
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). */
|
|
|
|
|
2000-03-12 10:35:05 +00:00
|
|
|
if ( lyxrc.auto_region_delete ) {
|
1999-12-10 00:07:59 +00:00
|
|
|
if (owner->view()->text->selection){
|
|
|
|
owner->view()->text->CutSelection(false);
|
|
|
|
owner->view()->update(-1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-01-07 03:42:16 +00:00
|
|
|
owner->view()->beforeChange();
|
2000-03-17 10:14:46 +00:00
|
|
|
|
|
|
|
if (isdigit(argument[0]) &&
|
|
|
|
(lyxrc.auto_mathmode == "true" ||
|
|
|
|
(lyxrc.auto_mathmode == "rtl" &&
|
|
|
|
owner->view()->text->real_current_font.isVisibleRightToLeft()
|
|
|
|
))) {
|
|
|
|
UpdatableInset * tmpinset = new InsetFormula;
|
|
|
|
LyXCursor & cursor = owner->view()->text->cursor;
|
|
|
|
if (cursor.pos > 0 &&
|
|
|
|
cursor.par->GetChar(cursor.pos - 1) == '-' &&
|
|
|
|
(cursor.pos == 1 ||
|
|
|
|
cursor.par->IsSeparator(cursor.pos - 2) ||
|
|
|
|
cursor.par->IsNewline(cursor.pos - 2) )
|
|
|
|
) {
|
|
|
|
owner->view()->text->Backspace();
|
|
|
|
owner->view()->open_new_inset(tmpinset);
|
|
|
|
tmpinset->LocalDispatch(owner->view(),
|
|
|
|
LFUN_UNKNOWN_ACTION,
|
|
|
|
"-");
|
|
|
|
} else {
|
|
|
|
owner->view()->open_new_inset(tmpinset);
|
|
|
|
}
|
|
|
|
tmpinset->LocalDispatch(owner->view(),
|
|
|
|
LFUN_UNKNOWN_ACTION,
|
|
|
|
argument);
|
|
|
|
return string();
|
|
|
|
}
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
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);
|
1999-11-22 16:19:48 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
|
2000-01-06 02:44:26 +00:00
|
|
|
owner->view()->smallUpdate(1);
|
1999-12-10 00:07:59 +00:00
|
|
|
SetUpdateTimer();
|
|
|
|
|
|
|
|
owner->view()->text->sel_cursor =
|
|
|
|
owner->view()->text->cursor;
|
|
|
|
moveCursorUpdate(false);
|
|
|
|
return string();
|
1999-11-22 16:19:48 +00:00
|
|
|
} else {
|
1999-12-10 00:07:59 +00:00
|
|
|
// 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"));
|
1999-11-22 16:19:48 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
lyxerr << "A truly unknown func!" << endl;
|
|
|
|
break;
|
1999-11-22 16:19:48 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
} // end of switch
|
|
|
|
exit_with_message:
|
1999-11-22 16:19:48 +00:00
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
string res = getMessage();
|
1999-11-22 16:19:48 +00:00
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
if (res.empty()) {
|
|
|
|
if (!commandshortcut.empty()) {
|
|
|
|
string newbuf = owner->getMiniBuffer()->GetText();
|
|
|
|
if (newbuf != commandshortcut) {
|
|
|
|
owner->getMiniBuffer()->Set(newbuf
|
|
|
|
+ " " +
|
|
|
|
commandshortcut);
|
|
|
|
}
|
1999-12-03 13:51:01 +00:00
|
|
|
}
|
1999-12-10 00:07:59 +00:00
|
|
|
} else {
|
|
|
|
owner->getMiniBuffer()->Set(string(_(res.c_str()))
|
|
|
|
+ " " + commandshortcut);
|
1999-11-22 16:19:48 +00:00
|
|
|
}
|
|
|
|
|
1999-12-10 00:07:59 +00:00
|
|
|
return res;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
1999-11-22 16:19:48 +00:00
|
|
|
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
void LyXFunc::setupLocalKeymap()
|
|
|
|
{
|
|
|
|
keyseq.stdmap = keyseq.curmap = toplevel_keymap;
|
|
|
|
cancel_meta_seq.stdmap = cancel_meta_seq.curmap = toplevel_keymap;
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
void LyXFunc::MenuNew(bool fromTemplate)
|
|
|
|
{
|
2000-03-12 10:35:05 +00:00
|
|
|
string fname, initpath = lyxrc.document_path;
|
1999-12-16 06:43:25 +00:00
|
|
|
LyXFileDlg fileDlg;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
if (owner->view()->available()) {
|
|
|
|
string trypath = owner->buffer()->filepath;
|
|
|
|
// If directory is writeable, use this as default.
|
|
|
|
if (IsDirWriteable(trypath) == 1)
|
|
|
|
initpath = trypath;
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
ProhibitInput();
|
2000-03-12 10:35:05 +00:00
|
|
|
fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
|
|
|
|
fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
|
1999-12-16 06:43:25 +00:00
|
|
|
fname = fileDlg.Select(_("Enter Filename for new document"),
|
|
|
|
initpath, "*.lyx", _("newfile"));
|
|
|
|
AllowInput();
|
|
|
|
|
|
|
|
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";
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
// 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)))
|
|
|
|
// If close is canceled, we cancel here too.
|
|
|
|
return;
|
|
|
|
break;
|
|
|
|
case 2: // No: switch to the open document
|
|
|
|
owner->view()->buffer(bufferlist.getBuffer(s));
|
|
|
|
return;
|
|
|
|
case 3: // Cancel: Do nothing
|
|
|
|
owner->getMiniBuffer()->Set(_("Canceled."));
|
|
|
|
return;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Check whether the file already exists
|
|
|
|
if (IsLyXFilename(s)) {
|
|
|
|
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."));
|
|
|
|
return;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
// The template stuff
|
|
|
|
string templname;
|
|
|
|
if (fromTemplate) {
|
|
|
|
ProhibitInput();
|
|
|
|
fname = fileDlg.Select(_("Choose template"),
|
2000-03-12 10:35:05 +00:00
|
|
|
lyxrc.template_path,
|
1999-12-16 06:43:25 +00:00
|
|
|
"*.lyx");
|
|
|
|
templname = fname;
|
|
|
|
AllowInput();
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
|
|
|
|
// find a free buffer
|
|
|
|
lyxerr.debug() << "Find a free buffer." << endl;
|
|
|
|
owner->view()->buffer(bufferlist.newFile(s, templname));
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
|
1999-12-16 06:43:25 +00:00
|
|
|
void LyXFunc::MenuOpen()
|
|
|
|
{
|
2000-03-12 10:35:05 +00:00
|
|
|
string initpath = lyxrc.document_path;
|
1999-12-16 06:43:25 +00:00
|
|
|
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;
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
// launches dialog
|
|
|
|
ProhibitInput();
|
2000-03-12 10:35:05 +00:00
|
|
|
fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
|
1999-09-27 18:44:28 +00:00
|
|
|
fileDlg.SetButton(1, _("Examples"),
|
|
|
|
AddPath(system_lyxdir, "examples"));
|
1999-10-02 16:21:10 +00:00
|
|
|
string filename = fileDlg.Select(_("Select Document to Open"),
|
1999-12-16 06:43:25 +00:00
|
|
|
initpath, "*.lyx");
|
1999-09-27 18:44:28 +00:00
|
|
|
AllowInput();
|
|
|
|
|
|
|
|
// 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";
|
|
|
|
|
|
|
|
// loads document
|
|
|
|
owner->getMiniBuffer()->Set(_("Opening document"),
|
|
|
|
MakeDisplayPath(filename), "...");
|
|
|
|
Buffer * openbuf = bufferlist.loadLyXFile(filename);
|
|
|
|
if (openbuf) {
|
1999-11-22 16:19:48 +00:00
|
|
|
owner->view()->buffer(openbuf);
|
1999-09-27 18:44:28 +00:00
|
|
|
owner->getMiniBuffer()->Set(_("Document"),
|
|
|
|
MakeDisplayPath(filename),
|
|
|
|
_("opened."));
|
|
|
|
} else {
|
|
|
|
owner->getMiniBuffer()->Set(_("Could not open document"),
|
|
|
|
MakeDisplayPath(filename));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LyXFunc::doImportASCII(bool linorpar)
|
|
|
|
{
|
2000-03-12 10:35:05 +00:00
|
|
|
string initpath = lyxrc.document_path;
|
1999-09-27 18:44:28 +00:00
|
|
|
LyXFileDlg fileDlg;
|
|
|
|
|
1999-11-22 16:19:48 +00:00
|
|
|
if (owner->view()->available()) {
|
1999-11-09 23:52:04 +00:00
|
|
|
string trypath = owner->buffer()->filepath;
|
1999-09-27 18:44:28 +00:00
|
|
|
// If directory is writeable, use this as default.
|
|
|
|
if (IsDirWriteable(trypath) == 1)
|
|
|
|
initpath = trypath;
|
|
|
|
}
|
|
|
|
|
|
|
|
// launches dialog
|
|
|
|
ProhibitInput();
|
2000-03-12 10:35:05 +00:00
|
|
|
fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
|
1999-09-27 18:44:28 +00:00
|
|
|
fileDlg.SetButton(1, _("Examples"),
|
|
|
|
AddPath(system_lyxdir, "examples"));
|
1999-10-02 16:21:10 +00:00
|
|
|
string filename = fileDlg.Select(_("Select ASCII file to Import"),
|
1999-12-16 06:43:25 +00:00
|
|
|
initpath, "*.txt");
|
1999-09-27 18:44:28 +00:00
|
|
|
AllowInput();
|
|
|
|
|
|
|
|
// check selected filename
|
|
|
|
if (filename.empty()) {
|
|
|
|
owner->getMiniBuffer()->Set(_("Canceled."));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get absolute path of file
|
|
|
|
filename = MakeAbsPath(filename);
|
|
|
|
|
1999-10-02 16:21:10 +00:00
|
|
|
string s = ChangeExtension(filename, ".lyx", false);
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
// Check if the document already is open
|
1999-12-16 06:43:25 +00:00
|
|
|
if (bufferlist.exists(s)) {
|
1999-09-27 18:44:28 +00:00
|
|
|
switch(AskConfirmation(_("Document is already open:"),
|
1999-11-15 12:01:38 +00:00
|
|
|
MakeDisplayPath(s, 50),
|
1999-09-27 18:44:28 +00:00
|
|
|
_("Do you want to close that document now?\n"
|
|
|
|
"('No' will just switch to the open version)")))
|
1999-12-16 06:43:25 +00:00
|
|
|
{
|
|
|
|
case 1: // Yes: close the document
|
|
|
|
if (!bufferlist.close(bufferlist.getBuffer(s)))
|
1999-09-27 18:44:28 +00:00
|
|
|
// If close is canceled, we cancel here too.
|
1999-12-16 06:43:25 +00:00
|
|
|
return;
|
|
|
|
break;
|
|
|
|
case 2: // No: switch to the open document
|
|
|
|
owner->view()->buffer(bufferlist.getBuffer(s));
|
1999-09-27 18:44:28 +00:00
|
|
|
return;
|
1999-12-16 06:43:25 +00:00
|
|
|
case 3: // Cancel: Do nothing
|
|
|
|
owner->getMiniBuffer()->Set(_("Canceled."));
|
|
|
|
return;
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Check if a LyX document by the same root exists in filesystem
|
|
|
|
FileInfo f(s, true);
|
|
|
|
if (f.exist() && !AskQuestion(_("A document by the name"),
|
|
|
|
MakeDisplayPath(s),
|
|
|
|
_("already exists. Overwrite?"))) {
|
|
|
|
owner->getMiniBuffer()->Set(_("Canceled."));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
1999-11-22 16:19:48 +00:00
|
|
|
owner->view()->buffer(bufferlist.newFile(s, string()));
|
1999-09-27 18:44:28 +00:00
|
|
|
owner->getMiniBuffer()->Set(_("Importing ASCII file"),
|
|
|
|
MakeDisplayPath(filename), "...");
|
|
|
|
// Insert ASCII file
|
2000-03-17 10:14:46 +00:00
|
|
|
InsertAsciiFile(owner->view(), filename, linorpar);
|
1999-09-27 18:44:28 +00:00
|
|
|
owner->getMiniBuffer()->Set(_("ASCII file "),
|
|
|
|
MakeDisplayPath(filename),
|
|
|
|
_("imported."));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LyXFunc::doImportLaTeX(bool isnoweb)
|
|
|
|
{
|
2000-03-12 10:35:05 +00:00
|
|
|
string initpath = lyxrc.document_path;
|
1999-09-27 18:44:28 +00:00
|
|
|
LyXFileDlg fileDlg;
|
|
|
|
|
1999-11-22 16:19:48 +00:00
|
|
|
if (owner->view()->available()) {
|
1999-11-09 23:52:04 +00:00
|
|
|
string trypath = owner->buffer()->filepath;
|
1999-09-27 18:44:28 +00:00
|
|
|
// If directory is writeable, use this as default.
|
|
|
|
if (IsDirWriteable(trypath) == 1)
|
|
|
|
initpath = trypath;
|
|
|
|
}
|
|
|
|
|
|
|
|
// launches dialog
|
|
|
|
ProhibitInput();
|
2000-03-12 10:35:05 +00:00
|
|
|
fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
|
1999-09-27 18:44:28 +00:00
|
|
|
fileDlg.SetButton(1, _("Examples"),
|
|
|
|
AddPath(system_lyxdir, "examples"));
|
1999-10-02 16:21:10 +00:00
|
|
|
string filename;
|
1999-09-27 18:44:28 +00:00
|
|
|
if (isnoweb) {
|
|
|
|
filename = fileDlg.Select(_("Select Noweb file to Import"),
|
|
|
|
initpath, "*.nw");
|
|
|
|
} else {
|
|
|
|
filename = fileDlg.Select(_("Select LaTeX file to Import"),
|
|
|
|
initpath, "*.tex");
|
|
|
|
}
|
|
|
|
|
|
|
|
AllowInput();
|
|
|
|
|
|
|
|
// check selected filename
|
|
|
|
if (filename.empty()) {
|
|
|
|
owner->getMiniBuffer()->Set(_("Canceled."));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get absolute path of file
|
|
|
|
filename = MakeAbsPath(filename);
|
|
|
|
|
|
|
|
// Check if the document already is open
|
1999-10-02 16:21:10 +00:00
|
|
|
string LyXfilename = ChangeExtension(filename, ".lyx", false);
|
1999-09-27 18:44:28 +00:00
|
|
|
if (bufferlist.exists(LyXfilename)){
|
|
|
|
switch(AskConfirmation(_("Document is already open:"),
|
1999-11-15 12:01:38 +00:00
|
|
|
MakeDisplayPath(LyXfilename, 50),
|
1999-09-27 18:44:28 +00:00
|
|
|
_("Do you want to close that document now?\n"
|
|
|
|
"('No' will just switch to the open version)")))
|
1999-12-16 06:43:25 +00:00
|
|
|
{
|
|
|
|
case 1: // Yes: close the document
|
|
|
|
if (!bufferlist.close(bufferlist.getBuffer(LyXfilename)))
|
1999-09-27 18:44:28 +00:00
|
|
|
// If close is canceled, we cancel here too.
|
1999-12-16 06:43:25 +00:00
|
|
|
return;
|
|
|
|
break;
|
|
|
|
case 2: // No: switch to the open document
|
|
|
|
owner->view()->buffer(
|
|
|
|
bufferlist.getBuffer(LyXfilename));
|
1999-09-27 18:44:28 +00:00
|
|
|
return;
|
1999-12-16 06:43:25 +00:00
|
|
|
case 3: // Cancel: Do nothing
|
|
|
|
owner->getMiniBuffer()->Set(_("Canceled."));
|
|
|
|
return;
|
|
|
|
}
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Check if a LyX document by the same root exists in filesystem
|
|
|
|
FileInfo f(LyXfilename, true);
|
|
|
|
if (f.exist() && !AskQuestion(_("A document by the name"),
|
|
|
|
MakeDisplayPath(LyXfilename),
|
|
|
|
_("already exists. Overwrite?"))) {
|
|
|
|
owner->getMiniBuffer()->Set(_("Canceled."));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// loads document
|
|
|
|
Buffer * openbuf;
|
|
|
|
if (!isnoweb) {
|
|
|
|
owner->getMiniBuffer()->Set(_("Importing LaTeX file"),
|
|
|
|
MakeDisplayPath(filename), "...");
|
|
|
|
ImportLaTeX myImport(filename);
|
|
|
|
openbuf = myImport.run();
|
|
|
|
} else {
|
|
|
|
owner->getMiniBuffer()->Set(_("Importing Noweb file"),
|
|
|
|
MakeDisplayPath(filename), "...");
|
|
|
|
ImportNoweb myImport(filename);
|
|
|
|
openbuf = myImport.run();
|
|
|
|
}
|
|
|
|
if (openbuf) {
|
1999-11-22 16:19:48 +00:00
|
|
|
owner->view()->buffer(openbuf);
|
1999-09-27 18:44:28 +00:00
|
|
|
owner->getMiniBuffer()->Set(isnoweb ?
|
|
|
|
_("Noweb file ") : _("LateX file "),
|
|
|
|
MakeDisplayPath(filename),
|
|
|
|
_("imported."));
|
|
|
|
} else {
|
|
|
|
owner->getMiniBuffer()->Set(isnoweb ?
|
|
|
|
_("Could not import Noweb file") :
|
|
|
|
_("Could not import LaTeX file"),
|
|
|
|
MakeDisplayPath(filename));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-10-02 16:21:10 +00:00
|
|
|
void LyXFunc::MenuInsertLyXFile(string const & filen)
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
1999-10-02 16:21:10 +00:00
|
|
|
string filename = filen;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
if (filename.empty()) {
|
|
|
|
// Launch a file browser
|
2000-03-12 10:35:05 +00:00
|
|
|
string initpath = lyxrc.document_path;
|
1999-09-27 18:44:28 +00:00
|
|
|
LyXFileDlg fileDlg;
|
|
|
|
|
1999-11-22 16:19:48 +00:00
|
|
|
if (owner->view()->available()) {
|
1999-11-09 23:52:04 +00:00
|
|
|
string trypath = owner->buffer()->filepath;
|
1999-09-27 18:44:28 +00:00
|
|
|
// If directory is writeable, use this as default.
|
|
|
|
if (IsDirWriteable(trypath) == 1)
|
|
|
|
initpath = trypath;
|
|
|
|
}
|
|
|
|
|
|
|
|
// launches dialog
|
|
|
|
ProhibitInput();
|
2000-03-12 10:35:05 +00:00
|
|
|
fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
|
1999-09-27 18:44:28 +00:00
|
|
|
fileDlg.SetButton(1, _("Examples"),
|
|
|
|
AddPath(system_lyxdir, "examples"));
|
|
|
|
filename = fileDlg.Select(_("Select Document to Insert"),
|
|
|
|
initpath, "*.lyx");
|
|
|
|
AllowInput();
|
|
|
|
|
|
|
|
// 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), "...");
|
2000-01-08 21:02:58 +00:00
|
|
|
bool res = owner->view()->insertLyXFile(filename);
|
1999-09-27 18:44:28 +00:00
|
|
|
if (res) {
|
|
|
|
owner->getMiniBuffer()->Set(_("Document"),
|
|
|
|
MakeDisplayPath(filename),
|
|
|
|
_("inserted."));
|
|
|
|
} else {
|
|
|
|
owner->getMiniBuffer()->Set(_("Could not insert document"),
|
|
|
|
MakeDisplayPath(filename));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LyXFunc::reloadBuffer()
|
|
|
|
{
|
1999-12-10 00:07:59 +00:00
|
|
|
string fn = owner->buffer()->fileName();
|
1999-11-09 23:52:04 +00:00
|
|
|
if (bufferlist.close(owner->buffer()))
|
1999-11-22 16:19:48 +00:00
|
|
|
owner->view()->buffer(bufferlist.loadLyXFile(fn));
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LyXFunc::CloseBuffer()
|
|
|
|
{
|
1999-11-09 23:52:04 +00:00
|
|
|
if (bufferlist.close(owner->buffer()) && !quitting) {
|
1999-11-05 06:02:34 +00:00
|
|
|
if (bufferlist.empty()) {
|
1999-09-27 18:44:28 +00:00
|
|
|
// need this otherwise SEGV may occur while trying to
|
|
|
|
// set variables that don't exist
|
|
|
|
// since there's no current buffer
|
|
|
|
CloseAllBufferRelatedPopups();
|
|
|
|
}
|
|
|
|
else {
|
1999-11-22 16:19:48 +00:00
|
|
|
owner->view()->buffer(bufferlist.first());
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-11-04 01:40:20 +00:00
|
|
|
Inset * LyXFunc::getInsetByCode(Inset::Code code)
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
|
|
|
bool found = false;
|
1999-11-04 01:40:20 +00:00
|
|
|
Inset * inset = 0;
|
1999-12-10 00:07:59 +00:00
|
|
|
LyXCursor cursor = owner->view()->text->cursor;
|
1999-11-04 01:40:20 +00:00
|
|
|
LyXParagraph::size_type pos = cursor.pos;
|
|
|
|
LyXParagraph * par = cursor.par;
|
1999-09-27 18:44:28 +00:00
|
|
|
|
|
|
|
while (par && !found) {
|
|
|
|
while ((inset = par->ReturnNextInsetPointer(pos))){
|
1999-11-15 12:01:38 +00:00
|
|
|
if (inset->LyxCode() == code) {
|
1999-09-27 18:44:28 +00:00
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
++pos;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
par = par->next;
|
|
|
|
}
|
1999-12-16 06:43:25 +00:00
|
|
|
return found ? inset : 0;
|
1999-09-27 18:44:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 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
|
|
|
|
// This func is bit problematic when it comes to NLS, to make the
|
|
|
|
// lyx servers client be language indepenent we must not translate
|
|
|
|
// strings sent to this func.
|
1999-11-22 16:19:48 +00:00
|
|
|
void LyXFunc::setErrorMessage(string const & m) const
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
|
|
|
dispatch_buffer = m;
|
|
|
|
errorstat = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-10-02 16:21:10 +00:00
|
|
|
void LyXFunc::setMessage(string const & m)
|
1999-09-27 18:44:28 +00:00
|
|
|
{
|
|
|
|
dispatch_buffer = m;
|
|
|
|
}
|