#ifndef GRAPH_CONTROLLER_H #define GRAPH_CONTROLLER_H #include #include #include "utility/messaging/MessageListener.h" #include "utility/messaging/type/activation/MessageActivateLegend.h" #include "utility/messaging/type/error/MessageActivateErrors.h" #include "utility/messaging/type/MessageActivateAll.h" #include "utility/messaging/type/MessageActivateFullTextSearch.h" #include "utility/messaging/type/MessageActivateTokens.h" #include "utility/messaging/type/MessageActivateTrail.h" #include "utility/messaging/type/MessageActivateTrailEdge.h" #include "utility/messaging/type/MessageFlushUpdates.h" #include "utility/messaging/type/MessageFocusIn.h" #include "utility/messaging/type/MessageFocusOut.h" #include "utility/messaging/type/MessageGraphNodeBundleSplit.h" #include "utility/messaging/type/MessageGraphNodeExpand.h" #include "utility/messaging/type/MessageGraphNodeHide.h" #include "utility/messaging/type/MessageGraphNodeMove.h" #include "utility/messaging/type/MessageScrollGraph.h" #include "utility/messaging/type/MessageShowReference.h" #include "component/controller/Controller.h" #include "component/controller/helper/DummyEdge.h" #include "component/controller/helper/DummyNode.h" #include "component/view/GraphView.h" #include "data/graph/Node.h" class Graph; class StorageAccess; class GraphController : public Controller , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener , public MessageListener { public: GraphController(StorageAccess* storageAccess); ~GraphController(); private: virtual void handleMessage(MessageActivateAll* message); virtual void handleMessage(MessageActivateErrors* message); virtual void handleMessage(MessageActivateFullTextSearch* message); virtual void handleMessage(MessageActivateLegend* message); virtual void handleMessage(MessageActivateTokens* message); virtual void handleMessage(MessageActivateTrail* message); virtual void handleMessage(MessageActivateTrailEdge* message); virtual void handleMessage(MessageFlushUpdates* message); virtual void handleMessage(MessageFocusIn* message); virtual void handleMessage(MessageFocusOut* message); virtual void handleMessage(MessageGraphNodeBundleSplit* message); virtual void handleMessage(MessageGraphNodeExpand* message); virtual void handleMessage(MessageGraphNodeHide* message); virtual void handleMessage(MessageGraphNodeMove* message); virtual void handleMessage(MessageScrollGraph* message); virtual void handleMessage(MessageShowReference* message); GraphView* getView() const; virtual void clear(); void createDummyGraph(const std::shared_ptr graph); void createDummyGraphAndSetActiveAndVisibility( const std::vector& tokenIds, const std::shared_ptr graph, bool keepExpandedNodesExpanded); std::vector> createDummyNodeTopDown(Node* node, Id ancestorId); void updateDummyNodeNamesAndAddQualifiers(const std::vector>& dummyNodes); std::vector getExpandedNodeIds() const; void setExpandedNodeIds(const std::vector& nodeIds); void autoExpandActiveNode(const std::vector& activeTokenIds); bool setActive(const std::vector& activeTokenIds, bool showAllEdges); void setVisibility(bool noActive); void setActiveAndVisibility(const std::vector& activeTokenIds); void setNodeActiveRecursive(DummyNode* node, const std::vector& activeTokenIds, bool* noActive) const; bool setNodeVisibilityRecursiveBottomUp(DummyNode* node, bool noActive) const; void setNodeVisibilityRecursiveTopDown(DummyNode* node, bool parentExpanded) const; void hideBuiltinTypes(); void bundleNodes(); void bundleNodesAndEdgesMatching( std::function matcher, size_t count, bool countConnectedNodes, const std::wstring& name); std::shared_ptr bundleNodesMatching( std::list>& nodes, std::function matcher, const std::wstring& name); std::shared_ptr bundleByType( std::list>& nodes, const NodeType& type, const Tree& bundleInfoTree, const bool considerInvisibleNodes); void bundleNodesByType(); void addCharacterIndex(); bool hasCharacterIndex() const; void groupNodesByParents(GroupType groupType); DummyNode* groupAllNodes(GroupType groupType, Id groupNodeId); void groupTrailNodes(GroupType groupType); void layoutNesting(); void extendEqualFunctionNames(const std::vector>& nodes) const; void layoutNestingRecursive(DummyNode* node) const; void addExpandToggleNode(DummyNode* node) const; void layoutToGrid(DummyNode* node) const; void layoutGraph(bool getSortedNodes = false); void layoutList(); void layoutTrail(bool horizontal, bool hasOrigin); void assignBundleIds(); std::shared_ptr getDummyGraphNodeById(Id tokenId) const; DummyEdge* getDummyGraphEdgeById(Id tokenId) const; void relayoutGraph( MessageBase* message, GraphView::GraphParams params, bool withCharacterIndex, const std::wstring& groupName); void buildGraph(MessageBase* message, GraphView::GraphParams params); void forEachDummyNodeRecursive(std::function func); void forEachDummyEdge(std::function func); void createLegendGraph(); StorageAccess* m_storageAccess; std::vector> m_dummyNodes; std::vector> m_dummyEdges; std::map> m_dummyGraphNodes; std::vector m_activeNodeIds; std::vector m_activeEdgeIds; std::shared_ptr m_graph; std::map m_topLevelAncestorIds; bool m_useBezierEdges = false; bool m_showsLegend = false; }; #endif // GRAPH_CONTROLLER_H