| [f5a86a] | 1 | /*
 | 
|---|
 | 2 |  * TextDialog.cpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Jan 5, 2010
 | 
|---|
 | 5 |  *      Author: crueger
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #include <iostream>
 | 
|---|
 | 9 | 
 | 
|---|
| [97ebf8] | 10 | #include <Descriptors/AtomDescriptor.hpp>
 | 
|---|
 | 11 | #include <Descriptors/AtomIdDescriptor.hpp>
 | 
|---|
 | 12 | #include <Descriptors/MoleculeDescriptor.hpp>
 | 
|---|
 | 13 | #include <Descriptors/MoleculeIdDescriptor.hpp>
 | 
|---|
| [5079a0] | 14 | #include "TextUI/TextDialog.hpp"
 | 
|---|
| [7aa000] | 15 | 
 | 
|---|
| [5a7243] | 16 | #include "World.hpp"
 | 
|---|
 | 17 | #include "periodentafel.hpp"
 | 
|---|
| [f5a86a] | 18 | #include "log.hpp"
 | 
|---|
 | 19 | #include "verbose.hpp"
 | 
|---|
 | 20 | 
 | 
|---|
| [97ebf8] | 21 | #include "atom.hpp"
 | 
|---|
 | 22 | #include "element.hpp"
 | 
|---|
 | 23 | #include "molecule.hpp"
 | 
|---|
 | 24 | #include "vector.hpp"
 | 
|---|
 | 25 | 
 | 
|---|
| [f5a86a] | 26 | using namespace std;
 | 
|---|
 | 27 | 
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 | TextDialog::TextDialog()
 | 
|---|
 | 30 | {
 | 
|---|
 | 31 | }
 | 
|---|
 | 32 | 
 | 
|---|
 | 33 | TextDialog::~TextDialog()
 | 
|---|
 | 34 | {
 | 
|---|
 | 35 | }
 | 
|---|
 | 36 | 
 | 
|---|
| [7aa000] | 37 | 
 | 
|---|
| [86466e] | 38 | void TextDialog::queryEmpty(const char* title, string description){
 | 
|---|
 | 39 |   registerQuery(new EmptyTextQuery(title,description));
 | 
|---|
 | 40 | }
 | 
|---|
 | 41 | 
 | 
|---|
| [97ebf8] | 42 | void TextDialog::queryBoolean(const char* title, bool* target, string description){
 | 
|---|
 | 43 |   registerQuery(new BooleanTextQuery(title,target,description));
 | 
|---|
 | 44 | }
 | 
|---|
 | 45 | 
 | 
|---|
| [a2ab15] | 46 | void TextDialog::queryInt(const char* title, int* target, string description){
 | 
|---|
 | 47 |   registerQuery(new IntTextQuery(title,target,description));
 | 
|---|
| [45f5d6] | 48 | }
 | 
|---|
 | 49 | 
 | 
|---|
| [a2ab15] | 50 | void TextDialog::queryDouble(const char* title, double* target, string description){
 | 
|---|
 | 51 |   registerQuery(new DoubleTextQuery(title,target,description));
 | 
|---|
| [2ededc2] | 52 | }
 | 
|---|
 | 53 | 
 | 
|---|
| [a2ab15] | 54 | void TextDialog::queryString(const char* title, string* target, string description){
 | 
|---|
 | 55 |   registerQuery(new StringTextQuery(title,target,description));
 | 
|---|
| [f5a86a] | 56 | }
 | 
|---|
 | 57 | 
 | 
|---|
| [97ebf8] | 58 | void TextDialog::queryAtom(const char* title, atom **target, string description) {
 | 
|---|
 | 59 |   registerQuery(new AtomTextQuery(title,target,description));
 | 
|---|
 | 60 | }
 | 
|---|
 | 61 | 
 | 
|---|
 | 62 | void TextDialog::queryMolecule(const char* title, molecule **target, string description) {
 | 
|---|
 | 63 |   registerQuery(new MoleculeTextQuery(title,target,description));
 | 
|---|
| [7aa000] | 64 | }
 | 
|---|
 | 65 | 
 | 
|---|
| [a2ab15] | 66 | void TextDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check, string description) {
 | 
|---|
 | 67 |   registerQuery(new VectorTextQuery(title,target,cellSize,check,description));
 | 
|---|
| [2ededc2] | 68 | }
 | 
|---|
 | 69 | 
 | 
|---|
| [97ebf8] | 70 | void TextDialog::queryBox(const char* title,double ** const cellSize, string description) {
 | 
|---|
 | 71 |   registerQuery(new BoxTextQuery(title,cellSize,description));
 | 
|---|
 | 72 | }
 | 
|---|
 | 73 | 
 | 
|---|
| [104524] | 74 | void TextDialog::queryElement(const char* title, std::vector<element *> *target, string description){
 | 
|---|
| [a2ab15] | 75 |   registerQuery(new ElementTextQuery(title,target,description));
 | 
|---|
| [5a7243] | 76 | }
 | 
|---|
 | 77 | 
 | 
|---|
| [7aa000] | 78 | /************************** Query Infrastructure ************************/
 | 
|---|
 | 79 | 
 | 
|---|
| [86466e] | 80 | TextDialog::EmptyTextQuery::EmptyTextQuery(string title, std::string _description) :
 | 
|---|
 | 81 |     Dialog::EmptyQuery(title,_description)
 | 
|---|
 | 82 | {}
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 | TextDialog::EmptyTextQuery::~EmptyTextQuery() {}
 | 
|---|
 | 85 | 
 | 
|---|
 | 86 | bool TextDialog::EmptyTextQuery::handle() {
 | 
|---|
 | 87 |   cout << "Message of " << getTitle() << ":\n" << getDescription() << "\n";
 | 
|---|
 | 88 |   return true;
 | 
|---|
 | 89 | }
 | 
|---|
 | 90 | 
 | 
|---|
 | 91 | TextDialog::IntTextQuery::IntTextQuery(string title, int * _target, std::string _description) :
 | 
|---|
| [a2ab15] | 92 |     Dialog::IntQuery(title,_target,_description)
 | 
|---|
| [45f5d6] | 93 | {}
 | 
|---|
 | 94 | 
 | 
|---|
 | 95 | TextDialog::IntTextQuery::~IntTextQuery() {}
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | bool TextDialog::IntTextQuery::handle() {
 | 
|---|
| [8de8f7] | 98 |   bool badInput = false;
 | 
|---|
 | 99 |   do{
 | 
|---|
 | 100 |     badInput = false;
 | 
|---|
 | 101 |     Log() << Verbose(0) << getTitle();
 | 
|---|
 | 102 |     cin >> tmp;
 | 
|---|
 | 103 |     if(cin.fail()){
 | 
|---|
 | 104 |       badInput=true;
 | 
|---|
 | 105 |       cin.clear();
 | 
|---|
 | 106 |       cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 107 |       Log() << Verbose(0) << "Input was not a number!" << endl;
 | 
|---|
 | 108 |     }
 | 
|---|
 | 109 |   } while(badInput);
 | 
|---|
 | 110 |   // clear the input buffer of anything still in the line
 | 
|---|
 | 111 |   cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
| [45f5d6] | 112 |   return true;
 | 
|---|
 | 113 | }
 | 
|---|
 | 114 | 
 | 
|---|
| [97ebf8] | 115 | TextDialog::BooleanTextQuery::BooleanTextQuery(string title, bool * _target, std::string _description) :
 | 
|---|
 | 116 |     Dialog::BooleanQuery(title,_target,_description)
 | 
|---|
 | 117 | {}
 | 
|---|
 | 118 | 
 | 
|---|
 | 119 | TextDialog::BooleanTextQuery::~BooleanTextQuery() {}
 | 
|---|
 | 120 | 
 | 
|---|
 | 121 | bool TextDialog::BooleanTextQuery::handle() {
 | 
|---|
 | 122 |   bool badInput = false;
 | 
|---|
 | 123 |   char input = ' ';
 | 
|---|
 | 124 |   do{
 | 
|---|
 | 125 |     badInput = false;
 | 
|---|
 | 126 |     Log() << Verbose(0) << getTitle();
 | 
|---|
 | 127 |     cin >> input;
 | 
|---|
 | 128 |     if ((input == 'y' ) || (input == 'Y')) {
 | 
|---|
 | 129 |       tmp = true;
 | 
|---|
 | 130 |     } else if ((input == 'n' ) || (input == 'N')) {
 | 
|---|
 | 131 |       tmp = false;
 | 
|---|
 | 132 |     } else {
 | 
|---|
 | 133 |       badInput=true;
 | 
|---|
 | 134 |       cin.clear();
 | 
|---|
 | 135 |       cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 136 |       Log() << Verbose(0) << "Input was not of [yYnN]!" << endl;
 | 
|---|
 | 137 |     }
 | 
|---|
 | 138 |   } while(badInput);
 | 
|---|
 | 139 |   // clear the input buffer of anything still in the line
 | 
|---|
 | 140 |   cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 141 |   return true;
 | 
|---|
 | 142 | }
 | 
|---|
 | 143 | 
 | 
|---|
| [a2ab15] | 144 | TextDialog::StringTextQuery::StringTextQuery(string title,string *_target, std::string _description) :
 | 
|---|
 | 145 |     Dialog::StringQuery(title,_target,_description)
 | 
|---|
| [45f5d6] | 146 | {}
 | 
|---|
 | 147 | 
 | 
|---|
 | 148 | TextDialog::StringTextQuery::~StringTextQuery() {}
 | 
|---|
 | 149 | 
 | 
|---|
 | 150 | bool TextDialog::StringTextQuery::handle() {
 | 
|---|
| [7aa000] | 151 |   Log() << Verbose(0) << getTitle();
 | 
|---|
| [8de8f7] | 152 |   getline(cin,tmp);
 | 
|---|
| [45f5d6] | 153 |   return true;
 | 
|---|
| [f5a86a] | 154 | }
 | 
|---|
| [7aa000] | 155 | 
 | 
|---|
| [a2ab15] | 156 | TextDialog::DoubleTextQuery::DoubleTextQuery(string title,double *_target, std::string _description) :
 | 
|---|
 | 157 |     Dialog::DoubleQuery(title,_target,_description)
 | 
|---|
| [2ededc2] | 158 | {}
 | 
|---|
 | 159 | 
 | 
|---|
 | 160 | TextDialog::DoubleTextQuery::~DoubleTextQuery() {}
 | 
|---|
 | 161 | 
 | 
|---|
 | 162 | bool TextDialog::DoubleTextQuery::handle() {
 | 
|---|
| [8de8f7] | 163 |   bool badInput = false;
 | 
|---|
 | 164 |   do{
 | 
|---|
 | 165 |     badInput = false;
 | 
|---|
 | 166 |     Log() << Verbose(0) << getTitle();
 | 
|---|
 | 167 |     cin >> tmp;
 | 
|---|
 | 168 |     if(cin.fail()){
 | 
|---|
 | 169 |       badInput = true;
 | 
|---|
 | 170 |       cin.clear();
 | 
|---|
 | 171 |       cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 172 |       Log() << Verbose(0) << "Input was not a number!" << endl;
 | 
|---|
 | 173 |     }
 | 
|---|
 | 174 |   }while(badInput);
 | 
|---|
 | 175 |   cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
| [2ededc2] | 176 |   return true;
 | 
|---|
 | 177 | }
 | 
|---|
 | 178 | 
 | 
|---|
| [97ebf8] | 179 | TextDialog::AtomTextQuery::AtomTextQuery(string title, atom **_target, std::string _description) :
 | 
|---|
 | 180 |     Dialog::AtomQuery(title,_target,_description)
 | 
|---|
 | 181 | {}
 | 
|---|
 | 182 | 
 | 
|---|
 | 183 | TextDialog::AtomTextQuery::~AtomTextQuery() {}
 | 
|---|
 | 184 | 
 | 
|---|
 | 185 | bool TextDialog::AtomTextQuery::handle() {
 | 
|---|
 | 186 |   int idxOfAtom=0;
 | 
|---|
 | 187 |   bool badInput = false;
 | 
|---|
 | 188 |   do{
 | 
|---|
 | 189 |     badInput = false;
 | 
|---|
 | 190 |     Log() << Verbose(0) << getTitle();
 | 
|---|
 | 191 |     cin >> idxOfAtom;
 | 
|---|
 | 192 |     if(cin.fail()){
 | 
|---|
 | 193 |       badInput = true;
 | 
|---|
 | 194 |       cin.clear();
 | 
|---|
 | 195 |       cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 196 |       Log() << Verbose(0) << "Input was not a number!" << endl;
 | 
|---|
 | 197 |       continue;
 | 
|---|
 | 198 |     }
 | 
|---|
 | 199 | 
 | 
|---|
 | 200 |     tmp = World::getInstance().getAtom(AtomById(idxOfAtom));
 | 
|---|
 | 201 |     if(!tmp && idxOfAtom!=-1){
 | 
|---|
 | 202 |       Log() << Verbose(0) << "Invalid Atom Index" << endl;
 | 
|---|
 | 203 |       badInput = true;
 | 
|---|
 | 204 |     }
 | 
|---|
 | 205 | 
 | 
|---|
 | 206 |   } while(badInput);
 | 
|---|
 | 207 |   cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 208 |   return (idxOfAtom!=-1);
 | 
|---|
 | 209 | }
 | 
|---|
 | 210 | 
 | 
|---|
 | 211 | TextDialog::MoleculeTextQuery::MoleculeTextQuery(string title, molecule **_target, std::string _description) :
 | 
|---|
 | 212 |     Dialog::MoleculeQuery(title,_target,_description)
 | 
|---|
| [7aa000] | 213 | {}
 | 
|---|
 | 214 | 
 | 
|---|
 | 215 | TextDialog::MoleculeTextQuery::~MoleculeTextQuery() {}
 | 
|---|
 | 216 | 
 | 
|---|
 | 217 | bool TextDialog::MoleculeTextQuery::handle() {
 | 
|---|
| [8de8f7] | 218 |   int idxOfMol=0;
 | 
|---|
 | 219 |   bool badInput = false;
 | 
|---|
 | 220 |   do{
 | 
|---|
 | 221 |     badInput = false;
 | 
|---|
| [7aa000] | 222 |     Log() << Verbose(0) << getTitle();
 | 
|---|
 | 223 |     cin >> idxOfMol;
 | 
|---|
| [8de8f7] | 224 |     if(cin.fail()){
 | 
|---|
 | 225 |       badInput = true;
 | 
|---|
 | 226 |       cin.clear();
 | 
|---|
 | 227 |       cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 228 |       Log() << Verbose(0) << "Input was not a number!" << endl;
 | 
|---|
 | 229 |       continue;
 | 
|---|
 | 230 |     }
 | 
|---|
 | 231 | 
 | 
|---|
| [97ebf8] | 232 |     tmp = World::getInstance().getMolecule(MoleculeById(idxOfMol));
 | 
|---|
| [8de8f7] | 233 |     if(!tmp && idxOfMol!=-1){
 | 
|---|
 | 234 |       Log() << Verbose(0) << "Invalid Molecule Index" << endl;
 | 
|---|
 | 235 |       badInput = true;
 | 
|---|
 | 236 |     }
 | 
|---|
 | 237 | 
 | 
|---|
 | 238 |   } while(badInput);
 | 
|---|
 | 239 |   cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
| [7aa000] | 240 |   return (idxOfMol!=-1);
 | 
|---|
 | 241 | }
 | 
|---|
| [2ededc2] | 242 | 
 | 
|---|
| [a2ab15] | 243 | TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check, std::string _description) :
 | 
|---|
 | 244 |     Dialog::VectorQuery(title,_target,_cellSize,_check,_description)
 | 
|---|
| [2ededc2] | 245 | {}
 | 
|---|
 | 246 | 
 | 
|---|
 | 247 | TextDialog::VectorTextQuery::~VectorTextQuery()
 | 
|---|
 | 248 | {}
 | 
|---|
 | 249 | 
 | 
|---|
 | 250 | bool TextDialog::VectorTextQuery::handle() {
 | 
|---|
| [0a4f7f] | 251 |   Log() << Verbose(0) << getTitle();
 | 
|---|
 | 252 | 
 | 
|---|
 | 253 |   char coords[3] = {'x','y','z'};
 | 
|---|
 | 254 |   int j = -1;
 | 
|---|
 | 255 |   for (int i=0;i<3;i++) {
 | 
|---|
 | 256 |     j += i+1;
 | 
|---|
 | 257 |     do {
 | 
|---|
 | 258 |       Log() << Verbose(0) << coords[i] << "[0.." << cellSize[j] << "]: ";
 | 
|---|
 | 259 |       cin >> (*tmp)[i];
 | 
|---|
 | 260 |     } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= cellSize[j])) && (check));
 | 
|---|
 | 261 |   }
 | 
|---|
 | 262 |   return true;
 | 
|---|
| [5a7243] | 263 | }
 | 
|---|
 | 264 | 
 | 
|---|
| [97ebf8] | 265 | TextDialog::BoxTextQuery::BoxTextQuery(std::string title, double ** const _cellSize, std::string _description) :
 | 
|---|
 | 266 |     Dialog::BoxQuery(title,_cellSize,_description)
 | 
|---|
 | 267 | {}
 | 
|---|
 | 268 | 
 | 
|---|
 | 269 | TextDialog::BoxTextQuery::~BoxTextQuery()
 | 
|---|
 | 270 | {}
 | 
|---|
 | 271 | 
 | 
|---|
 | 272 | bool TextDialog::BoxTextQuery::handle() {
 | 
|---|
 | 273 |   Log() << Verbose(0) << getTitle();
 | 
|---|
 | 274 | 
 | 
|---|
 | 275 |   std::string coords[6] = {"xx","xy","xz", "yy", "yz", "zz"};
 | 
|---|
 | 276 |   for (int i=0;i<6;i++) {
 | 
|---|
 | 277 |     Log() << Verbose(0) << coords[i] << ": ";
 | 
|---|
 | 278 |     cin >> tmp[i];
 | 
|---|
 | 279 |   }
 | 
|---|
 | 280 |   return true;
 | 
|---|
 | 281 | }
 | 
|---|
| [5a7243] | 282 | 
 | 
|---|
| [104524] | 283 | TextDialog::ElementTextQuery::ElementTextQuery(std::string title, std::vector<element *> *_target, std::string _description) :
 | 
|---|
 | 284 |     Dialog::ElementQuery(title,_target,_description)
 | 
|---|
| [5a7243] | 285 | {}
 | 
|---|
 | 286 | 
 | 
|---|
 | 287 | TextDialog::ElementTextQuery::~ElementTextQuery()
 | 
|---|
 | 288 | {}
 | 
|---|
 | 289 | 
 | 
|---|
 | 290 | bool TextDialog::ElementTextQuery::handle() {
 | 
|---|
| [8de8f7] | 291 |   bool badInput=false;
 | 
|---|
 | 292 |   bool aborted = false;
 | 
|---|
| [104524] | 293 |   element * tmp = NULL;
 | 
|---|
| [8de8f7] | 294 |   do{
 | 
|---|
 | 295 |     badInput = false;
 | 
|---|
 | 296 |     Log() << Verbose(0) << getTitle();
 | 
|---|
 | 297 | 
 | 
|---|
 | 298 |     // try to read as Atomic number
 | 
|---|
 | 299 |     int Z;
 | 
|---|
 | 300 |     cin >> Z;
 | 
|---|
 | 301 |     if(!cin.fail()){
 | 
|---|
 | 302 |       if(Z==-1){
 | 
|---|
 | 303 |         aborted = true;
 | 
|---|
 | 304 |       }
 | 
|---|
 | 305 |       else{
 | 
|---|
 | 306 |         tmp = World::getInstance().getPeriode()->FindElement(Z);
 | 
|---|
 | 307 |         if(!tmp){
 | 
|---|
 | 308 |           Log() << Verbose(0) << "No element with this atomic number!" << endl;
 | 
|---|
 | 309 |           badInput = true;
 | 
|---|
| [104524] | 310 |         } else {
 | 
|---|
 | 311 |           elements.push_back(tmp);
 | 
|---|
| [8de8f7] | 312 |         }
 | 
|---|
 | 313 |       }
 | 
|---|
 | 314 |       continue;
 | 
|---|
 | 315 |     }
 | 
|---|
 | 316 |     else{
 | 
|---|
 | 317 |       cin.clear();
 | 
|---|
 | 318 |     }
 | 
|---|
 | 319 | 
 | 
|---|
 | 320 |     // Try to read as shorthand
 | 
|---|
 | 321 |     // the last buffer content was not removed, so we read the
 | 
|---|
 | 322 |     // same thing again, this time as a string
 | 
|---|
 | 323 |     string shorthand;
 | 
|---|
 | 324 |     cin >> shorthand;
 | 
|---|
 | 325 |     if(!cin.fail()){
 | 
|---|
 | 326 |       if(shorthand.empty()){
 | 
|---|
 | 327 |         aborted = true;
 | 
|---|
 | 328 |       }
 | 
|---|
 | 329 |       else{
 | 
|---|
 | 330 |         tmp = World::getInstance().getPeriode()->FindElement(shorthand.c_str());
 | 
|---|
 | 331 |         if(!tmp){
 | 
|---|
 | 332 |           Log() << Verbose(0) << "No element with this shorthand!" << endl;
 | 
|---|
 | 333 |           badInput = true;
 | 
|---|
| [104524] | 334 |         } else {
 | 
|---|
 | 335 |           elements.push_back(tmp);
 | 
|---|
| [8de8f7] | 336 |         }
 | 
|---|
 | 337 |       }
 | 
|---|
 | 338 |     }
 | 
|---|
 | 339 |     else{
 | 
|---|
 | 340 |       Log() << Verbose(0) << "Could not read input. Try Again." << endl;
 | 
|---|
 | 341 |       cin.clear();
 | 
|---|
 | 342 |       cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 343 |       badInput = true;
 | 
|---|
 | 344 |     }
 | 
|---|
 | 345 | 
 | 
|---|
 | 346 |   }while(badInput);
 | 
|---|
 | 347 |   cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
 | 
|---|
 | 348 |   return !aborted;
 | 
|---|
| [2ededc2] | 349 | }
 | 
|---|