35
35
#include <QFontMetrics>
36
#include <QTextDocument>
36
37
#include <QTextInlineObject>
37
38
#include <QPainter>
40
/*********************************** ODF Bug Work-around code **********************************************/
41
const QString KoDeleteChangeMarker::RDFListName("http://www.koffice.org/list#");
42
const QString KoDeleteChangeMarker::RDFListItemName("http://www.koffice.org/list-item#");
43
const QString KoDeleteChangeMarker::RDFListValidity("http://www.kofficde.org/list-status#valid");
44
const QString KoDeleteChangeMarker::RDFListItemValidity("http://www.koffice.org/list-item-status#valid");
45
const QString KoDeleteChangeMarker::RDFListLevel("http://www.koffice.org/list-status#level");
46
const QString KoDeleteChangeMarker::RDFDeleteChangeContext("http://www.koffice.org/deleteChangeMetadata");
47
/***********************************************************************************************************/
39
49
class KoDeleteChangeMarker::Private
44
54
KoChangeTracker *changeTracker;
55
QTextDocument *document;
59
QString deleteChangeXml;
60
QHash<KoListStyle::ListIdType, KoListStyle *> deletedListStyles;
49
63
KoDeleteChangeMarker::KoDeleteChangeMarker(KoChangeTracker* changeTracker)
52
66
d->changeTracker = changeTracker;
55
70
KoDeleteChangeMarker::~KoDeleteChangeMarker()
86
111
void KoDeleteChangeMarker::paint(QPainter& painter, QPaintDevice *pd, const QTextDocument *document, const QRectF &rect, QTextInlineObject object, int posInDocument, const QTextCharFormat &format)
88
117
Q_UNUSED(posInDocument);
91
if (!d->changeTracker)
94
Q_ASSERT(format.isCharFormat());
96
if (d->changeTracker->isEnabled() && d->changeTracker->elementById(d->id)->isEnabled() && d->changeTracker->displayDeleted()) {
97
QFont font(format.font(), pd);
98
QTextLayout layout(d->changeTracker->elementById(d->id)->getDeleteData(), font, pd);
99
layout.setCacheEnabled(true);
100
QList<QTextLayout::FormatRange> layouts;
101
QTextLayout::FormatRange range;
103
range.length = d->changeTracker->elementById(d->id)->getDeleteData().length();
104
range.format = format;
105
range.format.setBackground(QBrush(Qt::red));
106
layouts.append(range);
107
layout.setAdditionalFormats(layouts);
109
QTextOption option(Qt::AlignLeft | Qt::AlignAbsolute);
110
option.setTextDirection(object.textDirection());
111
layout.setTextOption(option);
112
layout.beginLayout();
115
layout.draw(&painter, rect.topLeft());
119
122
void KoDeleteChangeMarker::resize(const QTextDocument *document, QTextInlineObject object, int posInDocument, const QTextCharFormat &format, QPaintDevice *pd)
121
Q_UNUSED(posInDocument);
124
if (!d->changeTracker)
127
Q_ASSERT(format.isCharFormat());
128
QFontMetricsF fm(format.font(), pd);
130
if (d->changeTracker->isEnabled() && d->changeTracker->elementById(d->id)->isEnabled() && d->changeTracker->displayDeleted()) {
131
object.setWidth(fm.width(d->changeTracker->elementById(d->id)->getDeleteData()));
132
object.setAscent(fm.ascent());
133
object.setDescent(fm.descent());
136
object.setAscent(fm.ascent());
137
object.setDescent(fm.descent());
130
d->position = posInDocument;
141
134
void KoDeleteChangeMarker::updatePosition(const QTextDocument *document, QTextInlineObject object, int posInDocument, const QTextCharFormat &format)
136
d->position = posInDocument;
137
if (document != d->document)
138
d->document = const_cast<QTextDocument*>(document); //TODO: when we get rid of the current visualisation of deleted changes (ie inserting them in the doc), we can get rid of this.
144
140
Q_UNUSED(object);
145
Q_UNUSED(posInDocument);
146
141
Q_UNUSED(format);
144
QTextDocument* KoDeleteChangeMarker::document() const
149
149
void KoDeleteChangeMarker::saveOdf(KoShapeSavingContext &context)
151
151
KoGenChange change;
152
152
QString changeName;
153
KoTextSharedSavingData *sharedData;
153
KoTextSharedSavingData *sharedData = 0;
154
154
if (context.sharedData(KOTEXT_SHARED_SAVING_ID)) {
155
155
sharedData = dynamic_cast<KoTextSharedSavingData*>(context.sharedData(KOTEXT_SHARED_SAVING_ID));
156
156
if (!sharedData) {
161
161
d->changeTracker->saveInlineChange(d->id, change);
162
change.addChildElement("deleteChangeXml", d->deleteChangeXml);
162
163
changeName = sharedData->genChanges().insert(change);
164
165
context.xmlWriter().startElement("text:change", false);
165
166
context.xmlWriter().addAttribute("text:change-id", changeName);
166
167
context.xmlWriter().endElement();
170
void KoDeleteChangeMarker::setDeletedListStyle(KoListStyle::ListIdType id, KoListStyle *style)
172
d->deletedListStyles.insert(id, style);
175
KoListStyle *KoDeleteChangeMarker::getDeletedListStyle(KoListStyle::ListIdType id)
177
return d->deletedListStyles.value(id);