X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/8d91dae9933285ea0ba05eb19ac6263129b39599..b1b1cfeb329cedbf7bb89665fcda862a0e4fc46c:/viewer/main.cpp diff --git a/viewer/main.cpp b/viewer/main.cpp index 3b89a38..e5cb24e 100644 --- a/viewer/main.cpp +++ b/viewer/main.cpp @@ -18,9 +18,13 @@ using namespace Gnome::Canvas; " " " " " " +" " " " " " " " +" " +" " +" " " " " " " " @@ -36,8 +40,10 @@ using namespace Gnome::Canvas; ""; void nuevo_arbol (); +void abrir_arbol (); void agregar_clave (); void borrar_clave (); +void ir_al_padre (); void buscar_clave (); void zoom_out (); void zoom_in (); @@ -75,7 +81,10 @@ int main(int argc, char *argv[]) actiongroup->add( Gtk::Action::create("MenuFile", "_Arbol") ); actiongroup->add( Gtk::Action::create("Nuevo", Gtk::Stock::NEW), &nuevo_arbol); + actiongroup->add( Gtk::Action::create("Abrir", Gtk::Stock::OPEN), &abrir_arbol); actiongroup->add( Gtk::Action::create("Salir", Gtk::Stock::QUIT), Gtk::AccelKey ("q"), &Gtk::Main::quit); + actiongroup->add( Gtk::Action::create("MenuNode", "_Nodo") ); + actiongroup->add( Gtk::Action::create("Ir al Padre", Gtk::Stock::GO_BACK), Gtk::AccelKey ("b"), &ir_al_padre); actiongroup->add( Gtk::Action::create("MenuKey", "_Clave") ); actiongroup->add( Gtk::Action::create("Agregar Clave", Gtk::Stock::ADD), Gtk::AccelKey ("a"), &agregar_clave); actiongroup->add( Gtk::Action::create("Borrar Clave", Gtk::Stock::REMOVE), Gtk::AccelKey ("d"), &borrar_clave); @@ -106,6 +115,28 @@ int main(int argc, char *argv[]) return 0; } +void abrir_arbol () +{ + Gtk::FileChooserDialog dlg ("Abrir Arbol"); + + dlg.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); + dlg.add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); + if (dlg.run () == Gtk::RESPONSE_ACCEPT) { + Glib::ustring s = dlg.get_filename (); + std::string filename = s; + ViewBTree *ptree = ViewBTree::Open (real_canvas->root (), filename); + if (ptree != NULL) { + tree = Glib::RefPtr(ptree); + tree->signal_selected ().connect ( sigc::mem_fun (*real_frame, &ViewProperties::ShowItem) ); + tree->AddNode (0); + double x1, x2, y1, y2; + tree->get_bounds (x1, y1, x2, y2); + real_canvas->set_scroll_region (0, 0, 5000, 5000); + real_canvas->scroll_to (0, 0); + } + } +} + void nuevo_arbol () { real_canvas->set_scroll_region (0, 0, 5000, 5000); @@ -118,7 +149,10 @@ void nuevo_arbol () double paltas = bajas / (double)altas; int type = d.getKeyType (); - tree = Glib::RefPtr(new ViewBTree (real_canvas->root(), "test.idx", d.getBlockSize (), type)); + int atype = d.getTreeType (); + std::string name = d.getName (); + tree = Glib::RefPtr(new ViewBTree (real_canvas->root(), name+".idx", d.getBlockSize (), atype, type)); + real_frame->SetTree (tree); tree->signal_selected ().connect ( sigc::mem_fun (*real_frame, &ViewProperties::ShowItem) ); if (type == BTree::KEY_FIXED) { std::list lst; @@ -134,7 +168,11 @@ void nuevo_arbol () double l = Random::Double (0.0f, 1.0f); std::cout << l << " >= " << paltas << std::endl; if (l >= paltas) { - tree->AddKey (c); + try { + tree->AddKey (c); + } catch (Exception *e) { + std::cout << "====== " << (std::string)c << e->Message () << std::endl; + } i++; } else { /* Tengo que borrar una clave entre 0 e "i" de la lista @@ -165,7 +203,11 @@ void nuevo_arbol () while (it != lst.end ()) { ClaveVariable c(*it); - tree->AddKey (c); + try { + tree->AddKey (c); + } catch (Exception *e) { + std::cout << "====== " << (std::string)c << e->Message () << std::endl; + } it++; } } @@ -189,6 +231,7 @@ void agregar_clave () if (d.run () == Gtk::RESPONSE_OK) { Glib::ustring str_key = d.key(); + Glib::ustring str_val = d.val(); if (tree->type() == BTree::KEY_FIXED) { ClaveFija c(atoi(str_key.c_str())); @@ -199,8 +242,28 @@ void agregar_clave () ClaveVariable c(str_key); tree->AddKey(c); } - delete tree->last_selected; - tree->AddNode (0); + + /* Muestro la clave agregada */ + BTreeFindResult* result = 0; + Clave *c = NULL; + if (tree->type() == BTree::KEY_FIXED) { + c = new ClaveFija (atoi(str_key.c_str())); + result = tree->FindKey(*c); + } else { + c = new ClaveVariable (str_key); + result = tree->FindKey(*c); + } + if (result) { + tree->Clear (); + tree->AddNode(result->node); + tree->HighliteKey (*c); + delete result; + } else { + delete tree->last_selected; + tree->last_selected = NULL; + tree->AddNode (0); + } + if (c) delete c; real_canvas->scroll_to (0, 0); } } @@ -230,10 +293,21 @@ void borrar_clave () } delete tree->last_selected; tree->AddNode (0); - real_canvas->scroll_to (0, 0); } } +void ir_al_padre () +{ + if (!tree) + { + Gtk::MessageDialog d("No hay un arbol creado, por favor primero cree un arbol!", + false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + d.run(); + return; + } + tree->GoBack (); +} + void buscar_clave () { if (!tree)