Line data Source code
1 : /* -*- coding: utf-8 -*- */
2 : /* Copyright (C) 2000-2012 by George Williams */
3 : /*
4 : * Redistribution and use in source and binary forms, with or without
5 : * modification, are permitted provided that the following conditions are met:
6 :
7 : * Redistributions of source code must retain the above copyright notice, this
8 : * list of conditions and the following disclaimer.
9 :
10 : * Redistributions in binary form must reproduce the above copyright notice,
11 : * this list of conditions and the following disclaimer in the documentation
12 : * and/or other materials provided with the distribution.
13 :
14 : * The name of the author may not be used to endorse or promote products
15 : * derived from this software without specific prior written permission.
16 :
17 : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
18 : * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 : * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20 : * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 : * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 : * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 : * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 : * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 : */
28 : #include "bvedit.h"
29 : #include "fontforgeui.h"
30 : #include <math.h>
31 : #include "ustring.h"
32 : #include <gkeysym.h>
33 :
34 : #define TCnt 3
35 :
36 : typedef struct transdata {
37 : void *userdata;
38 : void (*transfunc)(void *,real trans[6],int otype,BVTFunc *,enum fvtrans_flags);
39 : int (*getorigin)(void *,BasePoint *bp,int otype);
40 : GWindow gw;
41 : int applied;
42 : int done;
43 : } TransData;
44 :
45 : #define CID_Origin 3001
46 : #define CID_AllLayers 3002
47 : #define CID_Round2Int 3003
48 : #define CID_DoKerns 3004
49 : #define CID_DoSimplePos 3005
50 : #define CID_DoGrid 3006
51 : #define CID_DoWidth 3007
52 : #define CID_Apply 3008
53 :
54 : #define CID_Type 1001
55 : #define CID_XMove 1002
56 : #define CID_YMove 1003
57 : #define CID_Angle 1004
58 : #define CID_Scale 1005
59 : #define CID_XScale 1006
60 : #define CID_YScale 1007
61 : #define CID_Horizontal 1008
62 : #define CID_Vertical 1009
63 : #define CID_SkewAng 1010
64 : #define CID_XLab 1011
65 : #define CID_YLab 1012
66 : #define CID_CounterClockwise 1013
67 : #define CID_Clockwise 1014
68 : #define CID_XPercent 1015
69 : #define CID_YPercent 1016
70 : #define CID_XDegree 1017
71 : #define CID_YDegree 1018
72 : #define CID_XAxis 1019
73 : #define CID_YAxis 1020
74 :
75 : #define CID_First CID_Type
76 : #define CID_Last CID_YAxis
77 :
78 : #define CID_ClockBox 1021
79 : #define CID_HVBox 1022
80 : #define CID_HBox 1023
81 :
82 : #define TBlock_Width 270
83 : #define TBlock_Height 40
84 : #define TBlock_Top 32
85 : #define TBlock_XStart 130
86 : #define TBlock_CIDOffset 100
87 :
88 : static GTextInfo origin[] = {
89 : { (unichar_t *) N_("Glyph Origin"), NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
90 : { (unichar_t *) N_("Center of Selection"), NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
91 : /* GT: The (x,y) position on the window where the user last pressed a mouse button */
92 : { (unichar_t *) N_("Last Press"), NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
93 : GTEXTINFO_EMPTY
94 : };
95 :
96 : static int selcid[] = { 0, CID_XMove, CID_Angle, CID_Scale, CID_XScale, 0, CID_SkewAng, CID_XAxis };
97 : static GTextInfo transformtypes[] = {
98 : { (unichar_t *) N_("Do Nothing"), NULL, 0, 0, (void *) 0x1000, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
99 : { (unichar_t *) N_("Move..."), NULL, 0, 0, (void *) 0x1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
100 : { (unichar_t *) N_("Rotate..."), NULL, 0, 0, (void *) 0x2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
101 : { (unichar_t *) N_("Scale Uniformly..."), NULL, 0, 0, (void *) 0x4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
102 : { (unichar_t *) N_("Scale..."), NULL, 0, 0, (void *) 0x8, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
103 : { (unichar_t *) N_("Flip..."), NULL, 0, 0, (void *) 0x10, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
104 : { (unichar_t *) N_("Skew..."), NULL, 0, 0, (void *) 0x20, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
105 : { (unichar_t *) N_("Rotate 3D Around..."), NULL, 0, 0, (void *) 0x40, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
106 : { (unichar_t *) N_("Move by Ruler..."), NULL, 0, 0, (void *) 0x401, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
107 : { (unichar_t *) N_("Rotate by Ruler..."), NULL, 0, 0, (void *) 0x402, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
108 : { (unichar_t *) N_("Skew by Ruler..."), NULL, 0, 0, (void *) 0x420, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, '\0' },
109 : GTEXTINFO_EMPTY
110 : };
111 :
112 0 : static int Trans_OK(GGadget *g, GEvent *e) {
113 : real transform[6], trans[6], t[6];
114 : bigreal angle, angle2;
115 : int i, index, err;
116 0 : int alllayers = false, round_2_int = false, dokerns = false, dokp=false;
117 0 : int dogrid = false, dowidth = false;
118 : BasePoint base;
119 0 : int origin, bvpos=0;
120 : BVTFunc bvts[TCnt+1];
121 : static int warned = false;
122 0 : int isapply = GGadgetGetCid(g) == CID_Apply;
123 :
124 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
125 0 : TransData *td = GDrawGetUserData(GGadgetGetWindow(g));
126 :
127 0 : transform[0] = transform[3] = 1.0;
128 0 : transform[1] = transform[2] = transform[4] = transform[5] = 0;
129 0 : base.x = base.y = 0;
130 :
131 0 : origin = GGadgetGetFirstListSelectedItem( GWidgetGetControl(td->gw,CID_Origin));
132 0 : if ( GWidgetGetControl(td->gw,CID_AllLayers)!=NULL )
133 0 : alllayers = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_AllLayers));
134 0 : if ( GWidgetGetControl(td->gw,CID_DoGrid)!=NULL )
135 0 : dogrid = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_DoGrid));
136 0 : if ( GWidgetGetControl(td->gw,CID_DoWidth)!=NULL )
137 0 : dowidth = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_DoWidth));
138 : else
139 0 : dowidth = true;
140 0 : if ( GWidgetGetControl(td->gw,CID_DoSimplePos)!=NULL )
141 0 : dokp = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_DoSimplePos));
142 0 : if ( GWidgetGetControl(td->gw,CID_DoKerns)!=NULL )
143 0 : dokerns = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_DoKerns));
144 0 : round_2_int = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_Round2Int));
145 0 : if ( isapply )
146 0 : alllayers = dogrid = dokp = dokerns = false;
147 0 : if ( td->getorigin!=NULL ) {
148 0 : (td->getorigin)(td->userdata,&base,origin );
149 0 : transform[4] = -base.x;
150 0 : transform[5] = -base.y;
151 : }
152 0 : for ( i=0; i<TCnt; ++i ) {
153 0 : index = GGadgetGetFirstListSelectedItem(
154 0 : GWidgetGetControl(td->gw,CID_Type+i*TBlock_CIDOffset));
155 0 : trans[0] = trans[3] = 1.0;
156 0 : trans[1] = trans[2] = trans[4] = trans[5] = 0;
157 0 : err = 0;
158 0 : switch ( index ) {
159 : case 0: /* Do Nothing */
160 0 : break;
161 : case 1: /* Move */
162 0 : trans[4] = GetReal8(td->gw,CID_XMove+i*TBlock_CIDOffset,_("X Movement"),&err);
163 0 : trans[5] = GetReal8(td->gw,CID_YMove+i*TBlock_CIDOffset,_("Y Movement"),&err);
164 0 : bvts[bvpos].x = trans[4]; bvts[bvpos].y = trans[5]; bvts[bvpos++].func = bvt_transmove;
165 0 : break;
166 : case 2: /* Rotate */
167 0 : angle = GetReal8(td->gw,CID_Angle+i*TBlock_CIDOffset,_("Rotation Angle"),&err);
168 0 : if ( GGadgetIsChecked( GWidgetGetControl(td->gw,CID_Clockwise+i*TBlock_CIDOffset)) )
169 0 : angle = -angle;
170 0 : if ( fmod(angle,90)!=0 )
171 0 : bvts[0].func = bvt_none; /* Bad trans=> No trans */
172 : else {
173 0 : angle = fmod(angle,360);
174 0 : if ( angle<0 ) angle+=360;
175 0 : if ( angle==90 ) bvts[bvpos++].func = bvt_rotate90ccw;
176 0 : else if ( angle==180 ) bvts[bvpos++].func = bvt_rotate180;
177 0 : else if ( angle==270 ) bvts[bvpos++].func = bvt_rotate90cw;
178 : }
179 0 : angle *= 3.1415926535897932/180;
180 0 : trans[0] = trans[3] = cos(angle);
181 0 : trans[2] = -(trans[1] = sin(angle));
182 0 : break;
183 : case 3: /* Scale Uniformly */
184 0 : trans[0] = trans[3] = GetReal8(td->gw,CID_Scale+i*TBlock_CIDOffset,_("Scale Factor"),&err)/100.0;
185 0 : bvts[0].func = bvt_none; /* Bad trans=> No trans */
186 0 : break;
187 : case 4: /* Scale */
188 0 : trans[0] = GetReal8(td->gw,CID_XScale+i*TBlock_CIDOffset,_("X Scale Factor"),&err)/100.0;
189 0 : trans[3] = GetReal8(td->gw,CID_YScale+i*TBlock_CIDOffset,_("Y Scale Factor"),&err)/100.0;
190 0 : bvts[0].func = bvt_none; /* Bad trans=> No trans */
191 0 : break;
192 : case 5: /* Flip */
193 0 : if ( GGadgetIsChecked( GWidgetGetControl(td->gw,CID_Horizontal+i*TBlock_CIDOffset)) ) {
194 0 : trans[0] = -1;
195 0 : bvts[bvpos++].func = bvt_fliph;
196 : } else {
197 0 : trans[3] = -1;
198 0 : bvts[bvpos++].func = bvt_flipv;
199 : }
200 0 : break;
201 : case 6: /* Skew */
202 0 : angle = GetReal8(td->gw,CID_SkewAng+i*TBlock_CIDOffset,_("Skew Angle"),&err);
203 0 : if ( GGadgetIsChecked( GWidgetGetControl(td->gw,CID_CounterClockwise+i*TBlock_CIDOffset)) )
204 0 : angle = -angle;
205 0 : angle *= 3.1415926535897932/180;
206 0 : trans[2] = tan(angle);
207 0 : skewselect(&bvts[bvpos],trans[2]); ++bvpos;
208 0 : break;
209 : case 7: /* 3D rotate */
210 0 : angle = GetReal8(td->gw,CID_XAxis+i*TBlock_CIDOffset,_("Rotation about X Axis"),&err) * 3.1415926535897932/180;
211 0 : angle2 = GetReal8(td->gw,CID_YAxis+i*TBlock_CIDOffset,_("Rotation about Y Axis"),&err) * 3.1415926535897932/180;
212 0 : trans[0] = cos(angle2);
213 0 : trans[3] = cos(angle );
214 0 : bvts[0].func = bvt_none; /* Bad trans=> No trans */
215 0 : break;
216 : default:
217 0 : IError("Unexpected selection in Transform");
218 0 : err = 1;
219 0 : break;
220 : }
221 0 : if ( err )
222 0 : return(true);
223 0 : t[0] = transform[0]*trans[0] +
224 0 : transform[1]*trans[2];
225 0 : t[1] = transform[0]*trans[1] +
226 0 : transform[1]*trans[3];
227 0 : t[2] = transform[2]*trans[0] +
228 0 : transform[3]*trans[2];
229 0 : t[3] = transform[2]*trans[1] +
230 0 : transform[3]*trans[3];
231 0 : t[4] = transform[4]*trans[0] +
232 0 : transform[5]*trans[2] +
233 0 : trans[4];
234 0 : t[5] = transform[4]*trans[1] +
235 0 : transform[5]*trans[3] +
236 0 : trans[5];
237 0 : memcpy(transform,t,sizeof(t));
238 : }
239 0 : bvts[bvpos++].func = bvt_none; /* Done */
240 0 : for ( i=0; i<6; ++i )
241 0 : if ( RealNear(transform[i],0)) transform[i] = 0;
242 0 : transform[4] += base.x;
243 0 : transform[5] += base.y;
244 :
245 0 : if (( transform[1]!=0 || transform[2]!=0 ) && !warned ) {
246 0 : ff_post_notice(_("Warning"),_("After rotating or skewing a glyph you should probably apply Element->Add Extrema"));
247 0 : warned = true;
248 : }
249 0 : (td->transfunc)(td->userdata,transform,origin,bvts,
250 0 : (alllayers?fvt_alllayers:0)|
251 0 : (dogrid?fvt_dogrid:0)|
252 0 : (dowidth?0:fvt_dontmovewidth)|
253 0 : (round_2_int?fvt_round_to_int:0)|
254 0 : (dokp?fvt_scalepstpos:0)|
255 0 : (dokerns?fvt_scalekernclasses:0)|
256 0 : (isapply?fvt_justapply:0));
257 0 : td->done = !isapply;
258 0 : td->applied = isapply;
259 : }
260 0 : return( true );
261 : }
262 :
263 0 : static int Trans_Cancel(GGadget *g, GEvent *e) {
264 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) {
265 0 : TransData *td = GDrawGetUserData(GGadgetGetWindow(g));
266 0 : if ( td->applied )
267 0 : (td->transfunc)(td->userdata,NULL,0,NULL,fvt_revert);
268 0 : td->done = true;
269 : }
270 0 : return( true );
271 : }
272 :
273 0 : static int Trans_TypeChange(GGadget *g, GEvent *e) {
274 0 : if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) {
275 0 : GWindow bw = GGadgetGetWindow(g);
276 0 : int offset = GGadgetGetCid(g)-CID_Type;
277 0 : int index = GGadgetGetFirstListSelectedItem(g);
278 0 : if ( index < 0 ) return( false );
279 0 : int mask = (intpt) transformtypes[index].userdata;
280 : int i;
281 :
282 0 : if ( mask & 0x400 ) {
283 0 : real xoff = last_ruler_offset[0].x, yoff = last_ruler_offset[0].y;
284 : char buf[24]; unichar_t ubuf[24];
285 0 : if ( mask & 0x20 )
286 0 : index -= 4; /* skew */
287 : else
288 0 : index -= 7; /* move or rotate */
289 0 : GGadgetSelectOneListItem( g,index );
290 0 : mask &= ~0x400;
291 0 : if ( mask&1 ) { /* Move */
292 0 : sprintf( buf, "%.1f", (double) xoff );
293 0 : uc_strcpy(ubuf,buf);
294 0 : GGadgetSetTitle(GWidgetGetControl(bw,CID_XMove+offset), ubuf );
295 0 : sprintf( buf, "%.1f", (double) yoff );
296 0 : uc_strcpy(ubuf,buf);
297 0 : GGadgetSetTitle(GWidgetGetControl(bw,CID_YMove+offset), ubuf );
298 : } else {
299 0 : sprintf( buf, "%.0f", atan2(yoff,xoff)*180/3.1415926535897932 );
300 0 : uc_strcpy(ubuf,buf);
301 0 : GGadgetSetTitle(GWidgetGetControl(bw,((mask&0x2)?CID_Angle:CID_SkewAng)+offset), ubuf );
302 0 : GGadgetSetChecked(GWidgetGetControl(bw,CID_Clockwise+offset), false );
303 0 : GGadgetSetChecked(GWidgetGetControl(bw,CID_CounterClockwise+offset), true );
304 : }
305 : }
306 :
307 0 : for ( i=CID_First; i<=CID_Last; ++i ) {
308 : GGadget *sg;
309 0 : sg = GWidgetGetControl(bw,i+offset);
310 0 : GGadgetSetVisible(sg, ( ((intpt) GGadgetGetUserData(sg))&mask )?1:0);
311 : }
312 0 : if ( selcid[index]!=0 ) {
313 0 : GGadget *tf = GWidgetGetControl(bw,selcid[index]+offset);
314 0 : GWidgetIndicateFocusGadget(tf);
315 0 : GTextFieldSelect(tf,0,-1);
316 : }
317 0 : GWidgetToDesiredSize(bw);
318 0 : GDrawRequestExpose(bw,NULL,false);
319 : }
320 0 : return( true );
321 : }
322 :
323 0 : static int trans_e_h(GWindow gw, GEvent *event) {
324 0 : if ( event->type==et_close ) {
325 0 : TransData *td = GDrawGetUserData(gw);
326 0 : td->done = true;
327 0 : } else if ( event->type == et_map ) {
328 : /* Above palettes */
329 0 : GDrawRaise(gw);
330 0 : } else if ( event->type==et_char ) {
331 0 : if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) {
332 0 : help("transform.html");
333 0 : return( true );
334 : }
335 0 : return( false );
336 : }
337 0 : return( true );
338 : }
339 :
340 0 : static GGadgetCreateData *MakeTransBlock(TransData *td,int bnum,
341 : GGadgetCreateData *gcd, GTextInfo *label, GGadgetCreateData **array) {
342 0 : int offset = bnum*TBlock_CIDOffset;
343 :
344 0 : gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 9;
345 0 : gcd[0].gd.flags = gg_visible | gg_enabled;
346 0 : gcd[0].gd.label = &transformtypes[0];
347 0 : gcd[0].gd.u.list = transformtypes;
348 0 : gcd[0].gd.cid = CID_Type+offset;
349 0 : gcd[0].creator = GListButtonCreate;
350 0 : gcd[0].data = (void *) -1;
351 0 : gcd[0].gd.handle_controlevent = Trans_TypeChange;
352 0 : transformtypes[0].selected = true;
353 :
354 0 : label[1].text = (unichar_t *) _("_X");
355 0 : label[1].text_is_1byte = true;
356 0 : label[1].text_in_resource = true;
357 0 : gcd[1].gd.label = &label[1];
358 0 : gcd[1].gd.pos.x = TBlock_XStart; gcd[1].gd.pos.y = 15;
359 0 : gcd[1].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled;
360 0 : gcd[1].data = (void *) 0x49;
361 0 : gcd[1].gd.cid = CID_XLab+offset;
362 0 : gcd[1].creator = GLabelCreate;
363 :
364 0 : label[2].text = (unichar_t *) "0";
365 0 : label[2].text_is_1byte = true;
366 0 : gcd[2].gd.label = &label[2];
367 0 : gcd[2].gd.pos.x = TBlock_XStart+10; gcd[2].gd.pos.y = 9; gcd[2].gd.pos.width = 40;
368 0 : gcd[2].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled;
369 0 : gcd[2].data = (void *) 0x1;
370 0 : gcd[2].gd.cid = CID_XMove+offset;
371 0 : gcd[2].creator = GTextFieldCreate;
372 :
373 0 : label[3].text = (unichar_t *) _("_Y");
374 0 : label[3].text_is_1byte = true;
375 0 : label[3].text_in_resource = true;
376 0 : gcd[3].gd.label = &label[3];
377 0 : gcd[3].gd.pos.x = TBlock_XStart+70; gcd[3].gd.pos.y = 15;
378 0 : gcd[3].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled;
379 0 : gcd[3].data = (void *) 0x49;
380 0 : gcd[3].gd.cid = CID_YLab+offset;
381 0 : gcd[3].creator = GLabelCreate;
382 :
383 0 : label[4].text = (unichar_t *) "0";
384 0 : label[4].text_is_1byte = true;
385 0 : gcd[4].gd.label = &label[4];
386 0 : gcd[4].gd.pos.x = TBlock_XStart+80; gcd[4].gd.pos.y = 9; gcd[4].gd.pos.width = 40;
387 0 : gcd[4].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled;
388 0 : gcd[4].data = (void *) 0x1;
389 0 : gcd[4].gd.cid = CID_YMove+offset;
390 0 : gcd[4].creator = GTextFieldCreate;
391 :
392 0 : label[5].text = (unichar_t *) "100";
393 0 : label[5].text_is_1byte = true;
394 0 : gcd[5].gd.label = &label[5];
395 0 : gcd[5].gd.pos.x = TBlock_XStart+10; gcd[5].gd.pos.y = 9; gcd[5].gd.pos.width = 40;
396 0 : gcd[5].gd.flags = gg_enabled;
397 0 : gcd[5].data = (void *) 0x8;
398 0 : gcd[5].gd.cid = CID_XScale+offset;
399 0 : gcd[5].creator = GTextFieldCreate;
400 :
401 0 : label[6].text = (unichar_t *) "100";
402 0 : label[6].text_is_1byte = true;
403 0 : gcd[6].gd.label = &label[6];
404 0 : gcd[6].gd.pos.x = TBlock_XStart+80; gcd[6].gd.pos.y = 9; gcd[6].gd.pos.width = 40;
405 0 : gcd[6].gd.flags = gg_enabled;
406 0 : gcd[6].data = (void *) 0x8;
407 0 : gcd[6].gd.cid = CID_YScale+offset;
408 0 : gcd[6].creator = GTextFieldCreate;
409 :
410 0 : label[7].text = (unichar_t *) "100";
411 0 : label[7].text_is_1byte = true;
412 0 : gcd[7].gd.label = &label[7];
413 0 : gcd[7].gd.pos.x = TBlock_XStart+10; gcd[7].gd.pos.y = 9; gcd[7].gd.pos.width = 40;
414 0 : gcd[7].gd.flags = gg_enabled;
415 0 : gcd[7].data = (void *) 0x4;
416 0 : gcd[7].gd.cid = CID_Scale+offset;
417 0 : gcd[7].creator = GTextFieldCreate;
418 :
419 0 : label[8].text = (unichar_t *) U_("° Clockwise");
420 0 : label[8].text_is_1byte = true;
421 0 : gcd[8].gd.label = &label[8];
422 0 : gcd[8].gd.pos.x = TBlock_XStart+53; gcd[8].gd.pos.y = 2; gcd[8].gd.pos.height = 12;
423 0 : gcd[8].gd.flags = gg_enabled;
424 0 : gcd[8].data = (void *) 0x22;
425 0 : gcd[8].gd.cid = CID_Clockwise+offset;
426 0 : gcd[8].creator = GRadioCreate;
427 :
428 : /* GT: Sometimes spelled Widdershins. An old word which means counter clockwise. */
429 : /* GT: I used it because "counter clockwise" took too much space. */
430 0 : label[9].text = (unichar_t *) U_("° Withershins"); /* deiseal */
431 0 : label[9].text_is_1byte = true;
432 0 : gcd[9].gd.label = &label[9];
433 0 : gcd[9].gd.pos.x = TBlock_XStart+53; gcd[9].gd.pos.y = 17; gcd[9].gd.pos.height = 12;
434 0 : gcd[9].gd.flags = gg_enabled | gg_cb_on;
435 0 : gcd[9].data = (void *) 0x22;
436 0 : gcd[9].gd.cid = CID_CounterClockwise+offset;
437 0 : gcd[9].creator = GRadioCreate;
438 :
439 0 : label[10].text = (unichar_t *) "180";
440 0 : label[10].text_is_1byte = true;
441 0 : gcd[10].gd.label = &label[10];
442 0 : gcd[10].gd.pos.x = TBlock_XStart+10; gcd[10].gd.pos.y = 9; gcd[10].gd.pos.width = 40;
443 0 : gcd[10].gd.flags = gg_enabled;
444 0 : gcd[10].data = (void *) 0x2;
445 0 : gcd[10].gd.cid = CID_Angle+offset;
446 0 : gcd[10].creator = GTextFieldCreate;
447 :
448 0 : label[11].text = (unichar_t *) "10"; /* -10 if we default clockwise */
449 0 : label[11].text_is_1byte = true;
450 0 : gcd[11].gd.label = &label[11];
451 0 : gcd[11].gd.pos.x = TBlock_XStart+10; gcd[11].gd.pos.y = 9; gcd[11].gd.pos.width = 40;
452 0 : gcd[11].gd.flags = gg_enabled;
453 0 : gcd[11].data = (void *) 0x20;
454 0 : gcd[11].gd.cid = CID_SkewAng+offset;
455 0 : gcd[11].creator = GTextFieldCreate;
456 :
457 0 : label[12].text = (unichar_t *) _("Horizontal");
458 0 : label[12].text_is_1byte = true;
459 0 : gcd[12].gd.label = &label[12];
460 0 : gcd[12].gd.pos.x = TBlock_XStart; gcd[12].gd.pos.y = 2; gcd[12].gd.pos.height = 12;
461 0 : gcd[12].gd.flags = gg_enabled | gg_cb_on;
462 0 : gcd[12].data = (void *) 0x10;
463 0 : gcd[12].gd.cid = CID_Horizontal+offset;
464 0 : gcd[12].creator = GRadioCreate;
465 :
466 0 : label[13].text = (unichar_t *) _("Vertical");
467 0 : label[13].text_is_1byte = true;
468 0 : gcd[13].gd.label = &label[13];
469 0 : gcd[13].gd.pos.x = TBlock_XStart; gcd[13].gd.pos.y = 17; gcd[13].gd.pos.height = 12;
470 0 : gcd[13].gd.flags = gg_enabled;
471 0 : gcd[13].data = (void *) 0x10;
472 0 : gcd[13].gd.cid = CID_Vertical+offset;
473 0 : gcd[13].creator = GRadioCreate;
474 :
475 0 : label[14].text = (unichar_t *) _("%");
476 0 : label[14].text_is_1byte = true;
477 0 : gcd[14].gd.label = &label[14];
478 0 : gcd[14].gd.pos.x = TBlock_XStart+51; gcd[14].gd.pos.y = 15;
479 0 : gcd[14].gd.flags = gg_enabled;
480 0 : gcd[14].data = (void *) 0xc;
481 0 : gcd[14].gd.cid = CID_XPercent+offset;
482 0 : gcd[14].creator = GLabelCreate;
483 :
484 0 : label[15].text = (unichar_t *) _("%");
485 0 : label[15].text_is_1byte = true;
486 0 : gcd[15].gd.label = &label[15];
487 0 : gcd[15].gd.pos.x = TBlock_XStart+121; gcd[15].gd.pos.y = 15;
488 0 : gcd[15].gd.flags = gg_enabled;
489 0 : gcd[15].data = (void *) 0x8;
490 0 : gcd[15].gd.cid = CID_YPercent+offset;
491 0 : gcd[15].creator = GLabelCreate;
492 :
493 0 : label[16].text = (unichar_t *) U_("°");
494 0 : label[16].text_is_1byte = true;
495 0 : gcd[16].gd.label = &label[16];
496 0 : gcd[16].gd.pos.x = TBlock_XStart+51; gcd[16].gd.pos.y = 15;
497 0 : gcd[16].gd.flags = gg_enabled;
498 0 : gcd[16].data = (void *) 0x40;
499 0 : gcd[16].gd.cid = CID_XDegree+offset;
500 0 : gcd[16].creator = GLabelCreate;
501 :
502 0 : label[17].text = (unichar_t *) U_("°");
503 0 : label[17].text_is_1byte = true;
504 0 : gcd[17].gd.label = &label[17];
505 0 : gcd[17].gd.pos.x = TBlock_XStart+121; gcd[17].gd.pos.y = 15;
506 0 : gcd[17].gd.flags = gg_enabled;
507 0 : gcd[17].data = (void *) 0x40;
508 0 : gcd[17].gd.cid = CID_YDegree+offset;
509 0 : gcd[17].creator = GLabelCreate;
510 :
511 0 : label[18].text = (unichar_t *) "45";
512 0 : label[18].text_is_1byte = true;
513 0 : gcd[18].gd.label = &label[18];
514 0 : gcd[18].gd.pos.x = TBlock_XStart+10; gcd[18].gd.pos.y = 9; gcd[18].gd.pos.width = 40;
515 0 : gcd[18].gd.flags = gg_enabled;
516 0 : gcd[18].data = (void *) 0x40;
517 0 : gcd[18].gd.cid = CID_XAxis+offset;
518 0 : gcd[18].creator = GTextFieldCreate;
519 :
520 0 : label[19].text = (unichar_t *) "0";
521 0 : label[19].text_is_1byte = true;
522 0 : gcd[19].gd.label = &label[19];
523 0 : gcd[19].gd.pos.x = TBlock_XStart+80; gcd[19].gd.pos.y = 9; gcd[19].gd.pos.width = 40;
524 0 : gcd[19].gd.flags = gg_enabled;
525 0 : gcd[19].data = (void *) 0x40;
526 0 : gcd[19].gd.cid = CID_YAxis+offset;
527 0 : gcd[19].creator = GTextFieldCreate;
528 :
529 :
530 0 : array[0] = &gcd[12]; array[1] = &gcd[13]; array[2] = NULL;
531 0 : array[3] = &gcd[8]; array[4] = &gcd[9]; array[5] = NULL;
532 :
533 0 : gcd[20].gd.flags = gg_enabled|gg_visible;
534 0 : gcd[20].gd.u.boxelements = array;
535 0 : gcd[20].gd.cid = CID_HVBox+offset;
536 0 : gcd[20].creator = GVBoxCreate;
537 :
538 0 : gcd[21].gd.flags = gg_enabled|gg_visible;
539 0 : gcd[21].gd.u.boxelements = array+3;
540 0 : gcd[21].gd.cid = CID_ClockBox+offset;
541 0 : gcd[21].creator = GVBoxCreate;
542 :
543 0 : array[6] = &gcd[0];
544 0 : array[7] = &gcd[20];
545 0 : array[8] = &gcd[1];
546 0 : array[9] = &gcd[2];
547 0 : array[10] = &gcd[5];
548 0 : array[11] = &gcd[7];
549 0 : array[12] = &gcd[10];
550 0 : array[13] = &gcd[11];
551 0 : array[14] = &gcd[18];
552 0 : array[15] = &gcd[14];
553 0 : array[16] = &gcd[16];
554 0 : array[17] = &gcd[21];
555 0 : array[18] = &gcd[3];
556 0 : array[19] = &gcd[4];
557 0 : array[20] = &gcd[6];
558 0 : array[21] = &gcd[19];
559 0 : array[22] = &gcd[15];
560 0 : array[23] = &gcd[17];
561 0 : array[24] = GCD_Glue;
562 0 : array[25] = NULL;
563 0 : array[26] = NULL;
564 :
565 0 : gcd[22].gd.flags = gg_enabled|gg_visible;
566 0 : gcd[22].gd.u.boxelements = array+6;
567 0 : gcd[22].gd.cid = CID_HBox+offset;
568 0 : gcd[22].creator = GHVGroupCreate;
569 0 : return( gcd+22 );
570 : }
571 :
572 0 : void TransformDlgCreate(void *data,void (*transfunc)(void *,real *,int,BVTFunc *,enum fvtrans_flags),
573 : int (*getorigin)(void *,BasePoint *,int), enum transdlg_flags flags,
574 : enum cvtools cvt) {
575 : GRect pos;
576 : GWindow gw;
577 : GWindowAttrs wattrs;
578 : GGadgetCreateData gcd[12+TCnt*25], boxes[4], *subarray[TCnt*27], *array[2*(TCnt+8)+4], *buttons[13], *origarray[4];
579 : GTextInfo label[9+TCnt*24];
580 : static TransData td;
581 : int i, y, gci, subai, ai;
582 : int32 len;
583 : GGadget *orig;
584 : BasePoint junk;
585 : GTextInfo **ti;
586 : static int done = false;
587 :
588 0 : if ( !done ) {
589 : int i;
590 0 : for ( i=0; transformtypes[i].text!=NULL; ++i )
591 0 : transformtypes[i].text = (unichar_t *) _((char *) transformtypes[i].text);
592 0 : for ( i=0; origin[i].text!=NULL; ++i )
593 0 : origin[i].text = (unichar_t *) _((char *) origin[i].text);
594 0 : done = true;
595 : }
596 :
597 0 : td.userdata = data;
598 0 : td.transfunc = transfunc;
599 0 : td.getorigin = getorigin;
600 0 : td.done = false;
601 :
602 0 : if ( td.gw==NULL ) {
603 0 : memset(&wattrs,0,sizeof(wattrs));
604 0 : wattrs.mask = wam_events|wam_cursor|wam_utf8_wtitle|wam_undercursor|wam_isdlg|wam_restrict;
605 0 : wattrs.event_masks = ~(1<<et_charup);
606 0 : wattrs.restrict_input_to_me = 1;
607 0 : wattrs.undercursor = 1;
608 0 : wattrs.cursor = ct_pointer;
609 0 : wattrs.utf8_window_title = _("Transform");
610 0 : wattrs.is_dlg = true;
611 0 : pos.x = pos.y = 0;
612 0 : pos.width = GGadgetScale(GDrawPointsToPixels(NULL,TBlock_Width));
613 0 : pos.height = GDrawPointsToPixels(NULL,TBlock_Top+TCnt*TBlock_Height+110);
614 0 : td.gw = gw = GDrawCreateTopWindow(NULL,&pos,trans_e_h,&td,&wattrs);
615 :
616 0 : memset(&label,0,sizeof(label));
617 0 : memset(&gcd,0,sizeof(gcd));
618 0 : memset(&boxes,0,sizeof(boxes));
619 :
620 0 : label[0].text = (unichar_t *) _("Origin:");
621 0 : label[0].text_is_1byte = true;
622 0 : label[0].text_in_resource = true;
623 0 : gcd[0].gd.label = &label[0];
624 0 : gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 4;
625 0 : gcd[0].gd.flags = (getorigin==NULL) ? gg_visible : (gg_visible | gg_enabled);
626 0 : gcd[0].creator = GLabelCreate;
627 :
628 0 : gcd[1].gd.pos.x = 5; gcd[1].gd.pos.y = 4;
629 0 : gcd[1].gd.flags = (getorigin==NULL) ? gg_visible : (gg_visible | gg_enabled);
630 0 : gcd[1].gd.label = &origin[1];
631 0 : gcd[1].gd.u.list = origin;
632 0 : gcd[1].gd.cid = CID_Origin;
633 0 : gcd[1].creator = GListButtonCreate;
634 0 : origin[1].selected = true;
635 :
636 0 : origarray[0] = &gcd[0]; origarray[1] = &gcd[1]; origarray[2] = GCD_Glue; origarray[3] = NULL;
637 :
638 0 : boxes[3].gd.flags = gg_enabled|gg_visible;
639 0 : boxes[3].gd.u.boxelements = origarray;
640 0 : boxes[3].creator = GHBoxCreate;
641 :
642 0 : array[0] = &boxes[3]; array[1] = NULL;
643 :
644 0 : gci = 2; subai = 0; ai = 2;
645 0 : for ( i=0; i<TCnt; ++i ) {
646 0 : array[ai++] = MakeTransBlock(&td,i,gcd+gci,label+gci,subarray+subai);
647 0 : array[ai++] = NULL;
648 0 : gci += 23; subai += 27;
649 : }
650 :
651 0 : y = TBlock_Top+TCnt*TBlock_Height+4;
652 :
653 0 : gcd[gci].gd.pos.x = 10; gcd[gci].gd.pos.y = y;
654 0 : gcd[gci].gd.flags = (flags&tdf_enableback) ? (gg_visible | gg_enabled) : gg_visible;
655 0 : label[gci].text = (unichar_t *) _("Transform _All Layers");
656 0 : label[gci].text_is_1byte = true;
657 0 : label[gci].text_in_resource = true;
658 0 : gcd[gci].gd.label = &label[gci];
659 0 : gcd[gci].gd.cid = CID_AllLayers;
660 0 : gcd[gci++].creator = GCheckBoxCreate;
661 0 : array[ai++] = &gcd[gci-1]; array[ai++] = NULL;
662 0 : y += 16;
663 :
664 0 : gcd[gci].gd.pos.x = 10; gcd[gci].gd.pos.y = y;
665 0 : gcd[gci].gd.flags = (flags&tdf_enableback) ? (gg_visible | gg_enabled) : gg_visible;
666 0 : label[gci].text = (unichar_t *) _("Transform _Guide Layer Too");
667 0 : label[gci].text_is_1byte = true;
668 0 : label[gci].text_in_resource = true;
669 0 : gcd[gci].gd.label = &label[gci];
670 0 : gcd[gci].gd.cid = CID_DoGrid;
671 0 : gcd[gci++].creator = GCheckBoxCreate;
672 0 : array[ai++] = &gcd[gci-1]; array[ai++] = NULL;
673 0 : y += 16;
674 :
675 0 : gcd[gci].gd.pos.x = 10; gcd[gci].gd.pos.y = y;
676 0 : gcd[gci].gd.flags = (flags&tdf_enableback) ? (gg_visible | gg_enabled | gg_cb_on) : gg_visible;
677 0 : label[gci].text = (unichar_t *) _("Transform _Width Too");
678 0 : label[gci].text_is_1byte = true;
679 0 : label[gci].text_in_resource = true;
680 0 : gcd[gci].gd.label = &label[gci];
681 0 : gcd[gci].gd.cid = CID_DoWidth;
682 0 : gcd[gci++].creator = GCheckBoxCreate;
683 0 : array[ai++] = &gcd[gci-1]; array[ai++] = NULL;
684 0 : y += 16;
685 :
686 0 : gcd[gci].gd.pos.x = 10; gcd[gci].gd.pos.y = y;
687 0 : gcd[gci].gd.flags = gg_visible | (flags&tdf_enablekerns ? gg_enabled : 0) |
688 0 : (flags&tdf_defaultkerns ? gg_cb_on : 0);
689 0 : label[gci].text = (unichar_t *) _("Transform kerning _classes too");
690 0 : label[gci].text_is_1byte = true;
691 0 : label[gci].text_in_resource = true;
692 0 : gcd[gci].gd.label = &label[gci];
693 0 : gcd[gci].gd.cid = CID_DoKerns;
694 0 : gcd[gci++].creator = GCheckBoxCreate;
695 0 : array[ai++] = &gcd[gci-1]; array[ai++] = NULL;
696 0 : y += 16;
697 :
698 0 : gcd[gci].gd.pos.x = 10; gcd[gci].gd.pos.y = y;
699 0 : gcd[gci].gd.flags = gg_visible |
700 0 : (flags&tdf_enableback ? gg_enabled : 0) |
701 0 : (flags&tdf_enablekerns ? gg_cb_on : 0);
702 0 : label[gci].text = (unichar_t *) _("Transform simple positioning features & _kern pairs");
703 0 : label[gci].text_is_1byte = true;
704 0 : label[gci].text_in_resource = true;
705 0 : gcd[gci].gd.label = &label[gci];
706 0 : gcd[gci].gd.cid = CID_DoSimplePos;
707 0 : gcd[gci++].creator = GCheckBoxCreate;
708 0 : array[ai++] = &gcd[gci-1]; array[ai++] = NULL;
709 0 : y += 16;
710 :
711 0 : gcd[gci].gd.pos.x = 10; gcd[gci].gd.pos.y = y;
712 0 : gcd[gci].gd.flags = gg_visible | gg_enabled;
713 0 : label[gci].text = (unichar_t *) _("Round To _Int");
714 0 : label[gci].text_is_1byte = true;
715 0 : label[gci].text_in_resource = true;
716 0 : gcd[gci].gd.label = &label[gci];
717 0 : gcd[gci].gd.cid = CID_Round2Int;
718 0 : gcd[gci++].creator = GCheckBoxCreate;
719 0 : array[ai++] = &gcd[gci-1]; array[ai++] = NULL;
720 0 : y += 24;
721 :
722 0 : array[ai++] = GCD_Glue; array[ai++] = NULL;
723 :
724 0 : gcd[gci].gd.pos.x = 30-3; gcd[gci].gd.pos.y = y;
725 0 : gcd[gci].gd.flags = gg_visible | gg_enabled | gg_but_default;
726 0 : label[gci].text = (unichar_t *) _("_OK");
727 0 : label[gci].text_is_1byte = true;
728 0 : label[gci].text_in_resource = true;
729 0 : gcd[gci].gd.mnemonic = 'O';
730 0 : gcd[gci].gd.label = &label[gci];
731 0 : gcd[gci].gd.handle_controlevent = Trans_OK;
732 0 : gcd[gci++].creator = GButtonCreate;
733 0 : buttons[0] = GCD_Glue; buttons[1] = &gcd[gci-1]; buttons[2] = GCD_Glue; buttons[3] = GCD_Glue;
734 :
735 0 : gcd[gci].gd.flags = gg_visible | gg_enabled;
736 0 : label[gci].text = (unichar_t *) _("_Apply");
737 0 : label[gci].text_is_1byte = true;
738 0 : label[gci].text_in_resource = true;
739 0 : gcd[gci].gd.label = &label[gci];
740 0 : gcd[gci].gd.handle_controlevent = Trans_OK;
741 0 : gcd[gci].gd.cid = CID_Apply;
742 0 : gcd[gci++].creator = GButtonCreate;
743 0 : buttons[4] = GCD_Glue; buttons[5] = &gcd[gci-1]; buttons[6] = GCD_Glue; buttons[7] = GCD_Glue;
744 :
745 0 : gcd[gci].gd.pos.x = -30; gcd[gci].gd.pos.y = gcd[gci-1].gd.pos.y+3;
746 0 : gcd[gci].gd.flags = gg_visible | gg_enabled | gg_but_cancel;
747 0 : label[gci].text = (unichar_t *) _("_Cancel");
748 0 : label[gci].text_is_1byte = true;
749 0 : label[gci].text_in_resource = true;
750 0 : gcd[gci].gd.label = &label[gci];
751 0 : gcd[gci].gd.mnemonic = 'C';
752 0 : gcd[gci].gd.handle_controlevent = Trans_Cancel;
753 0 : gcd[gci++].creator = GButtonCreate;
754 0 : buttons[8] = GCD_Glue; buttons[9] = &gcd[gci-1]; buttons[10] = GCD_Glue;
755 0 : buttons[11] = NULL;
756 :
757 0 : boxes[2].gd.flags = gg_enabled|gg_visible;
758 0 : boxes[2].gd.u.boxelements = buttons;
759 0 : boxes[2].creator = GHBoxCreate;
760 :
761 0 : array[ai++] = &boxes[2]; array[ai++] = NULL; array[ai++] = NULL;
762 :
763 0 : boxes[0].gd.pos.x = boxes[0].gd.pos.y = 2;
764 0 : boxes[0].gd.flags = gg_enabled|gg_visible;
765 0 : boxes[0].gd.u.boxelements = array;
766 0 : boxes[0].creator = GHVGroupCreate;
767 :
768 0 : GGadgetsCreate(gw,boxes);
769 0 : GHVBoxSetExpandableRow(boxes[0].ret,gb_expandglue);
770 0 : GHVBoxSetExpandableCol(boxes[2].ret,gb_expandgluesame);
771 0 : GHVBoxSetExpandableCol(boxes[3].ret,gb_expandglue);
772 0 : for ( i=0; i<TCnt; ++i ) {
773 0 : GHVBoxSetPadding( GWidgetGetControl(gw,CID_ClockBox+i*TBlock_CIDOffset),0,0);
774 0 : GHVBoxSetPadding( GWidgetGetControl(gw,CID_HVBox+i*TBlock_CIDOffset),0,0);
775 0 : GHVBoxSetExpandableCol( GWidgetGetControl(gw,CID_HBox+i*TBlock_CIDOffset),gb_expandglue);
776 : }
777 0 : GGadgetSelectOneListItem( GWidgetGetControl(gw,CID_Type), 1);
778 0 : GWidgetToDesiredSize(gw);
779 : } else
780 0 : GDrawSetTransientFor(td.gw,(GWindow) -1);
781 0 : gw = td.gw;
782 :
783 0 : GGadgetSetEnabled( GWidgetGetControl(gw,CID_AllLayers), flags&tdf_enableback);
784 0 : GGadgetSetEnabled( GWidgetGetControl(gw,CID_DoGrid), flags&tdf_enableback);
785 0 : GGadgetSetEnabled( GWidgetGetControl(gw,CID_DoSimplePos), flags&tdf_enableback);
786 0 : GGadgetSetEnabled( GWidgetGetControl(gw,CID_DoKerns), flags&tdf_enablekerns);
787 0 : GGadgetSetVisible( GWidgetGetControl(gw,CID_Apply), flags&tdf_addapply);
788 0 : if ( !(flags&tdf_enableback) ) {
789 0 : GGadgetSetChecked( GWidgetGetControl(gw,CID_AllLayers), false );
790 0 : GGadgetSetChecked( GWidgetGetControl(gw,CID_DoGrid), false );
791 : }
792 0 : GGadgetSetChecked( GWidgetGetControl(gw,CID_DoKerns),
793 0 : !(flags&tdf_enablekerns)?false:(flags&tdf_defaultkerns)?true:false );
794 : /* Yes, this is set differently from the previous, that's intended */
795 0 : GGadgetSetChecked( GWidgetGetControl(gw,CID_DoSimplePos),
796 0 : !(flags&tdf_enableback)?false:(flags&tdf_enablekerns)?true:false );
797 0 : orig = GWidgetGetControl(gw,CID_Origin);
798 0 : GGadgetSetEnabled( orig, getorigin!=NULL );
799 0 : ti = GGadgetGetList(orig,&len);
800 0 : for ( i=0; i<len; ++i ) {
801 0 : ti[i]->disabled = !getorigin(data,&junk,i);
802 0 : if ( ti[i]->disabled && ti[i]->selected ) {
803 0 : ti[i]->selected = false;
804 0 : ti[0]->selected = true;
805 0 : GGadgetSetTitle(orig,ti[0]->text);
806 : }
807 : }
808 :
809 0 : if ( cvt!=cvt_none ) {
810 0 : int index = cvt == cvt_scale ? 4 :
811 0 : cvt == cvt_flip ? 5 :
812 0 : cvt == cvt_rotate ? 2 :
813 0 : cvt == cvt_skew ? 6 :
814 : /* 3d rot*/ 7 ;
815 0 : GGadget *firstoption = GWidgetGetControl(td.gw,CID_Type);
816 : GEvent dummy;
817 0 : GGadgetSelectOneListItem( firstoption, index );
818 0 : memset(&dummy,0,sizeof(dummy));
819 0 : dummy.type = et_controlevent; dummy.u.control.subtype = et_listselected;
820 0 : Trans_TypeChange( firstoption, &dummy );
821 : }
822 :
823 0 : for ( i=0; i<TCnt; ++i ) {
824 0 : int index = GGadgetGetFirstListSelectedItem(GWidgetGetControl(td.gw,CID_Type+i*TBlock_CIDOffset));
825 0 : if ( selcid[index]>0 ) {
826 0 : GGadget *tf = GWidgetGetControl(td.gw,selcid[index]+i*TBlock_CIDOffset);
827 0 : GWidgetIndicateFocusGadget(tf);
828 0 : GTextFieldSelect(tf,0,-1);
829 0 : break;
830 : }
831 : }
832 :
833 0 : GWidgetHidePalettes();
834 0 : GDrawSetVisible(gw,true);
835 0 : while ( !td.done )
836 0 : GDrawProcessOneEvent(NULL);
837 0 : GDrawSetVisible(gw,false);
838 0 : }
|