file_import_dialog.cc
author Akos Ladanyi <ladanyi@tmit.bme.hu>
Thu, 10 Jul 2008 18:53:00 +0100
changeset 4 244d8c60b997
permissions -rw-r--r--
Issue a custom error message when Lemon is not found.
     1 #include "file_import_dialog.h"
     2 #include <gtkmm/dialog.h>
     3 #include <gtkmm/stock.h>
     4 #include <gtkmm/notebook.h>
     5 #include <gtkmm/messagedialog.h>
     6 #include <gtkmm/frame.h>
     7 #include <iostream>
     8 
     9 FileImportDialog::FileImportDialog(ImportData* d) :
    10   p_data(d)
    11 {
    12   add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
    13   add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK);
    14 
    15   Gtk::VBox* pVBox = get_vbox();
    16 
    17   Gtk::Notebook* nb = Gtk::manage(new Gtk::Notebook);
    18   pVBox->pack_start(*nb, Gtk::PACK_EXPAND_WIDGET);
    19 
    20   Gtk::VBox* vblueMaps = Gtk::manage(new Gtk::VBox(false, 18));
    21   vblueMaps->set_border_width(12);
    22 
    23   Gtk::VBox* vbArcMaps = Gtk::manage(new Gtk::VBox(false, 18));
    24   vbArcMaps->set_border_width(12);
    25 
    26   Gtk::VBox* vbSpecMaps = Gtk::manage(new Gtk::VBox(false, 18));
    27   vbSpecMaps->set_border_width(12);
    28 
    29   nb->append_page(*vbSpecMaps, "Special Maps");
    30   nb->append_page(*vblueMaps, "Node Maps");
    31   nb->append_page(*vbArcMaps, "Arc Maps");
    32 
    33   // child widgets of vbSpecMaps
    34   {
    35     Gtk::VBox* box1 = Gtk::manage(new Gtk::VBox(false, 6));
    36     vbSpecMaps->pack_start(*box1, Gtk::PACK_SHRINK);
    37 
    38     {
    39       Gtk::Label* label1 =
    40         Gtk::manage(new Gtk::Label("<b>Node Coordinates</b>"));
    41       label1->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
    42       label1->set_use_markup();
    43       box1->pack_start(*label1);
    44 
    45       Gtk::HBox* box2 = Gtk::manage(new Gtk::HBox);
    46       box1->pack_start(*box2);
    47 
    48       Gtk::Label* fill1 = Gtk::manage(new Gtk::Label("    "));
    49       box2->pack_start(*fill1, Gtk::PACK_SHRINK);
    50 
    51       Gtk::VBox* box3 = Gtk::manage(new Gtk::VBox);
    52       box2->pack_start(*box3);
    53 
    54       Gtk::VBox* box13 = Gtk::manage(new Gtk::VBox);
    55       box3->pack_start(*box13);
    56 
    57       rblueCoordNone.set_label("None");
    58       Gtk::RadioButtonGroup group = rblueCoordNone.get_group();
    59       box13->pack_start(rblueCoordNone);
    60 
    61       Gtk::VBox* box4 = Gtk::manage(new Gtk::VBox);
    62       box3->pack_start(*box4);
    63 
    64       rblueCoordOneMap.set_label("One Map");
    65       rblueCoordOneMap.set_group(group);
    66       box4->pack_start(rblueCoordOneMap);
    67 
    68       Gtk::HBox* box5 = Gtk::manage(new Gtk::HBox);
    69       box4->pack_start(*box5);
    70 
    71       Gtk::Label* fill2 = Gtk::manage(new Gtk::Label("    "));
    72       box5->pack_start(*fill2, Gtk::PACK_SHRINK);
    73 
    74       Gtk::VBox* box6 = Gtk::manage(new Gtk::VBox);
    75       box5->pack_start(*box6);
    76 
    77       Gtk::HBox* box7 = Gtk::manage(new Gtk::HBox);
    78       box6->pack_start(*box7);
    79 
    80       Gtk::Label* label2 = Gtk::manage(new Gtk::Label("(X, Y)"));
    81       box7->pack_start(*label2, Gtk::PACK_SHRINK, 4);
    82 
    83       box7->pack_start(cblueCoordOneMap, Gtk::PACK_EXPAND_WIDGET);
    84 
    85 
    86       Gtk::VBox* box8 = Gtk::manage(new Gtk::VBox);
    87       box3->pack_start(*box8);
    88 
    89       rblueCoordTwoMaps.set_label("Two Maps");
    90       rblueCoordTwoMaps.set_group(group);
    91       box8->pack_start(rblueCoordTwoMaps);
    92 
    93       Gtk::HBox* box9 = Gtk::manage(new Gtk::HBox);
    94       box8->pack_start(*box9);
    95 
    96       Gtk::Label* fill3 = Gtk::manage(new Gtk::Label("    "));
    97       box9->pack_start(*fill3, Gtk::PACK_SHRINK);
    98 
    99       Gtk::VBox* box10 = Gtk::manage(new Gtk::VBox);
   100       box9->pack_start(*box10);
   101 
   102       Gtk::HBox* box11 = Gtk::manage(new Gtk::HBox);
   103       box10->pack_start(*box11);
   104 
   105       Gtk::Label* label3 = Gtk::manage(new Gtk::Label("X"));
   106       box11->pack_start(*label3, Gtk::PACK_SHRINK, 4);
   107 
   108       box11->pack_start(cblueCoordTwoMaps1, Gtk::PACK_EXPAND_WIDGET);
   109 
   110       Gtk::HBox* box12 = Gtk::manage(new Gtk::HBox);
   111       box10->pack_start(*box12);
   112 
   113       Gtk::Label* label4 = Gtk::manage(new Gtk::Label("Y"));
   114       box12->pack_start(*label4, Gtk::PACK_SHRINK, 4);
   115 
   116       box12->pack_start(cblueCoordTwoMaps2, Gtk::PACK_EXPAND_WIDGET);
   117 
   118       cblueCoordOneMap.signal_changed().connect(
   119           sigc::mem_fun(*this, &FileImportDialog::onNodeCoordOneMapChanged));
   120       cblueCoordTwoMaps1.signal_changed().connect(
   121           sigc::mem_fun(*this, &FileImportDialog::onNodeCoordTwoMaps1Changed));
   122       cblueCoordTwoMaps2.signal_changed().connect(
   123           sigc::mem_fun(*this, &FileImportDialog::onNodeCoordTwoMaps2Changed));
   124     }
   125 
   126     {
   127       Gtk::Label* label1 =
   128         Gtk::manage(new Gtk::Label("<b>Arrow Coordinates</b>"));
   129       label1->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
   130       label1->set_use_markup();
   131       box1->pack_start(*label1);
   132 
   133       Gtk::HBox* box2 = Gtk::manage(new Gtk::HBox);
   134       box1->pack_start(*box2);
   135 
   136       Gtk::Label* fill1 = Gtk::manage(new Gtk::Label("    "));
   137       box2->pack_start(*fill1, Gtk::PACK_SHRINK);
   138 
   139       Gtk::VBox* box3 = Gtk::manage(new Gtk::VBox);
   140       box2->pack_start(*box3);
   141 
   142       Gtk::VBox* box13 = Gtk::manage(new Gtk::VBox);
   143       box3->pack_start(*box13);
   144 
   145       rbArrowCoordNone.set_label("None");
   146       Gtk::RadioButtonGroup group = rbArrowCoordNone.get_group();
   147       box13->pack_start(rbArrowCoordNone);
   148 
   149       Gtk::VBox* box4 = Gtk::manage(new Gtk::VBox);
   150       box3->pack_start(*box4);
   151 
   152       rbArrowCoordOneMap.set_label("One Map");
   153       rbArrowCoordOneMap.set_group(group);
   154       box4->pack_start(rbArrowCoordOneMap);
   155 
   156       Gtk::HBox* box5 = Gtk::manage(new Gtk::HBox);
   157       box4->pack_start(*box5);
   158 
   159       Gtk::Label* fill2 = Gtk::manage(new Gtk::Label("    "));
   160       box5->pack_start(*fill2, Gtk::PACK_SHRINK);
   161 
   162       Gtk::VBox* box6 = Gtk::manage(new Gtk::VBox);
   163       box5->pack_start(*box6);
   164 
   165       Gtk::HBox* box7 = Gtk::manage(new Gtk::HBox);
   166       box6->pack_start(*box7);
   167 
   168       Gtk::Label* label2 = Gtk::manage(new Gtk::Label("(X, Y)"));
   169       box7->pack_start(*label2, Gtk::PACK_SHRINK, 4);
   170 
   171       box7->pack_start(cbArrowCoordOneMap, Gtk::PACK_EXPAND_WIDGET);
   172 
   173 
   174       Gtk::VBox* box8 = Gtk::manage(new Gtk::VBox);
   175       box3->pack_start(*box8);
   176 
   177       rbArrowCoordTwoMaps.set_label("Two Maps");
   178       rbArrowCoordTwoMaps.set_group(group);
   179       box8->pack_start(rbArrowCoordTwoMaps);
   180 
   181       Gtk::HBox* box9 = Gtk::manage(new Gtk::HBox);
   182       box8->pack_start(*box9);
   183 
   184       Gtk::Label* fill3 = Gtk::manage(new Gtk::Label("    "));
   185       box9->pack_start(*fill3, Gtk::PACK_SHRINK);
   186 
   187       Gtk::VBox* box10 = Gtk::manage(new Gtk::VBox);
   188       box9->pack_start(*box10);
   189 
   190       Gtk::HBox* box11 = Gtk::manage(new Gtk::HBox);
   191       box10->pack_start(*box11);
   192 
   193       Gtk::Label* label3 = Gtk::manage(new Gtk::Label("X"));
   194       box11->pack_start(*label3, Gtk::PACK_SHRINK, 4);
   195 
   196       box11->pack_start(cbArrowCoordTwoMaps1, Gtk::PACK_EXPAND_WIDGET);
   197 
   198       Gtk::HBox* box12 = Gtk::manage(new Gtk::HBox);
   199       box10->pack_start(*box12);
   200 
   201       Gtk::Label* label4 = Gtk::manage(new Gtk::Label("Y"));
   202       box12->pack_start(*label4, Gtk::PACK_SHRINK, 4);
   203 
   204       box12->pack_start(cbArrowCoordTwoMaps2, Gtk::PACK_EXPAND_WIDGET);
   205 
   206       cbArrowCoordOneMap.signal_changed().connect(
   207           sigc::mem_fun(*this, &FileImportDialog::onArrowCoordOneMapChanged));
   208       cbArrowCoordTwoMaps1.signal_changed().connect(
   209           sigc::mem_fun(*this, &FileImportDialog::onArrowCoordTwoMaps1Changed));
   210       cbArrowCoordTwoMaps2.signal_changed().connect(
   211           sigc::mem_fun(*this, &FileImportDialog::onArrowCoordTwoMaps2Changed));
   212     }
   213   }
   214 
   215   // child widgets of vblueMaps
   216   {
   217     Gtk::VBox* box1 = Gtk::manage(new Gtk::VBox(false, 6));
   218     vblueMaps->pack_start(*box1, Gtk::PACK_SHRINK);
   219 
   220     Gtk::Label* label1 =
   221       Gtk::manage(new Gtk::Label("<b>Element type</b>"));
   222     label1->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
   223     label1->set_use_markup();
   224     box1->pack_start(*label1, Gtk::PACK_SHRINK);
   225 
   226     Gtk::HBox* box2 = Gtk::manage(new Gtk::HBox);
   227     box1->pack_start(*box2, Gtk::PACK_SHRINK);
   228 
   229     Gtk::Label* fill1 = Gtk::manage(new Gtk::Label("    "));
   230     box2->pack_start(*fill1, Gtk::PACK_SHRINK);
   231 
   232     Gtk::Frame* frame = Gtk::manage(new Gtk::Frame);
   233     box2->pack_start(*frame, Gtk::PACK_EXPAND_WIDGET);
   234 
   235     Gtk::ScrolledWindow* swNodeMaps = Gtk::manage(new Gtk::ScrolledWindow);
   236     frame->add(*swNodeMaps);
   237 
   238     swNodeMaps->add(twNodeMaps);
   239 
   240     refNodeMapStore = Gtk::ListStore::create(NodeMapColumns);
   241 
   242     for (std::vector<std::string>::const_iterator it =
   243         p_data->node_map_names.begin(); it != p_data->node_map_names.end();
   244         ++it)
   245     {
   246       node_tree_view_records.push_back(
   247           tree_view_record(*it, false, false, true));
   248     }
   249 
   250     twNodeMaps.set_model(refNodeMapStore);
   251     twNodeMaps.append_column("Name", NodeMapColumns.colName);
   252     {
   253       int col = twNodeMaps.append_column_editable("Numeric",
   254           NodeMapColumns.colReadAsNumeric);
   255       Gtk::CellRendererToggle* pRenderer =
   256         static_cast<Gtk::CellRendererToggle*>(
   257             twNodeMaps.get_column_cell_renderer(col-1));
   258       pRenderer->signal_toggled().connect(
   259           sigc::mem_fun(*this, &FileImportDialog::onNodeMapNumericToggled));
   260     }
   261     {
   262       int col = twNodeMaps.append_column_editable("String",
   263           NodeMapColumns.colReadAsString);
   264       Gtk::CellRendererToggle* pRenderer =
   265         static_cast<Gtk::CellRendererToggle*>(
   266             twNodeMaps.get_column_cell_renderer(col-1));
   267       pRenderer->signal_toggled().connect(
   268           sigc::mem_fun(*this, &FileImportDialog::onNodeMapStringToggled));
   269     }
   270 
   271     swNodeMaps->set_size_request(-1, 200);
   272     swNodeMaps->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
   273   }
   274 
   275   // child widgets of vbArcMaps
   276   {
   277     Gtk::VBox* box1 = Gtk::manage(new Gtk::VBox(false, 6));
   278     vbArcMaps->pack_start(*box1, Gtk::PACK_SHRINK);
   279 
   280     Gtk::Label* label1 =
   281       Gtk::manage(new Gtk::Label("<b>Element type</b>"));
   282     label1->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
   283     label1->set_use_markup();
   284     box1->pack_start(*label1, Gtk::PACK_SHRINK);
   285 
   286     Gtk::HBox* box2 = Gtk::manage(new Gtk::HBox);
   287     box1->pack_start(*box2, Gtk::PACK_SHRINK);
   288 
   289     Gtk::Label* fill1 = Gtk::manage(new Gtk::Label("    "));
   290     box2->pack_start(*fill1, Gtk::PACK_SHRINK);
   291 
   292     Gtk::Frame* frame = Gtk::manage(new Gtk::Frame);
   293     box2->pack_start(*frame, Gtk::PACK_EXPAND_WIDGET);
   294 
   295     Gtk::ScrolledWindow* swArcMaps = Gtk::manage(new Gtk::ScrolledWindow);
   296     frame->add(*swArcMaps);
   297 
   298     swArcMaps->add(twArcMaps);
   299 
   300     refArcMapStore = Gtk::ListStore::create(ArcMapColumns);
   301 
   302     for (std::vector<std::string>::const_iterator it =
   303         p_data->arc_map_names.begin(); it != p_data->arc_map_names.end();
   304         ++it)
   305     {
   306       arc_tree_view_records.push_back(
   307           tree_view_record(*it, false, false, true));
   308     }
   309 
   310     twArcMaps.set_model(refArcMapStore);
   311     twArcMaps.append_column("Name", ArcMapColumns.colName);
   312     {
   313       int col = twArcMaps.append_column_editable("Numeric",
   314           ArcMapColumns.colReadAsNumeric);
   315       Gtk::CellRendererToggle* pRenderer =
   316         static_cast<Gtk::CellRendererToggle*>(
   317             twArcMaps.get_column_cell_renderer(col-1));
   318       pRenderer->signal_toggled().connect(
   319           sigc::mem_fun(*this, &FileImportDialog::onArcMapNumericToggled));
   320     }
   321     {
   322       int col = twArcMaps.append_column_editable("String",
   323           ArcMapColumns.colReadAsString);
   324       Gtk::CellRendererToggle* pRenderer =
   325         static_cast<Gtk::CellRendererToggle*>(
   326             twArcMaps.get_column_cell_renderer(col-1));
   327       pRenderer->signal_toggled().connect(
   328           sigc::mem_fun(*this, &FileImportDialog::onArcMapStringToggled));
   329     }
   330 
   331     swArcMaps->set_size_request(-1, 200);
   332     swArcMaps->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
   333   }
   334 
   335   // fill in the ComboBoxes
   336   typedef std::vector<std::string> StrVec;
   337   for (StrVec::const_iterator it = p_data->node_map_names.begin();
   338       it != p_data->node_map_names.end(); ++it)
   339   {
   340     cblueCoordTwoMaps1.append_text(*it);
   341     cblueCoordTwoMaps2.append_text(*it);
   342   }
   343   for (StrVec::const_iterator it = p_data->arc_map_names.begin();
   344       it != p_data->arc_map_names.end(); ++it)
   345   {
   346     cbArrowCoordTwoMaps1.append_text(*it);
   347     cbArrowCoordTwoMaps2.append_text(*it);
   348   }
   349   for (StrVec::const_iterator it = p_data->xy_node_map_names.begin();
   350       it != p_data->xy_node_map_names.end(); ++it)
   351   {
   352     cblueCoordOneMap.append_text(*it);
   353   }
   354   for (StrVec::const_iterator it = p_data->xy_arc_map_names.begin();
   355       it != p_data->xy_arc_map_names.end(); ++it)
   356   {
   357     cbArrowCoordOneMap.append_text(*it);
   358   }
   359 
   360   if (p_data->isXYNodeMap("coord"))
   361   {
   362     cblueCoordOneMap.set_active_text("coord");
   363   }
   364   else if (p_data->isXYNodeMap("coords"))
   365   {
   366     cblueCoordOneMap.set_active_text("coords");
   367   }
   368   else if (p_data->isNodeMap("coord_x") &&
   369            p_data->isNodeMap("coord_y"))
   370   {
   371     cblueCoordTwoMaps1.set_active_text("coord_x");
   372     cblueCoordTwoMaps2.set_active_text("coord_y");
   373   }
   374   else if (p_data->isNodeMap("coords_x") &&
   375            p_data->isNodeMap("coords_y"))
   376   {
   377     cblueCoordTwoMaps1.set_active_text("coords_x");
   378     cblueCoordTwoMaps2.set_active_text("coords_y");
   379   }
   380   else if (p_data->isNodeMap("x") &&
   381            p_data->isNodeMap("y"))
   382   {
   383     cblueCoordTwoMaps1.set_active_text("x");
   384     cblueCoordTwoMaps2.set_active_text("y");
   385   }
   386 
   387   if (p_data->isXYArcMap("arrow"))
   388   {
   389     cbArrowCoordOneMap.set_active_text("arrow");
   390   }
   391   else if (p_data->isXYArcMap("arrows"))
   392   {
   393     cbArrowCoordOneMap.set_active_text("arrows");
   394   }
   395   else if (p_data->isXYArcMap("midpoint"))
   396   {
   397     cbArrowCoordOneMap.set_active_text("midpoint");
   398   }
   399   else if (p_data->isXYArcMap("midpoints"))
   400   {
   401     cbArrowCoordOneMap.set_active_text("midpoints");
   402   }
   403   else if (p_data->isXYArcMap("mid"))
   404   {
   405     cbArrowCoordOneMap.set_active_text("mid");
   406   }
   407   else if (p_data->isXYArcMap("mids"))
   408   {
   409     cbArrowCoordOneMap.set_active_text("mids");
   410   }
   411   else if (p_data->isArcMap("arrow_x") &&
   412            p_data->isArcMap("arrow_y"))
   413   {
   414     cbArrowCoordTwoMaps1.set_active_text("arrow_x");
   415     cbArrowCoordTwoMaps2.set_active_text("arrow_y");
   416   }
   417   else if (p_data->isArcMap("arrows_x") &&
   418            p_data->isArcMap("arrows_y"))
   419   {
   420     cbArrowCoordTwoMaps1.set_active_text("arrows_x");
   421     cbArrowCoordTwoMaps2.set_active_text("arrows_y");
   422   }
   423   else if (p_data->isArcMap("midpoint_x") &&
   424            p_data->isArcMap("midpoint_y"))
   425   {
   426     cbArrowCoordTwoMaps1.set_active_text("midpoint_x");
   427     cbArrowCoordTwoMaps2.set_active_text("midpoint_y");
   428   }
   429   else if (p_data->isArcMap("midpoints_x") &&
   430            p_data->isArcMap("midpoints_y"))
   431   {
   432     cbArrowCoordTwoMaps1.set_active_text("midpoints_x");
   433     cbArrowCoordTwoMaps2.set_active_text("midpoints_y");
   434   }
   435   else if (p_data->isArcMap("mid_x") &&
   436            p_data->isArcMap("mid_y"))
   437   {
   438     cbArrowCoordTwoMaps1.set_active_text("mid_x");
   439     cbArrowCoordTwoMaps2.set_active_text("mid_y");
   440   }
   441   else if (p_data->isArcMap("mids_x") &&
   442            p_data->isArcMap("mids_y"))
   443   {
   444     cbArrowCoordTwoMaps1.set_active_text("mids_x");
   445     cbArrowCoordTwoMaps2.set_active_text("mids_y");
   446   }
   447 
   448   {
   449     if (cblueCoordOneMap.get_active_text() != "")
   450       rblueCoordOneMap.set_active();
   451     else if (cblueCoordTwoMaps1.get_active_text() != "")
   452       rblueCoordTwoMaps.set_active();
   453     else
   454       rblueCoordNone.set_active();
   455 
   456     if (cbArrowCoordOneMap.get_active_text() != "")
   457       rbArrowCoordOneMap.set_active();
   458     else if (cbArrowCoordTwoMaps1.get_active_text() != "")
   459       rbArrowCoordTwoMaps.set_active();
   460     else
   461       rbArrowCoordNone.set_active();
   462 
   463     onNodeCoordMapNumToggled();
   464     onArrowCoordMapNumToggled();
   465 
   466     rblueCoordOneMap.signal_toggled().connect(
   467         sigc::mem_fun(*this, &FileImportDialog::onNodeCoordMapNumToggled));
   468     rblueCoordTwoMaps.signal_toggled().connect(
   469         sigc::mem_fun(*this, &FileImportDialog::onNodeCoordMapNumToggled));
   470     rbArrowCoordOneMap.signal_toggled().connect(
   471         sigc::mem_fun(*this, &FileImportDialog::onArrowCoordMapNumToggled));
   472     rbArrowCoordTwoMaps.signal_toggled().connect(
   473         sigc::mem_fun(*this, &FileImportDialog::onArrowCoordMapNumToggled));
   474   }
   475 
   476   signal_response().connect(
   477       sigc::mem_fun(*this, &FileImportDialog::onResponse));
   478 
   479   update_node_tree_view();
   480   update_arc_tree_view();
   481 
   482   show_all_children();
   483 }
   484 
   485 void FileImportDialog::onNodeCoordMapNumToggled()
   486 {
   487   if (rblueCoordOneMap.get_active())
   488   {
   489     cblueCoordOneMap.get_parent()->set_sensitive(true);
   490     cblueCoordTwoMaps1.get_parent()->set_sensitive(false);
   491     cblueCoordTwoMaps2.get_parent()->set_sensitive(false);
   492 
   493     p_data->node_coord_load_from = ImportData::ONE_MAP;
   494   }
   495   else if (rblueCoordTwoMaps.get_active())
   496   {
   497     cblueCoordOneMap.get_parent()->set_sensitive(false);
   498     cblueCoordTwoMaps1.get_parent()->set_sensitive(true);
   499     cblueCoordTwoMaps2.get_parent()->set_sensitive(true);
   500 
   501     p_data->node_coord_load_from = ImportData::TWO_MAPS;
   502   }
   503   else if (rblueCoordNone.get_active())
   504   {
   505     cblueCoordOneMap.get_parent()->set_sensitive(false);
   506     cblueCoordTwoMaps1.get_parent()->set_sensitive(false);
   507     cblueCoordTwoMaps2.get_parent()->set_sensitive(false);
   508 
   509     p_data->node_coord_load_from = ImportData::DONT_READ;
   510   }
   511   update_node_tree_view();
   512 }
   513 
   514 void FileImportDialog::onArrowCoordMapNumToggled()
   515 {
   516   if (rbArrowCoordOneMap.get_active())
   517   {
   518     cbArrowCoordOneMap.get_parent()->set_sensitive(true);
   519     cbArrowCoordTwoMaps1.get_parent()->set_sensitive(false);
   520     cbArrowCoordTwoMaps2.get_parent()->set_sensitive(false);
   521 
   522     p_data->arrow_coord_load_from = ImportData::ONE_MAP;
   523   }
   524   else if (rbArrowCoordTwoMaps.get_active())
   525   {
   526     cbArrowCoordOneMap.get_parent()->set_sensitive(false);
   527     cbArrowCoordTwoMaps1.get_parent()->set_sensitive(true);
   528     cbArrowCoordTwoMaps2.get_parent()->set_sensitive(true);
   529 
   530     p_data->arrow_coord_load_from = ImportData::TWO_MAPS;
   531   }
   532   else if (rbArrowCoordNone.get_active())
   533   {
   534     cbArrowCoordOneMap.get_parent()->set_sensitive(false);
   535     cbArrowCoordTwoMaps1.get_parent()->set_sensitive(false);
   536     cbArrowCoordTwoMaps2.get_parent()->set_sensitive(false);
   537 
   538     p_data->arrow_coord_load_from = ImportData::DONT_READ;
   539   }
   540   update_arc_tree_view();
   541 }
   542 
   543 FileImportDialog::~FileImportDialog()
   544 {
   545 }
   546 
   547 void FileImportDialog::onResponse(int id)
   548 {
   549   if (id == Gtk::RESPONSE_OK)
   550   {
   551     if ((rblueCoordOneMap.get_active() &&
   552           cblueCoordOneMap.get_active_text() == "") ||
   553         (rblueCoordTwoMaps.get_active() &&
   554          (cblueCoordTwoMaps1.get_active_text() == "" ||
   555           cblueCoordTwoMaps2.get_active_text() == "")))
   556     {
   557       Gtk::MessageDialog mdialog("No node map selected.",
   558           false, Gtk::MESSAGE_ERROR);
   559       mdialog.run();
   560       return;
   561     }
   562     else if (rblueCoordTwoMaps.get_active() &&
   563              cblueCoordTwoMaps1.get_active_text() == 
   564              cblueCoordTwoMaps2.get_active_text())
   565     {
   566       Gtk::MessageDialog mdialog(
   567           "Same node map selected for both coordinates.",
   568           false, Gtk::MESSAGE_ERROR);
   569       mdialog.run();
   570       return;
   571     }
   572     if ((rbArrowCoordOneMap.get_active() &&
   573           cbArrowCoordOneMap.get_active_text() == "") ||
   574         (rbArrowCoordTwoMaps.get_active() &&
   575          (cbArrowCoordTwoMaps1.get_active_text() == "" ||
   576           cbArrowCoordTwoMaps2.get_active_text() == "")))
   577     {
   578       Gtk::MessageDialog mdialog("No arc map selected.",
   579           false, Gtk::MESSAGE_ERROR);
   580       mdialog.run();
   581       return;
   582     }
   583     else if (rbArrowCoordTwoMaps.get_active() &&
   584              cbArrowCoordTwoMaps1.get_active_text() == 
   585              cbArrowCoordTwoMaps2.get_active_text())
   586     {
   587       Gtk::MessageDialog mdialog(
   588           "Same arc map selected for both coordinates.",
   589           false, Gtk::MESSAGE_ERROR);
   590       mdialog.run();
   591       return;
   592     }
   593 
   594     for (std::vector<tree_view_record>::const_iterator it =
   595         node_tree_view_records.begin(); it != node_tree_view_records.end();
   596         ++it)
   597     {
   598       if (it->visible)
   599       {
   600         if (it->numeric)
   601           p_data->numeric_node_map_names.push_back(it->name);
   602         if (it->string)
   603           p_data->string_node_map_names.push_back(it->name);
   604       }
   605     }
   606 
   607     for (std::vector<tree_view_record>::const_iterator it =
   608         arc_tree_view_records.begin(); it != arc_tree_view_records.end();
   609         ++it)
   610     {
   611       if (it->visible)
   612       {
   613         if (it->numeric)
   614           p_data->numeric_arc_map_names.push_back(it->name);
   615         if (it->string)
   616           p_data->string_arc_map_names.push_back(it->name);
   617       }
   618     }
   619   }
   620 }
   621 
   622 FileImportDialog::ImportData::ImportData(
   623     const std::vector<std::string>& _node_map_names,
   624     const std::vector<std::string>& _arc_map_names) :
   625   node_map_names(_node_map_names),
   626   arc_map_names(_arc_map_names)
   627 {
   628   typedef std::vector<std::string> StrVec;
   629   {
   630     StrVec xMaps;
   631     StrVec yMaps;
   632     // collect map names ending with ":x" and ":y"
   633     for (StrVec::const_iterator it = node_map_names.begin();
   634         it != node_map_names.end(); ++it)
   635     {
   636       if ((it->length() >= 3) &&
   637           (it->substr(it->length()-2, it->length())  == ":x"))
   638       {
   639         xMaps.push_back(it->substr(0, it->length()-2));
   640       }
   641       if ((it->length() >= 3) &&
   642           (it->substr(it->length()-2, it->length())  == ":y"))
   643       {
   644         yMaps.push_back(it->substr(0, it->length()-2));
   645       }
   646     }
   647 
   648     for (StrVec::const_iterator it1 = xMaps.begin();
   649         it1 != xMaps.end(); ++it1)
   650     {
   651       for (StrVec::const_iterator it2 = yMaps.begin();
   652           it2 != yMaps.end(); ++it2)
   653       {
   654         if (*it1 == *it2) xy_node_map_names.push_back(*it1);
   655       }
   656     }
   657   }
   658   {
   659     StrVec xMaps;
   660     StrVec yMaps;
   661     // collect map names ending with ":x" and ":y"
   662     for (StrVec::const_iterator it = arc_map_names.begin();
   663         it != arc_map_names.end(); ++it)
   664     {
   665       if ((it->length() >= 3) &&
   666           (it->substr(it->length()-2, it->length())  == ":x"))
   667       {
   668         xMaps.push_back(it->substr(0, it->length()-2));
   669       }
   670       if ((it->length() >= 3) &&
   671           (it->substr(it->length()-2, it->length())  == ":y"))
   672       {
   673         yMaps.push_back(it->substr(0, it->length()-2));
   674       }
   675     }
   676 
   677     for (StrVec::const_iterator it1 = xMaps.begin();
   678         it1 != xMaps.end(); ++it1)
   679     {
   680       for (StrVec::const_iterator it2 = yMaps.begin();
   681           it2 != yMaps.end(); ++it2)
   682       {
   683         if (*it1 == *it2) xy_arc_map_names.push_back(*it1);
   684       }
   685     }
   686   }
   687 }
   688 
   689 FileImportDialog::ImportData::~ImportData()
   690 {
   691 }
   692 
   693 bool FileImportDialog::ImportData::isXYNodeMap(const std::string& name)
   694 {
   695   if (isNodeMap(name + ":x") && isNodeMap(name + ":y")) return true;
   696   return false;
   697 }
   698 
   699 bool FileImportDialog::ImportData::isXYArcMap(const std::string& name)
   700 {
   701   if (isArcMap(name + ":x") && isArcMap(name + ":y")) return true;
   702   return false;
   703 }
   704 
   705 bool FileImportDialog::ImportData::isNodeMap(const std::string& name)
   706 {
   707   if (contains(node_map_names, name)) return true;
   708   return false;
   709 }
   710 
   711 bool FileImportDialog::ImportData::isArcMap(const std::string& name)
   712 {
   713   if (contains(arc_map_names, name)) return true;
   714   return false;
   715 }
   716 
   717 bool FileImportDialog::ImportData::contains(const std::vector<std::string>& vec,
   718     const std::string& str)
   719 {
   720   for (std::vector<std::string>::const_iterator it = vec.begin();
   721       it != vec.end(); ++it)
   722   {
   723     if (*it == str) return true;
   724   }
   725   return false;
   726 }
   727 
   728 void FileImportDialog::onNodeCoordOneMapChanged()
   729 {
   730   p_data->node_coord_one_map_name = cblueCoordOneMap.get_active_text();
   731   update_node_tree_view();
   732 }
   733 
   734 void FileImportDialog::onNodeCoordTwoMaps1Changed()
   735 {
   736   p_data->node_coord_two_maps_1_name = cblueCoordTwoMaps1.get_active_text();
   737   update_node_tree_view();
   738 }
   739 
   740 void FileImportDialog::onNodeCoordTwoMaps2Changed()
   741 {
   742   p_data->node_coord_two_maps_2_name = cblueCoordTwoMaps2.get_active_text();
   743   update_node_tree_view();
   744 }
   745 
   746 void FileImportDialog::onArrowCoordOneMapChanged()
   747 {
   748   p_data->arrow_coord_one_map_name = cbArrowCoordOneMap.get_active_text();
   749   update_arc_tree_view();
   750 }
   751 
   752 void FileImportDialog::onArrowCoordTwoMaps1Changed()
   753 {
   754   p_data->arrow_coord_two_maps_1_name = cbArrowCoordTwoMaps1.get_active_text();
   755   update_arc_tree_view();
   756 }
   757 
   758 void FileImportDialog::onArrowCoordTwoMaps2Changed()
   759 {
   760   p_data->arrow_coord_two_maps_2_name = cbArrowCoordTwoMaps2.get_active_text();
   761   update_arc_tree_view();
   762 }
   763 
   764 void FileImportDialog::onNodeMapNumericToggled(const Glib::ustring& path)
   765 {
   766   Gtk::TreeModel::iterator iter = refNodeMapStore->get_iter(
   767       Gtk::TreeModel::Path(path));
   768   Gtk::TreeModel::Row row = *iter;
   769   std::vector<tree_view_record>::iterator it;
   770   for (it = node_tree_view_records.begin();
   771       it != node_tree_view_records.end(); ++it)
   772   {
   773     if (it->name == row[NodeMapColumns.colName]) break;
   774   }
   775   if (row[NodeMapColumns.colReadAsNumeric])
   776   {
   777     row[NodeMapColumns.colReadAsString] = false;
   778     it->string = false;
   779     it->numeric = true;
   780   }
   781 }
   782 
   783 void FileImportDialog::onNodeMapStringToggled(const Glib::ustring& path)
   784 {
   785   Gtk::TreeModel::iterator iter = refNodeMapStore->get_iter(
   786       Gtk::TreeModel::Path(path));
   787   Gtk::TreeModel::Row row = *iter;
   788   std::vector<tree_view_record>::iterator it;
   789   for (it = node_tree_view_records.begin();
   790       it != node_tree_view_records.end(); ++it)
   791   {
   792     if (it->name == row[NodeMapColumns.colName]) break;
   793   }
   794   if (row[NodeMapColumns.colReadAsString])
   795   {
   796     row[NodeMapColumns.colReadAsNumeric] = false;
   797     it->string = true;
   798     it->numeric = false;
   799   }
   800 }
   801 
   802 void FileImportDialog::update_node_tree_view()
   803 {
   804   for (std::vector<tree_view_record>::iterator it =
   805       node_tree_view_records.begin(); it != node_tree_view_records.end(); ++it)
   806   {
   807     it->visible = true;
   808   }
   809   switch (p_data->node_coord_load_from)
   810   {
   811     case ImportData::ONE_MAP:
   812       for (std::vector<tree_view_record>::iterator it =
   813           node_tree_view_records.begin(); it !=
   814           node_tree_view_records.end(); ++it)
   815       {
   816         if (it->name == p_data->node_coord_one_map_name)
   817           it->visible = false;
   818       }
   819       break;
   820     case ImportData::TWO_MAPS:
   821       for (std::vector<tree_view_record>::iterator it =
   822           node_tree_view_records.begin(); it !=
   823           node_tree_view_records.end(); ++it)
   824       {
   825         if ((it->name == p_data->node_coord_two_maps_1_name) ||
   826             (it->name == p_data->node_coord_two_maps_2_name))
   827           it->visible = false;
   828       }
   829       break;
   830     case ImportData::DONT_READ:
   831       break;
   832   }
   833   refNodeMapStore->clear();
   834   for (std::vector<tree_view_record>::iterator it =
   835       node_tree_view_records.begin(); it != node_tree_view_records.end(); ++it)
   836   {
   837     if (it->visible)
   838     {
   839       Gtk::TreeModel::Row row = *(refNodeMapStore->append());
   840       row[NodeMapColumns.colName] = it->name;
   841       row[NodeMapColumns.colReadAsNumeric] = it->numeric;
   842       row[NodeMapColumns.colReadAsString] = it->string;
   843     }
   844   }
   845 }
   846 
   847 void FileImportDialog::onArcMapNumericToggled(const Glib::ustring& path)
   848 {
   849   Gtk::TreeModel::iterator iter = refArcMapStore->get_iter(
   850       Gtk::TreeModel::Path(path));
   851   Gtk::TreeModel::Row row = *iter;
   852   std::vector<tree_view_record>::iterator it;
   853   for (it = arc_tree_view_records.begin();
   854       it != arc_tree_view_records.end(); ++it)
   855   {
   856     if (it->name == row[ArcMapColumns.colName]) break;
   857   }
   858   if (row[ArcMapColumns.colReadAsNumeric])
   859   {
   860     row[ArcMapColumns.colReadAsString] = false;
   861     it->string = false;
   862     it->numeric = true;
   863   }
   864 }
   865 
   866 void FileImportDialog::onArcMapStringToggled(const Glib::ustring& path)
   867 {
   868   Gtk::TreeModel::iterator iter = refArcMapStore->get_iter(
   869       Gtk::TreeModel::Path(path));
   870   Gtk::TreeModel::Row row = *iter;
   871   std::vector<tree_view_record>::iterator it;
   872   for (it = arc_tree_view_records.begin();
   873       it != arc_tree_view_records.end(); ++it)
   874   {
   875     if (it->name == row[ArcMapColumns.colName]) break;
   876   }
   877   if (row[ArcMapColumns.colReadAsString])
   878   {
   879     row[ArcMapColumns.colReadAsNumeric] = false;
   880     it->string = true;
   881     it->numeric = false;
   882   }
   883 }
   884 
   885 void FileImportDialog::update_arc_tree_view()
   886 {
   887   for (std::vector<tree_view_record>::iterator it =
   888       arc_tree_view_records.begin(); it != arc_tree_view_records.end(); ++it)
   889   {
   890     it->visible = true;
   891   }
   892   switch (p_data->arrow_coord_load_from)
   893   {
   894     case ImportData::ONE_MAP:
   895       for (std::vector<tree_view_record>::iterator it =
   896           arc_tree_view_records.begin(); it !=
   897           arc_tree_view_records.end(); ++it)
   898       {
   899         if (it->name == p_data->arrow_coord_one_map_name)
   900           it->visible = false;
   901       }
   902       break;
   903     case ImportData::TWO_MAPS:
   904       for (std::vector<tree_view_record>::iterator it =
   905           arc_tree_view_records.begin(); it !=
   906           arc_tree_view_records.end(); ++it)
   907       {
   908         if ((it->name == p_data->arrow_coord_two_maps_1_name) ||
   909             (it->name == p_data->arrow_coord_two_maps_2_name))
   910           it->visible = false;
   911       }
   912       break;
   913     case ImportData::DONT_READ:
   914       break;
   915   }
   916   refArcMapStore->clear();
   917   for (std::vector<tree_view_record>::iterator it =
   918       arc_tree_view_records.begin(); it != arc_tree_view_records.end(); ++it)
   919   {
   920     if (it->visible)
   921     {
   922       Gtk::TreeModel::Row row = *(refArcMapStore->append());
   923       row[ArcMapColumns.colName] = it->name;
   924       row[ArcMapColumns.colReadAsNumeric] = it->numeric;
   925       row[ArcMapColumns.colReadAsString] = it->string;
   926     }
   927   }
   928 }