GNU Octave
3.8.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
Main Page
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Pages
libgui
qterminal
libqterminal
unix
ScreenWindow.cpp
Go to the documentation of this file.
1
/*
2
Copyright (C) 2007, 2013 by Robert Knight <robertknight@gmail.com>
3
4
Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008
5
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
15
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301 USA.
20
*/
21
22
// Own
23
#include "
unix/ScreenWindow.h
"
24
25
// Qt
26
#include <QtCore>
27
28
// Konsole
29
#include "
unix/Screen.h
"
30
31
ScreenWindow::ScreenWindow
(
QObject
* parent)
32
:
QObject
(parent)
33
, _windowBuffer(0)
34
, _windowBufferSize(0)
35
, _bufferNeedsUpdate(true)
36
, _windowLines(1)
37
, _currentLine(0)
38
, _trackOutput(true)
39
, _scrollCount(0)
40
{
41
}
42
43
ScreenWindow::~ScreenWindow
()
44
{
45
delete
[]
_windowBuffer
;
46
}
47
void
ScreenWindow::setScreen
(
Screen
* screen)
48
{
49
Q_ASSERT( screen );
50
51
_screen
=
screen
;
52
}
53
54
Screen
*
ScreenWindow::screen
()
const
55
{
56
return
_screen
;
57
}
58
59
Character
*
ScreenWindow::getImage
()
60
{
61
// reallocate internal buffer if the window size has changed
62
int
size
=
windowLines
() *
windowColumns
();
63
if
(
_windowBuffer
== 0 ||
_windowBufferSize
!= size)
64
{
65
delete
[]
_windowBuffer
;
66
_windowBufferSize
=
size
;
67
_windowBuffer
=
new
Character
[
size
];
68
_bufferNeedsUpdate
=
true
;
69
}
70
71
if
(!
_bufferNeedsUpdate
)
72
return
_windowBuffer
;
73
74
_screen
->
getImage
(
_windowBuffer
,size,
75
currentLine
(),
endWindowLine
());
76
77
// this window may look beyond the end of the screen, in which
78
// case there will be an unused area which needs to be filled
79
// with blank characters
80
fillUnusedArea
();
81
82
_bufferNeedsUpdate
=
false
;
83
return
_windowBuffer
;
84
}
85
86
void
ScreenWindow::fillUnusedArea
()
87
{
88
int
screenEndLine =
_screen
->
getHistLines
() +
_screen
->
getLines
() - 1;
89
int
windowEndLine =
currentLine
() +
windowLines
() - 1;
90
91
int
unusedLines = windowEndLine - screenEndLine;
92
int
charsToFill = unusedLines *
windowColumns
();
93
94
Screen::fillWithDefaultChar
(
_windowBuffer
+
_windowBufferSize
- charsToFill,charsToFill);
95
}
96
97
// return the index of the line at the end of this window, or if this window
98
// goes beyond the end of the screen, the index of the line at the end
99
// of the screen.
100
//
101
// when passing a line number to a Screen method, the line number should
102
// never be more than endWindowLine()
103
//
104
int
ScreenWindow::endWindowLine
()
const
105
{
106
return
qMin(
currentLine
() +
windowLines
() - 1,
107
lineCount
() - 1);
108
}
109
QVector<LineProperty>
ScreenWindow::getLineProperties
()
110
{
111
QVector<LineProperty> result =
_screen
->
getLineProperties
(
currentLine
(),
endWindowLine
());
112
113
if
(result.count() !=
windowLines
())
114
result.resize(
windowLines
());
115
116
return
result;
117
}
118
119
QString
ScreenWindow::selectedText
(
bool
preserveLineBreaks )
const
120
{
121
return
_screen
->
selectedText
( preserveLineBreaks );
122
}
123
124
void
ScreenWindow::getSelectionStart
(
int
& column ,
int
&
line
)
125
{
126
_screen
->
getSelectionStart
(column,line);
127
line -=
currentLine
();
128
}
129
void
ScreenWindow::getSelectionEnd
(
int
& column ,
int
&
line
)
130
{
131
_screen
->
getSelectionEnd
(column,line);
132
line -=
currentLine
();
133
}
134
void
ScreenWindow::setSelectionStart
(
int
column ,
int
line
,
bool
columnMode )
135
{
136
_screen
->
setSelectionStart
( column , qMin(line +
currentLine
(),
endWindowLine
()) , columnMode);
137
138
_bufferNeedsUpdate
=
true
;
139
emit
selectionChanged
();
140
}
141
142
void
ScreenWindow::setSelectionEnd
(
int
column ,
int
line
)
143
{
144
_screen
->
setSelectionEnd
( column , qMin(line +
currentLine
(),
endWindowLine
()) );
145
146
_bufferNeedsUpdate
=
true
;
147
emit
selectionChanged
();
148
}
149
150
bool
ScreenWindow::isSelected
(
int
column ,
int
line
)
151
{
152
return
_screen
->
isSelected
( column , qMin(line +
currentLine
(),
endWindowLine
()) );
153
}
154
155
void
ScreenWindow::clearSelection
()
156
{
157
_screen
->
clearSelection
();
158
159
emit
selectionChanged
();
160
}
161
162
void
ScreenWindow::setWindowLines
(
int
lines)
163
{
164
Q_ASSERT(lines > 0);
165
_windowLines
= lines;
166
}
167
int
ScreenWindow::windowLines
()
const
168
{
169
return
_windowLines
;
170
}
171
172
int
ScreenWindow::windowColumns
()
const
173
{
174
return
_screen
->
getColumns
();
175
}
176
177
int
ScreenWindow::lineCount
()
const
178
{
179
return
_screen
->
getHistLines
() +
_screen
->
getLines
();
180
}
181
182
int
ScreenWindow::columnCount
()
const
183
{
184
return
_screen
->
getColumns
();
185
}
186
187
QPoint
ScreenWindow::cursorPosition
()
const
188
{
189
QPoint position;
190
191
position.setX(
_screen
->
getCursorX
() );
192
position.setY(
_screen
->
getCursorY
() );
193
194
return
position;
195
}
196
197
int
ScreenWindow::currentLine
()
const
198
{
199
return
qBound(0,
_currentLine
,
lineCount
()-
windowLines
());
200
}
201
202
void
ScreenWindow::scrollBy
(
RelativeScrollMode
mode ,
int
amount )
203
{
204
if
( mode ==
ScrollLines
)
205
{
206
scrollTo
(
currentLine
() + amount );
207
}
208
else
if
( mode ==
ScrollPages
)
209
{
210
scrollTo
(
currentLine
() + amount * (
windowLines
() / 2 ) );
211
}
212
}
213
214
bool
ScreenWindow::atEndOfOutput
()
const
215
{
216
return
currentLine
() == (
lineCount
()-
windowLines
());
217
}
218
219
void
ScreenWindow::scrollTo
(
int
line
)
220
{
221
int
maxCurrentLineNumber =
lineCount
() -
windowLines
();
222
line = qBound(0,line,maxCurrentLineNumber);
223
224
const
int
delta = line -
_currentLine
;
225
_currentLine = line;
226
227
// keep track of number of lines scrolled by,
228
// this can be reset by calling resetScrollCount()
229
_scrollCount
+= delta;
230
231
_bufferNeedsUpdate
=
true
;
232
233
emit
scrolled
(_currentLine);
234
}
235
236
void
ScreenWindow::setTrackOutput
(
bool
trackOutput)
237
{
238
_trackOutput
=
trackOutput
;
239
}
240
241
bool
ScreenWindow::trackOutput
()
const
242
{
243
return
_trackOutput
;
244
}
245
246
int
ScreenWindow::scrollCount
()
const
247
{
248
return
_scrollCount
;
249
}
250
251
void
ScreenWindow::resetScrollCount
()
252
{
253
_scrollCount
= 0;
254
}
255
256
QRect
ScreenWindow::scrollRegion
()
const
257
{
258
bool
equalToScreenSize =
windowLines
() ==
_screen
->
getLines
();
259
260
if
(
atEndOfOutput
() && equalToScreenSize )
261
return
_screen
->
lastScrolledRegion
();
262
else
263
return
QRect(0,0,
windowColumns
(),
windowLines
());
264
}
265
266
void
ScreenWindow::notifyOutputChanged
()
267
{
268
// move window to the bottom of the screen and update scroll count
269
// if this window is currently tracking the bottom of the screen
270
if
(
_trackOutput
)
271
{
272
_scrollCount
-=
_screen
->
scrolledLines
();
273
_currentLine
= qMax(0,
_screen
->
getHistLines
() - (
windowLines
()-
_screen
->
getLines
()));
274
}
275
else
276
{
277
// if the history is not unlimited then it may
278
// have run out of space and dropped the oldest
279
// lines of output - in this case the screen
280
// window's current line number will need to
281
// be adjusted - otherwise the output will scroll
282
_currentLine
= qMax(0,
_currentLine
-
283
_screen
->
droppedLines
());
284
285
// ensure that the screen window's current position does
286
// not go beyond the bottom of the screen
287
_currentLine
= qMin( _currentLine ,
_screen
->
getHistLines
() );
288
}
289
290
_bufferNeedsUpdate
=
true
;
291
292
emit
outputChanged
();
293
}
294
Generated on Mon Dec 30 2013 03:04:20 for GNU Octave by
1.8.1.2