00001 /* 00002 * graph_layout.h 00003 * 00004 * graph layout module 00005 * 00006 */ 00007 00008 #ifndef G_LAYOUT_H 00009 #define G_LAYOUT_H 00010 00011 #include "common/suif_list.h" 00012 00013 #define MAX_DEPTH 100 00014 00015 struct layout_geometry { 00016 int x; // top left corner coordinate 00017 int y; // top left corner coordinate 00018 int width; 00019 int height; 00020 }; 00021 00022 struct layout_config { 00023 int xspacing; 00024 int yspacing; 00025 int xoffset; 00026 int yoffset; 00027 }; 00028 00029 class layout_node; 00030 typedef list<layout_node*> layout_node_list; 00031 00032 class layout_node { 00033 00034 private: 00035 friend class graph_layout; 00036 00037 layout_node *parent; 00038 void *client_id; 00039 00040 layout_geometry geom; 00041 layout_node_list *succs; 00042 layout_node_list *preds; 00043 00044 //boolean visited; // for misc purposes 00045 bool visited; // for misc purposes 00046 int depth; // depth in the tree (used in layout_tree) 00047 int priority; // priority level (used in layout_tree) 00048 00049 public: 00050 layout_node(void *node_id); 00051 ~layout_node(void); 00052 00053 int find_connectivity(layout_node_list *visited); 00054 }; 00055 00056 00057 00058 00059 class graph_layout { 00060 00061 private: 00062 int num_nodes; 00063 00064 layout_node_list *nodes; 00065 layout_node *root; 00066 layout_config config; 00067 00068 int max_ypos[MAX_DEPTH]; // used for layout_tree 00069 00070 void reset_visited(void); 00071 void reset_depth(void); 00072 void reset_priority(void); 00073 layout_node *find_node(void *node_id); 00074 00075 void toposort(void); 00076 void topo_node_sort(layout_node *n, layout_node *parent, int depth); 00077 00078 void layout_tree_y(layout_node *n, int yoffset); 00079 void layout_tree_x(int xoffset); 00080 00081 int find_space(layout_node *n); 00082 int find_max_depth(layout_node *n); 00083 //boolean cycle_exists(layout_node *n, layout_node *child); 00084 bool cycle_exists(layout_node *n, layout_node *child); 00085 static void increase_forest_priority(layout_node *n, int delta, 00086 layout_node_list &visited); 00087 00088 public: 00089 graph_layout(void); 00090 ~graph_layout(void); 00091 00092 void add_node(void *node_id, layout_geometry &geom); 00093 void add_edge(void *node_id, void *node_id2); 00094 00095 void set_root(void *node_id); 00096 void configure(layout_config &c) { 00097 config = c; 00098 } 00099 00100 int layout_tree(void); 00101 00102 layout_geometry &get_node_bbox(void *node_id); 00103 }; 00104 00105 #endif