]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blob - viewer/view_btree.cpp
a73f396c3bfa4ef0458a918e9e34b89df34190a5
[z.facultad/75.52/treemulator.git] / viewer / view_btree.cpp
1
2 #include "view_btree.h"
3 #include "view_btree_data.h"
4
5 ViewBTree::ViewBTree (Canvas::Group *parent, std::string filename):Canvas::Group (*parent, 0, 0),
6         BTree (filename, 64)
7 {
8         /* TODO : hace que el arbol se abra de un archivo ya creado o que se
9          * cree afuera
10          */
11         for (int i=0; i<=64; i++) {
12                 ClaveFija c(i);
13
14                 AddKey (c);
15         }
16
17         Canvas::Rect *rect = new Canvas::Rect (*this, 0, 0, NODE_WIDTH, NODE_HEIGHT);
18         rect->property_fill_color() = "gray";
19
20         byte_to_pixels  = NODE_WIDTH/64; // TODO : 64 == BlockSize
21
22         AddNode (0);
23 }
24
25 void ViewBTree::AddNode (uint num)
26 {
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         double header_w = byte_to_pixels * sizeof (BTreeNodeHeader);
43         double x = 0;
44
45         Canvas::Rect *view_header = new Canvas::Rect (*this, x, y, x+header_w, y+NODE_HEIGHT);
46         view_header->property_fill_color() = "blue";
47
48         /* Numero de nodo */
49         std::string node_num;
50         std::stringstream ss;
51         ss << num;
52         ss >> node_num;
53         new Canvas::Text (*this, header_w/2, y+NODE_HEIGHT/2, node_num);
54
55         x += header_w;
56
57         /* Cuento los hijos para saber como centrarlos más adelante */
58         std::list<uint> hijos;
59         
60         std::list<BTreeData *>::iterator it = keys.begin ();
61         while (it != keys.end ()) {
62                 BTreeData *data = (*it);
63                 double w = byte_to_pixels * data->Size ();
64
65                 ViewBTreeData *v = ViewBTreeData::Create (data, this, x, y, w+x, y+NODE_HEIGHT);
66
67                 x += w;
68                 it++;
69
70                 if (dynamic_cast<BTreeChildData *>(data)) {
71                         BTreeChildData *child = dynamic_cast<BTreeChildData *>(data);
72                         hijos.push_back (child->getChild ());
73                 }
74         }
75
76
77         std::list<uint>::iterator hit = hijos.begin ();
78         while (hit != hijos.end ()) {
79                 AddNode (*hit);
80                 hit++;
81         }
82 }
83