2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team,
6 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
44 #include "gmx_fatal.h"
52 t_dlgitem **CreateRadioButtonGroup(t_x11 *x11, char *szTitle,
53 t_id GroupID, int nrb, t_id rb[],
55 char *szRB[], int x0,int y0)
56 /* This routine creates a radio button group at the
57 * specified position. The return values is a pointer to an
58 * array of dlgitems, the array has length (nrb+1) with the +1
59 * because of the groupbox.
60 * nSelect is the ordinal of the selected button.
68 dlgitem[0]=CreateGroupBox(x11,szTitle,GroupID,nrb,rb,x0,y0,0,0,0);
70 y=dlgitem[0]->win.y+dlgitem[0]->win.height;
72 for (i=0; (i<nrb); i++) {
73 dlgitem[i+1]=CreateRadioButton(x11,szRB[i],(i==nSelect),
74 rb[i],GroupID,x,y,0,0,0);
75 y+=dlgitem[i+1]->win.height+OFFS_Y;
76 w=max(w,dlgitem[i+1]->win.width);
78 for (i=0; (i<nrb); i++)
79 dlgitem[i+1]->win.width=w;
80 dlgitem[0]->win.width=w+4*OFFS_X;
81 dlgitem[0]->win.height=y-y0;
86 t_dlgitem **CreateDlgitemGroup(t_x11 *x11, const char *szTitle,
87 t_id GroupID, int x0, int y0,
89 /* This routine creates a dlgitem group at the
90 * specified position. The return values is a pointer to an
91 * array of dlgitems, the array has length (nitem+1) with the +1
92 * because of the groupbox.
109 snew(dlgitem,nitem+1);
112 dlgitem[0]=CreateGroupBox(x11,szTitle,GroupID,nitem,ids,x0,y0,0,0,0);
113 y=dlgitem[0]->win.y+dlgitem[0]->win.height;
115 for (i=0; (i<nitem); i++) {
116 edlg=(edlgitem)va_arg(ap,int);
117 ids[i]=va_arg(ap,int);
120 name=va_arg(ap,char *);
121 bBool=va_arg(ap,int);
122 dlgitem[i+1]=CreateButton(x11,name,bBool,ids[i],GroupID,x,y,0,0,0);
125 name=va_arg(ap,char *);
126 bBool=va_arg(ap,int);
127 dlgitem[i+1]=CreateRadioButton(x11,name,bBool,ids[i],GroupID,x,y,0,0,0);
130 name=va_arg(ap,char *);
131 bBool=va_arg(ap,int);
132 dlgitem[i+1]=CreateCheckBox(x11,name,bBool,ids[i],GroupID,x,y,0,0,0);
135 pm=va_arg(ap,Pixmap);
136 dlgitem[i+1]=CreatePixmap(x11,pm,ids[i],GroupID,x,y,0,0,0);
139 nlines=va_arg(ap,int);
140 lines=va_arg(ap,char **);
141 dlgitem[i+1]=CreateStaticText(x11,nlines,lines,ids[i],GroupID,
145 name=va_arg(ap,char *);
146 buflen=va_arg(ap,int);
147 buf=va_arg(ap,char *);
148 dlgitem[i+1]=CreateEditText(x11,name,buflen,buf,ids[i],
153 gmx_fatal(FARGS,"Invalid dlgitem type: %d\n",edlg);
155 y+=dlgitem[i+1]->win.height+OFFS_Y;
156 w=max(w,dlgitem[i+1]->win.width);
159 sfree(dlgitem[0]->u.groupbox.item);
160 sfree(dlgitem[0]->win.text);
161 dlgitem[0]=CreateGroupBox(x11,szTitle,GroupID,nitem,ids,x0,y0,0,0,0);
162 for (i=0; (i<nitem); i++)
163 dlgitem[i+1]->win.width=w;
164 dlgitem[0]->win.width=w+4*OFFS_X;
165 dlgitem[0]->win.height=y-y0;
169 static void AddDlgItemGroups(t_dlg *dlg, int gridx, int gridy,
170 t_dlgitemlist **grid, gmx_bool bAutoPosition)
178 for(x=0; (x<gridx); x++)
179 for(y=0; (y<gridy); y++) {
183 printf("Error: empty list with non-empty nitem (%d)\n",item->nitem);
184 printf(" at grid point: %d,%d\n",x,y);
185 printf(" with size: %dx%d\n",item->w,item->h);
189 AddDlgItems(dlg,item->nitem,item->list);
192 w=max(w,((float) QueryDlgItemW(dlg,item->list[0]->ID))/dw);
193 h=max(h,((float) QueryDlgItemH(dlg,item->list[0]->ID))/dh);
199 SetDlgSize(dlg,w1,h1,bAutoPosition);
201 printf("Dimensions of grid cell: %8.3f x %8.3f\n",w,h);
202 printf("Dimensions of window: %d x %d\n",w1,h1);
205 for(x=0; (x<gridx); x++)
206 for(y=0; (y<gridy); y++) {
214 printf("New size: %d x %d at %d, %d\n",w1,h1,x1,y1);
216 SetDlgItemSize(dlg,item->list[0]->ID,w1,h1);
217 SetDlgItemPos(dlg,item->list[0]->ID,x1,y1);
222 static t_dlgitemlist **NewDlgitemList(int w, int h)
225 t_dlgitemlist **grid;
228 for(i=0; (i<w); i++) {
230 for (j=0; (j<h); j++) {
232 grid[i][j].list=NULL;
238 static void AddListItem(t_dlgitemlist *list, t_dlgitem *item)
240 srenew(list->list,++list->nitem);
241 list->list[list->nitem-1]=item;
244 static void AddListFItem(t_x11 *x11, t_dlgitemlist *list,
245 t_fitem *fitem, t_id GroupID, t_id *ID,
246 int x, int *y, int *w,gmx_bool bUseMon)
251 switch(fitem->edlg) {
254 (list,CreateButton(x11,fitem->name[0],fitem->bDef,(*ID)++,GroupID,
258 strcpy(buf,fitem->def);
260 for (i=0; (i<fitem->nname); i++) {
263 strcpy(buf2,fitem->name[i]);
264 buf2[strlen(buf)]='\0'; /* truncate itemname */
265 if (gmx_strcasecmp(buf2,buf)==0)
269 for(i=0; (i<fitem->nname); i++) {
271 CreateRadioButton(x11,fitem->name[i],(iSel==i),
272 (*ID)++,GroupID,x,(*y),0,0,0));
273 (*y)+=list->list[list->nitem-1]->win.height+OFFS_Y;
274 (*w)=max((*w),list->list[list->nitem-1]->win.width);
275 SetDlgitemOpts(list->list[list->nitem-1],bUseMon,
276 fitem->set,fitem->get,fitem->help);
282 bCheck=gmx_strcasecmp(fitem->def,"TRUE")==0;
283 AddListItem(list,CreateCheckBox(x11,fitem->name[0],bCheck,
284 (*ID)++,GroupID,x,(*y),0,0,0));
289 CreateStaticText(x11,fitem->nname,fitem->name,(*ID)++,
290 GroupID,x,(*y),0,0,0));
293 slen=strlen(fitem->name[0])+strlen(fitem->def);
294 AddListItem(list,CreateEditText(x11,fitem->name[0],slen,fitem->def,
295 (*ID)++,GroupID,x,(*y),0,0,0));
300 gmx_fatal(FARGS,"Invalid list->list type: %d\n",fitem->edlg);
302 SetDlgitemOpts(list->list[list->nitem-1],bUseMon,
303 fitem->set,fitem->get,fitem->help);
305 if (fitem->edlg != edlgRB) {
306 (*y)+=list->list[list->nitem-1]->win.height+OFFS_Y;
307 (*w)=max((*w),list->list[list->nitem-1]->win.width);
311 static void AddListFGroup(t_x11 *x11, t_dlgitemlist **grid,
312 t_fgroup *fgroup, t_id *ID,gmx_bool bUseMon)
320 item=&(grid[fgroup->x][fgroup->y]);
321 AddListItem(item,CreateGroupBox(x11,fgroup->name,GroupID,
324 y=item->list[0]->win.y+item->list[0]->win.height;
326 for(i=0; (i<fgroup->nfitem); i++)
327 AddListFItem(x11,item,fgroup->fitem[i],GroupID,ID,x,&y,&w,bUseMon);
329 w=max(w,item->list[0]->win.width+4*OFFS_X);
330 sfree(item->list[0]->u.groupbox.item);
331 sfree(item->list[0]->win.text);
332 snew(ids,item->nitem);
333 for(i=0; (i<item->nitem-1); i++)
336 CreateGroupBox(x11,fgroup->name,GroupID,item->nitem-1,ids,
337 2*OFFS_X,2*OFFS_Y,w+2*OFFS_X,y,0);
343 static void AddListFSimple(t_x11 *x11, t_dlgitemlist **grid,
344 t_fsimple *fsimple, t_id *ID,gmx_bool bUseMon)
349 item=&(grid[fsimple->x][fsimple->y]);
353 AddListFItem(x11,item,fsimple->fitem,*ID,ID,x,&y,&w,bUseMon);
358 t_dlg *ReadDlg(t_x11 *x11,Window Parent, const char *title,
359 unsigned long fg, unsigned long bg, const char *infile,
360 int x0, int y0, gmx_bool bAutoPosition,gmx_bool bUseMon,
361 DlgCallback *cb,void *data)
364 t_dlgitemlist **grid;
369 fgrid=FGridFromFile(infile);
370 dlg=CreateDlg(x11,Parent,title,x0,y0,0,0,0,fg,bg,cb,data);
371 grid=NewDlgitemList(fgrid->w,fgrid->h);
374 for(i=0; (i<fgrid->nfgroup); i++)
375 AddListFGroup(x11,grid,fgrid->fgroup[i],&ID,bUseMon);
376 for(i=0; (i<fgrid->nfsimple); i++)
377 AddListFSimple(x11,grid,fgrid->fsimple[i],&ID,bUseMon);
378 AddDlgItemGroups(dlg,fgrid->w,fgrid->h,grid,bAutoPosition);