Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

nci/suif/suif2b/suifbrowser/visual/graph_layout.h

Go to the documentation of this file.
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

Generated at Mon Jul 31 13:42:34 2000 for NCI SUIF by doxygen 1.1.2 written by Dimitri van Heesch, © 1997-2000