Update copyright statements and change license to LGPL
[alexxy/gromacs.git] / src / ngmx / xstat.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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.
11  *
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.
16  *
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.
21  *
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.
26  *
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.
34  *
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.
37  */
38 #ifdef HAVE_CONFIG_H
39 #include <config.h>
40 #endif
41
42 #include "sysstuff.h"
43 #include "smalloc.h"
44 #include "x11.h"
45 #include "string2.h"
46 #include "macros.h"
47 #include "fgrid.h"
48 #include "futil.h"
49 #include "xdlg.h"
50 #include "xdlghi.h"
51
52 typedef struct {
53   int     nopt,nAppl;
54   char  **name;
55   char  **description;
56   char  **dlgfile;
57   t_dlg  *dlg;
58   t_dlg  *appl;
59 } t_data;
60
61 static void ApplCallback(t_x11 *x11,int dlg_mess,int item_id,
62                          char *set,void *dta)
63 {
64   t_data    *data;
65   t_dlg     *dlg;
66   t_dlgitem *item;
67   int       i;
68   char      doit[1024];
69
70   data=(t_data *)dta;
71   dlg=data->appl;
72
73   fprintf(stderr,"item_id: %d (%s)\n",item_id,set);
74   if (gmx_strcasecmp(set,"OK") == 0) {
75     /* Doit */
76     sprintf(doit,
77             "xterm -geometry +100+100 -n %s"
78             " -title \"GROMACS: %s\" -e nice %s ",
79             data->name[data->nAppl],
80             data->name[data->nAppl],
81             data->name[data->nAppl]);
82     for(i=0; (i<dlg->nitem); i++) {
83       item=dlg->dlgitem[i];
84       switch (item->type) {
85       case edlgRB:
86         strcat(doit,item->set);
87         strcat(doit," ");
88         break;
89       case edlgCB:
90         if (item->u.checkbox.bChecked)
91           strcat(doit,item->set);
92         strcat(doit," ");
93         break;
94       case edlgET:
95         if (strlen(item->u.edittext.buf) > 0) {
96           strcat(doit,item->set);
97           strcat(doit," ");
98           strcat(doit,item->u.edittext.buf);
99           strcat(doit," ");
100         }
101         break;
102       default:
103         fprintf(stderr,"Type: %d\n",item->type);
104       }
105     }
106     strcat(doit," &");
107     fprintf(stderr,"Going to exec: '%s'\n",doit);
108
109 #ifdef GMX_NO_SYSTEM
110     printf("Warning-- No calls to system(3) supported on this platform.");
111     printf("Warning-- Skipping execution of 'system(\"%s\")'.", buf);
112 #else
113     system(doit);
114 #endif
115
116     HideDlg(data->appl);
117   }
118   else if (gmx_strcasecmp(set,"Cancel") == 0) {
119     data->nAppl = -1;
120     HideDlg(data->appl);
121   }
122
123
124 static void Callback(t_x11 *x11,int dlg_mess,int item_id,
125                      char *set,void *dta)
126 {
127   t_data *data=(t_data *)dta;
128
129   if (item_id == data->nopt)  {
130     fprintf(stderr,"Doei...\n");
131     exit(0);
132   }
133   else {
134     fprintf(stderr,"%d: %s\n",item_id,data->description[item_id]);
135     if (data->nAppl != -1)
136       HideDlg(data->appl);
137     data->nAppl=item_id;
138     data->appl=ReadDlg(x11,0,data->name[item_id],
139                        BLACK,LIGHTGREY,data->dlgfile[item_id],
140                        50,50,FALSE,FALSE,ApplCallback,data);
141     ShowDlg(data->appl);
142   }
143 }
144
145 static void read_opts(t_data *data)
146 {
147   FILE *in;
148   char fn[STRLEN],buf[STRLEN];
149   int  i,n;
150
151   sprintf(fn,"xstat.dat");
152   in=libopen(fn);
153   fscanf(in,"%d",&n);
154   data->nopt=n;
155   snew(data->name,data->nopt);
156   snew(data->description,data->nopt);
157   snew(data->dlgfile,data->nopt);
158
159   for(i=0; (i<data->nopt); i++) {
160     ReadQuoteString(fn,in,buf);
161     data->name[i] = strdup(buf);
162     ReadQuoteString(fn,in,buf);
163     data->description[i] = strdup(buf);
164     ReadQuoteString(fn,in,buf);
165     data->dlgfile[i] = strdup(buf);
166   }
167   ffclose(in);
168 }
169
170 static void add_opts(t_x11 *x11,t_data *data)
171 {
172   t_dlgitem *but;
173   int        i,y0,w;
174
175   y0=OFFS_Y;
176   for(i=0; (i<data->nopt); i++) {
177     but=CreateButton(x11,data->description[i],FALSE,
178                      (t_id)i,(t_id)0,
179                      OFFS_X,y0,0,0,1);
180     AddDlgItem(data->dlg,but);
181     y0+=but->win.height+OFFS_Y;
182   }
183   but=CreateButton(x11,"Quit",TRUE,(t_id)data->nopt,(t_id)0,
184                    OFFS_X,y0,0,0,1);
185   AddDlgItem(data->dlg,but);
186   y0+=but->win.height+OFFS_Y;
187   
188   w=0;
189   for(i=0; (i<=data->nopt); i++)
190     w=max(w,QueryDlgItemW(data->dlg,i));
191   w+=2*OFFS_X;
192   for(i=0; (i<=data->nopt); i++)
193     SetDlgItemSize(data->dlg,i,w,0);
194   SetDlgSize(data->dlg,w+2*OFFS_X,y0,TRUE);
195 }
196
197 int
198 main(int argc,char *argv[])
199 {
200   t_x11  *x11;
201   t_data data;
202
203   /* Initiate X and data */
204   if ((x11=GetX11(&argc,argv))==NULL) {
205     fprintf(stderr,"Can't open DISPLAY\n");
206     exit(1);
207   }
208   read_opts(&data);
209   data.dlg=CreateDlg(x11,0,argv[0],0,0,0,0,0,BLACK,LIGHTGREY,Callback,&data);
210   add_opts(x11,&data);
211   data.nAppl=-1;
212
213   ShowDlg(data.dlg);
214   x11->MainLoop(x11);
215   HideDlg(data.dlg);
216 }