GADGET.C 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  12. */
  13. /*
  14. * $Source: f:/miner/source/ui/rcs/gadget.c $
  15. * $Revision: 1.6 $
  16. * $Author: matt $
  17. * $Date: 1994/08/09 09:56:48 $
  18. *
  19. * General routines for all the low-level gadgets.
  20. *
  21. * $Log: gadget.c $
  22. * Revision 1.6 1994/08/09 09:56:48 matt
  23. * Save & restore curwindow around button processing
  24. *
  25. * Revision 1.5 1994/04/22 11:10:13 john
  26. * *** empty log message ***
  27. *
  28. * Revision 1.4 1993/12/07 12:31:11 john
  29. * new version.
  30. *
  31. * Revision 1.3 1993/10/26 13:46:19 john
  32. * *** empty log message ***
  33. *
  34. * Revision 1.2 1993/10/05 17:30:06 john
  35. * ,
  36. *
  37. * Revision 1.1 1993/09/20 10:34:54 john
  38. * Initial revision
  39. *
  40. *
  41. */
  42. #pragma off (unreferenced)
  43. static char rcsid[] = "$Id: gadget.c 1.6 1994/08/09 09:56:48 matt Exp $";
  44. #pragma on (unreferenced)
  45. #include <stdio.h>
  46. #include <stdlib.h>
  47. #include "mem.h"
  48. #include "fix.h"
  49. #include "types.h"
  50. #include "gr.h"
  51. #include "ui.h"
  52. #include "key.h"
  53. UI_GADGET * selected_gadget;
  54. UI_GADGET * ui_gadget_add( UI_WINDOW * wnd, short kind, short x1, short y1, short x2, short y2 )
  55. {
  56. UI_GADGET * gadget;
  57. gadget = (UI_GADGET *)malloc( sizeof(UI_GADGET) );
  58. if (gadget==NULL) exit(1);
  59. if (wnd->gadget == NULL )
  60. {
  61. wnd->gadget = gadget;
  62. gadget->prev = gadget;
  63. gadget->next = gadget;
  64. } else {
  65. wnd->gadget->prev->next = gadget;
  66. gadget->next = wnd->gadget;
  67. gadget->prev = wnd->gadget->prev;
  68. wnd->gadget->prev = gadget;
  69. }
  70. gadget->when_tab = NULL;
  71. gadget->when_btab = NULL;
  72. gadget->when_up = NULL;
  73. gadget->when_down = NULL;
  74. gadget->when_left = NULL;
  75. gadget->when_right = NULL;
  76. gadget->kind = kind;
  77. gadget->status = 1;
  78. gadget->oldstatus = 0;
  79. if ( x1==0 && x2==0 && y1==0 && y2== 0 )
  80. gadget->canvas = NULL;
  81. else
  82. gadget->canvas = gr_create_sub_canvas( wnd->canvas, x1, y1, x2-x1+1, y2-y1+1 );
  83. gadget->x1 = gadget->canvas->cv_bitmap.bm_x;
  84. gadget->y1 = gadget->canvas->cv_bitmap.bm_y;
  85. gadget->x2 = gadget->canvas->cv_bitmap.bm_x+x2-x1+1;
  86. gadget->y2 = gadget->canvas->cv_bitmap.bm_y+y2-y1+1;
  87. gadget->parent = NULL;
  88. gadget->hotkey = -1;
  89. return gadget;
  90. }
  91. void ui_gadget_delete_all( UI_WINDOW * wnd )
  92. {
  93. UI_GADGET * tmp;
  94. while( wnd->gadget != NULL )
  95. {
  96. tmp = wnd->gadget;
  97. if (tmp->next == tmp )
  98. {
  99. wnd->gadget = NULL;
  100. } else {
  101. tmp->next->prev = tmp->prev;
  102. tmp->prev->next = tmp->next;
  103. wnd->gadget = tmp->next;
  104. }
  105. if (tmp->canvas)
  106. gr_free_sub_canvas( tmp->canvas );
  107. if (tmp->kind == 1 ) // Button
  108. {
  109. UI_GADGET_BUTTON * but1 = (UI_GADGET_BUTTON *)tmp;
  110. if (but1->text)
  111. free( but1->text );
  112. }
  113. if (tmp->kind == 6 ) // Inputbox
  114. {
  115. UI_GADGET_INPUTBOX * but1 = (UI_GADGET_INPUTBOX *)tmp;
  116. free( but1->text );
  117. }
  118. if (tmp->kind == 5 ) // Checkbox
  119. {
  120. UI_GADGET_CHECKBOX * but1 = (UI_GADGET_CHECKBOX *)tmp;
  121. free( but1->text );
  122. }
  123. if (tmp->kind == 9 ) // Icon
  124. {
  125. UI_GADGET_ICON * but1 = (UI_GADGET_ICON *)tmp;
  126. free( but1->text );
  127. }
  128. free( tmp );
  129. }
  130. }
  131. int is_under_another_window( UI_WINDOW * win, UI_GADGET * gadget )
  132. {
  133. UI_WINDOW * temp;
  134. temp = win->next;
  135. while( temp != NULL ) {
  136. if ( ( gadget->x1 > temp->x) &&
  137. ( gadget->x1 < (temp->x+temp->width) ) &&
  138. ( gadget->y1 > temp->y) &&
  139. ( gadget->y1 < (temp->y+temp->height) )
  140. )
  141. {
  142. //gadget->status =1;
  143. return 1;
  144. }
  145. if ( ( gadget->x2 > temp->x) &&
  146. ( gadget->x2 < (temp->x+temp->width) ) &&
  147. ( gadget->y2 > temp->y) &&
  148. ( gadget->y2 < (temp->y+temp->height) )
  149. )
  150. {
  151. //gadget->status =1;
  152. return 1;
  153. }
  154. temp = temp->next;
  155. }
  156. return 0;
  157. }
  158. int ui_mouse_on_gadget( UI_GADGET * gadget )
  159. {
  160. if ((Mouse.x >= gadget->x1) && (Mouse.x <= gadget->x2-1) && (Mouse.y >= gadget->y1) && (Mouse.y <= gadget->y2-1) ) {
  161. if (is_under_another_window(CurWindow, gadget))
  162. return 0;
  163. return 1;
  164. } else
  165. return 0;
  166. }
  167. void ui_window_do_gadgets( UI_WINDOW * wnd )
  168. {
  169. int keypress;
  170. UI_GADGET * tmp, * tmp1;
  171. CurWindow = wnd;
  172. keypress = last_keypress;
  173. tmp = wnd->gadget;
  174. if (tmp == NULL ) return;
  175. if (selected_gadget==NULL)
  176. selected_gadget = tmp;
  177. tmp1 = wnd->keyboard_focus_gadget;
  178. do
  179. {
  180. if (ui_mouse_on_gadget(tmp) && B1_JUST_PRESSED )
  181. {
  182. selected_gadget = tmp;
  183. if (tmp->parent!=NULL)
  184. {
  185. while (tmp->parent != NULL )
  186. tmp = tmp->parent;
  187. wnd->keyboard_focus_gadget = tmp;
  188. break;
  189. }
  190. else
  191. {
  192. wnd->keyboard_focus_gadget = tmp;
  193. break;
  194. }
  195. }
  196. if ( tmp->hotkey == keypress )
  197. {
  198. wnd->keyboard_focus_gadget = tmp;
  199. break;
  200. }
  201. tmp = tmp->next;
  202. } while( tmp != wnd->gadget );
  203. if (wnd->keyboard_focus_gadget != NULL)
  204. {
  205. switch (keypress )
  206. {
  207. case (KEY_TAB):
  208. if ( wnd->keyboard_focus_gadget->when_tab != NULL )
  209. wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_tab;
  210. break;
  211. case (KEY_TAB+KEY_SHIFTED):
  212. if ( wnd->keyboard_focus_gadget->when_btab != NULL )
  213. wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_btab;
  214. break;
  215. case (KEY_UP):
  216. if ( wnd->keyboard_focus_gadget->when_up != NULL )
  217. wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_up;
  218. break;
  219. case (KEY_DOWN):
  220. if ( wnd->keyboard_focus_gadget->when_down != NULL )
  221. wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_down;
  222. break;
  223. case (KEY_LEFT):
  224. if ( wnd->keyboard_focus_gadget->when_left != NULL )
  225. wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_left;
  226. break;
  227. case (KEY_RIGHT):
  228. if ( wnd->keyboard_focus_gadget->when_right != NULL )
  229. wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_right;
  230. break;
  231. }
  232. }
  233. if (wnd->keyboard_focus_gadget != tmp1)
  234. {
  235. if (wnd->keyboard_focus_gadget != NULL )
  236. wnd->keyboard_focus_gadget->status = 1;
  237. if (tmp1 != NULL )
  238. tmp1->status = 1;
  239. }
  240. tmp = wnd->gadget;
  241. do
  242. {
  243. if (!is_under_another_window( CurWindow, tmp )) {
  244. UI_WINDOW *curwindow_save=CurWindow;
  245. switch( tmp->kind )
  246. {
  247. case 1:
  248. ui_button_do( (UI_GADGET_BUTTON *)tmp, keypress );
  249. break;
  250. case 2:
  251. ui_listbox_do( (UI_GADGET_LISTBOX *)tmp, keypress );
  252. break;
  253. case 3:
  254. ui_scrollbar_do( (UI_GADGET_SCROLLBAR *)tmp, keypress );
  255. break;
  256. case 4:
  257. ui_radio_do( (UI_GADGET_RADIO *)tmp, keypress );
  258. break;
  259. case 5:
  260. ui_checkbox_do( (UI_GADGET_CHECKBOX *)tmp, keypress );
  261. break;
  262. case 6:
  263. ui_inputbox_do( (UI_GADGET_INPUTBOX *)tmp, keypress );
  264. break;
  265. case 7:
  266. ui_userbox_do( (UI_GADGET_USERBOX *)tmp, keypress );
  267. break;
  268. case 8:
  269. ui_keytrap_do( (UI_GADGET_KEYTRAP *)tmp, keypress );
  270. break;
  271. case 9:
  272. ui_icon_do( (UI_GADGET_ICON *)tmp, keypress );
  273. break;
  274. }
  275. CurWindow=curwindow_save;
  276. }
  277. tmp = tmp->next;
  278. } while( tmp != wnd->gadget );
  279. }
  280. UI_GADGET * ui_gadget_get_next( UI_GADGET * gadget )
  281. {
  282. UI_GADGET * tmp;
  283. tmp = gadget->next;
  284. while( tmp != gadget && (tmp->parent!=NULL) )
  285. tmp = tmp->next;
  286. return tmp;
  287. }
  288. UI_GADGET * ui_gadget_get_prev( UI_GADGET * gadget )
  289. {
  290. UI_GADGET * tmp;
  291. tmp = gadget->prev;
  292. while( tmp != gadget && (tmp->parent!=NULL) )
  293. tmp = tmp->prev;
  294. return tmp;
  295. }
  296. void ui_gadget_calc_keys( UI_WINDOW * wnd)
  297. {
  298. UI_GADGET * tmp;
  299. tmp = wnd->gadget;
  300. if (tmp==NULL) return;
  301. do
  302. {
  303. tmp->when_tab = ui_gadget_get_next(tmp);
  304. tmp->when_btab = ui_gadget_get_prev(tmp);
  305. tmp = tmp->next;
  306. } while( tmp != wnd->gadget );
  307. }