X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBranch.cpp;h=2676d93338855498c7ae18d5f2ef114068537119;hb=73368ed2d97728ee3ec889383b3803d8e3309e9d;hp=6407fb638963ef404c170e66d7afc9074d68093f;hpb=e26635bfb9ef8323be56efdcda02c5edbb3b3c82;p=lyx.git diff --git a/src/insets/InsetBranch.cpp b/src/insets/InsetBranch.cpp index 6407fb6389..2676d93338 100644 --- a/src/insets/InsetBranch.cpp +++ b/src/insets/InsetBranch.cpp @@ -23,6 +23,7 @@ #include "FuncRequest.h" #include "FuncStatus.h" #include "Lexer.h" +#include "LyX.h" #include "OutputParams.h" #include "output_xhtml.h" #include "TextClass.h" @@ -32,6 +33,7 @@ #include "support/gettext.h" #include "support/lstrings.h" +#include "frontends/alert.h" #include "frontends/Application.h" #include @@ -104,11 +106,10 @@ docstring const InsetBranch::buttonLabel(BufferView const & bv) const docstring symb = docstring(1, char_type(master_selected ? 0x2714 : 0x2716)); if (inchild && master_selected != child_selected) symb += char_type(child_selected ? 0x2714 : 0x2716); - s = symb + s; if (decoration() == InsetLayout::CLASSIC) - return isOpen(bv) ? s : getNewLabel(s); + return symb + (isOpen(bv) ? s : getNewLabel(s)); else - return params_.branch + ": " + getNewLabel(s); + return symb + params_.branch + ": " + getNewLabel(s); } @@ -143,28 +144,40 @@ void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_BRANCH_MASTER_ACTIVATE: case LFUN_BRANCH_MASTER_DEACTIVATE: { bool const master = (cmd.action() == LFUN_BRANCH_MASTER_ACTIVATE - || cmd.action() == LFUN_BRANCH_MASTER_DEACTIVATE); + || cmd.action() == LFUN_BRANCH_MASTER_DEACTIVATE); Buffer * buf = master ? const_cast(buffer().masterBuffer()) - : &buffer(); + : &buffer(); Branch * our_branch = buf->params().branchlist().find(params_.branch); if (!our_branch) break; bool const activate = (cmd.action() == LFUN_BRANCH_ACTIVATE - || cmd.action() == LFUN_BRANCH_MASTER_ACTIVATE); + || cmd.action() == LFUN_BRANCH_MASTER_ACTIVATE); if (our_branch->isSelected() != activate) { // FIXME If the branch is in the master document, we cannot // call recordUndo..., because the master may be hidden, and // the code presently assumes that hidden documents can never // be dirty. See GuiView::closeBufferAll(), for example. + // An option would be to check if the master is hidden. + // If it is, unhide. if (!master) buffer().undo().recordUndoFullDocument(cur); + else + // at least issue a warning for now (ugly, but better than dataloss). + frontend::Alert::warning(_("Branch state changes in master document"), + lyx::support::bformat(_("The state of the branch '%1$s' " + "was changed in the master file. " + "Please make sure to save the master."), params_.branch), true); our_branch->setSelected(activate); - cur.forceBufferUpdate(); + // cur.forceBufferUpdate() is not enough + buf->updateBuffer(); } break; } + case LFUN_BRANCH_ADD: + lyx::dispatch(FuncRequest(LFUN_BRANCH_ADD, params_.branch)); + break; case LFUN_INSET_TOGGLE: if (cmd.argument() == "assign") setStatus(cur, isBranchSelected() ? Open : Collapsed); @@ -182,13 +195,20 @@ void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd) bool InsetBranch::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { + bool const known_branch = + buffer().params().branchlist().find(params_.branch); + switch (cmd.action()) { case LFUN_INSET_MODIFY: flag.setEnabled(true); break; case LFUN_BRANCH_ACTIVATE: - flag.setEnabled(!isBranchSelected(true)); + flag.setEnabled(known_branch && !isBranchSelected(true)); + break; + + case LFUN_BRANCH_ADD: + flag.setEnabled(!known_branch); break; case LFUN_BRANCH_DEACTIVATE: @@ -196,7 +216,9 @@ bool InsetBranch::getStatus(Cursor & cur, FuncRequest const & cmd, break; case LFUN_BRANCH_MASTER_ACTIVATE: - flag.setEnabled(buffer().parent() && !isBranchSelected()); + flag.setEnabled(buffer().parent() + && buffer().masterBuffer()->params().branchlist().find(params_.branch) + && !isBranchSelected()); break; case LFUN_BRANCH_MASTER_DEACTIVATE: @@ -240,13 +262,13 @@ void InsetBranch::latex(otexstream & os, OutputParams const & runparams) const } -int InsetBranch::plaintext(odocstream & os, - OutputParams const & runparams) const +int InsetBranch::plaintext(odocstringstream & os, + OutputParams const & runparams, size_t max_length) const { if (!isBranchSelected()) return 0; - int len = InsetText::plaintext(os, runparams); + int len = InsetText::plaintext(os, runparams, max_length); return len; } @@ -326,7 +348,7 @@ void InsetBranch::string2params(string const & in, InsetBranchParams & params) } -void InsetBranch::addToToc(DocIterator const & cpit) const +void InsetBranch::addToToc(DocIterator const & cpit, bool output_active) const { DocIterator pit = cpit; pit.push_back(CursorSlice(const_cast(*this))); @@ -334,9 +356,10 @@ void InsetBranch::addToToc(DocIterator const & cpit) const Toc & toc = buffer().tocBackend().toc("branch"); docstring str = params_.branch + ": "; text().forToc(str, TOC_ENTRY_LENGTH); - toc.push_back(TocItem(pit, 0, str, toolTipText(docstring(), 3, 60))); + toc.push_back(TocItem(pit, 0, str, output_active, toolTipText(docstring(), 3, 60))); // Proceed with the rest of the inset. - InsetCollapsable::addToToc(cpit); + bool const doing_output = output_active && isBranchSelected(); + InsetCollapsable::addToToc(cpit, doing_output); }