Kate
kateedit.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "kateedit.h"
00020 #include "katedocument.h"
00021
00022 KateEditInfo::KateEditInfo(Kate::EditSource source, const KTextEditor::Range& oldRange, const QStringList& oldText, const KTextEditor::Range& newRange, const QStringList& newText)
00023 : m_editSource(source)
00024 , m_oldRange(oldRange)
00025 , m_oldText(oldText)
00026 , m_newRange(newRange)
00027 , m_newText(newText)
00028 , m_revisionTokenCounter(0)
00029 {
00030 m_translate = (m_newRange.end() - m_newRange.start()) - (m_oldRange.end() - m_oldRange.start());
00031 }
00032
00033 KateEditInfo::~KateEditInfo()
00034 {
00035 }
00036
00037 Kate::EditSource KateEditInfo::editSource() const
00038 {
00039 return m_editSource;
00040 }
00041
00042 const KTextEditor::Range & KateEditInfo::oldRange( ) const
00043 {
00044 return m_oldRange;
00045 }
00046
00047 QStringList KateEditInfo::oldText( const KTextEditor::Range & range ) const
00048 {
00049 QStringList ret;
00050 for (int i = range.start().line(); i <= range.end().line(); ++i) {
00051 QString original = m_oldText[range.start().line() - m_oldRange.start().line()];
00052
00053 int startCol = 0, length = -1;
00054 if (range.start().line() == m_oldRange.start().line())
00055 startCol = range.start().column() - m_oldRange.start().column();
00056 if (range.end().line() == m_oldRange.end().line())
00057 length = range.end().column() - startCol;
00058
00059 ret << original.mid(startCol, length);
00060 }
00061 return ret;
00062 }
00063
00064 const QStringList & KateEditInfo::oldText( ) const
00065 {
00066 return m_oldText;
00067 }
00068
00069 const KTextEditor::Range & KateEditInfo::newRange( ) const
00070 {
00071 return m_newRange;
00072 }
00073
00074 QStringList KateEditInfo::newText( const KTextEditor::Range & range ) const
00075 {
00076 QStringList ret;
00077 for (int i = range.start().line(); i <= range.end().line(); ++i) {
00078 QString original = m_newText[range.start().line() - m_newRange.start().line()];
00079
00080 int startCol = 0, length = -1;
00081 if (range.start().line() == m_newRange.start().line())
00082 startCol = range.start().column() - m_oldRange.start().column();
00083 if (range.end().line() == m_newRange.end().line())
00084 length = range.end().column() - startCol;
00085
00086 ret << original.mid(startCol, length);
00087 }
00088 return ret;
00089 }
00090
00091 bool KateEditInfo::isReferenced() const
00092 {
00093 return m_revisionTokenCounter;
00094 }
00095
00096 void KateEditInfo::dereferenceRevision()
00097 {
00098 --m_revisionTokenCounter;
00099 }
00100
00101 void KateEditInfo::referenceRevision()
00102 {
00103 ++m_revisionTokenCounter;
00104 }
00105
00106 const QStringList & KateEditInfo::newText() const
00107 {
00108 return m_newText;
00109 }
00110
00111 bool KateEditInfo::isRemoval() const
00112 {
00113 return !m_oldRange.isEmpty() && m_newRange.isEmpty();
00114 }
00115
00116 KateEditHistory::KateEditHistory( KateDocument * doc )
00117 : QObject(doc)
00118 , m_revision(0)
00119 {
00120 }
00121
00122 KateEditHistory::~KateEditHistory()
00123 {
00124 }
00125
00126 int KateEditHistory::revision()
00127 {
00128 if (!m_edits.isEmpty()) {
00129 KateEditInfo* edit = m_edits.last();
00130 if (!edit->isReferenced())
00131 m_revisions.insert(++m_revision, edit);
00132
00133 edit->referenceRevision();
00134 return m_revision;
00135 }
00136
00137 return 0;
00138 }
00139
00140 void KateEditHistory::releaseRevision(int revision)
00141 {
00142 if (m_revisions.contains(revision)) {
00143 KateEditInfo* edit = m_revisions[revision];
00144 edit->dereferenceRevision();
00145 if (!edit->isReferenced())
00146 m_revisions.remove(revision);
00147 return;
00148 }
00149
00150 kWarning() << "Unknown revision token " << revision;
00151 }
00152
00153 QList<KateEditInfo*> KateEditHistory::editsBetweenRevisions(int from, int to) const
00154 {
00155 QList<KateEditInfo*> ret;
00156
00157 if (from == -1)
00158 return ret;
00159
00160 if (m_edits.isEmpty())
00161 return ret;
00162
00163 if (to != -1) {
00164 Q_ASSERT(from <= to);
00165 Q_ASSERT(m_revisions.contains(to));
00166 }
00167
00168 int fromIndex = 0;
00169 if (from != 0) {
00170 Q_ASSERT(m_revisions.contains(from));
00171 KateEditInfo* fromEdit = m_revisions[from];
00172 Q_ASSERT(fromEdit);
00173
00174 fromIndex = m_edits.indexOf(fromEdit);
00175 if(fromIndex != -1) {
00176
00177 ++fromIndex;
00178 }
00179 }
00180
00181 KateEditInfo* toEdit = to == -1 ? m_edits.last() : m_revisions[to];
00182 Q_ASSERT(toEdit);
00183
00184 int toIndex = m_edits.indexOf(toEdit);
00185 Q_ASSERT(fromIndex != -1);
00186 Q_ASSERT(toIndex != -1);
00187
00188 for (int i = fromIndex; i <= toIndex; ++i)
00189 ret.append(m_edits.at(i));
00190
00191 return ret;
00192 }
00193
00194 #include "kateedit.moc"