summaryrefslogtreecommitdiff
path: root/rhtvision/examples/tutorial/tvguid12.cc
diff options
context:
space:
mode:
Diffstat (limited to 'rhtvision/examples/tutorial/tvguid12.cc')
-rw-r--r--rhtvision/examples/tutorial/tvguid12.cc314
1 files changed, 314 insertions, 0 deletions
diff --git a/rhtvision/examples/tutorial/tvguid12.cc b/rhtvision/examples/tutorial/tvguid12.cc
new file mode 100644
index 0000000..f70a979
--- /dev/null
+++ b/rhtvision/examples/tutorial/tvguid12.cc
@@ -0,0 +1,314 @@
+/*---------------------------------------------------------*/
+/* */
+/* Turbo Vision 1.0 */
+/* TVGUID12 Demo Source File */
+/* Copyright (c) 1991 by Borland International */
+/* */
+/*---------------------------------------------------------*/
+/*
+ * Modified by Sergio Sigala <ssigala@globalnet.it>
+ */
+/*
+ Taked from the Sergio Sigala <ssigala@globalnet.it> Turbo Vision port to
+UNIX.
+ LSM: TurboVision for UNIX
+ ftp://sunsite.unc.edu /pub/Linux/devel/lang/c++/tvision-0.6.tar.gz
+ Copying policy: BSD
+ Adapted by Salvador Eduardo Tropea (SET) <set-soft@usa.net>.
+*/
+
+// same as tvguid11 except for making the dialog modal
+// modify TMyApp::newDialog
+
+#define Uses_stdlib // for exit(), rand()
+#define Uses_iostream
+#define Uses_fstream
+#define Uses_stdio // for puts() etc
+#define Uses_string // for strlen etc
+#define Uses_ctype
+#define Uses_IfStreamGetLine
+
+#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
+#include <tv.h>
+
+UsingNamespaceStd
+
+const int cmMyFileOpen = 200; // assign new command values
+const int cmMyNewWin = 201;
+
+// added for dialog menu
+const int cmNewDialog = 202;
+
+/* SS: micro change here */
+
+const char *fileToRead = "tvguid12.cc";
+//const char *fileToRead = "tvguid12.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();
+};
+
+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 &&
+ IfStreamGetLine(fileToView,buf,maxLineLength) )
+ {
+ 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) :
+ TWindowInit( &TDemoWindow::initFrame ),
+ TWindow( bounds, aTitle, aNumber)
+{
+ 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( rand() % 34, rand() % 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 tvguid11: now calls execView
+void TMyApp::newDialog()
+{
+ TRect r( 0, 0, 40, 13 );
+
+ /* SS: micro change here */
+
+ r.move( rand() % 39, rand() % 10 );
+ deskTop->execView( new TDialog( r, "Demo Dialog" ));
+}
+
+int main()
+{
+ readFile( fileToRead );
+ TMyApp myApp;
+ myApp.run();
+ deleteFile();
+ return 0;
+}