gui/new_map_win.cc
author hegyi
Thu, 05 Jan 2006 12:30:09 +0000
changeset 1878 409a31271efd
parent 1849 a4d1362397fe
child 1879 01d41844ef46
permissions -rw-r--r--
Several changes. \n If new map is added to mapstorage it emits signal with the name of the new map. This was important, because from now on not only tha mapwin should be updated. \n Furthermore algobox gets a pointer to mapstorage instead of only the mapnames from it. This is important because without it it would be complicated to pass all of the required maps to algobox.
hegyi@1593
     1
#include <new_map_win.h>
hegyi@1593
     2
hegyi@1593
     3
bool NewMapWin::closeIfEscapeIsPressed(GdkEventKey* e)
hegyi@1593
     4
{
hegyi@1593
     5
  if(e->keyval==GDK_Escape)
hegyi@1593
     6
  {
hegyi@1593
     7
    hide();
hegyi@1593
     8
  }
hegyi@1593
     9
  return true;
hegyi@1593
    10
}
hegyi@1593
    11
hegyi@1849
    12
NewMapWin::NewMapWin(const std::string& title, NoteBookTab & mw, bool itisedge, bool edgenode):Gtk::Dialog(title, true, true),mytab(mw),node("Create NodeMap"),edge("Create EdgeMap")
hegyi@1593
    13
{
hegyi@1593
    14
  set_default_size(200, 50);
hegyi@1593
    15
hegyi@1593
    16
  signal_key_press_event().connect(sigc::mem_fun(*this, &NewMapWin::closeIfEscapeIsPressed));
hegyi@1593
    17
hegyi@1823
    18
  Gtk::VBox * vbox=get_vbox();
hegyi@1593
    19
hegyi@1593
    20
  //entries
hegyi@1593
    21
  table=new Gtk::Table(3, 2, false);
hegyi@1593
    22
hegyi@1593
    23
  label=new Gtk::Label;
hegyi@1593
    24
  label->set_text("Name of new map:");
hegyi@1593
    25
  name.set_text("");
hegyi@1593
    26
hegyi@1593
    27
  (*table).attach(*label,0,1,0,1,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@1593
    28
  (*table).attach(name,1,2,0,1,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@1593
    29
hegyi@1593
    30
  label=new Gtk::Label;
hegyi@1593
    31
  label->set_text("Default value in the map:");
hegyi@1593
    32
  default_value.set_text("0");
hegyi@1593
    33
hegyi@1593
    34
  (*table).attach(*label,0,1,1,2,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@1593
    35
  (*table).attach(default_value,1,2,1,2,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@1593
    36
hegyi@1593
    37
  //node vs. edge map selector
hegyi@1593
    38
  Gtk::RadioButton::Group group = node.get_group();
hegyi@1593
    39
  edge.set_group(group);
hegyi@1823
    40
  
hegyi@1823
    41
  if(edgenode)
hegyi@1823
    42
    {
hegyi@1823
    43
      (*table).attach(node,0,1,2,3,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@1823
    44
      (*table).attach(edge,1,2,2,3,Gtk::SHRINK,Gtk::SHRINK,10,3);
hegyi@1823
    45
    }
hegyi@1823
    46
  else
hegyi@1823
    47
    {
hegyi@1823
    48
      if(itisedge)
hegyi@1823
    49
	{
hegyi@1823
    50
	  edge.set_active();
hegyi@1823
    51
	}
hegyi@1823
    52
      else
hegyi@1823
    53
	{
hegyi@1823
    54
	  node.set_active();
hegyi@1823
    55
	}
hegyi@1823
    56
    }
hegyi@1593
    57
hegyi@1823
    58
  vbox->pack_start(*table);
hegyi@1593
    59
hegyi@1593
    60
  //OK button
hegyi@1823
    61
  add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
hegyi@1593
    62
hegyi@1593
    63
  show_all_children();
hegyi@1593
    64
hegyi@1593
    65
}
hegyi@1593
    66
hegyi@1823
    67
void NewMapWin::on_response(int response_id)
hegyi@1737
    68
{
hegyi@1823
    69
  if(response_id==Gtk::RESPONSE_OK)
hegyi@1737
    70
    {
hegyi@1823
    71
      double def_val=0;
hegyi@1737
    72
hegyi@1823
    73
      //get and formulate text
hegyi@1823
    74
      std::string def_val_str=default_value.get_text();
hegyi@1823
    75
      std::string polishform=string2Polishform(def_val_str,edge.get_active());
hegyi@1593
    76
hegyi@1823
    77
      //get name of text
hegyi@1823
    78
      std::string mapname=name.get_text();
hegyi@1593
    79
hegyi@1823
    80
      if(!mapname.empty()&&!polishform.empty())
hegyi@1823
    81
	{
hegyi@1823
    82
	  int abortion=0;
hegyi@1823
    83
	  if(edge.get_active())
hegyi@1823
    84
	    {
hegyi@1823
    85
	      //create the new map
hegyi@1849
    86
	      Graph::EdgeMap<double> * emptr=new Graph::EdgeMap<double> (mytab.mapstorage.graph);
hegyi@1593
    87
hegyi@1823
    88
	      std::stack<double> polishstack;
hegyi@1814
    89
  
hegyi@1849
    90
	      for(EdgeIt k(mytab.mapstorage.graph); k!=INVALID; ++k)
hegyi@1814
    91
		{
hegyi@1823
    92
		  for(int i=0;i<(int)polishform.size();i++)
hegyi@1814
    93
		    {
hegyi@1823
    94
		      double op1, op2;
hegyi@1823
    95
		      bool operation=true;
hegyi@1814
    96
		      switch(polishform[i])
hegyi@1814
    97
			{
hegyi@1814
    98
			case '+':
hegyi@1814
    99
			case '-':
hegyi@1814
   100
			case '/':
hegyi@1814
   101
			case '*':
hegyi@1823
   102
			  op1=polishstack.top();
hegyi@1823
   103
			  polishstack.pop();
hegyi@1823
   104
			  op2=polishstack.top();
hegyi@1823
   105
			  polishstack.pop();
hegyi@1814
   106
			  break;
hegyi@1814
   107
			default:
hegyi@1823
   108
			  //substitute variable
hegyi@1849
   109
			  std::map< std::string,Graph::EdgeMap<double> * > ems=mytab.mapstorage.edgemap_storage;
hegyi@1823
   110
			  bool itisvar=(ems.find(ch2var[ polishform[i] ])!=ems.end());
hegyi@1823
   111
			  if(itisvar)
hegyi@1823
   112
			    {
hegyi@1849
   113
			      polishstack.push( (*(mytab.mapstorage.edgemap_storage[ ch2var[ polishform[i] ] ]))[k]);
hegyi@1823
   114
			    }
hegyi@1823
   115
			  else
hegyi@1823
   116
			    {
hegyi@1823
   117
			      char * def_val_ch=new char [(int)(ch2var[ polishform[i] ].length())];
hegyi@1823
   118
			      for(int j=0;j<(int)(ch2var[ polishform[i] ].length());j++)
hegyi@1823
   119
				{
hegyi@1823
   120
				  def_val_ch[j]=ch2var[ polishform[i] ][j];
hegyi@1823
   121
				}
hegyi@1823
   122
			      polishstack.push(atof(def_val_ch));
hegyi@1823
   123
			    }
hegyi@1823
   124
			  operation=false;
hegyi@1814
   125
			  break;
hegyi@1814
   126
			}
hegyi@1823
   127
		      if(operation)
hegyi@1823
   128
			{
hegyi@1823
   129
			  double res;
hegyi@1823
   130
			  switch(polishform[i])
hegyi@1823
   131
			    {
hegyi@1823
   132
			    case '+':
hegyi@1823
   133
			      res=op1+op2;
hegyi@1823
   134
			      break;
hegyi@1823
   135
			    case '-':
hegyi@1823
   136
			      res=op2-op1;
hegyi@1823
   137
			      break;
hegyi@1823
   138
			    case '/':
hegyi@1823
   139
			      res=op2/op1;
hegyi@1823
   140
			      break;
hegyi@1823
   141
			    case '*':
hegyi@1823
   142
			      res=op1*op2;
hegyi@1823
   143
			      break;
hegyi@1823
   144
			    default:
hegyi@1823
   145
			      std::cout << "How could we get here?" << std::endl;
hegyi@1823
   146
			      break;
hegyi@1823
   147
			    }
hegyi@1823
   148
			  polishstack.push(res);
hegyi@1823
   149
			}
hegyi@1814
   150
		    }
hegyi@1823
   151
		  (*emptr)[k]=polishstack.top(); 
hegyi@1814
   152
		}
hegyi@1823
   153
hegyi@1823
   154
	      //if addition was not successful addEdgeMap returns one.
hegyi@1823
   155
	      //cause can be that there is already a map named like the new one
hegyi@1849
   156
	      if(mytab.mapstorage.addEdgeMap(mapname, emptr, def_val))
hegyi@1823
   157
		{
hegyi@1823
   158
		  abortion=1;
hegyi@1823
   159
		}
hegyi@1823
   160
hegyi@1823
   161
	      //add it to the list of the displayable maps
hegyi@1878
   162
	      //furthermore it is done by signals
hegyi@1878
   163
	      //mytab.registerNewEdgeMap(mapname);
hegyi@1823
   164
hegyi@1823
   165
	      //display it
hegyi@1837
   166
	      //gdc.changeEdgeText(mapname);
hegyi@1814
   167
	    }
hegyi@1823
   168
	  else //!edge.get_active()
hegyi@1823
   169
	    {
hegyi@1823
   170
	      //create the new map
hegyi@1849
   171
	      Graph::NodeMap<double> * emptr=new Graph::NodeMap<double> (mytab.mapstorage.graph);
hegyi@1814
   172
hegyi@1823
   173
	      std::stack<double> polishstack;
hegyi@1814
   174
  
hegyi@1849
   175
	      for(NodeIt k(mytab.mapstorage.graph); k!=INVALID; ++k)
hegyi@1814
   176
		{
hegyi@1823
   177
		  for(int i=0;i<(int)polishform.size();i++)
hegyi@1814
   178
		    {
hegyi@1823
   179
		      double op1, op2;
hegyi@1823
   180
		      bool operation=true;
hegyi@1814
   181
		      switch(polishform[i])
hegyi@1814
   182
			{
hegyi@1814
   183
			case '+':
hegyi@1814
   184
			case '-':
hegyi@1814
   185
			case '/':
hegyi@1814
   186
			case '*':
hegyi@1823
   187
			  op1=polishstack.top();
hegyi@1823
   188
			  polishstack.pop();
hegyi@1823
   189
			  op2=polishstack.top();
hegyi@1823
   190
			  polishstack.pop();
hegyi@1814
   191
			  break;
hegyi@1814
   192
			default:
hegyi@1849
   193
			  std::map< std::string,Graph::NodeMap<double> * > nms=mytab.mapstorage.nodemap_storage;
hegyi@1823
   194
			  bool itisvar=(nms.find(ch2var[ polishform[i] ])!=nms.end());
hegyi@1823
   195
			  if(itisvar)
hegyi@1823
   196
			    {
hegyi@1849
   197
			      polishstack.push( (*(mytab.mapstorage.nodemap_storage[ ch2var[ polishform[i] ] ]))[k]);
hegyi@1823
   198
			    }
hegyi@1823
   199
			  else
hegyi@1823
   200
			    {
hegyi@1823
   201
			      char * def_val_ch=new char [(int)(ch2var[ polishform[i] ].length())];
hegyi@1823
   202
			      for(int j=0;j<(int)(ch2var[ polishform[i] ].length());j++)
hegyi@1823
   203
				{
hegyi@1823
   204
				  def_val_ch[j]=ch2var[ polishform[i] ][j];
hegyi@1823
   205
				}
hegyi@1823
   206
			      polishstack.push(atof(def_val_ch));
hegyi@1823
   207
			    }
hegyi@1823
   208
			  operation=false;
hegyi@1814
   209
			  break;
hegyi@1814
   210
			}
hegyi@1823
   211
		      if(operation)
hegyi@1823
   212
			{
hegyi@1823
   213
			  double res;
hegyi@1823
   214
			  switch(polishform[i])
hegyi@1823
   215
			    {
hegyi@1823
   216
			    case '+':
hegyi@1823
   217
			      res=op1+op2;
hegyi@1823
   218
			      break;
hegyi@1823
   219
			    case '-':
hegyi@1823
   220
			      res=op2-op1;
hegyi@1823
   221
			      break;
hegyi@1823
   222
			    case '/':
hegyi@1823
   223
			      res=op2/op1;
hegyi@1823
   224
			      break;
hegyi@1823
   225
			    case '*':
hegyi@1823
   226
			      res=op1*op2;
hegyi@1823
   227
			      break;
hegyi@1823
   228
			    default:
hegyi@1823
   229
			      std::cout << "How could we get here?" << std::endl;
hegyi@1823
   230
			      break;
hegyi@1823
   231
			    }
hegyi@1823
   232
			  polishstack.push(res);
hegyi@1823
   233
			}
hegyi@1814
   234
		    }
hegyi@1823
   235
		  (*emptr)[k]=polishstack.top(); 
hegyi@1814
   236
		}
hegyi@1823
   237
hegyi@1823
   238
	      //if addition was not successful addNodeMap returns one.
hegyi@1823
   239
	      //cause can be that there is already a map named like the new one
hegyi@1849
   240
	      if(mytab.mapstorage.addNodeMap(mapname,emptr, def_val))
hegyi@1823
   241
		{
hegyi@1823
   242
		  abortion=1;
hegyi@1823
   243
		}
hegyi@1823
   244
hegyi@1823
   245
	      //add it to the list of the displayable maps
hegyi@1878
   246
	      //furthermore it is done by signals
hegyi@1878
   247
	      //mytab.registerNewNodeMap(mapname);
hegyi@1823
   248
hegyi@1823
   249
	      //display it
hegyi@1823
   250
	      //gdc.changeNodeText(mapname);
hegyi@1814
   251
	    }
hegyi@1823
   252
	  if(!abortion)
hegyi@1814
   253
	    {
hegyi@1823
   254
	      name.set_text("");
hegyi@1823
   255
	      default_value.set_text("0");
hegyi@1823
   256
	      edge.show();
hegyi@1823
   257
	      node.show();
hegyi@1823
   258
	      hide();
hegyi@1814
   259
	    }
hegyi@1597
   260
	}
hegyi@1593
   261
    }
hegyi@1593
   262
}
hegyi@1593
   263
hegyi@1823
   264
hegyi@1814
   265
std::string NewMapWin::string2Polishform(std::string rawcommand, bool itisedge)
hegyi@1814
   266
{
hegyi@1814
   267
  bool valid_entry=true;
hegyi@1814
   268
hegyi@1814
   269
  std::map<std::string, int> str2i;
hegyi@1814
   270
hegyi@1814
   271
  std::string command;
hegyi@1814
   272
hegyi@1814
   273
  std::string variable;
hegyi@1814
   274
hegyi@1814
   275
  char index='a';
hegyi@1814
   276
hegyi@1814
   277
  for(int i=0;(valid_entry&&(i<(int)rawcommand.size()));i++)
hegyi@1814
   278
    {
hegyi@1814
   279
      switch(rawcommand[i])
hegyi@1814
   280
	{
hegyi@1814
   281
	case '+':
hegyi@1814
   282
	case '-':
hegyi@1814
   283
	case '*':
hegyi@1814
   284
	case '/':
hegyi@1814
   285
	case ')':
hegyi@1814
   286
	case '(':
hegyi@1814
   287
 	  if(!variable.empty())
hegyi@1814
   288
	    {
hegyi@1814
   289
	      valid_entry=validVariable(variable, itisedge);
hegyi@1814
   290
	      ch2var[index]=variable;
hegyi@1814
   291
	      command+=index;
hegyi@1814
   292
	      index++;
hegyi@1814
   293
	      variable.erase(0,variable.size());	  
hegyi@1814
   294
	    }
hegyi@1814
   295
	  command+=rawcommand[i];
hegyi@1814
   296
	  break;
hegyi@1814
   297
	default:
hegyi@1814
   298
	  variable+=rawcommand[i];
hegyi@1814
   299
	  break;
hegyi@1814
   300
	}
hegyi@1814
   301
    }
hegyi@1814
   302
hegyi@1814
   303
  if(!variable.empty()&&valid_entry)
hegyi@1814
   304
    {
hegyi@1814
   305
      valid_entry=validVariable(variable, itisedge);
hegyi@1814
   306
      ch2var[index]=variable;
hegyi@1814
   307
      command+=index;
hegyi@1814
   308
      index++;
hegyi@1814
   309
      variable.erase(0,variable.size());	  
hegyi@1814
   310
    }
hegyi@1814
   311
hegyi@1814
   312
  if(valid_entry)
hegyi@1814
   313
    {
hegyi@1814
   314
      unsigned int pr=10000;
hegyi@1814
   315
      bool prevmult=false;
hegyi@1819
   316
      unsigned int prev_change=pr;
hegyi@1819
   317
      unsigned int prev_br=pr;
hegyi@1814
   318
      int counter=0;
hegyi@1814
   319
      std::string comm_nobr="";
hegyi@1814
   320
      std::vector<unsigned int> p;
hegyi@1814
   321
      p.resize(counter+1);
hegyi@1814
   322
      
hegyi@1814
   323
      //limits
hegyi@1814
   324
      //6 brackets embedded
hegyi@1814
   325
      //100 operation in a row from the same priority
hegyi@1814
   326
      
hegyi@1814
   327
      for(int i=0;i<(int)command.size();i++)
hegyi@1814
   328
	{
hegyi@1814
   329
	  bool put_in_string=true;
hegyi@1814
   330
	  switch(command[i])
hegyi@1814
   331
	    {
hegyi@1814
   332
	    case '(':
hegyi@1814
   333
	      pr=prev_br+10000;
hegyi@1814
   334
	      prev_br=pr;
hegyi@1814
   335
	      prevmult=false;
hegyi@1814
   336
	      put_in_string=false;
hegyi@1814
   337
	      break;
hegyi@1814
   338
	    case ')':
hegyi@1814
   339
	      pr=prev_br-10000;
hegyi@1814
   340
	      prev_br=pr;
hegyi@1814
   341
	      prevmult=false;
hegyi@1814
   342
	      put_in_string=false;
hegyi@1814
   343
	      break;
hegyi@1814
   344
	    case '+':
hegyi@1814
   345
	    case '-':
hegyi@1814
   346
	      if(prevmult)
hegyi@1814
   347
		{
hegyi@1814
   348
		  pr=prev_change;
hegyi@1814
   349
		}
hegyi@1814
   350
	      p[counter]=pr;
hegyi@1814
   351
	      pr-=100;
hegyi@1814
   352
hegyi@1814
   353
	      prevmult=false;
hegyi@1814
   354
	      break;
hegyi@1814
   355
	    case '/':
hegyi@1814
   356
	    case '*':
hegyi@1814
   357
	      if(!prevmult)
hegyi@1814
   358
		{
hegyi@1814
   359
		  prev_change=pr;
hegyi@1814
   360
		  pr+=200;
hegyi@1814
   361
		  pr-=1;
hegyi@1814
   362
		}
hegyi@1814
   363
	      p[counter]=pr;
hegyi@1814
   364
	      pr-=1;
hegyi@1814
   365
	      prevmult=true;
hegyi@1814
   366
	      break;
hegyi@1814
   367
	    default:
hegyi@1814
   368
	      p[counter]=65000;
hegyi@1814
   369
	      break;
hegyi@1814
   370
	    }
hegyi@1814
   371
	  if(put_in_string)
hegyi@1814
   372
	    {
hegyi@1814
   373
	      counter++;
hegyi@1814
   374
	      p.resize(counter+1);
hegyi@1814
   375
	      comm_nobr=comm_nobr+command[i];
hegyi@1814
   376
	    }
hegyi@1814
   377
	}
hegyi@1814
   378
hegyi@1814
   379
      tree_node * root=weightedString2Tree(comm_nobr, p, 0);
hegyi@1814
   380
hegyi@1814
   381
      std::string polishform=postOrder(root);
hegyi@1814
   382
hegyi@1814
   383
      return polishform;
hegyi@1814
   384
    }
hegyi@1814
   385
  return "";
hegyi@1814
   386
}
hegyi@1814
   387
hegyi@1814
   388
NewMapWin::tree_node * NewMapWin::weightedString2Tree(std::string to_tree, std::vector<unsigned int> & p, int offset)
hegyi@1814
   389
{
hegyi@1819
   390
  unsigned int min=p[offset];
hegyi@1814
   391
  int minplace=0;
hegyi@1814
   392
  for(int i=0;i<(int)to_tree.size();i++)
hegyi@1814
   393
    {
hegyi@1814
   394
      if(min>p[offset+i])
hegyi@1814
   395
	{
hegyi@1814
   396
	  min=p[offset+i];
hegyi@1814
   397
	  minplace=i;
hegyi@1814
   398
	}
hegyi@1814
   399
    }
hegyi@1814
   400
  tree_node * act_node=new tree_node;
hegyi@1814
   401
  act_node->ch=to_tree[minplace];
hegyi@1814
   402
  if(to_tree.size()>=3)
hegyi@1814
   403
    {
hegyi@1814
   404
      act_node->left_child=weightedString2Tree(to_tree.substr(0,minplace), p, offset);
hegyi@1814
   405
      act_node->right_child=weightedString2Tree(to_tree.substr(minplace+1,to_tree.size()-minplace-1), p, offset+minplace+1);
hegyi@1814
   406
    }
hegyi@1814
   407
  else
hegyi@1814
   408
    {
hegyi@1814
   409
      act_node->left_child=NULL;
hegyi@1814
   410
      act_node->right_child=NULL;
hegyi@1814
   411
    }
hegyi@1814
   412
  return act_node;
hegyi@1814
   413
}
hegyi@1814
   414
hegyi@1814
   415
std::string NewMapWin::postOrder(tree_node * subtree)
hegyi@1814
   416
{
hegyi@1814
   417
  std::string subtree_to_string;
hegyi@1814
   418
  if(subtree->left_child)
hegyi@1814
   419
    {
hegyi@1814
   420
      subtree_to_string=postOrder(subtree->left_child);
hegyi@1814
   421
    }
hegyi@1814
   422
  if(subtree->right_child)
hegyi@1814
   423
    {
hegyi@1814
   424
      subtree_to_string=subtree_to_string+postOrder(subtree->right_child);
hegyi@1814
   425
    }
hegyi@1814
   426
  subtree_to_string=subtree_to_string+subtree->ch;
hegyi@1814
   427
  return subtree_to_string;
hegyi@1814
   428
}
hegyi@1814
   429
hegyi@1814
   430
bool NewMapWin::validVariable(std::string variable, bool itisedge)
hegyi@1814
   431
{
hegyi@1814
   432
  bool cancel;
hegyi@1814
   433
  //is it mapname?
hegyi@1814
   434
  if(itisedge)
hegyi@1814
   435
    {
hegyi@1849
   436
      cancel=(mytab.mapstorage.edgemap_storage.find(variable)==mytab.mapstorage.edgemap_storage.end());
hegyi@1814
   437
    }
hegyi@1814
   438
  else
hegyi@1814
   439
    {
hegyi@1849
   440
      cancel=(mytab.mapstorage.nodemap_storage.find(variable)==mytab.mapstorage.nodemap_storage.end());
hegyi@1814
   441
    }
hegyi@1814
   442
  //maybe it is number
hegyi@1814
   443
  int point_num=0;
hegyi@1814
   444
  if(cancel)
hegyi@1814
   445
    {
hegyi@1814
   446
      cancel=false;
hegyi@1814
   447
      for(int j=0;(!cancel)&&(j<(int)variable.size());j++)
hegyi@1814
   448
	{
hegyi@1814
   449
	  if(((variable[j]<'0')||(variable[j]>'9'))&&(variable[j]!='.'))
hegyi@1814
   450
	    {
hegyi@1814
   451
	      cancel=true;
hegyi@1814
   452
	    }
hegyi@1814
   453
	  else
hegyi@1814
   454
	    {
hegyi@1814
   455
	      if(variable[j]=='.')
hegyi@1814
   456
		{
hegyi@1814
   457
		  point_num++;
hegyi@1814
   458
		  if(point_num>1)
hegyi@1814
   459
		    {
hegyi@1814
   460
		      cancel=true;
hegyi@1814
   461
		    }
hegyi@1814
   462
		}
hegyi@1814
   463
	    }
hegyi@1814
   464
	}
hegyi@1814
   465
    }
hegyi@1814
   466
  if(cancel)
hegyi@1814
   467
    {
hegyi@1814
   468
      return false;
hegyi@1814
   469
    }
hegyi@1814
   470
  return true;
hegyi@1814
   471
}