home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tv20cpp.zip / tutorial / tvguid14.cpp < prev    next >
C/C++ Source or Header  |  1998-01-19  |  10KB  |  333 lines

  1. /*---------------------------------------------------------*/
  2. /*                                                         */
  3. /*   Turbo Vision 1.0                                      */
  4. /*   TVGUID14 Demo Source File                             */
  5. /*   Copyright (c) 1991 by Borland International           */
  6. /*                                                         */
  7. /*---------------------------------------------------------*/
  8. /*
  9.  * Modified by Sergio Sigala <ssigala@globalnet.it>
  10.  */
  11.  
  12. // same as tvguid13 except for extra checkboxes, radiobuttons, and labels
  13. // modify TMyApp::newDialog
  14.  
  15. #include <stdlib.h>             // for exit(), random()
  16. #include <iostream.h>
  17. #include <fstream.h>            // for ifstream
  18. #include <stdio.h>              // for puts() etc
  19. #include <string.h>             // for strlen etc
  20. #include <ctype.h>
  21.  
  22. #define Uses_TEventQueue
  23. #define Uses_TEvent
  24. #define Uses_TProgram
  25. #define Uses_TApplication
  26. #define Uses_TKeys
  27. #define Uses_TRect
  28. #define Uses_TMenuBar
  29. #define Uses_TSubMenu
  30. #define Uses_TMenuItem
  31. #define Uses_TStatusLine
  32. #define Uses_TStatusItem
  33. #define Uses_TStatusDef
  34. #define Uses_TDeskTop
  35. #define Uses_TView
  36. #define Uses_TWindow
  37. #define Uses_TScroller
  38. #define Uses_TScrollBar
  39. #define Uses_TDialog
  40. #define Uses_TButton
  41. #define Uses_TSItem
  42. #define Uses_TCheckBoxes
  43. #define Uses_TRadioButtons
  44. #define Uses_TLabel
  45. #include <tvision/tv.h>
  46.  
  47. // note the extra #defines above
  48.  
  49. const int cmMyFileOpen = 200;   // assign new command values
  50. const int cmMyNewWin   = 201;
  51. const int cmNewDialog  = 202;
  52.  
  53. /* SS: micro change here */
  54.  
  55. const char *fileToRead = "tvguid14.cc";
  56. //const char *fileToRead = "tvguid14.cpp";
  57. const int maxLineLength = maxViewWidth+1;
  58. const int maxLines      = 100;
  59. char *lines[maxLines];
  60. int lineCount = 0;
  61. static short winNumber  = 0;    // initialize window number
  62.  
  63. class TMyApp : public TApplication
  64. {
  65.  
  66. public:
  67.     TMyApp();
  68.     static TStatusLine *initStatusLine( TRect r );
  69.     static TMenuBar *initMenuBar( TRect r );
  70.     virtual void handleEvent( TEvent& event);
  71.     void newWindow();
  72.     void newDialog();
  73.     // added member
  74. };
  75.  
  76. class TInterior : public TScroller
  77. {
  78.  
  79. public:
  80.  
  81.     TInterior( const TRect& bounds, TScrollBar *aHScrollBar,
  82.            TScrollBar *aVScrollBar );   // constructor
  83.     virtual void draw();                // override TView::draw
  84. };
  85.  
  86. class TDemoWindow : public TWindow      // define a new window class
  87. {
  88.  
  89. public:
  90.  
  91.     TDemoWindow( const TRect& bounds, const char *aTitle, short aNumber );
  92.     TInterior *makeInterior( const TRect& r, Boolean left );
  93.     virtual void sizeLimits( TPoint& minP, TPoint& maxP );
  94.     // override TWindow::sizeLimits
  95.  
  96. private:
  97.  
  98.     TInterior *lInterior, *rInterior;
  99.  
  100. };
  101.  
  102. void readFile( const char *fileName )
  103. {
  104.     ifstream fileToView( fileName );
  105.     if( !fileToView )
  106.         {
  107.         cout << "Invalid file name..." << endl;
  108.         exit( 1 );
  109.         }
  110.     else
  111.         {
  112.         char buf[maxLineLength];
  113.         while( lineCount < maxLines &&
  114.                fileToView.getline( buf, maxLineLength ) != 0 )
  115.             {
  116.             lines[lineCount] = newStr( buf );
  117.             lineCount++;
  118.             }
  119.         }
  120. }
  121.  
  122. void deleteFile()
  123. {
  124.     for( int i = 0; i < lineCount; i++ )
  125.         delete lines[i];
  126. }
  127.  
  128. TInterior::TInterior( const TRect& bounds, TScrollBar *aHScrollBar,
  129.               TScrollBar *aVScrollBar ) :
  130.        TScroller( bounds, aHScrollBar, aVScrollBar )
  131. {
  132.     options = options | ofFramed;
  133.     setLimit( maxLineLength, lineCount );
  134. }
  135.  
  136. void TInterior::draw()       // modified for scroller
  137. {
  138.     ushort color = getColor(0x0301);
  139.     for( int i = 0; i < size.y; i++ )
  140.         // for each line:
  141.         {
  142.         TDrawBuffer b;
  143.         b.moveChar( 0, ' ', color, size.x );
  144.         // fill line buffer with spaces
  145.         int j = delta.y + i;       // delta is scroller offset
  146.         if( j < lineCount && lines[j] != 0 )
  147.             {
  148.             char s[maxLineLength];
  149.             if( delta.x > strlen(lines[j] ) )
  150.                 s[0] = EOS;
  151.             else
  152.                 {
  153.                 strncpy( s, lines[j]+delta.x, size.x );
  154.                 s[size.x] = EOS;
  155.                 }
  156.             b.moveCStr( 0, s, color );
  157.             }
  158.         writeLine( 0, i, size.x, 1, b);
  159.         }
  160.  
  161. }
  162.  
  163. // modified from tvguid08:
  164. TDemoWindow::TDemoWindow( const TRect& bounds, const char *aTitle,
  165.               short aNumber) :
  166.          TWindow( bounds, aTitle, aNumber),
  167.          TWindowInit( &TDemoWindow::initFrame )
  168. {
  169.     TRect lbounds = getExtent();
  170.     TRect r( lbounds.a.x, lbounds.a.y, lbounds.b.x/2+1, lbounds.b.y );
  171.     lInterior = makeInterior( r, True );
  172.     lInterior->growMode = gfGrowHiY;
  173.     insert( lInterior );
  174.     // creates left-side scrollable interior and inserts into window
  175.     r = TRect( lbounds.b.x/2, lbounds.a.y, lbounds.b.x, lbounds.b.y );
  176.     rInterior = makeInterior( r, False );
  177.     rInterior->growMode = gfGrowHiX | gfGrowHiY;
  178.     insert( rInterior );
  179.     // likewise for right-side scroller
  180. }
  181.  
  182. TInterior *TDemoWindow::makeInterior( const TRect& bounds, Boolean left )
  183. {
  184.     TRect r = TRect( bounds.b.x-1, bounds.a.y+1, bounds.b.x, bounds.b.y-1 );
  185.     TScrollBar *vScrollBar = new TScrollBar( r );
  186.     if( vScrollBar == 0 )
  187.         {
  188.         cout << "vScrollbar init error" << endl;
  189.         exit(1);
  190.         }
  191.         // production code would display error dialog box
  192.     vScrollBar->options |= ofPostProcess;
  193.     if( left )
  194.         vScrollBar->growMode = gfGrowHiY;
  195.     insert( vScrollBar );
  196.  
  197.     r = TRect( bounds.a.x+2, bounds.b.y-1, bounds.b.x-2, bounds.b.y );
  198.     TScrollBar *hScrollBar = new TScrollBar( r );
  199.     if( hScrollBar == 0 )
  200.         {
  201.         cout << "hScrollbar init error" << endl;
  202.         exit(1);
  203.         }
  204.     hScrollBar->options |= ofPostProcess;
  205.     if( left )
  206.         hScrollBar->growMode = (gfGrowHiY | gfGrowLoY);
  207.     insert( hScrollBar );
  208.  
  209.     r = bounds;
  210.     r.grow( -1, -1 );
  211.     return new TInterior( r, hScrollBar, vScrollBar );
  212. }
  213.  
  214. void TDemoWindow::sizeLimits( TPoint& minP, TPoint& maxP )
  215. {
  216.     TWindow::sizeLimits( minP, maxP );
  217.     minP.x = lInterior->size.x+9;
  218. }
  219.  
  220. TMyApp::TMyApp() :
  221.     TProgInit( &TMyApp::initStatusLine,
  222.                &TMyApp::initMenuBar,
  223.                &TMyApp::initDeskTop
  224.              )
  225. {
  226. }
  227.  
  228. void TMyApp::handleEvent(TEvent& event)
  229. {
  230.     TApplication::handleEvent(event);
  231.     if( event.what == evCommand )
  232.         {
  233.         switch( event.message.command )
  234.             {
  235.             case cmMyNewWin:
  236.                 newWindow();
  237.                 break;
  238.             case cmNewDialog:
  239.                 newDialog();
  240.                 break;
  241.             default:
  242.                 return;
  243.             }
  244.         clearEvent( event );            // clear event after handling
  245.         }
  246. }
  247.  
  248. TMenuBar *TMyApp::initMenuBar( TRect r )
  249. {
  250.     r.b.y = r.a.y + 1;    // set bottom line 1 line below top line
  251.     return new TMenuBar( r,
  252.         *new TSubMenu( "~F~ile", kbAltF )+
  253.             *new TMenuItem( "~O~pen", cmMyFileOpen, kbF3, hcNoContext, "F3" )+
  254.             *new TMenuItem( "~N~ew",  cmMyNewWin,   kbF4, hcNoContext, "F4" )+
  255.             newLine()+
  256.             *new TMenuItem( "E~x~it", cmQuit, cmQuit, hcNoContext, "Alt-X" )+
  257.         *new TSubMenu( "~W~indow", kbAltW )+
  258.             *new TMenuItem( "~N~ext", cmNext,     kbF6, hcNoContext, "F6" )+
  259.             *new TMenuItem( "~Z~oom", cmZoom,     kbF5, hcNoContext, "F5" )+
  260.             *new TMenuItem( "~D~ialog", cmNewDialog, kbF2, hcNoContext, "F2" )
  261.             // new dialog menu added here
  262.         );
  263. }
  264.  
  265. TStatusLine *TMyApp::initStatusLine( TRect r )
  266. {
  267.     r.a.y = r.b.y - 1;     // move top to 1 line above bottom
  268.     return new TStatusLine( r,
  269.         *new TStatusDef( 0, 0xFFFF ) +
  270.         // set range of help contexts
  271.             *new TStatusItem( 0, kbF10, cmMenu ) +
  272.             // define an item
  273.             *new TStatusItem( "~Alt-X~ Exit", kbAltX, cmQuit ) +
  274.             // and another one
  275.             *new TStatusItem( "~Alt-F3~ Close", kbAltF3, cmClose )
  276.             // and another one
  277.         );
  278. }
  279.  
  280. void TMyApp::newWindow()
  281. {
  282.     TRect r( 0, 0, 45, 13 );            // set initial size and position
  283.  
  284.     /* SS: micro change here */
  285.  
  286.     //r.move( random(34), random(11) ); // randomly move around screen
  287.     r.move( random() % 34, random() % 11 ); // randomly move around screen
  288.     TDemoWindow *window = new TDemoWindow ( r, "Demo Window", ++winNumber);
  289.     deskTop->insert(window);    // put window into desktop and draw it
  290. }
  291.  
  292. // changed from tvguid12: add buttons
  293. void TMyApp::newDialog()
  294. {
  295.     TDialog *pd = new TDialog( TRect( 20, 6, 60, 19), "Demo Dialog" );
  296.     if( pd )
  297.         {
  298.         TView *b = new TCheckBoxes( TRect( 3, 3, 18, 6),
  299.             new TSItem( "~H~varti",
  300.             new TSItem( "~T~ilset",
  301.             new TSItem( "~J~arlsberg", 0 )
  302.             )));
  303.         pd->insert( b );
  304.  
  305.         pd->insert( new TLabel( TRect( 2, 2, 10, 3), "Cheeses", b ));
  306.  
  307.         b = new TRadioButtons( TRect( 22, 3, 34, 6),
  308.             new TSItem( "~S~olid",
  309.             new TSItem( "~R~unny",
  310.             new TSItem( "~M~elted", 0 )
  311.             )));
  312.         pd->insert( b );
  313.  
  314.         pd->insert( new TLabel( TRect( 21, 2, 33, 3), "Consistency", b ));
  315.  
  316.         pd->insert( new TButton( TRect( 15, 10, 25, 12 ), "~O~K", cmOK,
  317.                     bfDefault ));
  318.         pd->insert( new TButton( TRect( 28, 10, 38, 12 ), "~C~ancel", cmCancel,
  319.                     bfNormal ));
  320.         deskTop->execView( pd );
  321.         }
  322.     destroy( pd );
  323. }
  324.  
  325. int main()
  326. {
  327.     readFile( fileToRead );
  328.     TMyApp myApp;
  329.     myApp.run();
  330.     deleteFile();
  331.     return 0;
  332. }
  333.