~ubuntu-branches/ubuntu/precise/koffice/precise

« back to all changes in this revision

Viewing changes to libs/kotext/changetracker/KoDeleteChangeMarker.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2010-09-21 15:36:35 UTC
  • mfrom: (1.4.1 upstream) (60.2.11 maverick)
  • Revision ID: james.westby@ubuntu.com-20100921153635-6tejqkiro2u21ydi
Tags: 1:2.2.2-0ubuntu3
Add kubuntu_03_fix-crash-on-closing-sqlite-connection-2.2.2.diff and
kubuntu_04_support-large-memo-values-for-msaccess-2.2.2.diff as
recommended by upstream http://kexi-
project.org/wiki/wikiview/index.php@Kexi2.2_Patches.html#sqlite_stab
ility

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
 
34
34
//Qt includes
35
35
#include <QFontMetrics>
 
36
#include <QTextDocument>
36
37
#include <QTextInlineObject>
37
38
#include <QPainter>
38
39
 
 
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
/***********************************************************************************************************/
 
48
 
39
49
class KoDeleteChangeMarker::Private
40
50
{
41
51
public:
42
52
    Private() {}
43
53
 
44
54
    KoChangeTracker *changeTracker;
 
55
    QTextDocument *document;
45
56
    QString text;
46
57
    int id;
 
58
    int position;
 
59
    QString deleteChangeXml;
 
60
    QHash<KoListStyle::ListIdType, KoListStyle *> deletedListStyles;
47
61
};
48
62
 
49
63
KoDeleteChangeMarker::KoDeleteChangeMarker(KoChangeTracker* changeTracker)
50
64
        : d(new Private())
51
65
{
52
66
    d->changeTracker = changeTracker;
 
67
    d->document = 0;
53
68
}
54
69
 
55
70
KoDeleteChangeMarker::~KoDeleteChangeMarker()
77
92
    return d->id;
78
93
}
79
94
 
 
95
int KoDeleteChangeMarker::position() const
 
96
{
 
97
    return d->position;
 
98
}
 
99
 
 
100
void KoDeleteChangeMarker::setDeleteChangeXml(QString &deleteChangeXml)
 
101
{
 
102
    d->deleteChangeXml = deleteChangeXml;
 
103
}
 
104
 
80
105
bool KoDeleteChangeMarker::loadOdf(const KoXmlElement &element)
81
106
{
82
107
    Q_UNUSED(element)
85
110
 
86
111
void KoDeleteChangeMarker::paint(QPainter& painter, QPaintDevice *pd, const QTextDocument *document, const QRectF &rect, QTextInlineObject object, int posInDocument, const QTextCharFormat &format)
87
112
{
 
113
    Q_UNUSED(painter);
 
114
    Q_UNUSED(pd);
 
115
    Q_UNUSED(document);
 
116
    Q_UNUSED(rect);
88
117
    Q_UNUSED(posInDocument);
89
 
    Q_UNUSED(document);
90
 
 
91
 
    if (!d->changeTracker)
92
 
        return;
93
 
 
94
 
    Q_ASSERT(format.isCharFormat());
95
 
 
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;
102
 
        range.start = 0;
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);
108
 
 
109
 
        QTextOption option(Qt::AlignLeft | Qt::AlignAbsolute);
110
 
        option.setTextDirection(object.textDirection());
111
 
        layout.setTextOption(option);
112
 
        layout.beginLayout();
113
 
        layout.createLine();
114
 
        layout.endLayout();
115
 
        layout.draw(&painter, rect.topLeft());
116
 
    }
 
118
    Q_UNUSED(object);
 
119
    Q_UNUSED(format);
117
120
}
118
121
 
119
122
void KoDeleteChangeMarker::resize(const QTextDocument *document, QTextInlineObject object, int posInDocument, const QTextCharFormat &format, QPaintDevice *pd)
120
123
{
121
 
    Q_UNUSED(posInDocument);
122
 
    Q_UNUSED(document);
123
 
 
124
 
    if (!d->changeTracker)
125
 
        return;
126
 
 
127
 
    Q_ASSERT(format.isCharFormat());
128
 
    QFontMetricsF fm(format.font(), pd);
129
 
 
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());
134
 
    } else {
135
 
        object.setWidth(0);
136
 
        object.setAscent(fm.ascent());
137
 
        object.setDescent(fm.descent());
138
 
    }
 
124
    Q_UNUSED(document);
 
125
    Q_UNUSED(object);
 
126
    Q_UNUSED(format);
 
127
    Q_UNUSED(pd);
 
128
    Q_UNUSED(document);
 
129
 
 
130
    d->position = posInDocument;
 
131
    object.setWidth(0);
139
132
}
140
133
 
141
134
void KoDeleteChangeMarker::updatePosition(const QTextDocument *document, QTextInlineObject object, int posInDocument, const QTextCharFormat &format)
142
135
{
143
 
    Q_UNUSED(document);
 
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.
 
139
 
144
140
    Q_UNUSED(object);
145
 
    Q_UNUSED(posInDocument);
146
141
    Q_UNUSED(format);
147
142
}
148
143
 
 
144
QTextDocument* KoDeleteChangeMarker::document() const
 
145
{
 
146
    return d->document;
 
147
}
 
148
 
149
149
void KoDeleteChangeMarker::saveOdf(KoShapeSavingContext &context)
150
150
{
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) {
159
159
        }
160
160
    }
161
161
    d->changeTracker->saveInlineChange(d->id, change);
 
162
    change.addChildElement("deleteChangeXml", d->deleteChangeXml);
162
163
    changeName = sharedData->genChanges().insert(change);
163
164
 
164
165
    context.xmlWriter().startElement("text:change", false);
165
166
    context.xmlWriter().addAttribute("text:change-id", changeName);
166
167
    context.xmlWriter().endElement();
167
168
}
 
169
 
 
170
void KoDeleteChangeMarker::setDeletedListStyle(KoListStyle::ListIdType id, KoListStyle *style)
 
171
{
 
172
    d->deletedListStyles.insert(id, style);
 
173
}
 
174
 
 
175
KoListStyle *KoDeleteChangeMarker::getDeletedListStyle(KoListStyle::ListIdType id)
 
176
{
 
177
    return d->deletedListStyles.value(id);
 
178
}
 
179