X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetBranch.cpp;h=db047c2f3d3085e5bbbd08fa7dea03dc6f44013d;hb=dbb1ac30e9a87007af7c53f0f93ec9e21826f90b;hp=459941a8c65179fd82035b157f19d86e278ae8dc;hpb=4b3bea7054c22a094740896f962b73bafaf8df1d;p=lyx.git diff --git a/src/insets/InsetBranch.cpp b/src/insets/InsetBranch.cpp index 459941a8c6..db047c2f3d 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 @@ -64,8 +66,14 @@ void InsetBranch::read(Lexer & lex) docstring InsetBranch::toolTip(BufferView const & bv, int, int) const { - docstring const status = isBranchSelected() ? + docstring const masterstatus = isBranchSelected() ? _("active") : _("non-active"); + docstring const childstatus = isBranchSelected(true) ? + _("active") : _("non-active"); + docstring const status = (masterstatus == childstatus) ? + masterstatus : + support::bformat(_("master: %1$s, child: %2$s"), + masterstatus, childstatus); docstring const heading = support::bformat(_("Branch (%1$s): %2$s"), status, params_.branch); if (isOpen(bv)) @@ -79,10 +87,13 @@ 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)) + bool const inmaster = branchlist.find(params_.branch); + bool const inchild = buffer().params().branchlist().find(params_.branch); + if (!inmaster && inchild) s = _("Branch (child only): ") + params_.branch; - else if (!branchlist.find(params_.branch)) + else if (inmaster && !inchild) + s = _("Branch (master only): ") + params_.branch; + else if (!inmaster) s = _("Branch (undefined): ") + params_.branch; if (!params_.branch.empty()) { // FIXME UNICODE @@ -90,7 +101,12 @@ docstring const InsetBranch::buttonLabel(BufferView const & bv) const if (c == Color_none) s = _("Undef: ") + s; } - s = char_type(isBranchSelected() ? 0x2714 : 0x2716) + s; + bool const master_selected = isBranchSelected(); + bool const child_selected = isBranchSelected(true); + 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); else @@ -125,24 +141,44 @@ void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd) break; } case LFUN_BRANCH_ACTIVATE: - case LFUN_BRANCH_DEACTIVATE: { - // FIXME: I do not like this cast, but have no other idea... - Buffer const * buf = buffer().masterBuffer(); - BranchList const & branchlist = buf->params().branchlist(); - Branch * our_branch = const_cast(branchlist.find(params_.branch)); - if (!our_branch) { - // child only? - our_branch = buffer().params().branchlist().find(params_.branch); - if (!our_branch) - break; - } - bool const activate = (cmd.action() == LFUN_BRANCH_ACTIVATE); + case LFUN_BRANCH_DEACTIVATE: + 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); + Buffer * buf = master ? const_cast(buffer().masterBuffer()) + : &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); 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); @@ -160,17 +196,34 @@ 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()); + flag.setEnabled(known_branch && !isBranchSelected(true)); + break; + + case LFUN_BRANCH_ADD: + flag.setEnabled(!known_branch); break; case LFUN_BRANCH_DEACTIVATE: - flag.setEnabled(isBranchSelected()); + flag.setEnabled(isBranchSelected(true)); + break; + + case LFUN_BRANCH_MASTER_ACTIVATE: + flag.setEnabled(buffer().parent() + && buffer().masterBuffer()->params().branchlist().find(params_.branch) + && !isBranchSelected()); + break; + + case LFUN_BRANCH_MASTER_DEACTIVATE: + flag.setEnabled(buffer().parent() && isBranchSelected()); break; case LFUN_INSET_TOGGLE: @@ -187,9 +240,9 @@ bool InsetBranch::getStatus(Cursor & cur, FuncRequest const & cmd, } -bool InsetBranch::isBranchSelected() const +bool InsetBranch::isBranchSelected(bool const child) const { - Buffer const & realbuffer = *buffer().masterBuffer(); + Buffer const & realbuffer = child ? buffer() : *buffer().masterBuffer(); BranchList const & branchlist = realbuffer.params().branchlist(); Branch const * ourBranch = branchlist.find(params_.branch); @@ -230,8 +283,12 @@ int InsetBranch::docbook(odocstream & os, docstring InsetBranch::xhtml(XHTMLStream & xs, OutputParams const & rp) const { - if (isBranchSelected()) - xhtmlParagraphs(text(), buffer(), xs, rp); + if (isBranchSelected()) { + OutputParams newrp = rp; + newrp.par_begin = 0; + newrp.par_end = text().paragraphs().size(); + xhtmlParagraphs(text(), buffer(), xs, newrp); + } return docstring(); } @@ -257,9 +314,9 @@ void InsetBranch::validate(LaTeXFeatures & features) const } -docstring InsetBranch::contextMenuName() const +string InsetBranch::contextMenuName() const { - return from_ascii("context-branch"); + return "context-branch"; } @@ -315,7 +372,7 @@ void InsetBranchParams::write(ostream & os) const void InsetBranchParams::read(Lexer & lex) { lex.eatLine(); - branch = branch = lex.getDocString(); + branch = lex.getDocString(); } } // namespace lyx