home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c100 / 1.ddi / SNAV0111.ZIP / DEMO.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1990-04-16  |  11.3 KB  |  347 lines

  1. //          ┌───────┐
  2. //    ─────────>│ AVNER │
  3. //    ─────────>│  BEN  │──────> Software Engineering Method
  4. //          └───────┘
  5. //    10 Dov-Hoz st. Tel-Aviv 63416 Israel tel. 972-3-221535
  6.  
  7. // The Screen NAVigator, ver 1.10 March 1990
  8. // Copyright (c) 1989 by Avner Ben
  9. // Snav is not, and never was, free software.
  10. // for conditions for use refer to file "copyrigh.txt"
  11.  
  12. // The Screen Navigator is an object-oriented device-independent
  13. // character-graphics driver package, written in the C++ language,
  14. // distributed in the form of C++ source code.
  15. // For further information refer to the documentation files.
  16.  
  17. // this simple example is intended as a template to be extended and modified
  18. // by the user, provided the above title and copyright notice are unchanged
  19. // and are not ommitted.
  20.  
  21. /***************************************************************************/
  22.  
  23. // demonstration main program
  24. // a simple full-screen program, allowing the user accesss to some typical
  25. // features of the SNAV character-graphics driver, selecting from a
  26. // sliding-menu.
  27.  
  28. // 4.11.89 avner ben coded
  29. /////// snav v1.1
  30. // 8.3.90-31.3.90 avner ben:
  31. // * C++ v2.0 upgrade * removed constant declaration of window    coordinates
  32. // *  removed  inclusion  of  <io.h>  *  default screen and keyboard driver
  33. // allocation * added rotate and color-setup options *
  34.  
  35. // Site history (of this copy):
  36. // __.__.__ ____________ : __________________.
  37.  
  38. #include <stdio.h>
  39. #include <string.h>
  40. #include <conio.h>
  41. #include <ctype.h>
  42. #include "snav2.hpp"
  43. #include "demo1.hpp"
  44. #include "demo0.hpp"
  45. #include "demo2.hpp"
  46. #include "demo3.hpp"
  47.  
  48. screen_driver_manager screen_driver(1);
  49. keyboard_driver_manager keyboard_driver(1);
  50. panel *display=screen_driver.allocate(square_pos(point_pos(1,1),point_pos(24,80)));
  51. panel *dialog=screen_driver.allocate(square_pos(point_pos(25,1),point_pos(25,80)));
  52. character_input *kbd=keyboard_driver.allocate(dialog);
  53.  
  54. static void demo_arc(void);
  55. static void demo_oblong(void);
  56. static void demo_zigzag(void);
  57. static void demo_spiral(void);
  58. static void demo_twg_scr(void);
  59. static void demo_list_alph(void);
  60. static void demo_cut(void);
  61. static void demo_paste(void);
  62. static void demo_rotate(void);
  63. static void demo_setup(void);
  64. static void intro(void);
  65.  
  66. main()
  67. {
  68.     display->clear();
  69.     intro();
  70.     slide_menu topmnu(display,dialog);     // chops top line off display
  71.     display->enframe(h1v1,"SNAV demo",TRUE);
  72.     // build a one-menu system
  73.     topmnu.append_opt("arc",1,"draw a strait line, possibly with arrowhead");
  74.     topmnu.append_opt("oblong",1,"draw an oblong frame");
  75.     topmnu.append_opt("zigzag",1,"draw a diagonal dented curve");
  76.     topmnu.append_opt("spiral",1,"draw a square-like spiral curve");
  77.     topmnu.append_opt("twg",1,"convert TypeWriter-Graphics on screen (weight 0:0) to semigraphics");
  78.     topmnu.append_opt("cut",1,"trace shape on screen and store in memory");
  79.     topmnu.append_opt("paste",1,"overlay shape stored by last cut operation");
  80.     topmnu.append_opt("roatate",1,"cut, rotate 90 degrees clockwise, paste");
  81.     topmnu.append_opt("internals",1,"list the current internal semigraphic alphabet definition");
  82.     topmnu.append_opt("setup",4,"modify screen colours");
  83.     topmnu.append_opt("clear",2,"clear the screen");
  84.     topmnu.append_opt("quit",1,"return to DOS");
  85.     int opt=topmnu.select();    // msg to menu to query user
  86.     while (opt) {
  87.         if (opt==12) break;
  88.         switch (opt) {
  89.             case 1    : demo_arc();        break;
  90.             case 2    : demo_oblong();    break;
  91.             case 3    : demo_zigzag();    break;
  92.             case 4    : demo_spiral();    break;
  93.             case 5    : demo_twg_scr();   break;
  94.             case 6    : demo_cut();        break;
  95.             case 7    : demo_paste();     break;
  96.             case 8    : demo_rotate();    break;
  97.             case 9    : demo_list_alph(); break;
  98.             case 10 : demo_setup();     break;
  99.             case 11 : display->clear(); break;
  100.         }
  101.         opt=topmnu.select();
  102.     }
  103.     display->deframe();
  104.     // we have thre different screens to clear!
  105.     display->set_def_color(color_ind());       // if background changed...
  106.     topmnu.clear(); display->clear(); kbd->clear();
  107.     return(0);
  108. }
  109.  
  110. static void demo_arc()
  111. {
  112.     if (!kbd->get_position
  113.      ("move cursor to arc start and press enter (escape to quit):",display))
  114.         return;
  115.     point_pos stpoint=display->ask_where();
  116.     int len=kbd->get_number("length:",80); kbd->put_s(", ");
  117.     direction dir=kbd->get_dir(); kbd->put_s(", ");
  118.     weight_d wgt=kbd->get_wgt(); kbd->put_s(", ");
  119.     boolean tipped=kbd->get_boolean("tipped:"); kbd->clear();
  120.     (arc(len,dir,wgt,tipped)).list(display,&stpoint);
  121. }
  122.  
  123. static void demo_oblong()
  124. {
  125.     if (!kbd->get_position
  126.      ("move cursor to Left-Up-corner and press enter (escape to quit):",display))
  127.         return;
  128.     point_pos stpoint=display->ask_where();
  129.     int wd=kbd->get_number("length:",80); kbd->put_s(", ");
  130.     int hgt=kbd->get_number("height:",80); kbd->put_s(", ");
  131.     weight_d wgt=kbd->get_wgt();
  132.     (oblong(wd,hgt,wgt)).list(display,&stpoint);
  133. }
  134.  
  135. static void demo_zigzag()
  136. {
  137.     if (!kbd->get_position
  138.      ("move cursor to curve start and press enter (escape to quit):",display))
  139.         return;
  140.     point_pos stpoint=display->ask_where();
  141.     int len=kbd->get_number("length:",80); kbd->put_s(", ");
  142.     direction dir1=kbd->get_dir(); kbd->put_s(", ");
  143.     direction dir2=kbd->get_dir(); kbd->put_s(", ");
  144.     weight_d wgt=kbd->get_wgt();
  145.     (zigzag(len,dir1,dir2,wgt)).list(display,&stpoint);
  146. }
  147.  
  148. static void demo_spiral()
  149. {
  150.     if (!kbd->get_position
  151.      ("move cursor to curve start and press enter (escape to quit):",display))
  152.         return;
  153.     point_pos stpoint=display->ask_where();
  154.     int len=kbd->get_number("length:",80); kbd->put_s(", ");
  155.     direction dir=kbd->get_dir(); kbd->put_s(", ");
  156.     weight_d wgt=kbd->get_wgt();
  157.     (spiral(len,dir,wgt)).list(display,&stpoint);
  158. }
  159.  
  160. static void demo_list_alph()
  161. {
  162.     display->save(); display->clear();
  163.     FILE *tempf=fopen("temp.$$$","w");
  164.     if (!tempf) { kbd->msg("cannot open temporary file"); return; }
  165.     alph->list(tempf); fclose(tempf);
  166.     tempf=fopen("temp.$$$","r");
  167.     if (!tempf) { kbd->msg("cannot open temporary file"); return; }
  168.     char c; int i=display->ask_limit(up); boolean newline=FALSE;
  169.     while ((c=getc(tempf))!=EOF) {
  170.         if (newline) {
  171.             if (++i>display->ask_limit(dn)) {
  172.                 kbd->msg("press any key...");
  173.                 display->clear();
  174.                 i=display->ask_limit(up);
  175.             } else display->posit(&(point_pos(i,display->ask_limit(lt))));
  176.             newline=FALSE;
  177.         }
  178.         if (c=='\n') newline=TRUE;
  179.         else display->put_c(c);
  180.     }
  181.     fclose(tempf); remove("temp.$$$");
  182.     kbd->msg("press any key..."); display->restore();
  183. }
  184.  
  185. static void demo_twg_scr()
  186. {
  187.     char buf[81];
  188.     sprintf(buf,"%04d characters modified. press any key...",display->twg());
  189.     kbd->msg(buf);
  190. }
  191.  
  192. shape *killbuf=NULL;
  193.  
  194. static void demo_cut(void)
  195. {
  196.     if (!kbd->get_position
  197.      ("place cursor anywhere on curve and press enter",display,FALSE))
  198.         return;
  199.     kbd->clear();
  200.     kbd->put_s("wait...");
  201.     point_pos stpoint=display->ask_where();
  202.     point_pos savpt=stpoint;
  203.     killbuf=new tracing(display,&stpoint);
  204.     killbuf->clear(display,&savpt);
  205. }
  206.  
  207. static void demo_paste(void)
  208. {
  209.     if (!killbuf) return;
  210.     if (!kbd->get_position
  211.      ("place cursor on curve start and press enter",display,FALSE))
  212.         return;
  213.     killbuf->list(display,&(display->ask_where()));
  214. }
  215.  
  216. static void demo_rotate(void)
  217. {
  218.     if (!kbd->get_position
  219.      ("place cursor anywhere on curve and press enter",display,FALSE))
  220.         return;
  221.     kbd->clear();
  222.     kbd->put_s("wait...");
  223.     point_pos stpoint=display->ask_where();
  224.     point_pos savpt=stpoint;
  225.     killbuf=new tracing(display,&stpoint);
  226.     killbuf->clear(display,&savpt);
  227.     for (stroke *sk=killbuf->ask_start(); sk; sk=sk->get_next())
  228.         sk->turn();
  229.     killbuf->list(display,&savpt);
  230. }
  231.  
  232. static void demo_setup()
  233. {
  234.     display->save();
  235.     display->clear();
  236.     int background_chg=0;
  237.     int opt=99;
  238.     point_pos pt=display->ask_where();
  239.     while (opt) {
  240.         display->clear();
  241.         point_pos pt(dn,display->ask_where());
  242.         display->put_s("screen setup options:",&pt); pt++;
  243.         display->put_s("1. background color",&pt); pt++;
  244.         display->put_s("2. forground color",&pt); pt++;
  245.         display->put_s("3. display attributes",&pt); pt++;
  246.         pt.move(dn);
  247.         display->put_s("WARNING: color recognition is experimental with this release!",&pt); pt++;
  248.         do {
  249.             kbd->clear();
  250.             opt=kbd->get_number("enter selection (escape to quit):",3);
  251.         } while (opt>3);
  252.         if (opt==1) {
  253.             display->clear();
  254.             point_pos pt(dn,display->ask_where());
  255.             display->put_s("background colors:",&pt); pt++;
  256.             display->put_s("1. black",&pt); pt++;
  257.             display->put_s("2. blue",&pt); pt++;
  258.             display->put_s("3. green",&pt); pt++;
  259.             display->put_s("4. cyan",&pt); pt++;
  260.             display->put_s("5. red",&pt); pt++;
  261.             display->put_s("6. magenta",&pt); pt++;
  262.             display->put_s("7. yellow",&pt); pt++;
  263.             display->put_s("8. white",&pt); pt++;
  264.             do {
  265.                 kbd->clear();
  266.                 opt=kbd->get_number("enter selection (escape to quit):",8);
  267.             } while (opt>8);
  268.             if (opt) {
  269.                 display->set_def_background((vd_clr)(opt-1));
  270.                 background_chg=opt;
  271.             }
  272.         } else if (opt==2) {
  273.             display->clear();
  274.             point_pos pt(dn,display->ask_where());
  275.             display->put_s("forground colors:",&pt); pt++;
  276.             display->put_s("1. black",&pt); pt++;
  277.             display->put_s("2. blue",&pt); pt++;
  278.             display->put_s("3. green",&pt); pt++;
  279.             display->put_s("4. cyan",&pt); pt++;
  280.             display->put_s("5. red",&pt); pt++;
  281.             display->put_s("6. magenta",&pt); pt++;
  282.             display->put_s("7. yellow",&pt); pt++;
  283.             display->put_s("8. white",&pt); pt++;
  284.             do {
  285.                 kbd->clear();
  286.                 opt=kbd->get_number("enter selection (escape to quit):",8);
  287.             } while (opt>8);
  288.             if (opt) display->set_def_forground((vd_clr)(opt-1));
  289.         } else if (opt==3) {
  290.             display->clear();
  291.             point_pos pt(dn,display->ask_where());
  292.             display->put_s("visual attributes (toggles):",&pt); pt++;
  293.             display->put_s("1. high-intensity (forground)",&pt); pt++;
  294.             display->put_s("2. blink",&pt); pt++;
  295.             display->put_s("3. reverse-video",&pt); pt++;
  296.             do {
  297.                 kbd->clear();
  298.                 opt=kbd->get_number("enter selection (escape to quit):",3);
  299.             } while (opt>3);
  300.             if (opt) {
  301.                 if (opt==1) opt=(int)VD_HI;
  302.                 else if (opt==2) opt=(int)VD_BLNK;
  303.                 else if (opt==3) opt=(int)VD_REV;
  304.                 display->set_def_attr((vd_attr)opt);
  305.             }
  306.         }
  307.     }
  308.     display->restore();
  309.     if (background_chg)
  310.         display->set_def_background((vd_clr)(background_chg-1));
  311. }
  312.  
  313. static void intro()
  314. {
  315.     static char  *text1[]={
  316.         "         The Screen NAVigator, ver 1.10 March 1990            ",
  317.         "                Copyright (c) 1989 by Avner Ben",
  318.         "  ",
  319.         "                   D E M O N S T R A T I O N",
  320.         "                     (sample application)",
  321.         "\0"
  322.     };
  323.     static char *text2[]={
  324.         " The  Screen   NAVigator  is   an   object-oriented   device- ",
  325.         " independent  character-graphics  driver  package, written in",
  326.         " the  C++  language,  distributed  as  C++  source code.  For",
  327.         " further information refer to the documentation files.",
  328.         "\0"
  329.     };
  330.     static char *text3[]={
  331.         " This simplistic application program demonstrates  only  some",
  332.         " of the things the C++ programmer may do with  SNAV  package.",
  333.         " The Screen NAVigator is  intended  to  be  included  in  C++",
  334.         " programs, by proffessional programmers.  Typical applictions",
  335.         " involve semi-graphic, text-oriented charts.",
  336.         "\0"
  337.     };
  338.  
  339.     text_window *intro_box=new text_window(display,&point_pos(9,7),"demonstration",TRUE,text1);
  340.     intro_box->pause("any key");
  341.     intro_box->put_page(text2);
  342.     intro_box->pause("any key");
  343.     intro_box->put_page(text3);
  344.     intro_box->pause("any key");
  345.     delete intro_box;
  346. }
  347.