93ba25f8 |
1 | /* $Id: macctrls.c,v 1.7 2003/03/20 23:15:25 ben Exp $ */ |
8a7e67ec |
2 | /* |
3 | * Copyright (c) 2003 Ben Harris |
4 | * All rights reserved. |
5 | * |
6 | * Permission is hereby granted, free of charge, to any person |
7 | * obtaining a copy of this software and associated documentation |
8 | * files (the "Software"), to deal in the Software without |
9 | * restriction, including without limitation the rights to use, |
10 | * copy, modify, merge, publish, distribute, sublicense, and/or |
11 | * sell copies of the Software, and to permit persons to whom the |
12 | * Software is furnished to do so, subject to the following |
13 | * conditions: |
14 | * |
15 | * The above copyright notice and this permission notice shall be |
16 | * included in all copies or substantial portions of the Software. |
17 | * |
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
19 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
20 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
21 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR |
22 | * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF |
23 | * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
24 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
25 | * SOFTWARE. |
26 | */ |
27 | |
28 | #include <MacTypes.h> |
29 | #include <Appearance.h> |
30 | #include <Controls.h> |
31 | #include <ControlDefinitions.h> |
fa4942e7 |
32 | #include <Resources.h> |
8a7e67ec |
33 | #include <Sound.h> |
34 | #include <TextUtils.h> |
35 | #include <Windows.h> |
36 | |
93ba25f8 |
37 | #include <assert.h> |
38 | |
8a7e67ec |
39 | #include "putty.h" |
40 | #include "mac.h" |
41 | #include "macresid.h" |
42 | #include "dialog.h" |
43 | #include "tree234.h" |
44 | |
45 | union macctrl { |
46 | struct macctrl_generic { |
47 | enum { |
48 | MACCTRL_TEXT, |
49 | MACCTRL_RADIO, |
50 | MACCTRL_CHECKBOX, |
51 | MACCTRL_BUTTON |
52 | } type; |
53 | /* Template from which this was generated */ |
54 | union control *ctrl; |
55 | } generic; |
56 | struct { |
57 | struct macctrl_generic generic; |
58 | ControlRef tbctrl; |
59 | } text; |
60 | struct { |
61 | struct macctrl_generic generic; |
62 | ControlRef *tbctrls; |
63 | } radio; |
64 | struct { |
65 | struct macctrl_generic generic; |
66 | ControlRef tbctrl; |
67 | } checkbox; |
68 | struct { |
69 | struct macctrl_generic generic; |
70 | ControlRef tbctrl; |
71 | } button; |
72 | }; |
73 | |
74 | struct mac_layoutstate { |
75 | Point pos; |
76 | unsigned int width; |
77 | }; |
78 | |
79 | #define ctrlevent(mcs, mc, event) do { \ |
80 | if ((mc)->generic.ctrl->generic.handler != NULL) \ |
93ba25f8 |
81 | (*(mc)->generic.ctrl->generic.handler)((mc)->generic.ctrl, (mcs),\ |
8a7e67ec |
82 | (mcs)->data, (event)); \ |
83 | } while (0) |
84 | |
93ba25f8 |
85 | #define findbyctrl(mcs, ctrl) \ |
86 | find234((mcs)->byctrl, (ctrl), macctrl_cmp_byctrl_find) |
87 | |
8a7e67ec |
88 | static void macctrl_layoutset(struct mac_layoutstate *, struct controlset *, |
89 | WindowPtr, struct macctrls *); |
90 | static void macctrl_text(struct macctrls *, WindowPtr, |
91 | struct mac_layoutstate *, union control *); |
92 | static void macctrl_radio(struct macctrls *, WindowPtr, |
93 | struct mac_layoutstate *, union control *); |
94 | static void macctrl_checkbox(struct macctrls *, WindowPtr, |
95 | struct mac_layoutstate *, union control *); |
96 | static void macctrl_button(struct macctrls *, WindowPtr, |
97 | struct mac_layoutstate *, union control *); |
fa4942e7 |
98 | #if !TARGET_API_MAC_CARBON |
99 | static pascal SInt32 macctrl_sys7_text_cdef(SInt16, ControlRef, |
100 | ControlDefProcMessage, SInt32); |
5537f572 |
101 | static pascal SInt32 macctrl_sys7_default_cdef(SInt16, ControlRef, |
102 | ControlDefProcMessage, SInt32); |
fa4942e7 |
103 | #endif |
104 | |
105 | #if !TARGET_API_MAC_CARBON |
106 | /* |
107 | * This trick enables us to keep all the CDEF code in the main |
108 | * application, which makes life easier. For details, see |
109 | * <http://developer.apple.com/technotes/tn/tn2003.html#custom_code_base>. |
110 | */ |
111 | |
112 | #pragma options align=mac68k |
113 | typedef struct { |
114 | short jmpabs; /* 4EF9 */ |
115 | ControlDefUPP theUPP; |
116 | } **PatchCDEF; |
117 | #pragma options align=reset |
118 | #endif |
119 | |
120 | static void macctrl_init() |
121 | { |
122 | #if !TARGET_API_MAC_CARBON |
123 | static int inited = 0; |
124 | PatchCDEF cdef; |
125 | |
126 | if (inited) return; |
127 | cdef = (PatchCDEF)GetResource(kControlDefProcResourceType, CDEF_Text); |
128 | (*cdef)->theUPP = NewControlDefProc(macctrl_sys7_text_cdef); |
5537f572 |
129 | cdef = (PatchCDEF)GetResource(kControlDefProcResourceType, CDEF_Default); |
130 | (*cdef)->theUPP = NewControlDefProc(macctrl_sys7_default_cdef); |
fa4942e7 |
131 | inited = 1; |
132 | #endif |
133 | } |
134 | |
8a7e67ec |
135 | |
136 | static int macctrl_cmp_byctrl(void *av, void *bv) |
137 | { |
138 | union macctrl *a = (union macctrl *)av; |
139 | union macctrl *b = (union macctrl *)bv; |
140 | |
141 | if (a->generic.ctrl < b->generic.ctrl) |
142 | return -1; |
143 | else if (a->generic.ctrl > b->generic.ctrl) |
144 | return +1; |
145 | else |
146 | return 0; |
147 | } |
148 | |
93ba25f8 |
149 | static int macctrl_cmp_byctrl_find(void *av, void *bv) |
150 | { |
151 | union control *a = (union control *)av; |
152 | union macctrl *b = (union macctrl *)bv; |
153 | |
154 | if (a < b->generic.ctrl) |
155 | return -1; |
156 | else if (a > b->generic.ctrl) |
157 | return +1; |
158 | else |
159 | return 0; |
160 | } |
161 | |
8a7e67ec |
162 | void macctrl_layoutbox(struct controlbox *cb, WindowPtr window, |
163 | struct macctrls *mcs) |
164 | { |
165 | int i; |
166 | struct mac_layoutstate curstate; |
167 | ControlRef root; |
168 | Rect rect; |
fa4942e7 |
169 | |
170 | macctrl_init(); |
8a7e67ec |
171 | #if TARGET_API_MAC_CARBON |
172 | GetPortBounds(GetWindowPort(window), &rect); |
173 | #else |
174 | rect = window->portRect; |
175 | #endif |
176 | curstate.pos.h = rect.left + 13; |
177 | curstate.pos.v = rect.top + 13; |
178 | curstate.width = rect.right - rect.left - (13 * 2); |
179 | if (mac_gestalts.apprvers >= 0x100) |
180 | CreateRootControl(window, &root); |
181 | mcs->byctrl = newtree234(macctrl_cmp_byctrl); |
182 | for (i = 0; i < cb->nctrlsets; i++) |
183 | macctrl_layoutset(&curstate, cb->ctrlsets[i], window, mcs); |
184 | } |
185 | |
186 | static void macctrl_layoutset(struct mac_layoutstate *curstate, |
187 | struct controlset *s, |
188 | WindowPtr window, struct macctrls *mcs) |
189 | { |
190 | unsigned int i; |
191 | |
192 | fprintf(stderr, "--- begin set ---\n"); |
93ba25f8 |
193 | fprintf(stderr, "pathname = %s\n", s->pathname); |
8a7e67ec |
194 | if (s->boxname && *s->boxname) |
195 | fprintf(stderr, "boxname = %s\n", s->boxname); |
196 | if (s->boxtitle) |
197 | fprintf(stderr, "boxtitle = %s\n", s->boxtitle); |
198 | |
199 | |
200 | for (i = 0; i < s->ncontrols; i++) { |
201 | union control *ctrl = s->ctrls[i]; |
202 | char const *s; |
203 | |
204 | switch (ctrl->generic.type) { |
205 | case CTRL_TEXT: s = "text"; break; |
206 | case CTRL_EDITBOX: s = "editbox"; break; |
207 | case CTRL_RADIO: s = "radio"; break; |
208 | case CTRL_CHECKBOX: s = "checkbox"; break; |
209 | case CTRL_BUTTON: s = "button"; break; |
210 | case CTRL_LISTBOX: s = "listbox"; break; |
211 | case CTRL_COLUMNS: s = "columns"; break; |
212 | case CTRL_FILESELECT: s = "fileselect"; break; |
213 | case CTRL_FONTSELECT: s = "fontselect"; break; |
214 | case CTRL_TABDELAY: s = "tabdelay"; break; |
215 | default: s = "unknown"; break; |
216 | } |
217 | fprintf(stderr, " control: %s\n", s); |
218 | switch (ctrl->generic.type) { |
219 | case CTRL_TEXT: |
220 | macctrl_text(mcs, window, curstate, ctrl); |
221 | break; |
222 | case CTRL_RADIO: |
223 | macctrl_radio(mcs, window, curstate, ctrl); |
224 | break; |
225 | case CTRL_CHECKBOX: |
226 | macctrl_checkbox(mcs, window, curstate, ctrl); |
227 | break; |
228 | case CTRL_BUTTON: |
229 | macctrl_button(mcs, window, curstate, ctrl); |
230 | break; |
231 | |
232 | } |
233 | } |
234 | } |
235 | |
236 | static void macctrl_text(struct macctrls *mcs, WindowPtr window, |
237 | struct mac_layoutstate *curstate, |
238 | union control *ctrl) |
239 | { |
240 | union macctrl *mc = smalloc(sizeof *mc); |
241 | Rect bounds; |
242 | |
243 | fprintf(stderr, " label = %s\n", ctrl->text.label); |
244 | mc->generic.type = MACCTRL_TEXT; |
245 | mc->generic.ctrl = ctrl; |
246 | bounds.left = curstate->pos.h; |
247 | bounds.right = bounds.left + curstate->width; |
248 | bounds.top = curstate->pos.v; |
249 | bounds.bottom = bounds.top + 16; |
250 | if (mac_gestalts.apprvers >= 0x100) { |
251 | SInt16 height; |
252 | Size olen; |
253 | |
254 | mc->text.tbctrl = NewControl(window, &bounds, NULL, TRUE, 0, 0, 0, |
255 | kControlStaticTextProc, (long)mc); |
256 | SetControlData(mc->text.tbctrl, kControlEntireControl, |
257 | kControlStaticTextTextTag, |
258 | strlen(ctrl->text.label), ctrl->text.label); |
259 | GetControlData(mc->text.tbctrl, kControlEntireControl, |
260 | kControlStaticTextTextHeightTag, |
261 | sizeof(height), &height, &olen); |
262 | fprintf(stderr, " height = %d\n", height); |
263 | SizeControl(mc->text.tbctrl, curstate->width, height); |
264 | curstate->pos.v += height + 6; |
265 | } else { |
fa4942e7 |
266 | Str255 title; |
267 | |
268 | c2pstrcpy(title, ctrl->text.label); |
269 | mc->text.tbctrl = NewControl(window, &bounds, title, TRUE, 0, 0, 0, |
270 | SYS7_TEXT_PROC, (long)mc); |
8a7e67ec |
271 | } |
272 | add234(mcs->byctrl, mc); |
273 | } |
274 | |
fa4942e7 |
275 | #if !TARGET_API_MAC_CARBON |
276 | static pascal SInt32 macctrl_sys7_text_cdef(SInt16 variant, ControlRef control, |
277 | ControlDefProcMessage msg, SInt32 param) |
278 | { |
279 | RgnHandle rgn; |
280 | |
281 | switch (msg) { |
282 | case drawCntl: |
283 | if ((*control)->contrlVis) |
284 | TETextBox((*control)->contrlTitle + 1, (*control)->contrlTitle[0], |
285 | &(*control)->contrlRect, teFlushDefault); |
286 | return 0; |
287 | case calcCRgns: |
288 | if (param & (1 << 31)) { |
289 | param &= ~(1 << 31); |
290 | goto calcthumbrgn; |
291 | } |
292 | /* FALLTHROUGH */ |
293 | case calcCntlRgn: |
294 | rgn = (RgnHandle)param; |
295 | RectRgn(rgn, &(*control)->contrlRect); |
296 | return 0; |
297 | case calcThumbRgn: |
298 | calcthumbrgn: |
299 | rgn = (RgnHandle)param; |
300 | SetEmptyRgn(rgn); |
301 | return 0; |
302 | } |
303 | |
304 | return 0; |
305 | } |
306 | #endif |
307 | |
8a7e67ec |
308 | static void macctrl_radio(struct macctrls *mcs, WindowPtr window, |
309 | struct mac_layoutstate *curstate, |
310 | union control *ctrl) |
311 | { |
312 | union macctrl *mc = smalloc(sizeof *mc); |
313 | Rect bounds; |
314 | Str255 title; |
315 | unsigned int i, colwidth; |
316 | |
317 | fprintf(stderr, " label = %s\n", ctrl->radio.label); |
318 | mc->generic.type = MACCTRL_RADIO; |
319 | mc->generic.ctrl = ctrl; |
320 | mc->radio.tbctrls = |
321 | smalloc(sizeof(*mc->radio.tbctrls) * ctrl->radio.nbuttons); |
322 | colwidth = (curstate->width + 13) / ctrl->radio.ncolumns; |
323 | for (i = 0; i < ctrl->radio.nbuttons; i++) { |
324 | fprintf(stderr, " button = %s\n", ctrl->radio.buttons[i]); |
325 | bounds.top = curstate->pos.v; |
326 | bounds.bottom = bounds.top + 16; |
327 | bounds.left = curstate->pos.h + colwidth * (i % ctrl->radio.ncolumns); |
328 | if (i == ctrl->radio.nbuttons - 1 || |
329 | i % ctrl->radio.ncolumns == ctrl->radio.ncolumns - 1) { |
330 | bounds.right = curstate->pos.h + curstate->width; |
331 | curstate->pos.v += 22; |
332 | } else |
333 | bounds.right = bounds.left + colwidth - 13; |
334 | c2pstrcpy(title, ctrl->radio.buttons[i]); |
335 | mc->radio.tbctrls[i] = NewControl(window, &bounds, title, TRUE, |
336 | 0, 0, 1, radioButProc, (long)mc); |
337 | } |
338 | add234(mcs->byctrl, mc); |
339 | ctrlevent(mcs, mc, EVENT_REFRESH); |
340 | } |
341 | |
342 | static void macctrl_checkbox(struct macctrls *mcs, WindowPtr window, |
343 | struct mac_layoutstate *curstate, |
344 | union control *ctrl) |
345 | { |
346 | union macctrl *mc = smalloc(sizeof *mc); |
347 | Rect bounds; |
348 | Str255 title; |
349 | |
350 | fprintf(stderr, " label = %s\n", ctrl->checkbox.label); |
351 | mc->generic.type = MACCTRL_CHECKBOX; |
352 | mc->generic.ctrl = ctrl; |
353 | bounds.left = curstate->pos.h; |
354 | bounds.right = bounds.left + curstate->width; |
355 | bounds.top = curstate->pos.v; |
356 | bounds.bottom = bounds.top + 16; |
357 | c2pstrcpy(title, ctrl->checkbox.label); |
358 | mc->checkbox.tbctrl = NewControl(window, &bounds, title, TRUE, 0, 0, 1, |
359 | checkBoxProc, (long)mc); |
360 | add234(mcs->byctrl, mc); |
361 | curstate->pos.v += 22; |
362 | ctrlevent(mcs, mc, EVENT_REFRESH); |
363 | } |
364 | |
365 | static void macctrl_button(struct macctrls *mcs, WindowPtr window, |
366 | struct mac_layoutstate *curstate, |
367 | union control *ctrl) |
368 | { |
369 | union macctrl *mc = smalloc(sizeof *mc); |
370 | Rect bounds; |
371 | Str255 title; |
372 | |
373 | fprintf(stderr, " label = %s\n", ctrl->button.label); |
374 | if (ctrl->button.isdefault) |
375 | fprintf(stderr, " is default\n"); |
376 | mc->generic.type = MACCTRL_BUTTON; |
377 | mc->generic.ctrl = ctrl; |
378 | bounds.left = curstate->pos.h; |
379 | bounds.right = bounds.left + 100; /* XXX measure string */ |
380 | bounds.top = curstate->pos.v; |
381 | bounds.bottom = bounds.top + 20; |
382 | c2pstrcpy(title, ctrl->button.label); |
383 | mc->button.tbctrl = NewControl(window, &bounds, title, TRUE, 0, 0, 1, |
384 | pushButProc, (long)mc); |
385 | if (mac_gestalts.apprvers >= 0x100) { |
386 | Boolean isdefault = ctrl->button.isdefault; |
387 | |
388 | SetControlData(mc->button.tbctrl, kControlEntireControl, |
389 | kControlPushButtonDefaultTag, |
390 | sizeof(isdefault), &isdefault); |
5537f572 |
391 | } else if (ctrl->button.isdefault) { |
392 | InsetRect(&bounds, -4, -4); |
393 | NewControl(window, &bounds, title, TRUE, 0, 0, 1, |
394 | SYS7_DEFAULT_PROC, (long)mc); |
8a7e67ec |
395 | } |
855d05c4 |
396 | if (mac_gestalts.apprvers >= 0x110) { |
397 | Boolean iscancel = ctrl->button.iscancel; |
398 | |
399 | SetControlData(mc->button.tbctrl, kControlEntireControl, |
400 | kControlPushButtonCancelTag, |
401 | sizeof(iscancel), &iscancel); |
402 | } |
8a7e67ec |
403 | add234(mcs->byctrl, mc); |
404 | curstate->pos.v += 26; |
405 | } |
406 | |
5537f572 |
407 | #if !TARGET_API_MAC_CARBON |
408 | static pascal SInt32 macctrl_sys7_default_cdef(SInt16 variant, |
409 | ControlRef control, |
410 | ControlDefProcMessage msg, |
411 | SInt32 param) |
412 | { |
413 | RgnHandle rgn; |
414 | Rect rect; |
415 | int oval; |
416 | |
417 | switch (msg) { |
418 | case drawCntl: |
419 | if ((*control)->contrlVis) { |
420 | rect = (*control)->contrlRect; |
421 | PenNormal(); |
422 | PenSize(3, 3); |
423 | oval = (rect.bottom - rect.top) / 2 + 2; |
424 | FrameRoundRect(&rect, oval, oval); |
425 | } |
426 | return 0; |
427 | case calcCRgns: |
428 | if (param & (1 << 31)) { |
429 | param &= ~(1 << 31); |
430 | goto calcthumbrgn; |
431 | } |
432 | /* FALLTHROUGH */ |
433 | case calcCntlRgn: |
434 | rgn = (RgnHandle)param; |
435 | RectRgn(rgn, &(*control)->contrlRect); |
436 | return 0; |
437 | case calcThumbRgn: |
438 | calcthumbrgn: |
439 | rgn = (RgnHandle)param; |
440 | SetEmptyRgn(rgn); |
441 | return 0; |
442 | } |
443 | |
444 | return 0; |
445 | } |
446 | #endif |
447 | |
8a7e67ec |
448 | |
449 | void macctrl_activate(WindowPtr window, EventRecord *event) |
450 | { |
451 | Boolean active = (event->modifiers & activeFlag) != 0; |
452 | GrafPtr saveport; |
453 | ControlRef root; |
454 | |
455 | GetPort(&saveport); |
456 | SetPort((GrafPtr)GetWindowPort(window)); |
457 | if (mac_gestalts.apprvers >= 0x100) { |
458 | SetThemeWindowBackground(window, active ? |
459 | kThemeBrushModelessDialogBackgroundActive : |
460 | kThemeBrushModelessDialogBackgroundInactive, |
461 | TRUE); |
462 | GetRootControl(window, &root); |
463 | if (active) |
464 | ActivateControl(root); |
465 | else |
466 | DeactivateControl(root); |
467 | } else { |
468 | /* (De)activate controls one at a time */ |
469 | } |
470 | SetPort(saveport); |
471 | } |
472 | |
473 | void macctrl_click(WindowPtr window, EventRecord *event) |
474 | { |
475 | Point mouse; |
476 | ControlHandle control; |
477 | int part; |
478 | GrafPtr saveport; |
479 | union macctrl *mc; |
480 | struct macctrls *mcs = mac_winctrls(window); |
481 | int i; |
482 | |
483 | GetPort(&saveport); |
484 | SetPort((GrafPtr)GetWindowPort(window)); |
485 | mouse = event->where; |
486 | GlobalToLocal(&mouse); |
487 | part = FindControl(mouse, window, &control); |
488 | if (control != NULL) |
489 | if (TrackControl(control, mouse, NULL) != 0) { |
490 | mc = (union macctrl *)GetControlReference(control); |
491 | switch (mc->generic.type) { |
492 | case MACCTRL_RADIO: |
493 | for (i = 0; i < mc->generic.ctrl->radio.nbuttons; i++) { |
494 | if (mc->radio.tbctrls[i] == control) |
495 | SetControlValue(mc->radio.tbctrls[i], |
496 | kControlRadioButtonCheckedValue); |
497 | else |
498 | SetControlValue(mc->radio.tbctrls[i], |
499 | kControlRadioButtonUncheckedValue); |
500 | } |
501 | ctrlevent(mcs, mc, EVENT_VALCHANGE); |
502 | break; |
503 | case MACCTRL_CHECKBOX: |
504 | SetControlValue(control, !GetControlValue(control)); |
505 | ctrlevent(mcs, mc, EVENT_VALCHANGE); |
506 | break; |
507 | case MACCTRL_BUTTON: |
508 | ctrlevent(mcs, mc, EVENT_ACTION); |
509 | break; |
510 | } |
511 | } |
512 | SetPort(saveport); |
513 | } |
514 | |
515 | void macctrl_update(WindowPtr window) |
516 | { |
517 | #if TARGET_API_MAC_CARBON |
518 | RgnHandle visrgn; |
519 | #endif |
520 | Rect rect; |
521 | GrafPtr saveport; |
522 | |
523 | BeginUpdate(window); |
524 | GetPort(&saveport); |
525 | SetPort((GrafPtr)GetWindowPort(window)); |
526 | if (mac_gestalts.apprvers >= 0x101) { |
527 | #if TARGET_API_MAC_CARBON |
528 | GetPortBounds(GetWindowPort(window), &rect); |
529 | #else |
530 | rect = window->portRect; |
531 | #endif |
532 | InsetRect(&rect, -1, -1); |
533 | DrawThemeModelessDialogFrame(&rect, mac_frontwindow() == window ? |
534 | kThemeStateActive : kThemeStateInactive); |
535 | } |
536 | #if TARGET_API_MAC_CARBON |
537 | visrgn = NewRgn(); |
538 | GetPortVisibleRegion(GetWindowPort(window), visrgn); |
539 | UpdateControls(window, visrgn); |
540 | DisposeRgn(visrgn); |
541 | #else |
542 | UpdateControls(window, window->visRgn); |
543 | #endif |
544 | SetPort(saveport); |
545 | EndUpdate(window); |
546 | } |
547 | |
548 | #if TARGET_API_MAC_CARBON |
549 | #define EnableItem EnableMenuItem |
550 | #define DisableItem DisableMenuItem |
551 | #endif |
552 | void macctrl_adjustmenus(WindowPtr window) |
553 | { |
554 | MenuHandle menu; |
555 | |
556 | menu = GetMenuHandle(mFile); |
557 | DisableItem(menu, iSave); /* XXX enable if modified */ |
558 | EnableItem(menu, iSaveAs); |
559 | EnableItem(menu, iDuplicate); |
560 | |
561 | menu = GetMenuHandle(mEdit); |
562 | DisableItem(menu, 0); |
563 | } |
564 | |
565 | void macctrl_close(WindowPtr window) |
566 | { |
567 | struct macctrls *mcs = mac_winctrls(window); |
568 | union macctrl *mc; |
569 | |
570 | while ((mc = index234(mcs->byctrl, 0)) != NULL) { |
571 | del234(mcs->byctrl, mc); |
572 | sfree(mc); |
573 | } |
574 | |
575 | freetree234(mcs->byctrl); |
576 | mcs->byctrl = NULL; |
577 | |
578 | /* XXX |
579 | DisposeWindow(window); |
580 | if (s->window == NULL) |
581 | sfree(s); |
582 | */ |
583 | } |
584 | |
585 | void dlg_update_start(union control *ctrl, void *dlg) |
586 | { |
587 | |
588 | /* No-op for now */ |
589 | } |
590 | |
591 | void dlg_update_done(union control *ctrl, void *dlg) |
592 | { |
593 | |
594 | /* No-op for now */ |
595 | } |
596 | |
597 | void dlg_set_focus(union control *ctrl, void *dlg) |
598 | { |
599 | |
600 | if (mac_gestalts.apprvers >= 0x100) { |
601 | /* Use SetKeyboardFocus() */ |
602 | } else { |
603 | /* Do our own mucking around */ |
604 | } |
605 | } |
606 | |
0bd8d76d |
607 | union control *dlg_last_focused(union control *ctrl, void *dlg) |
8a7e67ec |
608 | { |
609 | |
610 | return NULL; |
611 | } |
612 | |
613 | void dlg_beep(void *dlg) |
614 | { |
615 | |
616 | SysBeep(30); |
617 | } |
618 | |
619 | void dlg_error_msg(void *dlg, char *msg) |
620 | { |
621 | Str255 pmsg; |
622 | |
623 | c2pstrcpy(pmsg, msg); |
624 | ParamText(pmsg, NULL, NULL, NULL); |
625 | StopAlert(128, NULL); |
626 | } |
627 | |
628 | void dlg_end(void *dlg, int value) |
629 | { |
630 | |
631 | }; |
632 | |
633 | void dlg_refresh(union control *ctrl, void *dlg) |
634 | { |
635 | |
636 | }; |
637 | |
638 | void *dlg_get_privdata(union control *ctrl, void *dlg) |
639 | { |
640 | |
641 | return NULL; |
642 | } |
643 | |
644 | void dlg_set_privdata(union control *ctrl, void *dlg, void *ptr) |
645 | { |
646 | |
647 | fatalbox("dlg_set_privdata"); |
648 | } |
649 | |
650 | void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t size) |
651 | { |
652 | |
653 | fatalbox("dlg_alloc_privdata"); |
654 | } |
655 | |
656 | |
657 | /* |
658 | * Radio Button control |
659 | */ |
660 | |
661 | void dlg_radiobutton_set(union control *ctrl, void *dlg, int whichbutton) |
662 | { |
93ba25f8 |
663 | struct macctrls *mcs = dlg; |
664 | union macctrl *mc = findbyctrl(mcs, ctrl); |
8a7e67ec |
665 | int i; |
666 | |
93ba25f8 |
667 | assert(mc != NULL); |
8a7e67ec |
668 | for (i = 0; i < ctrl->radio.nbuttons; i++) { |
669 | if (i == whichbutton) |
670 | SetControlValue(mc->radio.tbctrls[i], |
671 | kControlRadioButtonCheckedValue); |
672 | else |
673 | SetControlValue(mc->radio.tbctrls[i], |
674 | kControlRadioButtonUncheckedValue); |
675 | } |
676 | |
677 | }; |
678 | |
679 | int dlg_radiobutton_get(union control *ctrl, void *dlg) |
680 | { |
93ba25f8 |
681 | struct macctrls *mcs = dlg; |
682 | union macctrl *mc = findbyctrl(mcs, ctrl); |
8a7e67ec |
683 | int i; |
684 | |
93ba25f8 |
685 | assert(mc != NULL); |
8a7e67ec |
686 | for (i = 0; i < ctrl->radio.nbuttons; i++) { |
687 | if (GetControlValue(mc->radio.tbctrls[i]) == |
688 | kControlRadioButtonCheckedValue) |
689 | return i; |
690 | } |
691 | return -1; |
692 | }; |
693 | |
694 | |
695 | /* |
696 | * Check Box control |
697 | */ |
698 | |
699 | void dlg_checkbox_set(union control *ctrl, void *dlg, int checked) |
700 | { |
93ba25f8 |
701 | struct macctrls *mcs = dlg; |
702 | union macctrl *mc = findbyctrl(mcs, ctrl); |
8a7e67ec |
703 | |
93ba25f8 |
704 | assert(mc != NULL); |
8a7e67ec |
705 | SetControlValue(mc->checkbox.tbctrl, |
706 | checked ? kControlCheckBoxCheckedValue : |
707 | kControlCheckBoxUncheckedValue); |
708 | } |
709 | |
710 | int dlg_checkbox_get(union control *ctrl, void *dlg) |
711 | { |
93ba25f8 |
712 | struct macctrls *mcs = dlg; |
713 | union macctrl *mc = findbyctrl(mcs, ctrl); |
8a7e67ec |
714 | |
93ba25f8 |
715 | assert(mc != NULL); |
8a7e67ec |
716 | return GetControlValue(mc->checkbox.tbctrl); |
717 | } |
718 | |
719 | |
720 | /* |
721 | * Edit Box control |
722 | */ |
723 | |
724 | void dlg_editbox_set(union control *ctrl, void *dlg, char const *text) |
725 | { |
726 | |
727 | }; |
728 | |
729 | void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length) |
730 | { |
731 | |
732 | }; |
733 | |
734 | |
735 | /* |
736 | * List Box control |
737 | */ |
738 | |
739 | void dlg_listbox_clear(union control *ctrl, void *dlg) |
740 | { |
741 | |
742 | }; |
743 | |
744 | void dlg_listbox_del(union control *ctrl, void *dlg, int index) |
745 | { |
746 | |
747 | }; |
748 | |
749 | void dlg_listbox_add(union control *ctrl, void *dlg, char const *text) |
750 | { |
751 | |
752 | }; |
753 | |
754 | void dlg_listbox_addwithindex(union control *ctrl, void *dlg, |
755 | char const *text, int id) |
756 | { |
757 | |
758 | }; |
759 | |
760 | int dlg_listbox_getid(union control *ctrl, void *dlg, int index) |
761 | { |
762 | |
763 | return 0; |
764 | }; |
765 | |
766 | int dlg_listbox_index(union control *ctrl, void *dlg) |
767 | { |
768 | |
769 | return 0; |
770 | }; |
771 | |
772 | int dlg_listbox_issel(union control *ctrl, void *dlg, int index) |
773 | { |
774 | |
775 | return 0; |
776 | }; |
777 | |
778 | void dlg_listbox_select(union control *ctrl, void *dlg, int index) |
779 | { |
780 | |
781 | }; |
782 | |
783 | |
784 | /* |
785 | * Text control |
786 | */ |
787 | |
788 | void dlg_text_set(union control *ctrl, void *dlg, char const *text) |
789 | { |
93ba25f8 |
790 | struct macctrls *mcs = dlg; |
791 | union macctrl *mc = findbyctrl(mcs, ctrl); |
f32ce408 |
792 | Str255 title; |
8a7e67ec |
793 | |
93ba25f8 |
794 | assert(mc != NULL); |
8a7e67ec |
795 | if (mac_gestalts.apprvers >= 0x100) |
796 | SetControlData(mc->text.tbctrl, kControlEntireControl, |
797 | kControlStaticTextTextTag, |
798 | strlen(ctrl->text.label), ctrl->text.label); |
f32ce408 |
799 | else { |
800 | c2pstrcpy(title, text); |
801 | SetControlTitle(mc->text.tbctrl, title); |
802 | } |
8a7e67ec |
803 | } |
804 | |
805 | |
806 | /* |
807 | * File Selector control |
808 | */ |
809 | |
810 | void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn) |
811 | { |
812 | |
813 | } |
814 | |
815 | void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn) |
816 | { |
817 | |
818 | } |
819 | |
820 | |
821 | /* |
822 | * Font Selector control |
823 | */ |
824 | |
825 | void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fn) |
826 | { |
827 | |
828 | } |
829 | |
830 | void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fn) |
831 | { |
832 | |
833 | } |
834 | |
835 | |
836 | /* |
837 | * Printer enumeration |
838 | */ |
839 | |
840 | printer_enum *printer_start_enum(int *nprinters) |
841 | { |
842 | |
843 | *nprinters = 0; |
844 | return NULL; |
845 | } |
846 | |
847 | char *printer_get_name(printer_enum *pe, int thing) |
848 | { |
849 | |
850 | return "<none>"; |
851 | } |
852 | |
853 | void printer_finish_enum(printer_enum *pe) |
854 | { |
855 | |
856 | } |
857 | |
858 | |
859 | /* |
860 | * Colour selection stuff |
861 | */ |
862 | |
863 | void dlg_coloursel_start(union control *ctrl, void *dlg, |
864 | int r, int g, int b) |
865 | { |
866 | |
867 | } |
868 | |
869 | int dlg_coloursel_results(union control *ctrl, void *dlg, |
870 | int *r, int *g, int *b) |
871 | { |
872 | |
873 | return 0; |
874 | } |
875 | |
876 | /* |
877 | * Local Variables: |
878 | * c-file-style: "simon" |
879 | * End: |
880 | */ |