summaryrefslogtreecommitdiff
path: root/objects/objview_graph.hh
diff options
context:
space:
mode:
Diffstat (limited to 'objects/objview_graph.hh')
-rw-r--r--objects/objview_graph.hh305
1 files changed, 305 insertions, 0 deletions
diff --git a/objects/objview_graph.hh b/objects/objview_graph.hh
new file mode 100644
index 0000000..9619f7e
--- /dev/null
+++ b/objects/objview_graph.hh
@@ -0,0 +1,305 @@
+#ifndef __OBJECTS_OBJVIEW_GRAPH_HH__
+#define __OBJECTS_OBJVIEW_GRAPH_HH__
+
+#include "objview_stacktrace.hh"
+#include "objview_commands.hh"
+#include "dwr/graph.hh"
+#include "dwr/graph2.hh"
+#include "dwr/toggle.hh"
+#include "dwr/vbox.hh"
+#include "dwr/hbox.hh"
+#include "dwr/label.hh"
+#include "common/tools.hh"
+
+namespace rtfl {
+
+namespace objects {
+
+enum OVGCommandType {
+ OVG_COMMAND_CREATE,
+ OVG_COMMAND_INDENT,
+ OVG_COMMAND_MESSAGE,
+ OVG_COMMAND_MARK,
+ OVG_COMMAND_FUNCTION,
+ OVG_COMMAND_ASSOC,
+ OVG_COMMAND_ADD_ATTR,
+ OVG_COMMAND_DELETE
+};
+
+class ObjViewGraphListener: public ObjViewListener
+{
+private:
+ ObjViewGraph *graph;
+
+public:
+ ObjViewGraphListener (ObjViewGraph *graph) { this->graph = graph; }
+
+ void close (ObjViewStacktraceWindow *window);
+};
+
+
+class ObjViewFilterTool
+{
+public:
+ virtual void addAspect (const char *aspect) = 0;
+ virtual void addPriority (int priority) = 0;
+ virtual bool isAspectSelected (const char *aspect) = 0;
+ virtual bool isPrioritySelected (int priority) = 0;
+ virtual bool isTypeSelected (OVGCommandType type) = 0;
+ virtual void addMark (OVGAddMarkCommand *markCommand) = 0;
+};
+
+class OVGAttribute;
+
+class OVGAttributesList: public lout::object::Object
+{
+private:
+ OVGAttributesList *parent;
+ int childNoCount, numChildrenShown, childNo;
+ lout::misc::BitSet *childrenShown;
+ bool shown;
+
+ void checkVisibility ();
+
+protected:
+ lout::container::typed::HashTable<lout::object::String,
+ OVGAttribute> *attributes;
+
+ virtual void show () = 0;
+ virtual void hide () = 0;
+
+public:
+ dw::VBox *vbox;
+ dw::Toggle *toggle;
+
+ OVGAttributesList (OVGAttributesList *parent);
+ ~OVGAttributesList ();
+
+ inline OVGAttribute *get (lout::object::String *key)
+ { return attributes->get (key); }
+ virtual int add (lout::object::String *key, OVGAttribute *attribute) = 0;
+
+ void initWidgets (::dw::core::style::Style *widgetStyle, dw::Box *parent,
+ bool showLarge);
+
+ int registerChild ();
+ void unregisterChild (int childNo);
+ void childShown (int childNo);
+ void childHidden (int childNo);
+};
+
+class OVGTopAttributes: public OVGAttributesList
+{
+protected:
+ lout::container::typed::Vector<lout::object::String> *sortedList;
+
+ void show ();
+ void hide ();
+
+public:
+ OVGTopAttributes ();
+ ~OVGTopAttributes ();
+
+ int add (lout::object::String *key, OVGAttribute *attribute);
+};
+
+// Hint: the OVGAttributesList'ness refers to the children.
+class OVGAttribute: public OVGAttributesList
+{
+protected:
+ void show ();
+ void hide ();
+
+public:
+ dw::HBox *hbox;
+ dw::Label *label;
+ char *name;
+
+ OVGAttribute (const char *name, OVGAttributesList *parent);
+ ~OVGAttribute ();
+
+ void initWidgets (::dw::core::style::Style *widgetStyle,
+ dw::Box *parent, bool showLarge, int newPos);
+
+ int add (lout::object::String *key, OVGAttribute *attribute);
+};
+
+class ObjViewGraph: public
+#if USE_GRAPH2
+ dw::Graph2
+#else
+ dw::Graph
+#endif
+{
+ friend class OVGCommonCommand;
+ friend class OVGIncIndentCommand;
+ friend class OVGDecIndentCommand;
+ friend class OVGEnterCommand;
+ friend class OVGLeaveCommand;
+ friend class OVGAddMessageCommand;
+ friend class OVGAddMarkCommand;
+ friend class OVGCreateCommand;
+ friend class OVGAddAssocCommand;
+ friend class OVGAddAttrCommand;
+ friend class OVGDeleteCommand;
+ friend class ObjViewGraphListener;
+
+private:
+ class CreateRefCommand;
+
+ class GraphObject: public lout::object::Object
+ {
+ friend class CreateRefCommand;
+ friend class ObjViewGraph;
+
+ private:
+ ObjViewGraph *graph;
+
+ public:
+ char *id, *className;
+ ::dw::core::style::Style *messageStyle;
+ dw::Toggle *node;
+ dw::Label *id1, *id2;
+ OVGTopAttributes *attributes;
+ dw::VBox *messages;
+
+ GraphObject (ObjViewGraph *graph, const char *id);
+ ~GraphObject ();
+
+ };
+
+ // Inernally added for the first occurence of an identity.
+ class CreateRefCommand: public OVGCommonCommand
+ {
+ protected:
+ void doExec ();
+ void doUndo ();
+
+ public:
+ CreateRefCommand (ObjViewGraph *graph, const char *id,
+ GraphObject *graphObject);
+ };
+
+ class Color: public lout::object::Object
+ {
+ public:
+ char *identifier;
+ ::dw::core::style::Color *color;
+
+ Color (const char *classPattern, const char *color,
+ ::dw::core::Layout *layout);
+ ~Color ();
+ };
+
+ class ColorComparator: public lout::object::Comparator
+ {
+ private:
+ int specifity (const char *pattern);
+
+ public:
+ int compare(Object *o1, Object *o2);
+ };
+
+ ObjViewFilterTool *filterTool;
+
+ lout::container::typed::Vector<OVGCommand> *commands;
+ lout::container::typed::Vector<OVGCommand> *navigableCommands;
+ lout::container::typed::HashTable<lout::object::String,
+ GraphObject> *objectsById;
+ lout::container::typed::Vector<GraphObject> *allObjects;
+ lout::container::typed::Vector<Color> *classColors;
+ lout::container::typed::Vector<Color> *objectColors;
+
+ lout::container::typed::Stack<OVGEnterCommand> *enterCommands;
+ lout::container::typed::Stack<OVGIncIndentCommand> *startCommands;
+
+ bool objectContents, objectMessages;
+ char *codeViewer;
+ int navigableCommandsPos, hiddenBefore, hiddenAfter, numVisibleCommands;
+
+ ::dw::core::style::Style *nodeStyle, *noBorderStyle, *topBorderStyle,
+ *bottomBorderStyle, *leftBorderStyle;
+ bool inDestructor;
+
+ lout::container::typed::List <ObjViewStacktraceWindow> *stacktraceWindows;
+ ObjViewGraphListener *stacktraceListener;
+
+ GraphObject *ensureObject (const char *id);
+ OVGAttribute *addAttribute (OVGAttributesList *attributesList, char **parts,
+ const char *value, dw::Label **smallLabel,
+ dw::HBox **histBox, dw::Label **indexLabel,
+ dw::Label **histLabel);
+
+ ::dw::core::style::Color *getObjectColor (GraphObject *obj);
+ void applyClassOrObjectStyle (GraphObject *obj);
+ void applyClassOrObjectStyles ();
+
+ void addMessage (const char *id, const char *message, dw::HBox **mainBox,
+ dw::Label **indexLabel, dw::Label **mainLabel);
+ bool incIndent (const char *id);
+ bool decIndent (const char *id);
+ OVGAttribute *addAttribute (const char *id, const char *name,
+ const char *value, dw::Label **smallLabel,
+ dw::HBox **histBox, dw::Label **indexLabel,
+ dw::Label **histLabel);
+ void setClassName (const char *id, const char *className);
+ void addAssoc (const char *id1, const char *id2);
+
+ void clearSelection ();
+ void unclearSelection ();
+ int firstCommand ();
+ int lastCommand ();
+
+public:
+ ObjViewGraph (ObjViewFilterTool *objectFilterTool);
+ ~ObjViewGraph ();
+ void initStyles (const char *fontName, int fontSize, int fgColor,
+ int graphBgColor, int objBgColor, int borderThickness,
+ int grraphMargin);
+
+ void addCommand (OVGCommand *command, bool navigable);
+ void addIdentity (const char *id1, const char *id2);
+ void setClassColor (const char *klass, const char *color);
+ void setObjectColor (const char *id, const char *color);
+
+ int getObjectColor (const char *id);
+
+ inline void pushEnterCommand (OVGEnterCommand *enterCommand)
+ { enterCommands->push (enterCommand); }
+ void popEnterCommand () { enterCommands->pop (); }
+ OVGEnterCommand *getLastEnterCommand () { return enterCommands->getTop (); }
+
+ inline void pushStartCommand (OVGIncIndentCommand *startCommand)
+ { startCommands->push (startCommand); }
+ void popStartCommand () { startCommands->pop (); }
+ OVGIncIndentCommand *getLastStartCommand ()
+ { return startCommands->getTop (); }
+
+ inline void addCommandMark (OVGAddMarkCommand *markCommand)
+ { filterTool->addMark (markCommand); }
+
+ void previousCommand ();
+ void nextCommand ();
+ void viewCodeOfCommand ();
+ void showStackTraceOfCommand ();
+ void switchBetweenRelatedCommands ();
+ void setCommand (int index);
+ void hideBeforeCommand ();
+ void hideAfterCommand ();
+ void hideAllCommands ();
+ void showBeforeCommand ();
+ void showAfterCommand ();
+ void showAllCommands ();
+
+ inline void showObjectContents (bool val) { objectContents = val; }
+ inline void showObjectMessages (bool val) { objectMessages = val; }
+ void setCodeViewer (const char *codeViewer);
+
+ void recalculateCommandsVisibility ();
+};
+
+} // namespace objects
+
+} // namespace rtfl
+
+#endif // __OBJECTS_OBJVIEW_GRAPH_HH__