X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetLabel.cpp;h=6a3be71a0205118378ba7de4ea5bcb578faf30e3;hb=d6f1915684328c6e3fe61c6eef8846b5cabec334;hp=07488dfa6a5c5a9f74a9fecbfd08bf46930daba6;hpb=9abb7db46800e554f57e865a3e768602ffd9d6f1;p=lyx.git diff --git a/src/insets/InsetLabel.cpp b/src/insets/InsetLabel.cpp index 07488dfa6a..6a3be71a02 100644 --- a/src/insets/InsetLabel.cpp +++ b/src/insets/InsetLabel.cpp @@ -12,17 +12,28 @@ #include "InsetLabel.h" +#include "InsetRef.h" + +#include "buffer_funcs.h" #include "Buffer.h" #include "BufferView.h" #include "DispatchResult.h" #include "FuncRequest.h" -#include "Text.h" +#include "InsetIterator.h" +#include "ParIterator.h" #include "sgml.h" +#include "Text.h" +#include "TocBackend.h" +#include "frontends/alert.h" + +#include "support/convert.h" +#include "support/gettext.h" #include "support/lstrings.h" #include "support/lyxalgo.h" using namespace std; +using namespace lyx::support; namespace lyx { @@ -32,30 +43,94 @@ InsetLabel::InsetLabel(InsetCommandParams const & p) {} -CommandInfo const * InsetLabel::findInfo(string const & /* cmdName */) +void InsetLabel::initView() +{ + updateCommand(getParam("name")); +} + + +void InsetLabel::updateCommand(docstring const & new_label, bool updaterefs) +{ + docstring const old_label = getParam("name"); + docstring label = new_label; + int i = 1; + while (buffer().insetLabel(label)) { + label = new_label + '-' + convert(i); + ++i; + } + + if (label != new_label) { + // Warn the user that the label has been changed to something else. + frontend::Alert::warning(_("Label names must be unique!"), + bformat(_("The label %1$s already exists,\n" + "it will be changed to %2$s."), new_label, label)); + } + + buffer().undo().beginUndoGroup(); + setParam("name", label); + + if (updaterefs) { + Buffer::References & refs = buffer().references(old_label); + Buffer::References::iterator it = refs.begin(); + Buffer::References::iterator end = refs.end(); + for (; it != end; ++it) { + buffer().undo().recordUndo(it->second); + it->first->setParam("reference", label); + } + } + buffer().undo().endUndoGroup(); + + // We need an update of the Buffer reference cache. This is achieved by + // updateLabel(). + lyx::updateLabels(buffer()); +} + + +ParamInfo const & InsetLabel::findInfo(string const & /* cmdName */) { - static const char * const paramnames[] = {"name", ""}; - static const bool isoptional[] = {false}; - static const CommandInfo info = {1, paramnames, isoptional}; - return &info; + static ParamInfo param_info_; + if (param_info_.empty()) { + param_info_.add("name", ParamInfo::LATEX_REQUIRED); + } + return param_info_; } -Inset * InsetLabel::clone() const +docstring InsetLabel::screenLabel() const { - return new InsetLabel(params()); + return screen_label_; } -void InsetLabel::getLabelList(Buffer const &, vector & list) const +void InsetLabel::updateLabels(ParIterator const &) { - list.push_back(getParam("name")); + docstring const & label = getParam("name"); + if (buffer().insetLabel(label)) { + // Problem: We already have an InsetLabel with the same name! + screen_label_ = _("DUPLICATE: ") + label; + return; + } + buffer().setInsetLabel(label, this); + screen_label_ = label; } -docstring const InsetLabel::getScreenLabel(Buffer const &) const +void InsetLabel::addToToc(DocIterator const & cpit) { - return getParam("name"); + docstring const & label = getParam("name"); + Toc & toc = buffer().tocBackend().toc("label"); + if (buffer().insetLabel(label) != this) { + toc.push_back(TocItem(cpit, 0, screen_label_)); + return; + } + toc.push_back(TocItem(cpit, 0, screen_label_)); + Buffer::References const & refs = buffer().references(label); + Buffer::References::const_iterator it = refs.begin(); + Buffer::References::const_iterator end = refs.end(); + for (; it != end; ++it) { + DocIterator const ref_pit(it->second); + toc.push_back(TocItem(ref_pit, 1, it->first->screenLabel())); + } } @@ -66,15 +141,12 @@ void InsetLabel::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: { InsetCommandParams p(LABEL_CODE); // FIXME UNICODE - InsetCommandMailer::string2params("label", to_utf8(cmd.argument()), p); + InsetCommand::string2params("label", to_utf8(cmd.argument()), p); if (p.getCmdName().empty()) { cur.noUpdate(); break; } - if (p["name"] != params()["name"]) - cur.bv().buffer().changeRefsIfUnique(params()["name"], - p["name"], REF_CODE); - setParams(p); + updateCommand(p["name"]); break; } @@ -85,16 +157,14 @@ void InsetLabel::doDispatch(Cursor & cur, FuncRequest & cmd) } -int InsetLabel::latex(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetLabel::latex(odocstream & os, OutputParams const &) const { - os << support::escape(getCommand()); + os << escape(getCommand()); return 0; } -int InsetLabel::plaintext(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetLabel::plaintext(odocstream & os, OutputParams const &) const { docstring const str = getParam("name"); os << '<' << str << '>'; @@ -102,11 +172,10 @@ int InsetLabel::plaintext(Buffer const &, odocstream & os, } -int InsetLabel::docbook(Buffer const & buf, odocstream & os, - OutputParams const & runparams) const +int InsetLabel::docbook(odocstream & os, OutputParams const & runparams) const { os << ""; return 0; }