home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / v / vista / c / test < prev    next >
Text File  |  1996-02-01  |  17KB  |  729 lines

  1. //
  2. // main test
  3. //
  4.  
  5. // this program is used as a test for Vista development.  It is
  6. // not a particularly good example of the use of the library
  7. // but does use much of the facilities.  Hopefully
  8. // it will suffice until I write somethine better.
  9.  
  10. // David Allison  30/3/95
  11.  
  12. #include "Vista:vista.h"
  13. #include <stdio.h>
  14. #include <kernel.h>
  15. #include <swis.h>
  16. #include <string.h>
  17.  
  18. //
  19. // a little counter to show threading
  20. //
  21.  
  22. class Counter: public Window, public Thread
  23.    {
  24.    public:
  25.       Counter(Task *) ;
  26.       ~Counter() ;
  27.       void run() ;
  28.       void close () ;
  29.    private:
  30.       int count ;
  31.       Icon *display ;
  32.       int running ;
  33.    } ;
  34.  
  35. Counter::Counter(Task *t)
  36.    : Window (t, "counter"),
  37.      Thread ("counter")
  38.    {
  39.    running = 1 ;
  40.    count = 0 ;
  41.    display = new Icon (this, 0) ;
  42.    }
  43.  
  44. Counter::~Counter()
  45.    {
  46.    }
  47.  
  48. void Counter::run()
  49.    {
  50.    do_open() ;
  51.    while (running)
  52.       {
  53.       display->print ("%d",count++) ;
  54.       sleep (100) ;
  55.       }
  56.    do_close() ;
  57.    }
  58.  
  59. void Counter::close()
  60.    {
  61.    running = 0 ;
  62.    wakeup() ;
  63.    }
  64.  
  65. //
  66. // this class saves something using the DataSave protocol
  67. //
  68.  
  69. class Saver: public DataSave
  70.    {
  71.    public:
  72.       Saver(Task *task) ;
  73.       ~Saver() ;
  74.       void receive (int action, int task, int my_ref, int your_ref, int data_length, void *data) ;   // receive a message
  75.       void save(int window, int icon, int x, int y, char *leaf) ;
  76.       void save (char *path) ;
  77.  
  78.    } ;
  79.  
  80. Saver::Saver (Task *task) : DataSave (task)
  81.    {
  82.    }
  83.  
  84. Saver::~Saver()
  85.    {
  86.    }
  87.  
  88. void Saver::receive (int action, int task, int my_ref, int your_ref, int data_length, void *data)
  89.    {
  90.    switch ((Task::events)action)
  91.       {
  92.       case Task::Message_DataSaveAck:
  93.          {            // save to this file
  94.          DataSave::saveackdata *s = (DataSave::saveackdata *)data ;
  95.          save (s->pathname) ;
  96.          dataload (task, your_ref, my_ref, data_length, data) ;
  97.          break ;
  98.          }
  99.       case Task::Message_DataLoadAck:
  100. //         delete this ;
  101.          break ;
  102.       }
  103.    }
  104.  
  105. void Saver::save (int window, int icon, int x, int y, char *leaf)
  106.    {
  107.    datasave (window, icon, x, y, 1024, 0xfff, leaf) ;
  108.    }
  109.  
  110. void Saver::save (char *path)
  111.    {
  112.    FILE *fp = fopen (path, "w") ;
  113.    if (fp == NULL)
  114.       throw ("cant open file") ;
  115.    fprintf (fp,"hello world\n") ;
  116.    fclose (fp) ;
  117.    }
  118.  
  119. class Loader ;
  120.  
  121. //
  122. // an icon grid
  123. //
  124.  
  125. class LibraryDisplay : public IconGrid
  126.    {
  127.    public:
  128.       LibraryDisplay (Task *t, char *tname, int ticon, char *menu = 0) : IconGrid (t,tname,ticon,menu) { set_flag (SORTED) ; }
  129.       void menu (MenuItem items[]) ;
  130.       void drag_icon (int mx, int my, int buttons, Icon *icon) ;
  131.       void drag (int x0, int y0, int x1, int y1, int id) ;
  132.       void drag_selection (int mx, int my, int buttons, int x0, int y0, int x1, int y1) ;
  133.    } ;
  134.  
  135. void LibraryDisplay::menu (MenuItem items[])
  136.    {
  137.    }
  138.  
  139. void LibraryDisplay::drag_icon (int mx, int my, int buttons, Icon *icon)
  140.    {
  141.    icon->drag (mx, my, buttons) ;
  142.    task->register_drag (this,1) ;
  143.    }
  144.  
  145. void LibraryDisplay::drag_selection (int mx, int my, int buttons,int x0, int y0, int x1, int y1)
  146.    {
  147.    do_drag (5, x0, y0, x1, y1) ;
  148.    task->register_drag (this,1) ;
  149.    }
  150.  
  151. void LibraryDisplay::drag (int x0, int y0, int x1, int y1, int id)
  152.    {
  153.    if (id != 1)         // not my drag?
  154.        {
  155.        IconGrid::drag (x0,y0,x1,y1,id) ;
  156.        return ;
  157.        }
  158.    int block[5] ;
  159.    _kernel_swi_regs r ;
  160.    _kernel_oserror *e ;
  161.    r.r[1] = (int)block ;
  162.    if ((e = _kernel_swi (Wimp_GetPointerInfo, &r, &r)) != NULL)
  163.       throw (e) ;
  164.    Saver *saver = new Saver(task) ;
  165.    saver->save (block[3], block[4], block[0], block[1], "newfile") ;
  166.    }
  167.  
  168. //
  169. // this class loads files into the icon grid
  170. //
  171.  
  172. class Loader: public DataSave
  173.    {
  174.    public:
  175.       Loader(Task *task, IconGrid *grid) ;
  176.       ~Loader() ;
  177.       void receive (int action, int task, int my_ref, int your_ref, int data_length, void *data) ;   // receive a message
  178.    private:
  179.       IconGrid *grid ;
  180.    } ;
  181.  
  182. Loader::Loader (Task *task, IconGrid *grid) : DataSave (task)
  183.    {
  184.    this->grid = grid ;
  185.    }
  186.  
  187. Loader::~Loader()
  188.    {
  189.    }
  190.  
  191. void Loader::receive (int action, int task, int my_ref, int your_ref, int data_length, void *data)
  192.    {
  193.    switch ((Task::events)action)
  194.       {
  195.       case Task::Message_DataSave:             // save to this file
  196.          datasaveack (your_ref, (DataSave::saveackdata *)data, "<Wimp$Scrap>") ;
  197.          break ;
  198.       case Task::Message_DataLoad:
  199.          {
  200.          DataSave::saveackdata *s = (DataSave::saveackdata *)data ;
  201.          char *leaf = strrchr (s->pathname, '.') ;
  202.          if (leaf == NULL)
  203.             leaf = s->pathname ;
  204.          else
  205.             leaf++ ;
  206.          grid->insert_icon (leaf) ;
  207.          dataloadack (task, your_ref, my_ref, data_length, data) ;
  208.          break ;
  209.          }
  210.       }
  211.    }
  212.  
  213.  
  214.  
  215.  
  216.  
  217. //
  218. // declare a class which is the main task
  219. //
  220.  
  221. class Vista : public Task
  222.    {
  223.    public:
  224.       Vista() ;
  225.       void click(int x, int y, int button, int icon) ;   // I want iconbar clicks
  226.       char *get_iconbar_menu (int icon) ;
  227.       void menu (MenuItem items[]) ;                     // iconbar menu hit
  228.       char *help (int mx, int my, int buttons, int w, int i) ;
  229.  
  230.       Window *mainwin ;               // main window
  231.       Window *win2 ;                  // another window
  232.       LibraryDisplay *lib ;           // the icon grid
  233.       Window *txt ;                   // a text window
  234.       Loader *loader ;                // icon grid file loader
  235.    } ;
  236.  
  237. //
  238. // declare the main task variable
  239. //
  240.  
  241. Vista *vista ;
  242.  
  243. //
  244. // this class is for an action button
  245. //
  246.  
  247. class Compile : public Icon
  248.    {
  249.    public:
  250.       Compile(Window *w, int icon) ;
  251.       void click(int mx, int my, int button, int icon) ;
  252.       char *help (int mx, int my, int buttons) ;
  253.    } ;
  254.  
  255. Compile::Compile(Window *w, int icon) : Icon (w,icon)
  256.    {
  257.    }
  258.  
  259. void Compile::click(int mx, int my, int button, int icon)
  260.    {
  261. //   Counter *c = new Counter (window->task) ;
  262. //   c->start() ;
  263.    window->task->show_threads() ;
  264.    Window *w = new Window (window->task, "counter") ;
  265.    Icon *ic = new Icon (w, 0) ;
  266.    w->do_open() ;
  267.    for (int i = 0 ; i < 20 ; i++)
  268.       {
  269.       ic->print ("%d",i) ;
  270.       window->task->sleep (100) ;
  271.       }
  272.    w->do_close() ;
  273.    delete ic ;
  274.    delete w ;
  275.    }
  276.  
  277. char *Compile::help (int mx, int my, int buttons)
  278.    {
  279.    return "This is the counter icon|MClick select to start a new counter" ;
  280.    }
  281. //
  282. // this class is for an action button which adds a new icon to the
  283. // scrolling list
  284. //
  285.  
  286. class Add : public Icon
  287.    {
  288.    public:
  289.       Add(Window *w, int icon, IconGrid *scroll) ;
  290.       void click(int mx, int my, int button, int icon) ;
  291.    private:
  292.       IconGrid *scroll ;
  293.       int num ;
  294.    } ;
  295.  
  296. Add::Add(Window *w, int icon, IconGrid *scroll) : Icon (w,icon)
  297.    {
  298.    this->scroll = scroll ;
  299.    num = 0 ;
  300.    }
  301.  
  302. void Add::click(int mx, int my, int button, int icon)
  303.    {
  304.    char buf[256] ;
  305.    sprintf (buf,"Icon %d",num++) ;
  306.    scroll->insert_icon (buf) ;
  307.    }
  308.  
  309. //
  310. // this class adds a new icon to the icon grid
  311. //
  312.  
  313. class AddIcon : public Icon
  314.    {
  315.    public:
  316.       AddIcon(Window *w, int icon, IconGrid *grid) ;
  317.       void click(int mx, int my, int button, int icon) ;
  318.    private:
  319.       IconGrid *grid ;
  320.       int num ;
  321.    } ;
  322.  
  323. AddIcon::AddIcon(Window *w, int icon, IconGrid *grid) : Icon (w,icon)
  324.    {
  325.    this->grid = grid ;
  326.    num = 0 ;
  327.    }
  328.  
  329. void AddIcon::click(int mx, int my, int button, int icon)
  330.    {
  331.    char buf[256] ;
  332.    sprintf (buf,"Icon %d",num++) ;
  333.    grid->insert_icon (buf) ;
  334.    grid->set_title ("%d icons",num) ;
  335.    }
  336.  
  337. //
  338. // a small sub window (a scrolling list)
  339. //
  340.  
  341.  
  342. class SubWindow: public IconGrid
  343.    {
  344.    public:
  345.       SubWindow (Window *w, int ticon) : IconGrid (w, "sub1", ticon, "submenu") {}
  346.       void menu (MenuItem items[]) ;
  347.       char *help (int mx, int my, int buttons, int icon) ;
  348.    } ;
  349.  
  350.  
  351. void SubWindow::menu (MenuItem items[])
  352.    {
  353.    }
  354.  
  355. char *SubWindow::help (int mx, int my, int buttons, int icon)
  356.    {
  357.    return "This is a scrolling window" ;
  358.    }
  359.  
  360. //
  361. // a dialogue box
  362. //
  363.  
  364.  
  365. class TestBox : public DialogueBox
  366.    {
  367.    public:
  368.       TestBox (Task *task) ;
  369.       ~TestBox() ;
  370.    private:
  371.       char string[32] ;           //