xref: /haiku/src/kits/interface/textview_support/LineBuffer.cpp (revision 04a0e9c7b68cbe3a43d38e2bca8e860fd80936fb)
1  /*
2   * Copyright 2001-2006, Haiku, Inc. All Rights Reserved.
3   * Distributed under the terms of the MIT License.
4   *
5   * Authors:
6   *		Marc Flerackers (mflerackers@androme.be)
7   */
8  
9  
10  #include "LineBuffer.h"
11  
12  
13  BTextView::LineBuffer::LineBuffer()
14  	:	_BTextViewSupportBuffer_<STELine>(20, 2)
15  {
16  }
17  
18  
19  BTextView::LineBuffer::~LineBuffer()
20  {
21  }
22  
23  
24  void
25  BTextView::LineBuffer::InsertLine(STELine* inLine, int32 index)
26  {
27  	InsertItemsAt(1, index, inLine);
28  }
29  
30  
31  void
32  BTextView::LineBuffer::RemoveLines(int32 index, int32 count)
33  {
34  	RemoveItemsAt(count, index);
35  }
36  
37  
38  void
39  BTextView::LineBuffer::RemoveLineRange(int32 fromOffset, int32 toOffset)
40  {
41  	int32 fromLine = OffsetToLine(fromOffset);
42  	int32 toLine = OffsetToLine(toOffset);
43  
44  	int32 count = toLine - fromLine;
45  	if (count > 0)
46  		RemoveLines(fromLine + 1, count);
47  
48  	BumpOffset(fromOffset - toOffset, fromLine + 1);
49  }
50  
51  
52  int32
53  BTextView::LineBuffer::OffsetToLine(int32 offset) const
54  {
55  	int32 minIndex = 0;
56  	int32 maxIndex = fItemCount - 1;
57  	int32 index = 0;
58  
59  	while (minIndex < maxIndex) {
60  		index = (minIndex + maxIndex) >> 1;
61  		if (offset >= fBuffer[index].offset) {
62  			if (offset < fBuffer[index + 1].offset)
63  				break;
64  			else
65  				minIndex = index + 1;
66  		} else
67  			maxIndex = index;
68  	}
69  
70  	return index;
71  }
72  
73  
74  int32
75  BTextView::LineBuffer::PixelToLine(float pixel) const
76  {
77  	int32 minIndex = 0;
78  	int32 maxIndex = fItemCount - 1;
79  	int32 index = 0;
80  
81  	while (minIndex < maxIndex) {
82  		index = (minIndex + maxIndex) >> 1;
83  		if (pixel >= fBuffer[index].origin) {
84  			if (pixel < fBuffer[index + 1].origin)
85  				break;
86  			else
87  				minIndex = index + 1;
88  		} else
89  			maxIndex = index;
90  	}
91  
92  	return index;
93  }
94  
95  
96  void
97  BTextView::LineBuffer::BumpOrigin(float delta, int32 index)
98  {
99  	for (long i = index; i < fItemCount; i++)
100  		fBuffer[i].origin += delta;
101  }
102  
103  
104  void
105  BTextView::LineBuffer::BumpOffset(int32 delta, int32 index)
106  {
107  	for (long i = index; i < fItemCount; i++)
108  		fBuffer[i].offset += delta;
109  }
110  
111  
112  float
113  BTextView::LineBuffer::MaxWidth() const
114  {
115  	if (fItemCount == 0)
116  		return 0;
117  
118  	float maxWidth = 0;
119  	STELine* line = &fBuffer[0];
120  	for (int32 i = 0; i < fItemCount; i++) {
121  		if (maxWidth < line->width)
122  			maxWidth = line->width;
123  		line++;
124  	}
125  	return maxWidth;
126  }
127