[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/libs/kotext
From: Thomas Zander <zander () kde ! org>
Date: 2007-01-31 21:50:06
Message-ID: 1170280206.092662.6154.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 628901 by zander:
Also make a paragraph-based visitor pattern for indent and alignment props
M +78 -18 KoTextSelectionHandler.cpp
--- trunk/koffice/libs/kotext/KoTextSelectionHandler.cpp #628900:628901
@@ -39,10 +39,9 @@
virtual void visit(QTextCharFormat &format) const = 0;
- static void visitSelection(QTextCursor *caret, const CharFormatVisiter &visiter) \
{ + static void visitSelection(QTextCursor *caret, const CharFormatVisiter \
&visitor) { int start = caret->position();
int end = caret->anchor();
- caret->setPosition(start);
if(start > end) { // swap
int tmp = start;
start = end;
@@ -50,7 +49,7 @@
}
else if(start == end) { // just set a new one.
QTextCharFormat format = caret->charFormat();
- visiter.visit(format);
+ visitor.visit(format);
caret->setCharFormat(format);
return;
}
@@ -74,7 +73,7 @@
QTextCursor cursor(block);
cursor.setPosition(fragment.position() +1);
QTextCharFormat format = cursor.charFormat(); // this gets the \
format one char before the postion.
- visiter.visit(format);
+ visitor.visit(format);
cursor.setPosition(qMax(start, fragment.position()));
int to = qMin(end, fragment.position() + fragment.length()) -1;
@@ -88,6 +87,37 @@
}
};
+class BlockFormatVisiter {
+public:
+ BlockFormatVisiter() {}
+ virtual ~BlockFormatVisiter() {}
+
+ virtual void visit(QTextBlockFormat &format) const = 0;
+
+ static void visitSelection(QTextCursor *caret, const BlockFormatVisiter \
&visitor) { + int start = caret->position();
+ int end = caret->anchor();
+ if(start > end) { // swap
+ int tmp = start;
+ start = end;
+ end = tmp;
+ }
+
+ QTextBlock block = caret->block();
+ if(block.position() > start)
+ block = block.document()->findBlock(start);
+
+ // now loop over all blocks that the selection contains and alter the text \
fragments where applicable. + while(block.isValid() && block.position() < end) \
{ + QTextBlockFormat format = block.blockFormat();
+ visitor.visit(format);
+ QTextCursor cursor(block);
+ cursor.setBlockFormat(format);
+ block = block.next();
+ }
+ }
+};
+
KoTextSelectionHandler::KoTextSelectionHandler(QObject *parent)
: KoToolSelection(parent),
m_textShape(0),
@@ -183,34 +213,64 @@
}
void KoTextSelectionHandler::setHorizontalTextAlignment(Qt::Alignment align) {
- QTextBlockFormat format = m_caret->blockFormat();
- format.setAlignment(align);
- m_caret->setBlockFormat(format);
+ Q_ASSERT(m_caret);
+ class Aligner : public BlockFormatVisiter {
+ public:
+ Aligner(Qt::Alignment align) : alignment(align) {}
+ void visit(QTextBlockFormat &format) const {
+ format.setAlignment(alignment);
+ }
+ Qt::Alignment alignment;
+ };
+ Aligner aligner(align);
+ BlockFormatVisiter::visitSelection(m_caret, aligner);
}
void KoTextSelectionHandler::setVerticalTextAlignment(Qt::Alignment align) {
- QTextCharFormat format = m_caret->charFormat();
+ Q_ASSERT(m_caret);
+ class Aligner : public CharFormatVisiter {
+ public:
+ Aligner(QTextCharFormat::VerticalAlignment align) : alignment(align) {}
+ void visit(QTextCharFormat &format) const {
+ format.setVerticalAlignment(alignment);
+ }
+ QTextCharFormat::VerticalAlignment alignment;
+ };
+
QTextCharFormat::VerticalAlignment charAlign = QTextCharFormat::AlignNormal;
if(align == Qt::AlignTop)
charAlign = QTextCharFormat::AlignSuperScript;
else if(align == Qt::AlignBottom)
charAlign = QTextCharFormat::AlignSubScript;
- format.setVerticalAlignment(charAlign);
- m_caret->mergeCharFormat(format);
+
+ Aligner aligner(charAlign);
+ CharFormatVisiter::visitSelection(m_caret, aligner);
}
void KoTextSelectionHandler::increaseIndent() {
- QTextBlockFormat format = m_caret->blockFormat();
- // TODO make the 10 configurable.
- format.setLeftMargin(format.leftMargin() + 10);
- m_caret->setBlockFormat(format);
+ class Indenter : public BlockFormatVisiter {
+ public:
+ void visit(QTextBlockFormat &format) const {
+ // TODO make the 10 configurable.
+ format.setLeftMargin(format.leftMargin() + 10);
+ }
+ Qt::Alignment alignment;
+ };
+ Indenter indenter;
+ BlockFormatVisiter::visitSelection(m_caret, indenter);
}
void KoTextSelectionHandler::decreaseIndent() {
- QTextBlockFormat format = m_caret->blockFormat();
- // TODO make the 10 configurable.
- format.setLeftMargin(qMax(0., format.leftMargin() - 10));
- m_caret->setBlockFormat(format);
+ class Indenter : public BlockFormatVisiter {
+ public:
+ void visit(QTextBlockFormat &format) const {
+ // TODO make the 10 configurable.
+ format.setLeftMargin(qMax(0.0, format.leftMargin() - 10));
+ }
+ Qt::Alignment alignment;
+ };
+ Indenter indenter;
+ BlockFormatVisiter::visitSelection(m_caret, indenter);
}
void KoTextSelectionHandler::setTextColor(const QColor &color) {
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic