1 # Copyright (C) 2006-2008 CEA/DEN, EDF R&D
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License.
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
25 from qtcanvas import *
34 class DataLinkItem(Item.Item):
35 def __init__(self,pin,pout):
36 Item.Item.__init__(self)
39 self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
41 def getIconName(self):
44 class StreamLinkItem(Item.Item):
45 def __init__(self,pin,pout):
46 Item.Item.__init__(self)
49 self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
51 def getIconName(self):
52 return "streamlink.png"
54 class ControlLinkItem(Item.Item):
55 def __init__(self,nodeup,nodedown):
56 Item.Item.__init__(self)
57 self.nodedown=nodedown
59 self.label= nodeup.getName()+"->"+nodedown.getName()
61 def getIconName(self):
62 return "controllink.png"
64 class ControlLinksItem(Item.Item):
65 """Item for all control links of a composed node"""
66 def __init__(self,item):
67 Item.Item.__init__(self)
69 self.label="Control Links"
71 def getIconName(self):
73 def isExpandable(self):
76 def getChildren(self):
78 for n in self.item.node.edGetDirectDescendants():
79 for p in n.getOutNodes():
80 sublist.append(ControlLinkItem(n,p))
83 def addLink(self,link):
84 CONNECTOR.Emit(self,"add",link)
86 class DataLinksItem(Item.Item):
87 """Item for all data links of a composed node"""
88 def __init__(self,item):
89 Item.Item.__init__(self)
91 self.label="Data Links"
93 def getIconName(self):
95 def isExpandable(self):
98 def getChildren(self):
100 for pout,pin in self.item.node.getSetOfInternalLinks():
101 if pout.getNode().getFather() != self.item.node and pin.getNode().getFather() != self.item.node:
103 if isinstance(pin,pilot_InputDataStreamPort):
104 sublist.append(StreamLinkItem(pin,pout))
106 sublist.append(DataLinkItem(pin,pout))
107 #for pout,pin in self.item.node.getSetOfLinksLeavingCurrentScope():
108 # sublist.append(DataLinkItem(pin,pout))
109 #for pin,pout in self.item.node.getSetOfLinksComingInCurrentScope():
110 # sublist.append(DataLinkItem(pin,pout))
113 def addLink(self,link):
114 CONNECTOR.Emit(self,"add",link)
116 class ItemComposedNode(Item.Item):
117 """Item pour les noeuds composes"""
119 def __init__(self,node):
120 #node is an instance of YACS::ENGINE::ComposedNode
121 Item.Item.__init__(self)
124 self.label=node.getName()
125 self.datalinks=DataLinksItem(self)
126 self.controllinks=ControlLinksItem(self)
128 def isExpandable(self):
131 def getChildren(self):
132 #liste des noeuds fils
133 liste=self.node.edGetDirectDescendants()
134 #On les adapte en item avant de les retourner
138 sublist.append(Item.adapt(n))
141 #traceback.print_exc()
143 sublist.append(self.datalinks)
144 sublist.append(self.controllinks)
147 def dblselected(self):
148 #print "ItemComposedNode dblselected"
149 root=self.node.getRootNode()
150 rootItem=Item.adapt(root)
151 if not self.emitting:
153 CONNECTOR.Emit(rootItem,"dblselected",self)
157 #print "ItemComposedNode selected"
158 root=self.node.getRootNode()
159 rootItem=Item.adapt(root)
160 if not self.emitting:
162 CONNECTOR.Emit(rootItem,"selected",self)
165 def getIconName(self):
168 def panel(self,parent):
169 """Retourne un tab widget pour browser/editer la proc"""
170 tabWidget = QTabWidget( parent )
171 for name,method in self.panels:
172 tabWidget.addTab( method(self,tabWidget), name )
175 def addNode(self,service):
176 print "Composed.addNode",service
177 #add node service in the parent self which is a ComposedNode
178 new_node=service.clone(None)
179 ItemComposedNode.n=ItemComposedNode.n+1
180 name=service.getName()+"_%d" % ItemComposedNode.n
181 new_node.setName(name)
182 self.node.edAddChild(new_node)
183 item=Item.adapt(new_node)
184 CONNECTOR.Emit(self,"add",item)
186 def panel1(self,parent):
188 self.graph=graph.Graph(self,qvbox)
191 def layout(self,rankdir):
193 self.graph.layout(rankdir)
195 panels=[("Panel1",panel1)]
197 def addLink(self,link):
198 print "Composed.addLink",link
199 if isinstance(link,DataLinkItem):
200 self.datalinks.addLink(link)
201 elif isinstance(link,StreamLinkItem):
202 self.datalinks.addLink(link)
204 self.controllinks.addLink(link)
207 class ItemForLoop(ItemComposedNode):
208 def box(self,parent):
209 return panels.PanelForLoop(parent,self)
211 def addNode(self,service):
212 new_node=service.clone(None)
213 ItemComposedNode.n=ItemComposedNode.n+1
214 name=service.getName()+"_%d" % ItemComposedNode.n
215 new_node.setName(name)
216 #replace the old node (if it exists) with the new one
217 nodes=self.node.edGetDirectDescendants()
219 old_item=Item.adapt(nodes[0])
220 CONNECTOR.Emit(old_item,"remove")
221 self.node.edSetNode(new_node)
222 item=Item.adapt(new_node)
223 CONNECTOR.Emit(self,"add",item)
224 CONNECTOR.Emit(self,"changed")
226 class ItemWhile(ItemForLoop):
229 class ItemForEach(ItemForLoop):
232 class ItemSwitch(ItemComposedNode):
233 def addNode(self,service):
236 class ItemProc(ItemComposedNode):
237 """Item pour la procedure"""
238 def connecting(self,item):
239 print "ItemProc.connecting",item
240 self._connecting=item
242 class ItemPort(Item.Item):
243 """Item pour les ports """
245 def __init__(self,port,root=None):
246 Item.Item.__init__(self)
248 self.label=port.getName()
251 elif self.port.getNode().getFather():
252 root=self.port.getNode().getRootNode()
253 self.root=Item.adapt(root)
258 #print "ItemPort selected"
261 if not self.emitting:
263 CONNECTOR.Emit(self.root,"selected",self)
266 def getIconName(self):
269 def panel(self,parent):
270 """Retourne un tab widget pour browser/editer l'item"""
271 tabWidget = QTabWidget( parent )
272 for name,method in self.panels:
273 tabWidget.addTab( method(self,tabWidget), name )
277 def link(self,other):
278 print "ItemPort.link:",self,other
281 print "ItemPort.connect:"
282 self.root.connecting(self)
284 class ItemInPort(ItemPort):
285 def getIconName(self):
288 def panel1(self,parent):
289 return panels.PanelInPort(parent,self)
291 panels=[("Panel1",panel1)]
293 class ItemOutPort(ItemPort):
294 def getIconName(self):
297 def panel1(self,parent):
298 return panels.PanelOutPort(parent,self)
300 panels=[("Panel1",panel1)]
302 def link(self,other):
303 nodeS=self.port.getNode()
304 nodeE=other.port.getNode()
305 father=nodeS.getFather()
306 if father != nodeE.getFather():
307 #not same father : do nothing for the moment
310 #cflink=nodeS.getOutGate().isAlreadyInSet(nodeE.getInGate())
311 cflink= nodeE.getInGate() in nodeS.getOutGate().edSetInGate()
312 father.edAddDFLink(self.port,other.port)
313 l=DataLinkItem(other.port,self.port)
314 fitem=Item.adapt(father)
317 #add also a control flow link
318 fitem.addLink(ControlLinkItem(nodeS,nodeE))
319 except ValueError,ex:
320 traceback.print_exc()
321 QMessageBox.warning(None,"YACS error",str(ex))
324 class ItemInStream(ItemPort):
325 def getIconName(self):
326 return "instream.png"
328 class ItemOutStream(ItemPort):
329 def getIconName(self):
330 return "outstream.png"
332 def link(self,other):
333 father=self.port.getNode().getFather()
334 if father != other.port.getNode().getFather():
335 #not same father : not for the moment
338 father.edAddLink(self.port,other.port)
339 l=StreamLinkItem(other.port,self.port)
340 fitem=Item.adapt(father)
342 except ValueError,ex:
343 traceback.print_exc()
344 QMessageBox.warning(None,"YACS error",str(ex))
347 class ItemInGate(ItemPort):
348 """Item for InGate"""
349 def __init__(self,port):
350 Item.Item.__init__(self)
352 class ItemOutGate(ItemPort):
353 """Item for OutGate"""
354 def __init__(self,port):
355 Item.Item.__init__(self)
358 class ItemNode(Item.Item):
359 """Item pour les noeuds elementaires
362 #attr donnant la liste des panels du noeud (nom,method)
364 def __init__(self,node):
365 Item.Item.__init__(self)
367 self.label=node.getName()
368 self.father=Item.adapt(node.getFather())
371 #print "ItemNode selected"
372 root=self.node.getRootNode()
373 rootItem=Item.adapt(root)
374 if not self.emitting:
376 #for those that have subscribed to item level
377 CONNECTOR.Emit(self,"selected",self)
378 #for those that have subscribed to rootItem level
379 CONNECTOR.Emit(rootItem,"selected",self)
382 def isExpandable(self):
385 def getChildren(self):
387 for n in self.node.getSetOfInputPort():
388 sublist.append(Item.adapt(n))
389 for n in self.node.getSetOfOutputPort():
390 sublist.append(Item.adapt(n))
391 for n in self.node.getSetOfInputDataStreamPort():
392 sublist.append(Item.adapt(n))
393 for n in self.node.getSetOfOutputDataStreamPort():
394 sublist.append(Item.adapt(n))
397 def panel(self,parent):
398 """Retourne un tab widget pour browser/editer l'item"""
399 tabWidget = QTabWidget( parent )
400 for name,method in self.panels:
401 tabWidget.addTab( method(self,tabWidget), name )
405 class ItemScriptNode(ItemNode):
407 def panel1(self,parent):
408 return panels.PanelScript(parent,self)
410 panels=[("Panel1",panel1)]
412 def getIconName(self):
415 class ItemFuncNode(ItemNode):
416 def panel1(self,parent):
417 return panels.PanelFunc(parent,self)
419 panels=[("Panel1",panel1)]
421 def getIconName(self):
424 def FuncChanged(self, newText ):
425 self.myFunc=str(newText)
427 class ItemService(ItemNode):
428 def panel1(self,parent):
429 """Retourne un widget pour browser/editer l'item"""
430 self.myName=self.node.getName()
433 qvbox.layout().setAlignment(Qt.AlignTop|Qt.AlignLeft)
434 qvbox.setSpacing( 5 )
437 label=QLabel("Name: ",row0)
438 self.lined0 = QLineEdit(self.node.getName(),row0)
439 qvbox.connect( self.lined0, SIGNAL("textChanged(const QString &)"), self.NameChanged )
440 qvbox.connect( self.lined0, SIGNAL("returnPressed()"), self.NameReturn )
441 QToolTip.add( self.lined0, "Node name" )
444 label1=QLabel("Ref: ",row1)
445 self.lined1 = QLineEdit(row1)
446 if self.node.getComponent():
447 self.lined1.setText(self.node.getComponent().getName())
449 self.lined1.setText("NO_COMPONENT_NAME")
452 label2=QLabel("Method: ",row2)
453 self.lined2 = QLineEdit(row2)
454 self.lined2.setText(self.node.getMethod())
457 but1=QPushButton( "Save", row3 )
458 but2=QPushButton( "Cancel", row3 )
459 qvbox.connect( but1, SIGNAL("clicked()"), self.handleSave )
460 qvbox.connect( but2, SIGNAL("clicked()"), self.handleCancel )
464 panels=[("Panel1",panel1)]
466 def NameChanged(self, newText ):
467 self.myName=str(newText)
469 def NameReturn(self):
472 def getIconName(self):
473 return "green-square"
475 def handleSave(self):
476 self.node.setRef(str(self.lined1.text()))
477 self.node.setMethod(str(self.lined2.text()))
478 def handleCancel(self):
479 self.lined0.setText(self.node.getName())
480 self.lined1.setText(self.node.getComponent().getName())
481 self.lined2.setText(self.node.getMethod())
483 def adapt_Proc_to_Item(obj, protocol, alternate):
486 def adapt_Node_to_Item(obj, protocol, alternate):
489 def adapt_ComposedNode_to_Item(obj, protocol, alternate):
490 return ItemComposedNode(obj)
492 def adapt_ForLoop_to_Item(obj, protocol, alternate):
493 return ItemForLoop(obj)
495 def adapt_Switch_to_Item(obj, protocol, alternate):
496 return ItemSwitch(obj)
498 def adapt_While_to_Item(obj, protocol, alternate):
499 return ItemWhile(obj)
501 def adapt_ForEach_to_Item(obj, protocol, alternate):
502 return ItemForEach(obj)
504 def adapt_InlineFuncNode_to_Item(obj, protocol, alternate):
505 return ItemFuncNode(obj)
507 def adapt_InlineScriptNode_to_Item(obj, protocol, alternate):
508 return ItemScriptNode(obj)
510 def adapt_ServiceNode_to_Item(obj, protocol, alternate):
511 return ItemService(obj)
513 def adapt_Port_to_Item(obj, protocol, alternate):
516 def adapt_InPort_to_Item(obj, protocol, alternate):
517 return ItemInPort(obj)
519 def adapt_OutPort_to_Item(obj, protocol, alternate):
520 return ItemOutPort(obj)
522 def adapt_InStream_to_Item(obj, protocol, alternate):
523 return ItemInStream(obj)
525 def adapt_OutStream_to_Item(obj, protocol, alternate):
526 return ItemOutStream(obj)
528 def adapt_InGate_to_Item(obj, protocol, alternate):
529 return ItemInGate(obj)
531 def adapt_OutGate_to_Item(obj, protocol, alternate):
532 return ItemOutGate(obj)
534 if hasattr(pilot,"ProcPtr"):
536 adapt.registerAdapterFactory(pilot.ProcPtr, Item.Item, adapt_Proc_to_Item)
537 adapt.registerAdapterFactory(pilot.BlocPtr, Item.Item, adapt_ComposedNode_to_Item)
538 adapt.registerAdapterFactory(pilot.ForLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
539 adapt.registerAdapterFactory(pilot.WhileLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
540 adapt.registerAdapterFactory(pilot.ForEachLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
541 adapt.registerAdapterFactory(pilot.SwitchPtr, Item.Item, adapt_ComposedNode_to_Item)
542 adapt.registerAdapterFactory(pilot.ComposedNodePtr, Item.Item, adapt_ComposedNode_to_Item)
544 adapt.registerAdapterFactory(pilot.ServiceNodePtr, Item.Item, adapt_ServiceNode_to_Item)
545 #adapt.registerAdapterFactory(pilot.ServiceNodeNodePtr, Item.Item, adapt_Node_to_Item)
546 adapt.registerAdapterFactory(pilot.InlineNodePtr, Item.Item, adapt_InlineScriptNode_to_Item)
547 adapt.registerAdapterFactory(pilot.InlineFuncNodePtr, Item.Item, adapt_InlineFuncNode_to_Item)
548 adapt.registerAdapterFactory(pilot.NodePtr, Item.Item, adapt_Node_to_Item)
550 adapt.registerAdapterFactory(pilot.OutputPortPtr, Item.Item, adapt_OutPort_to_Item)
551 adapt.registerAdapterFactory(pilot.InputPortPtr, Item.Item, adapt_InPort_to_Item)
552 adapt.registerAdapterFactory(pilot.OutputDataStreamPortPtr, Item.Item, adapt_OutStream_to_Item)
553 adapt.registerAdapterFactory(pilot.InputDataStreamPortPtr, Item.Item, adapt_InStream_to_Item)
555 pilot_InputDataStreamPort=pilot.InputDataStreamPortPtr
559 adapt.registerAdapterFactory(pilot.Proc, Item.Item, adapt_Proc_to_Item)
560 adapt.registerAdapterFactory(SALOMERuntime.SalomeProc, Item.Item, adapt_Proc_to_Item)
561 adapt.registerAdapterFactory(pilot.Bloc, Item.Item, adapt_ComposedNode_to_Item)
562 adapt.registerAdapterFactory(pilot.ForLoop, Item.Item, adapt_ForLoop_to_Item)
564 adapt.registerAdapterFactory(pilot.WhileLoop, Item.Item, adapt_While_to_Item)
565 adapt.registerAdapterFactory(pilot.ForEachLoop, Item.Item, adapt_ForEach_to_Item)
566 adapt.registerAdapterFactory(pilot.Switch, Item.Item, adapt_Switch_to_Item)
567 adapt.registerAdapterFactory(pilot.ComposedNode, Item.Item, adapt_ComposedNode_to_Item)
569 adapt.registerAdapterFactory(pilot.ServiceNode, Item.Item, adapt_ServiceNode_to_Item)
570 adapt.registerAdapterFactory(SALOMERuntime.CORBANode, Item.Item, adapt_ServiceNode_to_Item)
571 adapt.registerAdapterFactory(SALOMERuntime.SalomeNode, Item.Item, adapt_ServiceNode_to_Item)
572 #adapt.registerAdapterFactory(pilot.ServiceNodeNode, Item.Item, adapt_Node_to_Item)
573 adapt.registerAdapterFactory(pilot.InlineNode, Item.Item, adapt_InlineScriptNode_to_Item)
574 adapt.registerAdapterFactory(SALOMERuntime.PythonNode, Item.Item, adapt_InlineScriptNode_to_Item)
575 adapt.registerAdapterFactory(pilot.InlineFuncNode, Item.Item, adapt_InlineFuncNode_to_Item)
576 adapt.registerAdapterFactory(SALOMERuntime.PyFuncNode, Item.Item, adapt_InlineFuncNode_to_Item)
577 adapt.registerAdapterFactory(pilot.Node, Item.Item, adapt_Node_to_Item)
579 adapt.registerAdapterFactory(pilot.OutputPort, Item.Item, adapt_OutPort_to_Item)
580 adapt.registerAdapterFactory(SALOMERuntime.OutputPyPort, Item.Item, adapt_OutPort_to_Item)
581 adapt.registerAdapterFactory(SALOMERuntime.OutputCorbaPort, Item.Item, adapt_OutPort_to_Item)
582 adapt.registerAdapterFactory(pilot.InputPort, Item.Item, adapt_InPort_to_Item)
583 adapt.registerAdapterFactory(SALOMERuntime.InputPyPort, Item.Item, adapt_InPort_to_Item)
584 adapt.registerAdapterFactory(SALOMERuntime.InputCorbaPort, Item.Item, adapt_InPort_to_Item)
585 adapt.registerAdapterFactory(pilot.OutputDataStreamPort, Item.Item, adapt_OutStream_to_Item)
586 adapt.registerAdapterFactory(pilot.InputDataStreamPort, Item.Item, adapt_InStream_to_Item)
587 adapt.registerAdapterFactory(pilot.OutGate, Item.Item, adapt_OutGate_to_Item)
588 adapt.registerAdapterFactory(pilot.InGate, Item.Item, adapt_InGate_to_Item)
590 pilot_InputDataStreamPort=pilot.InputDataStreamPort