lyx_mirror/src/insets/insetbranch.C

337 lines
6.8 KiB
C++
Raw Normal View History

/**
* \file insetbranch.C
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "insetbranch.h"
#include "buffer.h"
#include "bufferparams.h"
#include "BranchList.h"
#include "cursor.h"
#include "dispatchresult.h"
#include "funcrequest.h"
#include "FuncStatus.h"
#include "gettext.h"
#include "LColor.h"
#include "lyxlex.h"
#include "paragraph.h"
#include <sstream>
using std::string;
using std::auto_ptr;
using std::istringstream;
using std::ostream;
using std::ostringstream;
void InsetBranch::init()
{
setInsetName("Branch");
setButtonLabel();
}
InsetBranch::InsetBranch(BufferParams const & bp,
InsetBranchParams const & params)
: InsetCollapsable(bp), params_(params)
{
init();
}
InsetBranch::InsetBranch(InsetBranch const & in)
: InsetCollapsable(in), params_(in.params_)
{
init();
}
InsetBranch::~InsetBranch()
{
InsetBranchMailer(*this).hideDialog();
}
auto_ptr<InsetBase> InsetBranch::doClone() const
{
return auto_ptr<InsetBase>(new InsetBranch(*this));
}
string const InsetBranch::editMessage() const
{
return _("Opened Branch Inset");
}
void InsetBranch::write(Buffer const & buf, ostream & os) const
{
params_.write(os);
InsetCollapsable::write(buf, os);
}
void InsetBranch::read(Buffer const & buf, LyXLex & lex)
{
params_.read(lex);
InsetCollapsable::read(buf, lex);
setButtonLabel();
}
void InsetBranch::setButtonLabel()
{
LyXFont font(LyXFont::ALL_SANE);
font.decSize();
font.decSize();
string s = "Branch: " + params_.branch;
setLabel(isOpen() ? s : getNewLabel(s) );
font.setColor(LColor::foreground);
if (!params_.branch.empty())
setBackgroundColor(lcolor.getFromLyXName(params_.branch));
else
setBackgroundColor(LColor::background);
setLabelFont(font);
}
bool InsetBranch::showInsetDialog(BufferView * bv) const
{
InsetBranchMailer(const_cast<InsetBranch &>(*this)).showDialog(bv);
return true;
}
void InsetBranch::doDispatch(LCursor & cur, FuncRequest & cmd)
{
switch (cmd.action) {
case LFUN_INSET_MODIFY: {
InsetBranchParams params;
InsetBranchMailer::string2params(cmd.argument, params);
params_.branch = params.branch;
setButtonLabel();
break;
}
case LFUN_MOUSE_PRESS:
if (cmd.button() != mouse_button::button3)
InsetCollapsable::doDispatch(cur, cmd);
else
cur.undispatched();
break;
case LFUN_INSET_DIALOG_UPDATE:
InsetBranchMailer(*this).updateDialog(&cur.bv());
break;
case LFUN_MOUSE_RELEASE:
if (cmd.button() == mouse_button::button3 && hitButton(cmd))
InsetBranchMailer(*this).showDialog(&cur.bv());
else
InsetCollapsable::doDispatch(cur, cmd);
break;
case LFUN_INSET_TOGGLE:
// We assume that this lfun is indeed going to be dispatched.
cur.dispatched();
if (cmd.argument == "open")
setStatus(Open);
else if (cmd.argument == "close") {
setStatus(Collapsed);
leaveInset(cur, *this);
} else if (cmd.argument == "toggle") {
if (isOpen()) {
setStatus(Collapsed);
leaveInset(cur, *this);
} else
setStatus(Open);
// The branch inset uses "assign".
} else if (cmd.argument == "assign"
|| cmd.argument.empty()) {
BranchList const & branchlist =
cur.buffer().params().branchlist();
if (isBranchSelected(branchlist)) {
if (status() != Open)
setStatus(Open);
else
cur.undispatched();
} else {
if (status() != Collapsed) {
setStatus(Collapsed);
leaveInset(cur, *this);
} else
cur.undispatched();
}
}
break;
default:
InsetCollapsable::doDispatch(cur, cmd);
break;
}
}
bool InsetBranch::getStatus(LCursor & cur, FuncRequest const & cmd,
FuncStatus & flag) const
{
switch (cmd.action) {
case LFUN_INSET_MODIFY:
case LFUN_INSET_DIALOG_UPDATE:
flag.enabled(true);
break;
case LFUN_INSET_TOGGLE:
if (cmd.argument == "open" || cmd.argument == "close" ||
cmd.argument == "toggle")
flag.enabled(true);
else if (cmd.argument == "assign"
|| cmd.argument.empty()) {
BranchList const & branchlist =
cur.buffer().params().branchlist();
if (isBranchSelected(branchlist)) {
if (status() != Open)
flag.enabled(true);
else
flag.enabled(false);
} else {
if (status() != Collapsed)
flag.enabled(true);
else
flag.enabled(false);
}
} else
flag.enabled(true);
break;
default:
return InsetCollapsable::getStatus(cur, cmd, flag);
}
return true;
}
bool InsetBranch::isBranchSelected(BranchList const & branchlist) const
{
BranchList::const_iterator const end = branchlist.end();
BranchList::const_iterator it =
std::find_if(branchlist.begin(), end,
BranchNamesEqual(params_.branch));
if (it == end)
return false;
return it->getSelected();
}
int InsetBranch::latex(Buffer const & buf, ostream & os,
OutputParams const & runparams) const
{
return isBranchSelected(buf.params().branchlist()) ?
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
InsetText::latex(buf, os, runparams) : 0;
}
int InsetBranch::linuxdoc(Buffer const & buf, std::ostream & os,
OutputParams const & runparams) const
{
return isBranchSelected(buf.params().branchlist()) ?
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
InsetText::linuxdoc(buf, os, runparams) : 0;
}
int InsetBranch::docbook(Buffer const & buf, std::ostream & os,
OutputParams const & runparams) const
{
return isBranchSelected(buf.params().branchlist()) ?
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
InsetText::docbook(buf, os, runparams) : 0;
}
int InsetBranch::plaintext(Buffer const & buf, std::ostream & os,
OutputParams const & runparams) const
{
return isBranchSelected(buf.params().branchlist()) ?
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
InsetText::plaintext(buf, os, runparams): 0;
}
void InsetBranch::validate(LaTeXFeatures & features) const
{
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
InsetText::validate(features);
}
the stuff from the sneak preview: For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
2004-03-25 09:16:36 +00:00
string const InsetBranchMailer::name_("branch");
InsetBranchMailer::InsetBranchMailer(InsetBranch & inset)
: inset_(inset)
{}
string const InsetBranchMailer::inset2string(Buffer const &) const
{
return params2string(inset_.params());
}
string const InsetBranchMailer::params2string(InsetBranchParams const & params)
{
ostringstream data;
data << name_ << ' ';
params.write(data);
return data.str();
}
void InsetBranchMailer::string2params(string const & in,
InsetBranchParams & params)
{
params = InsetBranchParams();
if (in.empty())
return;
istringstream data(in);
LyXLex lex(0,0);
lex.setStream(data);
string name;
lex >> name;
if (name != name_)
return print_mailer_error("InsetBranchMailer", in, 1, name_);
// This is part of the inset proper that is usually swallowed
// by LyXText::readInset
string id;
lex >> id;
if (!lex || id != "Branch")
return print_mailer_error("InsetBranchMailer", in, 2, "Branch");
params.read(lex);
}
void InsetBranchParams::write(ostream & os) const
{
os << "Branch " << branch << '\n';
}
void InsetBranchParams::read(LyXLex & lex)
{
lex >> branch;
}