home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 2 / AUCD2.iso / program / vista.arc / !hyperview / c / hyperview next >
Text File  |  1996-01-25  |  5KB  |  182 lines

  1. // **************************************************************************
  2. //                     Copyright 1996 David Allison
  3. //
  4. //             VV    VV    IIIIII     SSSSS     TTTTTT       AA
  5. //             VV    VV      II      SS           TT       AA  AA
  6. //             VV    VV      II        SSSS       TT      AA    AA
  7. //              VV  VV       II           SS      TT      AAAAAAAA
  8. //                VV       IIIIII     SSSS        TT      AA    AA
  9. //
  10. //                    MULTI-THREADED C++ WIMP CLASS LIBRARY
  11. //                                for RISC OS
  12. // **************************************************************************
  13. //
  14. //             P U B L I C    D O M A I N    L I C E N C E
  15. //             -------------------------------------------
  16. //
  17. //     This library is copyright. You may not sell the library for
  18. //     profit, but you may sell products which use it providing
  19. //     those products are presented as executable code and are not
  20. //     libraries themselves.  The library is supplied without any
  21. //     warranty and the copyright owner cannot be held responsible for
  22. //     damage resulting from failure of any part of this library.
  23. //
  24. //          See the User Manual for details of the licence.
  25. //
  26. // *************************************************************************
  27.  
  28. //
  29. // Hyper Text Markup Language displayer
  30. //
  31.  
  32. #include "Vista:vista.h"
  33. #include "hyperview.h"
  34. #include "viewer.h"
  35. #include <swis.h>
  36. #include <kernel.h>
  37. #include <string.h>
  38. #include <stdio.h>
  39. #include <ctype.h>
  40. #include <string.h>
  41.  
  42. HyperView::HyperView()
  43.    : Task ("HTML Viewer", "hyperview", "!hyperview", "iconbar")
  44.    {
  45.    viewers = NULL ;
  46.    last_viewer = NULL ;
  47.    loader = new Loader(this) ;
  48.    set_mask (1 << ENULL) ;
  49.    }
  50.  
  51. void HyperView::click (int x, int y, int button, int icon)
  52.     {
  53.     if (button & Task::BLEFT)
  54.        {
  55.        Viewer *viewer = new Viewer(this) ;
  56.        viewer->do_open() ;
  57.        }
  58.     }
  59.  
  60. void HyperView::menu(MenuItem items[])
  61.    {
  62.    switch (items[0])
  63.       {
  64.       case 0:
  65.          ProgramInfo proginfo (this, 4, "0.1 (9 Jan 1996)") ;
  66.          proginfo.show() ;
  67.          sleep (&proginfo) ;
  68.          break ;
  69.       case 1:
  70.          exit() ;
  71.          break ;
  72.       }
  73.    }
  74.  
  75. Viewer *HyperView::find_viewer (int handle)
  76.    {
  77.    for (Viewer *v = viewers ; v != NULL ; v = v->next)
  78.       if (handle == v->handle)
  79.          return v ;
  80.    return NULL ;
  81.    }
  82.  
  83. void HyperView::add_viewer(Viewer *v)
  84.    {
  85.    v->next = NULL ;
  86.    if (viewers == NULL)
  87.       viewers = last_viewer = v ;
  88.    else
  89.       {
  90.       last_viewer->next = v ;
  91.       v->prev = last_viewer ;
  92.       last_viewer = v ;
  93.       }
  94.    }
  95.  
  96. void HyperView::delete_viewer(Viewer *v)
  97.    {
  98.    if (v->prev == NULL)
  99.       viewers = v->next ;
  100.    else
  101.       v->prev->next = v->next ;
  102.    if (v->next == NULL)
  103.       last_viewer = v->prev ;
  104.    else
  105.       v->next->prev = v->prev ;
  106.    }
  107.  
  108.  
  109. Loader::Loader (HyperView *h)
  110.    : DataSave (h)
  111.    {
  112.    hyperview = h ;
  113.    }
  114.  
  115. Loader::~Loader()
  116.    {
  117.    }
  118.  
  119. void Loader::receive (int action, int task, int my_ref, int your_ref, int data_length, void *data)
  120.    {
  121.    Viewer *v ;
  122.    switch ((Task::events)action)
  123.       {
  124.       case Task::Message_DataSave:             // save to this file
  125.          datasaveack (your_ref, data, "<Wimp$Scrap>") ;
  126.          break ;
  127.       case Task::Message_DataLoad:
  128.          DataSave::saveackdata *s = data ;
  129.          if (s->window == -2)                          // icon bar drag
  130.             {
  131.             v = new Viewer (hyperview) ;
  132.             v->do_open() ;
  133.             }
  134.          else
  135.             v = hyperview->find_viewer (s->window) ;
  136.          if (v != NULL)
  137.             {
  138.             v->display_file (s->pathname) ;
  139.             v->set_home_document (s->pathname) ;
  140.             }
  141.          dataloadack (task, your_ref, my_ref, data_length, data) ;
  142.          break ;
  143.       }
  144.    }
  145.  
  146.  
  147.  
  148. main(int argc, char *argv[])
  149.    {
  150.    try
  151.       {
  152.       HyperView *hyper_view = new HyperView ;
  153.       if (argc > 1)
  154.          {
  155.          Viewer *v = new Viewer (hyper_view) ;
  156.          v->do_open() ;
  157.          v->display_file (argv[1]) ;
  158.          v->set_home_document (argv[1]) ;
  159.          }
  160.       hyper_view->run() ;
  161.       }
  162.    catch (_kernel_oserror *e)
  163.       {
  164.       _kernel_swi_regs r ;
  165.       r.r[0] = (int)e ;
  166.       r.r[1] = 0 ;
  167.       r.r[2] = (int)"HyperView" ;
  168.       _kernel_swi (Wimp_ReportError, &r, &r) ;
  169.       }
  170.    catch (char *s)
  171.       {
  172.       _kernel_oserror err ;
  173.       _kernel_swi_regs r ;
  174.       err.errnum = 0 ;
  175.       strcpy (err.errmess, s) ;
  176.       r.r[0] = (int)&err ;
  177.       r.r[1] = 0 ;
  178.       r.r[2] = (int)"HyperView" ;
  179.       _kernel_swi (Wimp_ReportError, &r, &r) ;
  180.       }
  181.    }
  182.