1 /** @file SnarkInput.cpp
3 @author Bruno M. Carvalho and Deniz Sarioz
4 modifications made June 13, 2008 by Joanna Klukowska
5 addition of variability to snark14 (two extra fields in LAST line
6 changed occurances of snark05 to snark14
7 removed SAVE and MODIFY options from RUN since snark14 does not have file12
8 licensed under (open-source) QPL v1.0
9 which accompanies this distribution in the file QPL
12 #include "SnarkInput.h"
14 #include "variables.h"
21 #include "experiment.h"
25 #include "projection.h"
39 #include <qstatusbar.h>
40 #include <qbuttongroup.h>
41 #include <qradiobutton.h>
43 char *myTag = "si140703";
48 * Constructs a SnarkInput which is a child of 'parent', with the
49 * name 'name' and widget flags set to 'f'
51 * The dialog will by default be modeless, unless you set 'modal' to
52 * TRUE to construct a modal dialog.
54 @author Bruno M. Carvalho
56 SnarkInput::SnarkInput(QWidget* parent, const char* name, WFlags fl)
57 : QMainWindow(parent, name, fl)
59 printf("snark14Input version %s\n", myTag);
63 setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, sizePolicy().hasHeightForWidth() ) );
64 setMinimumSize(QSize(482,665));
66 inputfilename=QString("./snark_input");
68 QPixmap comments_icon( ( const char** ) comments_icon_data );
69 QPixmap trace_icon( ( const char** ) trace_icon_data );
70 QPixmap mode_icon( ( const char** ) mode_icon_data );
71 QPixmap create_icon( ( const char** ) create_icon_data );
72 QPixmap picture_icon( ( const char** ) picture_icon_data );
73 QPixmap projection_icon( ( const char** ) projection_icon_data );
74 QPixmap select_icon( ( const char** ) select_icon_data );
75 QPixmap basis_icon( ( const char** ) basis_icon_data );
76 QPixmap stop_icon( ( const char** ) stop_icon_data );
77 QPixmap super_icon( ( const char** ) super_icon_data );
78 QPixmap execute_icon( ( const char** ) execute_icon_data );
79 QPixmap evaluate_icon( ( const char** ) evaluate_icon_data );
80 QPixmap display_icon( ( const char** ) display_icon_data );
81 QPixmap punch_icon( ( const char** ) punch_icon_data );
82 QPixmap lines_icon( ( const char** ) lines_icon_data );
83 QPixmap skunk_icon( ( const char** ) skunk_icon_data );
84 QPixmap end_icon( ( const char** ) end_icon_data );
85 QPixmap run_icon( ( const char** ) run_icon_data );
86 QPixmap open_icon( ( const char** ) open_icon_data );
87 QPixmap save_icon( ( const char** ) save_icon_data );
88 QPixmap saveas_icon( ( const char** ) saveas_icon_data );
89 QPixmap newfile_icon( ( const char** ) newfile_icon_data );
91 QMenuBar* menubar=menuBar();
93 filemenu=new QPopupMenu(menubar,"File Menu");
95 filemenu->insertItem(t,this,SLOT(openFile()));
97 filemenu->insertItem(t,this,SLOT(newInputFile()));
99 filemenu->insertItem(t,this,SLOT(saveFile()));
101 filemenu->insertItem(t,this,SLOT(saveFileAs()));
103 filemenu->insertItem(t,qApp,SLOT(quit()));
105 commandsmenu=new QPopupMenu(menubar,"Commands Menu");
106 t="&* Comments Window";
107 commandsmenu->insertItem(t,this,SLOT(callComment()));
109 commandsmenu->insertItem(t,this,SLOT(callTrace()));
111 commandsmenu->insertItem(t,this,SLOT(callMode()));
113 commandsmenu->insertItem(t,this,SLOT(callCreate()));
115 commandsmenu->insertItem(t,this,SLOT(callPicture()));
116 t="p&Rojection Window";
117 commandsmenu->insertItem(t,this,SLOT(callProjection()));
119 commandsmenu->insertItem(t,this,SLOT(callSelect()));
120 t="&Basis Function Window";
121 commandsmenu->insertItem(t,this,SLOT(callBasis()));
123 commandsmenu->insertItem(t,this,SLOT(callStop()));
124 t="s&Uperiorize Window";
125 commandsmenu->insertItem(t,this,SLOT(callSuper()));
127 commandsmenu->insertItem(t,this,SLOT(callExecute()));
128 t="e&Valuate Window";
129 commandsmenu->insertItem(t,this,SLOT(callEvaluate()));
131 commandsmenu->insertItem(t,this,SLOT(callDisplay()));
133 commandsmenu->insertItem(t,this,SLOT(callPunch()));
135 commandsmenu->insertItem(t,this,SLOT(callLines()));
136 t="s&Kunk Function Window";
137 commandsmenu->insertItem(t,this,SLOT(callSkunk()));
139 commandsmenu->insertItem(t,this,SLOT(addEnd()));
141 runsnarkmenu=new QPopupMenu(menubar,"Run Snark Menu");
143 runsnarkmenu->insertItem(t,this,SLOT(runSnark()));
145 helpmenu=new QPopupMenu(menubar,"Help Menu");
147 helpmenu->insertItem(t,this,SLOT(about()));
149 menubar->insertItem("&File",filemenu);
150 menubar->insertItem("&Commands",commandsmenu);
151 menubar->insertItem("&SNARK",runsnarkmenu);
152 menubar->insertSeparator();
153 menubar->insertItem("&Help",helpmenu);
155 /** Add graphical buttons to the interface */
156 QToolBar *tb1 = new QToolBar("label",this,Top,false,"fileiconsbar");
157 tb1->setHorizontalStretchable(true);
159 QToolButton* ii=new QToolButton(open_icon,"Open File",QString::null,this,SLOT(openFile()),tb1,"Open File");
161 ii=new QToolButton(newfile_icon,"New File",QString::null,this,SLOT(newInputFile()),tb1,"New File");
163 ii=new QToolButton(save_icon,"Save File",QString::null,this,SLOT(saveFile()),tb1,"Save File");
165 ii=new QToolButton(saveas_icon,"Save File as",QString::null,this,SLOT(saveFileAs()),tb1,"Save File as");
167 QToolBar *tb2 = new QToolBar("label",this,Left,false,"iconsbar");
168 tb2->setVerticalStretchable(true);
170 QToolBar *tb3 = new QToolBar("label",this,Left,false,"iconsbar2");
171 tb3->setVerticalStretchable(true);
173 ii=new QToolButton(comments_icon,"Comments",QString::null,this,SLOT(callComment()),tb2,"Experiment Comments");
175 ii=new QToolButton(trace_icon,"Trace Window",QString::null,this,SLOT(callTrace()),tb2,"Trace Window");
177 ii=new QToolButton(mode_icon,"Mode window",QString::null,this,SLOT(callMode()),tb2,"Mode window");
179 ii=new QToolButton(create_icon,"Create Window",QString::null,this,SLOT(callCreate()),tb2,"Create Window");
181 ii=new QToolButton(picture_icon,"Picture window",QString::null,this,SLOT(callPicture()),tb2,"Picture window");
183 ii=new QToolButton(projection_icon,"Projection Window",QString::null,this,SLOT(callProjection()),tb2,"Projection Window");
185 ii=new QToolButton(select_icon,"Select Window",QString::null,this,SLOT(callSelect()),tb2,"Select Window");
187 ii=new QToolButton(basis_icon,"Basis window",QString::null,this,SLOT(callBasis()),tb2,"Basis window");
189 ii=new QToolButton(stop_icon,"Stop Window",QString::null,this,SLOT(callStop()),tb2,"Stop Window");
191 ii=new QToolButton(super_icon,"Superiorize Window",QString::null,this,SLOT(callSuper()),tb2,"Superiorize Window");
193 ii=new QToolButton(execute_icon,"Execute Window",QString::null,this,SLOT(callExecute()),tb3,"Execute Window");
195 ii=new QToolButton(evaluate_icon,"Evaluate Window",QString::null,this,SLOT(callEvaluate()),tb3,"Evaluate Window");
197 ii=new QToolButton(display_icon,"Display window",QString::null,this,SLOT(callDisplay()),tb3,"Display window");
199 ii=new QToolButton(punch_icon,"Punch window",QString::null,this,SLOT(callPunch()),tb3,"Punch window");
201 ii=new QToolButton(lines_icon,"Lines window",QString::null,this,SLOT(callLines()),tb3,"Lines window");
203 ii=new QToolButton(skunk_icon,"Skunk Window",QString::null,this,SLOT(callSkunk()),tb3,"Skunk Window");
205 ii=new QToolButton(end_icon,"End Command",QString::null,this,SLOT(addEnd()),tb3,"End Command");
207 ii=new QToolButton(run_icon,"Run SNARK14",QString::null,this,SLOT(runSnark()),tb3,"Run SNARK14");
209 currentinput = new QMultiLineEdit(this,"current input");
210 setCentralWidget(currentinput);
212 QLabel* ibl = new QLabel( statusBar(), "tracelabel" );
213 ibl->setGeometry( QRect( 10, 0, 130, 30 ) );
214 ibl->setText( tr( "Insert command:" ) );
216 QButtonGroup* insertbuttongroup = new QButtonGroup( statusBar(), "tracebuttongroup" );
217 insertbuttongroup->setGeometry( QRect( 150, 0, 300, 60 ) );
218 insertbuttongroup->setFrameStyle(QFrame::NoFrame);
219 insertbuttongroup->setAlignment( int( QButtonGroup::AlignVCenter ) );
220 QObject::connect(insertbuttongroup,SIGNAL(clicked(int)),this,SLOT(setInsertType(int)));
222 QRadioButton* int1button = new QRadioButton(insertbuttongroup,"int1button");
223 int1button->setGeometry( QRect( 0, 0, 100, 30 ) );
224 int1button->setText( tr( "At the end" ) );
225 // int1button->setChecked(true);
227 QRadioButton* int2button = new QRadioButton(insertbuttongroup,"int2button");
228 int2button->setGeometry( QRect( 110, 0, 130, 30 ) );
229 int2button->setText( tr( "After cursor line" ) );
230 int2button->setChecked(true);
237 /** Calls file dialog and opens file
239 @author Bruno M. Carvalho
241 void SnarkInput::setInsertType(int e)
247 /** Calls file dialog and opens file
249 @author Bruno M. Carvalho
251 void SnarkInput::openFile()
253 QString tempbuffer,tempinputfilename;
254 char tempstring[500];
257 tempinputfilename=QFileDialog::getOpenFileName(QString::null,"Snark input files (*.in)\n All files (*)");
258 if(tempinputfilename) {
259 inputfilename=tempinputfilename;
260 if((inputfile=fopen(inputfilename,"r+"))==NULL) {
261 printf("Error opening %s\n",(const char *)inputfilename);
263 else { /* fseek(inputfile,0L,SEEK_END); */
264 tempbuffer=QString();
265 l=currentinput->numLines();
267 currentinput->removeLine(0);
268 while(fgets(tempstring,500,inputfile)) {
269 tempbuffer.append(QString(tempstring));
271 currentinput->insertLine(tempbuffer,-1);
277 /** Erases current content for a new input file
279 @author Bruno M. Carvalho
281 void SnarkInput::newInputFile()
283 while(currentinput->numLines()>1)
284 currentinput->removeLine(0);
285 currentinput->removeLine(0);
286 inputfilename=QString("./snark_input");
291 @author Bruno M. Carvalho
293 void SnarkInput::saveFile()
298 if((inputfile=fopen(inputfilename,"w"))==NULL) {
299 QMessageBox::information(this,"SnarkInput","Error!\n"
300 "Could not open file %s\n",(const char *)inputfilename);
303 l=currentinput->numLines();
305 t=currentinput->textLine(i);
306 fprintf(inputfile,"%s\n",t.latin1());
312 /** Calls file dialog and saves file as
314 @author Bruno M. Carvalho
316 void SnarkInput::saveFileAs()
321 outputfilename=QFileDialog::getSaveFileName(QString::null,"Snark input files (*.in)\n All files (*)");
323 inputfilename=outputfilename;
324 if((inputfile=fopen(inputfilename,"w"))==NULL) {
325 QMessageBox::information(this,"SnarkInput","Error!\n"
326 "Could not open file %s\n",(const char *)inputfilename);
329 l=currentinput->numLines();
331 t=currentinput->textLine(i);
332 fprintf(inputfile,"%s\n",t.latin1());
339 /** Calls SNARK with current input file
341 @author Bruno M. Carvalho
343 void SnarkInput::runSnark()
346 printf("SNARK14 is run on file %s\n",(const char *)inputfilename);
347 char tmpfilename[100];
348 sprintf(tmpfilename, "/tmp/snark_input_%d_%d", getuid(), geteuid());
350 if((inputfile=fopen(tmpfilename, "w"))==NULL) {
351 printf("Error opening for read-write %s\n",(const char *)tmpfilename);
353 todo=currentinput->text();
354 fprintf(inputfile,"%s\n",todo.latin1());
357 // Added by deniz to fix bug 85
358 // these tests return 0 for pass, so we use some deMorgan :)
359 if(system("test -x ./bin/snark14UserDefined") || // file exists and executable
360 system("test -s ./bin/snark14UserDefined") || // exists and has non-zero size
361 system("test -f ./bin/snark14UserDefined")) { // exists and is regular (not a directory)
362 // std::cout << "file is not a non-zero-size executable non-directory" << std::endl;
363 // run snark14 as usual
364 sprintf(command, "snark14 < %s", tmpfilename);
365 // system("snark14 < /tmp/snark_input ");
368 // std::cout << "file is a non-zero-size executable non-directory" << std::endl;
369 // run ./bin/snark14UserAlg
370 sprintf(command, "./bin/snark14UserDefined < %s", tmpfilename);
371 // system("./bin/snark14UserAlg < /tmp/snark_input ");
374 // don't clean-up... potentially dangerous... let files be.
375 // sprintf(command, "rm -f %s", tmpfilename);
379 /** Calls SnarkInput manual
381 @author Bruno M. Carvalho
383 COMMENTED OUT BY DENIZ SARIOZ in line with "new requirements"
385 // void SnarkInput::help()
388 // // char *snarkinputbase;
389 // sprintf(command,"acroread %s/doc/SnarkInput.pdf &",SNARKINPUTBASE);
390 // /* snarkinputbase=getenv("HOME");
391 // printf("SNARKINPUTBASE=%s\n",snarkinputbase);
392 // snarkinputbase=getenv("SNARKBASE");
393 // printf("SNARKINPUTBASE=%s\n",snarkinputbase);
394 // sprintf(command,"acroread $SNARKINPUTBASE/doc/SnarkInput.pdf &"); */
398 /** Calls Snark manual
400 @author Bruno M. Carvalho
402 COMMENTED OUT BY DENIZ SARIOZ in line with "new requirements"
404 // void SnarkInput::SNARKManual()
407 // sprintf(command,"acroread %s/doc/Snark_manual.pdf &",SNARKBASE);
411 /** Calls about window
413 @author Bruno M. Carvalho & Deniz Sarioz
415 void SnarkInput::about()
417 QMessageBox::information(this,"snark14Input",
418 "snark05Input was developed by\n"
419 "Bruno M. Carvalho and Deniz Sarioz\n"
421 "converted to snark14Input by Joanna Klukowska\n"
423 "converted to snark14Input by Bernhard Prommegger\n"
425 "copyright (QPL) by CUNY-GC-CS-DIG\n"
426 "http://www.dig.cs.gc.cuny.edu");
429 /** Calls comment window
431 @author Bruno M. Carvalho
433 void SnarkInput::callComment()
438 experimentwindow* nw=new experimentwindow(this,"Experiment's Comments Window",true);
440 if(c==QDialog::Accepted) {
441 line=nw->getOutput();
443 currentinput->getCursorPosition(&l,&col);
444 currentinput->insertLine(line,l+1);
447 currentinput->insertLine(line);
451 /** Starts a trace window
453 @author Bruno M. Carvalho
455 void SnarkInput::callTrace()
460 tracewindow* nw=new tracewindow(this,"Trace Window",true);
462 if(c==QDialog::Accepted) {
463 line=nw->getOutput();
465 currentinput->getCursorPosition(&l,&col);
466 currentinput->insertLine(line,l+1);
469 currentinput->insertLine(line);
473 /** Starts a mode window
475 @author Bruno M. Carvalho
477 void SnarkInput::callMode()
482 modewindow* nw=new modewindow(this,"Mode Window",true);
484 if(c==QDialog::Accepted) {
485 line=nw->getOutput();
487 currentinput->getCursorPosition(&l,&col);
488 currentinput->insertLine(line,l+1);
491 currentinput->insertLine(line);
495 /** Starts a create window
497 @author Bruno M. Carvalho
499 void SnarkInput::callCreate()
501 QString line1,line2,line3,line4,line5,line6,line7,line8;
505 createwindow* nw=new createwindow(this,"Create Window",true);
507 if(c==QDialog::Accepted) {
508 line1=nw->getOutput1();
509 line2=nw->getOutput2();
510 line3=nw->getOutput3();
511 line4=nw->getOutput4();
512 line5=nw->getOutput5();
513 if(nw->isRaysumAveragePresent()) {
514 line6=nw->getOutput6();
515 line7=nw->getOutput7();
516 line8=nw->getOutput8();
519 currentinput->getCursorPosition(&ell,&col);
520 if((currentinput->numLines()) == (ell+1)) { // if cursor on last line of text
521 currentinput->insertLine("",ell+1); // hack so that stuff below will work
523 if(nw->isRaysumAveragePresent()) {
524 currentinput->insertLine(line8,ell+1);
525 currentinput->insertLine(line7,ell+1);
526 currentinput->insertLine(line6,ell+1);
528 currentinput->insertLine(line5,ell+1);
529 currentinput->insertLine(line4,ell+1);
530 currentinput->insertLine(line3,ell+1);
531 currentinput->insertLine(line2,ell+1);
532 currentinput->insertLine(line1,ell+1);
535 currentinput->insertLine(line1);
536 currentinput->insertLine(line2);
537 currentinput->insertLine(line3);
538 currentinput->insertLine(line4);
539 currentinput->insertLine(line5);
540 if(nw->isRaysumAveragePresent()) {
541 currentinput->insertLine(line6);
542 currentinput->insertLine(line7);
543 currentinput->insertLine(line8);
549 /** Starts a picture window
551 @author Bruno M. Carvalho
553 void SnarkInput::callPicture()
558 picturewindow* nw=new picturewindow(this,"Picture Window",true);
560 if(c==QDialog::Accepted) {
561 line=nw->getOutput();
563 currentinput->getCursorPosition(&l,&col);
564 currentinput->insertLine(line,l+1);
567 currentinput->insertLine(line);
571 /** Starts a projection window
573 @author Bruno M. Carvalho
575 void SnarkInput::callProjection()
580 projectionwindow* nw=new projectionwindow(this,"Projection Window",true);
582 if(c==QDialog::Accepted) {
583 line=nw->getOutput();
585 currentinput->getCursorPosition(&l,&col);
586 currentinput->insertLine(line,l+1);
589 currentinput->insertLine(line);
593 /** Starts a select window
595 @author Bruno M. Carvalho
597 void SnarkInput::callSelect()
602 selectwindow* nw=new selectwindow(this,"Select Window",true);
604 if(c==QDialog::Accepted) {
605 line=nw->getOutput();
607 currentinput->getCursorPosition(&l,&col);
608 currentinput->insertLine(line,l+1);
611 currentinput->insertLine(line);
615 /** Starts a basis window
617 @author Bruno M. Carvalho
619 void SnarkInput::callBasis()
624 basiswindow* nw=new basiswindow(this,"Basis Function Window",true);
626 if(c==QDialog::Accepted) {
627 line=nw->getOutput();
629 currentinput->getCursorPosition(&l,&col);
630 currentinput->insertLine(line,l+1);
633 currentinput->insertLine(line);
637 /** Starts a stop window
639 @author Bruno M. Carvalho
641 void SnarkInput::callStop()
646 stopwindow* nw=new stopwindow(this,"Stop Window",true);
648 if(c==QDialog::Accepted) {
649 line=nw->getOutput();
651 currentinput->getCursorPosition(&l,&col);
652 currentinput->insertLine(line,l+1);
655 currentinput->insertLine(line);
659 // Starts a superiorize window
660 void SnarkInput::callSuper()
665 superwindow* nw=new superwindow(this,"Superiorize Window",true);
667 if(c==QDialog::Accepted) {
668 line=nw->getOutput();
670 currentinput->getCursorPosition(&l,&col);
671 currentinput->insertLine(line,l+1);
674 currentinput->insertLine(line);
678 /** Starts a execute window
680 @author Bruno M. Carvalho
682 void SnarkInput::callExecute()
687 executewindow* nw=new executewindow(this,"Execute Window",true);
689 if(c==QDialog::Accepted) {
690 line=nw->getOutput();
692 currentinput->getCursorPosition(&l,&col);
693 currentinput->insertLine(line,l+1);
696 currentinput->insertLine(line);
700 /** Starts a evaluate window
702 @author Bruno M. Carvalho
704 void SnarkInput::callEvaluate()
709 evaluatewindow* nw=new evaluatewindow(this,"Evaluate Window",true);
711 if(c==QDialog::Accepted) {
712 line=nw->getOutput();
714 currentinput->getCursorPosition(&l,&col);
715 currentinput->insertLine(line,l+1);
718 currentinput->insertLine(line);
722 /** Starts a display window
724 @author Bruno M. Carvalho
726 void SnarkInput::callDisplay()
731 displaywindow* nw=new displaywindow(this,"Display Window",true);
733 if(c==QDialog::Accepted) {
734 line=nw->getOutput();
736 currentinput->getCursorPosition(&l,&col);
737 currentinput->insertLine(line,l+1);
740 currentinput->insertLine(line);
744 /** Starts a punch window
746 @author Bruno M. Carvalho
748 void SnarkInput::callPunch()
753 punchwindow* nw=new punchwindow(this,"Punch Window",true);
755 if(c==QDialog::Accepted) {
756 line=nw->getOutput();
758 currentinput->getCursorPosition(&l,&col);
759 currentinput->insertLine(line,l+1);
762 currentinput->insertLine(line);
766 /** Starts a lines window
768 @author Bruno M. Carvalho
770 void SnarkInput::callLines()
775 lineswindow* nw=new lineswindow(this,"Lines Window",true);
777 if(c==QDialog::Accepted) {
778 line=nw->getOutput();
780 currentinput->getCursorPosition(&l,&col);
781 currentinput->insertLine(line,l+1);
784 currentinput->insertLine(line);
788 /** Starts a skunk window
790 @author Bruno M. Carvalho
792 void SnarkInput::callSkunk()
797 skunkwindow* nw=new skunkwindow(this,"Skunk Window",true);
799 if(c==QDialog::Accepted) {
800 line=nw->getOutput();
802 currentinput->getCursorPosition(&l,&col);
803 currentinput->insertLine(line,l+1);
806 currentinput->insertLine(line);
810 /** Adds an end command
812 @author Bruno M. Carvalho
814 void SnarkInput::addEnd()
819 currentinput->getCursorPosition(&l,&col);
820 currentinput->insertLine(QString("END"),l+1);
823 currentinput->insertLine(QString("END"));
826 /** Starts the application
828 @author Bruno M. Carvalho
830 int main(int argc,char* argv[])
832 QApplication snarkapp(argc,argv);
834 SnarkInput* mw=new SnarkInput();
835 snarkapp.setMainWidget(mw);
837 return snarkapp.exec();