Salome HOME
Merge with version on tag OCC-V2_1_0d
[modules/superv.git] / src / SUPERVGUI / SUPERVGUI_CanvasControlNode.cxx
1 //  SUPERV SUPERVGUI : GUI for Supervisor component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE
4 //
5 //  File   : SUPERVGUI_CanvasControlNode.cxx
6 //  Author : Natalia KOPNOVA
7 //  Module : SUPERV
8
9 using namespace std;
10 #include "SUPERVGUI_CanvasControlNode.h"
11 #include "SUPERVGUI_CanvasControlNodePrs.h"
12 #include "SUPERVGUI_Main.h"
13 #include "SUPERVGUI_Canvas.h"
14 #include "SUPERVGUI_ControlNode.h" // access to SelectInlineDlg
15
16 #include "QAD_FileDlg.h"
17 #include "QAD_Application.h"
18
19 //=====================================================================
20 // Compute node
21 //=====================================================================
22 SUPERVGUI_CanvasComputeNode::SUPERVGUI_CanvasComputeNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode):
23   SUPERVGUI_CanvasNode(theParent, theMain, theNode)
24 {
25   Trace("SUPERVGUI_CanvasComputeNode::SUPERVGUI_CanvasComputeNode");
26 }
27
28 QPopupMenu* SUPERVGUI_CanvasComputeNode::getPopupMenu(QWidget* theParent) 
29 {
30   QPopupMenu* popup = SUPERVGUI_CanvasNode::getPopupMenu(theParent);
31
32   QPopupMenu* aShowPopup = new QPopupMenu(theParent);
33   int anItem;
34   anItem = aShowPopup->insertItem(tr("POP_SHOWTITLES"), this, SLOT(switchLabel()));
35   aShowPopup->setItemChecked(anItem, getPrs()->isLabelVisible());
36   anItem = aShowPopup->insertItem(tr("POP_SHOWPORTS"), this, SLOT(switchPorts()));
37   aShowPopup->setItemChecked(anItem, getPrs()->isPortVisible());
38
39   popup->insertSeparator();
40   popup->insertItem(tr("POP_SHOW"), aShowPopup);
41
42   return popup;
43 }
44
45
46 //=====================================================================
47 // Start control node
48 //=====================================================================
49 SUPERVGUI_CanvasStartNode::SUPERVGUI_CanvasStartNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode):
50   SUPERVGUI_CanvasNode(theParent, theMain, theNode), 
51   myCoupled(0)
52 {
53   Trace("SUPERVGUI_CanvasStartNode::SUPERVGUI_CanvasStartNode");
54 }
55
56 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasStartNode::createPrs() const
57 {
58   return new SUPERVGUI_CanvasStartNodePrs(getMain()->getCanvas(), 
59                                           (SUPERVGUI_CanvasStartNode*)this);
60 }
61
62 bool SUPERVGUI_CanvasStartNode::setNodeName(QString aName)
63 {
64   bool result = SUPERVGUI_CanvasNode::setNodeName(aName);
65   if (result && myCoupled) {
66     myCoupled->setNodeName(QString(tr("ENDNODE_PREFIX"))+aName);
67   }
68   return result;
69 }
70
71 QPopupMenu* SUPERVGUI_CanvasStartNode::getPopupMenu(QWidget* theParent) 
72 {
73   QPopupMenu* popup = SUPERVGUI_CanvasNode::getPopupMenu(theParent);
74
75   popup->insertSeparator();
76   int anItem = popup->insertItem(tr("POP_HIDEPORTS"), this, SLOT(switchPorts()));
77   popup->setItemChecked(anItem, !getPrs()->isPortVisible());
78
79   return popup;
80 }
81
82 void SUPERVGUI_CanvasStartNode::remove()
83 {
84   SUPERVGUI_Canvas* aCanvas = getMain()->getCanvas();
85
86   setDestroyed();
87   if (myCoupled) myCoupled->setDestroyed();
88
89   getEngine()->destroy();
90
91   if (myCoupled) delete myCoupled;
92   delete this;
93
94   aCanvas->update();
95 }
96
97 void SUPERVGUI_CanvasStartNode::onDestroyed(QObject* theObject)
98 {
99   if (!isIgnore) {
100     SUPERVGUI_CanvasNode::onDestroyed(theObject);
101     if (getEngine()->IsLoop()) merge();
102     if (myCoupled) myCoupled->merge();
103   }
104 }
105
106 void SUPERVGUI_CanvasStartNode::addInputPort()
107 {
108   SUPERVGUI_CanvasNode::addInputPort();
109   if (getEngine()->IsLoop()) merge();
110   if (myCoupled) myCoupled->merge();
111 }
112
113 void SUPERVGUI_CanvasStartNode::addOutputPort()
114 {
115   SUPERVGUI_CanvasNode::addOutputPort();
116   if (myCoupled) myCoupled->merge();
117 }
118
119 //=====================================================================
120 // End control node
121 //=====================================================================
122 SUPERVGUI_CanvasEndNode::SUPERVGUI_CanvasEndNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode,
123                                                  SUPERVGUI_CanvasStartNode* theStart):
124   SUPERVGUI_CanvasNode(theParent, theMain, theNode), 
125   myCoupled(theStart)
126 {
127   Trace("SUPERVGUI_CanvasEndNode::SUPERVGUI_CanvasEndNode");
128   myCoupled->setCoupled(this);
129 }
130
131 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasEndNode::createPrs() const
132 {
133   return new SUPERVGUI_CanvasEndNodePrs(getMain()->getCanvas(), 
134                                         (SUPERVGUI_CanvasEndNode*)this);
135 }
136
137 QPopupMenu* SUPERVGUI_CanvasEndNode::getPopupMenu(QWidget* theParent) 
138 {
139   QPopupMenu* popup = SUPERVGUI_CanvasNode::getPopupMenu(theParent);
140
141   popup->insertSeparator();
142   int anItem = popup->insertItem(tr("POP_HIDEPORTS"), this, SLOT(switchPorts()));
143   popup->setItemChecked(anItem, !getPrs()->isPortVisible());
144
145   return popup;
146 }
147
148 void SUPERVGUI_CanvasEndNode::addInputPort()
149 {
150   SUPERVGUI_CanvasNode::addInputPort();
151   if (getEngine()->IsEndSwitch()) merge();
152 }
153
154
155 //=====================================================================
156 // Goto control node
157 //=====================================================================
158 SUPERVGUI_CanvasGotoNode::SUPERVGUI_CanvasGotoNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode):
159   SUPERVGUI_CanvasNode(theParent, theMain, theNode)
160 {
161   Trace("SUPERVGUI_CanvasGotoNode::SUPERVGUI_CanvasGotoNode");
162 }
163
164 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasGotoNode::createPrs() const
165 {
166   return new SUPERVGUI_CanvasGotoNodePrs(getMain()->getCanvas(), 
167                                          (SUPERVGUI_CanvasGotoNode*)this);
168 }
169
170 QPopupMenu* SUPERVGUI_CanvasGotoNode::getPopupMenu(QWidget* theParent) 
171 {
172   QPopupMenu* popup = SUPERVGUI_CanvasNode::getPopupMenu(theParent);
173
174   popup->insertSeparator();
175   popup->insertItem("Link to Node...", this, SLOT(linkToNode()));
176
177   popup->insertSeparator();
178   int anItem = popup->insertItem(tr("POP_HIDEPORTS"), this, SLOT(switchPorts()));
179   popup->setItemChecked(anItem, !getPrs()->isPortVisible());
180
181   return popup;
182 }
183
184 void SUPERVGUI_CanvasGotoNode::linkToNode() {
185   SUPERVGUI_SelectInlineDlg* aDlg = new SUPERVGUI_SelectInlineDlg(getMain());
186   if (aDlg->exec()) {
187     QString aNodeName = aDlg->getName();
188     if (!aNodeName.isEmpty()) { //implement additional check from GUI side for bug PAL7007
189       getGotoNode()->SetCoupled(aNodeName.latin1());
190       getMain()->getCanvas()->sync();
191     }
192   }
193   delete aDlg;
194 }
195
196 //=====================================================================
197 // Macro node
198 //=====================================================================
199 SUPERVGUI_CanvasMacroNode::SUPERVGUI_CanvasMacroNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode):
200   SUPERVGUI_CanvasComputeNode(theParent, theMain, theNode)
201 {
202   Trace("SUPERVGUI_CanvasMacroNode::SUPERVGUI_CanvasMacroNode");
203 }
204
205 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasMacroNode::createPrs() const
206 {
207   return new SUPERVGUI_CanvasMacroNodePrs(getMain()->getCanvas(), 
208                                           (SUPERVGUI_CanvasMacroNode*)this);
209 }
210
211 QPopupMenu* SUPERVGUI_CanvasMacroNode::getPopupMenu(QWidget* theParent) 
212 {
213   QPopupMenu* popup = SUPERVGUI_CanvasComputeNode::getPopupMenu(theParent);
214
215   popup->insertSeparator(0);
216   popup->insertItem(tr("MSG_EXPORT"), this, SLOT(exportDataflow()), 0, -1, 0);
217   popup->insertItem("Open SubGraph", this, SLOT(openSubGraph()), 0, -1, 0);
218
219   return popup;
220 }
221
222 void SUPERVGUI_CanvasMacroNode::openSubGraph()
223 {
224   getMain()->openSubGraph(getEngine());
225 }
226
227 void SUPERVGUI_CanvasMacroNode::exportDataflow()
228 {
229   SUPERV_Graph aGraph;
230   if (getEngine()->IsMacro()) {
231     SUPERV_Graph aMacro = getMacroNode();
232     if (aMacro->IsStreamMacro())
233       aGraph = aMacro->StreamObjRef();
234     else
235       aGraph = aMacro->FlowObjRef();
236   }
237   if (SUPERV_isNull(aGraph)) {
238     QMessageBox::warning(QAD_Application::getDesktop(), tr("WARNING"), tr("MSG_NOWINDOW_TO_EXPORT"));
239     return;
240   }
241   else {
242     QString aFileName = QAD_FileDlg::getFileName(QAD_Application::getDesktop(),
243                                                  "",
244                                                  "*.xml",
245                                                  tr("TTL_EXPORT_DATAFLOW"),
246                                                  false);
247     if (!aFileName.isEmpty()) {
248       if (!aGraph->Export(aFileName.latin1())) {
249         QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_BAD_WRITING"));
250       }
251     }
252   }
253 }