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

okteta

  • sources
  • kde-4.12
  • kdesdk
  • okteta
  • core
  • piecetable
piecetablechangehistory.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the Okteta Core library, made within the KDE community.
3 
4  Copyright 2008 Friedrich W. H. Kossebau <kossebau@kde.org>
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Lesser General Public
8  License as published by the Free Software Foundation; either
9  version 2.1 of the License, or (at your option) version 3, or any
10  later version accepted by the membership of KDE e.V. (or its
11  successor approved by the membership of KDE e.V.), which shall
12  act as a proxy defined in Section 6 of version 3 of the license.
13 
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public
20  License along with this library. If not, see <http://www.gnu.org/licenses/>.
21 */
22 
23 #include "piecetablechangehistory.h"
24 
25 // lib
26 #include "grouppiecetablechange.h"
27 //
28 #include <addressrangelist.h>
29 #include <arraychangemetricslist.h>
30 
31 
32 namespace KPieceTable
33 {
34 
35 void PieceTableChangeHistory::clear()
36 {
37  while( !mChangeStack.isEmpty() )
38  delete mChangeStack.pop();
39 
40  mTryToMergeAppendedChange = false;
41  mAppliedChangesCount = 0;
42  mBaseBeforeChangeIndex = 0;
43  mAppliedChangesDataSize = 0;
44 
45  mActiveGroupChange = 0;
46 }
47 
48 void PieceTableChangeHistory::getChangeData( ArrayChangeMetrics* metrics, Address* storageOffset,
49  int versionIndex ) const
50 {
51  AbstractPieceTableChange *change = mChangeStack.at( versionIndex );
52  *metrics = change->metrics();
53  *storageOffset = change->storageOffset();
54 }
55 
56 
57 void PieceTableChangeHistory::setBeforeCurrentChangeAsBase( bool hide )
58 {
59  mBaseBeforeChangeIndex = hide ? -1 : mAppliedChangesCount;
60  mTryToMergeAppendedChange = false;
61 }
62 
63 void PieceTableChangeHistory::openGroupedChange( const QString& description )
64 {
65  GroupPieceTableChange *groupChange = new GroupPieceTableChange( mActiveGroupChange, description );
66 
67  appendChange( groupChange );
68  mActiveGroupChange = groupChange;
69 }
70 
71 void PieceTableChangeHistory::closeGroupedChange(const QString & description )
72 {
73  if( mActiveGroupChange != 0 )
74  {
75  if( !description.isEmpty() )
76  mActiveGroupChange->setDescription( description );
77  mActiveGroupChange = mActiveGroupChange->parent();
78  }
79 }
80 
81 void PieceTableChangeHistory::finishChange()
82 {
83  if( mActiveGroupChange != 0 )
84  mActiveGroupChange->finishChange();
85  else
86  mTryToMergeAppendedChange = false;
87 }
88 
89 bool PieceTableChangeHistory::appendChange( AbstractPieceTableChange* change )
90 {
91  // chop unapplied changes
92  if( mAppliedChangesCount < mChangeStack.count() )
93  {
94  // hide baseindex if needed
95  if( mBaseBeforeChangeIndex > mAppliedChangesCount )
96  mBaseBeforeChangeIndex = -1;
97  do
98  {
99  AbstractPieceTableChange* droppedChange = mChangeStack.pop();
100  delete droppedChange;
101  }
102  while( mAppliedChangesCount < mChangeStack.count() );
103  }
104 
105  mAppliedChangesDataSize += change->dataSize();
106 
107  bool isNotMerged = true;
108  if( mActiveGroupChange != 0 )
109  {
110  mActiveGroupChange->appendChange( change );
111  isNotMerged = false; // TODO: hack for as long as subgroups are not undoable
112  }
113  else
114  {
115  if( mTryToMergeAppendedChange && mAppliedChangesCount>0 )
116  isNotMerged = !mChangeStack.top()->merge( change );
117  else
118  mTryToMergeAppendedChange = true;
119 
120  if( isNotMerged )
121  {
122  mChangeStack.push( change );
123  ++mAppliedChangesCount;
124  }
125  else
126  delete change;
127  }
128 
129  return isNotMerged;
130 }
131 
132 
133 bool PieceTableChangeHistory::revertBeforeChange( PieceTable* pieceTable, int changeId,
134  AddressRangeList* changedRanges,
135  ArrayChangeMetricsList* changeList )
136 {
137  int currentChangeId = mAppliedChangesCount;
138 
139  if( currentChangeId == changeId )
140  return false;
141 
142  // close any grouped changes
143  while( mActiveGroupChange != 0 )
144  mActiveGroupChange = mActiveGroupChange->parent();
145 
146  if( currentChangeId < changeId )
147  {
148  for( ; currentChangeId<changeId ; ++currentChangeId )
149  {
150  const AbstractPieceTableChange* change = mChangeStack[currentChangeId];
151 
152  if( change->type() == AbstractPieceTableChange::GroupId )
153  {
154  const GroupPieceTableChange* groupChange = static_cast<const GroupPieceTableChange*>(change);
155  const AddressRangeList changedRangeList = groupChange->applyGroup( pieceTable );
156  changedRanges->addAddressRangeList( changedRangeList );
157 
158  const QList<ArrayChangeMetrics> changeMetricsList = groupChange->groupMetrics();
159  *changeList += changeMetricsList;
160  }
161  else
162  {
163  const AddressRange changedRange = change->apply( pieceTable );
164  changedRanges->addAddressRange( changedRange );
165 
166  const ArrayChangeMetrics changeMetrics = change->metrics();
167  changeList->append( changeMetrics );
168  }
169 
170  mAppliedChangesDataSize += change->dataSize();
171  }
172  }
173  else
174  {
175  for( --currentChangeId; changeId<=currentChangeId ; --currentChangeId )
176  {
177  const AbstractPieceTableChange* change = mChangeStack[currentChangeId];
178 
179  if( change->type() == AbstractPieceTableChange::GroupId )
180  {
181  const GroupPieceTableChange* groupChange = static_cast<const GroupPieceTableChange*>(change);
182  const AddressRangeList changedRangeList = groupChange->revertGroup( pieceTable );
183  changedRanges->addAddressRangeList( changedRangeList );
184 
185  const QList<ArrayChangeMetrics> changeMetricsList = groupChange->groupMetrics( true );
186  *changeList += changeMetricsList;
187  }
188  else
189  {
190  const AddressRange changedRange = change->revert( pieceTable );
191  changedRanges->addAddressRange( changedRange );
192 
193  ArrayChangeMetrics changeMetrics = change->metrics();
194  changeMetrics.revert();
195  changeList->append( changeMetrics );
196  }
197  mAppliedChangesDataSize -= change->dataSize();
198  }
199  }
200  mAppliedChangesCount = changeId;
201  mTryToMergeAppendedChange = false;
202 
203  return true;
204 }
205 
206 }
Okteta::ArrayChangeMetrics::revert
void revert()
Definition: arraychangemetrics.h:123
KPieceTable::PieceTableChangeHistory::mAppliedChangesDataSize
Size mAppliedChangesDataSize
Definition: piecetablechangehistory.h:102
KPieceTable::AbstractPieceTableChange::apply
virtual AddressRange apply(PieceTable *pieceTable) const =0
KPieceTable::PieceTableChangeHistory::getChangeData
void getChangeData(ArrayChangeMetrics *metrics, Address *storageOffset, int versionIndex) const
Definition: piecetablechangehistory.cpp:48
Okteta::AddressRangeList::addAddressRange
void addAddressRange(const AddressRange &addressRange)
Definition: addressrangelist.cpp:32
KDE::NumberRange< Address, Size >
KPieceTable::PieceTableChangeHistory::clear
void clear()
Definition: piecetablechangehistory.cpp:35
KPieceTable::PieceTableChangeHistory::openGroupedChange
void openGroupedChange(const QString &description)
Definition: piecetablechangehistory.cpp:63
KPieceTable::PieceTableChangeHistory::finishChange
void finishChange()
closes the current change, so any following operation will not be tried to merge
Definition: piecetablechangehistory.cpp:81
addressrangelist.h
KPieceTable::PieceTableChangeHistory::revertBeforeChange
bool revertBeforeChange(PieceTable *pieceTable, int changeId, AddressRangeList *changedRanges, ArrayChangeMetricsList *changeList)
Definition: piecetablechangehistory.cpp:133
grouppiecetablechange.h
KPieceTable::PieceTableChangeHistory::mActiveGroupChange
GroupPieceTableChange * mActiveGroupChange
if 0, there is no
Definition: piecetablechangehistory.h:105
KPieceTable::PieceTableChangeHistory::mBaseBeforeChangeIndex
int mBaseBeforeChangeIndex
Definition: piecetablechangehistory.h:98
KPieceTable::GroupPieceTableChange::groupMetrics
ArrayChangeMetricsList groupMetrics(bool reverted=false) const
Definition: grouppiecetablechange.cpp:153
KPieceTable::PieceTableChangeHistory::mChangeStack
QStack< AbstractPieceTableChange * > mChangeStack
Definition: piecetablechangehistory.h:100
KPieceTable::GroupPieceTableChange::applyGroup
AddressRangeList applyGroup(PieceTable *pieceTable) const
Definition: grouppiecetablechange.cpp:112
piecetablechangehistory.h
Okteta::ArrayChangeMetricsList
Definition: arraychangemetricslist.h:36
KPieceTable::PieceTableChangeHistory::closeGroupedChange
void closeGroupedChange(const QString &description)
Definition: piecetablechangehistory.cpp:71
KPieceTable::PieceTableChangeHistory::setBeforeCurrentChangeAsBase
void setBeforeCurrentChangeAsBase(bool hide)
Definition: piecetablechangehistory.cpp:57
KPieceTable::Address
Okteta::Address Address
Definition: piece.h:34
KPieceTable::AbstractPieceTableChange
class
Definition: abstractpiecetablechange.h:45
KPieceTable::PieceTable
Definition: piecetable.h:35
arraychangemetricslist.h
KPieceTable::PieceTableChangeHistory::mAppliedChangesCount
int mAppliedChangesCount
Definition: piecetablechangehistory.h:96
KPieceTable::AbstractPieceTableChange::metrics
virtual ArrayChangeMetrics metrics() const =0
KPieceTable::AbstractPieceTableChange::type
virtual int type() const =0
KPieceTable::GroupPieceTableChange::parent
GroupPieceTableChange * parent() const
Definition: grouppiecetablechange.h:117
KPieceTable::GroupPieceTableChange::appendChange
bool appendChange(AbstractPieceTableChange *change)
Definition: grouppiecetablechange.cpp:75
KPieceTable::GroupPieceTableChange
class
Definition: grouppiecetablechange.h:48
KPieceTable::GroupPieceTableChange::revertGroup
AddressRangeList revertGroup(PieceTable *pieceTable) const
Definition: grouppiecetablechange.cpp:131
Okteta::ArrayChangeMetrics
Definition: arraychangemetrics.h:38
KPieceTable::AbstractPieceTableChange::storageOffset
virtual Address storageOffset() const
returns the storageOffset. Default returns -1.
Definition: abstractpiecetablechange.cpp:37
KPieceTable::AbstractPieceTableChange::dataSize
virtual Size dataSize() const
returns the size of the added data. Default returns 0.
Definition: abstractpiecetablechange.cpp:39
KPieceTable::AbstractPieceTableChange::GroupId
Definition: abstractpiecetablechange.h:56
KPieceTable::AbstractPieceTableChange::revert
virtual AddressRange revert(PieceTable *pieceTable) const =0
Okteta::AddressRangeList
Definition: addressrangelist.h:38
Okteta::AddressRangeList::addAddressRangeList
void addAddressRangeList(const AddressRangeList &addressRangeList)
Definition: addressrangelist.cpp:81
KPieceTable::GroupPieceTableChange::finishChange
void finishChange()
Definition: grouppiecetablechange.h:118
KPieceTable::GroupPieceTableChange::setDescription
void setDescription(const QString &description)
Definition: grouppiecetablechange.h:116
QList< ArrayChangeMetrics >
KPieceTable::PieceTableChangeHistory::mTryToMergeAppendedChange
bool mTryToMergeAppendedChange
if true, try to merge changes
Definition: piecetablechangehistory.h:94
KPieceTable::PieceTableChangeHistory::appendChange
bool appendChange(AbstractPieceTableChange *change)
returns true, if a new change is appended, false if merged
Definition: piecetablechangehistory.cpp:89
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:04:08 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okteta

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

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • umbrello
  •   umbrello

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