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
This commit is contained in:
Jürgen Spitzmüller 2008-03-24 13:33:48 +00:00
parent 2567314e44
commit e1ac6d4118
14 changed files with 272 additions and 7 deletions

View File

@ -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 "<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
#
@ -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

View File

@ -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<InsetRef>(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());

View File

@ -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
};

View File

@ -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 <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 },

View File

@ -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)
{}

View File

@ -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_;

View File

@ -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;

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
///

View File

@ -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());

View File

@ -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_;

View File

@ -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";

View File

@ -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;