4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
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
34 * Gyas ROwers Mature At Cryogenic Speed
47 t_dlgitem
**CreateRadioButtonGroup(t_x11
*x11
, char *szTitle
,
48 t_id GroupID
, int nrb
, t_id rb
[],
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.
63 dlgitem
[0]=CreateGroupBox(x11
,szTitle
,GroupID
,nrb
,rb
,x0
,y0
,0,0,0);
65 y
=dlgitem
[0]->win
.y
+dlgitem
[0]->win
.height
;
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
;
81 t_dlgitem
**CreateDlgitemGroup(t_x11
*x11
, char *szTitle
,
82 t_id GroupID
, int x0
, int y0
,
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.
104 snew(dlgitem
,nitem
+1);
107 dlgitem
[0]=CreateGroupBox(x11
,szTitle
,GroupID
,nitem
,ids
,x0
,y0
,0,0,0);
108 y
=dlgitem
[0]->win
.y
+dlgitem
[0]->win
.height
;
110 for (i
=0; (i
<nitem
); i
++) {
111 edlg
=(edlgitem
)va_arg(ap
,int);
112 ids
[i
]=va_arg(ap
,int);
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);
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);
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);
130 pm
=va_arg(ap
,Pixmap
);
131 dlgitem
[i
+1]=CreatePixmap(x11
,pm
,ids
[i
],GroupID
,x
,y
,0,0,0);
134 nlines
=va_arg(ap
,int);
135 lines
=va_arg(ap
,char **);
136 dlgitem
[i
+1]=CreateStaticText(x11
,nlines
,lines
,ids
[i
],GroupID
,
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
],
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
);
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
;
164 static void AddDlgItemGroups(t_dlg
*dlg
, int gridx
, int gridy
,
165 t_dlgitemlist
**grid
, bool bAutoPosition
)
173 for(x
=0; (x
<gridx
); x
++)
174 for(y
=0; (y
<gridy
); y
++) {
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
);
184 AddDlgItems(dlg
,item
->nitem
,item
->list
);
187 w
=max(w
,((float) QueryDlgItemW(dlg
,item
->list
[0]->ID
))/dw
);
188 h
=max(h
,((float) QueryDlgItemH(dlg
,item
->list
[0]->ID
))/dh
);
194 SetDlgSize(dlg
,w1
,h1
,bAutoPosition
);
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
);
200 for(x
=0; (x
<gridx
); x
++)
201 for(y
=0; (y
<gridy
); y
++) {
209 printf("New size: %d x %d at %d, %d\n",w1
,h1
,x1
,y1
);
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
)
220 t_dlgitemlist
**grid
;
223 for(i
=0; (i
<w
); i
++) {
225 for (j
=0; (j
<h
); j
++) {
227 grid
[i
][j
].list
=NULL
;
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
)
246 switch(fitem
->edlg
) {
249 (list
,CreateButton(x11
,fitem
->name
[0],fitem
->bDef
,(*ID
)++,GroupID
,
253 strcpy(buf
,fitem
->def
);
255 for (i
=0; (i
<fitem
->nname
); i
++) {
258 strcpy(buf2
,fitem
->name
[i
]);
259 buf2
[strlen(buf
)]='\0'; /* truncate itemname */
260 if (strcasecmp(buf2
,buf
)==0)
264 for(i
=0; (i
<fitem
->nname
); i
++) {
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
);
277 bCheck
=strcasecmp(fitem
->def
,"TRUE")==0;
278 AddListItem(list
,CreateCheckBox(x11
,fitem
->name
[0],bCheck
,
279 (*ID
)++,GroupID
,x
,(*y
),0,0,0));
284 CreateStaticText(x11
,fitem
->nname
,fitem
->name
,(*ID
)++,
285 GroupID
,x
,(*y
),0,0,0));
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));
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
)
315 item
=&(grid
[fgroup
->x
][fgroup
->y
]);
316 AddListItem(item
,CreateGroupBox(x11
,fgroup
->name
,GroupID
,
319 y
=item
->list
[0]->win
.y
+item
->list
[0]->win
.height
;
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
++)
331 CreateGroupBox(x11
,fgroup
->name
,GroupID
,item
->nitem
-1,ids
,
332 2*OFFS_X
,2*OFFS_Y
,w
+2*OFFS_X
,y
,0);
338 static void AddListFSimple(t_x11
*x11
, t_dlgitemlist
**grid
,
339 t_fsimple
*fsimple
, t_id
*ID
,bool bUseMon
)
344 item
=&(grid
[fsimple
->x
][fsimple
->y
]);
348 AddListFItem(x11
,item
,fsimple
->fitem
,*ID
,ID
,x
,&y
,&w
,bUseMon
);
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
)
359 t_dlgitemlist
**grid
;
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
);
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
);