155 lines
3.2 KiB
C++
155 lines
3.2 KiB
C++
#include "ulib.hxx"
|
|
#include "vscroll.hxx"
|
|
|
|
BOOLEAN
|
|
VERTICAL_TEXT_SCROLL::Initialize(
|
|
IN HWND WindowHandle,
|
|
IN INT NumLines,
|
|
IN INT ClientHeight,
|
|
IN INT ClientWidth,
|
|
IN INT CharHeight,
|
|
IN INT CharWidth
|
|
)
|
|
{
|
|
_client_height = ClientHeight;
|
|
_client_width = ClientWidth;
|
|
_char_height = CharHeight;
|
|
_char_width = CharWidth;
|
|
_scroll_position = 0;
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::SetRange(
|
|
IN HWND WindowHandle,
|
|
IN INT NumLines
|
|
)
|
|
{
|
|
_num_lines = NumLines - _client_height/_char_height;
|
|
SetScrollRange(WindowHandle, SB_VERT, 0, _num_lines, FALSE);
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::ClientSize(
|
|
IN INT Height,
|
|
IN INT Width
|
|
)
|
|
{
|
|
_client_height = Height;
|
|
_client_width = Width;
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::ScrollUp(
|
|
IN HWND WindowHandle
|
|
)
|
|
{
|
|
_scroll_position--;
|
|
UpdateScrollPosition(WindowHandle);
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::ScrollDown(
|
|
IN HWND WindowHandle
|
|
)
|
|
{
|
|
_scroll_position++;
|
|
UpdateScrollPosition(WindowHandle);
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::PageUp(
|
|
IN HWND WindowHandle
|
|
)
|
|
{
|
|
_scroll_position -= _client_height/_char_height;
|
|
UpdateScrollPosition(WindowHandle);
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::PageDown(
|
|
IN HWND WindowHandle
|
|
)
|
|
{
|
|
_scroll_position += _client_height/_char_height;
|
|
UpdateScrollPosition(WindowHandle);
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::ThumbPosition(
|
|
IN HWND WindowHandle,
|
|
IN INT NewThumbPosition
|
|
)
|
|
{
|
|
_scroll_position = NewThumbPosition;
|
|
UpdateScrollPosition(WindowHandle);
|
|
}
|
|
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::UpdateScrollPosition(
|
|
IN HWND WindowHandle
|
|
)
|
|
{
|
|
INT current_pos;
|
|
|
|
current_pos = GetScrollPos(WindowHandle, SB_VERT);
|
|
_scroll_position = max(0, min(_scroll_position, _num_lines));
|
|
|
|
if (_scroll_position != current_pos) {
|
|
SetScrollPos(WindowHandle, SB_VERT, _scroll_position, TRUE);
|
|
ScrollWindow(WindowHandle, 0,
|
|
QueryCharHeight()*(current_pos - _scroll_position),
|
|
NULL, NULL);
|
|
UpdateWindow(WindowHandle);
|
|
}
|
|
}
|
|
|
|
STATIC TCHAR buf[1024];
|
|
|
|
VOID
|
|
VERTICAL_TEXT_SCROLL::WriteLine(
|
|
IN HDC DeviceContext,
|
|
IN INT LineNumber,
|
|
IN PTCHAR String
|
|
)
|
|
{
|
|
if( LineNumber >= QueryScrollPosition() &&
|
|
LineNumber <= QueryScrollPosition() + QueryClientHeight()/QueryCharHeight() + 1) {
|
|
|
|
CONST INT tabstop = 8;
|
|
INT pos, bufpos;
|
|
|
|
//
|
|
// Copy string into buf, expanding tabs into spaces as we go. This
|
|
// is because the window to which we are displaying does not do tabs.
|
|
//
|
|
|
|
for (pos = 0, bufpos = 0; String[pos] != '\0'; ++pos) {
|
|
if ('\t' == String[pos]) {
|
|
do {
|
|
buf[bufpos++] = ' ';
|
|
} while (0 != bufpos % tabstop);
|
|
|
|
continue;
|
|
}
|
|
|
|
buf[bufpos++] = String[pos];
|
|
}
|
|
buf[bufpos++] = '\0';
|
|
|
|
TextOut( DeviceContext,
|
|
0,
|
|
(LineNumber - QueryScrollPosition())*QueryCharHeight(),
|
|
buf,
|
|
wcslen( buf ) );
|
|
}
|
|
}
|