Salome HOME
DCQ:prepare 2.0.0
[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     getGotoNode()->SetCoupled(aNodeName.latin1());
189     getMain()->getCanvas()->sync();
190   }
191   delete aDlg;
192 }
193
194 //=====================================================================
195 // Macro node
196 //=====================================================================
197 SUPERVGUI_CanvasMacroNode::SUPERVGUI_CanvasMacroNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode):
198   SUPERVGUI_CanvasComputeNode(theParent, theMain, theNode)
199 {
200   Trace("SUPERVGUI_CanvasMacroNode::SUPERVGUI_CanvasMacroNode");
201 }
202
203 SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasMacroNode::createPrs() const
204 {
205   return new SUPERVGUI_CanvasMacroNodePrs(getMain()->getCanvas(), 
206                                           (SUPERVGUI_CanvasMacroNode*)this);
207 }
208
209 QPopupMenu* SUPERVGUI_CanvasMacroNode::getPopupMenu(QWidget* theParent) 
210 {
211   QPopupMenu* popup = SUPERVGUI_CanvasComputeNode::getPopupMenu(theParent);
212
213   popup->insertSeparator(0);
214   popup->insertItem(tr("MSG_EXPORT"), this, SLOT(exportDataflow()), 0, -1, 0);
215   popup->insertItem("Open SubGraph", this, SLOT(openSubGraph()), 0, -1, 0);
216
217   return popup;
218 }
219
220 void SUPERVGUI_CanvasMacroNode::openSubGraph()
221 {
222   getMain()->openSubGraph(getEngine());
223 }
224
225 void SUPERVGUI_CanvasMacroNode::exportDataflow()
226 {
227   SUPERV_Graph aGraph;
228   if (getEngine()->IsMacro()) {
229     SUPERV_Graph aMacro = getMacroNode();
230     if (aMacro->IsStreamMacro())
231       aGraph = aMacro->StreamObjRef();
232     else
233       aGraph = aMacro->FlowObjRef();
234   }
235   if (SUPERV_isNull(aGraph)) {
236     QMessageBox::warning(QAD_Application::getDesktop(), tr("WARNING"), tr("MSG_NOWINDOW_TO_EXPORT"));
237     return;
238   }
239   else {
240     QString aFileName = QAD_FileDlg::getFileName(QAD_Application::getDesktop(),
241                                                  "",
242                                                  "*.xml",
243                                                  tr("TTL_EXPORT_DATAFLOW"),
244                                                  false);
245     if (!aFileName.isEmpty()) {
246       if (!aGraph->Export(aFileName.latin1())) {
247         QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_BAD_WRITING"));
248       }
249     }
250   }
251 }