X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBranch.cpp;h=6ab2fb79e73e5712a08c3face65b7bafc933eb6c;hb=55a3dd7b346d29a52ba305a4558e9e380ef50f47;hp=d8b2fd7cbc76aadd6e19441f7829da2f3b01c606;hpb=7f678a39cd0a4516c5cba1068ec89a2c36405c91;p=lyx.git diff --git a/src/insets/InsetBranch.cpp b/src/insets/InsetBranch.cpp index d8b2fd7cbc..6ab2fb79e7 100644 --- a/src/insets/InsetBranch.cpp +++ b/src/insets/InsetBranch.cpp @@ -16,7 +16,7 @@ #include "BufferParams.h" #include "BufferView.h" #include "BranchList.h" -#include "Color.h" +#include "ColorSet.h" #include "Counters.h" #include "Cursor.h" #include "DispatchResult.h" @@ -24,11 +24,13 @@ #include "FuncStatus.h" #include "Lexer.h" #include "OutputParams.h" +#include "output_xhtml.h" #include "TextClass.h" #include "TocBackend.h" #include "support/debug.h" #include "support/gettext.h" +#include "support/lstrings.h" #include "frontends/Application.h" @@ -39,26 +41,16 @@ using namespace std; namespace lyx { -InsetBranch::InsetBranch(Buffer const & buf, InsetBranchParams const & params) - : InsetCollapsable(buf), params_(params) +InsetBranch::InsetBranch(Buffer * buf, InsetBranchParams const & params) + : InsetCollapsable(buf, InsetText::DefaultLayout), params_(params) {} -InsetBranch::~InsetBranch() -{ - hideDialogs("branch", this); -} - - -docstring InsetBranch::editMessage() const -{ - return _("Opened Branch Inset"); -} - - void InsetBranch::write(ostream & os) const { + os << "Branch "; params_.write(os); + os << '\n'; InsetCollapsable::write(os); } @@ -70,32 +62,46 @@ void InsetBranch::read(Lexer & lex) } -docstring InsetBranch::toolTip(BufferView const &, int, int) const +docstring InsetBranch::toolTip(BufferView const & bv, int, int) const { - return _("Branch: ") + params_.branch; + docstring const status = isBranchSelected() ? + _("active") : _("non-active"); + docstring const heading = + support::bformat(_("Branch (%1$s): %2$s"), status, params_.branch); + if (isOpen(bv)) + return heading; + return toolTipText(heading + from_ascii("\n")); } -void InsetBranch::setButtonLabel() +docstring const InsetBranch::buttonLabel(BufferView const & bv) const { docstring s = _("Branch: ") + params_.branch; + Buffer const & realbuffer = *buffer().masterBuffer(); + BranchList const & branchlist = realbuffer.params().branchlist(); + if (!branchlist.find(params_.branch) + && buffer().params().branchlist().find(params_.branch)) + s = _("Branch (child only): ") + params_.branch; + else if (!branchlist.find(params_.branch)) + s = _("Branch (undefined): ") + params_.branch; if (!params_.branch.empty()) { // FIXME UNICODE ColorCode c = lcolor.getFromLyXName(to_utf8(params_.branch)); if (c == Color_none) s = _("Undef: ") + s; } - if (decoration() == InsetLayout::Classic) - setLabel(isOpen() ? s : getNewLabel(s) ); + s = char_type(isBranchSelected() ? 0x2714 : 0x2716) + s; + if (decoration() == InsetLayout::CLASSIC) + return isOpen(bv) ? s : getNewLabel(s); else - setLabel(params_.branch + ": " + getNewLabel(s)); + return params_.branch + ": " + getNewLabel(s); } -ColorCode InsetBranch::backgroundColor() const +ColorCode InsetBranch::backgroundColor(PainterInfo const & pi) const { if (params_.branch.empty()) - return Inset::backgroundColor(); + return Inset::backgroundColor(pi); // FIXME UNICODE ColorCode c = lcolor.getFromLyXName(to_utf8(params_.branch)); if (c == Color_none) @@ -104,51 +110,50 @@ ColorCode InsetBranch::backgroundColor() const } -bool InsetBranch::showInsetDialog(BufferView * bv) const -{ - bv->showDialog("branch", params2string(params()), - const_cast(this)); - return true; -} - - void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd) { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_MODIFY: { InsetBranchParams params; InsetBranch::string2params(to_utf8(cmd.argument()), params); + + cur.recordUndoInset(ATOMIC_UNDO, this); params_.branch = params.branch; - setLayout(cur.buffer().params()); + // what we really want here is a TOC update, but that means + // a full buffer update + cur.forceBufferUpdate(); break; } - - case LFUN_MOUSE_PRESS: - if (cmd.button() != mouse_button::button3) - InsetCollapsable::doDispatch(cur, cmd); - else - cur.undispatched(); - break; - - case LFUN_INSET_DIALOG_UPDATE: - cur.bv().updateDialog("branch", params2string(params())); + case LFUN_BRANCH_ACTIVATE: + case LFUN_BRANCH_DEACTIVATE: { + Buffer * buf = const_cast(buffer().masterBuffer()); + // is the branch in our master buffer? + bool branch_in_master = (buf != &buffer()); + + Branch * our_branch = buf->params().branchlist().find(params_.branch); + if (branch_in_master && !our_branch) { + // child only? + our_branch = buffer().params().branchlist().find(params_.branch); + if (!our_branch) + break; + branch_in_master = false; + } + bool const activate = (cmd.action() == LFUN_BRANCH_ACTIVATE); + if (our_branch->isSelected() != activate) { + // FIXME If the branch is in the master document, we cannot + // call recordUndo..., becuase the master may be hidden, and + // the code presently assumes that hidden documents can never + // be dirty. See GuiView::closeBufferAll(), for example. + if (!branch_in_master) + buffer().undo().recordUndoFullDocument(cur); + our_branch->setSelected(activate); + cur.forceBufferUpdate(); + } break; - + } case LFUN_INSET_TOGGLE: - if (cmd.argument() == "assign") { - // The branch inset uses "assign". - if (isBranchSelected()) { - if (status() != Open) - setStatus(cur, Open); - else - cur.undispatched(); - } else { - if (status() != Collapsed) - setStatus(cur, Collapsed); - else - cur.undispatched(); - } - } + if (cmd.argument() == "assign") + setStatus(cur, isBranchSelected() ? Open : Collapsed); else InsetCollapsable::doDispatch(cur, cmd); break; @@ -163,23 +168,24 @@ void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd) bool InsetBranch::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_MODIFY: - case LFUN_INSET_DIALOG_UPDATE: flag.setEnabled(true); break; + case LFUN_BRANCH_ACTIVATE: + flag.setEnabled(!isBranchSelected()); + break; + + case LFUN_BRANCH_DEACTIVATE: + flag.setEnabled(isBranchSelected()); + break; + case LFUN_INSET_TOGGLE: - if (cmd.argument() == "open" || cmd.argument() == "close" || - cmd.argument() == "toggle") - flag.setEnabled(true); - else if (cmd.argument() == "assign" || cmd.argument().empty()) { - if (isBranchSelected()) - flag.setEnabled(status() != Open); - else - flag.setEnabled(status() != Collapsed); - } else + if (cmd.argument() == "assign") flag.setEnabled(true); + else + return InsetCollapsable::getStatus(cur, cmd, flag); break; default: @@ -194,15 +200,21 @@ bool InsetBranch::isBranchSelected() const Buffer const & realbuffer = *buffer().masterBuffer(); BranchList const & branchlist = realbuffer.params().branchlist(); Branch const * ourBranch = branchlist.find(params_.branch); - if (!ourBranch) - return false; - return ourBranch->getSelected(); + + if (!ourBranch) { + // this branch is defined in child only + ourBranch = buffer().params().branchlist().find(params_.branch); + if (!ourBranch) + return false; + } + return ourBranch->isSelected(); } -int InsetBranch::latex(odocstream & os, OutputParams const & runparams) const +void InsetBranch::latex(otexstream & os, OutputParams const & runparams) const { - return isBranchSelected() ? InsetText::latex(os, runparams) : 0; + if (isBranchSelected()) + InsetText::latex(os, runparams); } @@ -212,11 +224,8 @@ int InsetBranch::plaintext(odocstream & os, if (!isBranchSelected()) return 0; - os << '[' << buffer().B_("branch") << ' ' << params_.branch << ":\n"; - InsetText::plaintext(os, runparams); - os << "\n]"; - - return PLAINTEXT_NEWLINE + 1; // one char on a separate line + int len = InsetText::plaintext(os, runparams); + return len; } @@ -227,16 +236,42 @@ int InsetBranch::docbook(odocstream & os, } -void InsetBranch::textString(odocstream & os) const +docstring InsetBranch::xhtml(XHTMLStream & xs, OutputParams const & rp) const +{ + if (isBranchSelected()) { + OutputParams newrp = rp; + newrp.par_begin = 0; + newrp.par_end = text().paragraphs().size(); + xhtmlParagraphs(text(), buffer(), xs, newrp); + } + return docstring(); +} + + +void InsetBranch::toString(odocstream & os) const +{ + if (isBranchSelected()) + InsetCollapsable::toString(os); +} + + +void InsetBranch::forToc(docstring & os, size_t maxlen) const { if (isBranchSelected()) - os << paragraphs().begin()->asString(AS_STR_LABEL | AS_STR_INSETS); + InsetCollapsable::forToc(os, maxlen); } void InsetBranch::validate(LaTeXFeatures & features) const { - InsetText::validate(features); + if (isBranchSelected()) + InsetCollapsable::validate(features); +} + + +string InsetBranch::contextMenuName() const +{ + return "context-branch"; } @@ -250,7 +285,6 @@ bool InsetBranch::isMacroScope() const string InsetBranch::params2string(InsetBranchParams const & params) { ostringstream data; - data << "branch" << ' '; params.write(data); return data.str(); } @@ -266,31 +300,34 @@ void InsetBranch::string2params(string const & in, InsetBranchParams & params) Lexer lex; lex.setStream(data); lex.setContext("InsetBranch::string2params"); - lex >> "branch" >> "Branch"; params.read(lex); } -void InsetBranch::addToToc(DocIterator const & cpit) +void InsetBranch::addToToc(DocIterator const & cpit) const { DocIterator pit = cpit; - pit.push_back(CursorSlice(*this)); + pit.push_back(CursorSlice(const_cast(*this))); Toc & toc = buffer().tocBackend().toc("branch"); - docstring const str = params_.branch + ": " + text_.getPar(0).asString(); - toc.push_back(TocItem(pit, 0, str)); + docstring str = params_.branch + ": "; + text().forToc(str, TOC_ENTRY_LENGTH); + toc.push_back(TocItem(pit, 0, str, toolTipText(docstring(), 3, 60))); + // Proceed with the rest of the inset. + InsetCollapsable::addToToc(cpit); } void InsetBranchParams::write(ostream & os) const { - os << "Branch " << to_utf8(branch) << '\n'; + os << to_utf8(branch); } void InsetBranchParams::read(Lexer & lex) { - lex >> branch; + lex.eatLine(); + branch = lex.getDocString(); } } // namespace lyx