Change (and fix) the bullets in itemize to be more unicode friendly.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15416 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Lars Gullik Bjønnes 2006-10-20 19:26:23 +00:00
parent b23807ec0b
commit b27bb5cb53
24 changed files with 135 additions and 96 deletions

View File

@ -20,6 +20,8 @@
#include <boost/assert.hpp>
using lyx::docstring;
using std::string;
@ -54,7 +56,7 @@ Bullet::Bullet(int f, int c, int s)
Bullet::Bullet(string const & t)
Bullet::Bullet(docstring const & t)
: font(MIN), character(MIN), size(MIN), user_text(1), text(t)
{
testInvariant();
@ -97,7 +99,7 @@ void Bullet::setSize(int s)
}
void Bullet::setText(string const & t)
void Bullet::setText(docstring const & t)
{
font = character = size = MIN;
user_text = 1;
@ -137,7 +139,7 @@ Bullet & Bullet::operator=(Bullet const & b)
}
string const & Bullet::getText() const
docstring const & Bullet::getText() const
{
if (user_text == 0) {
generateText();
@ -193,7 +195,7 @@ void Bullet::generateText() const
}
string const Bullet::bulletSize(int s)
docstring const Bullet::bulletSize(int s)
{
// use a parameter rather than hard code `size' in here
// in case some future function may want to retrieve
@ -205,11 +207,11 @@ string const Bullet::bulletSize(int s)
"\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"
};
return BulletSize[s];
return lyx::from_ascii(BulletSize[s]);
}
string const Bullet::bulletEntry(int f, int c)
docstring const Bullet::bulletEntry(int f, int c)
{
// Despite how this may at first appear the static local variables
// are only initialized once..
@ -350,7 +352,7 @@ string const Bullet::bulletEntry(int f, int c)
BulletPanel4, BulletPanel5
};
return BulletPanels[f][c];
return lyx::from_ascii(BulletPanels[f][c]);
}
void Bullet::testInvariant() const

View File

@ -13,7 +13,7 @@
#ifndef BULLET_H
#define BULLET_H
#include <string>
#include "support/docstring.h"
///
class Bullet {
@ -22,7 +22,7 @@ public:
Bullet(int f = -1, int c = -1, int s = -1);
///
explicit Bullet(std::string const &);
explicit Bullet(lyx::docstring const &);
///
void setCharacter(int);
@ -31,7 +31,7 @@ public:
///
void setSize(int);
///
void setText(std::string const &);
void setText(lyx::docstring const &);
///
int getCharacter() const;
///
@ -39,7 +39,7 @@ public:
///
int getSize() const;
///
std::string const & getText() const;
lyx::docstring const & getText() const;
///
Bullet & operator=(Bullet const &);
///
@ -70,9 +70,9 @@ private:
///
void generateText() const;
///
static std::string const bulletSize(int);
static lyx::docstring const bulletSize(int);
///
static std::string const bulletEntry(int, int);
static lyx::docstring const bulletEntry(int, int);
///
int font;
@ -97,7 +97,7 @@ private:
or one generated internally from the font, character
and size settings.
*/
mutable std::string text;
mutable lyx::docstring text;
};

View File

@ -28,6 +28,7 @@
#include <sstream>
using lyx::docstring;
using lyx::support::rtrim;
using std::istringstream;
@ -141,25 +142,25 @@ void ParagraphParameters::appendix(bool a)
}
string const & ParagraphParameters::labelString() const
docstring const & ParagraphParameters::labelString() const
{
return labelstring_;
}
void ParagraphParameters::labelString(string const & ls)
void ParagraphParameters::labelString(docstring const & ls)
{
labelstring_ = ls;
}
string const & ParagraphParameters::labelWidthString() const
docstring const & ParagraphParameters::labelWidthString() const
{
return labelwidthstring_;
}
void ParagraphParameters::labelWidthString(string const & lws)
void ParagraphParameters::labelWidthString(docstring const & lws)
{
labelwidthstring_ = lws;
}
@ -223,7 +224,7 @@ void ParagraphParameters::read(LyXLex & lex)
align(LyXAlignment(1 << tmpret));
} else if (token == "\\labelwidthstring") {
lex.eatLine();
labelWidthString(lex.getString());
labelWidthString(lex.getDocString());
} else {
lex.pushToken(token);
break;
@ -240,7 +241,7 @@ void ParagraphParameters::write(ostream & os) const
// The labelwidth string used in lists.
if (!labelWidthString().empty())
os << "\\labelwidthstring "
<< labelWidthString() << '\n';
<< lyx::to_utf8(labelWidthString()) << '\n';
// Start of appendix?
if (startOfAppendix())

View File

@ -19,6 +19,7 @@
#include "Spacing.h"
#include "support/types.h"
#include "support/docstring.h"
#include <iosfwd>
#include <string>
@ -66,13 +67,13 @@ public:
///
void appendix(bool);
///
std::string const & labelString() const;
lyx::docstring const & labelString() const;
///
void labelString(std::string const &);
void labelString(lyx::docstring const &);
///
std::string const & labelWidthString() const;
lyx::docstring const & labelWidthString() const;
///
void labelWidthString(std::string const &);
void labelWidthString(lyx::docstring const &);
///
LyXLength const & leftIndent() const;
///
@ -101,9 +102,9 @@ private:
///
depth_type depth_;
///
std::string labelstring_;
lyx::docstring labelstring_;
///
std::string labelwidthstring_;
lyx::docstring labelwidthstring_;
///
LyXLength leftindent_;
};

View File

@ -187,8 +187,7 @@ void TocBackend::update()
Paragraph const & par = *static_cast<InsetOptArg*>(it->inset)->paragraphs().begin();
if (!pit->getLabelstring().empty())
// FIXME UNICODE
tocstring = lyx::from_utf8(
pit->getLabelstring() + ' ');
tocstring = pit->getLabelstring() + ' ';
tocstring += par.asString(*buffer_, false);
break;
}

View File

@ -371,13 +371,14 @@ void setLabel(Buffer const & buf, ParIterator & it)
par.itemdepth = getItemDepth(it);
// erase what was there before
par.params().labelString(string());
par.params().labelString(docstring());
if (layout->margintype == MARGIN_MANUAL) {
if (par.params().labelWidthString().empty())
par.setLabelWidthString(layout->labelstring());
// FIXME UNICODE
par.setLabelWidthString(lyx::from_ascii(layout->labelstring()));
} else {
par.setLabelWidthString(string());
par.setLabelWidthString(docstring());
}
// is it a layout that has an automatic label?
@ -386,8 +387,10 @@ void setLabel(Buffer const & buf, ParIterator & it)
&& (layout->latextype != LATEX_ENVIRONMENT
|| isFirstInSequence(it.pit(), it.plist()))) {
counters.step(layout->counter);
string label = expandLabel(buf, layout,
par.params().appendix());
// FIXME UNICODE
docstring label =
lyx::from_ascii(expandLabel(buf, layout,
par.params().appendix()));
par.params().labelString(label);
}
} else if (layout->labeltype == LABEL_ITEMIZE) {
@ -396,19 +399,19 @@ void setLabel(Buffer const & buf, ParIterator & it)
// par.params().labelString(
// bufparams.user_defined_bullet(par.itemdepth).getText());
// for now, use a simple hardcoded label
string itemlabel;
docstring itemlabel;
switch (par.itemdepth) {
case 0:
itemlabel = "*";
itemlabel = lyx::char_type(0x2022);
break;
case 1:
itemlabel = "-";
itemlabel = lyx::char_type(0x2013);
break;
case 2:
itemlabel = "@";
itemlabel = lyx::char_type(0x2217);
break;
case 3:
itemlabel = "·";
itemlabel += lyx::char_type(0x2219); // or 0x00b7
break;
}
@ -462,14 +465,13 @@ void setLabel(Buffer const & buf, ParIterator & it)
}
// FIXME UNICODE
par.params().labelString(counters.counterLabel(lyx::to_utf8(buf.B_(format))));
par.params().labelString(lyx::from_utf8(counters.counterLabel(lyx::to_utf8(buf.B_(format)))));
} else if (layout->labeltype == LABEL_BIBLIO) {// ale970302
counters.step("bibitem");
int number = counters.value("bibitem");
if (par.bibitem())
par.bibitem()->setCounter(number);
// FIXME UNICODE
par.params().labelString(lyx::to_utf8(buf.B_(layout->labelstring())));
par.params().labelString(buf.B_(layout->labelstring()));
// In biblio should't be following counters but...
} else if (layout->labeltype == LABEL_SENSITIVE) {
// Search for the first float or wrap inset in the iterator
@ -492,20 +494,17 @@ void setLabel(Buffer const & buf, ParIterator & it)
counters.step(fl.type());
// Doesn't work... yet.
// FIXME UNICODE
s = bformat(_("%1$s #:"), buf.B_(fl.name()));
} else {
// par->SetLayout(0);
// FIXME UNICODE
s = buf.B_(layout->labelstring());
}
par.params().labelString(lyx::to_utf8(s));
par.params().labelString(s);
} else if (layout->labeltype == LABEL_NO_LABEL)
par.params().labelString(string());
par.params().labelString(docstring());
else
// FIXME UNICODE
par.params().labelString(lyx::to_utf8(buf.B_(layout->labelstring())));
par.params().labelString(buf.B_(layout->labelstring()));
}
} // anon namespace

View File

@ -694,8 +694,9 @@ void BufferParams::writeFile(ostream & os) const
<< user_defined_bullet(i).getSize() << "\n";
}
else {
// FIXME UNICODE
os << "\\bulletLaTeX " << i << " \""
<< user_defined_bullet(i).getText()
<< lyx::to_ascii(user_defined_bullet(i).getText())
<< "\"\n";
}
}
@ -1073,8 +1074,9 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
bullets_def += 'v';
break;
}
// FIXME UNICODE
bullets_def += '{' +
user_defined_bullet(i).getText()
lyx::to_ascii(user_defined_bullet(i).getText())
+ "}\n";
}
}
@ -1239,7 +1241,7 @@ void BufferParams::readBulletsLaTeX(LyXLex & lex)
if (!lex.next()) return;
int const index = lex.getInteger();
lex.next(true);
string const temp_str = lex.getString();
docstring const temp_str = lex.getDocString();
user_defined_bullet(index).setText(temp_str);
temp_bullet(index).setText(temp_str);

View File

@ -93,10 +93,10 @@ void GParagraph::doBuild()
void GParagraph::update()
{
// label width
string const labelwidth = controller().params().labelWidthString();
maxlabelwidthentry_->set_text(labelwidth);
docstring const labelwidth = controller().params().labelWidthString();
maxlabelwidthentry_->set_text(lyx::to_utf8(labelwidth));
maxlabelwidthentry_->set_sensitive(
labelwidth != lyx::to_utf8(_("Senseless with this layout!")));
labelwidth != _("Senseless with this layout!"));
// alignment
LyXAlignment const current_alignment = controller().params().align();
@ -175,8 +175,9 @@ void GParagraph::onSpacingChanged()
void GParagraph::onMaxLabelWidthChanged()
{
// FIXME UNICODE
controller().params().labelWidthString(
maxlabelwidthentry_->get_text());
lyx::from_utf8(Glib::locale_to_utf8(maxlabelwidthentry_->get_text())));
controller().dispatchParams();
}

View File

@ -351,7 +351,7 @@ void BulletsModule::setCustom()
return;
tmpbulletset = true;
tmpbullet.setText(fromqstr(text));
tmpbullet.setText(qstring_to_ucs4(text));
tmpbullet.setFont(-1);
}

View File

@ -104,7 +104,7 @@ void QParagraph::apply()
params.spacing(spacing);
// label width
params.labelWidthString(fromqstr(dialog_->labelWidth->text()));
params.labelWidthString(qstring_to_ucs4(dialog_->labelWidth->text()));
// indendation
params.noindent(!dialog_->indentCB->isChecked());
}
@ -115,11 +115,11 @@ void QParagraph::update_contents()
ParagraphParameters const & params = controller().params();
// label width
string const & labelwidth = params.labelWidthString();
docstring const & labelwidth = params.labelWidthString();
// lyx::to_utf8(_() is correct here (this is stupid though !))
if (labelwidth != lyx::to_utf8(_("Senseless with this layout!"))) {
if (labelwidth != _("Senseless with this layout!")) {
dialog_->labelwidthGB->setEnabled(true);
dialog_->labelWidth->setText(toqstr(labelwidth));
dialog_->labelWidth->setText(ucs4_to_qstring(labelwidth));
} else {
dialog_->labelwidthGB->setEnabled(false);
dialog_->labelWidth->setText("");

View File

@ -163,6 +163,25 @@ docstring const qstring_to_ucs4(QString const & str)
}
void ucs4_to_qstring(lyx::docstring const & str, QString & s)
{
size_t ls = str.size();
s = "";
s.reserve(ls);
for (size_t i = 0; i < ls; ++i)
s.append(ucs4_to_qchar(str[i]));
}
QString ucs4_to_qstring(lyx::docstring const & str)
{
QString tmp;
ucs4_to_qstring(str, tmp);
return tmp;
}
docstring const formatted(docstring const & text, int w)
{
docstring sout;

View File

@ -103,4 +103,8 @@ std::string const fromqstr(QString const & str);
*/
lyx::docstring const qstring_to_ucs4(QString const & str);
void ucs4_to_qstring(lyx::docstring const & str, QString & s);
QString ucs4_to_qstring(lyx::docstring const & str);
#endif // QTHELPERS_H

View File

@ -172,7 +172,7 @@ void BulletsModule::on_customLE_textEdited(const QString & text)
return;
bullets_[levelLW->currentRow()].setFont(current_font_);
bullets_[levelLW->currentRow()].setText(fromqstr(text));
bullets_[levelLW->currentRow()].setText(qstring_to_ucs4(text));
changed();
}

View File

@ -102,7 +102,7 @@ void QParagraph::apply()
params.spacing(spacing);
// label width
params.labelWidthString(fromqstr(dialog_->labelWidth->text()));
params.labelWidthString(qstring_to_ucs4(dialog_->labelWidth->text()));
// indendation
params.noindent(!dialog_->indentCB->isChecked());
}
@ -113,11 +113,11 @@ void QParagraph::update_contents()
ParagraphParameters const & params = controller().params();
// label width
string const & labelwidth = params.labelWidthString();
docstring const & labelwidth = params.labelWidthString();
// lyx::to_utf8(_() is correct here (this is stupid though !))
if (labelwidth != lyx::to_utf8(_("Senseless with this layout!"))) {
if (labelwidth != _("Senseless with this layout!")) {
dialog_->labelwidthGB->setEnabled(true);
dialog_->labelWidth->setText(toqstr(labelwidth));
dialog_->labelWidth->setText(ucs4_to_qstring(labelwidth));
} else {
dialog_->labelwidthGB->setEnabled(false);
dialog_->labelWidth->setText("");

View File

@ -141,6 +141,14 @@ void ucs4_to_qstring(lyx::docstring const & str, QString & s)
}
QString ucs4_to_qstring(lyx::docstring const & str)
{
QString tmp;
ucs4_to_qstring(str, tmp);
return tmp;
}
QString const toqstr(docstring const & ucs4)
{
QString s;

View File

@ -73,6 +73,8 @@ void ucs4_to_qstring(lyx::char_type const * str, size_t ls, QString & s);
void ucs4_to_qstring(lyx::docstring const & str, QString & s);
QString ucs4_to_qstring(lyx::docstring const & str);
lyx::docstring const qstring_to_ucs4(QString const & qstr);
void qstring_to_ucs4(QString const & qstr, std::vector<lyx::char_type> & ucs4);

View File

@ -147,9 +147,8 @@ TeXEnvironment(Buffer const & buf,
}
}
if (style->latextype == LATEX_LIST_ENVIRONMENT) {
// FIXME UNICODE
os << '{'
<< lyx::from_utf8(pit->params().labelWidthString())
<< pit->params().labelWidthString()
<< "}\n";
} else if (style->labeltype == LABEL_BIBLIO) {
// ale970405

View File

@ -174,9 +174,8 @@ void asciiParagraph(Buffer const & buf,
break;
default: {
// FIXME UNICODE
docstring const label =
lyx::from_utf8(par.params().labelString());
par.params().labelString();
os << label << ' ';
currlinelen += label.length() + 1;
break;

View File

@ -606,23 +606,23 @@ char Paragraph::getAlign() const
}
string const & Paragraph::getLabelstring() const
docstring const & Paragraph::getLabelstring() const
{
return params().labelString();
}
// the next two functions are for the manual labels
string const Paragraph::getLabelWidthString() const
docstring const Paragraph::getLabelWidthString() const
{
if (!params().labelWidthString().empty())
return params().labelWidthString();
else
return lyx::to_utf8(_("Senseless with this layout!"));
return _("Senseless with this layout!");
}
void Paragraph::setLabelWidthString(string const & s)
void Paragraph::setLabelWidthString(docstring const & s)
{
params().labelWidthString(s);
}
@ -631,7 +631,7 @@ void Paragraph::setLabelWidthString(string const & s)
void Paragraph::applyLayout(LyXLayout_ptr const & new_layout)
{
layout(new_layout);
params().labelWidthString(string());
params().labelWidthString(docstring());
params().align(LYX_ALIGN_LAYOUT);
params().spacing(Spacing(Spacing::Default));
}
@ -1402,8 +1402,7 @@ docstring const Paragraph::asString(Buffer const & buffer,
lyx::odocstringstream os;
if (beg == 0 && label && !params().labelString().empty())
// FIXME UNICODE
os << lyx::from_utf8(params().labelString()) << ' ';
os << params().labelString() << ' ';
for (pos_type i = beg; i < end; ++i) {
value_type const c = getUChar(buffer.params(), i);

View File

@ -224,12 +224,12 @@ public:
void setBeginOfBody();
///
std::string const & getLabelstring() const;
lyx::docstring const & getLabelstring() const;
/// the next two functions are for the manual labels
std::string const getLabelWidthString() const;
lyx::docstring const getLabelWidthString() const;
///
void setLabelWidthString(std::string const & s);
void setLabelWidthString(lyx::docstring const & s);
///
char getAlign() const;
/// The nesting depth of a paragraph

View File

@ -522,8 +522,7 @@ void RowPainter::paintFirst()
LyXFont const font = getLabelFont();
FontMetrics const & fm = theFontMetrics(font);
// FIXME UNICODE
docstring const str = lyx::from_utf8(par_.getLabelstring());
docstring const str = par_.getLabelstring();
if (!str.empty()) {
double x = x_;
@ -572,7 +571,7 @@ void RowPainter::paintFirst()
layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)) {
LyXFont font = getLabelFont();
if (!par_.getLabelstring().empty()) {
docstring const str = lyx::from_utf8(par_.getLabelstring());
docstring const str = par_.getLabelstring();
double spacing_val = 1.0;
if (!parparams.spacing().isDefault())
spacing_val = parparams.spacing().getValue();

View File

@ -537,7 +537,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
// FIXME UNICODE
docstring labin = lyx::from_utf8(layout->labelindent);
l_margin += labelfont_metrics.signedWidth(labin);
docstring labstr = lyx::from_utf8(par.getLabelstring());
docstring labstr = par.getLabelstring();
l_margin += labelfont_metrics.width(labstr);
docstring labsep = lyx::from_utf8(layout->labelsep);
l_margin += labelfont_metrics.width(labsep);
@ -551,7 +551,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
// The width of an empty par, even with manual label, should be 0
if (!par.empty() && pos >= par.beginOfBody()) {
if (!par.getLabelWidthString().empty()) {
docstring labstr = lyx::from_utf8(par.getLabelWidthString());
docstring labstr = par.getLabelWidthString();
l_margin += labelfont_metrics.width(labstr);
docstring labsep = lyx::from_utf8(layout->labelsep);
l_margin += labelfont_metrics.width(labsep);
@ -593,7 +593,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
LABEL_CENTERED_TOP_ENVIRONMENT) {
l_margin += labelfont_metrics.signedWidth(lyx::from_utf8(layout->labelindent));
l_margin += labelfont_metrics.width(lyx::from_utf8(layout->labelsep));
l_margin += labelfont_metrics.width(lyx::from_utf8(par.getLabelstring()));
l_margin += labelfont_metrics.width(par.getLabelstring());
}
break;
@ -880,14 +880,13 @@ int LyXText::labelFill(Paragraph const & par, Row const & row) const
for (pos_type i = row.pos(); i <= last; ++i)
w += singleWidth(par, i);
string const & label = par.params().labelWidthString();
docstring const & label = par.params().labelWidthString();
if (label.empty())
return 0;
FontMetrics const & fm = theFontMetrics(getLabelFont(par));
// FIXME UNICODE
return max(0, fm.width(lyx::from_utf8(label)) - w);
return max(0, fm.width(label) - w);
}

View File

@ -354,7 +354,8 @@ void LyXText::setLayout(pit_type start, pit_type end, string const & layout)
for (pit_type pit = start; pit != end; ++pit) {
pars_[pit].applyLayout(lyxlayout);
if (lyxlayout->margintype == MARGIN_MANUAL)
pars_[pit].setLabelWidthString(lyxlayout->labelstring());
// FIXME UNICODE
pars_[pit].setLabelWidthString(lyx::from_ascii(lyxlayout->labelstring()));
}
}
@ -637,7 +638,8 @@ void LyXText::setParagraph(LCursor & cur,
else
params.align(align);
}
par.setLabelWidthString(labelwidthstring);
// FIXME UNICODE
par.setLabelWidthString(lyx::from_ascii(labelwidthstring));
params.noindent(noindent);
}
}
@ -991,8 +993,11 @@ InsetBase * LyXText::editXY(LCursor & cur, int x, int y)
// This should be just before or just behind the
// cursor position set above.
BOOST_ASSERT((pos != 0 && inset == pars_[pit].getInset(pos - 1))
|| inset == pars_[pit].getInset(pos));
InsetBase * inset2 = pars_[pit].getInset(pos - 1);
InsetBase * inset3 = pars_[pit].getInset(pos);
BOOST_ASSERT((pos != 0 && inset == inset2)
|| inset == inset3);
// Make sure the cursor points to the position before
// this inset.
if (inset == pars_[pit].getInset(pos - 1))

View File

@ -652,7 +652,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
// indentation. Otherwise, do the same as LFUN_BREAK_PARAGRAPH.
lyx::cap::replaceSelection(cur);
if (cur.pos() == 0)
cur.paragraph().params().labelWidthString(string());
cur.paragraph().params().labelWidthString(docstring());
else
breakParagraph(cur, 0);
cur.resetAnchor();
@ -1446,11 +1446,12 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
lex.setStream(is);
ParagraphParameters params;
params.read(lex);
// FIXME UNICODE
setParagraph(cur,
params.spacing(),
params.align(),
params.labelWidthString(),
params.noindent());
params.spacing(),
params.align(),
lyx::to_ascii(params.labelWidthString()),
params.noindent());
cur.message(_("Paragraph layout set"));
break;
}