#include "view_node.h"
-ViewNode::ViewNode (Canvas::Group *parent, uint num, BTreeNodeHeader &header, std::list<BTreeData *> &keys)
+ViewNode::ViewNode (Canvas::Group *parent, uint num, uint padre, BTreeNodeHeader &header, std::list<BTreeData *> &keys)
: Canvas::Group (*parent)
{
+ last_selected = NULL;
double header_w = ViewBTree::byte_to_pixels * sizeof (BTreeNodeHeader);
this->num = num;
+ this->padre = padre;
/* Fondo */
- Canvas::Rect *fondo = new Canvas::Rect (*this, 0, 0, NODE_WIDTH, NODE_HEIGHT);
- fondo->property_fill_color() = "gray";
- fondo->property_outline_color() = "black";
+ int w1 = (int)(ViewBTree::node_width / 512.0f);
+ int used_width = 0;
+
+ double y = 0;
/* Header */
- Canvas::Rect *h = new Canvas::Rect (*this, 0, 0, header_w, NODE_HEIGHT);
+ Canvas::Rect *h = new Canvas::Rect (*this, 0, 0, header_w, ViewBTree::node_height);
h->property_fill_color() = "blue";
h->property_outline_color() = "black";
std::stringstream ss;
ss << num;
ss >> node_num;
- new Canvas::Text (*this, header_w/2, NODE_HEIGHT/2, node_num);
+ new Canvas::Text (*this, header_w/2, ViewBTree::node_height/2, node_num);
double x = header_w;
+ y = 0;
std::list<BTreeData *>::iterator it = keys.begin ();
while (it != keys.end ()) {
BTreeData *data = (*it);
double w = ViewBTree::byte_to_pixels * data->Size ();
- ViewBTreeData *v = ViewBTreeData::Create (data, this, x, 0, w+x, NODE_HEIGHT);
+ ViewBTreeData *v = ViewBTreeData::Create (data, this, x, y, w+x, y+ViewBTree::node_height);
v->signal_clicked ().connect ( sigc::mem_fun (this , &ViewNode::on_item_clicked ));
+ v->signal_double_clicked ().connect ( sigc::mem_fun (this , &ViewNode::on_item_activated ));
x += w;
+ used_width += w;
+ if (x >= 512) {
+ x = 0;
+ y += ViewBTree::node_height + 5;
+ }
it++;
+ datas.push_back (v);
+
if (!dynamic_cast<BTreeLeafData *>(data)) {
/* Si no es un dato de una hoja, tiene hijos */
- hijos.push_back (data->getChild ());
+ hijos.push_back (data->GetChild ());
}
}
+ w1 = ViewBTree::node_width - used_width;
+ if (w1 > 0) {
+ fondo = new Canvas::Rect (*this, x, y, x+w1, ViewBTree::node_height+y);
+ fondo->property_fill_color() = "gray";
+ fondo->property_outline_color() = "black";
+ }
}
-void ViewNode::on_item_clicked (BTreeData *data)
+void ViewNode::on_item_clicked (BTreeData *data, ViewBTreeData *s)
{
- m_signal_selected (data, num);
+ if (last_selected)
+ if (s != last_selected)
+ last_selected->SetSelected (false);
+ last_selected = s;
+ m_signal_selected (data, num, this);
+}
+
+void ViewNode::on_item_activated (BTreeData *data, ViewBTreeData *s)
+{
+ /* Solo activo los que tienen hijos */
+ if (dynamic_cast<BTreeLeafData *> (data) == NULL)
+ m_signal_activated (data, num, this);
}
ViewNode::type_signal_selected ViewNode::signal_selected ()
return m_signal_selected;
}
+ViewNode::type_signal_activated ViewNode::signal_activated ()
+{
+ return m_signal_activated;
+}
+
+void ViewNode::SetSelected (bool b)
+{
+ if (last_selected) {
+ last_selected->SetSelected (b);
+ }
+}
+
+void ViewNode::HighliteKey (Clave &k)
+{
+ std::list<ViewBTreeData *>::iterator it;
+
+ it = datas.begin ();
+ while (it != datas.end ()) {
+ if ((*(*it)) == k) {
+ if (last_selected)
+ last_selected->SetSelected (false);
+ last_selected = *it;
+ last_selected->SetSelected (true);
+ }
+ it++;
+ }
+}
+