• 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
  • gui
bytearraytableranges.cpp
Go to the documentation of this file.
1 /*
2  This file is part of the Okteta Gui library, made within the KDE community.
3 
4  Copyright 2003,2008-2009 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 "bytearraytableranges.h"
24 
25 // lib
26 #include "bytearraytablelayout.h"
27 // Okteta core
28 #include <arraychangemetricslist.h>
29 
30 
31 namespace Okteta
32 {
33 
34 ByteArrayTableRanges::ByteArrayTableRanges( ByteArrayTableLayout* layout )
35  : mModified( false ),
36  mLayout( layout )
37 {
38 }
39 
40 
41 void ByteArrayTableRanges::reset()
42 {
43  mSelection.cancel();
44  FirstWordSelection.unset();
45  mMarking.unset();
46  ChangedRanges.clear();
47 }
48 
49 
50 void ByteArrayTableRanges::setMarking( const AddressRange& marking )
51 {
52  if( mMarking == marking )
53  return;
54 
55  const bool hadMarking = mMarking.isValid();
56  if( hadMarking )
57  addChangedRange( mMarking );
58 
59  mMarking = marking;
60 
61  const bool hasNewMarking = mMarking.isValid();
62  if( hasNewMarking )
63  addChangedRange( mMarking );
64 }
65 
66 
67 void ByteArrayTableRanges::removeFurtherSelections()
68 {
69  for( int i = 1; i < noOfSelections(); ++i )
70  removeSelection( i );
71 }
72 
73 
74 void ByteArrayTableRanges::setSelection( const AddressRange& selection )
75 {
76  bool Changed = mSelection.isValid();
77  if( Changed )
78  addChangedRange( mSelection.range() );
79  mSelection = selection;
80  addChangedRange( mSelection.range() );
81 }
82 
83 void ByteArrayTableRanges::setSelectionStart( Address startIndex )
84 {
85  bool Changed = mSelection.isValid();
86  if( Changed )
87  addChangedRange( mSelection.range() );
88 
89  mSelection.setStart( startIndex );
90 }
91 
92 
93 void ByteArrayTableRanges::setSelectionEnd( Address EndIndex )
94 {
95  AddressRange OldSelection = mSelection.range();
96  mSelection.setEnd( EndIndex );
97 
98  // TODO: think about rather building a diff of the sections
99  if( !OldSelection.isValid() )
100  {
101  addChangedRange( mSelection.range() );
102  return;
103  }
104  if( !mSelection.isValid() )
105  {
106  addChangedRange( OldSelection );
107  return;
108  }
109 
110  if( OldSelection == mSelection.range() )
111  return;
112  Address CS;
113  Address CE;
114  // changes at the end?
115  if( mSelection.start() == OldSelection.start() )
116  {
117  CS = OldSelection.nextBehindEnd();
118  CE = mSelection.end();
119  if( CE < CS )
120  {
121  CS = mSelection.nextBehindEnd();
122  CE = OldSelection.end();
123  }
124  }
125  // changes at the start?
126  else if( mSelection.end() == OldSelection.end() )
127  {
128  CS = OldSelection.start();
129  CE = mSelection.nextBeforeStart();
130  if( CE < CS )
131  {
132  CS = mSelection.start();
133  CE = OldSelection.nextBeforeStart();
134  }
135  }
136  // change over the anchor
137  else
138  {
139  CS = OldSelection.start();
140  CE = mSelection.end();
141  if( CE < CS )
142  {
143  CS = mSelection.start();
144  CE = OldSelection.end();
145  }
146  }
147  AddressRange C( CS, CE );
148 
149  bool Changed = C.isValid();
150  if( Changed )
151  addChangedRange( C );
152  return;
153 }
154 
155 
156 AddressRange ByteArrayTableRanges::removeSelection( int id )
157 {
158  if( id > 0 )
159  return AddressRange();
160 
161  AddressRange range = mSelection.range();
162  bool Changed = range.isValid();
163  if( Changed )
164  addChangedRange( range );
165 
166  mSelection.cancel();
167  FirstWordSelection.unset();
168 
169  return range;
170 }
171 
172 
173 bool ByteArrayTableRanges::overlapsSelection( Address FirstIndex, Address LastIndex, Address* startIndex, Address* endIndex ) const
174 {
175  if( mSelection.range().overlaps(AddressRange(FirstIndex,LastIndex)) )
176  {
177  *startIndex = mSelection.start();
178  *endIndex = mSelection.end();
179  return true;
180  }
181  return false;
182 }
183 
184 
185 bool ByteArrayTableRanges::overlapsMarking( Address FirstIndex, Address LastIndex, Address* startIndex, Address* endIndex ) const
186 {
187  if( mMarking.overlaps(AddressRange(FirstIndex,LastIndex)) )
188  {
189  *startIndex = mMarking.start();
190  *endIndex = mMarking.end();
191  return true;
192  }
193  return false;
194 }
195 
196 
197 const AddressRange *ByteArrayTableRanges::firstOverlappingSelection( const AddressRange &Range ) const
198 {
199  return mSelection.range().overlaps(Range) ? &mSelection.range() : 0;
200 }
201 
202 
203 const AddressRange *ByteArrayTableRanges::overlappingMarking( const AddressRange &Range ) const
204 {
205  return mMarking.overlaps(Range) ? &mMarking : 0;
206 }
207 
208 /*
209 bool ByteArrayTableRanges::overlapsChanges( Address FirstIndex, Address LastIndex, Address* startIndex, Address* endIndex ) const
210 {
211  for( CoordRangeList::const_iterator S=ChangedRanges.begin(); S!=ChangedRanges.end(); ++S )
212  {
213  if( (*S).overlaps(KBuff(FirstIndex,LastIndex)) )
214  {
215  *startIndex = (*S).start();
216  *endIndex = (*S).end();
217  return true;
218  }
219  }
220 
221  return false;
222 }
223 
224 bool ByteArrayTableRanges::overlapsChanges( AddressRange Indizes, AddressRange *ChangedRange ) const
225 {
226  for( AddressRangeList::const_iterator S=ChangedRanges.begin(); S!=ChangedRanges.end(); ++S )
227  {
228  if( (*S).overlaps(Indizes) )
229  {
230  *ChangedRange = *S;
231  return true;
232  }
233  }
234 
235  return false;
236 }
237 */
238 bool ByteArrayTableRanges::overlapsChanges( const CoordRange &Range, CoordRange *ChangedRange ) const
239 {
240  // TODO: add a lastusedrange pointer for quicker access
241  for( CoordRangeList::ConstIterator R=ChangedRanges.begin(); R!=ChangedRanges.end(); ++R )
242  {
243  if( (*R).overlaps(Range) )
244  {
245  *ChangedRange = *R;
246  return true;
247  }
248  }
249 
250  return false;
251 }
252 
253 void ByteArrayTableRanges::addChangedOffsetLines( const LineRange& changedLines )
254 {
255  if( mChangedOffsetLines.isEmpty() )
256  {
257  mChangedOffsetLines = changedLines;
258  mModified = true;
259  }
260  else
261  mChangedOffsetLines.extendTo( changedLines );
262 }
263 
264 void ByteArrayTableRanges::addChangedRange( Address startIndex, Address endIndex )
265 {
266  addChangedRange( AddressRange(startIndex,endIndex) );
267 }
268 
269 
270 void ByteArrayTableRanges::addChangedRange( const AddressRange& range )
271 {
272 // kDebug() << "adding change range "<<S.start()<<","<<S.end();
273  addChangedRange( mLayout->coordRangeOfIndizes(range) );
274 }
275 
276 
277 void ByteArrayTableRanges::addChangedRange( const CoordRange& range )
278 {
279  ChangedRanges.addCoordRange( range );
280 // kDebug() << "as range "<<NewRange.start().pos()<<","<<NewRange.start().line()<<"-"
281 // <<NewRange.end().pos()<<","<<NewRange.end().line()<<endl;
282 
283  mModified = true;
284 }
285 
286 void ByteArrayTableRanges::resetChangedRanges()
287 {
288  mChangedOffsetLines.unset();
289  ChangedRanges.clear();
290  mModified = false;
291 }
292 
293 
294 void ByteArrayTableRanges::setFirstWordSelection( const AddressRange& range )
295 {
296  FirstWordSelection = range;
297  setSelection( FirstWordSelection );
298 }
299 
300  void ByteArrayTableRanges::ensureWordSelectionForward( bool Forward )
301  {
302  // in the anchor not on the right side?
303  if( mSelection.isForward() != Forward )
304  {
305  setSelectionEnd( Forward ? FirstWordSelection.start() : FirstWordSelection.nextBehindEnd() );
306 
307  mSelection.setForward( Forward );
308  }
309  }
310 
311 
312 void ByteArrayTableRanges::adaptToChanges( const ArrayChangeMetricsList& changeList, Size oldLength )
313 {
314  foreach( const ArrayChangeMetrics& change, changeList )
315  {
316  //TODO: change parameters to ArrayChangeMetrics
317  switch( change.type() )
318  {
319  case ArrayChangeMetrics::Replacement:
320  {
321  oldLength += change.lengthChange();
322  const Address offset = change.offset();
323  const Size diff = change.lengthChange();
324  const Address behindLast = (diff == 0) ? offset + change.insertLength() :
325  (diff < 0) ? oldLength - diff :
326  oldLength;
327  addChangedRange( offset, behindLast-1 );
328 
329  if( mSelection.isValid() )
330  mSelection.adaptToReplacement( offset, change.removeLength(), change.insertLength() );
331  if( mMarking.isValid() )
332  mMarking.adaptToReplacement( offset, change.removeLength(), change.insertLength() );
333  break;
334  }
335  case ArrayChangeMetrics::Swapping:
336  addChangedRange( change.offset(), change.secondEnd() );
337 
338  if( mSelection.isValid() )
339  mSelection.adaptToSwap( change.offset(), change.secondStart(), change.secondLength() );
340  // TODO:
341 // if( mMarking.isValid() )
342 // mMarking.adaptToSwap( change.offset(), change.secondStart(), change.secondLength() );
343  default:
344  ;
345  }
346  }
347 }
348 
349 ByteArrayTableRanges::~ByteArrayTableRanges()
350 {
351 }
352 
353 }
Okteta::CoordRange
describes a range in the buffercoord
Definition: coordrange.h:51
Okteta::Address
qint32 Address
Definition: address.h:34
Okteta::ByteArrayTableRanges::ensureWordSelectionForward
void ensureWordSelectionForward(bool Forward)
Definition: bytearraytableranges.cpp:300
KDE::Range::extendTo
void extendTo(const Range &Limit)
extends the range to Limit.
Definition: range.h:71
Okteta::ByteArrayTableRanges::overlappingMarking
const AddressRange * overlappingMarking(const AddressRange &range) const
Definition: bytearraytableranges.cpp:203
Okteta::ArrayChangeMetrics::type
int type() const
Definition: arraychangemetrics.h:140
Okteta::ArrayChangeMetrics::Replacement
Definition: arraychangemetrics.h:47
Okteta::ByteArrayTableRanges::ByteArrayTableRanges
ByteArrayTableRanges(ByteArrayTableLayout *layout)
Definition: bytearraytableranges.cpp:34
Okteta::ByteArrayTableRanges::overlapsMarking
bool overlapsMarking(Address FirstIndex, Address LastIndex, Address *SI, Address *EI) const
Definition: bytearraytableranges.cpp:185
KDE::NumberRange::nextBehindEnd
N nextBehindEnd() const
Definition: numberrange.h:145
Okteta::ArrayChangeMetrics::offset
Address offset() const
Definition: arraychangemetrics.h:141
Okteta::Selection::range
const AddressRange & range() const
Definition: selection.h:181
KDE::NumberRange< Address, Size >
Okteta::ArrayChangeMetrics::Swapping
Definition: arraychangemetrics.h:47
KDE::Range::start
T start() const
Definition: range.h:86
Okteta::ByteArrayTableRanges::FirstWordSelection
AddressRange FirstWordSelection
memories first selected word on wordwise selection
Definition: bytearraytableranges.h:114
Okteta::ByteArrayTableRanges::noOfSelections
int noOfSelections() const
Definition: bytearraytableranges.h:125
Okteta::ByteArrayTableRanges::firstOverlappingSelection
const AddressRange * firstOverlappingSelection(const AddressRange &range) const
Definition: bytearraytableranges.cpp:197
Okteta::ByteArrayTableRanges::setFirstWordSelection
void setFirstWordSelection(const AddressRange &selection)
Definition: bytearraytableranges.cpp:294
bytearraytablelayout.h
Okteta::ByteArrayTableLayout
the logical layout of a byte array table for a view
Definition: bytearraytablelayout.h:61
Okteta::Selection::nextBehindEnd
Address nextBehindEnd() const
Definition: selection.h:186
Okteta::ByteArrayTableRanges::marking
AddressRange marking() const
Definition: bytearraytableranges.h:132
Okteta::ByteArrayTableRanges::removeFurtherSelections
void removeFurtherSelections()
removes all but the standard selection and returns true if something changed
Definition: bytearraytableranges.cpp:67
Okteta::CoordRangeList::addCoordRange
void addCoordRange(const CoordRange &coordRange)
Definition: coordrangelist.cpp:34
Okteta::ByteArrayTableRanges::addChangedRange
void addChangedRange(const AddressRange &range)
Definition: bytearraytableranges.cpp:270
Okteta::ArrayChangeMetrics::secondEnd
Address secondEnd() const
Definition: arraychangemetrics.h:146
Okteta::ByteArrayTableRanges::resetChangedRanges
void resetChangedRanges()
Definition: bytearraytableranges.cpp:286
KDE::Range::end
T end() const
Definition: range.h:88
KDE::NumberRange::adaptToReplacement
void adaptToReplacement(N offset, S removedLength, S insertedLength)
Definition: numberrange.h:226
Okteta::ByteArrayTableRanges::adaptToChanges
void adaptToChanges(const ArrayChangeMetricsList &changeList, Size oldLength)
Definition: bytearraytableranges.cpp:312
Okteta::Selection::end
Address end() const
Definition: selection.h:184
Okteta::Selection::cancel
void cancel()
sets the selection to be invalid
Definition: selection.h:188
Okteta::ArrayChangeMetricsList
Definition: arraychangemetricslist.h:36
Okteta::ByteArrayTableRanges::setSelectionStart
void setSelectionStart(Address startIndex)
Definition: bytearraytableranges.cpp:83
Okteta::ByteArrayTableRanges::mChangedOffsetLines
LineRange mChangedOffsetLines
lines that were added or removed
Definition: bytearraytableranges.h:117
KDE::Range::overlaps
bool overlaps(const Range &R) const
returns true is the range shares at least one index with R.
Definition: range.h:118
Okteta::Selection::isForward
bool isForward() const
Definition: selection.h:193
Okteta::Selection::setForward
void setForward(bool forward=true)
sets the anchor to the start or the end.
Definition: selection.h:176
Okteta::AddressRange
KDE::NumberRange< Address, Size > AddressRange
Definition: addressrange.h:35
Okteta::Selection::adaptToReplacement
void adaptToReplacement(Address pos, Size removedLength, Size insertedLength)
Definition: selection.h:195
Okteta::Selection::adaptToSwap
void adaptToSwap(Address firstOffset, Address secondOffset, Size secondLength)
Definition: selection.h:201
Okteta::Selection::setEnd
void setEnd(Address index)
sets the end of the current selection.
Definition: selection.h:152
Okteta::ByteArrayTableRanges::overlapsChanges
bool overlapsChanges(const CoordRange &range, CoordRange *ChangedRange) const
Definition: bytearraytableranges.cpp:238
Okteta::ArrayChangeMetrics::secondStart
Address secondStart() const
Definition: arraychangemetrics.h:145
Okteta::Selection::nextBeforeStart
Address nextBeforeStart() const
Definition: selection.h:185
Okteta::ByteArrayTableRanges::setMarking
void setMarking(const AddressRange &marking)
Definition: bytearraytableranges.cpp:50
arraychangemetricslist.h
KDE::Range::unset
void unset()
sets the range to null
Definition: range.h:62
Okteta::ByteArrayTableRanges::selection
AddressRange selection() const
Definition: bytearraytableranges.h:129
Okteta::ByteArrayTableRanges::mModified
bool mModified
true if something changed
Definition: bytearraytableranges.h:109
Okteta::ByteArrayTableLayout::coordRangeOfIndizes
CoordRange coordRangeOfIndizes(const AddressRange &indizes) const
calculates the range of coords in which the indizes are found.
Definition: bytearraytablelayout.cpp:228
Okteta::ArrayChangeMetrics::removeLength
Size removeLength() const
Definition: arraychangemetrics.h:142
Okteta::ArrayChangeMetrics::secondLength
Size secondLength() const
Definition: arraychangemetrics.h:148
Okteta::Selection::start
Address start() const
Definition: selection.h:183
bytearraytableranges.h
Okteta::ArrayChangeMetrics
Definition: arraychangemetrics.h:38
Okteta::ArrayChangeMetrics::insertLength
Size insertLength() const
Definition: arraychangemetrics.h:143
Okteta::Selection::isValid
bool isValid() const
Definition: selection.h:190
Okteta::Size
qint32 Size
Definition: size.h:33
Okteta::ArrayChangeMetrics::lengthChange
Size lengthChange() const
Definition: arraychangemetrics.h:144
Okteta::ByteArrayTableRanges::setSelectionEnd
void setSelectionEnd(Address startIndex)
Definition: bytearraytableranges.cpp:93
Okteta::ByteArrayTableRanges::~ByteArrayTableRanges
~ByteArrayTableRanges()
Definition: bytearraytableranges.cpp:349
Okteta::ByteArrayTableRanges::mLayout
ByteArrayTableLayout * mLayout
Definition: bytearraytableranges.h:121
Okteta::ByteArrayTableRanges::mMarking
AddressRange mMarking
Definition: bytearraytableranges.h:111
Okteta::ByteArrayTableRanges::removeSelection
AddressRange removeSelection(int id=0)
removes selection with id and returns it
Definition: bytearraytableranges.cpp:156
Okteta::ByteArrayTableRanges::reset
void reset()
removes all ranges
Definition: bytearraytableranges.cpp:41
Okteta::ByteArrayTableRanges::mSelection
Selection mSelection
Definition: bytearraytableranges.h:112
KDE::Range::isValid
bool isValid() const
returns true if the range covers at least one index
Definition: range.h:122
Okteta::ByteArrayTableRanges::setSelection
void setSelection(const AddressRange &selection)
Definition: bytearraytableranges.cpp:74
Okteta::ByteArrayTableRanges::addChangedOffsetLines
void addChangedOffsetLines(const LineRange &changesLines)
assumes all added lines to overlap
Definition: bytearraytableranges.cpp:253
Okteta::ByteArrayTableRanges::overlapsSelection
bool overlapsSelection(Address FirstIndex, Address LastIndex, Address *SI, Address *EI) const
Definition: bytearraytableranges.cpp:173
KDE::Range::isEmpty
bool isEmpty() const
returns true if the range has not been set
Definition: range.h:124
Okteta::Selection::setStart
void setStart(Address index)
starts the selection.
Definition: selection.h:145
Okteta::ByteArrayTableRanges::ChangedRanges
CoordRangeList ChangedRanges
Definition: bytearraytableranges.h:119
KDE::NumberRange::nextBeforeStart
N nextBeforeStart() const
Definition: numberrange.h:143
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:04:07 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