1 /*!
2 	@file
3 	@author		Albert Semenov
4 	@date		01/2009
5 */
6 #ifndef BASE_GRAPH_CONNECTION_H_
7 #define BASE_GRAPH_CONNECTION_H_
8 
9 #include <MyGUI.h>
10 #include <BaseLayout/BaseLayout.h>
11 
12 namespace wraps
13 {
14 	class BaseGraphNode;
15 	class BaseGraphConnection;
16 	typedef std::vector<BaseGraphConnection*> VectorConnection;
17 	typedef MyGUI::Enumerator<VectorConnection> EnumeratorConnection;
18 
19 	class BaseGraphConnection :
20 		public BaseLayout
21 	{
22 	public:
BaseGraphConnection(MyGUI::Widget * _widget)23 		BaseGraphConnection(MyGUI::Widget* _widget) :
24 			BaseLayout("", _widget),
25 			mOwnerNode(nullptr)
26 		{
27 			mType = mMainWidget->getUserString("Type");
28 			mName = mMainWidget->getUserString("Name");
29 
30 			const int offset = 30;
31 			mOffset = MyGUI::IntSize::parse(mMainWidget->getUserString("Direction"));
32 			mOffset.width *= offset;
33 			mOffset.height *= offset;
34 		}
35 
getOwnerNode()36 		BaseGraphNode* getOwnerNode() const
37 		{
38 			return mOwnerNode;
39 		}
getType()40 		const std::string& getType() const
41 		{
42 			return mType;
43 		}
getName()44 		const std::string& getName() const
45 		{
46 			return mName;
47 		}
48 
getAbsoluteCoord()49 		MyGUI::IntCoord getAbsoluteCoord() const
50 		{
51 			return mMainWidget->getAbsoluteCoord();
52 		}
getOffset()53 		MyGUI::IntSize getOffset() const
54 		{
55 			return mOffset;
56 		}
57 
58 		// все присоединениые к нам точки
isAnyConnection()59 		bool isAnyConnection() const
60 		{
61 			return !mConnection.empty();
62 		}
getConnectionEnumerator()63 		EnumeratorConnection getConnectionEnumerator() const
64 		{
65 			return EnumeratorConnection(mConnection);
66 		}
67 
isAnyReverseConnection()68 		bool isAnyReverseConnection() const
69 		{
70 			return !mReverseConnection.empty();
71 		}
getReverseConnectionEnumerator()72 		EnumeratorConnection getReverseConnectionEnumerator() const
73 		{
74 			return EnumeratorConnection(mReverseConnection);
75 		}
76 
addConnectionPoint(BaseGraphConnection * _point)77 		void addConnectionPoint(BaseGraphConnection* _point)
78 		{
79 			mConnection.push_back(_point);
80 			_point->_addReverseConnectionPoint(this);
81 		}
82 
removeConnectionPoint(BaseGraphConnection * _point)83 		void removeConnectionPoint(BaseGraphConnection* _point)
84 		{
85 			VectorConnection::iterator item = std::find(mConnection.begin(), mConnection.end(), _point);
86 			MYGUI_ASSERT(item != mConnection.end(), "Item not found");
87 			mConnection.erase(item);
88 			_point->_removeReverseConnectionPoint(this);
89 		}
90 
91 	/*internal:*/
_setOwnerNode(BaseGraphNode * _owner)92 		void _setOwnerNode(BaseGraphNode* _owner)
93 		{
94 			mOwnerNode = _owner;
95 		}
96 
_getMainWidget()97 		MyGUI::Widget* _getMainWidget() const
98 		{
99 			return mMainWidget;
100 		}
101 
_addReverseConnectionPoint(BaseGraphConnection * _point)102 		void _addReverseConnectionPoint(BaseGraphConnection* _point)
103 		{
104 			mReverseConnection.push_back(_point);
105 		}
106 
_removeReverseConnectionPoint(BaseGraphConnection * _point)107 		void _removeReverseConnectionPoint(BaseGraphConnection* _point)
108 		{
109 			VectorConnection::iterator item = std::find(mReverseConnection.begin(), mReverseConnection.end(), _point);
110 			MYGUI_ASSERT(item != mReverseConnection.end(), "Item not found");
111 			mReverseConnection.erase(item);
112 		}
113 
114 	private:
115 		BaseGraphNode* mOwnerNode;
116 		std::string mType;
117 		std::string mName;
118 		VectorConnection mConnection;
119 		VectorConnection mReverseConnection;
120 		MyGUI::IntSize mOffset;
121 
122 	};
123 
124 }
125 
126 #endif // BASE_GRAPH_CONNECTION_H_
127