1 /* Copyright (C) 2000-2012 by George Williams */
2 /*
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are met:
5 
6  * Redistributions of source code must retain the above copyright notice, this
7  * list of conditions and the following disclaimer.
8 
9  * Redistributions in binary form must reproduce the above copyright notice,
10  * this list of conditions and the following disclaimer in the documentation
11  * and/or other materials provided with the distribution.
12 
13  * The name of the author may not be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15 
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef FONTFORGE_GGADGET_H
29 #define FONTFORGE_GGADGET_H
30 
31 #include "gdraw.h"
32 #include "intl.h"
33 struct giocontrol;
34 
35 #ifndef MAX
36 #define MAX(x,y)   (((x) > (y)) ? (x) : (y))
37 #endif
38 #ifndef MIN
39 #define MIN(x,y)   (((x) < (y)) ? (x) : (y))
40 #endif
41 
42 typedef struct gtextinfo {
43     unichar_t *text;
44     GImage *image;
45     Color fg;
46     Color bg;
47     void *userdata;
48     GFont *font;
49     unsigned int disabled: 1;
50     unsigned int image_precedes: 1;
51     unsigned int checkable: 1;			/* Only for menus */
52     unsigned int checked: 1;			/* Only for menus */
53     unsigned int selected: 1;			/* Only for lists (used internally for menu(bar)s, when cursor is on the line) */
54     unsigned int line: 1;			/* Only for menus */
55     unsigned int text_is_1byte: 1;		/* If passed in as 1byte (ie. iso-8859-1) text, will be converted */
56     unsigned int text_in_resource: 1;		/* the text field is actually an index into the string resource table */
57     unsigned int changed: 1;			/* If a row/column widget changed this */
58     unichar_t mnemonic;				/* Only for menus and menubars */
59 						/* should really be in menuitem, but that wastes space and complicates GTextInfoDraw */
60     char* text_untranslated;                    /* used to simplify hotkey lookup for menus. */
61     /*
62      * text_untranslated is either the GMenuItem2 shortcut or the GTextInfo prior
63      * to translation occurring. The shortcut text is considered first
64      * to allow the code to make the value explicit. This is useful in
65      * cases where the menu text to be translated (GTextInfo.text
66      * prior to calling sgettext() on it) is specially designed for
67      * translation, like File|New is. Having the hotkey of "New|No
68      * Shortcut" will give a text_untranslated of "New|No Shortcut".
69      * See HKTextInfoToUntranslatedText() for stripping out any
70      * potential underscore and the trailing "|Rest" string.
71      *
72      * Using a pointer like this relies on the GMenuItems used to make
73      * the menus are a static structure that outlasts the
74      * menu/gtextinfo itself.
75      **/
76 } GTextInfo;
77 
78 #define GTEXTINFO_EMPTY { NULL, NULL, 0x000000, 0x000000, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\0' }
79 
80 
81 typedef struct gtextinfo2 {
82     unichar_t *text;
83     GImage *image;
84     Color fg;
85     Color bg;
86     void *userdata;
87     GFont *font;
88     unsigned int disabled: 1;
89     unsigned int image_precedes: 1;
90     unsigned int checkable: 1;			/* Only for menus */
91     unsigned int checked: 1;			/* Only for menus */
92     unsigned int selected: 1;			/* Only for lists (used internally for menu(bar)s, when cursor is on the line) */
93     unsigned int line: 1;			/* Only for menus */
94     unsigned int text_is_1byte: 1;		/* If passed in as 1byte (ie. iso-8859-1) text, will be converted */
95     unsigned int text_in_resource: 1;		/* the text field is actually an index into the string resource table */
96     unsigned int changed: 1;			/* If a row/column widget changed this */
97     unsigned int sort_me_first_in_list: 1;	/* used for directories in file chooser widgets */
98     unichar_t mnemonic;				/* Only for menus and menubars */
99 						/* should really be in menuitem, but that wastes space and complicates GTextInfoDraw */
100 } GTextInfo2;
101 
102 #define GTEXTINFO2_EMPTY { NULL, NULL, 0x000000, 0x000000, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\0' }
103 
104 
105 typedef struct gmenuitem {
106     GTextInfo ti;
107     unichar_t shortcut;
108     short short_mask;
109     struct gmenuitem *sub;
110     void (*moveto)(struct gwindow *base,struct gmenuitem *mi,GEvent *);	/* called before creating submenu */
111     void (*invoke)(struct gwindow *base,struct gmenuitem *mi,GEvent *);	/* called on mouse release */
112     int mid;
113 } GMenuItem;
114 
115 #define GMENUITEM_LINE   { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 1, 0, 0, 0, 1, 0, 0, 0, '\0' }, '\0', 0, NULL, NULL, NULL, 0 }
116 #define GMENUITEM_EMPTY { GTEXTINFO_EMPTY, '\0', 0, NULL, NULL, NULL, 0 }
117 
118 
119 typedef struct gmenuitem2 {
120     GTextInfo ti;
121     char *shortcut;
122     struct gmenuitem2 *sub;
123     void (*moveto)(struct gwindow *base,struct gmenuitem *mi,GEvent *);	/* called before creating submenu */
124     void (*invoke)(struct gwindow *base,struct gmenuitem *mi,GEvent *);	/* called on mouse release */
125     int mid;
126 } GMenuItem2;
127 
128 #define GMENUITEM2_LINE { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 1, 0, 0, 0, 1, 0, 0, 0, '\0' }, NULL, NULL, NULL, NULL, 0 }
129 #define GMENUITEM2_EMPTY { GTEXTINFO_EMPTY, NULL, NULL, NULL, NULL, 0 }
130 
131 typedef struct tabinfo {
132     unichar_t *text;
133     struct ggadgetcreatedata *gcd;
134     unsigned int disabled: 1;
135     unsigned int selected: 1;
136     unsigned int text_is_1byte: 1;		/* If passed in as 1byte (ie. iso-8859-1) text, will be converted */
137     unsigned int text_in_resource: 1;		/* the text field is actually an index into the string resource table */
138     unsigned char nesting;
139 } GTabInfo;
140 
141 #define GTABINFO_EMPTY { NULL, NULL, 0, 0, 0, 0, 0 }
142 
143 
144 enum border_type { bt_none, bt_box, bt_raised, bt_lowered, bt_engraved,
145 	    bt_embossed, bt_double };
146 enum border_shape { bs_rect, bs_roundrect, bs_elipse, bs_diamond };
147 enum box_flags {
148     box_foreground_border_inner = 1,	/* 1 point line */
149     box_foreground_border_outer = 2,	/* 1 point line */
150     box_active_border_inner = 4,		/* 1 point line */
151     box_foreground_shadow_outer = 8,	/* 1 point line, bottom&right */
152     box_do_depressed_background = 0x10,
153     box_draw_default = 0x20,	/* if a default button draw a depressed rect around button */
154     box_generate_colors = 0x40,	/* use border_brightest to compute other border cols */
155     box_gradient_bg = 0x80
156     };
157 typedef struct gbox {
158     unsigned char border_type;
159     unsigned char border_shape;
160     unsigned char border_width;	/* In points */
161     unsigned char padding;	/* In points */
162     unsigned char rr_radius;	/* In points */
163     unsigned char flags;
164     Color border_brightest;		/* used for left upper part of elipse */
165     Color border_brighter;
166     Color border_darkest;		/* used for right lower part of elipse */
167     Color border_darker;
168     Color main_background;
169     Color main_foreground;
170     Color disabled_background;
171     Color disabled_foreground;
172     Color active_border;
173     Color depressed_background;
174     Color gradient_bg_end;
175     Color border_inner;
176     Color border_outer;
177 } GBox;
178 
179 #define GBOX_EMPTY { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 ,0 ,0 ,0 }
180 
181 
182 typedef struct ggadget GGadget;
183 typedef struct ggadget *GGadgetSet;
184 
185 enum sb_type { sb_upline, sb_downline, sb_uppage, sb_downpage, sb_track, sb_trackrelease };
186 struct scrollbarinit { int32 sb_min, sb_max, sb_pagesize, sb_pos; };
187 
188 typedef int (*GGadgetHandler)(GGadget *,GEvent *);
189 typedef unichar_t **(*GTextCompletionHandler)(GGadget *,int from_tab);
190 
191 enum gg_flags { gg_visible=1, gg_enabled=2, gg_pos_in_pixels=4,
192 		gg_sb_vert=8, gg_line_vert=gg_sb_vert,
193 		gg_but_default=0x10, gg_but_cancel=0x20,
194 		gg_cb_on=0x40, gg_rad_startnew=0x80,
195 		gg_rad_continueold=0x100,	/* even if not previous */
196 		gg_list_alphabetic=0x100, gg_list_multiplesel=0x200,
197 		gg_list_exactlyone=0x400, gg_list_internal=0x800,
198 		gg_group_prevlabel=0x1000, gg_group_end=0x2000,
199 		gg_textarea_wrap=0x4000,
200 		gg_tabset_scroll=0x8000, gg_tabset_filllines=0x10000, gg_tabset_fill1line = 0x20000,
201 		gg_tabset_nowindow=gg_textarea_wrap,
202 		gg_rowcol_alphabetic=gg_list_alphabetic,
203 		gg_rowcol_vrules=0x40000, gg_rowcol_hrules=0x800000,
204 		gg_rowcol_displayonly=0x1000000,
205 		gg_dontcopybox=0x10000000,
206 		gg_pos_use0=0x20000000, gg_pos_under=0x40000000,
207 		gg_pos_newline = (int) 0x80000000,
208 		/* Reuse some flag values for different widgets */
209 		gg_file_pulldown=gg_sb_vert, gg_file_multiple = gg_list_multiplesel,
210 		gg_text_xim = gg_tabset_scroll,
211 		gg_tabset_vert = gg_sb_vert
212 };
213 
214 typedef struct ggadgetdata {
215     GRect pos;
216     GBox *box;
217     unichar_t mnemonic;
218     unichar_t shortcut;
219     uint8 short_mask;
220     uint8 cols;			/* for rowcol */
221     short cid;
222     GTextInfo *label;		/* Overloaded with a GGadgetCreateData * for hvboxes (their label is a gadget) */
223     union {
224 	GTextInfo *list;	/* for List Widgets (and ListButtons, RowCols etc) */
225 	GTabInfo *tabs;		/* for Tab Widgets */
226 	GMenuItem *menu;	/* for menus */
227 	GMenuItem2 *menu2;	/* for menus (alternate) */
228 	struct ggadgetcreatedata **boxelements;	/* An array of things to go in the box */
229 	struct matrixinit *matrix;
230 	GDrawEH drawable_e_h;	/* Drawable event handler */
231 	GTextCompletionHandler completion;
232 	struct scrollbarinit *sbinit;
233 	Color col;
234 	int radiogroup;
235     } u;
236     enum gg_flags flags;
237     const char *popup_msg;		/* Brief help message, utf-8 encoded */
238     GGadgetHandler handle_controlevent;
239 } GGadgetData;
240 
241 #define GGADGETDATA_EMPTY { GRECT_EMPTY, NULL, '\0', '\0', 0, 0, 0, NULL, { NULL }, 0, NULL, NULL }
242 
243 
244 typedef struct ggadgetcreatedata {
245     GGadget *(*creator)(struct gwindow *base, GGadgetData *gd,void *data);
246     GGadgetData gd;
247     void *data;
248     GGadget *ret;
249 } GGadgetCreateData;
250 
251 #define GGADGETCREATEDATA_EMPTY { NULL, GGADGETDATA_EMPTY, NULL, NULL }
252 
253 
254 #define GCD_Glue	((GGadgetCreateData *) -1)	/* Special entries */
255 #define GCD_ColSpan	((GGadgetCreateData *) -2)	/* for box elements */
256 #define GCD_RowSpan	((GGadgetCreateData *) -3)
257 #define GCD_HPad10	((GGadgetCreateData *) -4)
258 
259 enum ghvbox_expand { gb_expandglue=-4, gb_expandgluesame=-3, gb_samesize=-2,
260 	gb_expandall=-1 };
261 enum editor_commands { ec_cut, ec_clear, ec_copy, ec_paste, ec_undo, ec_redo,
262 	ec_selectall, ec_search, ec_backsearch, ec_backword, ec_deleteword,
263 	ec_max };
264 
265     /* return values from file chooser filter functions */
266 enum fchooserret { fc_hide, fc_show, fc_showdisabled };
267 
268 enum me_type { me_int, me_enum, me_real, me_string, me_bigstr, me_func,
269 	       me_funcedit,
270 	       me_stringchoice, me_stringchoicetrans, me_stringchoicetag,
271 	       me_button,
272 	       me_hex, me_uhex, me_addr, me_onlyfuncedit };
273 
274 struct col_init {
275     enum me_type me_type;
276     char *(*func)(GGadget *,int r,int c);
277     GTextInfo *enum_vals;
278     void (*enable_enum)(GGadget *,GMenuItem *, int r, int c);
279     char *title;
280 };
281 
282 struct matrix_data {
283     union {
284 	intpt md_ival;
285 	double md_real;
286 	char *md_str;
287 	void *md_addr;
288     } u;
289     uint8 frozen;
290     uint8 user_bits;
291     uint8 current;
292 };
293 
294 struct matrixinit {
295     int col_cnt;
296     struct col_init *col_init;
297     int initial_row_cnt;
298     struct matrix_data *matrix_data;
299     void (*initrow)(GGadget *g,int row);
300     int  (*candelete)(GGadget *g,int row);
301     void (*finishedit)(GGadget *g,int r, int c, int wasnew);
302     void (*popupmenu)(GGadget *g,GEvent *e,int row,int col);
303     int  (*handle_key)(GGadget *g,GEvent *e);
304     char *(*bigedittitle)(GGadget *g,int r, int c);
305 };
306 
307 #define COL_INIT_EMPTY { 0, NULL, NULL, NULL, NULL }
308 #define MATRIX_DATA_EMPTY { { 0 }, 0, 0, 0 }
309 #define MATRIXINIT_EMPTY { 0, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
310 
311 #define GME_NoChange	0x80000000
312 
313 struct gdirentry;
314 typedef enum fchooserret (*GFileChooserFilterType)(GGadget *g,struct gdirentry *ent,
315 	const unichar_t *dir);
316 typedef int (*GFileChooserInputFilenameFuncType)( GGadget *g,
317 						  const unichar_t ** currentFilename,
318 						  unichar_t* oldfilename );
319 
320     /* Obsolete */
321 #define _STR_NULL	(-1)		/* Null string resource */
322 #define _STR_Language	0
323 #define _STR_OK		1
324 #define _STR_Cancel	2
325 #define _STR_Open	3
326 #define _STR_Save	4
327 #define _STR_Filter	5
328 #define _STR_New	6
329 #define _STR_Replace	7
330 #define _STR_Fileexists	8
331 #define _STR_Fileexistspre	9
332 #define _STR_Fileexistspost	10
333 #define _STR_Createdir	11
334 #define _STR_Dirname	12
335 #define _STR_Couldntcreatedir	13
336 #define _STR_SelectAll	14
337 #define _STR_None	15
338 #define __STR_LastStd	15
339 
340 #define _NUM_Buttonsize		0
341 #define _NUM_ScaleFactor	1
342 #define __NUM_LastStd		1
343 
344 extern void GTextInfoFree(GTextInfo *ti);
345 extern void GTextInfoListFree(GTextInfo *ti);
346 extern void GTextInfoArrayFree(GTextInfo **ti);
347 extern GTextInfo **GTextInfoFromChars(char **array, int len);
348 extern const unichar_t *GStringGetResource(int index,unichar_t *mnemonic);
349 extern int GGadgetScale(int xpos);
350 extern int GIntGetResource(int index);
351 extern int GStringSetResourceFileV(char *filename,uint32 checksum);
352 extern int GStringSetResourceFile(char *filename);	/* returns 1 for success, 0 for failure */
353 /* fallback string arrays are null terminated. mnemonics is same length as string */
354 /* fallback integer arrays are terminated by 0x80000000 (negative infinity) */
355 extern void GStringSetFallbackArray(const unichar_t **array,const unichar_t *mn,
356 	const int *ires);
357 unichar_t *GStringFileGetResource(char *filename, int index,unichar_t *mnemonic);
358 extern void GResourceUseGetText(void);
359 extern void *GResource_font_cvt(char *val, void *def);
360 extern FontInstance *GResourceFindFont(char *resourcename,FontInstance *deffont);
361 
362 void GGadgetDestroy(GGadget *g);
363 void GGadgetSetVisible(GGadget *g,int visible);
364 int GGadgetIsVisible(GGadget *g);
365 void GGadgetSetEnabled(GGadget *g,int enabled);
366 int GGadgetIsEnabled(GGadget *g);
367 GWindow GGadgetGetWindow(GGadget *g);
368 void *GGadgetGetUserData(GGadget *g);
369 void GGadgetSetUserData(GGadget *g, void *d);
370 void GGadgetSetPopupMsg(GGadget *g, const unichar_t *msg);
371 int GGadgetContains(GGadget *g, int x, int y );
372 int GGadgetContainsEventLocation(GGadget *g, GEvent* e );
373 GRect *GGadgetGetInnerSize(GGadget *g,GRect *rct);
374 GRect *GGadgetGetSize(GGadget *g,GRect *rct);
375 void GGadgetSetSize(GGadget *g,GRect *rct);
376 void GGadgetGetDesiredVisibleSize(GGadget *g,GRect *outer, GRect *inner);
377 void GGadgetGetDesiredSize(GGadget *g,GRect *outer, GRect *inner);
378 void GGadgetSetDesiredSize(GGadget *g,GRect *outer, GRect *inner);
379 int GGadgetGetCid(GGadget *g);
380 void GGadgetResize(GGadget *g,int32 width, int32 height );
381 void GGadgetMove(GGadget *g,int32 x, int32 y );
382 void GGadgetMoveAddToY(GGadget *g, int32 yoffset );
383 int32 GGadgetGetX(GGadget *g);
384 int32 GGadgetGetY(GGadget *g);
385 void  GGadgetSetY(GGadget *g, int32 y );
386 void GGadgetRedraw(GGadget *g);
387 void GGadgetsCreate(GWindow base, GGadgetCreateData *gcd);
388 int  GGadgetFillsWindow(GGadget *g);
389 int  GGadgetIsDefault(GGadget *g);
390 
391 void GGadgetSetTitle(GGadget *g,const unichar_t *title);
392 void GGadgetSetTitle8(GGadget *g,const char *title);
393 void GGadgetSetTitle8WithMn(GGadget *g,const char *title);
394 const unichar_t *_GGadgetGetTitle(GGadget *g);	/* Do not free!!! */
395 unichar_t *GGadgetGetTitle(GGadget *g);		/* Free the return */
396 char *GGadgetGetTitle8(GGadget *g);		/* Free the return (utf8) */
397 void GGadgetSetFont(GGadget *g,GFont *font);
398 GFont *GGadgetGetFont(GGadget *g);
399 int GGadgetEditCmd(GGadget *g,enum editor_commands cmd);
400 int GGadgetActiveGadgetEditCmd(GWindow gw,enum editor_commands cmd);
401 void GGadgetSetHandler(GGadget *g, GGadgetHandler handler);
402 GGadgetHandler GGadgetGetHandler(GGadget *g);
403 
404 void GTextFieldSelect(GGadget *g,int sel_start, int sel_end);
405 void GTextFieldShow(GGadget *g,int pos);
406 void GTextFieldReplace(GGadget *g,const unichar_t *txt);
407 bool GTextFieldIsEmpty(GGadget *g);
408 void GCompletionFieldSetCompletion(GGadget *g,GTextCompletionHandler completion);
409 void GCompletionFieldSetCompletionMode(GGadget *g,int enabled);
410 void GGadgetClearList(GGadget *g);
411 void GGadgetSetList(GGadget *g, GTextInfo **ti, int32 copyit);
412 GTextInfo **GGadgetGetList(GGadget *g,int32 *len);	/* Do not free!!! */
413 GTextInfo *GGadgetGetListItem(GGadget *g,int32 pos);
414 GTextInfo *GGadgetGetListItemSelected(GGadget *g);
415 void GGadgetSelectListItem(GGadget *g,int32 pos,int32 sel);
416 void GGadgetSelectOneListItem(GGadget *g,int32 pos);
417 int32 GGadgetIsListItemSelected(GGadget *g,int32 pos);
418 int32 GGadgetGetFirstListSelectedItem(GGadget *g);
419 void GGadgetScrollListToPos(GGadget *g,int32 pos);
420 void GGadgetScrollListToText(GGadget *g,const unichar_t *lab,int32 sel);
421 void GGadgetSetListOrderer(GGadget *g,int (*orderer)(const void *, const void *));
422 
423 void GColorButtonSetColor(GGadget *g, Color col);
424 Color GColorButtonGetColor(GGadget *g);
425 
426 void GGadgetSetChecked(GGadget *g, int ison);
427 int GGadgetIsChecked(GGadget *g);
428 
429 int GListIndexFromY(GGadget *g,int y);
430 void GListSetSBAlwaysVisible(GGadget *g,int always);
431 void GListSetPopupCallback(GGadget *g,void (*callback)(GGadget *,int));
432 
433 int GTabSetGetTabCount(GGadget *g);
434 int GTabSetGetSel(GGadget *g);
435 void GTabSetSetSel(GGadget *g,int sel);
436 void GTabSetSetEnabled(GGadget *g,int pos, int enabled);
437 GWindow GTabSetGetSubwindow(GGadget *g,int pos);
438 int GTabSetGetTabLines(GGadget *g);
439 void GTabSetSetClosable(GGadget *g, bool flag);
440 void GTabSetSetMovable(GGadget *g, bool flag);
441 void GTabSetSetNestedExpose(GGadget *g, void (*)(GWindow,GGadget *,GEvent *));
442 void GTabSetSetNestedMouse(GGadget *g, int (*)(GGadget *,GEvent *));
443 void GTabSetSetRemoveSync(GGadget *g, void (*rs)(GWindow gw, int pos));
444 void GTabSetSetSwapSync(GGadget *g, void (*ss)(GWindow gw, int pos_a, int pos_b));
445 void GTabSetChangeTabName(GGadget *g, const char *name, int pos);
446 void GTabSetRemetric(GGadget *g);
447 void GTabSetSwapTabs(GGadget *g, int pos_a, int pos_b);
448 void GTabSetRemoveTabByPos(GGadget *g, int pos);
449 void GTabSetRemoveTabByName(GGadget *g, char *name);
450 
451 int32 GScrollBarGetPos(GGadget *g);
452 int32 GScrollBarSetPos(GGadget *g,int32 pos);
453 int32 GScrollBarAddToPos(GGadget *g,int32 offset);
454 void GScrollBarSetMustShow(GGadget *g, int32 sb_min, int32 sb_max, int32 sb_pagesize,
455 	int32 sb_mustshow);
456 void GScrollBarSetBounds(GGadget *g, int32 sb_min, int32 sb_max, int32 sb_pagesize );
457 void GScrollBarGetBounds(GGadget *g, int32 *sb_min, int32 *sb_max, int32 *sb_pagesize );
458 
459 void GMenuBarSetItemChecked(GGadget *g, int mid, int check);
460 void GMenuBarSetItemEnabled(GGadget *g, int mid, int enabled);
461 void GMenuBarSetItemName(GGadget *g, int mid, const unichar_t *name);
462 void GMenuSetShortcutDomain(char *domain);
463 const char *GMenuGetShortcutDomain(void);
464 int GMenuIsCommand(GEvent *event,char *shortcut);
465 int GMenuMask(void);
466 int GMenuAnyUnmaskedShortcuts(GGadget *mb1, GGadget *mb2);
467 
468 
469 void GFileChooserPopupCheck(GGadget *g,GEvent *e);
470 void GFileChooserFilterIt(GGadget *g);
471 void GFileChooserRefreshList(GGadget *g);
472 int GFileChooserFilterEh(GGadget *g,GEvent *e);
473 void GFileChooserConnectButtons(GGadget *g,GGadget *ok, GGadget *filter);
474 void GFileChooserSetFilterText(GGadget *g,const unichar_t *filter);
475 void GFileChooserSetFilterFunc(GGadget *g,GFileChooserFilterType filter);
476 void GFileChooserSetInputFilenameFunc(GGadget *g,GFileChooserInputFilenameFuncType filter);
477 int GFileChooserDefInputFilenameFunc( GGadget *g, const unichar_t** currentFilename, unichar_t* oldfilename );
478 GFileChooserInputFilenameFuncType GFileChooserGetInputFilenameFunc(GGadget *g);
479 void GFileChooserSetDir(GGadget *g,unichar_t *dir);
480 struct giocontrol *GFileChooserReplaceIO(GGadget *g,struct giocontrol *gc);
481 unichar_t *GFileChooserGetDir(GGadget *g);
482 unichar_t *GFileChooserGetFilterText(GGadget *g);
483 GFileChooserFilterType GFileChooserGetFilterFunc(GGadget *g);
484 void GFileChooserSetFilename(GGadget *g,const unichar_t *defaultfile);
485 void GFileChooserSetMimetypes(GGadget *g,unichar_t **mimetypes);
486 unichar_t **GFileChooserGetMimetypes(GGadget *g);
487 void GFileChooserGetChildren(GGadget *g,GGadget **pulldown, GGadget **list, GGadget **tf);
488 int GFileChooserPosIsDir(GGadget *g, int pos);
489 unichar_t *GFileChooserFileNameOfPos(GGadget *g, int pos);
490 void GFileChooserSetShowHidden(int sh);
491 int GFileChooserGetShowHidden(void);
492 void GFileChooserSetDirectoryPlacement(int dp);
493 int GFileChooserGetDirectoryPlacement(void);
494 void GFileChooserSetBookmarks(unichar_t **b);
495 void GFileChooserSetPaths(GGadget *g, const char* const* path);
496 unichar_t **GFileChooserGetBookmarks(void);
497 void GFileChooserSetPrefsChangedCallback(void *data, void (*p_c)(void *));
498 
499 void GHVBoxSetExpandableCol(GGadget *g,int col);
500 void GHVBoxSetExpandableRow(GGadget *g,int row);
501 void GHVBoxSetPadding(GGadget *g,int hpad, int vpad);
502 void GHVBoxFitWindow(GGadget *g);
503 void GHVBoxFitWindowCentered(GGadget *g);
504 void GHVBoxReflow(GGadget *g);
505 
506 void GMatrixEditSet(GGadget *g,struct matrix_data *data, int rows, int copy_it);
507 struct matrix_data *GMatrixEditGet(GGadget *g, int *rows);
508 struct matrix_data *_GMatrixEditGet(GGadget *g, int *rows);
509 GGadget *_GMatrixEditGetActiveTextField(GGadget *g);
510 int GMatrixEditGetColCnt(GGadget *g);
511 int GMatrixEditGetActiveRow(GGadget *g);
512 int GMatrixEditGetActiveCol(GGadget *g);
513 void GMatrixEditActivateRowCol(GGadget *g, int r, int c);
514 void GMatrixEditDeleteRow(GGadget *g,int row);
515 void GMatrixEditScrollToRowCol(GGadget *g,int r, int c);
516 int GMatrixEditStringDlg(GGadget *g,int row,int col);
517 void GMatrixEditSetNewText(GGadget *g, char *text);
518 void GMatrixEditSetOtherButtonEnable(GGadget *g, void (*sob)(GGadget *g, int r, int c));
519 void GMatrixEditSetMouseMoveReporter(GGadget *g, void (*rmm)(GGadget *g, int r, int c));
520 void GMatrixEditSetTextChangeReporter(GGadget *g, void (*tcr)(GGadget *g, int r, int c, GGadget *text));
521 void GMatrixEditSetValidateStr(GGadget *g, char *(*validate)(GGadget *g, int r, int c, int wasnew, char *str));
522 void GMatrixEditSetBeforeDelete(GGadget *g, void (*predelete)(GGadget *g, int r));
523 void GMatrixEditSetRowMotionCallback(GGadget *g, void (*rowmotion)(GGadget *g, int oldr, int newr));
524 void GMatrixEditUp(GGadget *g);
525 void GMatrixEditDown(GGadget *g);
526 enum gme_updown { ud_up_enabled=1, ud_down_enabled=2 };
527 void GMatrixEditSetCanUpDown(GGadget *g, enum gme_updown (*canupdown)(GGadget *g, int r));
528 void GMatrixEditSetUpDownVisible(GGadget *g, int visible);
529 void GMatrixEditAddButtons(GGadget *g, GGadgetCreateData *gcd);
530 void GMatrixEditEnableColumn(GGadget *g, int col, int enabled);
531 void GMatrixEditShowColumn(GGadget *g, int col, int visible);
532 void GMatrixEditSetColumnChoices(GGadget *g, int col, GTextInfo *ti);
533 GMenuItem *GMatrixEditGetColumnChoices(GGadget *g, int col);
534 void GMatrixEditSetColumnCompletion(GGadget *g, int col, GTextCompletionHandler completion);
535 void GMatrixEditSetEditable(GGadget *g, int editable);
536 
537 GWindow GDrawableGetWindow(GGadget *g);
538 
539 
540 extern void GGadgetPreparePopupImage(GWindow base,const unichar_t *msg,
541 	const void *data,
542 	GImage *(*get_image)(const void *data),
543 	void (*free_image)(const void *data,GImage *img));
544 extern void GGadgetPreparePopup(GWindow base,const unichar_t *msg);
545 extern void GGadgetPreparePopupR(GWindow base,int msg);
546 extern void GGadgetPreparePopup8(GWindow base, const char *msg);
547 extern void GGadgetEndPopup(void);
548 extern void GGadgetPopupExternalEvent(GEvent *e);
549 
550 extern int GGadgetDispatchEvent(GGadget *g,GEvent *e);
551 extern void GGadgetTakesKeyboard(GGadget *g, int takes_keyboard);
552 
553 /* Handles *?{}[] wildcards */
554 int GGadgetWildMatch(unichar_t *pattern, unichar_t *name,int ignorecase);
555 enum fchooserret GFileChooserDefFilter(GGadget *g,struct gdirentry *ent,
556 	const unichar_t *dir);
557 
558 GWindow GMenuCreatePopupMenu(GWindow owner,GEvent *event, GMenuItem *mi);
559 GWindow GMenuCreatePopupMenuWithName(GWindow owner,GEvent *event, char* subMenuName,GMenuItem *mi);
560 GWindow _GMenuCreatePopupMenu(GWindow owner,GEvent *event, GMenuItem *mi,
561 			      void (*donecallback)(GWindow owner));
562 GWindow _GMenuCreatePopupMenuWithName(GWindow owner,GEvent *event, GMenuItem *mi,
563 				      char* subMenuName,
564 				      void (*donecallback)(GWindow owner));
565 
566 
567 GGadget *GLineCreate(struct gwindow *base, GGadgetData *gd,void *data);
568 GGadget *GGroupCreate(struct gwindow *base, GGadgetData *gd,void *data);
569 GGadget *GSpacerCreate(struct gwindow *base, GGadgetData *gd,void *data);
570 GGadget *GLabelCreate(struct gwindow *base, GGadgetData *gd,void *data);
571 GGadget *GButtonCreate(struct gwindow *base, GGadgetData *gd,void *data);
572 GGadget *GImageButtonCreate(struct gwindow *base, GGadgetData *gd,void *data);
573 GGadget *GListButtonCreate(struct gwindow *base, GGadgetData *gd,void *data);
574 GGadget *GColorButtonCreate(struct gwindow *base, GGadgetData *gd,void *data);
575 GGadget *GRadioCreate(struct gwindow *base, GGadgetData *gd,void *data);
576 GGadget *GCheckBoxCreate(struct gwindow *base, GGadgetData *gd,void *data);
577 GGadget *GVisibilityBoxCreate(struct gwindow *base, GGadgetData *gd,void *data);
578 GGadget *GScrollBarCreate(struct gwindow *base, GGadgetData *gd,void *data);
579 GGadget *GListCreate(struct gwindow *base, GGadgetData *gd,void *data);
580 GGadget *GTextFieldCreate(struct gwindow *base, GGadgetData *gd,void *data);
581 GGadget *GPasswordCreate(struct gwindow *base, GGadgetData *gd,void *data);
582 GGadget *GNumericFieldCreate(struct gwindow *base, GGadgetData *gd,void *data);
583 GGadget *GTextCompletionCreate(struct gwindow *base, GGadgetData *gd,void *data);
584 GGadget *GTextAreaCreate(struct gwindow *base, GGadgetData *gd,void *data);
585 GGadget *GListFieldCreate(struct gwindow *base, GGadgetData *gd,void *data);
586 GGadget *GSimpleListFieldCreate(struct gwindow *base, GGadgetData *gd,void *data);
587 GGadget *GMenuBarCreate(struct gwindow *base, GGadgetData *gd,void *data);
588 GGadget *GMenu2BarCreate(struct gwindow *base, GGadgetData *gd,void *data);
589 GGadget *GTabSetCreate(struct gwindow *base, GGadgetData *gd,void *data);
590 GGadget *GFileChooserCreate(struct gwindow *base, GGadgetData *gd,void *data);
591 GGadget *GHBoxCreate(struct gwindow *base, GGadgetData *gd,void *data);
592 GGadget *GVBoxCreate(struct gwindow *base, GGadgetData *gd,void *data);
593 GGadget *GHVBoxCreate(struct gwindow *base, GGadgetData *gd,void *data);
594 GGadget *GHVGroupCreate(struct gwindow *base, GGadgetData *gd,void *data);
595 GGadget *GMatrixEditCreate(struct gwindow *base, GGadgetData *gd,void *data);
596 GGadget *GDrawableCreate(struct gwindow *base, GGadgetData *gd,void *data);
597 
598 GGadget *CreateSlider(struct gwindow *base, GGadgetData *gd,void *data);
599 GGadget *CreateFileChooser(struct gwindow *base, GGadgetData *gd,void *data);
600 GGadget *CreateGadgets(struct gwindow *base, GGadgetCreateData *gcd);
601 
602 GTextInfo **GTextInfoArrayFromList(GTextInfo *ti, uint16 *cnt);
603 typedef struct gresimage {
604     GImage *image;
605     char *filename;
606 } GResImage;
607 GResImage *GGadgetResourceFindImage(char *name, GImage *def);
608 
609 void InitImageCache();
610 void ClearImageCache();
611 void GGadgetSetImageDir(char *dir);
612 void GGadgetSetImagePath(char *path);
613 GImage *GGadgetImageCache(const char *filename);
614 int TryGGadgetImageCache(GImage *image, const char *name);
615 
616 extern unichar_t *utf82u_mncopy(const char *utf8buf,unichar_t *mn);
617 
618 extern double GetCalmReal8(GWindow gw,int cid,char *namer,int *err);
619 extern double GetReal8(GWindow gw,int cid,char *namer,int *err);
620 extern int GetCalmInt8(GWindow gw,int cid,char *name,int *err);
621 extern int GetInt8(GWindow gw,int cid,char *namer,int *err);
622 extern int GetUnicodeChar8(GWindow gw,int cid,char *namer,int *err);
623 extern void GGadgetProtest8(char *labelr);
624 
625 extern void GMenuItemParseShortCut(GMenuItem *mi,char *shortcut);
626 extern int GMenuItemParseMask(char *shortcut);
627 extern int GGadgetUndoMacEnglishOptionCombinations(GEvent *event);
628 
629 /* Among other things, this routine sets global icon cache up. */
630 extern void GGadgetInit(void);
631 extern int GGadgetWithin(GGadget *g, int x, int y);
632 extern void GMenuItemArrayFree(GMenuItem *mi);
633 extern void GMenuItem2ArrayFree(GMenuItem2 *mi);
634 extern GMenuItem *GMenuItemArrayCopy(GMenuItem *mi, uint16 *cnt);
635 extern GMenuItem *GMenuItem2ArrayCopy(GMenuItem2 *mi, uint16 *cnt);
636 
637 extern void GVisibilityBoxSetToMinWH(GGadget *g);
638 
639 extern void GGadgetSetSkipHotkeyProcessing( GGadget *g, int v );
640 extern int GGadgetGetSkipHotkeyProcessing( GGadget *g );
641 extern void GGadgetSetSkipUnQualifiedHotkeyProcessing( GGadget *g, int v );
642 extern int GGadgetGetSkipUnQualifiedHotkeyProcessing( GGadget *g );
643 
644 #endif /* FONTFORGE_GGADGET_H */
645