• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • applications API Reference
  • KDE Home
  • Contact Us
 

Kate

  • kde-4.14
  • applications
  • kate
  • part
  • undo
kateundo.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2  Copyright (C) 2011 Dominik Haumann <dhaumann@kde.org>
3  Copyright (C) 2009-2010 Bernhard Beschow <bbeschow@cs.tu-berlin.de>
4  Copyright (C) 2002 John Firebaugh <jfirebaugh@kde.org>
5  Copyright (C) 2001 Christoph Cullmann <cullmann@kde.org>
6  Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
7 
8  This library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU Library General Public
10  License version 2 as published by the Free Software Foundation.
11 
12  This library is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  Library General Public License for more details.
16 
17  You should have received a copy of the GNU Library General Public License
18  along with this library; see the file COPYING.LIB. If not, write to
19  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  Boston, MA 02110-1301, USA.
21 */
22 
23 #include "kateundo.h"
24 
25 #include "kateundomanager.h"
26 #include "katedocument.h"
27 
28 #include <ktexteditor/cursor.h>
29 #include <ktexteditor/view.h>
30 
31 KateUndo::KateUndo (KateDocument *document)
32 : m_document (document)
33 , m_lineModFlags(0x00)
34 {
35 }
36 
37 KateUndo::~KateUndo ()
38 {
39 }
40 
41 KateEditInsertTextUndo::KateEditInsertTextUndo (KateDocument *document, int line, int col, const QString &text)
42  : KateUndo (document)
43  , m_line (line)
44  , m_col (col)
45  , m_text (text)
46 {
47 }
48 
49 KateEditRemoveTextUndo::KateEditRemoveTextUndo (KateDocument *document, int line, int col, const QString &text)
50  : KateUndo (document)
51  , m_line (line)
52  , m_col (col)
53  , m_text (text)
54 {
55 }
56 
57 KateEditWrapLineUndo::KateEditWrapLineUndo (KateDocument *document, int line, int col, int len, bool newLine)
58  : KateUndo (document)
59  , m_line (line)
60  , m_col (col)
61  , m_len (len)
62  , m_newLine (newLine)
63 {
64 }
65 
66 KateEditUnWrapLineUndo::KateEditUnWrapLineUndo (KateDocument *document, int line, int col, int len, bool removeLine)
67  : KateUndo (document)
68  , m_line (line)
69  , m_col (col)
70  , m_len (len)
71  , m_removeLine (removeLine)
72 {
73 }
74 
75 KateEditInsertLineUndo::KateEditInsertLineUndo (KateDocument *document, int line, const QString &text)
76  : KateUndo (document)
77  , m_line (line)
78  , m_text (text)
79 {
80 }
81 
82 KateEditRemoveLineUndo::KateEditRemoveLineUndo (KateDocument *document, int line, const QString &text)
83  : KateUndo (document)
84  , m_line (line)
85  , m_text (text)
86 {
87 }
88 
89 
90 bool KateUndo::isEmpty() const
91 {
92  return false;
93 }
94 
95 bool KateEditInsertTextUndo::isEmpty() const
96 {
97  return len() == 0;
98 }
99 
100 bool KateEditRemoveTextUndo::isEmpty() const
101 {
102  return len() == 0;
103 }
104 
105 bool KateUndo::mergeWith (const KateUndo* /*undo*/)
106 {
107  return false;
108 }
109 
110 bool KateEditInsertTextUndo::mergeWith (const KateUndo* undo)
111 {
112  const KateEditInsertTextUndo *u = dynamic_cast<const KateEditInsertTextUndo *> (undo);
113  if (u != 0
114  && m_line == u->m_line
115  && (m_col + len()) == u->m_col)
116  {
117  m_text += u->m_text;
118  return true;
119  }
120 
121  return false;
122 }
123 
124 bool KateEditRemoveTextUndo::mergeWith (const KateUndo* undo)
125 {
126  const KateEditRemoveTextUndo *u = dynamic_cast<const KateEditRemoveTextUndo *> (undo);
127 
128  if (u != 0
129  && m_line == u->m_line
130  && m_col == (u->m_col + u->len()))
131  {
132  m_text.prepend(u->m_text);
133  m_col = u->m_col;
134  return true;
135  }
136 
137  return false;
138 }
139 
140 void KateEditInsertTextUndo::undo ()
141 {
142  KateDocument *doc = document();
143 
144  doc->editRemoveText (m_line, m_col, len());
145 }
146 
147 void KateEditRemoveTextUndo::undo ()
148 {
149  KateDocument *doc = document();
150 
151  doc->editInsertText (m_line, m_col, m_text);
152 }
153 
154 void KateEditWrapLineUndo::undo ()
155 {
156  KateDocument *doc = document();
157 
158  doc->editUnWrapLine (m_line, m_newLine, m_len);
159 }
160 
161 void KateEditUnWrapLineUndo::undo ()
162 {
163  KateDocument *doc = document();
164 
165  doc->editWrapLine (m_line, m_col, m_removeLine);
166 }
167 
168 void KateEditInsertLineUndo::undo ()
169 {
170  KateDocument *doc = document();
171 
172  doc->editRemoveLine (m_line);
173 }
174 
175 void KateEditRemoveLineUndo::undo ()
176 {
177  KateDocument *doc = document();
178 
179  doc->editInsertLine (m_line, m_text);
180 }
181 
182 void KateEditMarkLineAutoWrappedUndo::undo ()
183 {
184  KateDocument *doc = document();
185 
186  doc->editMarkLineAutoWrapped (m_line, m_autowrapped);
187 }
188 
189 void KateEditRemoveTextUndo::redo ()
190 {
191  KateDocument *doc = document();
192 
193  doc->editRemoveText (m_line, m_col, len());
194 }
195 
196 void KateEditInsertTextUndo::redo ()
197 {
198  KateDocument *doc = document();
199 
200  doc->editInsertText (m_line, m_col, m_text);
201 }
202 
203 void KateEditUnWrapLineUndo::redo ()
204 {
205  KateDocument *doc = document();
206 
207  doc->editUnWrapLine (m_line, m_removeLine, m_len);
208 }
209 
210 void KateEditWrapLineUndo::redo ()
211 {
212  KateDocument *doc = document();
213 
214  doc->editWrapLine (m_line, m_col, m_newLine);
215 }
216 
217 void KateEditRemoveLineUndo::redo ()
218 {
219  KateDocument *doc = document();
220 
221  doc->editRemoveLine (m_line);
222 }
223 
224 void KateEditInsertLineUndo::redo ()
225 {
226  KateDocument *doc = document();
227 
228  doc->editInsertLine (m_line, m_text);
229 }
230 
231 void KateEditMarkLineAutoWrappedUndo::redo ()
232 {
233  KateDocument *doc = document();
234 
235  doc->editMarkLineAutoWrapped (m_line, m_autowrapped);
236 }
237 
238 KateUndoGroup::KateUndoGroup (KateUndoManager *manager, const KTextEditor::Cursor &cursorPosition, const KTextEditor::Range &selectionRange)
239  : m_manager (manager)
240  , m_safePoint(false)
241  , m_undoSelection(selectionRange)
242  , m_redoSelection(-1, -1, -1, -1)
243  , m_undoCursor(cursorPosition)
244  , m_redoCursor(-1, -1)
245 {
246 }
247 
248 KateUndoGroup::~KateUndoGroup ()
249 {
250  qDeleteAll (m_items);
251 }
252 
253 void KateUndoGroup::undo (KTextEditor::View *view)
254 {
255  if (m_items.isEmpty())
256  return;
257 
258  m_manager->startUndo ();
259 
260  for (int i=m_items.size()-1; i >= 0; --i)
261  m_items[i]->undo();
262 
263  if (view != 0) {
264  if (m_undoSelection.isValid())
265  view->setSelection(m_undoSelection);
266  else
267  view->removeSelection();
268 
269  if (m_undoCursor.isValid())
270  view->setCursorPosition(m_undoCursor);
271  }
272 
273  m_manager->endUndo ();
274 }
275 
276 void KateUndoGroup::redo (KTextEditor::View *view)
277 {
278  if (m_items.isEmpty())
279  return;
280 
281  m_manager->startUndo ();
282 
283  for (int i=0; i < m_items.size(); ++i)
284  m_items[i]->redo();
285 
286  if (view != 0) {
287  if (m_redoSelection.isValid())
288  view->setSelection(m_redoSelection);
289  else
290  view->removeSelection();
291 
292  if (m_redoCursor.isValid())
293  view->setCursorPosition(m_redoCursor);
294  }
295 
296  m_manager->endUndo ();
297 }
298 
299 void KateUndoGroup::editEnd(const KTextEditor::Cursor &cursorPosition, const KTextEditor::Range selectionRange)
300 {
301  m_redoCursor = cursorPosition;
302  m_redoSelection = selectionRange;
303 }
304 
305 void KateUndoGroup::addItem(KateUndo* u)
306 {
307  if (u->isEmpty())
308  delete u;
309  else if (!m_items.isEmpty() && m_items.last()->mergeWith(u))
310  delete u;
311  else
312  m_items.append(u);
313 }
314 
315 bool KateUndoGroup::merge (KateUndoGroup* newGroup,bool complex)
316 {
317  if (m_safePoint)
318  return false;
319 
320  if (newGroup->isOnlyType(singleType()) || complex) {
321  // Take all of its items first -> last
322  KateUndo* u = newGroup->m_items.isEmpty() ? 0 : newGroup->m_items.takeFirst ();
323  while (u) {
324  addItem(u);
325  u = newGroup->m_items.isEmpty() ? 0 : newGroup->m_items.takeFirst ();
326  }
327 
328  if (newGroup->m_safePoint)
329  safePoint();
330 
331  m_redoCursor = newGroup->m_redoCursor;
332  m_redoSelection = newGroup->m_redoSelection;
333 
334  return true;
335  }
336 
337  return false;
338 }
339 
340 void KateUndoGroup::safePoint (bool safePoint)
341 {
342  m_safePoint=safePoint;
343 }
344 
345 void KateUndoGroup::flagSavedAsModified()
346 {
347  foreach (KateUndo *item, m_items) {
348  if (item->isFlagSet(KateUndo::UndoLine1Saved)) {
349  item->unsetFlag(KateUndo::UndoLine1Saved);
350  item->setFlag(KateUndo::UndoLine1Modified);
351  }
352 
353  if (item->isFlagSet(KateUndo::UndoLine2Saved)) {
354  item->unsetFlag(KateUndo::UndoLine2Saved);
355  item->setFlag(KateUndo::UndoLine2Modified);
356  }
357 
358  if (item->isFlagSet(KateUndo::RedoLine1Saved)) {
359  item->unsetFlag(KateUndo::RedoLine1Saved);
360  item->setFlag(KateUndo::RedoLine1Modified);
361  }
362 
363  if (item->isFlagSet(KateUndo::RedoLine2Saved)) {
364  item->unsetFlag(KateUndo::RedoLine2Saved);
365  item->setFlag(KateUndo::RedoLine2Modified);
366  }
367  }
368 }
369 
370 void KateUndoGroup::markUndoAsSaved(QBitArray & lines)
371 {
372  for (int i = m_items.size() - 1; i >= 0; --i) {
373  KateUndo* item = m_items[i];
374  item->updateUndoSavedOnDiskFlag(lines);
375  }
376 }
377 
378 void KateUndoGroup::markRedoAsSaved(QBitArray & lines)
379 {
380  for (int i = m_items.size() - 1; i >= 0; --i) {
381  KateUndo* item = m_items[i];
382  item->updateRedoSavedOnDiskFlag(lines);
383  }
384 }
385 
386 KTextEditor::Document *KateUndoGroup::document()
387 {
388  return m_manager->document();
389 }
390 
391 KateUndo::UndoType KateUndoGroup::singleType() const
392 {
393  KateUndo::UndoType ret = KateUndo::editInvalid;
394 
395  Q_FOREACH(const KateUndo *item, m_items) {
396  if (ret == KateUndo::editInvalid)
397  ret = item->type();
398  else if (ret != item->type())
399  return KateUndo::editInvalid;
400  }
401 
402  return ret;
403 }
404 
405 bool KateUndoGroup::isOnlyType(KateUndo::UndoType type) const
406 {
407  if (type == KateUndo::editInvalid) return false;
408 
409  Q_FOREACH(const KateUndo *item, m_items)
410  if (item->type() != type)
411  return false;
412 
413  return true;
414 }
415 
416 // kate: space-indent on; indent-width 2; replace-tabs on;
KateUndo::mergeWith
virtual bool mergeWith(const KateUndo *undo)
merge an undo item Saves a bit of memory and potentially many calls when undo/redoing.
Definition: kateundo.cpp:105
KateUndo::UndoLine1Modified
Definition: kateundo.h:121
KateEditRemoveTextUndo::isEmpty
bool isEmpty() const
Check whether the item is empty.
Definition: kateundo.cpp:100
KateUndoGroup::addItem
void addItem(KateUndo *u)
add an undo item
Definition: kateundo.cpp:305
KateUndo::UndoLine2Saved
Definition: kateundo.h:124
KateEditWrapLineUndo::redo
void redo()
redo this item
Definition: kateundo.cpp:210
KateUndo::UndoType
UndoType
Types for undo items.
Definition: kateundo.h:59
KateUndo::RedoLine2Modified
Definition: kateundo.h:126
KateEditMarkLineAutoWrappedUndo::undo
void undo()
undo this item
Definition: kateundo.cpp:182
QString::prepend
QString & prepend(QChar ch)
KateUndoGroup::merge
bool merge(KateUndoGroup *newGroup, bool complex)
merge this group with an other
Definition: kateundo.cpp:315
KateUndo::type
virtual KateUndo::UndoType type() const =0
type of item
KateEditRemoveTextUndo
Definition: kateundo.h:190
katedocument.h
KateUndo::isEmpty
virtual bool isEmpty() const
Check whether the item is empty.
Definition: kateundo.cpp:90
KateEditRemoveTextUndo::mergeWith
bool mergeWith(const KateUndo *undo)
Definition: kateundo.cpp:124
KateEditInsertTextUndo
Definition: kateundo.h:150
KateUndo::RedoLine1Modified
Definition: kateundo.h:125
KateUndoManager
KateUndoManager implements a document's history.
Definition: kateundomanager.h:45
KateUndo::RedoLine2Saved
Definition: kateundo.h:128
KateEditUnWrapLineUndo::redo
void redo()
redo this item
Definition: kateundo.cpp:203
KateEditRemoveTextUndo::redo
void redo()
redo this item
Definition: kateundo.cpp:189
KateUndoGroup::undo
void undo(KTextEditor::View *view)
Undo the contained undo items.
Definition: kateundo.cpp:253
KateUndoGroup::markRedoAsSaved
void markRedoAsSaved(QBitArray &lines)
Definition: kateundo.cpp:378
QList::size
int size() const
KateEditInsertTextUndo::undo
void undo()
undo this item
Definition: kateundo.cpp:140
KateUndo::document
KateDocument * document()
Return the document the undo item belongs to.
Definition: kateundo.h:108
KateUndoGroup
Class to manage a group of undo items.
Definition: kateundo.h:378
KateEditRemoveTextUndo::undo
void undo()
undo this item
Definition: kateundo.cpp:147
KateUndo::UndoLine2Modified
Definition: kateundo.h:122
QList::append
void append(const T &value)
KateEditInsertTextUndo::KateEditInsertTextUndo
KateEditInsertTextUndo(KateDocument *document, int line, int col, const QString &text)
Definition: kateundo.cpp:41
kateundo.h
KateUndoManager::endUndo
void endUndo()
Definition: kateundomanager.cpp:133
KateDocument::editInsertText
bool editInsertText(int line, int col, const QString &s)
Add a string in the given line/column.
Definition: katedocument.cpp:971
KateUndoManager::document
KTextEditor::Document * document()
Definition: kateundomanager.cpp:55
KateUndoManager::startUndo
void startUndo()
Definition: kateundomanager.cpp:127
KateUndo::UndoLine1Saved
Definition: kateundo.h:123
KateDocument::editRemoveLine
bool editRemoveLine(int line)
Remove a line.
Definition: katedocument.cpp:1289
QList::isEmpty
bool isEmpty() const
KateEditInsertTextUndo::len
int len() const
Definition: kateundo.h:181
KateUndo::editInvalid
Definition: kateundo.h:68
KateUndoGroup::markUndoAsSaved
void markUndoAsSaved(QBitArray &lines)
Definition: kateundo.cpp:370
KateEditInsertLineUndo::KateEditInsertLineUndo
KateEditInsertLineUndo(KateDocument *document, int line, const QString &text)
Definition: kateundo.cpp:75
KateUndo::setFlag
void setFlag(ModificationFlag flag)
Definition: kateundo.h:131
KateEditUnWrapLineUndo::undo
void undo()
undo this item
Definition: kateundo.cpp:161
KateEditWrapLineUndo::undo
void undo()
undo this item
Definition: kateundo.cpp:154
QString
KateUndo::updateRedoSavedOnDiskFlag
virtual void updateRedoSavedOnDiskFlag(QBitArray &lines)
Definition: kateundo.h:144
QBitArray
KateUndo::unsetFlag
void unsetFlag(ModificationFlag flag)
Definition: kateundo.h:135
KateEditInsertLineUndo::undo
void undo()
undo this item
Definition: kateundo.cpp:168
KateEditRemoveLineUndo::undo
void undo()
undo this item
Definition: kateundo.cpp:175
KateEditUnWrapLineUndo::KateEditUnWrapLineUndo
KateEditUnWrapLineUndo(KateDocument *document, int line, int col, int len, bool removeLine)
Definition: kateundo.cpp:66
KateEditRemoveTextUndo::KateEditRemoveTextUndo
KateEditRemoveTextUndo(KateDocument *document, int line, int col, const QString &text)
Definition: kateundo.cpp:49
KateDocument
Definition: katedocument.h:74
KateEditRemoveLineUndo::redo
void redo()
redo this item
Definition: kateundo.cpp:217
KateUndoGroup::editEnd
void editEnd(const KTextEditor::Cursor &cursorPosition, const KTextEditor::Range selectionRange)
Definition: kateundo.cpp:299
KateEditWrapLineUndo::KateEditWrapLineUndo
KateEditWrapLineUndo(KateDocument *document, int line, int col, int len, bool newLine)
Definition: kateundo.cpp:57
KateUndoGroup::flagSavedAsModified
void flagSavedAsModified()
Change all LineSaved flags to LineModified of the line modification system.
Definition: kateundo.cpp:345
KateEditInsertTextUndo::redo
void redo()
redo this item
Definition: kateundo.cpp:196
KateDocument::editWrapLine
bool editWrapLine(int line, int col, bool newLine=true, bool *newLineAdded=0)
Wrap line.
Definition: katedocument.cpp:1083
KateEditInsertLineUndo::redo
void redo()
redo this item
Definition: kateundo.cpp:224
KateUndo::KateUndo
KateUndo(KateDocument *document)
Constructor.
Definition: kateundo.cpp:31
KateDocument::editRemoveText
bool editRemoveText(int line, int col, int len)
Remove a string in the given line/column.
Definition: katedocument.cpp:1012
KateUndoGroup::safePoint
void safePoint(bool safePoint=true)
set group as as savepoint.
Definition: kateundo.cpp:340
KateUndo::RedoLine1Saved
Definition: kateundo.h:127
KateEditRemoveTextUndo::len
int len() const
Definition: kateundo.h:221
QList::takeFirst
T takeFirst()
KateUndo::updateUndoSavedOnDiskFlag
virtual void updateUndoSavedOnDiskFlag(QBitArray &lines)
Definition: kateundo.h:143
QList::last
T & last()
KateUndoGroup::~KateUndoGroup
~KateUndoGroup()
Destructor.
Definition: kateundo.cpp:248
KateEditMarkLineAutoWrappedUndo::redo
void redo()
redo this item
Definition: kateundo.cpp:231
KateUndo::isFlagSet
bool isFlagSet(ModificationFlag flag) const
Definition: kateundo.h:139
KateUndo::~KateUndo
virtual ~KateUndo()
Destructor.
Definition: kateundo.cpp:37
KateEditRemoveLineUndo::KateEditRemoveLineUndo
KateEditRemoveLineUndo(KateDocument *document, int line, const QString &text)
Definition: kateundo.cpp:82
KateUndoGroup::redo
void redo(KTextEditor::View *view)
Redo the contained undo items.
Definition: kateundo.cpp:276
KateEditInsertTextUndo::isEmpty
bool isEmpty() const
Check whether the item is empty.
Definition: kateundo.cpp:95
kateundomanager.h
KateDocument::editUnWrapLine
bool editUnWrapLine(int line, bool removeLine=true, int length=0)
Unwrap line.
Definition: katedocument.cpp:1153
KateUndo
Base class for Kate undo commands.
Definition: kateundo.h:41
KateDocument::editInsertLine
bool editInsertLine(int line, const QString &s)
Insert a string at the given line.
Definition: katedocument.cpp:1223
KateDocument::editMarkLineAutoWrapped
bool editMarkLineAutoWrapped(int line, bool autowrapped)
Mark line as autowrapped.
Definition: katedocument.cpp:1056
KateUndoGroup::KateUndoGroup
KateUndoGroup(KateUndoManager *manager, const KTextEditor::Cursor &cursorPosition, const KTextEditor::Range &selectionRange)
Constructor.
Definition: kateundo.cpp:238
KateEditInsertTextUndo::mergeWith
bool mergeWith(const KateUndo *undo)
Definition: kateundo.cpp:110
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Sat May 9 2020 03:56:58 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Kate

Skip menu "Kate"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

applications API Reference

Skip menu "applications API Reference"
  •   kate
  •       kate
  •   KTextEditor
  •   Kate
  • Konsole

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal