Here are some changes that enlarge the possibilities to alter inset settings via context menus.
Similar menus should be implemented for boxes, notes and friends, and for citations (but there, things are a bit more complex due to the specifics of the cite engines). Comments? Jürgen
Index: lib/ui/stdmenus.inc =================================================================== --- lib/ui/stdmenus.inc (Revision 23910) +++ lib/ui/stdmenus.inc (Arbeitskopie) @@ -546,9 +546,19 @@ 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 "<reference>|r" "next-inset-modify changetype ref" + Item "(<reference>)|e" "next-inset-modify changetype eqref" + Item "<page>|p" "next-inset-modify changetype pageref" + Item "on page <page>|o" "next-inset-modify changetype vpageref" + Item "<reference> on page <page>|f" "next-inset-modify changetype vref" + Item "Formatted reference|t" "next-inset-modify changetype prettyref" + End + # # InsetLabel context menu # @@ -567,6 +577,47 @@ 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 # Menu "context-edit" @@ -587,6 +638,10 @@ 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 +656,10 @@ 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 +668,11 @@ Separator Item "Settings...|S" "inset-settings listings" End - + +# +# InsetGraphics context menu +# + Menu "context-graphics" Item "Edit...|E" "graphics-edit" Separator Index: src/LyXAction.cpp =================================================================== --- src/LyXAction.cpp (Revision 23910) +++ src/LyXAction.cpp (Arbeitskopie) @@ -1068,13 +1068,25 @@ * \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 <INSET> <ARGS> * \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 <INSET> <ARGS> or next-inset-modify changetype <TYPE> + * \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 }, Index: src/insets/InsetSpace.cpp =================================================================== --- src/insets/InsetSpace.cpp (Revision 23910) +++ src/insets/InsetSpace.cpp (Arbeitskopie) @@ -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 @@ } +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()); Index: src/insets/InsetVSpace.h =================================================================== --- src/insets/InsetVSpace.h (Revision 23910) +++ src/insets/InsetVSpace.h (Arbeitskopie) @@ -30,6 +30,15 @@ ~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 @@ /// 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; Index: src/insets/InsetSpace.h =================================================================== --- src/insets/InsetSpace.h (Revision 23910) +++ src/insets/InsetSpace.h (Arbeitskopie) @@ -128,6 +128,8 @@ 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_; Index: src/insets/InsetCommandParams.h =================================================================== --- src/insets/InsetCommandParams.h (Revision 23910) +++ src/insets/InsetCommandParams.h (Arbeitskopie) @@ -154,6 +154,8 @@ 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 @@ 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; Index: src/insets/InsetCommand.cpp =================================================================== --- src/insets/InsetCommand.cpp (Revision 23910) +++ src/insets/InsetCommand.cpp (Arbeitskopie) @@ -100,6 +100,11 @@ { 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 @@ 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; Index: src/insets/InsetVSpace.cpp =================================================================== --- src/insets/InsetVSpace.cpp (Revision 23910) +++ src/insets/InsetVSpace.cpp (Arbeitskopie) @@ -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 @@ } +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 @@ } +docstring InsetVSpace::contextMenu(BufferView const &, int, int) const +{ + return from_ascii("context-vspace"); +} + + string const InsetVSpaceMailer::name_ = "vspace"; Index: src/BufferView.cpp =================================================================== --- src/BufferView.cpp (Revision 23910) +++ src/BufferView.cpp (Arbeitskopie) @@ -866,6 +866,21 @@ 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) { + flag.enabled(false); + break; + } + inset->getStatus(cur, tmpcmd, flag); + return flag; + break; + } + case LFUN_LABEL_GOTO: { flag.enabled(!cmd.argument().empty() || getInsetByCode<InsetRef>(cur, REF_CODE)); @@ -1312,6 +1327,25 @@ 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. + if (!cur.result().dispatched()) + cur.dispatch(tmpcmd); + if (!cur.result().dispatched()) + // 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()); Index: src/FuncCode.h =================================================================== --- src/FuncCode.h (Revision 23910) +++ src/FuncCode.h (Arbeitskopie) @@ -416,6 +416,7 @@ // 320 LFUN_COMPLETION_INLINE, LFUN_COMPLETION_COMPLETE, + LFUN_NEXT_INSET_MODIFY, // JSpitzm 20080323 LFUN_LASTACTION // end of the table };