home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / desklib / examples / DeskLib / Examples / Widget5 / !Widget5 / c / CheckBanks < prev    next >
Encoding:
Text File  |  1995-05-01  |  12.0 KB  |  449 lines

  1. /************************************************************************
  2.  *                                                                      *
  3.  *        File: CheckBanks.c                                            *
  4.  *                                                                      *
  5.  *     Purpose: Provides routines to keep the state of the image bank   *
  6.  *              icons updated.                                          *
  7.  *                                                                      *
  8.  ************************************************************************/
  9.  
  10. #include "DeskLib:WimpSWIs.h"          /* Low-level WIMP commands         */
  11. #include "DeskLib:Window.h"            /* Window handling automation      */
  12. #include "DeskLib:Core.h"              /* usefull core functions          */
  13. #include "DeskLib:Error.h"             /* Error despatcher                */
  14. #include "DeskLib:Event.h"             /* Event despatcher                */
  15. #include "DeskLib:EventMsg.h"          /* Wimp Message event dispatcher   */
  16. #include "DeskLib:File.h"              /* Low level file handling         */
  17. #include "DeskLib:Msgs.h"              /* Message translation code        */
  18. #include "DeskLib:Resource.h"          /* Handles finding resource files  */
  19. #include "DeskLib:Sound.h"             /* Beep!                           */
  20. #include "DeskLib:Icon.h"              /* Icon handling automation        */
  21. #include "DeskLib:Screen.h"            /* Caching screen info             */
  22. #include "DeskLib:Sprite.h"            /* Sprite handling routines        */
  23. #include "DeskLib:File.h"              /* OS file IO                      */
  24. #include "DeskLib:KeyCodes.h"          /* Codes for wimp returned keys    */
  25.  
  26. #include "HackLib:flex.h"              /* Flexable malloc                 */
  27.  
  28. #include "kernel.h"                    /* clib kernel functions           */
  29. #include "MySWIs.h"                    /* SWI no defs                     */
  30. #include "Create.h"
  31. #include "SpriteWin.h"
  32. #include "Misc.h"
  33. #include "CheckBanks.h"
  34. #include "Configure.h"
  35.  
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <string.h>
  39.  
  40. extern window_handle db;
  41.  
  42.  
  43. static BOOL Null_updatefreebanks(event_pollblock *event, void *reference);
  44. static BOOL Null_updatedestbanks(event_pollblock *event, void *reference);
  45. static BOOL Null_updatesourcebanks(event_pollblock *event, void *reference);
  46. void update_freebanks(iconrange_block *range);
  47. void select_freebanks(iconrange_block *range);
  48. void update_destbanks(iconrange_block *range);
  49. void select_destbanks(iconrange_block *range);
  50. void update_sourcebanks(iconrange_block *range);
  51. void image_select(iconrange_block *range, int imageno);
  52. void image_deselect(iconrange_block *range, int imageno);
  53. void image_shade(iconrange_block *range, int imageno);
  54. void image_unshade(iconrange_block *range, int imageno);
  55. void image_setshade(iconrange_block *range, int imageno, BOOL shaded);
  56. BOOL image_getshade(iconrange_block *range, int imageno);
  57.  
  58.  
  59. /******************************************************************************
  60.  *                            extern routines                                 *
  61.  ******************************************************************************/
  62.  
  63. extern void CheckBanks_Init(void)
  64. {
  65.  /*
  66.   * initialisation to be done on startup
  67.   */
  68.  
  69. }
  70.  
  71. /******************************************************************************/
  72.  
  73. extern void CheckBanks_InstallScanFree(iconrange_block *range)
  74. {
  75.  /*
  76.   * install routines to update image bank radios to make used banks greyed out
  77.   */
  78.  
  79.  /*
  80.   * initialise the available banks
  81.   */
  82.   update_freebanks(range);
  83.  
  84.  /*
  85.   * preselect first free bank
  86.   */
  87.   select_freebanks(range);
  88.  
  89.   Event_Claim(event_NULL, event_ANY, event_ANY, Null_updatefreebanks, range);
  90.  
  91. }
  92.  
  93. /******************************************************************************/
  94.  
  95. extern void CheckBanks_InstallScanDestination(iconrange_block *range)
  96. {
  97.  /*
  98.   * install routines to update image bank radios to make unusable banks greyed out
  99.   */
  100.  
  101.  /*
  102.   * initialise the available banks
  103.   */
  104.   update_destbanks(range);
  105.  
  106.  /*
  107.   * preselect first free bank
  108.   */
  109.   select_destbanks(range);
  110.  
  111.   Event_Claim(event_NULL, event_ANY, event_ANY, Null_updatedestbanks, range);
  112.  
  113. }
  114.  
  115. /******************************************************************************/
  116.  
  117. extern void CheckBanks_InstallScanSource(iconrange_block *range)
  118. {
  119.  /*
  120.   * install routines to update image bank radios to greyed out unusable input
  121.   * images
  122.   */
  123.  
  124.  /*
  125.   * initialise the available banks
  126.   */
  127.   update_sourcebanks(range);
  128.  
  129.   Event_Claim(event_NULL, event_ANY, event_ANY, Null_updatesourcebanks, range);
  130.  
  131. }
  132.  
  133. /******************************************************************************/
  134.  
  135. extern void CheckBanks_RemoveScanFree(iconrange_block *range)
  136. {
  137.  
  138.   Event_Release(event_NULL, event_ANY, event_ANY, Null_updatefreebanks, range);
  139.  
  140. }
  141.  
  142. /******************************************************************************/
  143.  
  144. extern void CheckBanks_RemoveScanDestination(iconrange_block *range)
  145. {
  146.  
  147.   Event_Release(event_NULL, event_ANY, event_ANY, Null_updatedestbanks, range);
  148.  
  149. }
  150.  
  151. /******************************************************************************/
  152.  
  153. extern void CheckBanks_RemoveScanSource(iconrange_block *range)
  154. {
  155.  
  156.   Event_Release(event_NULL, event_ANY, event_ANY, Null_updatesourcebanks, range);
  157.  
  158. }
  159.  
  160. /******************************************************************************
  161.  *                            update routines                                 *
  162.  ******************************************************************************/
  163.  
  164. void update_freebanks(iconrange_block *range)
  165. {
  166.   int imageno;
  167.   BOOL shade;
  168.   BOOL freebank;
  169.   int freeimageno;
  170.  
  171.   freebank = FALSE;
  172.   freeimageno = 0;
  173.  
  174.  /*
  175.   * grey out used banks
  176.   */
  177.   for(imageno = 0; imageno < number_IMAGES; imageno++){
  178.  
  179.       shade = !SpriteWin_FreeImage(imageno);
  180.       if(shade != image_getshade(range, imageno))
  181.          image_setshade(range, imageno, shade);
  182.  
  183.       if(!shade){
  184.          freebank = TRUE;
  185.          freeimageno = imageno;
  186.       }
  187.  
  188.   }
  189.  
  190.  /*
  191.   * select another free bank if current one has been used
  192.   */
  193.   imageno = image_getselect(range);
  194.  
  195.   if(imageno != -1){
  196.  
  197.      if(image_getshade(range, imageno)){
  198.         image_deselect(range, imageno);
  199.         select_freebanks(range);
  200.      }
  201.  
  202.   }
  203.   else if(freebank)
  204.     image_select(range, freeimageno);
  205.  
  206. }
  207.  
  208. /******************************************************************************/
  209.  
  210. void update_destbanks(iconrange_block *range)
  211. {
  212.   int imageno;
  213.   BOOL shade;
  214.   BOOL destbank;
  215.   int destimageno;
  216.  
  217.   destbank = FALSE;
  218.   destimageno = 0;
  219.  
  220.  /*
  221.   * grey out used banks
  222.   */
  223.   for(imageno = 0; imageno < number_IMAGES; imageno++){
  224.  
  225.       switch(destinationbanktype)
  226.       {
  227.         case use_FREE:
  228.           shade = !SpriteWin_FreeImage(imageno);
  229.           if(imageno == range->sourceimage){ /* on source image bank */
  230.  
  231.              if(!shade){ /* source image bank is free so close window */
  232.                 if(range->close != NULL)
  233.                    (range->close)(FALSE, FALSE, range);
  234.              }
  235.           }
  236.           break;
  237.  
  238.         case use_FREEORSAME:
  239.           shade = !SpriteWin_FreeImage(imageno);
  240.  
  241.           if(imageno == range->sourceimage){ /* on source image bank */
  242.  
  243.              if(!shade){ /* source image bank is free so close window */
  244.                 if(range->close != NULL)
  245.                    (range->close)(FALSE, FALSE, range);
  246.              }
  247.           }
  248.           else if(shade) /* image is in use but maybe same size */
  249.              shade = !SpriteWin_SameSize(&range->size, imageno);
  250.           break;
  251.  
  252.         default:
  253.           shade = TRUE;
  254.           break;
  255.       }
  256.  
  257.       if(shade != image_getshade(range, imageno))
  258.          image_setshade(range, imageno, shade);
  259.  
  260.       if(!shade){
  261.          destbank = TRUE;
  262.          destimageno = imageno;
  263.       }
  264.  
  265.   }
  266.  
  267.  /*
  268.   * select another free bank if current one has been used
  269.   */
  270.   imageno = image_getselect(range);
  271.  
  272.   if(imageno != -1){
  273.  
  274.      if(image_getshade(range, imageno)){
  275.         image_deselect(range, imageno);
  276.         select_destbanks(range);
  277.      }
  278.  
  279.   }
  280.   else if(destbank)
  281.     image_select(range, destimageno);
  282.  
  283. }
  284.  
  285. /******************************************************************************/
  286.  
  287. void update_sourcebanks(iconrange_block *range)
  288. {
  289.   int selectedimage;
  290.   int imageno;
  291.   BOOL shade;
  292.  
  293.   selectedimage = image_getselect(range);
  294.  
  295.  /*
  296.   * grey out unusable banks and deselect if unusable is selected
  297.   */
  298.   for(imageno = 0; imageno < number_IMAGES; imageno++){
  299.  
  300.       shade = TRUE;
  301.  
  302.       if(imageno != range->sourceimage){ /* only try to use banks other than the ps */
  303.  
  304.          if(!SpriteWin_FreeImage(imageno))
  305.             shade = !SpriteWin_SameSize(&range->size, imageno);
  306.       }
  307.  
  308.       if(shade != image_getshade(range, imageno))
  309.          image_setshade(range, imageno, shade);
  310.  
  311.       if(shade && (imageno == selectedimage) )
  312.          image_deselect(range, imageno);
  313.  
  314.   }
  315.  
  316. }
  317.  
  318. /******************************************************************************/
  319.  
  320. static BOOL Null_updatefreebanks(event_pollblock *event, void *reference)
  321. {
  322.  
  323.   update_freebanks((iconrange_block *)reference);
  324.   
  325.   return(FALSE);
  326.  
  327. }
  328.  
  329. /******************************************************************************/
  330.  
  331. static BOOL Null_updatedestbanks(event_pollblock *event, void *reference)
  332. {
  333.              
  334.   update_destbanks((iconrange_block *)reference);
  335.   
  336.   return(FALSE);
  337.  
  338. }
  339.  
  340. /******************************************************************************/
  341.  
  342. static BOOL Null_updatesourcebanks(event_pollblock *event, void *reference)
  343. {
  344.              
  345.   update_sourcebanks((iconrange_block *)reference);
  346.   
  347.   return(FALSE);
  348.  
  349. }
  350.  
  351. /******************************************************************************
  352.  *                            select routines                                 *
  353.  ******************************************************************************/
  354.  
  355. void select_freebanks(iconrange_block *range)
  356. {
  357.   int imageno;
  358.  
  359.   imageno = 0;
  360.   while((imageno < number_IMAGES) && (image_getshade(range, imageno)))
  361.      imageno++;
  362.   if(imageno != number_IMAGES)
  363.      image_select(range, imageno);
  364. }
  365.  
  366. /******************************************************************************/
  367.  
  368. void select_destbanks(iconrange_block *range)
  369. {
  370.   int imageno;
  371.  
  372.   imageno = 0;
  373.   while((imageno < number_IMAGES) && (image_getshade(range, imageno)))
  374.      imageno++;
  375.   if(imageno != number_IMAGES)
  376.      image_select(range, imageno);
  377. }
  378.  
  379. /******************************************************************************/
  380.  
  381. void image_select(iconrange_block *range, int imageno)
  382. {
  383.   Icon_SetRadios(range->window, range->min, range->max, range->min + imageno);
  384. }
  385.  
  386. /******************************************************************************/
  387.  
  388. void image_deselect(iconrange_block *range, int imageno)
  389. {
  390.   Icon_Deselect(range->window, range->min + imageno);
  391. }
  392.  
  393. /******************************************************************************/
  394.  
  395. extern int image_getselect(iconrange_block *range)
  396. {
  397.  /*
  398.   * returns image bank selected or -1 if none are selected
  399.   */
  400.   int icon;
  401.  
  402.   icon = Icon_WhichRadio(range->window, range->min, range->max);
  403.  
  404.  /*
  405.   * check to see if the last icon is selected or none
  406.   */
  407.   if(icon == range->max){
  408.      if(!Icon_GetSelect(range->window, icon))
  409.         return(-1);
  410.   }
  411.  
  412.   return(icon - range->min);
  413. }
  414.  
  415. /******************************************************************************/
  416.  
  417. void image_shade(iconrange_block *range, int imageno)
  418. {
  419.   Icon_Shade(range->window, range->min + imageno);
  420. }
  421.  
  422. /******************************************************************************/
  423.  
  424. void image_unshade(iconrange_block *range, int imageno)
  425. {
  426.   Icon_Unshade(range->window, range->min + imageno);
  427. }
  428.  
  429. /******************************************************************************/
  430.  
  431. void image_setshade(iconrange_block *range, int imageno, BOOL shaded)
  432. {
  433.   Icon_SetShade(range->window, range->min + imageno, shaded);
  434. }
  435.  
  436. /******************************************************************************/
  437.  
  438. BOOL image_getshade(iconrange_block *range, int imageno)
  439. {
  440.  /*
  441.   * returns TRUE if icon is shaded
  442.   */
  443.   return(Icon_GetShade(range->window, range->min + imageno));
  444. }
  445.  
  446.  
  447.  
  448.  
  449.