3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * Gyas ROwers Mature At Cryogenic Speed
41 #include "gmx_fatal.h"
49 t_dlgitem **CreateRadioButtonGroup(t_x11 *x11, char *szTitle,
50 t_id GroupID, int nrb, t_id rb[],
52 char *szRB[], int x0, int y0)
53 /* This routine creates a radio button group at the
54 * specified position. The return values is a pointer to an
55 * array of dlgitems, the array has length (nrb+1) with the +1
56 * because of the groupbox.
57 * nSelect is the ordinal of the selected button.
65 dlgitem[0] = CreateGroupBox(x11, szTitle, GroupID, nrb, rb, x0, y0, 0, 0, 0);
67 y = dlgitem[0]->win.y+dlgitem[0]->win.height;
69 for (i = 0; (i < nrb); i++)
71 dlgitem[i+1] = CreateRadioButton(x11, szRB[i], (i == nSelect),
72 rb[i], GroupID, x, y, 0, 0, 0);
73 y += dlgitem[i+1]->win.height+OFFS_Y;
74 w = max(w, dlgitem[i+1]->win.width);
76 for (i = 0; (i < nrb); i++)
78 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++)
117 edlg = (edlgitem)va_arg(ap, int);
118 ids[i] = va_arg(ap, int);
122 name = va_arg(ap, char *);
123 bBool = va_arg(ap, int);
124 dlgitem[i+1] = CreateButton(x11, name, bBool, ids[i], GroupID, x, y, 0, 0, 0);
127 name = va_arg(ap, char *);
128 bBool = va_arg(ap, int);
129 dlgitem[i+1] = CreateRadioButton(x11, name, bBool, ids[i], GroupID, x, y, 0, 0, 0);
132 name = va_arg(ap, char *);
133 bBool = va_arg(ap, int);
134 dlgitem[i+1] = CreateCheckBox(x11, name, bBool, ids[i], GroupID, x, y, 0, 0, 0);
137 pm = va_arg(ap, Pixmap);
138 dlgitem[i+1] = CreatePixmap(x11, pm, ids[i], GroupID, x, y, 0, 0, 0);
141 nlines = va_arg(ap, int);
142 lines = va_arg(ap, char **);
143 dlgitem[i+1] = CreateStaticText(x11, nlines, lines, ids[i], GroupID,
147 name = va_arg(ap, char *);
148 buflen = va_arg(ap, int);
149 buf = va_arg(ap, char *);
150 dlgitem[i+1] = CreateEditText(x11, name, buflen, buf, ids[i],
151 GroupID, x, y, 0, 0, 0);
155 gmx_fatal(FARGS, "Invalid dlgitem type: %d\n", edlg);
157 y += dlgitem[i+1]->win.height+OFFS_Y;
158 w = max(w, dlgitem[i+1]->win.width);
161 sfree(dlgitem[0]->u.groupbox.item);
162 sfree(dlgitem[0]->win.text);
163 dlgitem[0] = CreateGroupBox(x11, szTitle, GroupID, nitem, ids, x0, y0, 0, 0, 0);
164 for (i = 0; (i < nitem); i++)
166 dlgitem[i+1]->win.width = w;
168 dlgitem[0]->win.width = w+4*OFFS_X;
169 dlgitem[0]->win.height = y-y0;
173 static void AddDlgItemGroups(t_dlg *dlg, int gridx, int gridy,
174 t_dlgitemlist **grid, gmx_bool bAutoPosition)
182 for (x = 0; (x < gridx); x++)
184 for (y = 0; (y < gridy); y++)
186 item = &(grid[x][y]);
191 printf("Error: empty list with non-empty nitem (%d)\n", item->nitem);
192 printf(" at grid point: %d,%d\n", x, y);
193 printf(" with size: %dx%d\n", item->w, item->h);
198 AddDlgItems(dlg, item->nitem, item->list);
201 w = max(w, ((float) QueryDlgItemW(dlg, item->list[0]->ID))/dw);
202 h = max(h, ((float) QueryDlgItemH(dlg, item->list[0]->ID))/dh);
209 SetDlgSize(dlg, w1, h1, bAutoPosition);
211 printf("Dimensions of grid cell: %8.3f x %8.3f\n", w, h);
212 printf("Dimensions of window: %d x %d\n", w1, h1);
215 for (x = 0; (x < gridx); x++)
217 for (y = 0; (y < gridy); y++)
219 item = &(grid[x][y]);
227 printf("New size: %d x %d at %d, %d\n", w1, h1, x1, y1);
229 SetDlgItemSize(dlg, item->list[0]->ID, w1, h1);
230 SetDlgItemPos(dlg, item->list[0]->ID, x1, y1);
236 static t_dlgitemlist **NewDlgitemList(int w, int h)
239 t_dlgitemlist **grid;
242 for (i = 0; (i < w); i++)
245 for (j = 0; (j < h); j++)
247 grid[i][j].nitem = 0;
248 grid[i][j].list = NULL;
254 static void AddListItem(t_dlgitemlist *list, t_dlgitem *item)
256 srenew(list->list, ++list->nitem);
257 list->list[list->nitem-1] = item;
260 static void AddListFItem(t_x11 *x11, t_dlgitemlist *list,
261 t_fitem *fitem, t_id GroupID, t_id *ID,
262 int x, int *y, int *w, gmx_bool bUseMon)
271 (list, CreateButton(x11, fitem->name[0], fitem->bDef, (*ID)++, GroupID,
275 strcpy(buf, fitem->def);
277 for (i = 0; (i < fitem->nname); i++)
281 strcpy(buf2, fitem->name[i]);
282 buf2[strlen(buf)] = '\0'; /* truncate itemname */
283 if (gmx_strcasecmp(buf2, buf) == 0)
289 for (i = 0; (i < fitem->nname); i++)
292 CreateRadioButton(x11, fitem->name[i], (iSel == i),
293 (*ID)++, GroupID, x, (*y), 0, 0, 0));
294 (*y) += list->list[list->nitem-1]->win.height+OFFS_Y;
295 (*w) = max((*w), list->list[list->nitem-1]->win.width);
296 SetDlgitemOpts(list->list[list->nitem-1], bUseMon,
297 fitem->set, fitem->get, fitem->help);
304 bCheck = gmx_strcasecmp(fitem->def, "TRUE") == 0;
305 AddListItem(list, CreateCheckBox(x11, fitem->name[0], bCheck,
306 (*ID)++, GroupID, x, (*y), 0, 0, 0));
311 CreateStaticText(x11, fitem->nname, fitem->name, (*ID)++,
312 GroupID, x, (*y), 0, 0, 0));
315 slen = strlen(fitem->name[0])+strlen(fitem->def);
316 AddListItem(list, CreateEditText(x11, fitem->name[0], slen, fitem->def,
317 (*ID)++, GroupID, x, (*y), 0, 0, 0));
322 gmx_fatal(FARGS, "Invalid list->list type: %d\n", fitem->edlg);
324 SetDlgitemOpts(list->list[list->nitem-1], bUseMon,
325 fitem->set, fitem->get, fitem->help);
327 if (fitem->edlg != edlgRB)
329 (*y) += list->list[list->nitem-1]->win.height+OFFS_Y;
330 (*w) = max((*w), list->list[list->nitem-1]->win.width);
334 static void AddListFGroup(t_x11 *x11, t_dlgitemlist **grid,
335 t_fgroup *fgroup, t_id *ID, gmx_bool bUseMon)
343 item = &(grid[fgroup->x][fgroup->y]);
344 AddListItem(item, CreateGroupBox(x11, fgroup->name, GroupID,
345 0, NULL, 0, 0, 0, 0, 0));
347 y = item->list[0]->win.y+item->list[0]->win.height;
349 for (i = 0; (i < fgroup->nfitem); i++)
351 AddListFItem(x11, item, fgroup->fitem[i], GroupID, ID, x, &y, &w, bUseMon);
354 w = max(w, item->list[0]->win.width+4*OFFS_X);
355 sfree(item->list[0]->u.groupbox.item);
356 sfree(item->list[0]->win.text);
357 snew(ids, item->nitem);
358 for (i = 0; (i < item->nitem-1); i++)
360 ids[i] = GroupID+i+1;
363 CreateGroupBox(x11, fgroup->name, GroupID, item->nitem-1, ids,
364 2*OFFS_X, 2*OFFS_Y, w+2*OFFS_X, y, 0);
370 static void AddListFSimple(t_x11 *x11, t_dlgitemlist **grid,
371 t_fsimple *fsimple, t_id *ID, gmx_bool bUseMon)
376 item = &(grid[fsimple->x][fsimple->y]);
380 AddListFItem(x11, item, fsimple->fitem, *ID, ID, x, &y, &w, bUseMon);
381 item->w = fsimple->w;
382 item->h = fsimple->h;
385 t_dlg *ReadDlg(t_x11 *x11, Window Parent, const char *title,
386 unsigned long fg, unsigned long bg, const char *infile,
387 int x0, int y0, gmx_bool bAutoPosition, gmx_bool bUseMon,
388 DlgCallback *cb, void *data)
391 t_dlgitemlist **grid;
396 fgrid = FGridFromFile(infile);
397 dlg = CreateDlg(x11, Parent, title, x0, y0, 0, 0, 0, fg, bg, cb, data);
398 grid = NewDlgitemList(fgrid->w, fgrid->h);
401 for (i = 0; (i < fgrid->nfgroup); i++)
403 AddListFGroup(x11, grid, fgrid->fgroup[i], &ID, bUseMon);
405 for (i = 0; (i < fgrid->nfsimple); i++)
407 AddListFSimple(x11, grid, fgrid->fsimple[i], &ID, bUseMon);
409 AddDlgItemGroups(dlg, fgrid->w, fgrid->h, grid, bAutoPosition);