xref: /haiku/src/kits/interface/textview_support/LineBuffer.cpp (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
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