diff options
Diffstat (limited to 'freebsdtvision/demo/ascii.cc')
-rw-r--r-- | freebsdtvision/demo/ascii.cc | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/freebsdtvision/demo/ascii.cc b/freebsdtvision/demo/ascii.cc new file mode 100644 index 0000000..fd4d6b4 --- /dev/null +++ b/freebsdtvision/demo/ascii.cc @@ -0,0 +1,305 @@ +/*----------------------------------------------------------*/ +/* */ +/* Ascii.cpp: Member functions of following classes: */ +/* TTable */ +/* TReport */ +/* TAsciiChart */ +/* */ +/*----------------------------------------------------------*/ +/* + * Turbo Vision - Version 2.0 + * + * Copyright (c) 1994 by Borland International + * All Rights Reserved. + * + * Modified by Sergio Sigala <sergio@sigala.it> + * Modified by Max Okumoto <okumoto@ucsd.edu> + */ + +#include "ascii.h" + +#define Uses_TRect +#define Uses_TEvent +#define Uses_TKeys +#define Uses_TDrawBuffer +#define Uses_TStreamableClass +#define Uses_TStreamable +#define Uses_TView +#define Uses_TWindow +#include <tvision/tv.h> +__link( RView ) +__link( RWindow ) + +#include <string.h> +#include <stdlib.h> +#include <ctype.h> + +#include <iomanip> +#include <ios> +#include <sstream> +#include <string> + +using std::ios; +using std::ostringstream; +using std::string; + +// +// TTable functions +// + +const char * const TTable::name = "TTable"; + + +void TTable::write( opstream& os ) +{ + TView::write( os ); +} + + +void *TTable::read( ipstream& is ) +{ + TView::read( is ); + return this; +} + + +TStreamable *TTable::build() +{ + return new TTable( streamableInit ); +} + + +TStreamableClass RTable( TTable::name, + TTable::build, + __DELTA(TTable) + ); + + +TTable::TTable(TRect& r) : + TView( r ) +{ + eventMask |= evKeyboard; +} + + +void TTable::draw() +{ + TDrawBuffer buf; + char color = getColor(6); + + for(ushort y = 0; y <= size.y-1; y++) + { + buf.moveChar(0, ' ', color, (short)size.x ); + for(ushort x = 0; x <= size.x-1; x++) + buf.moveChar(x, (ushort)(32*y+x), color, (ushort)1 ); + writeLine(0, y, (short)size.x, (ushort)1, buf); + } + showCursor(); +} + +// +// cmCharFocused is a offset value (basically the ascii code of the +// current selected character) thus should be added, not or'ed, to +// cmAsciiTableCmdBase. +// + +void TTable::charFocused() +{ + message(owner, evBroadcast, cmAsciiTableCmdBase + cmCharFocused, + (void *) (cursor.x + 32 * cursor.y)); +} + + +void TTable::handleEvent(TEvent& event) +{ + TView::handleEvent(event); + + if (event.what == evMouseDown) + { + do + { + if(mouseInView(event.mouse.where)) + { + TPoint spot = makeLocal(event.mouse.where); + setCursor(spot.x, spot.y); + charFocused(); + } + } while (mouseEvent(event, evMouseMove)); + clearEvent(event); + } + else + { + if (event.what == evKeyboard) + { + switch (event.keyDown.keyCode) + { + case kbHome: + setCursor(0,0); + break; + case kbEnd: + setCursor(size.x-1, size.y-1); + break; + case kbUp: + if (cursor.y > 0) + setCursor(cursor.x, cursor.y-1); + break; + case kbDown: + if (cursor.y < size.y-1) + setCursor(cursor.x, cursor.y+1); + break; + case kbLeft: + if (cursor.x > 0) + setCursor(cursor.x-1, cursor.y); + break; + case kbRight: + if (cursor.x < size.x-1) + setCursor(cursor.x+1, cursor.y); + break; + default: + setCursor(event.keyDown.charScan.charCode % 32, + event.keyDown.charScan.charCode / 32); + break; + } + charFocused(); + clearEvent(event); + } + } +} + + +// +// TReport functions +// + +const char * const TReport::name = "TReport"; + + +void TReport::write( opstream& os ) +{ + TView::write( os ); + os << asciiChar; +} + + +void *TReport::read( ipstream& is ) +{ + TView::read( is ); + is >> asciiChar; + return this; +} + + +TStreamable *TReport::build() +{ + return new TReport( streamableInit ); +} + + +TStreamableClass RReport( TReport::name, + TReport::build, + __DELTA(TReport) + ); + + +TReport::TReport(TRect& r) : + TView(r) +{ + asciiChar = 0; +} + + +void TReport::draw() +{ + TDrawBuffer buf; + char color = getColor(6); + string str; + ostringstream statusStr(str); + + statusStr + << " Char: " << (char ) ((asciiChar == 0) ? 0x20 : asciiChar) + << " Decimal: " << std::setw(3) << (int) asciiChar + << " Hex " << std::hex << std::setiosflags(ios::uppercase) + << std::setw(2) << (int) asciiChar << " " << std::ends; + + buf.moveStr(0, str.c_str(), color); + writeLine(0, 0, 32, 1, buf); +} + + +void TReport::handleEvent(TEvent& event) +{ + TView::handleEvent(event); + if (event.what == evBroadcast) + { + if (event.message.command == cmAsciiTableCmdBase + cmCharFocused) + { + asciiChar = event.message.infoLong; + drawView(); + } + } +} + + +// +// TAsciiChart functions +// + +const char * const TAsciiChart::name = "TAsciiChart"; + + +void TAsciiChart::write( opstream& os ) +{ + TWindow::write( os ); +} + + +void *TAsciiChart::read( ipstream& is ) +{ + TWindow::read( is ); + return this; +} + + +TStreamable *TAsciiChart::build() +{ + return new TAsciiChart( streamableInit ); +} + + +TStreamableClass RAsciiChart( TAsciiChart::name, + TAsciiChart::build, + __DELTA(TAsciiChart) + ); + + +TAsciiChart::TAsciiChart() : + TWindow(TRect(0, 0, 34, 12), "ASCII Chart", wnNoNumber), + TWindowInit( &TAsciiChart::initFrame ) +{ + TView *control; + + flags &= ~(wfGrow | wfZoom); + palette = wpGrayWindow; + + TRect r = getExtent(); + r.grow(-1, -1); + r.a.y = r.b.y - 1; + control = new TReport( r ); + control->options |= ofFramed; + control->eventMask |= evBroadcast; + insert(control); + + r = getExtent(); + r.grow(-1, -1); + r.b.y = r.b.y - 2; + control = new TTable( r ); + control->options |= ofFramed; + control->options |= ofSelectable; + control->blockCursor(); + insert(control); + control->select(); +} + +void TAsciiChart::handleEvent( TEvent &event ) { + TWindow::handleEvent( event ); +} |