]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - viewer/view_btree.cpp
5c54a874f174304d7f39c755881b7d54b6be8ff8
[z.facultad/75.52/treemulator.git] / viewer / view_btree.cpp
1
2 #include "view_btree.h"
3 #include "view_btree_data.h"
4                 
5 double ViewBTree::byte_to_pixels = 0;
6
7 ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename):Canvas::Group (*parent, 0, 0),
8         BTree (filename, 64)
9 {
10         /* TODO : hace que el arbol se abra de un archivo ya creado o que se
11          * cree afuera
12          */
13         for (int i=0; i<=64; i++) {
14                 ClaveFija c(i);
15
16                 AddKey (c);
17         }
18
19         byte_to_pixels  = NODE_WIDTH/64; // TODO : 64 == BlockSize
20
21         AddNode (0);
22 }
23
24 void ViewBTree::AddNode (uint num)
25 {
26         if (node_placed[num]) {
27                 std::cout << "WARNING : Tratando de agregar de nuevo el nodo " << num << std::endl;
28                 return;
29         }
30
31         node_placed[num] = true;
32         /* Muestro la raiz */
33         double y = 0;
34         uchar *node = ReadBlock (num);
35
36         BTreeNodeHeader node_h;
37         ReadNodoHeader (node, &node_h);
38
39         if (num == 0) {
40                 max_level = node_h.level;
41         } else {
42                 y = (max_level - node_h.level)*(NODE_HEIGHT+10);
43         }
44
45         std::list<BTreeData *> keys = ReadKeys (node, node_h);
46
47         ViewNode *vnode = new ViewNode (this, num, node_h, keys);
48         vnode->property_y () = y;
49         vnode->property_x () = pos_x[node_h.level];
50         pos_x[node_h.level] += NODE_WIDTH+10;
51
52         std::list<uint> childs = vnode->getChilds ();
53         std::list<uint>::iterator hit = childs.begin ();
54         while (hit != childs.end ()) {
55                 if ((*hit) == 0) {
56                         std::cout << "WARNING : Referencia a 0 encontrada!!" << std::endl;
57                         hit = childs.end ();
58                         continue;
59                 }
60                 AddNode (*hit);
61                 hit++;
62         }
63 }
64
65 ViewNode::ViewNode (Canvas::Group *parent, uint num, BTreeNodeHeader &header, std::list<BTreeData *> &keys)
66         : Canvas::Group (*parent)
67 {
68         double header_w = ViewBTree::byte_to_pixels * sizeof (BTreeNodeHeader);
69
70         /* Fondo */
71         Canvas::Rect *fondo = new Canvas::Rect (*this, 0, 0, NODE_WIDTH, NODE_HEIGHT);
72         fondo->property_fill_color() = "gray";
73         fondo->property_outline_color() = "black";
74
75         /* Header */
76         Canvas::Rect *h = new Canvas::Rect (*this, 0, 0, header_w, NODE_HEIGHT);
77         h->property_fill_color() = "blue";
78         h->property_outline_color() = "black";
79
80         /* Numero de nodo */
81         std::string node_num;
82         std::stringstream ss;
83         ss << num;
84         ss >> node_num;
85         new Canvas::Text (*this, header_w/2, NODE_HEIGHT/2, node_num);
86
87         double x = header_w;
88
89         std::list<BTreeData *>::iterator it = keys.begin ();
90         while (it != keys.end ()) {
91                 BTreeData *data = (*it);
92                 double w = ViewBTree::byte_to_pixels * data->Size ();
93
94                 ViewBTreeData *v = ViewBTreeData::Create (data, this, x, 0, w+x, NODE_HEIGHT);
95
96                 x += w;
97                 it++;
98
99                 if (!dynamic_cast<BTreeLeafData *>(data)) {
100                         /* Si no es un dato de una hoja, tiene hijos */
101                         hijos.push_back (data->getChild ());
102                 }
103         }
104 }
105