#include "bufferparams.h"
#include "BufferView.h"
#include "cursor.h"
+#include "CutAndPaste.h"
#include "debug.h"
#include "dispatchresult.h"
#include "encoding.h"
+#include "errorlist.h"
#include "exporter.h"
#include "format.h"
#include "funcrequest.h"
#include "gettext.h"
#include "importer.h"
+#include "insetiterator.h"
#include "intl.h"
#include "kbmap.h"
+#include "language.h"
#include "LColor.h"
#include "lyx_cb.h"
#include "LyXAction.h"
#include "lyxfind.h"
+#include "lyxlex.h"
#include "lyxrc.h"
#include "lyxrow.h"
#include "lyxserver.h"
+#include "lyxtextclasslist.h"
#include "lyxvc.h"
#include "paragraph.h"
#include "pariterator.h"
flag.setOnOff(true);
break;
- case LFUN_TRACK_CHANGES:
- flag.setOnOff(buf->params().tracking_changes);
- break;
-
case LFUN_EXPORT:
enable = cmd.argument == "custom"
|| Exporter::IsExportable(*buf, cmd.argument);
break;
- case LFUN_UNDO:
- enable = !buf->undostack().empty();
- break;
- case LFUN_REDO:
- enable = !buf->redostack().empty();
- break;
case LFUN_CUT:
case LFUN_COPY:
enable = cur.selection();
case LFUN_MENURELOAD:
enable = !buf->isUnnamed() && !buf->isClean();
break;
- case LFUN_BOOKMARK_GOTO:
- enable = view()->isSavedPosition(strToUnsignedInt(cmd.argument));
- break;
- case LFUN_MERGE_CHANGES:
- case LFUN_ACCEPT_CHANGE:
- case LFUN_REJECT_CHANGE:
- case LFUN_ACCEPT_ALL_CHANGES:
- case LFUN_REJECT_ALL_CHANGES:
- enable = buf && buf->params().tracking_changes;
- break;
case LFUN_INSET_SETTINGS: {
enable = false;
enable = name == "aboutlyx"
|| name == "file"
|| name == "forks"
- || name == "preferences"
+ || name == "prefs"
|| name == "texinfo";
else if (name == "print")
enable = Exporter::IsExportable(*buf, "dvi")
break;
}
+ case LFUN_DIALOG_UPDATE: {
+ string const name = cmd.getArg(0);
+ if (!buf)
+ enable = name == "prefs";
+ break;
+ }
+
case LFUN_MENUNEW:
case LFUN_MENUNEWTMPLT:
case LFUN_WORDFINDFORWARD:
case LFUN_GOTO_PARAGRAPH:
case LFUN_DIALOG_SHOW_NEW_INSET:
case LFUN_DIALOG_SHOW_NEXT_INSET:
- case LFUN_DIALOG_UPDATE:
case LFUN_DIALOG_HIDE:
case LFUN_DIALOG_DISCONNECT_INSET:
case LFUN_CHILDOPEN:
case LFUN_SET_COLOR:
case LFUN_MESSAGE:
case LFUN_EXTERNAL_EDIT:
- case LFUN_FILE_INSERT:
- case LFUN_FILE_INSERT_ASCII:
- case LFUN_FILE_INSERT_ASCII_PARA:
+ case LFUN_GRAPHICS_EDIT:
+ case LFUN_ALL_INSETS_TOGGLE:
+ case LFUN_LANGUAGE_BUFFER:
+ case LFUN_TEXTCLASS_APPLY:
+ case LFUN_TEXTCLASS_LOAD:
+ case LFUN_SAVE_AS_DEFAULT:
+ case LFUN_BUFFERPARAMS_APPLY:
+ case LFUN_LYXRC_APPLY:
// these are handled in our dispatch()
break;
default:
+
cur.getStatus(cmd, flag);
+ if (!flag.enabled())
+ flag = view()->getStatus(cmd);
}
if (!enable)
flag.enabled(false);
// Can we use a readonly buffer?
- if (buf && buf->isReadonly()
+ if (buf && buf->isReadonly()
&& !lyxaction.funcHasFlag(cmd.action, LyXAction::ReadOnly)
&& !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)) {
setStatusMessage(N_("Document is read-only"));
flag.enabled(false);
}
+ //lyxerr << "LyXFunc::getStatus: got: " << flag.enabled() << endl;
return flag;
}
return buf.isClean();
}
+
void showPrintError(string const & name)
{
- string str = bformat(_("Could not print the document %1$s.\n"
- "Check that your printer is set up correctly."),
- MakeDisplayPath(name, 50));
- Alert::error(_("Print document failed"), str);
+ string str = bformat(_("Could not print the document %1$s.\n"
+ "Check that your printer is set up correctly."),
+ MakeDisplayPath(name, 50));
+ Alert::error(_("Print document failed"), str);
+}
+
+
+void loadTextclass(string const & name)
+{
+ std::pair<bool, lyx::textclass_type> const tc_pair =
+ textclasslist.NumberOfClass(name);
+
+ if (!tc_pair.first) {
+ lyxerr << "Document class \"" << name
+ << "\" does not exist."
+ << std::endl;
+ return;
+ }
+
+ lyx::textclass_type const tc = tc_pair.second;
+
+ if (!textclasslist[tc].load()) {
+ string s = bformat(_("The document could not be converted\n"
+ "into the document class %1$s."),
+ textclasslist[tc].name());
+ Alert::error(_("Could not change class"), s);
+ }
}
} //namespace anon
dispatch_buffer.erase();
selection_possible = false;
+ bool update = true;
+
// We cannot use this function here
if (!getStatus(cmd).enabled()) {
lyxerr[Debug::ACTION] << "LyXFunc::dispatch: "
break;
case LFUN_EXEC_COMMAND:
+ owner->getToolbar().display("minibuffer", true);
owner->focus_command_buffer();
break;
Systemcall::DontWait,
command + QuoteName(dviname));
}
-
+
} else {
// case 1: print to a file
command += lyxrc.print_to_file
if (!data.empty())
owner->getDialogs().show("character", data);
}
- else if (name == "document")
- owner->getDialogs().showDocument();
- else if (name == "preamble")
- owner->getDialogs().showPreamble();
- else if (name == "preferences")
- owner->getDialogs().showPreferences();
- else if (name == "spellchecker")
- owner->getDialogs().showSpellchecker();
else if (name == "latexlog") {
pair<Buffer::LogType, string> const logfile =
inset->dispatch(view()->cursor(), fr);
} else if (name == "paragraph") {
dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE));
+ } else if (name == "prefs") {
+ owner->getDialogs().update(name, string());
}
break;
}
case LFUN_SAVEPREFERENCES: {
Path p(user_lyxdir());
- lyxrc.write("preferences");
+ lyxrc.write("preferences", false);
break;
}
break;
}
- case LFUN_BREAKLINE: {
-#warning swallow 'Return' if the minibuffer is focused. But how?
+ case LFUN_GRAPHICS_EDIT: {
+ FuncRequest fr(action, argument);
+ InsetGraphics().dispatch(view()->cursor(), fr);
+ break;
+ }
+
+ case LFUN_ALL_INSETS_TOGGLE: {
+ string action;
+ string const name = split(argument, action, ' ');
+ InsetBase::Code const inset_code =
+ InsetBase::translate(name);
+
+ LCursor & cur = view()->cursor();
+ FuncRequest fr(LFUN_INSET_TOGGLE, action);
+
+ InsetBase & inset = owner->buffer()->inset();
+ InsetIterator it = inset_iterator_begin(inset);
+ InsetIterator const end = inset_iterator_end(inset);
+ for (; it != end; ++it) {
+ if (inset_code == InsetBase::NO_CODE
+ || inset_code == it->lyxCode())
+ it->dispatch(cur, fr);
+ }
+ break;
+ }
+
+ case LFUN_LANGUAGE_BUFFER: {
+ Buffer & buffer = *owner->buffer();
+ Language const * oldL = buffer.params().language;
+ Language const * newL = languages.getLanguage(argument);
+ if (!newL || oldL == newL)
+ break;
+
+ if (oldL->RightToLeft() == newL->RightToLeft()
+ && !buffer.isMultiLingual())
+ buffer.changeLanguage(oldL, newL);
+ else
+ buffer.updateDocLang(newL);
+ break;
+ }
+
+ case LFUN_BUFFERPARAMS_APPLY: {
+ istringstream ss(argument);
+ LyXLex lex(0,0);
+ lex.setStream(ss);
+ int const unknown_tokens =
+ owner->buffer()->readHeader(lex);
+
+ if (unknown_tokens != 0) {
+ lyxerr << "Warning in LFUN_BUFFERPARAMS_APPLY!\n"
+ << unknown_tokens << " unknown token"
+ << (unknown_tokens == 1 ? "" : "s")
+ << endl;
+ }
+ break;
+ }
+
+ case LFUN_TEXTCLASS_APPLY: {
+ Buffer * buffer = owner->buffer();
+
+ lyx::textclass_type const old_class =
+ buffer->params().textclass;
+
+ loadTextclass(argument);
+
+ std::pair<bool, lyx::textclass_type> const tc_pair =
+ textclasslist.NumberOfClass(argument);
+
+ if (!tc_pair.first)
+ break;
+
+ lyx::textclass_type const new_class = tc_pair.second;
+ if (old_class == new_class)
+ // nothing to do
+ break;
+
+ owner->message(_("Converting document to new document class..."));
+ ErrorList el;
+ lyx::cap::SwitchLayoutsBetweenClasses(
+ old_class, new_class,
+ buffer->paragraphs(), el);
+
+ bufferErrors(*buffer, el);
+ view()->showErrorList(_("Class switch"));
+ break;
+ }
+
+ case LFUN_TEXTCLASS_LOAD:
+ loadTextclass(argument);
+ break;
+
+ case LFUN_LYXRC_APPLY: {
+ istringstream ss(argument);
+ bool const success = lyxrc.read(ss) == 0;
+
+ if (!success) {
+ lyxerr << "Warning in LFUN_LYXRC_APPLY!\n"
+ << "Unable to read lyxrc data"
+ << endl;
+ }
+ break;
}
default: {
+ update = false;
DispatchResult res = view()->cursor().dispatch(cmd);
- if (!res.dispatched());
- view()->dispatch(cmd);
+ if (res.dispatched())
+ update |= res.update();
+ else
+ update |= view()->dispatch(cmd);
+
break;
}
}
if (view()->available()) {
- view()->fitCursor();
- view()->update();
- view()->cursor().updatePos();
+ if (view()->fitCursor() || update)
+ view()->update();
// if we executed a mutating lfun, mark the buffer as dirty
if (getStatus(cmd).enabled()
&& !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer)