1 /* $Id: gadget.c,v 1.3 2004-12-19 15:21:11 btb Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
16 static char rcsid[] = "$Id: gadget.c,v 1.3 2004-12-19 15:21:11 btb Exp $";
34 UI_GADGET * selected_gadget;
36 UI_GADGET * ui_gadget_add( UI_WINDOW * wnd, short kind, short x1, short y1, short x2, short y2 )
40 gadget = (UI_GADGET *)malloc( sizeof(UI_GADGET) );
41 if (gadget==NULL) exit(1);
43 if (wnd->gadget == NULL )
46 gadget->prev = gadget;
47 gadget->next = gadget;
49 wnd->gadget->prev->next = gadget;
50 gadget->next = wnd->gadget;
51 gadget->prev = wnd->gadget->prev;
52 wnd->gadget->prev = gadget;
55 gadget->when_tab = NULL;
56 gadget->when_btab = NULL;
57 gadget->when_up = NULL;
58 gadget->when_down = NULL;
59 gadget->when_left = NULL;
60 gadget->when_right = NULL;
63 gadget->oldstatus = 0;
64 if ( x1==0 && x2==0 && y1==0 && y2== 0 )
65 gadget->canvas = NULL;
67 gadget->canvas = gr_create_sub_canvas( wnd->canvas, x1, y1, x2-x1+1, y2-y1+1 );
68 gadget->x1 = gadget->canvas->cv_bitmap.bm_x;
69 gadget->y1 = gadget->canvas->cv_bitmap.bm_y;
70 gadget->x2 = gadget->canvas->cv_bitmap.bm_x+x2-x1+1;
71 gadget->y2 = gadget->canvas->cv_bitmap.bm_y+y2-y1+1;
72 gadget->parent = NULL;
78 void ui_gadget_delete_all( UI_WINDOW * wnd )
84 while( wnd->gadget != NULL )
87 if (tmp->next == tmp )
91 tmp->next->prev = tmp->prev;
92 tmp->prev->next = tmp->next;
93 wnd->gadget = tmp->next;
96 gr_free_sub_canvas( tmp->canvas );
99 if (tmp->kind == 1 ) // Button
101 UI_GADGET_BUTTON * but1 = (UI_GADGET_BUTTON *)tmp;
106 if (tmp->kind == 6 ) // Inputbox
108 UI_GADGET_INPUTBOX * but1 = (UI_GADGET_INPUTBOX *)tmp;
112 if (tmp->kind == 5 ) // Checkbox
114 UI_GADGET_CHECKBOX * but1 = (UI_GADGET_CHECKBOX *)tmp;
118 if (tmp->kind == 9 ) // Icon
120 UI_GADGET_ICON * but1 = (UI_GADGET_ICON *)tmp;
130 int is_under_another_window( UI_WINDOW * win, UI_GADGET * gadget )
136 while( temp != NULL ) {
137 if ( ( gadget->x1 > temp->x) &&
138 ( gadget->x1 < (temp->x+temp->width) ) &&
139 ( gadget->y1 > temp->y) &&
140 ( gadget->y1 < (temp->y+temp->height) )
148 if ( ( gadget->x2 > temp->x) &&
149 ( gadget->x2 < (temp->x+temp->width) ) &&
150 ( gadget->y2 > temp->y) &&
151 ( gadget->y2 < (temp->y+temp->height) )
165 int ui_mouse_on_gadget( UI_GADGET * gadget )
167 if ((Mouse.x >= gadget->x1) && (Mouse.x <= gadget->x2-1) && (Mouse.y >= gadget->y1) && (Mouse.y <= gadget->y2-1) ) {
168 if (is_under_another_window(CurWindow, gadget))
175 void ui_window_do_gadgets( UI_WINDOW * wnd )
178 UI_GADGET * tmp, * tmp1;
182 keypress = last_keypress;
186 if (tmp == NULL ) return;
188 if (selected_gadget==NULL)
189 selected_gadget = tmp;
191 tmp1 = wnd->keyboard_focus_gadget;
195 if (ui_mouse_on_gadget(tmp) && B1_JUST_PRESSED )
197 selected_gadget = tmp;
198 if (tmp->parent!=NULL)
200 while (tmp->parent != NULL )
202 wnd->keyboard_focus_gadget = tmp;
207 wnd->keyboard_focus_gadget = tmp;
211 if ( tmp->hotkey == keypress )
213 wnd->keyboard_focus_gadget = tmp;
217 } while( tmp != wnd->gadget );
219 if (wnd->keyboard_focus_gadget != NULL)
224 if ( wnd->keyboard_focus_gadget->when_tab != NULL )
225 wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_tab;
227 case (KEY_TAB+KEY_SHIFTED):
228 if ( wnd->keyboard_focus_gadget->when_btab != NULL )
229 wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_btab;
232 if ( wnd->keyboard_focus_gadget->when_up != NULL )
233 wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_up;
236 if ( wnd->keyboard_focus_gadget->when_down != NULL )
237 wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_down;
240 if ( wnd->keyboard_focus_gadget->when_left != NULL )
241 wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_left;
244 if ( wnd->keyboard_focus_gadget->when_right != NULL )
245 wnd->keyboard_focus_gadget = wnd->keyboard_focus_gadget->when_right;
250 if (wnd->keyboard_focus_gadget != tmp1)
252 if (wnd->keyboard_focus_gadget != NULL )
253 wnd->keyboard_focus_gadget->status = 1;
261 if (!is_under_another_window( CurWindow, tmp )) {
262 UI_WINDOW *curwindow_save=CurWindow;
267 ui_button_do( (UI_GADGET_BUTTON *)tmp, keypress );
270 ui_listbox_do( (UI_GADGET_LISTBOX *)tmp, keypress );
273 ui_scrollbar_do( (UI_GADGET_SCROLLBAR *)tmp, keypress );
276 ui_radio_do( (UI_GADGET_RADIO *)tmp, keypress );
279 ui_checkbox_do( (UI_GADGET_CHECKBOX *)tmp, keypress );
282 ui_inputbox_do( (UI_GADGET_INPUTBOX *)tmp, keypress );
285 ui_userbox_do( (UI_GADGET_USERBOX *)tmp, keypress );
288 ui_keytrap_do( (UI_GADGET_KEYTRAP *)tmp, keypress );
291 ui_icon_do( (UI_GADGET_ICON *)tmp, keypress );
295 CurWindow=curwindow_save;
299 } while( tmp != wnd->gadget );
304 UI_GADGET * ui_gadget_get_next( UI_GADGET * gadget )
310 while( tmp != gadget && (tmp->parent!=NULL) )
316 UI_GADGET * ui_gadget_get_prev( UI_GADGET * gadget )
322 while( tmp != gadget && (tmp->parent!=NULL) )
328 void ui_gadget_calc_keys( UI_WINDOW * wnd)
334 if (tmp==NULL) return;
338 tmp->when_tab = ui_gadget_get_next(tmp);
339 tmp->when_btab = ui_gadget_get_prev(tmp);
342 } while( tmp != wnd->gadget );