summaryrefslogtreecommitdiff
path: root/freebsdtvision/demo/ascii.cc
diff options
context:
space:
mode:
Diffstat (limited to 'freebsdtvision/demo/ascii.cc')
-rw-r--r--freebsdtvision/demo/ascii.cc305
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 );
+}