X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetbranch.C;h=d39d69c718adfa5716e679c9fdecbfba235e1e53;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=d54b7b64973db80f969f36895d0682b5473c6819;hpb=de49e029348c639be64ec77cc9d292c0da6ddc3b;p=lyx.git diff --git a/src/insets/insetbranch.C b/src/insets/insetbranch.C index d54b7b6497..d39d69c718 100644 --- a/src/insets/insetbranch.C +++ b/src/insets/insetbranch.C @@ -14,17 +14,21 @@ #include "buffer.h" #include "bufferparams.h" -#include "BufferView.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 "support/std_sstream.h" +#include +namespace lyx { + using std::string; using std::auto_ptr; using std::istringstream; @@ -34,18 +38,15 @@ using std::ostringstream; void InsetBranch::init() { - setInsetName("Branch"); + setInsetName(from_utf8("Branch")); setButtonLabel(); } -InsetBranch::InsetBranch(BufferParams const & bp, string const & label) - : InsetCollapsable(bp) +InsetBranch::InsetBranch(BufferParams const & bp, + InsetBranchParams const & params) + : InsetCollapsable(bp), params_(params) { - params_.branch = label; - // Hack: stash the list of all allowable branch labels from this - // buffer into inset's parm list as a "stowaway": - params_.branchlist = bp.branchlist(); init(); } @@ -59,18 +60,17 @@ InsetBranch::InsetBranch(InsetBranch const & in) InsetBranch::~InsetBranch() { - InsetBranchMailer mailer("branch", *this); - mailer.hideDialog(); + InsetBranchMailer(*this).hideDialog(); } -auto_ptr InsetBranch::clone() const +auto_ptr InsetBranch::doClone() const { return auto_ptr(new InsetBranch(*this)); } -string const InsetBranch::editMessage() const +docstring const InsetBranch::editMessage() const { return _("Opened Branch Inset"); } @@ -85,10 +85,7 @@ void InsetBranch::write(Buffer const & buf, ostream & os) const void InsetBranch::read(Buffer const & buf, LyXLex & lex) { - if (lex.isOK()) { - lex.next(); - params_.branch = lex.getString(); - } + params_.read(lex); InsetCollapsable::read(buf, lex); setButtonLabel(); } @@ -100,173 +97,226 @@ void InsetBranch::setButtonLabel() font.decSize(); font.decSize(); - setLabel("Branch: " + params_.branch); + docstring s = _("Branch: ") + params_.branch; font.setColor(LColor::foreground); - if (!params_.branch.empty()) - setBackgroundColor(lcolor.getFromLyXName(params_.branch)); - else + if (!params_.branch.empty()) { + // FIXME UNICODE + LColor_color c = lcolor.getFromLyXName(to_utf8(params_.branch)); + if (c == LColor::none) { + c = LColor::error; + s = _("Undef: ") + s; + } + setBackgroundColor(c); + } else setBackgroundColor(LColor::background); + setLabel(isOpen() ? s : getNewLabel(s) ); setLabelFont(font); } bool InsetBranch::showInsetDialog(BufferView * bv) const { - InsetBranchMailer("branch", const_cast(*this)).showDialog(bv); + InsetBranchMailer(const_cast(*this)).showDialog(bv); return true; } -DispatchResult -InsetBranch::priv_dispatch(FuncRequest const & cmd, - idx_type & idx, pos_type & pos) +void InsetBranch::doDispatch(LCursor & cur, FuncRequest & cmd) { - BufferView * bv = cmd.view(); switch (cmd.action) { case LFUN_INSET_MODIFY: { InsetBranchParams params; - InsetBranchMailer::string2params(cmd.argument, params); + InsetBranchMailer::string2params(to_utf8(cmd.argument()), params); params_.branch = params.branch; setButtonLabel(); - return DispatchResult(true, true); + break; } case LFUN_MOUSE_PRESS: if (cmd.button() != mouse_button::button3) - return InsetCollapsable::priv_dispatch(cmd, idx, pos); - return DispatchResult(false); + InsetCollapsable::doDispatch(cur, cmd); + else + cur.undispatched(); + break; case LFUN_INSET_DIALOG_UPDATE: - InsetBranchMailer("branch", *this).updateDialog(bv); - return DispatchResult(true); + InsetBranchMailer(*this).updateDialog(&cur.bv()); + break; case LFUN_MOUSE_RELEASE: - if (cmd.button() == mouse_button::button3 && hitButton(cmd)) { - InsetBranchMailer("branch", *this).showDialog(bv); - return DispatchResult(true); + if (cmd.button() == mouse_button::button3 && hitButton(cmd)) + InsetBranchMailer(*this).showDialog(&cur.bv()); + else + InsetCollapsable::doDispatch(cur, cmd); + break; + + + case LFUN_INSET_TOGGLE: + if (cmd.argument() == "assign" || cmd.argument().empty()) { + // The branch inset uses "assign". + if (isBranchSelected(cur.buffer())) { + if (status() != Open) + setStatus(cur, Open); + else + cur.undispatched(); + } else { + if (status() != Collapsed) + setStatus(cur, Collapsed); + else + cur.undispatched(); + } } - return InsetCollapsable::priv_dispatch(cmd, idx, pos); - + else + InsetCollapsable::doDispatch(cur, cmd); + break; + default: - return InsetCollapsable::priv_dispatch(cmd, idx, pos); + InsetCollapsable::doDispatch(cur, cmd); + break; } } -int InsetBranch::latex(Buffer const & buf, ostream & os, - OutputParams const & runparams) const +bool InsetBranch::getStatus(LCursor & cur, FuncRequest const & cmd, + FuncStatus & flag) const { - string const branch_sel = buf.params().branchlist().allSelected(); - if (branch_sel.find(params_.branch, 0) != string::npos) - return inset.latex(buf, os, runparams); - return 0; + 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()) { + if (isBranchSelected(cur.buffer())) + flag.enabled(status() != Open); + else + flag.enabled(status() != Collapsed); + } else + flag.enabled(true); + break; + + default: + return InsetCollapsable::getStatus(cur, cmd, flag); + } + return true; } -int InsetBranch::linuxdoc(Buffer const & buf, std::ostream & os, - OutputParams const & runparams) const +bool InsetBranch::isBranchSelected(Buffer const & buffer) const { - string const branch_sel = buf.params().branchlist().allSelected(); - if (branch_sel.find(params_.branch, 0) != string::npos) - return inset.linuxdoc(buf, os, runparams); - return 0; + Buffer const & realbuffer = *buffer.getMasterBuffer(); + BranchList const & branchlist = realbuffer.params().branchlist(); + 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::docbook(Buffer const & buf, std::ostream & os, - OutputParams const & runparams) const +int InsetBranch::latex(Buffer const & buf, odocstream & os, + OutputParams const & runparams) const { - string const branch_sel = buf.params().branchlist().allSelected(); - if (branch_sel.find(params_.branch, 0) != string::npos) - return inset.docbook(buf, os, runparams); - return 0; + return isBranchSelected(buf) ? + InsetText::latex(buf, os, runparams) : 0; } -int InsetBranch::plaintext(Buffer const & buf, std::ostream & os, - OutputParams const & runparams) const +int InsetBranch::docbook(Buffer const & buf, odocstream & os, + OutputParams const & runparams) const { - string const branch_sel = buf.params().branchlist().allSelected(); - if (branch_sel.find(params_.branch, 0) != string::npos) { - return inset.plaintext(buf, os, runparams); - } - return 0; + return isBranchSelected(buf) ? + InsetText::docbook(buf, os, runparams) : 0; } -void InsetBranch::validate(LaTeXFeatures & features) const +int InsetBranch::plaintext(Buffer const & buf, odocstream & os, + OutputParams const & runparams) const { - inset.validate(features); + return isBranchSelected(buf) ? + InsetText::plaintext(buf, os, runparams): 0; } +void InsetBranch::textString(Buffer const & buf, odocstream & os) const +{ + if (isBranchSelected(buf)) + os << paragraphs().begin()->asString(buf, true); +} + -InsetBranchMailer::InsetBranchMailer(string const & name, - InsetBranch & inset) - : name_(name), inset_(inset) +void InsetBranch::validate(LaTeXFeatures & features) const { + InsetText::validate(features); } -string const InsetBranchMailer::inset2string(Buffer const & buf) const + +string const InsetBranchMailer::name_("branch"); + +InsetBranchMailer::InsetBranchMailer(InsetBranch & inset) + : inset_(inset) +{} + + +string const InsetBranchMailer::inset2string(Buffer const &) const { - InsetBranchParams params = inset_.params(); - params.branchlist = buf.params().branchlist(); - inset_.setParams(params); - return params2string(name_, params); + return params2string(inset_.params()); } -string const InsetBranchMailer::params2string(string const & name, - InsetBranchParams const & params) +string const InsetBranchMailer::params2string(InsetBranchParams const & params) { ostringstream data; - data << name << ' '; + data << name_ << ' '; params.write(data); - // Add all_branches parameter to data: - data << params.branchlist.allBranches() << "\n"; return data.str(); } void InsetBranchMailer::string2params(string const & in, - InsetBranchParams & params) + 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); - // Process all_branches here: - if (lex.isOK()) { - lex.next(); - params.branchlist.add(lex.getString()); - } } void InsetBranchParams::write(ostream & os) const { - os << "Branch" << " " << branch << "\n"; + os << "Branch " << to_utf8(branch) << '\n'; } void InsetBranchParams::read(LyXLex & lex) { - if (lex.isOK()) { - lex.next(); - string token = lex.getString(); - } - if (lex.isOK()) { - lex.next(); - string token = lex.getString(); - } - if (lex.isOK()) { - lex.next(); - branch = lex.getString(); - } + lex >> branch; } + +} // namespace lyx