Fixed text file permissions
[snark14.git] / tools / Input / evaluate.cpp
1 /** @file evaluate.cpp
2     @package snark14Input
3     @author Bruno M. Carvalho and Deniz Sarioz
4     licensed under (open-source) QPL v1.0
5     which accompanies this distribution in the file QPL
6 */
7
8 #include "evaluate.h"
9 #include "misc.h"
10 #include "variables.h"
11
12 #include <qbuttongroup.h>
13 #include <qframe.h>
14 #include <qlabel.h>
15 #include <qlineedit.h>
16 #include <qmultilineedit.h>
17 #include <qpushbutton.h>
18 #include <qradiobutton.h>
19 #include <qlayout.h>
20 #include <qvariant.h>
21 #include <qtooltip.h>
22 #include <qwhatsthis.h>
23 #include <qmessagebox.h>
24
25 /** 
26  *  Constructs a evaluatewindow which is a child of 'parent', with the 
27  *  name 'name' and widget flags set to 'f' 
28  *
29  *  The dialog will by default be modeless, unless you set 'modal' to
30  *  TRUE to construct a modal dialog.
31 @param void
32 @author Bruno M. Carvalho
33 @version 1.0 */
34 evaluatewindow::evaluatewindow( QWidget* parent,  const char* name, bool modal, WFlags fl )
35     : QDialog( parent, name, modal, fl )
36 {
37     if ( !name )
38         setName( "evaluatewindow" );
39     resize( 400, 600 ); 
40     setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, sizePolicy().hasHeightForWidth() ) );
41     setMinimumSize( QSize( 400, 600 ) );
42     setMaximumSize( QSize( 400, 600 ) );
43     setCaption( tr( "Evaluate Window" ) );
44
45     evaluatelabel = new QLabel( this, "evaluatelabel" );
46     evaluatelabel->setGeometry( QRect( 10, 10, 120, 30 ) ); 
47     evaluatelabel->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, evaluatelabel->sizePolicy().hasHeightForWidth() ) );
48     evaluatelabel->setMinimumSize( QSize( 120, 30 ) );
49     evaluatelabel->setMaximumSize( QSize( 120, 30 ) );
50     evaluatelabel->setText( tr( "EVALUATE" ) );
51
52     evalnamelabel = new QLabel( this, "evalnamelabel" );
53     evalnamelabel->setGeometry( QRect( 200, 20, 190, 30) );
54     //    evalnamelabel->setMinimumSize( QSize( 120, 30) );
55     evalnamelabel->setText( tr( "EVALUATE run name:" ) );
56
57     evalnamefield = new QLineEdit( this, "evalnamefield" );
58     evalnamefield->setGeometry( QRect( 210, 51, 170, 28) );
59     evalnamefield->setEnabled(TRUE);
60
61     evaluatebuttongroup = new QButtonGroup( this, "evaluatebuttongroup" );
62     evaluatebuttongroup->setGeometry( QRect( 40, 40, 160, 140 ) ); 
63     evaluatebuttongroup->setTitle( tr( "type" ) );
64     evaluatebuttongroup->setAlignment( int( QButtonGroup::AlignHCenter ) );
65
66     resolutionbutton = new QRadioButton( evaluatebuttongroup, "resolutionbutton" );
67     resolutionbutton->setGeometry( QRect( 10, 20, 130, 24 ) ); 
68     resolutionbutton->setText( tr( "RESOLUTION" ) );
69
70     pointbutton = new QRadioButton( evaluatebuttongroup, "pointbutton" );
71     pointbutton->setGeometry( QRect( 10, 50, 110, 24 ) ); 
72     pointbutton->setText( tr( "POINT" ) );
73
74     bothbutton = new QRadioButton( evaluatebuttongroup, "bothbutton" );
75     bothbutton->setGeometry( QRect( 10, 80, 110, 24 ) ); 
76     bothbutton->setText( tr( "BOTH" ) );
77
78     nonebutton = new QRadioButton( evaluatebuttongroup, "nonebutton" );
79     nonebutton->setGeometry( QRect( 10, 110, 80, 24 ) ); 
80     nonebutton->setText( tr( "NONE" ) );
81
82     linebutton = new QRadioButton( this, "linebutton" );
83     //    linebutton->setGeometry( QRect( 210, 50, 100, 30 ) ); 
84     linebutton->setGeometry( QRect( 210, 130, 100, 30 ) ); 
85     linebutton->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, linebutton->sizePolicy().hasHeightForWidth() ) );
86     linebutton->setMinimumSize( QSize( 100, 30 ) );
87     linebutton->setMaximumSize( QSize( 100, 30 ) );
88     linebutton->setText( tr( "LINE" ) );
89
90     evaluatebuttongroup2 = new QButtonGroup( this, "evaluatebuttongroup2" );
91     evaluatebuttongroup2->setGeometry( QRect( 40, 190, 310, 80 ) ); 
92     evaluatebuttongroup2->setTitle( tr( "" ) );
93     evaluatebuttongroup2->setAlignment( int( QButtonGroup::AlignHCenter ) );
94
95     wholepicbutton = new QRadioButton( evaluatebuttongroup2, "wholepicbutton" );
96     wholepicbutton->setGeometry( QRect( 10, 10, 110, 24 ) ); 
97     wholepicbutton->setText( tr( "WHOLEPIC" ) );
98     QObject::connect(wholepicbutton,SIGNAL(clicked()),this,SLOT(activateWholepicFields()));
99     wholepicbutton->setChecked(true);
100
101     lowden = new QLineEdit( evaluatebuttongroup2, "lowden" );
102     lowden->setGeometry( QRect( 150, 30, 60, 28 ) ); 
103     lowden->setEnabled(TRUE);
104
105     lowdenlabel = new QLabel( evaluatebuttongroup2, "lowdenlabel" );
106     lowdenlabel->setGeometry( QRect( 150, 10, 60, 20 ) ); 
107     lowdenlabel->setText( tr( "lowden" ) );
108     lowdenlabel->setEnabled(TRUE);
109
110     highden = new QLineEdit( evaluatebuttongroup2, "highden" );
111     highden->setGeometry( QRect( 230, 30, 60, 28 ) );
112     highden->setEnabled(TRUE);
113
114     highdenlabel = new QLabel( evaluatebuttongroup2, "highdenlabel" );
115     highdenlabel->setGeometry( QRect( 230, 10, 60, 20 ) ); 
116     highdenlabel->setText( tr( "highden" ) );
117     highdenlabel->setEnabled(TRUE);
118
119     selectivebutton = new QRadioButton( evaluatebuttongroup2, "selectivebutton" );
120     selectivebutton->setGeometry( QRect( 10, 40, 130, 24 ) ); 
121     selectivebutton->setText( tr( "SELECTIVE" ) );
122     QObject::connect(selectivebutton,SIGNAL(clicked()),this,SLOT(activateSelectiveFields()));
123
124     shapes = new QMultiLineEdit( this, "shapes" );
125     shapes->setGeometry( QRect( 30, 300, 350, 124 ) ); 
126     shapes->setMaxLines(40);
127     shapes->setEnabled(FALSE);
128
129     shapeslabel = new QLabel( this, "shapeslabel" );
130     shapeslabel->setGeometry( QRect( 90, 280, 240, 20 ) ); 
131     shapeslabel->setText( tr( "SELECTIVE shapes descriptions" ) );
132     shapeslabel->setEnabled(FALSE);
133
134     shapesinstructionslabel = new QLabel( this, "shapesinstructionslabel" );
135     shapesinstructionslabel->setGeometry( QRect( 80, 425, 270, 20 ) ); 
136     shapesinstructionslabel->setText( tr( "shape cx cy u v ang [lowden higden]" ) );
137     shapesinstructionslabel->setEnabled(FALSE);
138
139     iterationflaglabel = new QLabel( this, "iterationflaglinelabel" );
140     iterationflaglabel->setGeometry( QRect( 140, 450, 150, 20 ) ); 
141     iterationflaglabel->setText( tr( "iteration_flag_line" ) );
142
143     iterationflagline = new QLineEdit( this, "iterationflagline" );
144     iterationflagline->setGeometry( QRect( 30, 470, 350, 28 ) ); 
145
146     Line4 = new QFrame( this, "Line4" );
147     Line4->setGeometry( QRect( -5, 505, 410, 16 ) ); 
148     Line4->setFrameStyle( QFrame::HLine | QFrame::Sunken );
149
150     okbutton = new QPushButton( this, "okbutton" );
151     okbutton->setGeometry( QRect( 50, 540, 100, 40 ) ); 
152     okbutton->setText( tr( "OK" ) );
153     QObject::connect(okbutton,SIGNAL(clicked()),this,SLOT(checkValues()));
154
155     cancelbutton = new QPushButton( this, "cancelbutton" );
156     cancelbutton->setGeometry( QRect( 250, 540, 100, 40 ) ); 
157     cancelbutton->setText( tr( "Cancel" ) );
158     QObject::connect(cancelbutton,SIGNAL(clicked()),this,SLOT(reject()));
159 }
160
161 /**  
162  *  Destroys the object and frees any allocated resources
163  */
164 evaluatewindow::~evaluatewindow()
165 {
166     // no need to delete child widgets, Qt does it all for us
167 }
168
169 /** Activates type, region and flag fields 
170 @param void
171 @author Bruno M. Carvalho
172 @version 1.0 */
173 /*void evaluatewindow::activateFields()
174 {
175   if(evaluatebutton->isChecked()) {
176     evaluatebuttongroup->setEnabled(TRUE);
177     resolutionbutton->setEnabled(TRUE);
178     pointbutton->setEnabled(TRUE);
179     bothbutton->setEnabled(TRUE);
180     nonebutton->setEnabled(TRUE);
181     linebutton->setEnabled(TRUE);
182     evaluatebuttongroup2->setEnabled(TRUE);
183     wholepicbutton->setEnabled(TRUE);
184     selectivebutton->setEnabled(TRUE);
185     if(wholepicbutton->isChecked()) {
186       lowden->setEnabled(TRUE);
187       lowdenlabel->setEnabled(TRUE);
188       highden->setEnabled(TRUE);
189       highdenlabel->setEnabled(TRUE);
190     }
191     else 
192       if(selectivebutton->isChecked()) {
193         shapes->setEnabled(TRUE);
194         shapeslabel->setEnabled(TRUE);
195         shapesinstructionslabel->setEnabled(TRUE);
196       }
197     iterationflagline->setEnabled(TRUE);
198     iterationflaglabel->setEnabled(TRUE);
199   }
200   else {
201     evaluatebuttongroup->setEnabled(FALSE);
202     resolutionbutton->setEnabled(FALSE);
203     pointbutton->setEnabled(FALSE);
204     bothbutton->setEnabled(FALSE);
205     nonebutton->setEnabled(FALSE);
206     linebutton->setEnabled(FALSE);
207     evaluatebuttongroup2->setEnabled(FALSE);
208     wholepicbutton->setEnabled(FALSE);
209     selectivebutton->setEnabled(FALSE);
210     lowden->setEnabled(FALSE);
211     lowdenlabel->setEnabled(FALSE);
212     highden->setEnabled(FALSE);
213     highdenlabel->setEnabled(FALSE);
214     shapes->setEnabled(FALSE);
215     shapeslabel->setEnabled(FALSE);
216     shapesinstructionslabel->setEnabled(FALSE);
217     iterationflagline->setEnabled(FALSE);
218     iterationflaglabel->setEnabled(FALSE);
219   }
220 } */
221
222 /** Activates wholepic fields and deactivates selective fields
223 @param void
224 @author Bruno M. Carvalho
225 @version 1.0 */
226 void evaluatewindow::activateWholepicFields()
227 {
228   if(wholepicbutton->isChecked()) {
229     lowden->setEnabled(TRUE);
230     lowdenlabel->setEnabled(TRUE);
231     highden->setEnabled(TRUE);
232     highdenlabel->setEnabled(TRUE); 
233     shapes->setEnabled(FALSE);
234     shapeslabel->setEnabled(FALSE);
235     shapesinstructionslabel->setEnabled(FALSE);
236   }
237   else {
238     lowden->setEnabled(FALSE);
239     lowdenlabel->setEnabled(FALSE);
240     highden->setEnabled(FALSE);
241     highdenlabel->setEnabled(FALSE);
242   }
243 }
244
245 /** Activates selective fields and deactivates wholepic fields 
246 @param void
247 @author Bruno M. Carvalho
248 @version 1.0 */
249 void evaluatewindow::activateSelectiveFields()
250 {
251   if(selectivebutton->isChecked()) {
252     shapes->setEnabled(TRUE);
253     shapeslabel->setEnabled(TRUE);
254     shapesinstructionslabel->setEnabled(TRUE);
255     lowden->setEnabled(FALSE);
256     lowdenlabel->setEnabled(FALSE);
257     highden->setEnabled(FALSE);
258     highdenlabel->setEnabled(FALSE);
259   }
260   else {
261     shapes->setEnabled(FALSE);
262     shapeslabel->setEnabled(FALSE);
263     shapesinstructionslabel->setEnabled(FALSE);
264   }
265 }
266
267 /** Returns a string for EVALUATE input sequence
268 @param void
269 @return evaluate
270 @author Bruno M. Carvalho
271 @version 1.0 */
272 QString evaluatewindow::getOutput()
273 {
274   QString output;
275
276   output.sprintf("EVALUATE ");
277   if(resolutionbutton->isChecked()) {
278     output.append("RESOLUTION ");
279   }
280   else
281     if(pointbutton->isChecked()) {
282       output.append("POINT ");
283     }
284     else
285       if(bothbutton->isChecked()) {
286         output.append("BOTH ");
287       }
288   if(linebutton->isChecked()) {
289     output.append("LINE ");
290   }
291
292   output.append("\n");
293   output += evalnamefield->text();
294   output.append("\n");
295
296   if(wholepicbutton->isChecked()) {
297       output.append("WHOLEPIC ");
298       if(! (lowden->text().stripWhiteSpace().isEmpty())) {
299         output+=lowden->text();
300         output.append(" ");
301         output+=highden->text();
302         output.append(" ");
303       }
304       output.append("\n");
305   }
306   else 
307     if(selectivebutton->isChecked()) {
308       output.append("SELECTIVE \n");
309       output+=shapes->text();
310       output.append(" \n");
311       output.append("LAST \n");
312     }
313   output+=iterationflagline->text();
314   //output.append(" \n");
315
316   return output;
317 }
318
319
320 void evaluatewindow::checkValues()
321 {
322   int f=0;
323   float lo=0,hi=0;
324   
325   if(wholepicbutton->isChecked()) {
326     bool lowblank  = lowden->text().stripWhiteSpace().isEmpty();
327     bool highblank = highden->text().stripWhiteSpace().isEmpty();
328     if((lowblank && (!highblank) )   ||   ( (!lowblank) && highblank)) {
329       QMessageBox::information(this,"SnarkInput","Error!\n"
330                                "Must specify either both or neither of lowden and highden");
331       return;
332     }
333     if(!lowblank) {
334       lo=strtof((const char *)lowden->text());
335       if(errnum==1) 
336         f=1;
337       hi=strtof((const char *)highden->text());
338       if(errnum==1) 
339         f=2;
340       if(lo>hi && !f) 
341         f=3;
342     }
343   }
344   if(!isintspace(iterationflagline->text()))
345     f=4;
346
347   QString teststr = evalnamefield->text();
348   QString teststr2 = teststr.stripWhiteSpace();
349   if (teststr2.isEmpty()) {
350     f=5;
351   }
352   switch(f) {
353   case 0: accept();
354     break;
355   case 1: QMessageBox::information(this,"SnarkInput","Error!\n"
356                                    "Invalid lowden format");
357           lowden->setFocus();
358     break;
359   case 2: QMessageBox::information(this,"SnarkInput","Error!\n"
360                                    "Invalid highden format");
361           highden->setFocus();
362     break;
363   case 3: QMessageBox::information(this,"SnarkInput","Error!\n"
364                                    "lowden bigger than highden");
365           lowden->setFocus();
366     break;
367   case 4: QMessageBox::information(this,"SnarkInput","Error!\n"
368                                    "iteration_flag_line must contain\n"
369                                    "only 0-9 and spaces and must\n"
370                                    "be non-empty");
371           iterationflagline->setFocus();
372     break;
373   case 5: QMessageBox::information(this,"SnarkInput","Error!\n"
374                                    "EVALUATE run name may NOT be\n"
375                                    "empty or whitespace");
376
377     break;
378   }
379 }
380