]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - viewer/view_btree.cpp
Seteo arbol.
[z.facultad/75.52/treemulator.git] / viewer / view_btree.cpp
1
2 #include "view_btree.h"
3 #include "view_btree_data.h"
4 #include <sigc++/slot.h>
5
6 double ViewBTree::byte_to_pixels = 0;
7 double ViewBTree::node_width = 0;
8
9 ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename, uint block_size):Canvas::Group (*parent, 0, 0),
10         BTree (filename, block_size)
11 {
12         /* Cada bytes lo hago de 5 units de ancho */
13         node_width = 3 * block_size; // 64 == blocksize
14         byte_to_pixels  = node_width/block_size; // TODO : 64 == BlockSize
15
16         last_selected = NULL;
17 }
18
19 void ViewBTree::AddNode (uint num)
20 {
21         if (node_placed[num]) {
22                 std::cout << "WARNING : Tratando de agregar de nuevo el nodo " << num << std::endl;
23                 return;
24         }
25
26         node_placed[num] = true;
27         /* Muestro la raiz */
28         double y = 0;
29         uchar *node = ReadBlock (num);
30
31         BTreeNodeHeader node_h;
32         ReadNodoHeader (node, &node_h);
33
34         if (num == 0) {
35                 max_level = node_h.level;
36         } else {
37                 y = (max_level - node_h.level)*(NODE_HEIGHT+10);
38         }
39
40         std::list<BTreeData *> keys = ReadKeys (node, node_h);
41
42         ViewNode *vnode = new ViewNode (this, num, node_h, keys);
43         vnode->property_y () = y;
44         vnode->property_x () = pos_x[node_h.level];
45         pos_x[node_h.level] += ViewBTree::node_width+10;
46         vnode->signal_selected().connect ( sigc::mem_fun (*this, &ViewBTree::on_item_selected) );
47
48         std::list<uint> childs = vnode->getChilds ();
49         std::list<uint>::iterator hit = childs.begin ();
50         while (hit != childs.end ()) {
51                 if ((*hit) == 0) {
52                         std::cout << "WARNING : Referencia a 0 encontrada!!" << std::endl;
53                         hit = childs.end ();
54                         continue;
55                 }
56                 AddNode (*hit);
57                 hit++;
58         }
59 }
60
61 void ViewBTree::on_item_selected (BTreeData *data, uint num, ViewNode *vnode)
62 {
63         BTreeNodeHeader node_h;
64         uchar *node;
65         
66         node = ReadBlock (num);
67         ReadNodoHeader (node, &node_h);
68         delete [] node;
69
70         if (last_selected)
71                 if (vnode != last_selected)
72                         last_selected->SetSelected (false);
73         last_selected = vnode;
74         vnode->SetSelected (true);
75         m_signal_selected (data, node_h);
76 }
77
78 ViewBTree::type_signal_selected ViewBTree::signal_selected ()
79 {
80         return m_signal_selected;
81 }
82