summaryrefslogtreecommitdiff
path: root/freebsdtvision/tutorial/tvguid14.cc
diff options
context:
space:
mode:
Diffstat (limited to 'freebsdtvision/tutorial/tvguid14.cc')
-rw-r--r--freebsdtvision/tutorial/tvguid14.cc338
1 files changed, 338 insertions, 0 deletions
diff --git a/freebsdtvision/tutorial/tvguid14.cc b/freebsdtvision/tutorial/tvguid14.cc
new file mode 100644
index 0000000..c54832e
--- /dev/null
+++ b/freebsdtvision/tutorial/tvguid14.cc
@@ -0,0 +1,338 @@
+/*---------------------------------------------------------*/
+/* */
+/* Turbo Vision 1.0 */
+/* TVGUID14 Demo Source File */
+/* Copyright (c) 1991 by Borland International */
+/* */
+/*---------------------------------------------------------*/
+/*
+ * Modified by Sergio Sigala <sergio@sigala.it>
+ * Modified by Max Okumoto <okumoto@ucsd.edu>
+ */
+
+// same as tvguid13 except for extra checkboxes, radiobuttons, and labels
+// modify TMyApp::newDialog
+
+#define Uses_TEventQueue
+#define Uses_TEvent
+#define Uses_TProgram
+#define Uses_TApplication
+#define Uses_TKeys
+#define Uses_TRect
+#define Uses_TMenuBar
+#define Uses_TSubMenu
+#define Uses_TMenuItem
+#define Uses_TStatusLine
+#define Uses_TStatusItem
+#define Uses_TStatusDef
+#define Uses_TDeskTop
+#define Uses_TView
+#define Uses_TWindow
+#define Uses_TScroller
+#define Uses_TScrollBar
+#define Uses_TDialog
+#define Uses_TButton
+#define Uses_TSItem
+#define Uses_TCheckBoxes
+#define Uses_TRadioButtons
+#define Uses_TLabel
+#include <tvision/tv.h>
+
+#include <iostream>
+#include <fstream>
+
+#include <stdlib.h> // for exit(), random()
+#include <stdio.h> // for puts() etc
+#include <string.h> // for strlen etc
+#include <ctype.h>
+
+using std::cout;
+using std::endl;
+using std::ifstream;
+
+// note the extra #defines above
+
+const int cmMyFileOpen = 200; // assign new command values
+const int cmMyNewWin = 201;
+const int cmNewDialog = 202;
+
+/* SS: micro change here */
+
+const char *fileToRead = "tvguid14.cc";
+//const char *fileToRead = "tvguid14.cpp";
+const int maxLineLength = maxViewWidth+1;
+const int maxLines = 100;
+char *lines[maxLines];
+int lineCount = 0;
+static short winNumber = 0; // initialize window number
+
+class TMyApp : public TApplication
+{
+
+public:
+ TMyApp();
+ static TStatusLine *initStatusLine( TRect r );
+ static TMenuBar *initMenuBar( TRect r );
+ virtual void handleEvent( TEvent& event);
+ void newWindow();
+ void newDialog();
+ // added member
+};
+
+class TInterior : public TScroller
+{
+
+public:
+
+ TInterior( const TRect& bounds, TScrollBar *aHScrollBar,
+ TScrollBar *aVScrollBar ); // constructor
+ virtual void draw(); // override TView::draw
+};
+
+class TDemoWindow : public TWindow // define a new window class
+{
+
+public:
+
+ TDemoWindow( const TRect& bounds, const char *aTitle, short aNumber );
+ TInterior *makeInterior( const TRect& r, Boolean left );
+ virtual void sizeLimits( TPoint& minP, TPoint& maxP );
+ // override TWindow::sizeLimits
+
+private:
+
+ TInterior *lInterior, *rInterior;
+
+};
+
+void readFile( const char *fileName )
+{
+ ifstream fileToView( fileName );
+ if( !fileToView )
+ {
+ cout << "Invalid file name..." << endl;
+ exit( 1 );
+ }
+ else
+ {
+ char buf[maxLineLength];
+ while( lineCount < maxLines &&
+ fileToView.getline( buf, maxLineLength ) != 0 )
+ {
+ lines[lineCount] = newStr( buf );
+ lineCount++;
+ }
+ }
+}
+
+void deleteFile()
+{
+ for( int i = 0; i < lineCount; i++ )
+ delete lines[i];
+}
+
+TInterior::TInterior( const TRect& bounds, TScrollBar *aHScrollBar,
+ TScrollBar *aVScrollBar ) :
+ TScroller( bounds, aHScrollBar, aVScrollBar )
+{
+ options = options | ofFramed;
+ setLimit( maxLineLength, lineCount );
+}
+
+void TInterior::draw() // modified for scroller
+{
+ ushort color = getColor(0x0301);
+ for( int i = 0; i < size.y; i++ )
+ // for each line:
+ {
+ TDrawBuffer b;
+ b.moveChar( 0, ' ', color, size.x );
+ // fill line buffer with spaces
+ int j = delta.y + i; // delta is scroller offset
+ if( j < lineCount && lines[j] != 0 )
+ {
+ char s[maxLineLength];
+ if( delta.x > (int)strlen(lines[j] ) )
+ s[0] = EOS;
+ else
+ {
+ strncpy( s, lines[j]+delta.x, size.x );
+ s[size.x] = EOS;
+ }
+ b.moveCStr( 0, s, color );
+ }
+ writeLine( 0, i, size.x, 1, b);
+ }
+
+}
+
+// modified from tvguid08:
+TDemoWindow::TDemoWindow( const TRect& bounds, const char *aTitle,
+ short aNumber) :
+ TWindow( bounds, aTitle, aNumber),
+ TWindowInit( &TDemoWindow::initFrame )
+{
+ TRect lbounds = getExtent();
+ TRect r( lbounds.a.x, lbounds.a.y, lbounds.b.x/2+1, lbounds.b.y );
+ lInterior = makeInterior( r, True );
+ lInterior->growMode = gfGrowHiY;
+ insert( lInterior );
+ // creates left-side scrollable interior and inserts into window
+ r = TRect( lbounds.b.x/2, lbounds.a.y, lbounds.b.x, lbounds.b.y );
+ rInterior = makeInterior( r, False );
+ rInterior->growMode = gfGrowHiX | gfGrowHiY;
+ insert( rInterior );
+ // likewise for right-side scroller
+}
+
+TInterior *TDemoWindow::makeInterior( const TRect& bounds, Boolean left )
+{
+ TRect r = TRect( bounds.b.x-1, bounds.a.y+1, bounds.b.x, bounds.b.y-1 );
+ TScrollBar *vScrollBar = new TScrollBar( r );
+ if( vScrollBar == 0 )
+ {
+ cout << "vScrollbar init error" << endl;
+ exit(1);
+ }
+ // production code would display error dialog box
+ vScrollBar->options |= ofPostProcess;
+ if( left )
+ vScrollBar->growMode = gfGrowHiY;
+ insert( vScrollBar );
+
+ r = TRect( bounds.a.x+2, bounds.b.y-1, bounds.b.x-2, bounds.b.y );
+ TScrollBar *hScrollBar = new TScrollBar( r );
+ if( hScrollBar == 0 )
+ {
+ cout << "hScrollbar init error" << endl;
+ exit(1);
+ }
+ hScrollBar->options |= ofPostProcess;
+ if( left )
+ hScrollBar->growMode = (gfGrowHiY | gfGrowLoY);
+ insert( hScrollBar );
+
+ r = bounds;
+ r.grow( -1, -1 );
+ return new TInterior( r, hScrollBar, vScrollBar );
+}
+
+void TDemoWindow::sizeLimits( TPoint& minP, TPoint& maxP )
+{
+ TWindow::sizeLimits( minP, maxP );
+ minP.x = lInterior->size.x+9;
+}
+
+TMyApp::TMyApp() :
+ TProgInit( &TMyApp::initStatusLine,
+ &TMyApp::initMenuBar,
+ &TMyApp::initDeskTop
+ )
+{
+}
+
+void TMyApp::handleEvent(TEvent& event)
+{
+ TApplication::handleEvent(event);
+ if( event.what == evCommand )
+ {
+ switch( event.message.command )
+ {
+ case cmMyNewWin:
+ newWindow();
+ break;
+ case cmNewDialog:
+ newDialog();
+ break;
+ default:
+ return;
+ }
+ clearEvent( event ); // clear event after handling
+ }
+}
+
+TMenuBar *TMyApp::initMenuBar( TRect r )
+{
+ r.b.y = r.a.y + 1; // set bottom line 1 line below top line
+ return new TMenuBar( r,
+ *new TSubMenu( "~F~ile", kbAltF )+
+ *new TMenuItem( "~O~pen", cmMyFileOpen, kbF3, hcNoContext, "F3" )+
+ *new TMenuItem( "~N~ew", cmMyNewWin, kbF4, hcNoContext, "F4" )+
+ newLine()+
+ *new TMenuItem( "E~x~it", cmQuit, cmQuit, hcNoContext, "Alt-X" )+
+ *new TSubMenu( "~W~indow", kbAltW )+
+ *new TMenuItem( "~N~ext", cmNext, kbF6, hcNoContext, "F6" )+
+ *new TMenuItem( "~Z~oom", cmZoom, kbF5, hcNoContext, "F5" )+
+ *new TMenuItem( "~D~ialog", cmNewDialog, kbF2, hcNoContext, "F2" )
+ // new dialog menu added here
+ );
+}
+
+TStatusLine *TMyApp::initStatusLine( TRect r )
+{
+ r.a.y = r.b.y - 1; // move top to 1 line above bottom
+ return new TStatusLine( r,
+ *new TStatusDef( 0, 0xFFFF ) +
+ // set range of help contexts
+ *new TStatusItem( 0, kbF10, cmMenu ) +
+ // define an item
+ *new TStatusItem( "~Alt-X~ Exit", kbAltX, cmQuit ) +
+ // and another one
+ *new TStatusItem( "~Alt-F3~ Close", kbAltF3, cmClose )
+ // and another one
+ );
+}
+
+void TMyApp::newWindow()
+{
+ TRect r( 0, 0, 45, 13 ); // set initial size and position
+
+ /* SS: micro change here */
+
+ //r.move( random(34), random(11) ); // randomly move around screen
+ r.move( random() % 34, random() % 11 ); // randomly move around screen
+ TDemoWindow *window = new TDemoWindow ( r, "Demo Window", ++winNumber);
+ deskTop->insert(window); // put window into desktop and draw it
+}
+
+// changed from tvguid12: add buttons
+void TMyApp::newDialog()
+{
+ TDialog *pd = new TDialog( TRect( 20, 6, 60, 19), "Demo Dialog" );
+ if( pd )
+ {
+ TView *b = new TCheckBoxes( TRect( 3, 3, 18, 6),
+ new TSItem( "~H~varti",
+ new TSItem( "~T~ilset",
+ new TSItem( "~J~arlsberg", 0 )
+ )));
+ pd->insert( b );
+
+ pd->insert( new TLabel( TRect( 2, 2, 10, 3), "Cheeses", b ));
+
+ b = new TRadioButtons( TRect( 22, 3, 34, 6),
+ new TSItem( "~S~olid",
+ new TSItem( "~R~unny",
+ new TSItem( "~M~elted", 0 )
+ )));
+ pd->insert( b );
+
+ pd->insert( new TLabel( TRect( 21, 2, 33, 3), "Consistency", b ));
+
+ pd->insert( new TButton( TRect( 15, 10, 25, 12 ), "~O~K", cmOK,
+ bfDefault ));
+ pd->insert( new TButton( TRect( 28, 10, 38, 12 ), "~C~ancel", cmCancel,
+ bfNormal ));
+ deskTop->execView( pd );
+ }
+ destroy( pd );
+}
+
+int main()
+{
+ readFile( fileToRead );
+ TMyApp myApp;
+ myApp.run();
+ deleteFile();
+ return 0;
+}