Qt 4.8
qtextlist.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 
43 #include "qtextlist.h"
44 #include "qtextobject_p.h"
45 #include "qtextcursor.h"
46 #include "qtextdocument_p.h"
47 #include <qdebug.h>
48 
50 
52 {
53 public:
56  {
57  }
58 };
59 
125  : QTextBlockGroup(*new QTextListPrivate(doc), doc)
126 {
127 }
128 
133 {
134 }
135 
139 int QTextList::count() const
140 {
141  Q_D(const QTextList);
142  return d->blocks.count();
143 }
144 
151 {
152  Q_D(const QTextList);
153  if (i < 0 || i >= d->blocks.size())
154  return QTextBlock();
155  return d->blocks.at(i);
156 }
157 
185 int QTextList::itemNumber(const QTextBlock &blockIt) const
186 {
187  Q_D(const QTextList);
188  return d->blocks.indexOf(blockIt);
189 }
190 
200 {
201  Q_D(const QTextList);
202  int item = d->blocks.indexOf(blockIt) + 1;
203  if (item <= 0)
204  return QString();
205 
206  QTextBlock block = d->blocks.at(item-1);
207  QTextBlockFormat blockFormat = block.blockFormat();
208 
209  QString result;
210 
211  const int style = format().style();
212  QString numberPrefix;
213  QString numberSuffix = QLatin1String(".");
214 
215  if (format().hasProperty(QTextFormat::ListNumberPrefix))
216  numberPrefix = format().numberPrefix();
217  if (format().hasProperty(QTextFormat::ListNumberSuffix))
218  numberSuffix = format().numberSuffix();
219 
220  switch (style) {
222  result = QString::number(item);
223  break;
224  // from the old richtext
227  {
228  const char baseChar = style == QTextListFormat::ListUpperAlpha ? 'A' : 'a';
229 
230  int c = item;
231  while (c > 0) {
232  c--;
233  result.prepend(QChar(baseChar + (c % 26)));
234  c /= 26;
235  }
236  }
237  break;
240  {
241  if (item < 5000) {
242  QByteArray romanNumeral;
243 
244  // works for up to 4999 items
245  static const char romanSymbolsLower[] = "iiivixxxlxcccdcmmmm";
246  static const char romanSymbolsUpper[] = "IIIVIXXXLXCCCDCMMMM";
247  QByteArray romanSymbols; // wrap to have "mid"
248  if (style == QTextListFormat::ListLowerRoman)
249  romanSymbols = QByteArray::fromRawData(romanSymbolsLower, sizeof(romanSymbolsLower));
250  else
251  romanSymbols = QByteArray::fromRawData(romanSymbolsUpper, sizeof(romanSymbolsUpper));
252 
253  int c[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000 };
254  int n = item;
255  for (int i = 12; i >= 0; n %= c[i], i--) {
256  int q = n / c[i];
257  if (q > 0) {
258  int startDigit = i + (i+3)/4;
259  int numDigits;
260  if (i % 4) {
261  // c[i] == 4|5|9|40|50|90|400|500|900
262  if ((i-2) % 4) {
263  // c[i] == 4|9|40|90|400|900 => with subtraction (IV, IX, XL, XC, ...)
264  numDigits = 2;
265  }
266  else {
267  // c[i] == 5|50|500 (V, L, D)
268  numDigits = 1;
269  }
270  }
271  else {
272  // c[i] == 1|10|100|1000 (I, II, III, X, XX, ...)
273  numDigits = q;
274  }
275 
276  romanNumeral.append(romanSymbols.mid(startDigit, numDigits));
277  }
278  }
279  result = QString::fromLatin1(romanNumeral);
280  }
281  else {
282  result = QLatin1String("?");
283  }
284 
285  }
286  break;
287  default:
288  Q_ASSERT(false);
289  }
290  if (blockIt.textDirection() == Qt::RightToLeft)
291  return numberSuffix + result + numberPrefix;
292  else
293  return numberPrefix + result + numberSuffix;
294 }
295 
304 {
305  Q_D(QTextList);
306  if (i < 0 || i >= d->blocks.size())
307  return;
308 
309  QTextBlock block = d->blocks.at(i);
310  remove(block);
311 }
312 
313 
319 void QTextList::remove(const QTextBlock &block)
320 {
321  QTextBlockFormat fmt = block.blockFormat();
322  fmt.setIndent(fmt.indent() + format().indent());
323  fmt.setObjectIndex(-1);
324  block.docHandle()->setBlockFormat(block, block, fmt, QTextDocumentPrivate::SetFormat);
325 }
326 
332 void QTextList::add(const QTextBlock &block)
333 {
334  QTextBlockFormat fmt = block.blockFormat();
336  block.docHandle()->setBlockFormat(block, block, fmt, QTextDocumentPrivate::SetFormat);
337 }
338 
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: qstring.cpp:6448
double d
Definition: qnumeric_p.h:62
unsigned char c[8]
Definition: qnumeric_p.h:62
#define QT_END_NAMESPACE
This macro expands to.
Definition: qglobal.h:90
int count() const
Returns the number of items in the list.
Definition: qtextlist.cpp:139
QByteArray & append(char c)
Appends the character ch to this byte array.
The QByteArray class provides an array of bytes.
Definition: qbytearray.h:135
QString & prepend(QChar c)
Definition: qstring.h:261
QTextListPrivate(QTextDocument *doc)
Definition: qtextlist.cpp:54
QLatin1String(DBUS_INTERFACE_DBUS))) Q_GLOBAL_STATIC_WITH_ARGS(QString
void setBlockFormat(const QTextBlock &from, const QTextBlock &to, const QTextBlockFormat &newFormat, FormatChangeMode mode=SetFormat)
The QString class provides a Unicode character string.
Definition: qstring.h:83
int indent() const
Returns the paragraph&#39;s indent.
Definition: qtextformat.h:590
#define Q_ASSERT(cond)
Definition: qglobal.h:1823
#define Q_D(Class)
Definition: qglobal.h:2482
The QChar class provides a 16-bit Unicode character.
Definition: qchar.h:72
#define QT_BEGIN_NAMESPACE
This macro expands to.
Definition: qglobal.h:89
Style style() const
Returns the list format&#39;s style.
Definition: qtextformat.h:662
int objectIndex() const
Returns the object index of this object.
QTextList(QTextDocument *doc)
Definition: qtextlist.cpp:124
QString numberSuffix() const
Returns the list format&#39;s number suffix.
Definition: qtextformat.h:674
static int numDigits(qlonglong n)
Definition: qvalidator.cpp:385
static QByteArray fromRawData(const char *, int size)
Constructs a QByteArray that uses the first size bytes of the data array.
The QTextBlock class provides a container for text fragments in a QTextDocument.
Definition: qtextobject.h:199
QString itemText(const QTextBlock &) const
Returns the text of the list item that corresponds to the given block.
Definition: qtextlist.cpp:199
int itemNumber(const QTextBlock &) const
Returns the index of the list item that corresponds to the given block.
Definition: qtextlist.cpp:185
QByteArray mid(int index, int len=-1) const
Returns a byte array containing len bytes from this byte array, starting at position pos...
void remove(const QTextBlock &)
Removes the given block from the list.
Definition: qtextlist.cpp:319
QString numberPrefix() const
Returns the list format&#39;s number prefix.
Definition: qtextformat.h:670
The QTextBlockGroup class provides a container for text blocks within a QTextDocument.
Definition: qtextobject.h:94
static QString fromLatin1(const char *, int size=-1)
Returns a QString initialized with the first size characters of the Latin-1 string str...
Definition: qstring.cpp:4188
The QTextBlockFormat class provides formatting information for blocks of text in a QTextDocument...
Definition: qtextformat.h:545
void add(const QTextBlock &block)
Makes the given block part of the list.
Definition: qtextlist.cpp:332
void setIndent(int indent)
Sets the paragraph&#39;s indentation.
Definition: qtextformat.h:622
Qt::LayoutDirection textDirection() const
Returns the resolved text direction.
The QTextDocument class holds formatted text that can be viewed and edited using a QTextEdit...
The QTextList class provides a decorated list of items in a QTextDocument.
Definition: qtextlist.h:57
QTextDocumentPrivate * docHandle() const
Definition: qtextobject.h:283
void setObjectIndex(int object)
Sets the format object&#39;s object index.
int indent() const
Returns the list format&#39;s indentation.
Definition: qtextformat.h:666
QTextBlockFormat blockFormat() const
Returns the QTextBlockFormat that describes block-specific properties.
QTextBlock item(int i) const
Returns the {i}-th text block in the list.
Definition: qtextlist.cpp:150
void removeItem(int i)
Removes the item at item position i from the list.
Definition: qtextlist.cpp:303
QTextListFormat format() const
Returns the list&#39;s format.
Definition: qtextlist.h:80