Upped the version to 3.2.0
[gromacs.git] / src / ngmx / xdlghi.c
blobe1fb59b64807c6b4b75c387e9dff6b1ee7076ea5
1 /*
2 * $Id$
3 *
4 * This source code is part of
5 *
6 * G R O M A C S
7 *
8 * GROningen MAchine for Chemical Simulations
9 *
10 * VERSION 3.2.0
11 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13 * Copyright (c) 2001-2004, The GROMACS development team,
14 * check out http://www.gromacs.org for more information.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * For more info, check our website at http://www.gromacs.org
33 * And Hey:
34 * Gyas ROwers Mature At Cryogenic Speed
36 #include <assert.h>
37 #include <string.h>
39 #include "fatal.h"
40 #include "string2.h"
41 #include "sysstuff.h"
42 #include "smalloc.h"
43 #include "macros.h"
44 #include "xdlghi.h"
45 #include "fgrid.h"
47 t_dlgitem **CreateRadioButtonGroup(t_x11 *x11, char *szTitle,
48 t_id GroupID, int nrb, t_id rb[],
49 int nSelect,
50 char *szRB[], int x0,int y0)
51 /* This routine creates a radio button group at the
52 * specified position. The return values is a pointer to an
53 * array of dlgitems, the array has length (nrb+1) with the +1
54 * because of the groupbox.
55 * nSelect is the ordinal of the selected button.
58 t_dlgitem **dlgitem;
59 int x,y,w;
60 int i;
62 snew(dlgitem,nrb+1);
63 dlgitem[0]=CreateGroupBox(x11,szTitle,GroupID,nrb,rb,x0,y0,0,0,0);
64 x=x0+2*OFFS_X;
65 y=dlgitem[0]->win.y+dlgitem[0]->win.height;
66 w=0;
67 for (i=0; (i<nrb); i++) {
68 dlgitem[i+1]=CreateRadioButton(x11,szRB[i],(i==nSelect),
69 rb[i],GroupID,x,y,0,0,0);
70 y+=dlgitem[i+1]->win.height+OFFS_Y;
71 w=max(w,dlgitem[i+1]->win.width);
73 for (i=0; (i<nrb); i++)
74 dlgitem[i+1]->win.width=w;
75 dlgitem[0]->win.width=w+4*OFFS_X;
76 dlgitem[0]->win.height=y-y0;
78 return dlgitem;
81 t_dlgitem **CreateDlgitemGroup(t_x11 *x11, char *szTitle,
82 t_id GroupID, int x0, int y0,
83 int nitem, ...)
84 /* This routine creates a dlgitem group at the
85 * specified position. The return values is a pointer to an
86 * array of dlgitems, the array has length (nitem+1) with the +1
87 * because of the groupbox.
90 va_list ap;
92 t_dlgitem **dlgitem;
93 t_id *ids;
94 edlgitem edlg;
95 char *name;
96 bool bBool;
97 Pixmap pm;
98 int nlines,buflen;
99 char *buf,**lines;
100 int x,y,w,i;
102 va_start(ap,nitem);
104 snew(dlgitem,nitem+1);
105 snew(ids,nitem);
106 x=x0+2*OFFS_X;
107 dlgitem[0]=CreateGroupBox(x11,szTitle,GroupID,nitem,ids,x0,y0,0,0,0);
108 y=dlgitem[0]->win.y+dlgitem[0]->win.height;
109 w=0;
110 for (i=0; (i<nitem); i++) {
111 edlg=(edlgitem)va_arg(ap,int);
112 ids[i]=va_arg(ap,int);
113 switch (edlg) {
114 case edlgBN:
115 name=va_arg(ap,char *);
116 bBool=va_arg(ap,bool);
117 dlgitem[i+1]=CreateButton(x11,name,bBool,ids[i],GroupID,x,y,0,0,0);
118 break;
119 case edlgRB:
120 name=va_arg(ap,char *);
121 bBool=va_arg(ap,bool);
122 dlgitem[i+1]=CreateRadioButton(x11,name,bBool,ids[i],GroupID,x,y,0,0,0);
123 break;
124 case edlgCB:
125 name=va_arg(ap,char *);
126 bBool=va_arg(ap,bool);
127 dlgitem[i+1]=CreateCheckBox(x11,name,bBool,ids[i],GroupID,x,y,0,0,0);
128 break;
129 case edlgPM:
130 pm=va_arg(ap,Pixmap);
131 dlgitem[i+1]=CreatePixmap(x11,pm,ids[i],GroupID,x,y,0,0,0);
132 break;
133 case edlgST:
134 nlines=va_arg(ap,int);
135 lines=va_arg(ap,char **);
136 dlgitem[i+1]=CreateStaticText(x11,nlines,lines,ids[i],GroupID,
137 x,y,0,0,0);
138 break;
139 case edlgET:
140 name=va_arg(ap,char *);
141 buflen=va_arg(ap,int);
142 buf=va_arg(ap,char *);
143 dlgitem[i+1]=CreateEditText(x11,name,buflen,buf,ids[i],
144 GroupID,x,y,0,0,0);
145 break;
146 case edlgGB:
147 default:
148 fatal_error(0,"Invalid dlgitem type: %d\n",edlg);
150 y+=dlgitem[i+1]->win.height+OFFS_Y;
151 w=max(w,dlgitem[i+1]->win.width);
153 va_end(ap);
154 sfree(dlgitem[0]->u.groupbox.item);
155 sfree(dlgitem[0]->win.text);
156 dlgitem[0]=CreateGroupBox(x11,szTitle,GroupID,nitem,ids,x0,y0,0,0,0);
157 for (i=0; (i<nitem); i++)
158 dlgitem[i+1]->win.width=w;
159 dlgitem[0]->win.width=w+4*OFFS_X;
160 dlgitem[0]->win.height=y-y0;
161 return dlgitem;
164 static void AddDlgItemGroups(t_dlg *dlg, int gridx, int gridy,
165 t_dlgitemlist **grid, bool bAutoPosition)
167 t_dlgitemlist *item;
168 int x1,y1,w1,h1;
169 int x,y,dw,dh;
170 float w,h;
172 w=h=0;
173 for(x=0; (x<gridx); x++)
174 for(y=0; (y<gridy); y++) {
175 item=&(grid[x][y]);
176 if (item->nitem) {
177 if (!item->list) {
178 printf("Error: empty list with non-empty nitem (%d)\n",item->nitem);
179 printf(" at grid point: %d,%d\n",x,y);
180 printf(" with size: %dx%d\n",item->w,item->h);
181 exit(1);
183 else {
184 AddDlgItems(dlg,item->nitem,item->list);
185 dw=item->w;
186 dh=item->h;
187 w=max(w,((float) QueryDlgItemW(dlg,item->list[0]->ID))/dw);
188 h=max(h,((float) QueryDlgItemH(dlg,item->list[0]->ID))/dh);
192 w1=gridx*w;
193 h1=gridy*h;
194 SetDlgSize(dlg,w1,h1,bAutoPosition);
195 #ifdef DEBUG
196 printf("Dimensions of grid cell: %8.3f x %8.3f\n",w,h);
197 printf("Dimensions of window: %d x %d\n",w1,h1);
198 #endif
200 for(x=0; (x<gridx); x++)
201 for(y=0; (y<gridy); y++) {
202 item=&(grid[x][y]);
203 if (item->nitem) {
204 x1=x*w;
205 y1=y*h;
206 w1=item->w*w;
207 h1=item->h*h;
208 #ifdef DEBUG
209 printf("New size: %d x %d at %d, %d\n",w1,h1,x1,y1);
210 #endif
211 SetDlgItemSize(dlg,item->list[0]->ID,w1,h1);
212 SetDlgItemPos(dlg,item->list[0]->ID,x1,y1);
217 static t_dlgitemlist **NewDlgitemList(int w, int h)
219 int i,j;
220 t_dlgitemlist **grid;
222 snew(grid,w);
223 for(i=0; (i<w); i++) {
224 snew(grid[i],h);
225 for (j=0; (j<h); j++) {
226 grid[i][j].nitem=0;
227 grid[i][j].list=NULL;
230 return grid;
233 static void AddListItem(t_dlgitemlist *list, t_dlgitem *item)
235 srenew(list->list,++list->nitem);
236 list->list[list->nitem-1]=item;
239 static void AddListFItem(t_x11 *x11, t_dlgitemlist *list,
240 t_fitem *fitem, t_id GroupID, t_id *ID,
241 int x, int *y, int *w,bool bUseMon)
243 int i,iSel,slen;
244 char buf[STRLEN];
246 switch(fitem->edlg) {
247 case edlgBN:
248 AddListItem
249 (list,CreateButton(x11,fitem->name[0],fitem->bDef,(*ID)++,GroupID,
250 x,(*y),0,0,0));
251 break;
252 case edlgRB:
253 strcpy(buf,fitem->def);
254 iSel=-1;
255 for (i=0; (i<fitem->nname); i++) {
256 char buf2[100];
258 strcpy(buf2,fitem->name[i]);
259 buf2[strlen(buf)]='\0'; /* truncate itemname */
260 if (strcasecmp(buf2,buf)==0)
261 iSel=i;
264 for(i=0; (i<fitem->nname); i++) {
265 AddListItem(list,
266 CreateRadioButton(x11,fitem->name[i],(iSel==i),
267 (*ID)++,GroupID,x,(*y),0,0,0));
268 (*y)+=list->list[list->nitem-1]->win.height+OFFS_Y;
269 (*w)=max((*w),list->list[list->nitem-1]->win.width);
270 SetDlgitemOpts(list->list[list->nitem-1],bUseMon,
271 fitem->set,fitem->get,fitem->help);
273 break;
274 case edlgCB: {
275 bool bCheck;
277 bCheck=strcasecmp(fitem->def,"TRUE")==0;
278 AddListItem(list,CreateCheckBox(x11,fitem->name[0],bCheck,
279 (*ID)++,GroupID,x,(*y),0,0,0));
280 break;
282 case edlgST:
283 AddListItem(list,
284 CreateStaticText(x11,fitem->nname,fitem->name,(*ID)++,
285 GroupID,x,(*y),0,0,0));
286 break;
287 case edlgET:
288 slen=strlen(fitem->name[0])+strlen(fitem->def);
289 AddListItem(list,CreateEditText(x11,fitem->name[0],slen,fitem->def,
290 (*ID)++,GroupID,x,(*y),0,0,0));
291 break;
292 case edlgPM:
293 case edlgGB:
294 default:
295 fatal_error(0,"Invalid list->list type: %d\n",fitem->edlg);
297 SetDlgitemOpts(list->list[list->nitem-1],bUseMon,
298 fitem->set,fitem->get,fitem->help);
300 if (fitem->edlg != edlgRB) {
301 (*y)+=list->list[list->nitem-1]->win.height+OFFS_Y;
302 (*w)=max((*w),list->list[list->nitem-1]->win.width);
306 static void AddListFGroup(t_x11 *x11, t_dlgitemlist **grid,
307 t_fgroup *fgroup, t_id *ID,bool bUseMon)
309 int i;
310 t_id GroupID,*ids;
311 t_dlgitemlist *item;
312 int x,y,w;
314 GroupID=(*ID)++;
315 item=&(grid[fgroup->x][fgroup->y]);
316 AddListItem(item,CreateGroupBox(x11,fgroup->name,GroupID,
317 0,NULL,0,0,0,0,0));
318 x=2*OFFS_X;
319 y=item->list[0]->win.y+item->list[0]->win.height;
320 w=0;
321 for(i=0; (i<fgroup->nfitem); i++)
322 AddListFItem(x11,item,fgroup->fitem[i],GroupID,ID,x,&y,&w,bUseMon);
324 w=max(w,item->list[0]->win.width+4*OFFS_X);
325 sfree(item->list[0]->u.groupbox.item);
326 sfree(item->list[0]->win.text);
327 snew(ids,item->nitem);
328 for(i=0; (i<item->nitem-1); i++)
329 ids[i]=GroupID+i+1;
330 item->list[0]=
331 CreateGroupBox(x11,fgroup->name,GroupID,item->nitem-1,ids,
332 2*OFFS_X,2*OFFS_Y,w+2*OFFS_X,y,0);
333 sfree(ids);
334 item->w=fgroup->w;
335 item->h=fgroup->h;
338 static void AddListFSimple(t_x11 *x11, t_dlgitemlist **grid,
339 t_fsimple *fsimple, t_id *ID,bool bUseMon)
341 t_dlgitemlist *item;
342 int x,y,w;
344 item=&(grid[fsimple->x][fsimple->y]);
345 x=0;
346 y=0;
347 w=0;
348 AddListFItem(x11,item,fsimple->fitem,*ID,ID,x,&y,&w,bUseMon);
349 item->w=fsimple->w;
350 item->h=fsimple->h;
353 t_dlg *ReadDlg(t_x11 *x11,Window Parent, char *title,
354 unsigned long fg, unsigned long bg, char *infile,
355 int x0, int y0, bool bAutoPosition,bool bUseMon,
356 DlgCallback *cb,void *data)
358 t_fgrid *fgrid;
359 t_dlgitemlist **grid;
360 t_dlg *dlg;
361 int i;
362 t_id ID;
364 fgrid=FGridFromFile(infile);
365 dlg=CreateDlg(x11,Parent,title,x0,y0,0,0,0,fg,bg,cb,data);
366 grid=NewDlgitemList(fgrid->w,fgrid->h);
367 ID=0;
369 for(i=0; (i<fgrid->nfgroup); i++)
370 AddListFGroup(x11,grid,fgrid->fgroup[i],&ID,bUseMon);
371 for(i=0; (i<fgrid->nfsimple); i++)
372 AddListFSimple(x11,grid,fgrid->fsimple[i],&ID,bUseMon);
373 AddDlgItemGroups(dlg,fgrid->w,fgrid->h,grid,bAutoPosition);
375 DoneFGrid(fgrid);
377 return dlg;