Line data Source code
1 : /* Copyright (C) 2002-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 : #include "fontforgeui.h"
28 : #include "ustring.h"
29 :
30 : #define CID_Extrema 1000
31 : #define CID_Slopes 1001
32 : #define CID_Error 1002
33 : #define CID_Smooth 1003
34 : #define CID_SmoothTan 1004
35 : #define CID_SmoothHV 1005
36 : #define CID_FlattenBumps 1006
37 : #define CID_FlattenBound 1007
38 : #define CID_LineLenMax 1008
39 : #define CID_Start 1009
40 : #define CID_SetAsDefault 1010
41 :
42 : static double olderr_rat = 1/1000., oldsmooth_tan=.2,
43 : oldlinefixup_rat = 10./1000., oldlinelenmax_rat = 1/100.;
44 : static int set_as_default = true;
45 :
46 : static int oldextrema = false;
47 : static int oldslopes = false;
48 : static int oldsmooth = true;
49 : static int oldsmoothhv = true;
50 : static int oldlinefix = false;
51 : static int oldstart = false;
52 :
53 : typedef struct simplifydlg {
54 : int flags;
55 : double err;
56 : double tan_bounds;
57 : double linefixup;
58 : double linelenmax;
59 : int done;
60 : int cancelled;
61 : int em_size;
62 : int set_as_default;
63 : } Simple;
64 :
65 0 : static int Sim_OK(GGadget *g, GEvent *e) {
66 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
67 0 : Simple *sim = GDrawGetUserData(GGadgetGetWindow(g));
68 0 : int badparse=false;
69 0 : sim->flags = 0;
70 0 : if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_Extrema)) )
71 0 : sim->flags = sf_ignoreextremum;
72 0 : if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_Slopes)) )
73 0 : sim->flags |= sf_ignoreslopes;
74 0 : if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_Smooth)) )
75 0 : sim->flags |= sf_smoothcurves;
76 0 : if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_SmoothHV)) )
77 0 : sim->flags |= sf_choosehv;
78 0 : if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_FlattenBumps)) )
79 0 : sim->flags |= sf_forcelines;
80 0 : if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_Start)) )
81 0 : sim->flags |= sf_setstart2extremum;
82 0 : sim->err = GetReal8(GGadgetGetWindow(g),CID_Error,_("_Error Limit:"),&badparse);
83 0 : if ( sim->flags&sf_smoothcurves )
84 0 : sim->tan_bounds= GetReal8(GGadgetGetWindow(g),CID_SmoothTan,_("_Tangent"),&badparse);
85 0 : if ( sim->flags&sf_forcelines )
86 0 : sim->linefixup= GetReal8(GGadgetGetWindow(g),CID_FlattenBound,_("Bump Size"),&badparse);
87 0 : sim->linelenmax = GetReal8(GGadgetGetWindow(g),CID_LineLenMax,_("Line length max"),&badparse);
88 0 : if ( badparse )
89 0 : return( true );
90 0 : olderr_rat = sim->err/sim->em_size;
91 0 : oldextrema = (sim->flags&sf_ignoreextremum);
92 0 : oldslopes = (sim->flags&sf_ignoreslopes);
93 0 : oldsmooth = (sim->flags&sf_smoothcurves);
94 0 : oldlinefix = (sim->flags&sf_forcelines);
95 0 : oldstart = (sim->flags&sf_setstart2extremum);
96 0 : if ( oldsmooth ) {
97 0 : oldsmooth_tan = sim->tan_bounds;
98 0 : oldsmoothhv = (sim->flags&sf_choosehv);
99 : }
100 0 : if ( oldlinefix )
101 0 : oldlinefixup_rat = sim->linefixup/sim->em_size;
102 0 : oldlinelenmax_rat = sim->linelenmax/sim->em_size;
103 0 : sim->set_as_default = GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_SetAsDefault) );
104 :
105 0 : sim->done = true;
106 : }
107 0 : return( true );
108 : }
109 :
110 0 : static int Sim_Cancel(GGadget *g, GEvent *e) {
111 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
112 0 : Simple *sim = GDrawGetUserData(GGadgetGetWindow(g));
113 0 : sim->done = sim->cancelled = true;
114 : }
115 0 : return( true );
116 : }
117 :
118 0 : static int sim_e_h(GWindow gw, GEvent *event) {
119 0 : if ( event->type==et_close ) {
120 0 : Simple *sim = GDrawGetUserData(gw);
121 0 : sim->done = sim->cancelled = true;
122 0 : } else if ( event->type == et_char ) {
123 0 : return( false );
124 0 : } else if ( event->type == et_map ) {
125 : /* Above palettes */
126 0 : GDrawRaise(gw);
127 : }
128 0 : return( true );
129 : }
130 :
131 0 : int SimplifyDlg(SplineFont *sf, struct simplifyinfo *smpl) {
132 : GRect pos;
133 : GWindow gw;
134 : GWindowAttrs wattrs;
135 : GGadgetCreateData gcd[24], boxes[7], *harray1[6], *harray2[6], *harray3[6],
136 : *harray4[4][6], *barray[9], *varray[18][2];
137 : GTextInfo label[24];
138 : Simple sim;
139 : char buffer[12], buffer2[12], buffer3[12], buffer4[12];
140 : int k,l;
141 :
142 0 : memset(&sim,0,sizeof(sim));
143 0 : sim.em_size = sf->ascent+sf->descent;
144 :
145 0 : memset(&wattrs,0,sizeof(wattrs));
146 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
147 0 : wattrs.event_masks = ~(1<<et_charup);
148 0 : wattrs.restrict_input_to_me = 1;
149 0 : wattrs.undercursor = 1;
150 0 : wattrs.cursor = ct_pointer;
151 0 : wattrs.utf8_window_title = _("Simplify");
152 0 : wattrs.is_dlg = true;
153 0 : pos.x = pos.y = 0;
154 0 : pos.width = GGadgetScale(GDrawPointsToPixels(NULL,180));
155 0 : pos.height = GDrawPointsToPixels(NULL,275);
156 0 : gw = GDrawCreateTopWindow(NULL,&pos,sim_e_h,&sim,&wattrs);
157 :
158 0 : memset(&label,0,sizeof(label));
159 0 : memset(&gcd,0,sizeof(gcd));
160 0 : memset(&boxes,0,sizeof(boxes));
161 :
162 0 : k=l=0;
163 0 : label[k].text = (unichar_t *) _("_Error Limit:");
164 0 : label[k].text_is_1byte = true;
165 0 : label[k].text_in_resource = true;
166 0 : gcd[k].gd.label = &label[k];
167 0 : gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = 12;
168 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
169 0 : gcd[k++].creator = GLabelCreate;
170 0 : harray1[0] = &gcd[k-1];
171 :
172 0 : sprintf( buffer, "%.3g", olderr_rat*sim.em_size );
173 0 : label[k].text = (unichar_t *) buffer;
174 0 : label[k].text_is_1byte = true;
175 0 : gcd[k].gd.label = &label[k];
176 0 : gcd[k].gd.pos.x = 70; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-6;
177 0 : gcd[k].gd.pos.width = 40;
178 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
179 0 : gcd[k].gd.cid = CID_Error;
180 0 : gcd[k++].creator = GTextFieldCreate;
181 0 : harray1[1] = &gcd[k-1];
182 :
183 0 : gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+gcd[k-1].gd.pos.width+3;
184 0 : gcd[k].gd.pos.y = gcd[k-2].gd.pos.y;
185 0 : gcd[k].gd.flags = gg_visible | gg_enabled ;
186 0 : label[k].text = (unichar_t *) _("em-units");
187 0 : label[k].text_is_1byte = true;
188 0 : gcd[k].gd.label = &label[k];
189 0 : gcd[k++].creator = GLabelCreate;
190 0 : harray1[2] = &gcd[k-1]; harray1[3] = GCD_Glue; harray1[4] = NULL;
191 :
192 0 : boxes[2].gd.flags = gg_enabled|gg_visible;
193 0 : boxes[2].gd.u.boxelements = harray1;
194 0 : boxes[2].creator = GHBoxCreate;
195 0 : varray[l][0] = &boxes[2]; varray[l++][1] = NULL;
196 :
197 0 : label[k].text = (unichar_t *) _("Allow _removal of extrema");
198 0 : label[k].text_is_1byte = true;
199 0 : label[k].text_in_resource = true;
200 0 : gcd[k].gd.label = &label[k];
201 0 : gcd[k].gd.pos.x = 8; gcd[k].gd.pos.y = gcd[k-2].gd.pos.y+24;
202 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
203 0 : if ( oldextrema )
204 0 : gcd[k].gd.flags |= gg_cb_on;
205 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Normally simplify will not remove points at the extrema of curves\n(both PostScript and TrueType suggest you retain these points)");
206 0 : gcd[k].gd.cid = CID_Extrema;
207 0 : gcd[k++].creator = GCheckBoxCreate;
208 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
209 :
210 0 : label[k].text = (unichar_t *) _("Allow _slopes to change");
211 0 : label[k].text_is_1byte = true;
212 0 : label[k].text_in_resource = true;
213 0 : gcd[k].gd.label = &label[k];
214 0 : gcd[k].gd.pos.x = 8; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+14;
215 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
216 0 : if ( oldslopes )
217 0 : gcd[k].gd.flags |= gg_cb_on;
218 0 : gcd[k].gd.cid = CID_Slopes;
219 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Normally simplify will not change the slope of the contour at the points.");
220 0 : gcd[k++].creator = GCheckBoxCreate;
221 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
222 :
223 0 : label[k].text = (unichar_t *) _("Start contours at e_xtrema");
224 0 : label[k].text_is_1byte = true;
225 0 : label[k].text_in_resource = true;
226 0 : gcd[k].gd.label = &label[k];
227 0 : gcd[k].gd.pos.x = 8; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+14;
228 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
229 0 : if ( oldstart )
230 0 : gcd[k].gd.flags |= gg_cb_on;
231 0 : gcd[k].gd.cid = CID_Start;
232 0 : gcd[k].gd.popup_msg = (unichar_t *) _("If the start point of a contour is not an extremum, find a new start point (on the contour) which is.");
233 0 : gcd[k++].creator = GCheckBoxCreate;
234 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
235 :
236 0 : gcd[k].gd.pos.x = 15; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y + 20;
237 0 : gcd[k].gd.pos.width = 150;
238 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
239 0 : gcd[k++].creator = GLineCreate;
240 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
241 :
242 0 : label[k].text = (unichar_t *) _("Allow _curve smoothing");
243 0 : label[k].text_is_1byte = true;
244 0 : label[k].text_in_resource = true;
245 0 : gcd[k].gd.label = &label[k];
246 0 : gcd[k].gd.pos.x = 8; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+4;
247 0 : if ( sf->layers[ly_fore].order2 )
248 0 : gcd[k].gd.flags = gg_visible|gg_utf8_popup;
249 : else {
250 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
251 0 : if ( oldsmooth )
252 0 : gcd[k].gd.flags |= gg_cb_on;
253 : }
254 0 : gcd[k].gd.popup_msg = (unichar_t *) _("Simplify will examine corner points whose control points are almost\ncolinear and smooth them into curve points");
255 0 : gcd[k].gd.cid = CID_Smooth;
256 0 : gcd[k++].creator = GCheckBoxCreate;
257 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
258 :
259 : /* GT: here "tan" means trigonometric tangent */
260 0 : label[k].text = (unichar_t *) _("if tan less than");
261 0 : label[k].text_is_1byte = true;
262 0 : gcd[k].gd.label = &label[k];
263 0 : gcd[k].gd.pos.x = 20; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+24;
264 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
265 0 : if ( sf->layers[ly_fore].order2 ) gcd[k].gd.flags = gg_visible;
266 0 : gcd[k++].creator = GLabelCreate;
267 0 : harray2[0] = GCD_HPad10; harray2[1] = &gcd[k-1];
268 :
269 0 : sprintf( buffer2, "%.3g", oldsmooth_tan );
270 0 : label[k].text = (unichar_t *) buffer2;
271 0 : label[k].text_is_1byte = true;
272 0 : gcd[k].gd.label = &label[k];
273 0 : gcd[k].gd.pos.x = 94; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-6;
274 0 : gcd[k].gd.pos.width = 40;
275 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
276 0 : if ( sf->layers[ly_fore].order2 ) gcd[k].gd.flags = gg_visible;
277 0 : gcd[k].gd.cid = CID_SmoothTan;
278 0 : gcd[k++].creator = GTextFieldCreate;
279 0 : harray2[2] = &gcd[k-1]; harray2[3] = GCD_Glue; harray2[4] = NULL;
280 :
281 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
282 0 : boxes[3].gd.u.boxelements = harray2;
283 0 : boxes[3].creator = GHBoxCreate;
284 0 : varray[l][0] = &boxes[3]; varray[l++][1] = NULL;
285 :
286 0 : label[k].text = (unichar_t *) _("S_nap to horizontal/vertical");
287 0 : label[k].text_is_1byte = true;
288 0 : label[k].text_in_resource = true;
289 0 : gcd[k].gd.label = &label[k];
290 0 : gcd[k].gd.pos.x = 17; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+24;
291 0 : if ( sf->layers[ly_fore].order2 )
292 0 : gcd[k].gd.flags = gg_visible;
293 : else {
294 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
295 0 : if ( oldsmoothhv )
296 0 : gcd[k].gd.flags |= gg_cb_on|gg_utf8_popup;
297 : }
298 0 : gcd[k].gd.popup_msg = (unichar_t *) _("If the slope of an adjusted point is near horizontal or vertical\nsnap to that");
299 0 : gcd[k].gd.cid = CID_SmoothHV;
300 0 : gcd[k++].creator = GCheckBoxCreate;
301 0 : harray3[0] = GCD_HPad10; harray3[1] = &gcd[k-1]; harray3[2] = GCD_Glue; harray3[3] = NULL;
302 :
303 0 : boxes[4].gd.flags = gg_enabled|gg_visible;
304 0 : boxes[4].gd.u.boxelements = harray3;
305 0 : boxes[4].creator = GHBoxCreate;
306 0 : varray[l][0] = &boxes[4]; varray[l++][1] = NULL;
307 :
308 0 : label[k].text = (unichar_t *) _("_Flatten bumps on lines");
309 0 : label[k].text_is_1byte = true;
310 0 : label[k].text_in_resource = true;
311 0 : gcd[k].gd.label = &label[k];
312 0 : gcd[k].gd.pos.x = 8; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+14;
313 0 : if ( sf->layers[ly_fore].order2 )
314 0 : gcd[k].gd.flags = gg_visible|gg_utf8_popup;
315 : else {
316 0 : gcd[k].gd.flags = gg_enabled|gg_visible|gg_utf8_popup;
317 0 : if ( oldlinefix )
318 0 : gcd[k].gd.flags |= gg_cb_on;
319 : }
320 0 : gcd[k].gd.popup_msg = (unichar_t *) _("If a line has a bump on it then flatten out that bump");
321 0 : gcd[k].gd.cid = CID_FlattenBumps;
322 0 : gcd[k++].creator = GCheckBoxCreate;
323 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
324 :
325 0 : label[k].text = (unichar_t *) _("if smaller than");
326 0 : label[k].text_is_1byte = true;
327 0 : gcd[k].gd.label = &label[k];
328 0 : gcd[k].gd.pos.x = 20; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+24;
329 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
330 0 : if ( sf->layers[ly_fore].order2 ) gcd[k].gd.flags = gg_visible;
331 0 : gcd[k++].creator = GLabelCreate;
332 0 : harray4[0][0] = GCD_HPad10; harray4[0][1] = &gcd[k-1];
333 :
334 0 : sprintf( buffer3, "%.3g", oldlinefixup_rat*sim.em_size );
335 0 : label[k].text = (unichar_t *) buffer3;
336 0 : label[k].text_is_1byte = true;
337 0 : gcd[k].gd.label = &label[k];
338 0 : gcd[k].gd.pos.x = 90; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-6;
339 0 : gcd[k].gd.pos.width = 40;
340 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
341 0 : if ( sf->layers[ly_fore].order2 ) gcd[k].gd.flags = gg_visible;
342 0 : gcd[k].gd.cid = CID_FlattenBound;
343 0 : gcd[k++].creator = GTextFieldCreate;
344 0 : harray4[0][2] = &gcd[k-1];
345 :
346 0 : gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+gcd[k-1].gd.pos.width+3;
347 0 : gcd[k].gd.pos.y = gcd[k-2].gd.pos.y;
348 0 : gcd[k].gd.flags = gg_visible | gg_enabled ;
349 0 : if ( sf->layers[ly_fore].order2 ) gcd[k].gd.flags = gg_visible;
350 0 : label[k].text = (unichar_t *) _("em-units");
351 0 : label[k].text_is_1byte = true;
352 0 : gcd[k].gd.label = &label[k];
353 0 : gcd[k++].creator = GLabelCreate;
354 0 : harray4[0][3] = &gcd[k-1]; harray4[0][4] = GCD_Glue; harray4[0][5] = NULL;
355 :
356 :
357 0 : label[k].text = (unichar_t *) _("Don't smooth lines");
358 0 : label[k].text_is_1byte = true;
359 0 : gcd[k].gd.label = &label[k];
360 0 : gcd[k].gd.pos.x = 8; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+14;
361 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
362 0 : gcd[k++].creator = GLabelCreate;
363 0 : harray4[1][0] = &gcd[k-1]; harray4[1][1] = harray4[1][2] = harray4[1][3] = GCD_ColSpan;
364 0 : harray4[1][4] = GCD_Glue; harray4[1][5] = NULL;
365 :
366 0 : label[k].text = (unichar_t *) _("longer than");
367 0 : label[k].text_is_1byte = true;
368 0 : gcd[k].gd.label = &label[k];
369 0 : gcd[k].gd.pos.x = 20; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+24;
370 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
371 0 : gcd[k++].creator = GLabelCreate;
372 0 : harray4[2][0] = GCD_HPad10; harray4[2][1] = &gcd[k-1];
373 :
374 0 : sprintf( buffer4, "%.3g", oldlinelenmax_rat*sim.em_size );
375 0 : label[k].text = (unichar_t *) buffer4;
376 0 : label[k].text_is_1byte = true;
377 0 : gcd[k].gd.label = &label[k];
378 0 : gcd[k].gd.pos.x = 90; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-6;
379 0 : gcd[k].gd.pos.width = 40;
380 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
381 0 : gcd[k].gd.cid = CID_LineLenMax;
382 0 : gcd[k++].creator = GTextFieldCreate;
383 0 : harray4[2][2] = &gcd[k-1];
384 :
385 0 : gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+gcd[k-1].gd.pos.width+3;
386 0 : gcd[k].gd.pos.y = gcd[k-2].gd.pos.y;
387 0 : gcd[k].gd.flags = gg_visible | gg_enabled ;
388 0 : label[k].text = (unichar_t *) _("em-units");
389 0 : label[k].text_is_1byte = true;
390 0 : gcd[k].gd.label = &label[k];
391 0 : gcd[k++].creator = GLabelCreate;
392 0 : harray4[2][3] = &gcd[k-1]; harray4[2][4] = GCD_Glue; harray4[2][5] = NULL;
393 0 : harray4[3][0] = NULL;
394 :
395 0 : boxes[5].gd.flags = gg_enabled|gg_visible;
396 0 : boxes[5].gd.u.boxelements = harray4[0];
397 0 : boxes[5].creator = GHVBoxCreate;
398 0 : varray[l][0] = &boxes[5]; varray[l++][1] = NULL;
399 :
400 0 : gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+20;
401 0 : gcd[k].gd.flags = gg_visible | gg_enabled | (set_as_default ? gg_cb_on : 0);
402 0 : label[k].text = (unichar_t *) _("Set as Default");
403 0 : label[k].text_is_1byte = true;
404 0 : gcd[k].gd.label = &label[k];
405 0 : gcd[k].gd.cid = CID_SetAsDefault;
406 0 : gcd[k++].creator = GCheckBoxCreate;
407 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
408 :
409 0 : gcd[k].gd.pos.x = 15; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y + 20;
410 0 : gcd[k].gd.pos.width = 150;
411 0 : gcd[k].gd.flags = gg_enabled|gg_visible;
412 0 : gcd[k++].creator = GLineCreate;
413 0 : varray[l][0] = &gcd[k-1]; varray[l++][1] = NULL;
414 :
415 0 : gcd[k].gd.pos.x = 20-3; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+30;
416 0 : gcd[k].gd.pos.width = -1; gcd[k].gd.pos.height = 0;
417 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default;
418 0 : label[k].text = (unichar_t *) _("_OK");
419 0 : label[k].text_is_1byte = true;
420 0 : label[k].text_in_resource = true;
421 0 : gcd[k].gd.mnemonic = 'O';
422 0 : gcd[k].gd.label = &label[k];
423 0 : gcd[k].gd.handle_controlevent = Sim_OK;
424 0 : gcd[k++].creator = GButtonCreate;
425 0 : barray[0] = GCD_Glue; barray[1] = &gcd[k-1]; barray[2] = GCD_Glue;
426 :
427 0 : gcd[k].gd.pos.x = -20; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3;
428 0 : gcd[k].gd.pos.width = -1; gcd[k].gd.pos.height = 0;
429 0 : gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
430 0 : label[k].text = (unichar_t *) _("_Cancel");
431 0 : label[k].text_is_1byte = true;
432 0 : label[k].text_in_resource = true;
433 0 : gcd[k].gd.label = &label[k];
434 0 : gcd[k].gd.mnemonic = 'C';
435 0 : gcd[k].gd.handle_controlevent = Sim_Cancel;
436 0 : gcd[k++].creator = GButtonCreate;
437 0 : barray[3] = GCD_Glue; barray[4] = &gcd[k-1]; barray[5] = GCD_Glue; barray[6] = NULL;
438 :
439 0 : boxes[6].gd.flags = gg_enabled|gg_visible;
440 0 : boxes[6].gd.u.boxelements = barray;
441 0 : boxes[6].creator = GHBoxCreate;
442 0 : varray[l][0] = &boxes[6]; varray[l++][1] = NULL;
443 0 : varray[l][0] = NULL;
444 :
445 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
446 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
447 0 : boxes[0].gd.u.boxelements = varray[0];
448 0 : boxes[0].creator = GHVGroupCreate;
449 :
450 0 : GGadgetsCreate(gw,boxes);
451 0 : GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Error));
452 0 : GTextFieldSelect(GWidgetGetControl(gw,CID_Error),0,-1);
453 0 : GHVBoxSetExpandableCol(boxes[2].ret,gb_expandglue);
454 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandglue);
455 0 : GHVBoxSetExpandableCol(boxes[4].ret,gb_expandglue);
456 0 : GHVBoxSetExpandableCol(boxes[5].ret,gb_expandglue);
457 0 : GHVBoxSetExpandableCol(boxes[6].ret,gb_expandgluesame);
458 0 : GHVBoxFitWindow(boxes[0].ret);
459 :
460 0 : GWidgetHidePalettes();
461 0 : GDrawSetVisible(gw,true);
462 0 : while ( !sim.done )
463 0 : GDrawProcessOneEvent(NULL);
464 0 : GDrawDestroyWindow(gw);
465 0 : if ( sim.cancelled )
466 0 : return( false );
467 :
468 0 : smpl->flags = sim.flags;
469 0 : smpl->err = sim.err;
470 0 : smpl->tan_bounds = sim.tan_bounds;
471 0 : smpl->linefixup = sim.linefixup;
472 0 : smpl->linelenmax = sim.linelenmax;
473 0 : smpl->set_as_default = sim.set_as_default;
474 0 : set_as_default = sim.set_as_default;
475 0 : return( true );
476 : }
|