From e1ac6d411850c934dfc582795bc1ed1570a381c5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrgen=20Spitzm=C3=BCller?= Date: Mon, 24 Mar 2008 13:33:48 +0000 Subject: [PATCH] Some context menu work: * src/BufferView.cpp: * src/FuncCode.h: * src/LyXAction.cpp: - new LFUN_NEXT_INSET_MODIFY * src/insets/InsetBox.{cpp, h}: * src/insets/InsetCommand.{cpp,h}: * src/insets/InsetNote.{cpp,h}: * src/insets/InsetSpace.{cpp,h}: * src/insets/InsetVSpace.{cpp,h}: - implement context menu and access to some changes * lib/ui/stdmenus.ui: - new context menus for Box, Space, VSpace, Note. - extend the context menu for InsetRef. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23920 a592a061-630c-0410-9148-cb99ea01b6c8 --- lib/ui/stdmenus.inc | 101 +++++++++++++++++++++++++++++++- src/BufferView.cpp | 42 +++++++++++++ src/FuncCode.h | 1 + src/LyXAction.cpp | 16 ++++- src/insets/InsetBox.cpp | 16 ++++- src/insets/InsetBox.h | 2 + src/insets/InsetCommand.cpp | 12 ++++ src/insets/InsetCommandParams.h | 4 +- src/insets/InsetNote.cpp | 18 +++++- src/insets/InsetNote.h | 2 + src/insets/InsetSpace.cpp | 20 +++++++ src/insets/InsetSpace.h | 2 + src/insets/InsetVSpace.cpp | 32 ++++++++++ src/insets/InsetVSpace.h | 11 ++++ 14 files changed, 272 insertions(+), 7 deletions(-) diff --git a/lib/ui/stdmenus.inc b/lib/ui/stdmenus.inc index 20d02e9611..87d0079da4 100644 --- a/lib/ui/stdmenus.inc +++ b/lib/ui/stdmenus.inc @@ -546,9 +546,19 @@ Menuset Menu "context-ref" Item "Next Cross-Reference|N" "reference-next" Item "Go to Label|G" "label-goto" + Submenu "Change Type|y" "edit_reftype" Item "Edit...|E" "next-inset-toggle" End + Menu "edit_reftype" + Item "|r" "next-inset-modify changetype ref" + Item "()|e" "next-inset-modify changetype eqref" + Item "|p" "next-inset-modify changetype pageref" + Item "on page |o" "next-inset-modify changetype vpageref" + Item " on page |f" "next-inset-modify changetype vref" + Item "Formatted reference|t" "next-inset-modify changetype prettyref" + End + # # InsetLabel context menu # @@ -566,6 +576,83 @@ Menuset Item "Close Inset|C" "inset-toggle close" End +# +# InsetBox context menu +# + + Menu "context-box" + Submenu "Change Type|y" "edit_boxtype" + Item "Settings...|S" "inset-settings box" + End + + Menu "edit_boxtype" + Item "Frameless|l" "next-inset-modify changetype Frameless" + Item "Simple frame|f" "next-inset-modify changetype Boxed" + Item "Simple frame, page breaks|p" "next-inset-modify changetype Framed" + Item "Oval, thin|O" "next-inset-modify changetype ovalbox" + Item "Oval, thick|v" "next-inset-modify changetype Ovalbox" + Item "Drop Shadow|w" "next-inset-modify changetype Shadowbox" + Item "Shaded background|b" "next-inset-modify changetype Shaded" + Item "Double frame|D" "next-inset-modify changetype Doublebox" + End + + +# +# InsetNote context menu +# + + Menu "context-note" + Submenu "Change Type|y" "edit_notetype" + Item "Settings...|S" "inset-settings note" + End + + Menu "edit_notetype" + Item "LyX Note|N" "next-inset-modify note Note Note" + Item "Comment|C" "next-inset-modify note Note Comment" + Item "Greyed Out|G" "next-inset-modify note Note Greyedout" + End + +# +# InsetSpace context menu +# + Menu "context-space" + Submenu "Change Type|y" "edit_spacetype" + Item "Edit...|E" "next-inset-toggle" + End + + Menu "edit_spacetype" + Item "Interword Space|w" "next-inset-modify space \space{}" + Item "Protected Space|P" "next-inset-modify space ~" + Item "Thin Space|T" "next-inset-modify space \thinspace{}" + Item "Quad Space|Q" "next-inset-modify space \quad{}" + Item "QQuad Space|u" "next-inset-modify space \qquad{}" + Item "Enspace|E" "next-inset-modify space \enspace{}" + Item "Enskip|k" "next-inset-modify space \enskip{}" + Item "Negative Thin Space|N" "next-inset-modify space \negthinspace{}" + Item "Horizontal Fill|F" "next-inset-modify space \hfill{}" + Item "Protected Horizontal Fill|i" "next-inset-modify space \hspace*{\fill}" + Item "Horizontal Fill (Dots)|D" "next-inset-modify space \dotfill{}" + Item "Horizontal Fill (Rule)|R" "next-inset-modify space \hrulefill{}" + Item "Custom Length|C" "command-sequence next-inset-modify space \hspace{} \length 1in; next-inset-toggle" + End + +# +# InsetVSpace context menu +# + Menu "context-vspace" + Submenu "Change Type|y" "edit_vspacetype" + Item "Edit...|E" "next-inset-toggle" + End + + Menu "edit_vspacetype" + Item "DefSkip|D" "next-inset-modify vspace defskip" + Item "SmallSkip|S" "next-inset-modify vspace smallskip" + Item "MedSkip|M" "next-inset-modify vspace medskip" + Item "BigSkip|B" "next-inset-modify vspace bigskip" + Item "VFill|F" "next-inset-modify vspace vfill" + Item "Custom|C" "command-sequence next-inset-modify vspace 1in; next-inset-toggle" + End + # # Edit context menu # @@ -587,6 +674,10 @@ Menuset Item "Fullscreen Mode" "ui-toggle fullscreen" End +# +# Math Macro context menu +# + Menu "context-math-macro-definition" Item "Append Parameter" "math-macro-add-param" Item "Remove Last Parameter" "math-macro-remove-param" @@ -601,6 +692,10 @@ Menuset Item "Remove Last Parameter Spitting Out To The Right" "math-macro-remove-greedy-param" End +# +# InsetListing context menu +# + Menu "context-listings" Item "Cut" "cut" Item "Copy" "copy" @@ -609,7 +704,11 @@ Menuset Separator Item "Settings...|S" "inset-settings listings" End - + +# +# InsetGraphics context menu +# + Menu "context-graphics" Item "Edit...|E" "graphics-edit" Separator diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 95bb417f87..0a0a642003 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -866,6 +866,29 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) flag.enabled(true); break; + case LFUN_NEXT_INSET_MODIFY: { + // this is the real function we want to invoke + FuncRequest tmpcmd = FuncRequest(LFUN_INSET_MODIFY, cmd.argument()); + // if there is an inset at cursor, see whether it + // can be modified. + Inset * inset = cur.nextInset(); + if (inset) { + inset->getStatus(cur, tmpcmd, flag); + return flag; + break; + } + // if it did not work, try the underlying inset. + inset = &cur.inset(); + if (inset) { + inset->getStatus(cur, tmpcmd, flag); + return flag; + break; + } + // else disable + flag.enabled(false); + break; + } + case LFUN_LABEL_GOTO: { flag.enabled(!cmd.argument().empty() || getInsetByCode(cur, REF_CODE)); @@ -1312,6 +1335,25 @@ bool BufferView::dispatch(FuncRequest const & cmd) break; } + case LFUN_NEXT_INSET_MODIFY: { + // this is the real function we want to invoke + FuncRequest tmpcmd = FuncRequest(LFUN_INSET_MODIFY, cmd.argument()); + // if there is an inset at cursor, see whether it + // can be modified. + Inset * inset = cur.nextInset(); + if (inset) + inset->dispatch(cur, tmpcmd); + // if it did not work, try the underlying inset. + else if (&cur.inset()) + cur.inset().dispatch(cur, tmpcmd); + else + // It did not work too; no action needed. + break; + cur.clearSelection(); + processUpdateFlags(Update::Force | Update::FitCursor); + break; + } + case LFUN_SCREEN_UP: case LFUN_SCREEN_DOWN: { Point p = getPos(cur, cur.boundary()); diff --git a/src/FuncCode.h b/src/FuncCode.h index 0ff3acba48..2756b89861 100644 --- a/src/FuncCode.h +++ b/src/FuncCode.h @@ -416,6 +416,7 @@ enum FuncCode // 320 LFUN_COMPLETION_INLINE, LFUN_COMPLETION_COMPLETE, + LFUN_NEXT_INSET_MODIFY, // JSpitzm 20080323 LFUN_LASTACTION // end of the table }; diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp index afaecf8222..034c75fbb7 100644 --- a/src/LyXAction.cpp +++ b/src/LyXAction.cpp @@ -1068,13 +1068,25 @@ void LyXAction::init() * \var lyx::FuncCode lyx::LFUN_INSET_MODIFY * \li Action: Modify existing inset. * \li Notion: Used for label, floats, listings, box, branch, external, wrap - bibtex, ert, command, grahocs, note, vspace, tabular, bibitem, - inlude, ref insets. + bibtex, ert, command, graphics, note, space, vspace, tabular, + bibitem, inlude, ref insets. * \li Syntax: inset-modify * \li Params: See #LFUN_INSET_INSERT for further details. * \endvar */ { LFUN_INSET_MODIFY, "", Noop, Hidden }, +/*! + * \var lyx::FuncCode lyx::LFUN_NEXT_INSET_MODIFY + * \li Action: Modify the inset at cursor position, if there is one. + * \li Notion: Used for label, floats, listings, box, branch, external, wrap + bibtex, ert, command, graphics, note, space, vspace, tabular, + bibitem, inlude, ref insets. + * \li Syntax: next-inset-modify or next-inset-modify changetype + * \li Params: See #LFUN_INSET_INSERT for further details. + * \li Origin: JSpitzm, 23 Mar 2008 + * \endvar + */ + { LFUN_NEXT_INSET_MODIFY, "next-inset-modify", ReadOnly, Edit }, { LFUN_INSET_DIALOG_UPDATE, "", Noop, Hidden }, { LFUN_INSET_SETTINGS, "inset-settings", ReadOnly, Edit }, { LFUN_NEXT_INSET_TOGGLE, "next-inset-toggle", ReadOnly, Edit }, diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp index 3510109515..024208f107 100644 --- a/src/insets/InsetBox.cpp +++ b/src/insets/InsetBox.cpp @@ -186,7 +186,10 @@ void InsetBox::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: { //lyxerr << "InsetBox::dispatch MODIFY" << endl; - InsetBoxMailer::string2params(to_utf8(cmd.argument()), params_); + if (cmd.getArg(0) == "changetype") + params_.type = cmd.getArg(1); + else + InsetBoxMailer::string2params(to_utf8(cmd.argument()), params_); setLayout(cur.buffer().params()); break; } @@ -216,6 +219,11 @@ bool InsetBox::getStatus(Cursor & cur, FuncRequest const & cmd, switch (cmd.action) { case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "changetype") + flag.setOnOff(cmd.getArg(1) == params_.type); + else + flag.enabled(true); + return true; case LFUN_INSET_DIALOG_UPDATE: flag.enabled(true); return true; @@ -490,6 +498,12 @@ void InsetBox::validate(LaTeXFeatures & features) const } +docstring InsetBox::contextMenu(BufferView const &, int, int) const +{ + return from_ascii("context-box"); +} + + InsetBoxMailer::InsetBoxMailer(InsetBox & inset) : inset_(inset) {} diff --git a/src/insets/InsetBox.h b/src/insets/InsetBox.h index 4f207c28a8..28aa7a4b22 100644 --- a/src/insets/InsetBox.h +++ b/src/insets/InsetBox.h @@ -123,6 +123,8 @@ private: Inset * clone() const { return new InsetBox(*this); } /// used by the constructors void init(); + /// + virtual docstring contextMenu(BufferView const & bv, int x, int y) const; /// InsetBoxParams params_; diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp index c1fa7b6f06..aceb05b621 100644 --- a/src/insets/InsetCommand.cpp +++ b/src/insets/InsetCommand.cpp @@ -100,6 +100,11 @@ void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd) { switch (cmd.action) { case LFUN_INSET_MODIFY: { + if (cmd.getArg(0) == "changetype") { + p_.setCmdName(cmd.getArg(1)); + initView(); + break; + } InsetCommandParams p(p_.code()); InsetCommandMailer::string2params(mailer_name_, to_utf8(cmd.argument()), p); if (p.getCmdName().empty()) @@ -139,6 +144,13 @@ bool InsetCommand::getStatus(Cursor & cur, FuncRequest const & cmd, return true; // we handle these case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "changetype") { + string const newtype = cmd.getArg(1); + status.enabled(p_.isCompatibleCommand(p_.code(), newtype)); + status.setOnOff(newtype == p_.getCmdName()); + } else + status.enabled(true); + return true; case LFUN_INSET_DIALOG_UPDATE: status.enabled(true); return true; diff --git a/src/insets/InsetCommandParams.h b/src/insets/InsetCommandParams.h index ef4d9b4c21..f067c3258a 100644 --- a/src/insets/InsetCommandParams.h +++ b/src/insets/InsetCommandParams.h @@ -154,6 +154,8 @@ public: void preview(bool p) { preview_ = p; } /// Clear the values of all parameters void clear(); + /// + static bool isCompatibleCommand(InsetCode code, std::string const & s); private: /// @@ -167,8 +169,6 @@ private: static ParamInfo const & findInfo(InsetCode code, std::string const & cmdName); /// - static bool isCompatibleCommand(InsetCode code, std::string const & s); - /// std::string getDefaultCmd(InsetCode); /// docstring makeKeyValArgument() const; diff --git a/src/insets/InsetNote.cpp b/src/insets/InsetNote.cpp index 51d8e8bb60..624ff4ca2a 100644 --- a/src/insets/InsetNote.cpp +++ b/src/insets/InsetNote.cpp @@ -197,6 +197,16 @@ bool InsetNote::getStatus(Cursor & cur, FuncRequest const & cmd, switch (cmd.action) { case LFUN_INSET_MODIFY: + // disallow comment and greyed out in commands + flag.enabled(!cur.paragraph().layout().isCommand() || + cmd.getArg(2) == "Note"); + if (cmd.getArg(0) == "note") { + InsetNoteParams params; + InsetNoteMailer::string2params(to_utf8(cmd.argument()), params); + flag.setOnOff(params_.type == params.type); + } + return true; + case LFUN_INSET_DIALOG_UPDATE: flag.enabled(true); return true; @@ -206,6 +216,7 @@ bool InsetNote::getStatus(Cursor & cur, FuncRequest const & cmd, } } + void InsetNote::updateLabels(ParIterator const & it) { DocumentClass const & tclass = buffer().params().documentClass(); @@ -330,6 +341,11 @@ void InsetNote::validate(LaTeXFeatures & features) const } +docstring InsetNote::contextMenu(BufferView const &, int, int) const +{ + return from_ascii("context-note"); +} + string const InsetNoteMailer::name_("note"); @@ -375,7 +391,7 @@ void InsetNoteMailer::string2params(string const & in, string id; lex >> id; if (!lex || id != "Note") - return print_mailer_error("InsetBoxMailer", in, 2, "Note"); + return print_mailer_error("InsetNoteMailer", in, 2, "Note"); params.read(lex); } diff --git a/src/insets/InsetNote.h b/src/insets/InsetNote.h index a9ca313b87..7e509a4710 100644 --- a/src/insets/InsetNote.h +++ b/src/insets/InsetNote.h @@ -89,6 +89,8 @@ private: /// used by the constructors void init(); /// + virtual docstring contextMenu(BufferView const & bv, int x, int y) const; + /// friend class InsetNoteParams; /// diff --git a/src/insets/InsetSpace.cpp b/src/insets/InsetSpace.cpp index 2c3c97d992..0f954f41e2 100644 --- a/src/insets/InsetSpace.cpp +++ b/src/insets/InsetSpace.cpp @@ -18,6 +18,7 @@ #include "Cursor.h" #include "Dimension.h" #include "FuncRequest.h" +#include "FuncStatus.h" #include "Length.h" #include "Lexer.h" #include "MetricsInfo.h" @@ -142,6 +143,25 @@ void InsetSpace::doDispatch(Cursor & cur, FuncRequest & cmd) } +bool InsetSpace::getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + switch (cmd.action) { + // we handle these + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "space") { + InsetSpaceParams params; + InsetSpaceMailer::string2params(to_utf8(cmd.argument()), params); + status.setOnOff(params_.kind == params.kind); + } else + status.enabled(true); + return true; + default: + return Inset::getStatus(cur, cmd, status); + } +} + + void InsetSpace::edit(Cursor & cur, bool, EntryDirection) { InsetSpaceMailer(*this).showDialog(&cur.bv()); diff --git a/src/insets/InsetSpace.h b/src/insets/InsetSpace.h index e6f5bce986..7af58d38e1 100644 --- a/src/insets/InsetSpace.h +++ b/src/insets/InsetSpace.h @@ -128,6 +128,8 @@ private: virtual Inset * clone() const { return new InsetSpace(*this); } /// void doDispatch(Cursor & cur, FuncRequest & cmd); + /// + bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const; /// InsetSpaceParams params_; diff --git a/src/insets/InsetVSpace.cpp b/src/insets/InsetVSpace.cpp index 42daae2675..5b40341d8c 100644 --- a/src/insets/InsetVSpace.cpp +++ b/src/insets/InsetVSpace.cpp @@ -18,6 +18,7 @@ #include "Dimension.h" #include "DispatchResult.h" #include "FuncRequest.h" +#include "FuncStatus.h" #include "support/gettext.h" #include "Lexer.h" #include "Text.h" @@ -72,6 +73,31 @@ void InsetVSpace::doDispatch(Cursor & cur, FuncRequest & cmd) } +bool InsetVSpace::getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + switch (cmd.action) { + // we handle these + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "vspace") { + VSpace vspace; + InsetVSpaceMailer::string2params(to_utf8(cmd.argument()), vspace); + status.setOnOff(vspace == space_); + } else + status.enabled(true); + return true; + default: + return Inset::getStatus(cur, cmd, status); + } +} + + +void InsetVSpace::edit(Cursor & cur, bool, EntryDirection) +{ + InsetVSpaceMailer(*this).showDialog(&cur.bv()); +} + + void InsetVSpace::read(Lexer & lex) { BOOST_ASSERT(lex.isOK()); @@ -209,6 +235,12 @@ int InsetVSpace::docbook(odocstream & os, OutputParams const &) const } +docstring InsetVSpace::contextMenu(BufferView const &, int, int) const +{ + return from_ascii("context-vspace"); +} + + string const InsetVSpaceMailer::name_ = "vspace"; diff --git a/src/insets/InsetVSpace.h b/src/insets/InsetVSpace.h index 27ce8c14ac..38bc2bf9bd 100644 --- a/src/insets/InsetVSpace.h +++ b/src/insets/InsetVSpace.h @@ -30,6 +30,15 @@ public: ~InsetVSpace(); /// How much? VSpace const & space() const { return space_; } + /// + InsetCode lyxCode() const { return VSPACE_CODE; } + /// + void edit(Cursor & cur, bool front, + EntryDirection entry_from = ENTRY_DIRECTION_IGNORE); + /// + EDITABLE editable() const { return IS_EDITABLE; } + /// + virtual docstring contextMenu(BufferView const & bv, int x, int y) const; private: /// void metrics(MetricsInfo & mi, Dimension & dim) const; @@ -50,6 +59,8 @@ private: /// void doDispatch(Cursor & cur, FuncRequest & cmd); /// + bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const; + /// Inset * clone() const { return new InsetVSpace(*this); } /// docstring const label() const; -- 2.39.2