1 /*
2  * $Id: x11lgnd.c,v 1.10 2003/02/16 12:43:37 isizaka Exp isizaka $
3  *
4  * This file is part of "Ngraph for X11".
5  *
6  * Copyright (C) 2002, Satoshi ISHIZAKA. isizaka@msa.biglobe.ne.jp
7  *
8  * "Ngraph for X11" is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * "Ngraph for X11" is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  */
23 
24 /**
25  *
26  * $Log: x11lgnd.c,v $
27  * Revision 1.10  2003/02/16 12:43:37  isizaka
28  * for release 6.13.18
29  *
30  * Revision 1.9  2002/07/06 08:57:25  isizaka
31  * change to GPL.
32  *
33  * Revision 1.8  2001/07/14 17:44:50  isizaka
34  * for 6.03.14
35  *
36  * Revision 1.7  2001/03/23 12:17:43  isizaka
37  * for 6.3.13
38  *
39  * Revision 1.6  1999/07/25 11:28:13  isizaka
40  * for release 6.03.04
41  *
42  * Revision 1.5  1999/05/08 13:31:30  isizaka
43  * for release 6.03.02
44  *
45  * Revision 1.4  1999/04/15 12:14:26  isizaka
46  * for release 6.03.01
47  *
48  * Revision 1.3  1999/04/11 06:09:20  isizaka
49  * *** empty log message ***
50  *
51  * Revision 1.2  1999/03/20 12:32:54  isizaka
52  * minor change
53  *
54  * Revision 1.1  1999/03/17 13:29:01  isizaka
55  * Initial revision
56  *
57  *
58  **/
59 
60 #include <Xm/XmAll.h>
61 #include <X11/keysym.h>
62 #include <stdlib.h>
63 #include <stdio.h>
64 #include <unistd.h>
65 #include <math.h>
66 
67 #include "motif12.h"
68 
69 #include "ngraph.h"
70 #include "object.h"
71 #include "jnstring.h"
72 #include "nstring.h"
73 #include "mathfn.h"
74 
75 #include "x11gui.h"
76 #include "x11dialg.h"
77 #include "x11menu.h"
78 #include "ox11menu.h"
79 #include "x11file.h"
80 #include "x11view.h"
81 #include "x11lgnd.h"
82 #include "x11commn.h"
83 
84 char *legendlist[LEGENDNUM]=
85 {"line","curve","polygon","rectangle","arc","mark","text"};
86 
LegendLineCB(struct objlist * obj,int id)87 char *LegendLineCB(struct objlist *obj,int id)
88 {
89   struct narray *array;
90   int num,*data;
91   char *s;
92 
93   if ((s=(char *)memalloc(128))==NULL) return NULL;
94   getobj(obj,"points",id,0,NULL,&array);
95   num=arraynum(array);
96   data=(int *)arraydata(array);
97   if (num<2) sprintf(s,"%-5d",id);
98   else sprintf(s,"%-5d (%d,%d)-",id,data[0],data[1]);
99   return s;
100 }
101 
LegendRectCB(struct objlist * obj,int id)102 char *LegendRectCB(struct objlist *obj,int id)
103 {
104   int x1,y1;
105   char *s;
106 
107   if ((s=(char *)memalloc(128))==NULL) return NULL;
108   getobj(obj,"x1",id,0,NULL,&x1);
109   getobj(obj,"y1",id,0,NULL,&y1);
110   sprintf(s,"%-5d x1:%d y1:%d",id,x1,y1);
111   return s;
112 }
113 
LegendArcCB(struct objlist * obj,int id)114 char *LegendArcCB(struct objlist *obj,int id)
115 {
116   int x1,y1;
117   char *s;
118 
119   if ((s=(char *)memalloc(128))==NULL) return NULL;
120   getobj(obj,"x",id,0,NULL,&x1);
121   getobj(obj,"y",id,0,NULL,&y1);
122   sprintf(s,"%-5d x:%d y:%d",id,x1,y1);
123   return s;
124 }
125 
LegendTextCB(struct objlist * obj,int id)126 char *LegendTextCB(struct objlist *obj,int id)
127 {
128   char *text;
129   char *s;
130 
131   if ((s=(char *)memalloc(128))==NULL) return NULL;
132   getobj(obj,"text",id,0,NULL,&text);
133   sprintf(s,"%-5d",id);
134   if (text!=NULL) {
135     strncat(s, text, 64);
136 #ifdef JAPANESE
137 /* SJIS ---> EUC */
138     njms2euc(s);
139 #endif
140   }
141   return s;
142 }
143 
LegendCurveDialogSetupItem(Widget w,struct LegendCurveDialog * d,int id)144 void LegendCurveDialogSetupItem(Widget w,struct LegendCurveDialog *d,int id)
145 {
146   SetTextFromObjField(w,"*points",d->Obj,id,"points");
147   SetStyleFromObjField(w,"*style",d->Obj,id,"style");
148   SetComboList(w,"*width",cblinewidth,CBLINEWIDTH);
149   SetTextFromObjField(GetComboBoxText(w,"*width"),NULL,d->Obj,id,"width");
150   SetComboListFromObjField(GetComboBoxList(w,"*width"),NULL,d->Obj,id,"width");
151   SetListFromObjField(w,"*join",d->Obj,id,"join");
152   SetTextFromObjField(w,"*miter",d->Obj,id,"miter_limit");
153   getobj(d->Obj,"R",id,0,NULL,&d->R);
154   getobj(d->Obj,"G",id,0,NULL,&d->G);
155   getobj(d->Obj,"B",id,0,NULL,&d->B);
156   XtVaSetValues(XtNameToWidget(w,"*col"),XmNbackground,RGB(d->R,d->G,d->B),NULL);
157   SetListFromObjField(w,"*interpolation",d->Obj,id,"interpolation");
158 }
159 
LegendCurveDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)160 void LegendCurveDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)
161 {
162   struct LegendCurveDialog *d;
163 
164   d=(struct LegendCurveDialog *)client_data;
165   d->ret=IDDELETE;
166 }
167 
LegendCurveDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)168 void LegendCurveDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)
169 {
170   struct LegendCurveDialog *d;
171   int sel;
172 
173   d=(struct LegendCurveDialog *)client_data;
174   if ((sel=CopyClick(d->widget,d->Obj,d->Id,LegendLineCB))!=-1)
175     LegendCurveDialogSetupItem(d->widget,d,sel);
176 }
177 
LegendCurveDialogColor(Widget w,XtPointer client_data,XtPointer call_data)178 void LegendCurveDialogColor(Widget w,XtPointer client_data,XtPointer call_data)
179 {
180   struct LegendCurveDialog *d;
181 
182   d=(struct LegendCurveDialog *)client_data;
183   GetColor(TopLevel,&d->R,&d->G,&d->B);
184   XtVaSetValues(w,XmNbackground,RGB(d->R,d->G,d->B),NULL);
185 }
186 
LegendCurveDialogSetup(Widget w,void * data,int makewidget)187 void LegendCurveDialogSetup(Widget w,void *data,int makewidget)
188 {
189   Arg al[20];
190   Cardinal ac;
191   Widget rc,rc2,button;
192   struct LegendCurveDialog *d;
193   char title[30];
194   XmString xs;
195 
196   d=(struct LegendCurveDialog *)data;
197   sprintf(title,"Legend curve %d",d->Id);
198   xs=XmStringCreateLocalized(title);
199   XtVaSetValues(w,XmNdialogTitle,xs,NULL);
200   XmStringFree(xs);
201   if (makewidget) {
202   ac=0;
203   XtManageChild(button=XmCreatePushButton(w,"Delete",al,ac));
204   XtAddCallback(button,XmNdisarmCallback,LegendCurveDialogDelete,d);
205   ac=0;
206   XtManageChild(button=XmCreatePushButton(w,"Copy",al,ac));
207   XtAddCallback(button,XmNdisarmCallback,LegendCurveDialogCopy,d);
208 
209   ac=0;
210   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
211   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
212 
213   ac=0;
214   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
215   XtManageChild(rc2=XmCreateRowColumn(rc,"pointsrc",al,ac));
216   ac=0;
217   XtManageChild(XmCreateLabel(rc2,"Points",al,ac));
218   ac=0;
219   XtManageChild(XmCreateTextField(rc2,"points",al,ac));
220 
221   ac=0;
222   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
223   XtManageChild(rc2=XmCreateRowColumn(rc,"stylerc",al,ac));
224   ac=0;
225   XtManageChild(XmCreateLabel(rc2,"Style",al,ac));
226   ac=0;
227   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
228   XtManageChild(XmCreateComboBox(rc2,"style",al,ac));
229   ac=0;
230   XtManageChild(XmCreateLabel(rc2,"Interpolation",al,ac));
231   ac=0;
232   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
233   XtManageChild(XmCreateComboBox(rc2,"interpolation",al,ac));
234 
235   ac=0;
236   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
237   XtManageChild(rc2=XmCreateRowColumn(rc,"widthrc",al,ac));
238   ac=0;
239   XtManageChild(XmCreateLabel(rc2,"Width",al,ac));
240   ac=0;
241   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
242   XtManageChild(XmCreateComboBox(rc2,"width",al,ac));
243   ac=0;
244   XtManageChild(XmCreateLabel(rc2,"Miter",al,ac));
245   ac=0;
246   XtManageChild(XmCreateTextField(rc2,"miter",al,ac));
247   ac=0;
248   XtManageChild(XmCreateLabel(rc2,"Join",al,ac));
249   ac=0;
250   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
251   XtManageChild(XmCreateComboBox(rc2,"join",al,ac));
252 
253   ac=0;
254   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
255   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
256   ac=0;
257   XtManageChild(XmCreateLabel(rc2,"Color",al,ac));
258   ac=0;
259   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
260   XtAddCallback(button,XmNdisarmCallback,LegendCurveDialogColor,d);
261   }
262   LegendCurveDialogSetupItem(w,d,d->Id);
263 }
264 
LegendCurveDialogClose(Widget w,void * data)265 void LegendCurveDialogClose(Widget w,void *data)
266 {
267   struct LegendCurveDialog *d;
268   int ret;
269 
270   d=(struct LegendCurveDialog *)data;
271   if (d->ret!=IDOK) return;
272   ret=d->ret;
273   d->ret=IDLOOP;
274   if (SetObjFieldFromText(w,"*points",d->Obj,d->Id,"points")) return;
275   if (SetObjFieldFromStyle(w,"*style",d->Obj,d->Id,"style")) return;
276   if (SetObjFieldFromText(GetComboBoxText(w,"*width"),NULL,
277       d->Obj,d->Id,"width")) return;
278   if (SetObjFieldFromList(w,"*join",d->Obj,d->Id,"join")) return;
279   if (SetObjFieldFromText(w,"*miter",d->Obj,d->Id,"miter_limit")) return;
280   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
281   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
282   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
283   if (SetObjFieldFromList(w,"*interpolation",
284       d->Obj,d->Id,"interpolation")) return;
285   d->ret=ret;
286 }
287 
LegendCurveDialog(struct LegendCurveDialog * data,struct objlist * obj,int id)288 void LegendCurveDialog(struct LegendCurveDialog *data,
289                        struct objlist *obj,int id)
290 {
291   data->SetupWindow=LegendCurveDialogSetup;
292   data->CloseWindow=LegendCurveDialogClose;
293   data->Obj=obj;
294   data->Id=id;
295 }
296 
LegendPolyDialogSetupItem(Widget w,struct LegendPolyDialog * d,int id)297 void LegendPolyDialogSetupItem(Widget w,struct LegendPolyDialog *d,int id)
298 {
299   SetTextFromObjField(w,"*points",d->Obj,id,"points");
300   SetStyleFromObjField(w,"*style",d->Obj,id,"style");
301   SetComboList(w,"*width",cblinewidth,CBLINEWIDTH);
302   SetTextFromObjField(GetComboBoxText(w,"*width"),NULL,d->Obj,id,"width");
303   SetComboListFromObjField(GetComboBoxList(w,"*width"),NULL,d->Obj,id,"width");
304   SetListFromObjField(w,"*join",d->Obj,id,"join");
305   SetTextFromObjField(w,"*miter",d->Obj,id,"miter_limit");
306   getobj(d->Obj,"R",id,0,NULL,&d->R);
307   getobj(d->Obj,"G",id,0,NULL,&d->G);
308   getobj(d->Obj,"B",id,0,NULL,&d->B);
309   XtVaSetValues(XtNameToWidget(w,"*col"),XmNbackground,RGB(d->R,d->G,d->B),NULL);
310   SetListFromObjField(w,"*fill",d->Obj,id,"fill");
311 }
312 
LegendPolyDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)313 void LegendPolyDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)
314 {
315   struct LegendPolyDialog *d;
316 
317   d=(struct LegendPolyDialog *)client_data;
318   d->ret=IDDELETE;
319 }
320 
LegendPolyDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)321 void LegendPolyDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)
322 {
323   struct LegendPolyDialog *d;
324   int sel;
325 
326   d=(struct LegendPolyDialog *)client_data;
327   if ((sel=CopyClick(d->widget,d->Obj,d->Id,LegendLineCB))!=-1)
328     LegendPolyDialogSetupItem(d->widget,d,sel);
329 }
330 
LegendPolyDialogColor(Widget w,XtPointer client_data,XtPointer call_data)331 void LegendPolyDialogColor(Widget w,XtPointer client_data,XtPointer call_data)
332 {
333   struct LegendPolyDialog *d;
334 
335   d=(struct LegendPolyDialog *)client_data;
336   GetColor(TopLevel,&d->R,&d->G,&d->B);
337   XtVaSetValues(w,XmNbackground,RGB(d->R,d->G,d->B),NULL);
338 }
339 
LegendPolyDialogSetup(Widget w,void * data,int makewidget)340 void LegendPolyDialogSetup(Widget w,void *data,int makewidget)
341 {
342   Arg al[20];
343   Cardinal ac;
344   Widget rc,rc2,button;
345   struct LegendPolyDialog *d;
346   char title[30];
347   XmString xs;
348 
349   d=(struct LegendPolyDialog *)data;
350   sprintf(title,"Legend polygon %d",d->Id);
351   xs=XmStringCreateLocalized(title);
352   XtVaSetValues(w,XmNdialogTitle,xs,NULL);
353   XmStringFree(xs);
354   if (makewidget) {
355   ac=0;
356   XtManageChild(button=XmCreatePushButton(w,"Delete",al,ac));
357   XtAddCallback(button,XmNdisarmCallback,LegendPolyDialogDelete,d);
358   ac=0;
359   XtManageChild(button=XmCreatePushButton(w,"Copy",al,ac));
360   XtAddCallback(button,XmNdisarmCallback,LegendPolyDialogCopy,d);
361 
362   ac=0;
363   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
364   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
365 
366   ac=0;
367   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
368   XtManageChild(rc2=XmCreateRowColumn(rc,"pointsrc",al,ac));
369   ac=0;
370   XtManageChild(XmCreateLabel(rc2,"Points",al,ac));
371   ac=0;
372   XtManageChild(XmCreateTextField(rc2,"points",al,ac));
373 
374   ac=0;
375   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
376   XtManageChild(rc2=XmCreateRowColumn(rc,"stylerc",al,ac));
377   ac=0;
378   XtManageChild(XmCreateLabel(rc2,"Style",al,ac));
379   ac=0;
380   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
381   XtManageChild(XmCreateComboBox(rc2,"style",al,ac));
382 
383   ac=0;
384   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
385   XtManageChild(rc2=XmCreateRowColumn(rc,"widthrc",al,ac));
386   ac=0;
387   XtManageChild(XmCreateLabel(rc2,"Width",al,ac));
388   ac=0;
389   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
390   XtManageChild(XmCreateComboBox(rc2,"width",al,ac));
391   ac=0;
392   XtManageChild(XmCreateLabel(rc2,"Miter",al,ac));
393   ac=0;
394   XtManageChild(XmCreateTextField(rc2,"miter",al,ac));
395   ac=0;
396   XtManageChild(XmCreateLabel(rc2,"Join",al,ac));
397   ac=0;
398   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
399   XtManageChild(XmCreateComboBox(rc2,"join",al,ac));
400   ac=0;
401   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
402   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
403   ac=0;
404   XtManageChild(XmCreateLabel(rc2,"Color",al,ac));
405   ac=0;
406   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
407   XtAddCallback(button,XmNdisarmCallback,LegendPolyDialogColor,d);
408   ac=0;
409   XtManageChild(XmCreateLabel(rc2,"Fill",al,ac));
410   ac=0;
411   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
412   XtManageChild(XmCreateComboBox(rc2,"fill",al,ac));
413   }
414   LegendPolyDialogSetupItem(w,d,d->Id);
415 }
416 
LegendPolyDialogClose(Widget w,void * data)417 void LegendPolyDialogClose(Widget w,void *data)
418 {
419   struct LegendPolyDialog *d;
420   int ret;
421 
422   d=(struct LegendPolyDialog *)data;
423   if (d->ret!=IDOK) return;
424   ret=d->ret;
425   d->ret=IDLOOP;
426   if (SetObjFieldFromText(w,"*points",d->Obj,d->Id,"points")) return;
427   if (SetObjFieldFromStyle(w,"*style",d->Obj,d->Id,"style")) return;
428   if (SetObjFieldFromText(GetComboBoxText(w,"*width"),NULL,
429       d->Obj,d->Id,"width")) return;
430   if (SetObjFieldFromList(w,"*join",d->Obj,d->Id,"join")) return;
431   if (SetObjFieldFromText(w,"*miter",d->Obj,d->Id,"miter_limit")) return;
432   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
433   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
434   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
435   if (SetObjFieldFromList(w,"*fill",d->Obj,d->Id,"fill")) return;
436   d->ret=ret;
437 }
438 
LegendPolyDialog(struct LegendPolyDialog * data,struct objlist * obj,int id)439 void LegendPolyDialog(struct LegendPolyDialog *data,struct objlist *obj,int id)
440 {
441   data->SetupWindow=LegendPolyDialogSetup;
442   data->CloseWindow=LegendPolyDialogClose;
443   data->Obj=obj;
444   data->Id=id;
445 }
446 
447 
LegendArrowDialogSetupItem(Widget w,struct LegendArrowDialog * d,int id)448 void LegendArrowDialogSetupItem(Widget w,struct LegendArrowDialog *d,int id)
449 {
450   int len;
451 
452   SetTextFromObjField(w,"*points",d->Obj,id,"points");
453   SetStyleFromObjField(w,"*style",d->Obj,id,"style");
454   SetComboList(w,"*width",cblinewidth,CBLINEWIDTH);
455   SetTextFromObjField(GetComboBoxText(w,"*width"),NULL,d->Obj,id,"width");
456   SetComboListFromObjField(GetComboBoxList(w,"*width"),NULL,d->Obj,id,"width");
457   SetListFromObjField(w,"*join",d->Obj,id,"join");
458   SetTextFromObjField(w,"*miter",d->Obj,id,"miter_limit");
459   SetListFromObjField(w,"*arrow",d->Obj,id,"arrow");
460   getobj(d->Obj,"arrow_length",id,0,NULL,&len);
461   getobj(d->Obj,"arrow_width",id,0,NULL,&(d->wid));
462   d->wid=(d->wid/100)*100;
463   d->ang=atan(0.5*d->wid/len)*2*180/MPI;
464   if (d->ang<10) d->ang=10;
465   else if (d->ang>170) d->ang=170;
466   XtVaSetValues(XtNameToWidget(w,"*sca"),XmNvalue,d->ang,NULL);
467   XtVaSetValues(XtNameToWidget(w,"*scw"),XmNvalue,d->wid/100,NULL);
468   getobj(d->Obj,"R",id,0,NULL,&d->R);
469   getobj(d->Obj,"G",id,0,NULL,&d->G);
470   getobj(d->Obj,"B",id,0,NULL,&d->B);
471   XtVaSetValues(XtNameToWidget(w,"*col"),XmNbackground,RGB(d->R,d->G,d->B),
472                 NULL);
473 }
474 
LegendArrowDialogPaint(Widget w,XtPointer client_data,XtPointer call_data)475 void LegendArrowDialogPaint(Widget w,XtPointer client_data,XtPointer call_data)
476 {
477   struct LegendArrowDialog *d;
478   XmDrawingAreaCallbackStruct *dd;
479   Window root,win;
480   Display *disp;
481   int x,y,lw,len;
482   unsigned int ww,hh,border,depth;
483   GC gc;
484   XPoint points[3];
485 
486   d=(struct LegendArrowDialog *)client_data;
487   dd=(XmDrawingAreaCallbackStruct *)call_data;
488   disp=XtDisplay(w);
489   win=XtWindow(w);
490   gc=XCreateGC(disp,win,0,0);
491   XGetGeometry(disp,win,&root,&x,&y,&ww,&hh,&border,&depth);
492   XSetForeground(disp,gc,WhitePixel(XtDisplay(TopLevel),0));
493   x=y=0;
494   XFillRectangle(disp,win,gc,x,y,ww,hh);
495   XSetForeground(disp,gc,BlackPixel(XtDisplay(TopLevel),0));
496   if (ww/20<hh/20) lw=ww/20;
497   else lw=hh/20;
498   len=d->wid*0.5/tan(d->ang*0.5*MPI/180);
499   XFillRectangle(disp,win,gc,x+nround(lw*(len/10000.0)),y+(hh-lw)/2,ww,lw);
500   points[0].x=x;
501   points[0].y=y+hh/2;
502   points[1].x=x+nround(lw*(len/10000.0));
503   points[1].y=y+hh/2-nround(lw*(d->wid/20000.0));
504   points[2].x=x+nround(lw*(len/10000.0));
505   points[2].y=y+hh/2+nround(lw*(d->wid/20000.0));
506   XFillPolygon(disp,win,gc,points,3,Complex,CoordModeOrigin);
507   XFreeGC(disp,gc);
508 }
509 
LegendArrowDialogScaleW(Widget w,XtPointer client_data,XtPointer call_data)510 void LegendArrowDialogScaleW(Widget w,XtPointer client_data,XtPointer call_data)
511 {
512   struct LegendArrowDialog *d;
513   XmScaleCallbackStruct *dd;
514   Widget win;
515 
516   d=(struct LegendArrowDialog *)client_data;
517   dd=(XmScaleCallbackStruct *)call_data;
518   d->wid=dd->value*100;
519   win=XtNameToWidget(d->widget,"*win");
520   XClearArea(XtDisplay(win),XtWindow(win),0,0,0,0,TRUE);
521 }
522 
LegendArrowDialogScaleL(Widget w,XtPointer client_data,XtPointer call_data)523 void LegendArrowDialogScaleL(Widget w,XtPointer client_data,XtPointer call_data)
524 {
525   struct LegendArrowDialog *d;
526   XmScaleCallbackStruct *dd;
527   Widget win;
528   char buf[30];
529   XmString xs;
530 
531   d=(struct LegendArrowDialog *)client_data;
532   dd=(XmScaleCallbackStruct *)call_data;
533   d->ang=dd->value;
534   win=XtNameToWidget(d->widget,"*win");
535   XClearArea(XtDisplay(win),XtWindow(win),0,0,0,0,TRUE);
536 }
537 
LegendArrowDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)538 void LegendArrowDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)
539 {
540   struct LegendArrowDialog *d;
541 
542   d=(struct LegendArrowDialog *)client_data;
543   d->ret=IDDELETE;
544 }
545 
LegendArrowDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)546 void LegendArrowDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)
547 {
548   struct LegendArrowDialog *d;
549   int sel;
550 
551   d=(struct LegendArrowDialog *)client_data;
552   if ((sel=CopyClick(d->widget,d->Obj,d->Id,LegendLineCB))!=-1)
553     LegendArrowDialogSetupItem(d->widget,d,sel);
554 }
555 
LegendArrowDialogColor(Widget w,XtPointer client_data,XtPointer call_data)556 void LegendArrowDialogColor(Widget w,XtPointer client_data,XtPointer call_data)
557 {
558   struct LegendArrowDialog *d;
559 
560   d=(struct LegendArrowDialog *)client_data;
561   GetColor(TopLevel,&d->R,&d->G,&d->B);
562   XtVaSetValues(w,XmNbackground,RGB(d->R,d->G,d->B),NULL);
563 }
564 
LegendArrowDialogSetup(Widget w,void * data,int makewidget)565 void LegendArrowDialogSetup(Widget w,void *data,int makewidget)
566 {
567   Arg al[20];
568   Cardinal ac;
569   Widget rc0,rc,rc2,button,da,sc;
570   struct LegendArrowDialog *d;
571   char title[30];
572   XmString xs;
573 
574   d=(struct LegendArrowDialog *)data;
575   sprintf(title,"Legend line %d",d->Id);
576   xs=XmStringCreateLocalized(title);
577   XtVaSetValues(w,XmNdialogTitle,xs,NULL);
578   XmStringFree(xs);
579   if (makewidget) {
580   ac=0;
581   XtManageChild(button=XmCreatePushButton(w,"Delete",al,ac));
582   XtAddCallback(button,XmNdisarmCallback,LegendArrowDialogDelete,d);
583   ac=0;
584   XtManageChild(button=XmCreatePushButton(w,"Copy",al,ac));
585   XtAddCallback(button,XmNdisarmCallback,LegendArrowDialogCopy,d);
586 
587   ac=0;
588   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
589   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
590 
591   ac=0;
592   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
593   XtManageChild(rc2=XmCreateRowColumn(rc,"pointsrc",al,ac));
594   ac=0;
595   XtManageChild(XmCreateLabel(rc2,"Points",al,ac));
596   ac=0;
597   XtManageChild(XmCreateTextField(rc2,"points",al,ac));
598 
599   ac=0;
600   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
601   XtManageChild(rc0=XmCreateRowColumn(rc,"rc2",al,ac));
602 
603   ac=0;
604   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
605   XtManageChild(rc=XmCreateRowColumn(rc0,"rc3",al,ac));
606 
607   ac=0;
608   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
609   XtManageChild(rc2=XmCreateRowColumn(rc,"stylerc",al,ac));
610   ac=0;
611   XtManageChild(XmCreateLabel(rc2,"Style",al,ac));
612   ac=0;
613   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
614   XtManageChild(XmCreateComboBox(rc2,"style",al,ac));
615 
616   ac=0;
617   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
618   XtManageChild(rc2=XmCreateRowColumn(rc,"widthrc",al,ac));
619   ac=0;
620   XtManageChild(XmCreateLabel(rc2,"Width",al,ac));
621   ac=0;
622   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
623   XtManageChild(XmCreateComboBox(rc2,"width",al,ac));
624 
625   ac=0;
626   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
627   XtManageChild(rc2=XmCreateRowColumn(rc,"miterrc",al,ac));
628   ac=0;
629   XtManageChild(XmCreateLabel(rc2,"Miter",al,ac));
630   ac=0;
631   XtManageChild(XmCreateTextField(rc2,"miter",al,ac));
632 
633   ac=0;
634   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
635   XtManageChild(rc2=XmCreateRowColumn(rc,"joinrc",al,ac));
636   ac=0;
637   XtManageChild(XmCreateLabel(rc2,"Join",al,ac));
638   ac=0;
639   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
640   XtManageChild(XmCreateComboBox(rc2,"join",al,ac));
641 
642   ac=0;
643   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
644   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
645   ac=0;
646   XtManageChild(XmCreateLabel(rc2,"Color",al,ac));
647   ac=0;
648   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
649   XtAddCallback(button,XmNdisarmCallback,LegendArrowDialogColor,d);
650 
651   ac=0;
652   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
653   XtManageChild(rc2=XmCreateRowColumn(rc,"arrowrc",al,ac));
654   ac=0;
655   XtManageChild(XmCreateLabel(rc2,"Arrow",al,ac));
656   ac=0;
657   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
658   XtManageChild(XmCreateComboBox(rc2,"arrow",al,ac));
659 
660   ac=0;
661   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
662   XtManageChild(rc=XmCreateRowColumn(rc0,"winrc",al,ac));
663   ac=0;
664   XtSetArg(al[ac],XmNminimum,10); ac++;
665   XtSetArg(al[ac],XmNmaximum,170); ac++;
666   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
667   XtSetArg(al[ac],XmNshowValue,XmNEAR_SLIDER); ac++;
668   XtManageChild(sc=XmCreateScale(rc,"sca",al,ac));
669   XtAddCallback(sc,XmNvalueChangedCallback,LegendArrowDialogScaleL,d);
670   XtAddCallback(sc,XmNdragCallback,LegendArrowDialogScaleL,d);
671   ac=0;
672   XtSetArg(al[ac],XmNresizeWidth,FALSE); ac++;
673   XtSetArg(al[ac],XmNresizeHeight,FALSE); ac++;
674   XtManageChild(da=XmCreateDrawnButton(rc,"win",al,ac));
675   XtAddCallback(da,XmNexposeCallback,LegendArrowDialogPaint,d);
676   ac=0;
677   XtSetArg(al[ac],XmNminimum,100); ac++;
678   XtSetArg(al[ac],XmNmaximum,2000); ac++;
679   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
680   XtSetArg(al[ac],XmNshowValue,XmNEAR_SLIDER); ac++;
681   XtManageChild(sc=XmCreateScale(rc,"scw",al,ac));
682   XtAddCallback(sc,XmNvalueChangedCallback,LegendArrowDialogScaleW,d);
683   XtAddCallback(sc,XmNdragCallback,LegendArrowDialogScaleW,d);
684   }
685   LegendArrowDialogSetupItem(w,d,d->Id);
686 }
687 
LegendArrowDialogClose(Widget w,void * data)688 void LegendArrowDialogClose(Widget w,void *data)
689 {
690   struct LegendArrowDialog *d;
691   int ret,len;
692 
693   d=(struct LegendArrowDialog *)data;
694   if (d->ret!=IDOK) return;
695   ret=d->ret;
696   d->ret=IDLOOP;
697   if (SetObjFieldFromText(w,"*points",d->Obj,d->Id,"points")) return;
698   if (SetObjFieldFromStyle(w,"*style",d->Obj,d->Id,"style")) return;
699   if (SetObjFieldFromText(GetComboBoxText(w,"*width"),NULL,
700                           d->Obj,d->Id,"width")) return;
701   if (SetObjFieldFromList(w,"*join",d->Obj,d->Id,"join")) return;
702   if (SetObjFieldFromText(w,"*miter",d->Obj,d->Id,"miter_limit")) return;
703   if (SetObjFieldFromList(w,"*arrow",d->Obj,d->Id,"arrow")) return;
704   len=d->wid*0.5/tan(d->ang*0.5*MPI/180);
705   if (putobj(d->Obj,"arrow_length",d->Id,&len)==-1) return;
706   if (putobj(d->Obj,"arrow_width",d->Id,&(d->wid))==-1) return;
707   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
708   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
709   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
710   d->ret=ret;
711 }
712 
LegendArrowDialog(struct LegendArrowDialog * data,struct objlist * obj,int id)713 void LegendArrowDialog(struct LegendArrowDialog *data,
714                        struct objlist *obj,int id)
715 {
716   data->SetupWindow=LegendArrowDialogSetup;
717   data->CloseWindow=LegendArrowDialogClose;
718   data->Obj=obj;
719   data->Id=id;
720 }
721 
LegendRectDialogSetupItem(Widget w,struct LegendRectDialog * d,int id)722 void LegendRectDialogSetupItem(Widget w,struct LegendRectDialog *d,int id)
723 {
724   SetTextFromObjField(w,"*x1",d->Obj,id,"x1");
725   SetTextFromObjField(w,"*y1",d->Obj,id,"y1");
726   SetTextFromObjField(w,"*x2",d->Obj,id,"x2");
727   SetTextFromObjField(w,"*y2",d->Obj,id,"y2");
728   SetStyleFromObjField(w,"*style",d->Obj,id,"style");
729   SetComboList(w,"*width",cblinewidth,CBLINEWIDTH);
730   SetTextFromObjField(GetComboBoxText(w,"*width"),NULL,d->Obj,id,"width");
731   SetComboListFromObjField(GetComboBoxList(w,"*width"),NULL,d->Obj,id,"width");
732   getobj(d->Obj,"R",id,0,NULL,&d->R);
733   getobj(d->Obj,"G",id,0,NULL,&d->G);
734   getobj(d->Obj,"B",id,0,NULL,&d->B);
735   XtVaSetValues(XtNameToWidget(w,"*col"),XmNbackground,RGB(d->R,d->G,d->B),NULL);
736   SetToggleFromObjField(w,"*Fill",d->Obj,id,"fill");
737   getobj(d->Obj,"R2",id,0,NULL,&d->R2);
738   getobj(d->Obj,"G2",id,0,NULL,&d->G2);
739   getobj(d->Obj,"B2",id,0,NULL,&d->B2);
740   XtVaSetValues(XtNameToWidget(w,"*col2"),XmNbackground,RGB(d->R2,d->G2,d->B2),NULL);
741   SetToggleFromObjField(w,"*Frame",d->Obj,id,"frame");
742 }
743 
LegendRectDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)744 void LegendRectDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)
745 {
746   struct LegendRectDialog *d;
747 
748   d=(struct LegendRectDialog *)client_data;
749   d->ret=IDDELETE;
750 }
751 
LegendRectDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)752 void LegendRectDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)
753 {
754   struct LegendRectDialog *d;
755   int sel;
756 
757   d=(struct LegendRectDialog *)client_data;
758   if ((sel=CopyClick(d->widget,d->Obj,d->Id,LegendRectCB))!=-1)
759     LegendRectDialogSetupItem(d->widget,d,sel);
760 }
761 
LegendRectDialogColor(Widget w,XtPointer client_data,XtPointer call_data)762 void LegendRectDialogColor(Widget w,XtPointer client_data,XtPointer call_data)
763 {
764   struct LegendRectDialog *d;
765 
766   d=(struct LegendRectDialog *)client_data;
767   GetColor(TopLevel,&d->R,&d->G,&d->B);
768   XtVaSetValues(w,XmNbackground,RGB(d->R,d->G,d->B),NULL);
769 }
770 
LegendRectDialogColor2(Widget w,XtPointer client_data,XtPointer call_data)771 void LegendRectDialogColor2(Widget w,XtPointer client_data,XtPointer call_data)
772 {
773   struct LegendRectDialog *d;
774 
775   d=(struct LegendRectDialog *)client_data;
776   GetColor(TopLevel,&d->R2,&d->G2,&d->B2);
777   XtVaSetValues(w,XmNbackground,RGB(d->R2,d->G2,d->B2),NULL);
778 }
779 
LegendRectDialogSetup(Widget w,void * data,int makewidget)780 void LegendRectDialogSetup(Widget w,void *data,int makewidget)
781 {
782   Arg al[20];
783   Cardinal ac;
784   Widget rc,rc2,button;
785   struct LegendRectDialog *d;
786   char title[30];
787   XmString xs;
788 
789   d=(struct LegendRectDialog *)data;
790   sprintf(title,"Legend rectangle %d",d->Id);
791   xs=XmStringCreateLocalized(title);
792   XtVaSetValues(w,XmNdialogTitle,xs,NULL);
793   XmStringFree(xs);
794   if (makewidget) {
795   ac=0;
796   XtManageChild(button=XmCreatePushButton(w,"Delete",al,ac));
797   XtAddCallback(button,XmNdisarmCallback,LegendRectDialogDelete,d);
798   ac=0;
799   XtManageChild(button=XmCreatePushButton(w,"Copy",al,ac));
800   XtAddCallback(button,XmNdisarmCallback,LegendRectDialogCopy,d);
801 
802   ac=0;
803   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
804   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
805 
806   ac=0;
807   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
808   XtManageChild(rc2=XmCreateRowColumn(rc,"pointsrc",al,ac));
809   ac=0;
810   XtManageChild(XmCreateLabel(rc2,"X1",al,ac));
811   ac=0;
812   XtManageChild(XmCreateTextField(rc2,"x1",al,ac));
813   ac=0;
814   XtManageChild(XmCreateLabel(rc2,"Y1",al,ac));
815   ac=0;
816   XtManageChild(XmCreateTextField(rc2,"y1",al,ac));
817   ac=0;
818   XtManageChild(XmCreateLabel(rc2,"X2",al,ac));
819   ac=0;
820   XtManageChild(XmCreateTextField(rc2,"x2",al,ac));
821   ac=0;
822   XtManageChild(XmCreateLabel(rc2,"Y2",al,ac));
823   ac=0;
824   XtManageChild(XmCreateTextField(rc2,"y2",al,ac));
825 
826   ac=0;
827   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
828   XtManageChild(rc2=XmCreateRowColumn(rc,"stylerc",al,ac));
829   ac=0;
830   XtManageChild(XmCreateLabel(rc2,"Style",al,ac));
831   ac=0;
832   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
833   XtManageChild(XmCreateComboBox(rc2,"style",al,ac));
834   ac=0;
835   XtManageChild(XmCreateLabel(rc2,"Width",al,ac));
836   ac=0;
837   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
838   XtManageChild(XmCreateComboBox(rc2,"width",al,ac));
839 
840   ac=0;
841   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
842   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
843   ac=0;
844   XtManageChild(XmCreateLabel(rc2,"Color",al,ac));
845   ac=0;
846   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
847   XtAddCallback(button,XmNdisarmCallback,LegendRectDialogColor,d);
848   ac=0;
849   XtManageChild(XmCreateToggleButton(rc2,"Fill",al,ac));
850   ac=0;
851   XtManageChild(XmCreateLabel(rc2,"Color2",al,ac));
852   ac=0;
853   XtManageChild(button=XmCreateDrawnButton(rc2,"col2",al,ac));
854   XtAddCallback(button,XmNdisarmCallback,LegendRectDialogColor2,d);
855   ac=0;
856   XtManageChild(XmCreateToggleButton(rc2,"Frame",al,ac));
857   }
858   LegendRectDialogSetupItem(w,d,d->Id);
859 }
860 
LegendRectDialogClose(Widget w,void * data)861 void LegendRectDialogClose(Widget w,void *data)
862 {
863   struct LegendRectDialog *d;
864   int ret;
865 
866   d=(struct LegendRectDialog *)data;
867   if (d->ret!=IDOK) return;
868   ret=d->ret;
869   d->ret=IDLOOP;
870   if (SetObjFieldFromText(w,"*x1",d->Obj,d->Id,"x1")) return;
871   if (SetObjFieldFromText(w,"*y1",d->Obj,d->Id,"y1")) return;
872   if (SetObjFieldFromText(w,"*x2",d->Obj,d->Id,"x2")) return;
873   if (SetObjFieldFromText(w,"*y2",d->Obj,d->Id,"y2")) return;
874   if (SetObjFieldFromStyle(w,"*style",d->Obj,d->Id,"style")) return;
875   if (SetObjFieldFromText(GetComboBoxText(w,"*width"),NULL,
876       d->Obj,d->Id,"width")) return;
877   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
878   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
879   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
880   if (SetObjFieldFromToggle(w,"*Fill",d->Obj,d->Id,"fill")) return;
881   if (putobj(d->Obj,"R2",d->Id,&(d->R2))==-1) return;
882   if (putobj(d->Obj,"G2",d->Id,&(d->G2))==-1) return;
883   if (putobj(d->Obj,"B2",d->Id,&(d->B2))==-1) return;
884   if (SetObjFieldFromToggle(w,"*Frame",d->Obj,d->Id,"frame")) return;
885   d->ret=ret;
886 }
887 
LegendRectDialog(struct LegendRectDialog * data,struct objlist * obj,int id)888 void LegendRectDialog(struct LegendRectDialog *data,
889                        struct objlist *obj,int id)
890 {
891   data->SetupWindow=LegendRectDialogSetup;
892   data->CloseWindow=LegendRectDialogClose;
893   data->Obj=obj;
894   data->Id=id;
895 }
896 
LegendArcDialogSetupItem(Widget w,struct LegendArcDialog * d,int id)897 void LegendArcDialogSetupItem(Widget w,struct LegendArcDialog *d,int id)
898 {
899   SetTextFromObjField(w,"*x",d->Obj,id,"x");
900   SetTextFromObjField(w,"*y",d->Obj,id,"y");
901   SetTextFromObjField(w,"*rx",d->Obj,id,"rx");
902   SetTextFromObjField(w,"*ry",d->Obj,id,"ry");
903   SetStyleFromObjField(w,"*style",d->Obj,id,"style");
904   SetComboList(w,"*width",cblinewidth,CBLINEWIDTH);
905   SetTextFromObjField(GetComboBoxText(w,"*width"),NULL,d->Obj,id,"width");
906   SetComboListFromObjField(GetComboBoxList(w,"*width"),NULL,d->Obj,id,"width");
907   SetTextFromObjField(w,"*angle1",d->Obj,id,"angle1");
908   SetTextFromObjField(w,"*angle2",d->Obj,id,"angle2");
909   SetToggleFromObjField(w,"*Pieslice",d->Obj,id,"pieslice");
910   getobj(d->Obj,"R",id,0,NULL,&d->R);
911   getobj(d->Obj,"G",id,0,NULL,&d->G);
912   getobj(d->Obj,"B",id,0,NULL,&d->B);
913   XtVaSetValues(XtNameToWidget(w,"*col"),XmNbackground,RGB(d->R,d->G,d->B),NULL);
914   SetToggleFromObjField(w,"*Fill",d->Obj,id,"fill");
915 }
916 
917 
LegendArcDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)918 void LegendArcDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)
919 {
920   struct LegendArcDialog *d;
921 
922   d=(struct LegendArcDialog *)client_data;
923   d->ret=IDDELETE;
924 }
925 
LegendArcDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)926 void LegendArcDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)
927 {
928   struct LegendArcDialog *d;
929   int sel;
930 
931   d=(struct LegendArcDialog *)client_data;
932   if ((sel=CopyClick(d->widget,d->Obj,d->Id,LegendArcCB))!=-1)
933     LegendArcDialogSetupItem(d->widget,d,sel);
934 }
935 
LegendArcDialogColor(Widget w,XtPointer client_data,XtPointer call_data)936 void LegendArcDialogColor(Widget w,XtPointer client_data,XtPointer call_data)
937 {
938   struct LegendArcDialog *d;
939 
940   d=(struct LegendArcDialog *)client_data;
941   GetColor(TopLevel,&d->R,&d->G,&d->B);
942   XtVaSetValues(w,XmNbackground,RGB(d->R,d->G,d->B),NULL);
943 }
944 
LegendArcDialogSetup(Widget w,void * data,int makewidget)945 void LegendArcDialogSetup(Widget w,void *data,int makewidget)
946 {
947   Arg al[20];
948   Cardinal ac;
949   Widget rc,rc2,button;
950   struct LegendArcDialog *d;
951   char title[30];
952   XmString xs;
953 
954   d=(struct LegendArcDialog *)data;
955   sprintf(title,"Legend arc %d",d->Id);
956   xs=XmStringCreateLocalized(title);
957   XtVaSetValues(w,XmNdialogTitle,xs,NULL);
958   XmStringFree(xs);
959   if (makewidget) {
960   ac=0;
961   XtManageChild(button=XmCreatePushButton(w,"Delete",al,ac));
962   XtAddCallback(button,XmNdisarmCallback,LegendArcDialogDelete,d);
963   ac=0;
964   XtManageChild(button=XmCreatePushButton(w,"Copy",al,ac));
965   XtAddCallback(button,XmNdisarmCallback,LegendArcDialogCopy,d);
966 
967   ac=0;
968   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
969   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
970 
971   ac=0;
972   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
973   XtManageChild(rc2=XmCreateRowColumn(rc,"pointsrc",al,ac));
974   ac=0;
975   XtManageChild(XmCreateLabel(rc2,"X",al,ac));
976   ac=0;
977   XtManageChild(XmCreateTextField(rc2,"x",al,ac));
978   ac=0;
979   XtManageChild(XmCreateLabel(rc2,"Y",al,ac));
980   ac=0;
981   XtManageChild(XmCreateTextField(rc2,"y",al,ac));
982   ac=0;
983   XtManageChild(XmCreateLabel(rc2,"RX",al,ac));
984   ac=0;
985   XtManageChild(XmCreateTextField(rc2,"rx",al,ac));
986   ac=0;
987   XtManageChild(XmCreateLabel(rc2,"RY",al,ac));
988   ac=0;
989   XtManageChild(XmCreateTextField(rc2,"ry",al,ac));
990 
991   ac=0;
992   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
993   XtManageChild(rc2=XmCreateRowColumn(rc,"anglerc",al,ac));
994   ac=0;
995   XtManageChild(XmCreateToggleButton(rc2,"Pieslice",al,ac));
996   ac=0;
997   XtManageChild(XmCreateLabel(rc2,"Angle1",al,ac));
998   ac=0;
999   XtManageChild(XmCreateTextField(rc2,"angle1",al,ac));
1000   ac=0;
1001   XtManageChild(XmCreateLabel(rc2,"Angle2",al,ac));
1002   ac=0;
1003   XtManageChild(XmCreateTextField(rc2,"angle2",al,ac));
1004 
1005   ac=0;
1006   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1007   XtManageChild(rc2=XmCreateRowColumn(rc,"stylerc",al,ac));
1008   ac=0;
1009   XtManageChild(XmCreateLabel(rc2,"Style",al,ac));
1010   ac=0;
1011   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1012   XtManageChild(XmCreateComboBox(rc2,"style",al,ac));
1013   ac=0;
1014   XtManageChild(XmCreateLabel(rc2,"Width",al,ac));
1015   ac=0;
1016   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1017   XtManageChild(XmCreateComboBox(rc2,"width",al,ac));
1018 
1019   ac=0;
1020   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1021   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
1022   ac=0;
1023   XtManageChild(XmCreateLabel(rc2,"Color",al,ac));
1024   ac=0;
1025   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
1026   XtAddCallback(button,XmNdisarmCallback,LegendArcDialogColor,d);
1027   ac=0;
1028   XtManageChild(XmCreateToggleButton(rc2,"Fill",al,ac));
1029   }
1030   LegendArcDialogSetupItem(w,d,d->Id);
1031 }
1032 
LegendArcDialogClose(Widget w,void * data)1033 void LegendArcDialogClose(Widget w,void *data)
1034 {
1035   struct LegendArcDialog *d;
1036   int ret;
1037 
1038   d=(struct LegendArcDialog *)data;
1039   if (d->ret!=IDOK) return;
1040   ret=d->ret;
1041   d->ret=IDLOOP;
1042   if (SetObjFieldFromText(w,"*x",d->Obj,d->Id,"x")) return;
1043   if (SetObjFieldFromText(w,"*y",d->Obj,d->Id,"y")) return;
1044   if (SetObjFieldFromText(w,"*rx",d->Obj,d->Id,"rx")) return;
1045   if (SetObjFieldFromText(w,"*ry",d->Obj,d->Id,"ry")) return;
1046   if (SetObjFieldFromStyle(w,"*style",d->Obj,d->Id,"style")) return;
1047   if (SetObjFieldFromText(GetComboBoxText(w,"*width"),NULL,
1048       d->Obj,d->Id,"width")) return;
1049   if (SetObjFieldFromText(w,"*angle1",d->Obj,d->Id,"angle1")) return;
1050   if (SetObjFieldFromText(w,"*angle2",d->Obj,d->Id,"angle2")) return;
1051   if (SetObjFieldFromToggle(w,"*Pieslice",d->Obj,d->Id,"pieslice")) return;
1052   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
1053   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
1054   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
1055   if (SetObjFieldFromToggle(w,"*Fill",d->Obj,d->Id,"fill")) return;
1056   d->ret=ret;
1057 }
1058 
LegendArcDialog(struct LegendArcDialog * data,struct objlist * obj,int id)1059 void LegendArcDialog(struct LegendArcDialog *data,
1060                        struct objlist *obj,int id)
1061 {
1062   data->SetupWindow=LegendArcDialogSetup;
1063   data->CloseWindow=LegendArcDialogClose;
1064   data->Obj=obj;
1065   data->Id=id;
1066 }
1067 
LegendMarkDialogSetupItem(Widget w,struct LegendMarkDialog * d,int id)1068 void LegendMarkDialogSetupItem(Widget w,struct LegendMarkDialog *d,int id)
1069 {
1070   int a;
1071 
1072   SetTextFromObjField(w,"*x",d->Obj,id,"x");
1073   SetTextFromObjField(w,"*y",d->Obj,id,"y");
1074   getobj(d->Obj,"type",id,0,NULL,&a);
1075   if (a<0) a=89;
1076   if (a>89) a=89;
1077   XtVaSetValues(XtNameToWidget(w,"*mark"),XmNlabelPixmap,
1078                 NgraphApp.markpix[a],NULL);
1079   MarkDialog(&d->mark,a);
1080   SetComboList(w,"*size",cbmarksize,CBMARKSIZE);
1081   SetTextFromObjField(GetComboBoxText(w,"*size"),NULL,d->Obj,id,"size");
1082   SetComboListFromObjField(GetComboBoxList(w,"*size"),NULL,d->Obj,id,"size");
1083   SetStyleFromObjField(w,"*style",d->Obj,id,"style");
1084   SetComboList(w,"*width",cblinewidth,CBLINEWIDTH);
1085   SetTextFromObjField(GetComboBoxText(w,"*width"),NULL,d->Obj,id,"width");
1086   SetComboListFromObjField(GetComboBoxList(w,"*width"),NULL,d->Obj,id,"width");
1087   getobj(d->Obj,"R",id,0,NULL,&d->R);
1088   getobj(d->Obj,"G",id,0,NULL,&d->G);
1089   getobj(d->Obj,"B",id,0,NULL,&d->B);
1090   XtVaSetValues(XtNameToWidget(w,"*col"),XmNbackground,RGB(d->R,d->G,d->B),NULL);
1091   getobj(d->Obj,"R2",id,0,NULL,&d->R2);
1092   getobj(d->Obj,"G2",id,0,NULL,&d->G2);
1093   getobj(d->Obj,"B2",id,0,NULL,&d->B2);
1094   XtVaSetValues(XtNameToWidget(w,"*col2"),XmNbackground,RGB(d->R2,d->G2,d->B2),NULL);
1095 }
1096 
LegendMarkDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)1097 void LegendMarkDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)
1098 {
1099   struct LegendMarkDialog *d;
1100 
1101   d=(struct LegendMarkDialog *)client_data;
1102   d->ret=IDDELETE;
1103 }
1104 
LegendMarkDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)1105 void LegendMarkDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)
1106 {
1107   struct LegendMarkDialog *d;
1108   int sel;
1109 
1110   d=(struct LegendMarkDialog *)client_data;
1111   if ((sel=CopyClick(d->widget,d->Obj,d->Id,LegendArcCB))!=-1)
1112     LegendMarkDialogSetupItem(d->widget,d,sel);
1113 }
1114 
LegendMarkDialogColor(Widget w,XtPointer client_data,XtPointer call_data)1115 void LegendMarkDialogColor(Widget w,XtPointer client_data,XtPointer call_data)
1116 {
1117   struct LegendMarkDialog *d;
1118 
1119   d=(struct LegendMarkDialog *)client_data;
1120   GetColor(TopLevel,&d->R,&d->G,&d->B);
1121   XtVaSetValues(w,XmNbackground,RGB(d->R,d->G,d->B),NULL);
1122 }
1123 
LegendMarkDialogColor2(Widget w,XtPointer client_data,XtPointer call_data)1124 void LegendMarkDialogColor2(Widget w,XtPointer client_data,XtPointer call_data)
1125 {
1126   struct LegendMarkDialog *d;
1127 
1128   d=(struct LegendMarkDialog *)client_data;
1129   GetColor(TopLevel,&d->R2,&d->G2,&d->B2);
1130   XtVaSetValues(w,XmNbackground,RGB(d->R2,d->G2,d->B2),NULL);
1131 }
1132 
LegendMarkDialogMark(Widget w,XtPointer client_data,XtPointer call_data)1133 void LegendMarkDialogMark(Widget w,XtPointer client_data,XtPointer call_data)
1134 {
1135   struct LegendMarkDialog *d;
1136 
1137   d=(struct LegendMarkDialog *)client_data;
1138   DialogExecute(d->widget,&d->mark);
1139   XtVaSetValues(w,XmNlabelPixmap,NgraphApp.markpix[d->mark.Type],NULL);
1140 }
1141 
LegendMarkDialogSetup(Widget w,void * data,int makewidget)1142 void LegendMarkDialogSetup(Widget w,void *data,int makewidget)
1143 {
1144   Arg al[20];
1145   Cardinal ac;
1146   Widget rc,rc2,button;
1147   struct LegendMarkDialog *d;
1148   char title[30];
1149   XmString xs;
1150 
1151   d=(struct LegendMarkDialog *)data;
1152   sprintf(title,"Legend mark %d",d->Id);
1153   xs=XmStringCreateLocalized(title);
1154   XtVaSetValues(w,XmNdialogTitle,xs,NULL);
1155   XmStringFree(xs);
1156   if (makewidget) {
1157   ac=0;
1158   XtManageChild(button=XmCreatePushButton(w,"Delete",al,ac));
1159   XtAddCallback(button,XmNdisarmCallback,LegendMarkDialogDelete,d);
1160   ac=0;
1161   XtManageChild(button=XmCreatePushButton(w,"Copy",al,ac));
1162   XtAddCallback(button,XmNdisarmCallback,LegendMarkDialogCopy,d);
1163 
1164   ac=0;
1165   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
1166   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
1167 
1168   ac=0;
1169   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1170   XtManageChild(rc2=XmCreateRowColumn(rc,"pointsrc",al,ac));
1171   ac=0;
1172   XtManageChild(XmCreateLabel(rc2,"X",al,ac));
1173   ac=0;
1174   XtManageChild(XmCreateTextField(rc2,"x",al,ac));
1175   ac=0;
1176   XtManageChild(XmCreateLabel(rc2,"Y",al,ac));
1177   ac=0;
1178   XtManageChild(XmCreateTextField(rc2,"y",al,ac));
1179 
1180   ac=0;
1181   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1182   XtManageChild(rc2=XmCreateRowColumn(rc,"stylerc",al,ac));
1183   ac=0;
1184   XtManageChild(XmCreateLabel(rc2,"Style",al,ac));
1185   ac=0;
1186   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1187   XtManageChild(XmCreateComboBox(rc2,"style",al,ac));
1188   ac=0;
1189   XtManageChild(XmCreateLabel(rc2,"Width",al,ac));
1190   ac=0;
1191   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1192   XtManageChild(XmCreateComboBox(rc2,"width",al,ac));
1193 
1194   ac=0;
1195   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1196   XtManageChild(rc2=XmCreateRowColumn(rc,"markrc",al,ac));
1197   ac=0;
1198   XtManageChild(XmCreateLabel(rc2,"Mark",al,ac));
1199   ac=0;
1200   XtSetArg(al[ac],XmNlabelType,XmPIXMAP); ac++;
1201   XtSetArg(al[ac],XmNlabelPixmap,NgraphApp.markpix[0]); ac++;
1202   XtManageChild(button=XmCreateDrawnButton(rc2,"mark",al,ac));
1203   XtAddCallback(button,XmNdisarmCallback,LegendMarkDialogMark,d);
1204   ac=0;
1205   XtManageChild(XmCreateLabel(rc2," Size",al,ac));
1206   ac=0;
1207   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1208   XtManageChild(XmCreateComboBox(rc2,"size",al,ac));
1209 
1210   ac=0;
1211   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1212   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
1213   ac=0;
1214   XtManageChild(XmCreateLabel(rc2,"Color1",al,ac));
1215   ac=0;
1216   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
1217   XtAddCallback(button,XmNdisarmCallback,LegendMarkDialogColor,d);
1218   ac=0;
1219   XtManageChild(XmCreateLabel(rc2,"Color2",al,ac));
1220   ac=0;
1221   XtManageChild(button=XmCreateDrawnButton(rc2,"col2",al,ac));
1222   XtAddCallback(button,XmNdisarmCallback,LegendMarkDialogColor2,d);
1223 
1224   XtManageChild(d->widget);
1225   XtVaSetValues(rc,XmNresizeWidth,FALSE,
1226                    XmNresizeHeight,FALSE,NULL);
1227   }
1228   LegendMarkDialogSetupItem(w,d,d->Id);
1229   if (makewidget) d->widget=NULL;
1230 }
1231 
LegendMarkDialogClose(Widget w,void * data)1232 void LegendMarkDialogClose(Widget w,void *data)
1233 {
1234   struct LegendMarkDialog *d;
1235   int ret;
1236 
1237   d=(struct LegendMarkDialog *)data;
1238   if (d->ret!=IDOK) return;
1239   ret=d->ret;
1240   d->ret=IDLOOP;
1241   if (SetObjFieldFromText(w,"*x",d->Obj,d->Id,"x")) return;
1242   if (SetObjFieldFromText(w,"*y",d->Obj,d->Id,"y")) return;
1243   if (putobj(d->Obj,"type",d->Id,&(d->mark.Type))==-1) return;
1244   if (SetObjFieldFromText(GetComboBoxText(w,"*size"),NULL,
1245       d->Obj,d->Id,"size")) return;
1246   if (SetObjFieldFromStyle(w,"*style",d->Obj,d->Id,"style")) return;
1247   if (SetObjFieldFromText(GetComboBoxText(w,"*width"),NULL,
1248       d->Obj,d->Id,"width")) return;
1249   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
1250   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
1251   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
1252   if (putobj(d->Obj,"R2",d->Id,&(d->R2))==-1) return;
1253   if (putobj(d->Obj,"G2",d->Id,&(d->G2))==-1) return;
1254   if (putobj(d->Obj,"B2",d->Id,&(d->B2))==-1) return;
1255   d->ret=ret;
1256 }
1257 
LegendMarkDialog(struct LegendMarkDialog * data,struct objlist * obj,int id)1258 void LegendMarkDialog(struct LegendMarkDialog *data,
1259                        struct objlist *obj,int id)
1260 {
1261   data->SetupWindow=LegendMarkDialogSetup;
1262   data->CloseWindow=LegendMarkDialogClose;
1263   data->Obj=obj;
1264   data->Id=id;
1265 }
1266 
LegendTextDialogSetupItem(Widget w,struct LegendTextDialog * d,int id)1267 void LegendTextDialogSetupItem(Widget w,struct LegendTextDialog *d,int id)
1268 {
1269   int j,selfont;
1270   struct fontmap *fcur;
1271   char *font;
1272   XmString xs;
1273   char *buf;
1274 
1275   SetTextFromObjField(w,"*x",d->Obj,id,"x");
1276   SetTextFromObjField(w,"*y",d->Obj,id,"y");
1277 
1278   sgetobjfield(d->Obj,id,"text",NULL,&buf,FALSE,FALSE,FALSE);
1279 #ifdef JAPANESE
1280 /* SJIS ---> EUC */
1281   njms2euc(buf);
1282 #endif
1283   XtVaSetValues(XtNameToWidget(w,"*text"),XmNvalue,buf,NULL);
1284   memfree(buf);
1285   SetComboList(w,"*direction",cbdirection,CBDIRECTION);
1286   SetTextFromObjField(GetComboBoxText(w,"*direction"),NULL,
1287                       d->Obj,id,"direction");
1288   SetComboListFromObjField(GetComboBoxList(w,"*direction"),NULL,
1289                       d->Obj,id,"direction");
1290   SetTextFromObjField(w,"*space",d->Obj,id,"space");
1291   SetComboList(w,"*pt",cbtextpt,CBTEXTPT);
1292   SetTextFromObjField(GetComboBoxText(w,"*pt"),NULL,
1293                       d->Obj,id,"pt");
1294   SetComboListFromObjField(GetComboBoxList(w,"*pt"),NULL,
1295                       d->Obj,id,"pt");
1296   SetTextFromObjField(w,"*script",d->Obj,id,"script_size");
1297   getobj(d->Obj,"font",id,0,NULL,&font);
1298   XmListDeleteAllItems(GetComboBoxList(w,"*font"));
1299   fcur=mxlocal->fontmaproot;
1300   j=0;
1301   selfont=-1;
1302   while (fcur!=NULL) {
1303     if (!(fcur->twobyte)) {
1304       xs=XmStringCreateLocalized(fcur->fontalias);
1305       XmListAddItem(GetComboBoxList(w,"*font"),xs,0);
1306       XmStringFree(xs);
1307       if (strcmp(font,fcur->fontalias)==0) selfont=j;
1308       j++;
1309     }
1310     fcur=fcur->next;
1311   }
1312   SetComboBoxVisibleItemCount(w,"*font",j);
1313   if (selfont!=-1)
1314     XmListSelectPos(GetComboBoxList(w,"*font"),selfont+1,TRUE);
1315 #ifdef JAPANESE
1316   getobj(d->Obj,"jfont",id,0,NULL,&font);
1317   XmListDeleteAllItems(GetComboBoxList(w,"*jfont"));
1318   fcur=mxlocal->fontmaproot;
1319   j=0;
1320   selfont=-1;
1321   while (fcur!=NULL) {
1322     if (fcur->twobyte) {
1323       xs=XmStringCreateLocalized(fcur->fontalias);
1324       XmListAddItem(GetComboBoxList(w,"*jfont"),xs,0);
1325       XmStringFree(xs);
1326       if (strcmp(font,fcur->fontalias)==0) selfont=j;
1327       j++;
1328     }
1329     fcur=fcur->next;
1330   }
1331   SetComboBoxVisibleItemCount(w,"*jfont",j);
1332   if (selfont!=-1)
1333     XmListSelectPos(GetComboBoxList(w,"*jfont"),selfont+1,TRUE);
1334 #endif
1335   getobj(d->Obj,"R",id,0,NULL,&d->R);
1336   getobj(d->Obj,"G",id,0,NULL,&d->G);
1337   getobj(d->Obj,"B",id,0,NULL,&d->B);
1338   XtVaSetValues(XtNameToWidget(w,"*col"),
1339                 XmNbackground,RGB(d->R,d->G,d->B),NULL);
1340   SetToggleFromObjField(w,"*Raw",d->Obj,id,"raw");
1341 }
1342 
LegendTextDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)1343 void LegendTextDialogDelete(Widget w,XtPointer client_data,XtPointer call_data)
1344 {
1345   struct LegendTextDialog *d;
1346 
1347   d=(struct LegendTextDialog *)client_data;
1348   d->ret=IDDELETE;
1349 }
1350 
LegendTextDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)1351 void LegendTextDialogCopy(Widget w,XtPointer client_data,XtPointer call_data)
1352 {
1353   struct LegendTextDialog *d;
1354   int sel;
1355 
1356   d=(struct LegendTextDialog *)client_data;
1357   if ((sel=CopyClick(d->widget,d->Obj,d->Id,LegendTextCB))!=-1)
1358     LegendTextDialogSetupItem(d->widget,d,sel);
1359 }
1360 
LegendTextDialogColor(Widget w,XtPointer client_data,XtPointer call_data)1361 void LegendTextDialogColor(Widget w,XtPointer client_data,XtPointer call_data)
1362 {
1363   struct LegendTextDialog *d;
1364 
1365   d=(struct LegendTextDialog *)client_data;
1366   GetColor(TopLevel,&d->R,&d->G,&d->B);
1367   XtVaSetValues(w,XmNbackground,RGB(d->R,d->G,d->B),NULL);
1368 }
1369 
LegendTextDialogSetup(Widget w,void * data,int makewidget)1370 void LegendTextDialogSetup(Widget w,void *data,int makewidget)
1371 {
1372   Arg al[20];
1373   Cardinal ac;
1374   Widget rc,rc2,button;
1375   struct LegendTextDialog *d;
1376   char title[30];
1377   XmString xs;
1378 
1379   d=(struct LegendTextDialog *)data;
1380   sprintf(title,"Legend text %d",d->Id);
1381   xs=XmStringCreateLocalized(title);
1382   XtVaSetValues(w,XmNdialogTitle,xs,NULL);
1383   XmStringFree(xs);
1384   if (makewidget) {
1385   ac=0;
1386   XtManageChild(button=XmCreatePushButton(w,"Delete",al,ac));
1387   XtAddCallback(button,XmNdisarmCallback,LegendTextDialogDelete,d);
1388   ac=0;
1389   XtManageChild(button=XmCreatePushButton(w,"Copy",al,ac));
1390   XtAddCallback(button,XmNdisarmCallback,LegendTextDialogCopy,d);
1391 
1392   ac=0;
1393   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
1394   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
1395 
1396   ac=0;
1397   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1398   XtManageChild(rc2=XmCreateRowColumn(rc,"pointsrc",al,ac));
1399   ac=0;
1400   XtManageChild(XmCreateLabel(rc2,"X",al,ac));
1401   ac=0;
1402   XtManageChild(XmCreateTextField(rc2,"x",al,ac));
1403   ac=0;
1404   XtManageChild(XmCreateLabel(rc2,"Y",al,ac));
1405   ac=0;
1406   XtManageChild(XmCreateTextField(rc2,"y",al,ac));
1407 
1408   ac=0;
1409   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1410   XtManageChild(rc2=XmCreateRowColumn(rc,"textrc",al,ac));
1411   ac=0;
1412   XtManageChild(XmCreateLabel(rc2,"Text",al,ac));
1413   ac=0;
1414   XtManageChild(XmCreateTextField(rc2,"text",al,ac));
1415   ac=0;
1416   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1417   XtManageChild(rc2=XmCreateRowColumn(rc,"ptrc",al,ac));
1418   ac=0;
1419   XtManageChild(XmCreateLabel(rc2,"Pt",al,ac));
1420   ac=0;
1421   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1422   XtManageChild(XmCreateComboBox(rc2,"pt",al,ac));
1423   ac=0;
1424   XtManageChild(XmCreateLabel(rc2,"Space",al,ac));
1425   ac=0;
1426   XtManageChild(XmCreateTextField(rc2,"space",al,ac));
1427   ac=0;
1428   XtManageChild(XmCreateLabel(rc2,"Script",al,ac));
1429   ac=0;
1430   XtManageChild(XmCreateTextField(rc2,"script",al,ac));
1431 
1432   ac=0;
1433   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1434   XtManageChild(rc2=XmCreateRowColumn(rc,"fontrc",al,ac));
1435   ac=0;
1436   XtManageChild(XmCreateLabel(rc2,"Font",al,ac));
1437   ac=0;
1438   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
1439   XtManageChild(XmCreateComboBox(rc2,"font",al,ac));
1440 
1441 #ifdef JAPANESE
1442   ac=0;
1443   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1444   XtManageChild(rc2=XmCreateRowColumn(rc,"jfontrc",al,ac));
1445   ac=0;
1446   XtManageChild(XmCreateLabel(rc2,"Jfont",al,ac));
1447   ac=0;
1448   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
1449   XtManageChild(XmCreateComboBox(rc2,"jfont",al,ac));
1450 #endif
1451 
1452   ac=0;
1453   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1454   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
1455   ac=0;
1456   XtManageChild(XmCreateLabel(rc2,"Color",al,ac));
1457   ac=0;
1458   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
1459   XtAddCallback(button,XmNdisarmCallback,LegendTextDialogColor,d);
1460   ac=0;
1461   XtManageChild(XmCreateLabel(rc2,"Direction",al,ac));
1462   ac=0;
1463   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1464   XtManageChild(XmCreateComboBox(rc2,"direction",al,ac));
1465   ac=0;
1466   XtManageChild(XmCreateToggleButton(rc2,"Raw",al,ac));
1467   }
1468   LegendTextDialogSetupItem(w,d,d->Id);
1469 }
1470 
LegendTextDialogClose(Widget w,void * data)1471 void LegendTextDialogClose(Widget w,void *data)
1472 {
1473   struct LegendTextDialog *d;
1474   int ret;
1475   char *buf;
1476   struct fontmap *fcur;
1477   int *selected,num,a,j;
1478 
1479   d=(struct LegendTextDialog *)data;
1480   if (d->ret!=IDOK) return;
1481   ret=d->ret;
1482   d->ret=IDLOOP;
1483   if (SetObjFieldFromText(w,"*x",d->Obj,d->Id,"x")) return;
1484   if (SetObjFieldFromText(w,"*y",d->Obj,d->Id,"y")) return;
1485 
1486   XtVaGetValues(XtNameToWidget(w,"*text"),XmNvalue,&buf,NULL);
1487 #ifdef JAPANESE
1488 /* EUC ---> SJIS */
1489   neuc2jms(buf);
1490 #endif
1491   if (sputobjfield(d->Obj,d->Id,"text",buf)!=0) {
1492     XtFree(buf);
1493     return;
1494   }
1495   XtFree(buf);
1496 
1497   if (SetObjFieldFromText(GetComboBoxText(w,"*direction"),NULL,
1498                           d->Obj,d->Id,"direction")) return;
1499   if (SetObjFieldFromText(w,"*space",d->Obj,d->Id,"space")) return;
1500   if (SetObjFieldFromText(GetComboBoxText(w,"*pt"),NULL,
1501                           d->Obj,d->Id,"pt")) return;
1502   if (SetObjFieldFromText(w,"*script",d->Obj,d->Id,"script_size")) return;
1503 
1504   XmListGetSelectedPos(GetComboBoxList(w,"*font"),&selected,&num);
1505   if (num!=0) {
1506     a=selected[0];
1507     fcur=mxlocal->fontmaproot;
1508     j=0;
1509     while (fcur!=NULL) {
1510       if (!(fcur->twobyte)) {
1511         j++;
1512         if (j==a) {
1513           sputobjfield(d->Obj,d->Id,"font",fcur->fontalias);
1514           break;
1515         }
1516       }
1517       fcur=fcur->next;
1518     }
1519     XtFree((char *)selected);
1520   }
1521 #ifdef JAPANESE
1522   XmListGetSelectedPos(GetComboBoxList(w,"*jfont"),&selected,&num);
1523   if (num!=0) {
1524     a=selected[0];
1525     fcur=mxlocal->fontmaproot;
1526     j=0;
1527     while (fcur!=NULL) {
1528       if (fcur->twobyte) {
1529         j++;
1530         if (j==a) {
1531           sputobjfield(d->Obj,d->Id,"jfont",fcur->fontalias);
1532           break;
1533         }
1534       }
1535       fcur=fcur->next;
1536     }
1537     XtFree((char *)selected);
1538   }
1539 #endif
1540   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
1541   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
1542   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
1543   if (SetObjFieldFromToggle(w,"*Raw",d->Obj,d->Id,"raw")) return;
1544   d->ret=ret;
1545 }
1546 
LegendTextDialog(struct LegendTextDialog * data,struct objlist * obj,int id)1547 void LegendTextDialog(struct LegendTextDialog *data,
1548                        struct objlist *obj,int id)
1549 {
1550   data->SetupWindow=LegendTextDialogSetup;
1551   data->CloseWindow=LegendTextDialogClose;
1552   data->Obj=obj;
1553   data->Id=id;
1554 }
1555 
LegendTextDefDialogSetupItem(Widget w,struct LegendTextDialog * d,int id)1556 void LegendTextDefDialogSetupItem(Widget w,struct LegendTextDialog *d,int id)
1557 {
1558   int j,selfont;
1559   struct fontmap *fcur;
1560   char *font;
1561   XmString xs;
1562 
1563   SetComboList(w,"*direction",cbdirection,CBDIRECTION);
1564   SetTextFromObjField(GetComboBoxText(w,"*direction"),NULL,
1565                       d->Obj,id,"direction");
1566   SetComboListFromObjField(GetComboBoxList(w,"*direction"),NULL,
1567                       d->Obj,id,"direction");
1568   SetTextFromObjField(w,"*space",d->Obj,id,"space");
1569   SetComboList(w,"*pt",cbtextpt,CBTEXTPT);
1570   SetTextFromObjField(GetComboBoxText(w,"*pt"),NULL,
1571                       d->Obj,id,"pt");
1572   SetComboListFromObjField(GetComboBoxList(w,"*pt"),NULL,
1573                       d->Obj,id,"pt");
1574   SetTextFromObjField(w,"*script",d->Obj,id,"script_size");
1575   getobj(d->Obj,"font",id,0,NULL,&font);
1576   XmListDeleteAllItems(GetComboBoxList(w,"*font"));
1577   fcur=mxlocal->fontmaproot;
1578   j=0;
1579   selfont=-1;
1580   while (fcur!=NULL) {
1581     if (!(fcur->twobyte)) {
1582       xs=XmStringCreateLocalized(fcur->fontalias);
1583       XmListAddItem(GetComboBoxList(w,"*font"),xs,0);
1584       XmStringFree(xs);
1585       if (strcmp(font,fcur->fontalias)==0) selfont=j;
1586       j++;
1587     }
1588     fcur=fcur->next;
1589   }
1590   SetComboBoxVisibleItemCount(w,"*font",j);
1591   if (selfont!=-1)
1592     XmListSelectPos(GetComboBoxList(w,"*font"),selfont+1,TRUE);
1593 #ifdef JAPANESE
1594   getobj(d->Obj,"jfont",id,0,NULL,&font);
1595   XmListDeleteAllItems(GetComboBoxList(w,"*jfont"));
1596   fcur=mxlocal->fontmaproot;
1597   j=0;
1598   selfont=-1;
1599   while (fcur!=NULL) {
1600     if (fcur->twobyte) {
1601       xs=XmStringCreateLocalized(fcur->fontalias);
1602       XmListAddItem(GetComboBoxList(w,"*jfont"),xs,0);
1603       XmStringFree(xs);
1604       if (strcmp(font,fcur->fontalias)==0) selfont=j;
1605       j++;
1606     }
1607     fcur=fcur->next;
1608   }
1609   SetComboBoxVisibleItemCount(w,"*jfont",j);
1610   if (selfont!=-1)
1611     XmListSelectPos(GetComboBoxList(w,"*jfont"),selfont+1,TRUE);
1612 #endif
1613   getobj(d->Obj,"R",id,0,NULL,&d->R);
1614   getobj(d->Obj,"G",id,0,NULL,&d->G);
1615   getobj(d->Obj,"B",id,0,NULL,&d->B);
1616   XtVaSetValues(XtNameToWidget(w,"*col"),XmNbackground,RGB(d->R,d->G,d->B),NULL);
1617   SetToggleFromObjField(w,"*Raw",d->Obj,id,"raw");
1618 }
1619 
LegendTextDefDialogSetup(Widget w,void * data,int makewidget)1620 void LegendTextDefDialogSetup(Widget w,void *data,int makewidget)
1621 {
1622   Arg al[20];
1623   Cardinal ac;
1624   Widget rc,rc2,button;
1625   struct LegendTextDialog *d;
1626 
1627   d=(struct LegendTextDialog *)data;
1628   if (makewidget) {
1629   ac=0;
1630   XtSetArg(al[ac],XmNorientation,XmVERTICAL); ac++;
1631   XtManageChild(rc=XmCreateRowColumn(w,"rc",al,ac));
1632 
1633   ac=0;
1634   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1635   XtManageChild(rc2=XmCreateRowColumn(rc,"ptrc",al,ac));
1636   ac=0;
1637   XtManageChild(XmCreateLabel(rc2,"Pt",al,ac));
1638   ac=0;
1639   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1640   XtManageChild(XmCreateComboBox(rc2,"pt",al,ac));
1641   ac=0;
1642   XtManageChild(XmCreateLabel(rc2,"Space",al,ac));
1643   ac=0;
1644   XtManageChild(XmCreateTextField(rc2,"space",al,ac));
1645   ac=0;
1646   XtManageChild(XmCreateLabel(rc2,"Script",al,ac));
1647   ac=0;
1648   XtManageChild(XmCreateTextField(rc2,"script",al,ac));
1649 
1650   ac=0;
1651   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1652   XtManageChild(rc2=XmCreateRowColumn(rc,"fontrc",al,ac));
1653   ac=0;
1654   XtManageChild(XmCreateLabel(rc2,"Font",al,ac));
1655   ac=0;
1656   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
1657   XtManageChild(XmCreateComboBox(rc2,"font",al,ac));
1658 
1659 #ifdef JAPANESE
1660   ac=0;
1661   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1662   XtManageChild(rc2=XmCreateRowColumn(rc,"jfontrc",al,ac));
1663   ac=0;
1664   XtManageChild(XmCreateLabel(rc2,"Jfont",al,ac));
1665   ac=0;
1666   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_LIST); ac++;
1667   XtManageChild(XmCreateComboBox(rc2,"jfont",al,ac));
1668 #endif
1669 
1670   ac=0;
1671   XtSetArg(al[ac],XmNorientation,XmHORIZONTAL); ac++;
1672   XtManageChild(rc2=XmCreateRowColumn(rc,"colorrc",al,ac));
1673   ac=0;
1674   XtManageChild(XmCreateLabel(rc2,"Color",al,ac));
1675   ac=0;
1676   XtManageChild(button=XmCreateDrawnButton(rc2,"col",al,ac));
1677   XtAddCallback(button,XmNdisarmCallback,LegendTextDialogColor,d);
1678   ac=0;
1679   XtManageChild(XmCreateLabel(rc2,"Direction",al,ac));
1680   ac=0;
1681   XtSetArg(al[ac],XmNcomboBoxType,XmDROP_DOWN_COMBO_BOX); ac++;
1682   XtManageChild(XmCreateComboBox(rc2,"direction",al,ac));
1683   ac=0;
1684   XtManageChild(XmCreateToggleButton(rc2,"Raw",al,ac));
1685   }
1686   LegendTextDefDialogSetupItem(w,d,d->Id);
1687 }
1688 
LegendTextDefDialogClose(Widget w,void * data)1689 void LegendTextDefDialogClose(Widget w,void *data)
1690 {
1691   struct LegendTextDialog *d;
1692   int ret;
1693   struct fontmap *fcur;
1694   int *selected,num,a,j;
1695 
1696   d=(struct LegendTextDialog *)data;
1697   if (d->ret!=IDOK) return;
1698   ret=d->ret;
1699   d->ret=IDLOOP;
1700   if (SetObjFieldFromText(GetComboBoxText(w,"*direction"),NULL,
1701                           d->Obj,d->Id,"direction")) return;
1702   if (SetObjFieldFromText(w,"*space",d->Obj,d->Id,"space")) return;
1703   if (SetObjFieldFromText(GetComboBoxText(w,"*pt"),NULL,
1704                           d->Obj,d->Id,"pt")) return;
1705   if (SetObjFieldFromText(w,"*script",d->Obj,d->Id,"script_size")) return;
1706   XmListGetSelectedPos(GetComboBoxList(w,"*font"),&selected,&num);
1707   if (num!=0) {
1708     a=selected[0];
1709     fcur=mxlocal->fontmaproot;
1710     j=0;
1711     while (fcur!=NULL) {
1712       if (!(fcur->twobyte)) {
1713         j++;
1714         if (j==a) {
1715           sputobjfield(d->Obj,d->Id,"font",fcur->fontalias);
1716           break;
1717         }
1718       }
1719       fcur=fcur->next;
1720     }
1721     XtFree((char *)selected);
1722   }
1723 #ifdef JAPANESE
1724   XmListGetSelectedPos(GetComboBoxList(w,"*jfont"),&selected,&num);
1725   if (num!=0) {
1726     a=selected[0];
1727     fcur=mxlocal->fontmaproot;
1728     j=0;
1729     while (fcur!=NULL) {
1730       if (fcur->twobyte) {
1731         j++;
1732         if (j==a) {
1733           sputobjfield(d->Obj,d->Id,"jfont",fcur->fontalias);
1734           break;
1735         }
1736       }
1737       fcur=fcur->next;
1738     }
1739     XtFree((char *)selected);
1740   }
1741 #endif
1742   if (putobj(d->Obj,"R",d->Id,&(d->R))==-1) return;
1743   if (putobj(d->Obj,"G",d->Id,&(d->G))==-1) return;
1744   if (putobj(d->Obj,"B",d->Id,&(d->B))==-1) return;
1745   if (SetObjFieldFromToggle(w,"*Raw",d->Obj,d->Id,"raw")) return;
1746   d->ret=ret;
1747 }
1748 
LegendTextDefDialog(struct LegendTextDialog * data,struct objlist * obj,int id)1749 void LegendTextDefDialog(struct LegendTextDialog *data,
1750                          struct objlist *obj,int id)
1751 {
1752   data->SetupWindow=LegendTextDefDialogSetup;
1753   data->CloseWindow=LegendTextDefDialogClose;
1754   data->Obj=obj;
1755   data->Id=id;
1756 }
1757 
1758 
CmLineDel()1759 void CmLineDel()
1760 {
1761   struct narray array;
1762   struct objlist *obj;
1763   int i;
1764   int num,*data;
1765 
1766   if (menulock || globallock) return;
1767   if ((obj=chkobject("line"))==NULL) return;
1768   if (chkobjlastinst(obj)==-1) return;
1769   SelectDialog(&DlgSelect,obj,LegendLineCB,(struct narray *)&array,NULL);
1770   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1771     num=arraynum(&array);
1772     data=(int *)arraydata(&array);
1773     for (i=num-1;i>=0;i--) {
1774       delobj(obj,data[i]);
1775       NgraphApp.Changed=TRUE;
1776     }
1777     LegendWinUpdate(TRUE);
1778   }
1779   arraydel(&array);
1780 }
1781 
CmLineUpdate()1782 void CmLineUpdate()
1783 {
1784   struct narray array;
1785   struct objlist *obj;
1786   int i,j,ret;
1787   int *data,num;
1788 
1789   if (menulock || globallock) return;
1790   if ((obj=chkobject("line"))==NULL) return;
1791   if (chkobjlastinst(obj)==-1) return;
1792   SelectDialog(&DlgSelect,obj,LegendLineCB,(struct narray *)&array,NULL);
1793   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1794     num=arraynum(&array);
1795     data=(int *)arraydata(&array);
1796     for (i=0;i<num;i++) {
1797       LegendArrowDialog(&DlgLegendArrow,obj,data[i]);
1798       if ((ret=DialogExecute(TopLevel,&DlgLegendArrow))==IDDELETE) {
1799         delobj(obj,data[i]);
1800         for (j=i+1;j<num;j++) data[j]--;
1801       }
1802       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
1803     }
1804     LegendWinUpdate(TRUE);
1805   }
1806   arraydel(&array);
1807 }
1808 
1809 
CmLineMenu(Widget w,XtPointer client_data,XtPointer call_data)1810 void CmLineMenu(Widget w,XtPointer client_data,XtPointer call_data)
1811 {
1812   switch ((int )client_data) {
1813   case 0:
1814     CmLineUpdate();
1815     break;
1816   case 1:
1817     CmLineDel();
1818     break;
1819   }
1820 }
1821 
CmCurveDel()1822 void CmCurveDel()
1823 {
1824   struct narray array;
1825   struct objlist *obj;
1826   int i;
1827   int num,*data;
1828 
1829   if (menulock || globallock) return;
1830   if ((obj=chkobject("curve"))==NULL) return;
1831   if (chkobjlastinst(obj)==-1) return;
1832   SelectDialog(&DlgSelect,obj,LegendLineCB,(struct narray *)&array,NULL);
1833   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1834     num=arraynum(&array);
1835     data=(int *)arraydata(&array);
1836     for (i=num-1;i>=0;i--) {
1837       delobj(obj,data[i]);
1838       NgraphApp.Changed=TRUE;
1839     }
1840     LegendWinUpdate(TRUE);
1841   }
1842   arraydel(&array);
1843 }
1844 
CmCurveUpdate()1845 void CmCurveUpdate()
1846 {
1847   struct narray array;
1848   struct objlist *obj;
1849   int i,j,ret;
1850   int *data,num;
1851 
1852   if (menulock || globallock) return;
1853   if ((obj=chkobject("curve"))==NULL) return;
1854   if (chkobjlastinst(obj)==-1) return;
1855   SelectDialog(&DlgSelect,obj,LegendLineCB,(struct narray *)&array,NULL);
1856   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1857     num=arraynum(&array);
1858     data=(int *)arraydata(&array);
1859     for (i=0;i<num;i++) {
1860       LegendCurveDialog(&DlgLegendCurve,obj,data[i]);
1861       if ((ret=DialogExecute(TopLevel,&DlgLegendCurve))==IDDELETE) {
1862         delobj(obj,data[i]);
1863         for (j=i+1;j<num;j++) data[j]--;
1864       }
1865       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
1866     }
1867     LegendWinUpdate(TRUE);
1868   }
1869   arraydel(&array);
1870 }
1871 
CmCurveMenu(Widget w,XtPointer client_data,XtPointer call_data)1872 void CmCurveMenu(Widget w,XtPointer client_data,XtPointer call_data)
1873 {
1874   switch ((int )client_data) {
1875   case 0:
1876     CmCurveUpdate();
1877     break;
1878   case 1:
1879     CmCurveDel();
1880     break;
1881   }
1882 }
1883 
CmPolyDel()1884 void CmPolyDel()
1885 {
1886   struct narray array;
1887   struct objlist *obj;
1888   int i;
1889   int num,*data;
1890 
1891   if (menulock || globallock) return;
1892   if ((obj=chkobject("polygon"))==NULL) return;
1893   if (chkobjlastinst(obj)==-1) return;
1894   SelectDialog(&DlgSelect,obj,LegendLineCB,(struct narray *)&array,NULL);
1895   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1896     num=arraynum(&array);
1897     data=(int *)arraydata(&array);
1898     for (i=num-1;i>=0;i--) {
1899       delobj(obj,data[i]);
1900       NgraphApp.Changed=TRUE;
1901     }
1902     LegendWinUpdate(TRUE);
1903   }
1904   arraydel(&array);
1905 }
1906 
CmPolyUpdate()1907 void CmPolyUpdate()
1908 {
1909   struct narray array;
1910   struct objlist *obj;
1911   int i,j,ret;
1912   int *data,num;
1913 
1914   if (menulock || globallock) return;
1915   if ((obj=chkobject("polygon"))==NULL) return;
1916   if (chkobjlastinst(obj)==-1) return;
1917   SelectDialog(&DlgSelect,obj,LegendLineCB,(struct narray *)&array,NULL);
1918   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1919     num=arraynum(&array);
1920     data=(int *)arraydata(&array);
1921     for (i=0;i<num;i++) {
1922       LegendPolyDialog(&DlgLegendPoly,obj,data[i]);
1923       if ((ret=DialogExecute(TopLevel,&DlgLegendPoly))==IDDELETE) {
1924         delobj(obj,data[i]);
1925         for (j=i+1;j<num;j++) data[j]--;
1926       }
1927       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
1928     }
1929     LegendWinUpdate(TRUE);
1930   }
1931   arraydel(&array);
1932 }
1933 
CmPolygonMenu(Widget w,XtPointer client_data,XtPointer call_data)1934 void CmPolygonMenu(Widget w,XtPointer client_data,XtPointer call_data)
1935 {
1936   switch ((int )client_data) {
1937   case 0:
1938     CmPolyUpdate();
1939     break;
1940   case 1:
1941     CmPolyDel();
1942     break;
1943   }
1944 }
1945 
CmRectDel()1946 void CmRectDel()
1947 {
1948   struct narray array;
1949   struct objlist *obj;
1950   int i;
1951   int num,*data;
1952 
1953   if (menulock || globallock) return;
1954   if ((obj=chkobject("rectangle"))==NULL) return;
1955   if (chkobjlastinst(obj)==-1) return;
1956   SelectDialog(&DlgSelect,obj,LegendRectCB,(struct narray *)&array,NULL);
1957   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1958     num=arraynum(&array);
1959     data=(int *)arraydata(&array);
1960     for (i=num-1;i>=0;i--) {
1961       delobj(obj,data[i]);
1962       NgraphApp.Changed=TRUE;
1963     }
1964     LegendWinUpdate(TRUE);
1965   }
1966   arraydel(&array);
1967 }
1968 
CmRectUpdate()1969 void CmRectUpdate()
1970 {
1971   struct narray array;
1972   struct objlist *obj;
1973   int i,j,ret;
1974   int *data,num;
1975 
1976   if (menulock || globallock) return;
1977   if ((obj=chkobject("rectangle"))==NULL) return;
1978   if (chkobjlastinst(obj)==-1) return;
1979   SelectDialog(&DlgSelect,obj,LegendRectCB,(struct narray *)&array,NULL);
1980   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
1981     num=arraynum(&array);
1982     data=(int *)arraydata(&array);
1983     for (i=0;i<num;i++) {
1984       LegendRectDialog(&DlgLegendRect,obj,data[i]);
1985       if ((ret=DialogExecute(TopLevel,&DlgLegendRect))==IDDELETE) {
1986         delobj(obj,data[i]);
1987         for (j=i+1;j<num;j++) data[j]--;
1988       }
1989       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
1990     }
1991     LegendWinUpdate(TRUE);
1992   }
1993   arraydel(&array);
1994 }
1995 
CmRectangleMenu(Widget w,XtPointer client_data,XtPointer call_data)1996 void CmRectangleMenu(Widget w,XtPointer client_data,XtPointer call_data)
1997 {
1998   switch ((int )client_data) {
1999   case 0:
2000     CmRectUpdate();
2001     break;
2002   case 1:
2003     CmRectDel();
2004     break;
2005   }
2006 }
2007 
CmArcDel()2008 void CmArcDel()
2009 {
2010   struct narray array;
2011   struct objlist *obj;
2012   int i;
2013   int num,*data;
2014 
2015   if (menulock || globallock) return;
2016   if ((obj=chkobject("arc"))==NULL) return;
2017   if (chkobjlastinst(obj)==-1) return;
2018   SelectDialog(&DlgSelect,obj,LegendArcCB,(struct narray *)&array,NULL);
2019   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
2020     num=arraynum(&array);
2021     data=(int *)arraydata(&array);
2022     for (i=num-1;i>=0;i--) {
2023       delobj(obj,data[i]);
2024       NgraphApp.Changed=TRUE;
2025     }
2026     LegendWinUpdate(TRUE);
2027   }
2028   arraydel(&array);
2029 }
2030 
CmArcUpdate()2031 void CmArcUpdate()
2032 {
2033   struct narray array;
2034   struct objlist *obj;
2035   int i,j,ret;
2036   int *data,num;
2037 
2038   if (menulock || globallock) return;
2039   if ((obj=chkobject("arc"))==NULL) return;
2040   if (chkobjlastinst(obj)==-1) return;
2041   SelectDialog(&DlgSelect,obj,LegendArcCB,(struct narray *)&array,NULL);
2042   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
2043     num=arraynum(&array);
2044     data=(int *)arraydata(&array);
2045     for (i=0;i<num;i++) {
2046       LegendArcDialog(&DlgLegendArc,obj,data[i]);
2047       if ((ret=DialogExecute(TopLevel,&DlgLegendArc))==IDDELETE) {
2048         delobj(obj,data[i]);
2049         for (j=i+1;j<num;j++) data[j]--;
2050       }
2051       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
2052     }
2053     LegendWinUpdate(TRUE);
2054   }
2055   arraydel(&array);
2056 }
2057 
CmArcMenu(Widget w,XtPointer client_data,XtPointer call_data)2058 void CmArcMenu(Widget w,XtPointer client_data,XtPointer call_data)
2059 {
2060   switch ((int )client_data) {
2061   case 0:
2062     CmArcUpdate();
2063     break;
2064   case 1:
2065     CmArcDel();
2066     break;
2067   }
2068 }
2069 
CmMarkDel()2070 void CmMarkDel()
2071 {
2072   struct narray array;
2073   struct objlist *obj;
2074   int i;
2075   int num,*data;
2076 
2077   if (menulock || globallock) return;
2078   if ((obj=chkobject("mark"))==NULL) return;
2079   if (chkobjlastinst(obj)==-1) return;
2080   SelectDialog(&DlgSelect,obj,LegendArcCB,(struct narray *)&array,NULL);
2081   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
2082     num=arraynum(&array);
2083     data=(int *)arraydata(&array);
2084     for (i=num-1;i>=0;i--) {
2085       delobj(obj,data[i]);
2086       NgraphApp.Changed=TRUE;
2087     }
2088     LegendWinUpdate(TRUE);
2089   }
2090   arraydel(&array);
2091 }
2092 
CmMarkUpdate()2093 void CmMarkUpdate()
2094 {
2095   struct narray array;
2096   struct objlist *obj;
2097   int i,j,ret;
2098   int *data,num;
2099 
2100   if (menulock || globallock) return;
2101   if ((obj=chkobject("mark"))==NULL) return;
2102   if (chkobjlastinst(obj)==-1) return;
2103   SelectDialog(&DlgSelect,obj,LegendArcCB,(struct narray *)&array,NULL);
2104   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
2105     num=arraynum(&array);
2106     data=(int *)arraydata(&array);
2107     for (i=0;i<num;i++) {
2108       LegendMarkDialog(&DlgLegendMark,obj,data[i]);
2109       if ((ret=DialogExecute(TopLevel,&DlgLegendMark))==IDDELETE) {
2110         delobj(obj,data[i]);
2111         for (j=i+1;j<num;j++) data[j]--;
2112       }
2113       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
2114     }
2115     LegendWinUpdate(TRUE);
2116   }
2117   arraydel(&array);
2118 }
2119 
CmMarkMenu(Widget w,XtPointer client_data,XtPointer call_data)2120 void CmMarkMenu(Widget w,XtPointer client_data,XtPointer call_data)
2121 {
2122   switch ((int )client_data) {
2123   case 0:
2124     CmMarkUpdate();
2125     break;
2126   case 1:
2127     CmMarkDel();
2128     break;
2129   }
2130 }
2131 
CmTextDel()2132 void CmTextDel()
2133 {
2134   struct narray array;
2135   struct objlist *obj;
2136   int i;
2137   int num,*data;
2138 
2139   if (menulock || globallock) return;
2140   if ((obj=chkobject("text"))==NULL) return;
2141   if (chkobjlastinst(obj)==-1) return;
2142   SelectDialog(&DlgSelect,obj,LegendTextCB,(struct narray *)&array,NULL);
2143   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
2144     num=arraynum(&array);
2145     data=(int *)arraydata(&array);
2146     for (i=num-1;i>=0;i--) {
2147       delobj(obj,data[i]);
2148       NgraphApp.Changed=TRUE;
2149     }
2150     LegendWinUpdate(TRUE);
2151   }
2152   arraydel(&array);
2153 }
2154 
CmTextUpdate()2155 void CmTextUpdate()
2156 {
2157   struct narray array;
2158   struct objlist *obj;
2159   int i,j,ret;
2160   int *data,num;
2161 
2162   if (menulock || globallock) return;
2163   if ((obj=chkobject("text"))==NULL) return;
2164   if (chkobjlastinst(obj)==-1) return;
2165   SelectDialog(&DlgSelect,obj,LegendTextCB,(struct narray *)&array,NULL);
2166   if (DialogExecute(TopLevel,&DlgSelect)==IDOK) {
2167     num=arraynum(&array);
2168     data=(int *)arraydata(&array);
2169     for (i=0;i<num;i++) {
2170       LegendTextDialog(&DlgLegendText,obj,data[i]);
2171       if ((ret=DialogExecute(TopLevel,&DlgLegendText))==IDDELETE) {
2172         delobj(obj,data[i]);
2173         for (j=i+1;j<num;j++) data[j]--;
2174       }
2175       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
2176     }
2177     LegendWinUpdate(TRUE);
2178   }
2179   arraydel(&array);
2180 }
2181 
CmTextMenu(Widget w,XtPointer client_data,XtPointer call_data)2182 void CmTextMenu(Widget w,XtPointer client_data,XtPointer call_data)
2183 {
2184   switch ((int )client_data) {
2185   case 0:
2186     CmTextUpdate();
2187     break;
2188   case 1:
2189     CmTextDel();
2190     break;
2191   }
2192 }
2193 
CmOptionTextDef()2194 void CmOptionTextDef()
2195 {
2196   struct objlist *obj;
2197   int id;
2198 
2199   if (menulock || globallock) return;
2200   if ((obj=chkobject("text"))==NULL) return;
2201   if ((id=newobj(obj))>=0) {
2202     LegendTextDefDialog(&DlgLegendTextDef,obj,id);
2203     if (DialogExecute(TopLevel,&DlgLegendTextDef)==IDOK) {
2204       if (CheckIniFile()) {
2205         exeobj(obj,"save_config",id,0,NULL);
2206       }
2207     }
2208     delobj(obj,id);
2209     UpdateAll2();
2210   }
2211 }
2212 
LegendWinLegendDelete()2213 void LegendWinLegendDelete()
2214 {
2215   int sel,i,num;
2216   struct LegendWin *d;
2217 
2218   d=&(NgraphApp.LegendWin);
2219   if (menulock || globallock) return;
2220   UnFocus();
2221   sel=d->select;
2222   num=0;
2223   for (i=0;i<LEGENDNUM;i++) {
2224     if ((sel>=num) && (sel<=num+d->legend[i])) {
2225       delobj(d->obj[i],sel-num);
2226       LegendWinUpdate(TRUE);
2227       NgraphApp.Changed=TRUE;
2228       break;
2229     }
2230     num+=d->legend[i]+1;
2231   }
2232 }
2233 
LegendWinLegendCopy()2234 void LegendWinLegendCopy()
2235 {
2236   int sel,i,num;
2237   int j,id,perm,type;
2238   char *field;
2239   struct LegendWin *d;
2240 
2241   d=&(NgraphApp.LegendWin);
2242   if (menulock || globallock) return;
2243   sel=d->select;
2244   num=0;
2245   for (i=0;i<LEGENDNUM;i++) {
2246     if ((sel>=num) && (sel<=num+d->legend[i])) {
2247       if ((id=newobj(d->obj[i]))>=0) {
2248         for (j=0;j<chkobjfieldnum(d->obj[i]);j++) {
2249           field=chkobjfieldname(d->obj[i],j);
2250           perm=chkobjperm(d->obj[i],field);
2251           type=chkobjfieldtype(d->obj[i],field);
2252           if ((strcmp2(field,"name")!=0)
2253             && ((perm&NREAD)!=0) && ((perm&NWRITE)!=0) && (type<NVFUNC))
2254             copyobj(d->obj[i],field,id,sel-num);
2255         }
2256         d->legend[i]++;
2257         NgraphApp.Changed=TRUE;
2258       }
2259       d->select=sel;
2260       LegendWinUpdate(FALSE);
2261       break;
2262     }
2263     num+=d->legend[i]+1;
2264   }
2265 }
2266 
LegendWinLegendCopy2()2267 void LegendWinLegendCopy2()
2268 {
2269   int sel,i,num;
2270   int j,id,perm,type;
2271   char *field;
2272   struct LegendWin *d;
2273 
2274   d=&(NgraphApp.LegendWin);
2275   if (menulock || globallock) return;
2276   sel=d->select;
2277   num=0;
2278   for (i=0;i<LEGENDNUM;i++) {
2279     if ((sel>=num) && (sel<=num+d->legend[i])) {
2280       if ((id=newobj(d->obj[i]))>=0) {
2281         for (j=0;j<chkobjfieldnum(d->obj[i]);j++) {
2282           field=chkobjfieldname(d->obj[i],j);
2283           perm=chkobjperm(d->obj[i],field);
2284           type=chkobjfieldtype(d->obj[i],field);
2285           if ((strcmp2(field,"name")!=0)
2286             && ((perm&NREAD)!=0) && ((perm&NWRITE)!=0) && (type<NVFUNC))
2287             copyobj(d->obj[i],field,id,sel-num);
2288         }
2289         d->legend[i]++;
2290         for (j=d->legend[i];j>sel-num+1;j--) moveupobj(d->obj[i],j);
2291         NgraphApp.Changed=TRUE;
2292       }
2293       d->select=sel;
2294       LegendWinUpdate(FALSE);
2295       break;
2296     }
2297     num+=d->legend[i]+1;
2298   }
2299 }
2300 
LegendWinLegendTop()2301 void LegendWinLegendTop()
2302 {
2303   int sel,i,num;
2304   struct LegendWin *d;
2305 
2306   d=&(NgraphApp.LegendWin);
2307   if (menulock || globallock) return;
2308   sel=d->select;
2309   num=0;
2310   for (i=0;i<LEGENDNUM;i++) {
2311     if ((sel>=num) && (sel<=num+d->legend[i])) {
2312       movetopobj(d->obj[i],sel-num);
2313       d->select=num;
2314       LegendWinUpdate(FALSE);
2315       NgraphApp.Changed=TRUE;
2316       break;
2317     }
2318     num+=d->legend[i]+1;
2319   }
2320 }
2321 
LegendWinLegendLast()2322 void LegendWinLegendLast()
2323 {
2324   int sel,i,num;
2325   struct LegendWin *d;
2326 
2327   d=&(NgraphApp.LegendWin);
2328   if (menulock || globallock) return;
2329   sel=d->select;
2330   num=0;
2331   for (i=0;i<LEGENDNUM;i++) {
2332     if ((sel>=num) && (sel<=num+d->legend[i])) {
2333       movelastobj(d->obj[i],sel-num);
2334       d->select=num+d->legend[i];
2335       LegendWinUpdate(FALSE);
2336       NgraphApp.Changed=TRUE;
2337       break;
2338     }
2339     num+=d->legend[i]+1;
2340   }
2341 }
2342 
LegendWinLegendUp()2343 void LegendWinLegendUp()
2344 {
2345   int sel,i,num;
2346   struct LegendWin *d;
2347 
2348   d=&(NgraphApp.LegendWin);
2349   if (menulock || globallock) return;
2350   sel=d->select;
2351   num=0;
2352   for (i=0;i<LEGENDNUM;i++) {
2353     if ((sel>=num+1) && (sel<=num+d->legend[i])) {
2354       moveupobj(d->obj[i],sel-num);
2355       d->select=sel-1;
2356       LegendWinUpdate(FALSE);
2357       NgraphApp.Changed=TRUE;
2358       break;
2359     }
2360     num+=d->legend[i]+1;
2361   }
2362 }
2363 
LegendWinLegendDown()2364 void LegendWinLegendDown()
2365 {
2366   int sel,i,num;
2367   struct LegendWin *d;
2368 
2369   d=&(NgraphApp.LegendWin);
2370   if (menulock || globallock) return;
2371   sel=d->select;
2372   num=0;
2373   for (i=0;i<LEGENDNUM;i++) {
2374     if ((sel>=num) && (sel<=num+d->legend[i]-1)) {
2375       movedownobj(d->obj[i],sel-num);
2376       d->select=sel+1;
2377       LegendWinUpdate(FALSE);
2378       NgraphApp.Changed=TRUE;
2379       break;
2380     }
2381     num+=d->legend[i]+1;
2382   }
2383 }
2384 
LegendWinLegendUpdate()2385 void LegendWinLegendUpdate()
2386 {
2387   int sel,i,num;
2388   int update,ret;
2389   struct LegendWin *d;
2390 
2391   d=&(NgraphApp.LegendWin);
2392   if (menulock || globallock) return;
2393   UnFocus();
2394   sel=d->select;
2395   num=0;
2396   update=FALSE;
2397   for (i=0;i<LEGENDNUM;i++) {
2398     if ((sel>=num) && (sel<=num+d->legend[i])) {
2399       ret=IDCANCEL;
2400       if (i==0) {
2401         LegendArrowDialog(&DlgLegendArrow,d->obj[i],sel-num);
2402         ret=DialogExecute(TopLevel,&DlgLegendArrow);
2403       } else if (i==1) {
2404         LegendCurveDialog(&DlgLegendCurve,d->obj[i],sel-num);
2405         ret=DialogExecute(TopLevel,&DlgLegendCurve);
2406       } else if (i==2) {
2407         LegendPolyDialog(&DlgLegendPoly,d->obj[i],sel-num);
2408         ret=DialogExecute(TopLevel,&DlgLegendPoly);
2409       } else if (i==3) {
2410         LegendRectDialog(&DlgLegendRect,d->obj[i],sel-num);
2411         ret=DialogExecute(TopLevel,&DlgLegendRect);
2412       } else if (i==4) {
2413         LegendArcDialog(&DlgLegendArc,d->obj[i],sel-num);
2414         ret=DialogExecute(TopLevel,&DlgLegendArc);
2415       } else if (i==5) {
2416         LegendMarkDialog(&DlgLegendMark,d->obj[i],sel-num);
2417         ret=DialogExecute(TopLevel,&DlgLegendMark);
2418       } else if (i==6) {
2419         LegendTextDialog(&DlgLegendText,d->obj[i],sel-num);
2420         ret=DialogExecute(TopLevel,&DlgLegendText);
2421       }
2422       if (ret==IDDELETE) {
2423         delobj(d->obj[i],sel-num);
2424         update=TRUE;
2425         d->select=-1;
2426       } else if (ret==IDOK) update=TRUE;
2427       if (ret!=IDCANCEL) NgraphApp.Changed=TRUE;
2428     }
2429     num+=d->legend[i]+1;
2430   }
2431   if (update) LegendWinUpdate(FALSE);
2432 }
2433 
LegendWinLegendSelect()2434 void LegendWinLegendSelect()
2435 {
2436   int sel,i,num;
2437   struct LegendWin *d;
2438 
2439   d=&(NgraphApp.LegendWin);
2440   if (menulock || globallock) return;
2441   sel=d->select;
2442   num=0;
2443   for (i=0;i<LEGENDNUM;i++) {
2444     if ((sel>=num) && (sel<=num+d->legend[i])) {
2445       Focus(d->obj[i],sel-num);
2446       break;
2447     }
2448     num+=d->legend[i]+1;
2449   }
2450 }
2451 
LegendWinLegendHidden()2452 void LegendWinLegendHidden()
2453 {
2454   int sel,i,num;
2455   int hidden;
2456   struct LegendWin *d;
2457 
2458   d=&(NgraphApp.LegendWin);
2459   if (menulock || globallock) return;
2460   UnFocus();
2461   sel=d->select;
2462   num=0;
2463   for (i=0;i<LEGENDNUM;i++) {
2464     if ((sel>=num) && (sel<=num+d->legend[i])) {
2465       getobj(d->obj[i],"hidden",sel-num,0,NULL,&hidden);
2466       hidden=hidden?FALSE:TRUE;
2467       putobj(d->obj[i],"hidden",sel-num,&hidden);
2468       LegendWinUpdate(FALSE);
2469       NgraphApp.Changed=TRUE;
2470       break;
2471     }
2472     num+=d->legend[i]+1;
2473   }
2474 }
2475 
LegendWinChangeLegendNum()2476 void LegendWinChangeLegendNum()
2477 {
2478   int i,num;
2479   struct LegendWin *d;
2480 
2481   d=&(NgraphApp.LegendWin);
2482   if (d->text==NULL) return;
2483   num=0;
2484   for (i=0;i<LEGENDNUM;i++) num+=d->legend[i]+1;
2485   XtVaSetValues(d->text,XmNheight,(num+2)*FHeight,NULL);
2486 }
2487 
LegendWinUpdate(int clear)2488 void LegendWinUpdate(int clear)
2489 {
2490   int i;
2491   struct LegendWin *d;
2492 
2493   d=&(NgraphApp.LegendWin);
2494   for (i=0;i<LEGENDNUM;i++) d->legend[i]=chkobjlastinst(d->obj[i]);
2495   LegendWinChangeLegendNum();
2496   if (d->text==NULL) return;
2497   XClearArea(XtDisplay(d->text),XtWindow(d->text),0,0,0,0,TRUE);
2498 }
2499 
LegendWinExpose(Widget wi,XtPointer client_data,XtPointer call_data)2500 void LegendWinExpose(Widget wi,XtPointer client_data,XtPointer call_data)
2501 {
2502   XmDrawingAreaCallbackStruct *dd;
2503   XExposeEvent *e;
2504   Display *disp;
2505   Window win;
2506   GC gc;
2507   int i,k,tot;
2508   char buf[256];
2509   XRectangle rect;
2510   int h,w,x,y,len,x1,y1,x2,y2,type,cx,x0=0,y0=0;
2511   struct narray *array;
2512   int *points;
2513   char *text;
2514   char *valstr;
2515   int hidden;
2516   struct LegendWin *d;
2517 
2518   d=&(NgraphApp.LegendWin);
2519   if (d->text==NULL) return;
2520   dd=(XmDrawingAreaCallbackStruct *)call_data;
2521   e=(XExposeEvent *)(dd->event);
2522   disp=e->display;
2523   win=e->window;
2524   gc=XCreateGC(disp,win,0,0);
2525   if (globallock) return;
2526   h=FHeight;
2527   w=FWidth;
2528   XSetForeground(disp,gc,gray);
2529   XFillRectangle(disp,win,gc,0,0,63*w+2*w,h);
2530   x=FWidth;
2531   y=FAscent;
2532   XSetForeground(disp,gc,black);
2533   rect.y=y-FAscent;
2534   rect.height=h;
2535   rect.x=x;
2536   rect.width=6*w;
2537   len=sprintf(buf,"#");
2538   ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2539   x+=6*w;
2540   rect.x=x;
2541   rect.width=10*w;
2542   len=sprintf(buf,"object");
2543   ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2544   x+=10*w;
2545   rect.x=x;
2546   rect.width=25*w;
2547   len=sprintf(buf,"property");
2548   ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2549   x+=25*w;
2550   rect.x=x;
2551   rect.width=6*w;
2552   len=sprintf(buf,"     x");
2553   ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2554   x+=6*w;
2555   rect.x=x;
2556   rect.width=6*w;
2557   len=sprintf(buf,"     y");
2558   ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2559   x+=6*w;
2560   rect.x=x+w;
2561   rect.width=8*w;
2562   len=sprintf(buf,"^#");
2563   ExtTextOut(disp,win,gc,x+w,y,&rect,buf,len);
2564 
2565   tot=0;
2566   for (k=0;k<LEGENDNUM;k++) {
2567     d->legend[k]=chkobjlastinst(d->obj[k]);
2568     for (i=0;i<=d->legend[k];i++) {
2569 
2570         x=w;
2571         y=(tot+i+1)*h+FAscent;
2572         rect.y=y-FAscent;
2573         rect.height=h;
2574 
2575         getobj(d->obj[k],"hidden",i,0,NULL,&hidden);
2576         if (hidden) XSetForeground(disp,gc,gray);
2577         else XSetForeground(disp,gc,black);
2578         if ((tot+i)==d->select) {
2579           XSetForeground(disp,gc,black);
2580           XFillRectangle(disp,win,gc,0,rect.y,74*w+h+w,rect.height);
2581           XSetForeground(disp,gc,white);
2582         }
2583 
2584         rect.x=x;
2585         rect.width=6*w;
2586         getobj(d->obj[k],"id",i,0,NULL,&cx);
2587         len=sprintf(buf,"%d",cx);
2588         ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2589         x+=6*w;
2590 
2591         rect.x=x;
2592         rect.width=10*w;
2593         len=sprintf(buf,"%s",legendlist[k]);
2594         ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2595         x+=10*w;
2596 
2597         switch (k) {
2598         case 0:
2599           getobj(d->obj[k],"points",i,0,NULL,&array);
2600           points=(int *)arraydata(array);
2601           if (arraynum(array)<2) {
2602             x0=0;
2603             y0=0;
2604           } else {
2605             x0=points[0];
2606             y0=points[1];
2607           }
2608           sgetobjfield(d->obj[k],i,"arrow",NULL,&valstr,FALSE,FALSE,FALSE);
2609           rect.x=x;
2610           rect.width=25*w;
2611           len=sprintf(buf,"points:%-6d arrow:%s",arraynum(array)/2,valstr);
2612           memfree(valstr);
2613           ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2614           x+=25*w;
2615           break;
2616         case 1:
2617         case 2:
2618           getobj(d->obj[k],"points",i,0,NULL,&array);
2619           points=(int *)arraydata(array);
2620           if (arraynum(array)<2) {
2621             x0=0;
2622             y0=0;
2623           } else {
2624             x0=points[0];
2625             y0=points[1];
2626           }
2627           rect.x=x;
2628           rect.width=25*w;
2629           len=sprintf(buf,"points:%-6d",arraynum(array)/2);
2630           ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2631           x+=25*w;
2632           break;
2633         case 3:
2634           getobj(d->obj[k],"x1",i,0,NULL,&x1);
2635           getobj(d->obj[k],"y1",i,0,NULL,&y1);
2636           x0=x1;
2637           y0=y1;
2638           getobj(d->obj[k],"x2",i,0,NULL,&x2);
2639           getobj(d->obj[k],"y2",i,0,NULL,&y2);
2640           rect.x=x;
2641           rect.width=25*w;
2642           len=sprintf(buf,"w:%-6d h:%-6d",abs(x1-x2),abs(y1-y2));
2643           ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2644           x+=25*w;
2645           break;
2646         case 4:
2647           getobj(d->obj[k],"x",i,0,NULL,&x1);
2648           getobj(d->obj[k],"y",i,0,NULL,&y1);
2649           x0=x1;
2650           y0=y1;
2651           getobj(d->obj[k],"rx",i,0,NULL,&x2);
2652           getobj(d->obj[k],"ry",i,0,NULL,&y2);
2653           rect.x=x;
2654           rect.width=25*w;
2655           len=sprintf(buf,"rx:%-6d ry:%-6d",x2,y2);
2656           ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2657           x+=25*w;
2658           break;
2659         case 5:
2660           getobj(d->obj[k],"x",i,0,NULL,&x1);
2661           getobj(d->obj[k],"y",i,0,NULL,&y1);
2662           x0=x1;
2663           y0=y1;
2664           getobj(d->obj[k],"type",i,0,NULL,&type);
2665           rect.x=x;
2666           rect.width=25*w;
2667           len=sprintf(buf,"type:%-6d",type);
2668           ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2669           x+=25*w;
2670           break;
2671         case 6:
2672           getobj(d->obj[k],"x",i,0,NULL,&x1);
2673           getobj(d->obj[k],"y",i,0,NULL,&y1);
2674           x0=x1;
2675           y0=y1;
2676           getobj(d->obj[k],"text",i,0,NULL,&text);
2677           rect.x=x;
2678           rect.width=25*w;
2679           strncpy(buf, text, 25);
2680           buf[25] = '\0';
2681           len = strlen(buf);
2682 #ifdef JAPANESE
2683 /* SJIS ---> EUC */
2684           njms2euc(buf);
2685 #endif
2686           ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2687           x+=25*w;
2688           break;
2689         }
2690         rect.x=x;
2691         rect.width=6*w;
2692         len=sprintf(buf,"%6d",x0);
2693         ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2694         x+=6*w;
2695         rect.x=x;
2696         rect.width=6*w;
2697         len=sprintf(buf,"%6d",y0);
2698         ExtTextOut(disp,win,gc,x,y,&rect,buf,len);
2699         x+=6*w;
2700         rect.x=x+w;
2701         rect.width=x+8*w;
2702         getobj(d->obj[k],"oid",i,0,NULL,&cx);
2703         len=sprintf(buf,"^%d",cx);
2704         ExtTextOut(disp,win,gc,x+w,y,&rect,buf,len);
2705         x+=8*w;
2706       }
2707       tot+=d->legend[k]+1;
2708     }
2709   XFreeGC(disp,gc);
2710 }
2711 
LegendWinEvLButtonDown(unsigned int state,TPoint point,struct LegendWin * d)2712 void LegendWinEvLButtonDown(unsigned int state,TPoint point,struct LegendWin *d)
2713 {
2714   int sel;
2715 
2716   if (menulock || globallock) return;
2717   sel=point.y/FHeight-1;
2718   if (sel!=d->select) {
2719     LegendWinUpdate(FALSE);
2720     d->select=sel;
2721   }
2722 }
2723 
LegendWinEvLButtonDblClk(unsigned int state,TPoint point,struct LegendWin * d)2724 void LegendWinEvLButtonDblClk(unsigned int state,TPoint point,struct LegendWin *d)
2725 {
2726   if (menulock || globallock) return;
2727   LegendWinLegendUpdate();
2728 }
2729 
LegendWinEvRButtonDown(unsigned int state,TPoint point,struct LegendWin * d,XButtonPressedEvent * event)2730 void LegendWinEvRButtonDown(unsigned int state,TPoint point,
2731                             struct LegendWin *d,XButtonPressedEvent *event)
2732 {
2733   int i,sel,num;
2734 
2735   if (menulock || globallock) return;
2736   sel=point.y/FHeight-1;
2737   if (sel!=d->select) {
2738     LegendWinUpdate(TRUE);
2739     d->select=sel;
2740   }
2741   sel=d->select;
2742   num=0;
2743   for (i=0;i<LEGENDNUM;i++) num+=d->legend[i]+1;
2744   if ((sel>=0) && (sel<num)) {
2745     XtSetSensitive(XtNameToWidget(d->popup,"button_0"),True);
2746     XtSetSensitive(XtNameToWidget(d->popup,"button_1"),True);
2747     XtSetSensitive(XtNameToWidget(d->popup,"button_2"),True);
2748     XtSetSensitive(XtNameToWidget(d->popup,"button_3"),True);
2749     XtSetSensitive(XtNameToWidget(d->popup,"button_4"),True);
2750     XtSetSensitive(XtNameToWidget(d->popup,"button_5"),True);
2751     XtSetSensitive(XtNameToWidget(d->popup,"button_6"),True);
2752     XtSetSensitive(XtNameToWidget(d->popup,"button_7"),True);
2753     XtSetSensitive(XtNameToWidget(d->popup,"button_8"),True);
2754     XtSetSensitive(XtNameToWidget(d->popup,"button_9"),True);
2755   } else {
2756     XtSetSensitive(XtNameToWidget(d->popup,"button_0"),False);
2757     XtSetSensitive(XtNameToWidget(d->popup,"button_1"),False);
2758     XtSetSensitive(XtNameToWidget(d->popup,"button_2"),False);
2759     XtSetSensitive(XtNameToWidget(d->popup,"button_3"),False);
2760     XtSetSensitive(XtNameToWidget(d->popup,"button_4"),False);
2761     XtSetSensitive(XtNameToWidget(d->popup,"button_5"),False);
2762     XtSetSensitive(XtNameToWidget(d->popup,"button_6"),False);
2763     XtSetSensitive(XtNameToWidget(d->popup,"button_7"),False);
2764     XtSetSensitive(XtNameToWidget(d->popup,"button_8"),False);
2765     XtSetSensitive(XtNameToWidget(d->popup,"button_9"),False);
2766   }
2767   XmMenuPosition(d->popup,event);
2768   XtManageChild(d->popup);
2769 }
2770 
2771 Time LegendWinTime=0;
2772 TPoint LegendWinPoint;
2773 
LegendWinEvButtonDown(Widget w,XtPointer client_data,XEvent * event,Boolean * dispatch)2774 void LegendWinEvButtonDown(Widget w,XtPointer client_data,XEvent *event,
2775                          Boolean *dispatch)
2776 {
2777   struct LegendWin *d;
2778   XButtonEvent *e;
2779   TPoint point;
2780   int dbl;
2781 
2782   d=(struct LegendWin *)client_data;
2783   e=(XButtonEvent *)event;
2784   point.x=e->x;
2785   point.y=e->y;
2786   if (((e->time-LegendWinTime)<menulocal.mouseclick)
2787   && (LegendWinPoint.x==point.x) && (LegendWinPoint.y==point.y)) dbl=TRUE;
2788   else dbl=FALSE;
2789   LegendWinTime=e->time;
2790   LegendWinPoint.x=point.x;
2791   LegendWinPoint.y=point.y;
2792   if (e->button==Button1) {
2793     if (dbl) LegendWinEvLButtonDblClk(e->state,point,d);
2794     else LegendWinEvLButtonDown(e->state,point,d);
2795   } else if (e->button==Button2) {
2796     LegendWinEvLButtonDown(e->state,point,d);
2797     LegendWinEvLButtonDblClk(e->state,point,d);
2798   } else if (e->button==Button3) LegendWinEvRButtonDown(e->state,point,d,e);
2799 }
2800 
LegendWinPopupMenu(Widget w,XtPointer client_data,XtPointer call_data)2801 void LegendWinPopupMenu(Widget w,XtPointer client_data,XtPointer call_data)
2802 {
2803   switch ((int )client_data) {
2804   case 0:
2805     LegendWinLegendSelect();
2806     break;
2807   case 1:
2808     LegendWinLegendUpdate();
2809     break;
2810   case 2:
2811     LegendWinLegendDelete();
2812     break;
2813   case 3:
2814     LegendWinLegendTop();
2815     break;
2816   case 4:
2817     LegendWinLegendUp();
2818     break;
2819   case 5:
2820     LegendWinLegendDown();
2821     break;
2822   case 6:
2823     LegendWinLegendLast();
2824     break;
2825   case 7:
2826     LegendWinLegendCopy();
2827     break;
2828   case 8:
2829     LegendWinLegendCopy2();
2830     break;
2831   case 9:
2832     LegendWinLegendHidden();
2833     break;
2834   }
2835 }
2836 
LegendWinEvKeyDown(Widget w,XtPointer client_data,XEvent * event,Boolean * dispatch)2837 void LegendWinEvKeyDown(Widget w,XtPointer client_data,XEvent *event,
2838                      Boolean *dispatch)
2839 {
2840   struct LegendWin *d;
2841   XKeyEvent *e;
2842   KeySym sym;
2843   int i,sel,num;
2844 
2845   if (menulock || globallock) return;
2846   d=(struct LegendWin *)client_data;
2847   e=(XKeyEvent *)event;
2848   sym=XKeycodeToKeysym(e->display,e->keycode,0);
2849   sel=d->select;
2850   num=0;
2851   for (i=0;i<LEGENDNUM;i++) num+=d->legend[i]+1;
2852   num--;
2853   switch (sym) {
2854   case XK_Down:
2855     if (e->state & ShiftMask) LegendWinLegendDown();
2856     else {
2857       if ((sel==-1) && (num>=0)) sel=0;
2858       else if (sel<num) sel++;
2859       if (sel!=d->select) {
2860         d->select=sel;
2861         LegendWinUpdate(TRUE);
2862       }
2863     }
2864     break;
2865   case XK_Up:
2866     if (e->state & ShiftMask) LegendWinLegendUp();
2867     else {
2868       if ((sel==-1) && (num>=0)) sel=num;
2869       else if (sel>0) sel--;
2870       if (sel!=d->select) {
2871         d->select=sel;
2872         LegendWinUpdate(TRUE);
2873       }
2874     }
2875     break;
2876   case XK_Delete:
2877     LegendWinLegendDelete();
2878     break;
2879   case XK_Insert:
2880     if (e->state & ShiftMask) LegendWinLegendCopy2();
2881     else LegendWinLegendCopy();
2882     break;
2883   case XK_Home:
2884     if (e->state & ShiftMask) LegendWinLegendTop();
2885     break;
2886   case XK_End:
2887     if (e->state & ShiftMask) LegendWinLegendLast();
2888     break;
2889   case XK_Return:
2890     LegendWinLegendUpdate();
2891     break;
2892   case XK_space:
2893     LegendWinLegendSelect();
2894     break;
2895   case XK_BackSpace:
2896     LegendWinLegendHidden();
2897     break;
2898   }
2899 }
2900 
LegendWindowUnmap(Widget w,XtPointer client_data,XtPointer call_data)2901 void LegendWindowUnmap(Widget w,XtPointer client_data,XtPointer call_data)
2902 {
2903   struct LegendWin *d;
2904   Position x,y,x0,y0;
2905   Dimension w0,h0;
2906 
2907   d=&(NgraphApp.LegendWin);
2908   if (d->Win!=NULL) {
2909     XtVaGetValues(d->Win,XmNx,&x,XmNy,&y,
2910                          XmNwidth,&w0,XmNheight,&h0,NULL);
2911     menulocal.legendwidth=w0;
2912     menulocal.legendheight=h0;
2913     XtTranslateCoords(TopLevel,0,0,&x0,&y0);
2914     menulocal.legendx=x-x0;
2915     menulocal.legendy=y-y0;
2916     XtDestroyWidget(d->Win);
2917     d->Win=NULL;
2918     d->text=NULL;
2919     XmToggleButtonSetState(XtNameToWidget(TopLevel,"*windowmenu.button_2"),
2920                            False,False);
2921   }
2922 }
2923 
CmLegendWindow(Widget w,XtPointer client_data,XtPointer call_data)2924 void CmLegendWindow(Widget w,XtPointer client_data,XtPointer call_data)
2925 {
2926   Arg al[20];
2927   Cardinal ac;
2928   Widget dlg,scw,clip;
2929   int i,width,height;
2930   Position x,y;
2931   struct LegendWin *d;
2932 
2933   d=&(NgraphApp.LegendWin);
2934   if (d->Win!=NULL) {
2935     XtUnmanageChild(d->Win);
2936   } else {
2937     if (menulocal.legendwidth==CW_USEDEFAULT) width=FWidth*63+2*FWidth;
2938     else width=menulocal.legendwidth;
2939     if (menulocal.legendheight==CW_USEDEFAULT) height=FHeight*10;
2940     else height=menulocal.legendheight;
2941     ac=0;
2942     XtSetArg(al[ac],XmNborderWidth,1);ac++;
2943     XtSetArg(al[ac],XmNdialogStyle,XmDIALOG_MODELESS); ac++;
2944     XtSetArg(al[ac],XmNautoUnmanage,FALSE); ac++;
2945     XtSetArg(al[ac],XmNwidth,width); ac++;
2946     XtSetArg(al[ac],XmNheight,height); ac++;
2947     if ((menulocal.legendx!=CW_USEDEFAULT)
2948     && (menulocal.legendy!=CW_USEDEFAULT)) {
2949       XtTranslateCoords(TopLevel,menulocal.legendx,menulocal.legendy,&x,&y);
2950       x-=menulocal.framex;
2951       y-=menulocal.framey;
2952       if (x<0) x=0;
2953       if (y<0) y=0;
2954       XtSetArg(al[ac],XmNdefaultPosition,False); ac++;
2955       XtSetArg(al[ac],XmNx,x); ac++;
2956       XtSetArg(al[ac],XmNy,y); ac++;
2957     } else {
2958       XtSetArg(al[ac],XmNdefaultPosition,True); ac++;
2959     }
2960     XtManageChild(dlg=XmCreateFormDialog(TopLevel,"legendwindow",al,ac));
2961     d->Win=dlg;
2962     XtAddCallback(dlg,XmNunmapCallback,LegendWindowUnmap,NULL);
2963     ac=0;
2964     XtSetArg(al[ac],XmNtopAttachment,XmATTACH_FORM); ac++;
2965     XtSetArg(al[ac],XmNbottomAttachment,XmATTACH_FORM); ac++;
2966     XtSetArg(al[ac],XmNleftAttachment,XmATTACH_FORM); ac++;
2967     XtSetArg(al[ac],XmNrightAttachment,XmATTACH_FORM); ac++;
2968     XtSetArg(al[ac],XmNalignment,XmALIGNMENT_BEGINNING); ac++;
2969     XtSetArg(al[ac],XmNscrollingPolicy,XmAUTOMATIC); ac++;
2970     XtSetArg(al[ac],XmNscrollBarDisplayPolicy,XmSTATIC); ac++;
2971     XtSetArg(al[ac],XmNwidth,width); ac++;
2972     XtSetArg(al[ac],XmNheight,height); ac++;
2973     XtSetArg(al[ac],XmNborderWidth,0);ac++;
2974     XtManageChild(scw=XmCreateScrolledWindow(dlg,NULL,al,ac));
2975     ac=0;
2976     XtSetArg(al[ac],XmNwidth,FWidth*72+2*FWidth); ac++;
2977     XtSetArg(al[ac],XmNheight,height); ac++;
2978     XtSetArg(al[ac],XmNbackground,WhitePixel(XtDisplay(TopLevel),0)); ac++;
2979     XtManageChild(d->text=XmCreateDrawingArea(scw,NULL,al,ac));
2980     XtVaGetValues(scw,XmNclipWindow,&clip,NULL);
2981     XtVaSetValues(clip,XmNbackground,WhitePixel(XtDisplay(TopLevel),0),NULL);
2982     XtAddCallback(d->text,XmNexposeCallback,LegendWinExpose,NULL);
2983     XtAddEventHandler(d->text,ButtonPressMask,False,LegendWinEvButtonDown,d);
2984     for (i=0;i<LEGENDNUM;i++) {
2985       d->obj[i]=chkobject(legendlist[i]);
2986       d->legend[i]=chkobjlastinst(d->obj[i]);
2987     }
2988     LegendWinChangeLegendNum();
2989     d->select=-1;
2990     d->popup=XmVaCreateSimplePopupMenu(d->text,"legendpopup",
2991     LegendWinPopupMenu,
2992     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
2993     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
2994     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
2995     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
2996     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
2997     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
2998     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
2999     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
3000     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
3001     XmVaPUSHBUTTON,NULL,NULL,NULL,NULL,
3002     NULL);
3003     XtAddEventHandler(d->text,KeyPressMask,False,LegendWinEvKeyDown,d);
3004     XmToggleButtonSetState(XtNameToWidget(TopLevel,"*windowmenu.button_2"),
3005                            True,False);
3006   }
3007 }
3008