home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / v / vista / c / objects < prev    next >
Text File  |  1996-02-01  |  31KB  |  1,188 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. // window objects
  30. //
  31.  
  32. #include "Vista:task.h"
  33. #include "Vista:window.h"
  34. #include <stdlib.h>
  35. #include <kernel.h>
  36. #include <swis.h>
  37. #include <string.h>
  38. #include <stdarg.h>
  39. #include <stdio.h>
  40. #include <math.h>
  41.  
  42. Object::Object (Window *w, char *name, int priority, char *menu)
  43.    {
  44.    window = w ;
  45.    if (menu == NULL)
  46.       default_menu = NULL ;
  47.    else
  48.       {
  49.       default_menu = w->task->find_menu (menu) ;
  50.       if (default_menu == NULL)
  51.          throw ("Unknown menu") ;
  52.       }
  53.    next = NULL ;
  54.    prev = NULL ;
  55.    this->priority = priority ;
  56.    strncpy (this->name, name, 32) ;
  57.    w->add_object (this) ;
  58.    }
  59.  
  60. Object::~Object ()
  61.    {
  62.    window->remove_object (this) ;
  63.    }
  64.  
  65. void Object::redraw (int x0, int y0, int x1, int y1)
  66.    {
  67.    }
  68.  
  69. void Object::update (int x0, int y0, int x1, int y1)
  70.    {
  71.    }
  72.  
  73. int Object::compare (int x, int y)
  74.    {
  75.    x = window->xtowindow(x) ; // x in window coords
  76.    y = window->ytowindow(y) ; // y in window coords
  77.    return x <= this->x1 && x >= this->x0 && y <= this->y1 && y >= this->y0 ;
  78.    }
  79.  
  80. //
  81. // move to alternative window coords
  82. //
  83.  
  84. void Object::move (int x0, int y0, int x1, int y1)
  85.    {
  86.    this->x0 = x0 ;
  87.    this->y0 = y0 ;
  88.    this->x1 = x1 ;
  89.    this->y1 = y1 ;
  90.    }
  91.  
  92. void Object::move (int dx, int dy)
  93.    {
  94.    this->x0 += dx ;
  95.    this->y0 += dy ;
  96.    this->x1 += dx ;
  97.    this->y1 += dy ;
  98.    }
  99.  
  100. void Object::drag (int mx, int my, int buttons)
  101.    {
  102.    window->task->register_object_drag (this, 1) ;
  103.    window->do_drag (5, x0 + window->x0 - window->scx, y0 + window->y1 - window->scy,
  104.                        x1 + window->x0 - window->scx, y1 + window->y1 - window->scy) ;
  105.    }
  106.  
  107. void Object::click (int mx, int my, int button)
  108.    {
  109.    }
  110.  
  111. void Object::double_click (int mx, int my, int button)
  112.    {
  113.    }
  114.  
  115. void Object::end_drag (int x0, int y0, int x1, int y1, int id)
  116.    {
  117.    int oldx0 = this->x0 ;
  118.    int oldy0 = this->y0 ;
  119.    int oldx1 = this->x1 ;
  120.    int oldy1 = this->y1 ;
  121.    move (window->xtowindow (x0), window->ytowindow(y0),
  122.          window->xtowindow (x1), window->ytowindow(y1)) ;
  123.    window->do_redraw (oldx0, oldy0, oldx1, oldy1) ;
  124.    window->do_redraw(this->x0, this->y0, this->x1, this->y1) ;
  125.    }
  126.  
  127. void Object::key (int x, int y, int height, int index, int code)
  128.    {
  129.    }
  130.  
  131. void Object::select()
  132.    {
  133.    selected = 1 ;
  134.    }
  135.  
  136. void Object::unselect()
  137.    {
  138.    selected = 0 ;
  139.    }
  140.  
  141. void Object::pointer (int entering)
  142.    {
  143.    }
  144.  
  145. void Object::mode_change()
  146.    {
  147.    }
  148.  
  149. Menu *Object::display_menu (int x, int y, int button, int icon)
  150.    {
  151.    if (default_menu == NULL)
  152.       {
  153.       char *menu_name = get_menu(x, y, button, icon) ;
  154.       if (menu_name == NULL)
  155.          return NULL ;
  156.       Menu *m = window->task->find_menu (menu_name) ;
  157.       if (m != NULL)
  158.          {
  159.          m->open (x - 40, y) ;
  160.          return m ;
  161.          }
  162.       return NULL ;       // no menu
  163.       }
  164.    else
  165.       {
  166.       pre_menu (default_menu, x,  y,  button,  icon) ;
  167.       default_menu->open (x - 40, y) ;
  168.       return default_menu ;
  169.       }
  170.    }
  171.  
  172. //
  173. // give user a chance to change the menu before display
  174. //
  175.  
  176. void Object::pre_menu (Menu *m, int x, int y, int button, int icon)
  177.    {
  178.    }
  179.  
  180. //
  181. // this window doesn't have a default menu, ask the user to provide one
  182. //
  183.  
  184.  
  185. char *Object::get_menu (int x, int y, int button, int icon)
  186.    {
  187.    return NULL ;
  188.    }
  189.  
  190.  
  191. void Object::menu (MenuItem item[])
  192.    {
  193.    }
  194.  
  195.  
  196. char *Object::help (int mx, int my, int buttons)
  197.    {
  198.    return NULL ;
  199.    }
  200.  
  201. static void move(int x, int y)
  202.    {
  203.    _kernel_swi_regs r ;
  204.    _kernel_oserror *e ;
  205.    r.r[0] = 4 ;
  206.    r.r[1] = x ;
  207.    r.r[2] = y ;
  208.    if ((e = _kernel_swi (OS_Plot, &r, &r)) != NULL)
  209.       throw (e) ;
  210.    }
  211.  
  212. static void draw_char (char ch)
  213.    {
  214.    _kernel_swi_regs r ;
  215.    _kernel_swi (OS_WriteI+ch, &r, &r) ;
  216.    }
  217.  
  218. static void set_colour (int colour)
  219.    {
  220.    _kernel_swi_regs r ;
  221.    r.r[0] = 18 ;
  222.    _kernel_swi (OS_WriteC, &r, &r) ;
  223.    r.r[0] = 0 ;
  224.    _kernel_swi (OS_WriteC, &r, &r) ;
  225.    r.r[0] = colour ;
  226.    _kernel_swi (OS_WriteC, &r, &r) ;
  227.    }
  228.  
  229.  
  230. //
  231. // icon object
  232. //
  233.  
  234. IconObject::IconObject (Window *w, char *name, Icon *icon, int priority, char *menu)
  235.    : Object (w, name, priority, menu)
  236.    {
  237.    this->icon = icon ;
  238.    }
  239.  
  240. IconObject::~IconObject ()
  241.    {
  242.    }
  243.  
  244. void IconObject::redraw (int x0, int y0, int x1, int y1)
  245.    {
  246.    Box box ;
  247.    icon->read_position (box) ;
  248.    if (x0 <= box.x1 && x1 >= box.x0 && y0 <= box.y1 && y1 >= box.y0)
  249.       icon->plot() ;
  250.    }
  251.  
  252.  
  253. //
  254. // a sprite object
  255. //
  256.  
  257. RawSpriteObject::RawSpriteObject (Window *w, char *name, char *sprite, void *area, int x, int y, int priority, char *menu)
  258.    : Object (w, name, priority, menu)
  259.    {
  260.    _kernel_swi_regs r ;
  261.    _kernel_oserror *e ;
  262.    x0 = x ;
  263.    y0 = y ;
  264.    this->sprite = sprite ;
  265.    this->area = area ;
  266.    r.r[0] = 40 + 0x100 ;           // read sprite info
  267.    r.r[1] = (int)area ;
  268.    r.r[2] = (int)sprite ;
  269.    if ((e = _kernel_swi (OS_SpriteOp, &r, &r)) != NULL)
  270.       throw (e) ;
  271.    x1 = x0 + r.r[3] ;
  272.    y1 = y0 + r.r[4] ;
  273.    }
  274.  
  275. RawSpriteObject::RawSpriteObject (Window *w, char *name, char *sprite, int x, int y, int priority, char *menu)
  276.    : Object (w, name, priority, menu)
  277.    {
  278.    x0 = x ;
  279.    y0 = y ;
  280.    this->sprite = sprite ;
  281.    this->area = 0 ;
  282.    init() ;
  283.    }
  284.  
  285. void RawSpriteObject::init()
  286.    {
  287.    _kernel_swi_regs r ;
  288.    _kernel_oserror *e ;
  289.    r.r[0] = 40 + (area == NULL ? 0 : 256) ;           // read sprite info
  290.    r.r[2] = (int)sprite ;
  291.    if ((e = _kernel_swi (area == NULL ? Wimp_SpriteOp : OS_SpriteOp, &r, &r)) != NULL)
  292.       throw (e) ;
  293.    int xsize = r.r[3] ;
  294.    int ysize = r.r[4] ;
  295.    mode = r.r[6] ;
  296.    xsize <<= window->task->xeigfactor ;
  297.    ysize <<= window->task->yeigfactor ;
  298.    x1 = x0 + xsize ;
  299.    y1 = y0 + ysize ;
  300.  
  301. // set up scale factors
  302.  
  303.    scale_factors[0] = 1  ;
  304.    scale_factors[1] = 1  ;
  305.    scale_factors[2] = 1 ;
  306.    scale_factors[3] = 1 ;
  307.  
  308. #if 0
  309.    if (area == NULL)
  310.       {
  311.       if ((e = _kernel_swi (Wimp_BaseOfSprites, &r, &r)) != NULL)
  312.          throw (e) ;
  313.       r.r[0] = r.r[1] ;
  314.       }
  315.    else
  316.       r.r[0] = (int)area ;
  317. #endif
  318.    r.r[0] = mode ;
  319.    r.r[1] = 3 ;        // NColour  (see PRM 1-710)
  320.    if ((e = _kernel_swi (OS_ReadModeVariable,&r,&r)) != NULL)
  321.       throw (e) ;
  322.    pixel_trans = new char [256] ;
  323.    if (r.r[2] < 63)           // < 256 colours
  324.       {
  325.       unsigned int palette[20] ;
  326.       r.r[1] = (int)palette ;
  327.       if ((e = _kernel_swi (Wimp_ReadPalette,&r,&r)) != NULL)
  328.          throw (e) ;
  329.       unsigned int i,p,col ;
  330.       for (i = 0 ; i < 15 ; i++)
  331.          {
  332.          p = palette[i] ;
  333.          col = p ;
  334.          col |= (p & 0xf0000000) >> 4 ;
  335.          col |= (p & 0x00f00000) >> 4 ;
  336.          col |= (p & 0x0000f000) >> 4 ;
  337.          palette[i] = p & 0xffffff00 ;
  338.          }
  339.       r.r[0] = mode ;
  340.       r.r[1] = 0 ;
  341.       r.r[2] = -1 ;
  342.       r.r[3] = (int)palette ;
  343.       r.r[4] = (int)pixel_trans ;
  344.       r.r[5] = 0 ;
  345.       if ((e = _kernel_swi (ColourTrans_GenerateTable, &r, &r)) != NULL)
  346.