mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-09-22 07:57:22 +00:00
601a8e0192
* buffer_funcs.cpp (updateLabels): new function taking a buffer and a ParIterator as arguments. This one is used to update labels into an InsetText. Cleanup the code to reset depth. Call setLabel for each paragraph, and then updateLabel on each inset it contains. (setCaptionLabels, setCaptions): removed. (setLabel): use Counters::current_float to make caption paragraphs labels. * insets/Inset.h (updateLabels): new virtual method, empty by default; this numbers the inset itself (if relevant) and then all the paragraphs it may contain. * insets/InsetText.cpp (updateLabels): basically calls lyx::updateLabels from buffer_func.cpp. * insets/InsetCaption.cpp (addToToc): use the label constructed by updateLabels. (computeFullLabel): removed. (metrics, plaintext): don't use computeFullLabel. (updateLabels): new method; set the label from Counters::current_float. * insets/InsetWrap.cpp (updateLabels): * insets/InsetFloat.cpp (updateLabel): new method; sets Counters::current_float to the float type. * insets/InsetBranch.cpp (updateLabels): new method; the numbering is reset afterwards if the branch is inactive. (bug 2671) * insets/InsetNote.cpp (updateLabels): new method; the numbering is reset after the underlying InsetText has been numbered. (bug 2671) * insets/InsetTabular.cpp (updateLabels): new method (also handles longtable) * insets/InsetListings.cpp (updateLabels): new method; mimics what is done for Floats (although Listings are not floats technically) * insets/InsetInclude.cpp (getScreenLabel): in the listings case, use the computed label. (updateLabels): new method; that either renumbers the child document or number the current listing. * LyXFunc.cpp (menuNew): do not updateLabels on empty documents (why do we do that at all?) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19482 a592a061-630c-0410-9148-cb99ea01b6c8
353 lines
7.0 KiB
C++
353 lines
7.0 KiB
C++
/**
|
|
* \file InsetBranch.cpp
|
|
* This file is part of LyX, the document processor.
|
|
* Licence details can be found in the file COPYING.
|
|
*
|
|
* \author Martin Vermeer
|
|
*
|
|
* Full author contact details are available in file CREDITS.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include "InsetBranch.h"
|
|
|
|
#include "Buffer.h"
|
|
#include "BufferParams.h"
|
|
#include "BranchList.h"
|
|
#include "Counters.h"
|
|
#include "Cursor.h"
|
|
#include "DispatchResult.h"
|
|
#include "FuncRequest.h"
|
|
#include "FuncStatus.h"
|
|
#include "gettext.h"
|
|
#include "Color.h"
|
|
#include "Lexer.h"
|
|
#include "OutputParams.h"
|
|
|
|
#include <sstream>
|
|
|
|
|
|
namespace lyx {
|
|
|
|
using std::string;
|
|
using std::auto_ptr;
|
|
using std::istringstream;
|
|
using std::ostream;
|
|
using std::ostringstream;
|
|
|
|
|
|
void InsetBranch::init()
|
|
{
|
|
setButtonLabel();
|
|
}
|
|
|
|
|
|
InsetBranch::InsetBranch(BufferParams const & bp,
|
|
InsetBranchParams const & params)
|
|
: InsetCollapsable(bp), params_(params)
|
|
{
|
|
init();
|
|
}
|
|
|
|
|
|
InsetBranch::InsetBranch(InsetBranch const & in)
|
|
: InsetCollapsable(in), params_(in.params_)
|
|
{
|
|
init();
|
|
}
|
|
|
|
|
|
InsetBranch::~InsetBranch()
|
|
{
|
|
InsetBranchMailer(*this).hideDialog();
|
|
}
|
|
|
|
|
|
auto_ptr<Inset> InsetBranch::doClone() const
|
|
{
|
|
return auto_ptr<Inset>(new InsetBranch(*this));
|
|
}
|
|
|
|
|
|
docstring const InsetBranch::editMessage() const
|
|
{
|
|
return _("Opened Branch Inset");
|
|
}
|
|
|
|
|
|
void InsetBranch::write(Buffer const & buf, ostream & os) const
|
|
{
|
|
params_.write(os);
|
|
InsetCollapsable::write(buf, os);
|
|
}
|
|
|
|
|
|
void InsetBranch::read(Buffer const & buf, Lexer & lex)
|
|
{
|
|
params_.read(lex);
|
|
InsetCollapsable::read(buf, lex);
|
|
setButtonLabel();
|
|
}
|
|
|
|
|
|
void InsetBranch::setButtonLabel()
|
|
{
|
|
Font font(Font::ALL_SANE);
|
|
font.decSize();
|
|
font.decSize();
|
|
|
|
docstring s = _("Branch: ") + params_.branch;
|
|
if (!params_.branch.empty()) {
|
|
// FIXME UNICODE
|
|
Color_color c = lcolor.getFromLyXName(to_utf8(params_.branch));
|
|
if (c == Color::none) {
|
|
s = _("Undef: ") + s;
|
|
}
|
|
}
|
|
font.setColor(Color::foreground);
|
|
setLabel(isOpen() ? s : getNewLabel(s) );
|
|
setLabelFont(font);
|
|
}
|
|
|
|
|
|
Color_color InsetBranch::backgroundColor() const
|
|
{
|
|
if (!params_.branch.empty()) {
|
|
// FIXME UNICODE
|
|
Color_color c = lcolor.getFromLyXName(to_utf8(params_.branch));
|
|
if (c == Color::none) {
|
|
c = Color::error;
|
|
}
|
|
return c;
|
|
} else
|
|
return Inset::backgroundColor();
|
|
}
|
|
|
|
|
|
bool InsetBranch::showInsetDialog(BufferView * bv) const
|
|
{
|
|
InsetBranchMailer(const_cast<InsetBranch &>(*this)).showDialog(bv);
|
|
return true;
|
|
}
|
|
|
|
|
|
void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd)
|
|
{
|
|
switch (cmd.action) {
|
|
case LFUN_INSET_MODIFY: {
|
|
InsetBranchParams params;
|
|
InsetBranchMailer::string2params(to_utf8(cmd.argument()), params);
|
|
params_.branch = params.branch;
|
|
setButtonLabel();
|
|
break;
|
|
}
|
|
|
|
case LFUN_MOUSE_PRESS:
|
|
if (cmd.button() != mouse_button::button3)
|
|
InsetCollapsable::doDispatch(cur, cmd);
|
|
else
|
|
cur.undispatched();
|
|
break;
|
|
|
|
case LFUN_INSET_DIALOG_UPDATE:
|
|
InsetBranchMailer(*this).updateDialog(&cur.bv());
|
|
break;
|
|
|
|
case LFUN_MOUSE_RELEASE:
|
|
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") {
|
|
// 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();
|
|
}
|
|
}
|
|
else
|
|
InsetCollapsable::doDispatch(cur, cmd);
|
|
break;
|
|
|
|
default:
|
|
InsetCollapsable::doDispatch(cur, cmd);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
bool InsetBranch::getStatus(Cursor & cur, FuncRequest const & cmd,
|
|
FuncStatus & flag) const
|
|
{
|
|
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;
|
|
}
|
|
|
|
|
|
bool InsetBranch::isBranchSelected(Buffer const & buffer) const
|
|
{
|
|
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();
|
|
}
|
|
|
|
|
|
void InsetBranch::updateLabels(Buffer const & buf, ParIterator const & it)
|
|
{
|
|
if (isBranchSelected(buf))
|
|
InsetCollapsable::updateLabels(buf, it);
|
|
else {
|
|
TextClass const & tclass = buf.params().getTextClass();
|
|
Counters savecnt = tclass.counters();
|
|
InsetCollapsable::updateLabels(buf, it);
|
|
tclass.counters() = savecnt;
|
|
}
|
|
}
|
|
|
|
|
|
int InsetBranch::latex(Buffer const & buf, odocstream & os,
|
|
OutputParams const & runparams) const
|
|
{
|
|
return isBranchSelected(buf) ?
|
|
InsetText::latex(buf, os, runparams) : 0;
|
|
}
|
|
|
|
|
|
int InsetBranch::plaintext(Buffer const & buf, odocstream & os,
|
|
OutputParams const & runparams) const
|
|
{
|
|
if (!isBranchSelected(buf))
|
|
return 0;
|
|
|
|
os << '[' << buf.B_("branch") << ' ' << params_.branch << ":\n";
|
|
InsetText::plaintext(buf, os, runparams);
|
|
os << "\n]";
|
|
|
|
return PLAINTEXT_NEWLINE + 1; // one char on a separate line
|
|
}
|
|
|
|
|
|
int InsetBranch::docbook(Buffer const & buf, odocstream & os,
|
|
OutputParams const & runparams) const
|
|
{
|
|
return isBranchSelected(buf) ?
|
|
InsetText::docbook(buf, os, runparams) : 0;
|
|
}
|
|
|
|
|
|
void InsetBranch::textString(Buffer const & buf, odocstream & os) const
|
|
{
|
|
if (isBranchSelected(buf))
|
|
os << paragraphs().begin()->asString(buf, true);
|
|
}
|
|
|
|
|
|
void InsetBranch::validate(LaTeXFeatures & features) const
|
|
{
|
|
InsetText::validate(features);
|
|
}
|
|
|
|
|
|
|
|
string const InsetBranchMailer::name_("branch");
|
|
|
|
InsetBranchMailer::InsetBranchMailer(InsetBranch & inset)
|
|
: inset_(inset)
|
|
{}
|
|
|
|
|
|
string const InsetBranchMailer::inset2string(Buffer const &) const
|
|
{
|
|
return params2string(inset_.params());
|
|
}
|
|
|
|
|
|
string const InsetBranchMailer::params2string(InsetBranchParams const & params)
|
|
{
|
|
ostringstream data;
|
|
data << name_ << ' ';
|
|
params.write(data);
|
|
return data.str();
|
|
}
|
|
|
|
|
|
void InsetBranchMailer::string2params(string const & in,
|
|
InsetBranchParams & params)
|
|
{
|
|
params = InsetBranchParams();
|
|
if (in.empty())
|
|
return;
|
|
|
|
istringstream data(in);
|
|
Lexer 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 Text::readInset
|
|
string id;
|
|
lex >> id;
|
|
if (!lex || id != "Branch")
|
|
return print_mailer_error("InsetBranchMailer", in, 2, "Branch");
|
|
|
|
params.read(lex);
|
|
}
|
|
|
|
|
|
void InsetBranchParams::write(ostream & os) const
|
|
{
|
|
os << "Branch " << to_utf8(branch) << '\n';
|
|
}
|
|
|
|
|
|
void InsetBranchParams::read(Lexer & lex)
|
|
{
|
|
lex >> branch;
|
|
}
|
|
|
|
} // namespace lyx
|