Salome HOME
merge from branch DEV tag mergeto_trunk_04apr08
[modules/yacs.git] / src / pyqt / gui / Items.py
1 import sys
2 import pilot
3 import SALOMERuntime
4 import Item
5 import adapt
6 from qt import *
7 from qtcanvas import *
8 import Editor
9 import CItems
10 import pygraphviz
11 import traceback
12 import CONNECTOR
13 import graph
14 import panels
15
16 class DataLinkItem(Item.Item):
17   def __init__(self,pin,pout):
18     Item.Item.__init__(self)
19     self.pin=pin
20     self.pout=pout
21     self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
22
23   def getIconName(self):
24     return "datalink.png"
25
26 class StreamLinkItem(Item.Item):
27   def __init__(self,pin,pout):
28     Item.Item.__init__(self)
29     self.pin=pin
30     self.pout=pout
31     self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
32
33   def getIconName(self):
34     return "streamlink.png"
35
36 class ControlLinkItem(Item.Item):
37   def __init__(self,nodeup,nodedown):
38     Item.Item.__init__(self)
39     self.nodedown=nodedown
40     self.nodeup=nodeup
41     self.label= nodeup.getName()+"->"+nodedown.getName()
42
43   def getIconName(self):
44     return "controllink.png"
45
46 class ControlLinksItem(Item.Item):
47   """Item for all control links of a composed node"""
48   def __init__(self,item):
49     Item.Item.__init__(self)
50     self.item=item
51     self.label="Control Links"
52
53   def getIconName(self):
54     return "folder"
55   def isExpandable(self):
56     return True
57
58   def getChildren(self):
59     sublist=[]
60     for n in self.item.node.edGetDirectDescendants():
61       for p in n.getOutNodes():
62         sublist.append(ControlLinkItem(n,p))
63     return sublist
64
65   def addLink(self,link):
66     CONNECTOR.Emit(self,"add",link)
67
68 class DataLinksItem(Item.Item):
69   """Item for all data links of a composed node"""
70   def __init__(self,item):
71     Item.Item.__init__(self)
72     self.item=item
73     self.label="Data Links"
74
75   def getIconName(self):
76     return "folder"
77   def isExpandable(self):
78     return True
79
80   def getChildren(self):
81     sublist=[]
82     for pout,pin in self.item.node.getSetOfInternalLinks():
83       if pout.getNode().getFather() != self.item.node and pin.getNode().getFather() != self.item.node:
84         continue
85       if isinstance(pin,pilot_InputDataStreamPort):
86         sublist.append(StreamLinkItem(pin,pout))
87       else:
88         sublist.append(DataLinkItem(pin,pout))
89     #for pout,pin in self.item.node.getSetOfLinksLeavingCurrentScope():
90     #  sublist.append(DataLinkItem(pin,pout))
91     #for pin,pout in self.item.node.getSetOfLinksComingInCurrentScope():
92     #  sublist.append(DataLinkItem(pin,pout))
93     return sublist
94
95   def addLink(self,link):
96     CONNECTOR.Emit(self,"add",link)
97
98 class ItemComposedNode(Item.Item):
99   """Item pour les noeuds composes"""
100   n=0
101   def __init__(self,node):
102     #node is an instance of YACS::ENGINE::ComposedNode
103     Item.Item.__init__(self)
104     self.node=node
105     self.graph=None
106     self.label=node.getName()
107     self.datalinks=DataLinksItem(self)
108     self.controllinks=ControlLinksItem(self)
109
110   def isExpandable(self):
111     return True
112
113   def getChildren(self):
114     #liste des noeuds fils
115     liste=self.node.edGetDirectDescendants()
116     #On les adapte en item avant de les retourner
117     sublist=[]
118     for n in liste:
119       try:
120         sublist.append(Item.adapt(n))
121       except:
122         #print n
123         #traceback.print_exc()
124         raise
125     sublist.append(self.datalinks)
126     sublist.append(self.controllinks)
127     return sublist
128
129   def dblselected(self):
130     #print "ItemComposedNode dblselected"
131     root=self.node.getRootNode()
132     rootItem=Item.adapt(root)
133     if not self.emitting:
134       self.emitting=1
135       CONNECTOR.Emit(rootItem,"dblselected",self)
136       self.emitting=0
137
138   def selected(self):
139     #print "ItemComposedNode selected"
140     root=self.node.getRootNode()
141     rootItem=Item.adapt(root)
142     if not self.emitting:
143       self.emitting=1
144       CONNECTOR.Emit(rootItem,"selected",self)
145       self.emitting=0
146
147   def getIconName(self):
148     return "green-los"
149
150   def panel(self,parent):
151     """Retourne un tab widget pour browser/editer la proc"""
152     tabWidget = QTabWidget( parent )
153     for name,method in self.panels:
154       tabWidget.addTab( method(self,tabWidget), name )
155     return tabWidget
156
157   def addNode(self,service):
158     print "Composed.addNode",service
159     #add node service in the parent self which is a ComposedNode
160     new_node=service.clone(None)
161     ItemComposedNode.n=ItemComposedNode.n+1
162     name=service.getName()+"_%d" % ItemComposedNode.n
163     new_node.setName(name)
164     self.node.edAddChild(new_node)
165     item=Item.adapt(new_node)
166     CONNECTOR.Emit(self,"add",item)
167
168   def panel1(self,parent):
169     qvbox=QVBox(parent)
170     self.graph=graph.Graph(self,qvbox)
171     return qvbox
172
173   def layout(self,rankdir):
174     if self.graph:
175       self.graph.layout(rankdir)
176
177   panels=[("Panel1",panel1)]
178
179   def addLink(self,link):
180     print "Composed.addLink",link
181     if isinstance(link,DataLinkItem):
182       self.datalinks.addLink(link)
183     elif isinstance(link,StreamLinkItem):
184       self.datalinks.addLink(link)
185     else:
186       self.controllinks.addLink(link)
187
188
189 class ItemForLoop(ItemComposedNode):
190   def box(self,parent):
191     return panels.PanelForLoop(parent,self)
192
193   def addNode(self,service):
194     new_node=service.clone(None)
195     ItemComposedNode.n=ItemComposedNode.n+1
196     name=service.getName()+"_%d" % ItemComposedNode.n
197     new_node.setName(name)
198     #replace the old node (if it exists) with the new one
199     nodes=self.node.edGetDirectDescendants()
200     if nodes:
201       old_item=Item.adapt(nodes[0])
202       CONNECTOR.Emit(old_item,"remove")
203     self.node.edSetNode(new_node)
204     item=Item.adapt(new_node)
205     CONNECTOR.Emit(self,"add",item)
206     CONNECTOR.Emit(self,"changed")
207
208 class ItemWhile(ItemForLoop):
209   pass
210
211 class ItemForEach(ItemForLoop):
212   pass
213
214 class ItemSwitch(ItemComposedNode):
215   def addNode(self,service):
216     return
217
218 class ItemProc(ItemComposedNode):
219   """Item pour la procedure"""
220   def connecting(self,item):
221     print "ItemProc.connecting",item
222     self._connecting=item
223
224 class ItemPort(Item.Item):
225   """Item pour les ports """
226   panels=[]
227   def __init__(self,port,root=None):
228     Item.Item.__init__(self)
229     self.port=port
230     self.label=port.getName()
231     if root:
232       self.root=root
233     elif self.port.getNode().getFather():
234       root=self.port.getNode().getRootNode()
235       self.root=Item.adapt(root)
236     else:
237       self.root=None
238
239   def selected(self):
240     #print "ItemPort selected"
241     if not self.root:
242       return
243     if not self.emitting:
244       self.emitting=1
245       CONNECTOR.Emit(self.root,"selected",self)
246       self.emitting=0
247
248   def getIconName(self):
249     return "port.png"
250
251   def panel(self,parent):
252     """Retourne un tab widget pour browser/editer l'item"""
253     tabWidget = QTabWidget( parent )
254     for name,method in self.panels:
255       tabWidget.addTab( method(self,tabWidget), name )
256     return tabWidget
257   box=panel
258
259   def link(self,other):
260     print "ItemPort.link:",self,other
261
262   def connect(self):
263     print "ItemPort.connect:"
264     self.root.connecting(self)
265
266 class ItemInPort(ItemPort):
267   def getIconName(self):
268     return "inport.png"
269
270   def panel1(self,parent):
271     return panels.PanelInPort(parent,self)
272
273   panels=[("Panel1",panel1)]
274
275 class ItemOutPort(ItemPort):
276   def getIconName(self):
277     return "outport.png"
278
279   def panel1(self,parent):
280     return panels.PanelOutPort(parent,self)
281
282   panels=[("Panel1",panel1)]
283
284   def link(self,other):
285     nodeS=self.port.getNode()
286     nodeE=other.port.getNode()
287     father=nodeS.getFather()
288     if father != nodeE.getFather():
289       #not same father : do nothing for the moment
290       return
291     try:
292       #cflink=nodeS.getOutGate().isAlreadyInSet(nodeE.getInGate())
293       cflink= nodeE.getInGate() in nodeS.getOutGate().edSetInGate()
294       father.edAddDFLink(self.port,other.port)
295       l=DataLinkItem(other.port,self.port)
296       fitem=Item.adapt(father)
297       fitem.addLink(l)
298       if not cflink:
299         #add also a control flow link
300         fitem.addLink(ControlLinkItem(nodeS,nodeE))
301     except ValueError,ex:
302       traceback.print_exc()
303       QMessageBox.warning(None,"YACS error",str(ex))
304       return
305
306 class ItemInStream(ItemPort):
307   def getIconName(self):
308     return "instream.png"
309
310 class ItemOutStream(ItemPort):
311   def getIconName(self):
312     return "outstream.png"
313
314   def link(self,other):
315     father=self.port.getNode().getFather()
316     if father != other.port.getNode().getFather():
317       #not same father : not for the moment
318       return
319     try:
320       father.edAddLink(self.port,other.port)
321       l=StreamLinkItem(other.port,self.port)
322       fitem=Item.adapt(father)
323       fitem.addLink(l)
324     except ValueError,ex:
325       traceback.print_exc()
326       QMessageBox.warning(None,"YACS error",str(ex))
327       return
328
329 class ItemInGate(ItemPort):
330   """Item for InGate"""
331   def __init__(self,port):
332     Item.Item.__init__(self)
333     self.port=port
334 class ItemOutGate(ItemPort):
335   """Item for OutGate"""
336   def __init__(self,port):
337     Item.Item.__init__(self)
338     self.port=port
339
340 class ItemNode(Item.Item):
341   """Item pour les noeuds elementaires
342      Il n a pas de fils
343   """
344   #attr donnant la liste des panels du noeud (nom,method)
345   panels=[]
346   def __init__(self,node):
347     Item.Item.__init__(self)
348     self.node=node
349     self.label=node.getName()
350     self.father=Item.adapt(node.getFather())
351
352   def selected(self):
353     #print "ItemNode selected"
354     root=self.node.getRootNode()
355     rootItem=Item.adapt(root)
356     if not self.emitting:
357       self.emitting=1
358       #for those that have subscribed to item level
359       CONNECTOR.Emit(self,"selected",self)
360       #for those that have subscribed to rootItem level
361       CONNECTOR.Emit(rootItem,"selected",self)
362       self.emitting=0
363
364   def isExpandable(self):
365     return True
366
367   def getChildren(self):
368     sublist=[]
369     for n in self.node.getSetOfInputPort():
370       sublist.append(Item.adapt(n))
371     for n in self.node.getSetOfOutputPort():
372       sublist.append(Item.adapt(n))
373     for n in self.node.getSetOfInputDataStreamPort():
374       sublist.append(Item.adapt(n))
375     for n in self.node.getSetOfOutputDataStreamPort():
376       sublist.append(Item.adapt(n))
377     return sublist
378
379   def panel(self,parent):
380     """Retourne un tab widget pour browser/editer l'item"""
381     tabWidget = QTabWidget( parent )
382     for name,method in self.panels:
383       tabWidget.addTab( method(self,tabWidget), name )
384     return tabWidget
385   box=panel
386
387 class ItemScriptNode(ItemNode):
388
389   def panel1(self,parent):
390     return panels.PanelScript(parent,self)
391
392   panels=[("Panel1",panel1)]
393
394   def getIconName(self):
395     return "green-ball"
396
397 class ItemFuncNode(ItemNode):
398   def panel1(self,parent):
399     return panels.PanelFunc(parent,self)
400
401   panels=[("Panel1",panel1)]
402
403   def getIconName(self):
404     return "green-ball"
405
406   def FuncChanged(self, newText ):
407     self.myFunc=str(newText)
408
409 class ItemService(ItemNode):
410   def panel1(self,parent):
411     """Retourne un widget pour browser/editer l'item"""
412     self.myName=self.node.getName()
413
414     qvbox=QVBox(parent)
415     qvbox.layout().setAlignment(Qt.AlignTop|Qt.AlignLeft)
416     qvbox.setSpacing( 5 )
417
418     row0=QHBox(qvbox)
419     label=QLabel("Name: ",row0)
420     self.lined0 = QLineEdit(self.node.getName(),row0)
421     qvbox.connect( self.lined0, SIGNAL("textChanged(const QString &)"), self.NameChanged )
422     qvbox.connect( self.lined0, SIGNAL("returnPressed()"), self.NameReturn )
423     QToolTip.add( self.lined0, "Node name" )
424
425     row1=QHBox(qvbox)
426     label1=QLabel("Ref: ",row1)
427     self.lined1 = QLineEdit(row1)
428     if self.node.getComponent():
429       self.lined1.setText(self.node.getComponent().getName())
430     else:
431       self.lined1.setText("NO_COMPONENT_NAME")
432
433     row2=QHBox(qvbox)
434     label2=QLabel("Method: ",row2)
435     self.lined2 = QLineEdit(row2)
436     self.lined2.setText(self.node.getMethod())
437
438     row3=QHBox(qvbox)
439     but1=QPushButton( "Save", row3 )
440     but2=QPushButton( "Cancel", row3 )
441     qvbox.connect( but1, SIGNAL("clicked()"), self.handleSave )
442     qvbox.connect( but2, SIGNAL("clicked()"), self.handleCancel )
443
444     return qvbox
445
446   panels=[("Panel1",panel1)]
447
448   def NameChanged(self, newText ):
449     self.myName=str(newText)
450
451   def NameReturn(self):
452     pass
453
454   def getIconName(self):
455     return "green-square"
456
457   def handleSave(self):
458     self.node.setRef(str(self.lined1.text()))
459     self.node.setMethod(str(self.lined2.text()))
460   def handleCancel(self):
461     self.lined0.setText(self.node.getName())
462     self.lined1.setText(self.node.getComponent().getName())
463     self.lined2.setText(self.node.getMethod())
464
465 def adapt_Proc_to_Item(obj, protocol, alternate):
466   return ItemProc(obj)
467
468 def adapt_Node_to_Item(obj, protocol, alternate):
469   return ItemNode(obj)
470
471 def adapt_ComposedNode_to_Item(obj, protocol, alternate):
472   return ItemComposedNode(obj)
473
474 def adapt_ForLoop_to_Item(obj, protocol, alternate):
475   return ItemForLoop(obj)
476
477 def adapt_Switch_to_Item(obj, protocol, alternate):
478   return ItemSwitch(obj)
479
480 def adapt_While_to_Item(obj, protocol, alternate):
481   return ItemWhile(obj)
482
483 def adapt_ForEach_to_Item(obj, protocol, alternate):
484   return ItemForEach(obj)
485
486 def adapt_InlineFuncNode_to_Item(obj, protocol, alternate):
487   return ItemFuncNode(obj)
488
489 def adapt_InlineScriptNode_to_Item(obj, protocol, alternate):
490   return ItemScriptNode(obj)
491
492 def adapt_ServiceNode_to_Item(obj, protocol, alternate):
493   return ItemService(obj)
494
495 def adapt_Port_to_Item(obj, protocol, alternate):
496   return ItemPort(obj)
497
498 def adapt_InPort_to_Item(obj, protocol, alternate):
499   return ItemInPort(obj)
500
501 def adapt_OutPort_to_Item(obj, protocol, alternate):
502   return ItemOutPort(obj)
503
504 def adapt_InStream_to_Item(obj, protocol, alternate):
505   return ItemInStream(obj)
506
507 def adapt_OutStream_to_Item(obj, protocol, alternate):
508   return ItemOutStream(obj)
509
510 def adapt_InGate_to_Item(obj, protocol, alternate):
511   return ItemInGate(obj)
512
513 def adapt_OutGate_to_Item(obj, protocol, alternate):
514   return ItemOutGate(obj)
515
516 if hasattr(pilot,"ProcPtr"):
517   #SWIG 1.3.24
518   adapt.registerAdapterFactory(pilot.ProcPtr, Item.Item, adapt_Proc_to_Item)
519   adapt.registerAdapterFactory(pilot.BlocPtr, Item.Item, adapt_ComposedNode_to_Item)
520   adapt.registerAdapterFactory(pilot.ForLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
521   adapt.registerAdapterFactory(pilot.WhileLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
522   adapt.registerAdapterFactory(pilot.ForEachLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
523   adapt.registerAdapterFactory(pilot.SwitchPtr, Item.Item, adapt_ComposedNode_to_Item)
524   adapt.registerAdapterFactory(pilot.ComposedNodePtr, Item.Item, adapt_ComposedNode_to_Item)
525
526   adapt.registerAdapterFactory(pilot.ServiceNodePtr, Item.Item, adapt_ServiceNode_to_Item)
527   #adapt.registerAdapterFactory(pilot.ServiceNodeNodePtr, Item.Item, adapt_Node_to_Item)
528   adapt.registerAdapterFactory(pilot.InlineNodePtr, Item.Item, adapt_InlineScriptNode_to_Item)
529   adapt.registerAdapterFactory(pilot.InlineFuncNodePtr, Item.Item, adapt_InlineFuncNode_to_Item)
530   adapt.registerAdapterFactory(pilot.NodePtr, Item.Item, adapt_Node_to_Item)
531
532   adapt.registerAdapterFactory(pilot.OutputPortPtr, Item.Item, adapt_OutPort_to_Item)
533   adapt.registerAdapterFactory(pilot.InputPortPtr, Item.Item, adapt_InPort_to_Item)
534   adapt.registerAdapterFactory(pilot.OutputDataStreamPortPtr, Item.Item, adapt_OutStream_to_Item)
535   adapt.registerAdapterFactory(pilot.InputDataStreamPortPtr, Item.Item, adapt_InStream_to_Item)
536
537   pilot_InputDataStreamPort=pilot.InputDataStreamPortPtr
538
539 else:
540   #SWIG 1.3.29
541   adapt.registerAdapterFactory(pilot.Proc, Item.Item, adapt_Proc_to_Item)
542   adapt.registerAdapterFactory(SALOMERuntime.SalomeProc, Item.Item, adapt_Proc_to_Item)
543   adapt.registerAdapterFactory(pilot.Bloc, Item.Item, adapt_ComposedNode_to_Item)
544   adapt.registerAdapterFactory(pilot.ForLoop, Item.Item, adapt_ForLoop_to_Item)
545
546   adapt.registerAdapterFactory(pilot.WhileLoop, Item.Item, adapt_While_to_Item)
547   adapt.registerAdapterFactory(pilot.ForEachLoop, Item.Item, adapt_ForEach_to_Item)
548   adapt.registerAdapterFactory(pilot.Switch, Item.Item, adapt_Switch_to_Item)
549   adapt.registerAdapterFactory(pilot.ComposedNode, Item.Item, adapt_ComposedNode_to_Item)
550
551   adapt.registerAdapterFactory(pilot.ServiceNode, Item.Item, adapt_ServiceNode_to_Item)
552   adapt.registerAdapterFactory(SALOMERuntime.CORBANode, Item.Item, adapt_ServiceNode_to_Item)
553   adapt.registerAdapterFactory(SALOMERuntime.SalomeNode, Item.Item, adapt_ServiceNode_to_Item)
554   #adapt.registerAdapterFactory(pilot.ServiceNodeNode, Item.Item, adapt_Node_to_Item)
555   adapt.registerAdapterFactory(pilot.InlineNode, Item.Item, adapt_InlineScriptNode_to_Item)
556   adapt.registerAdapterFactory(SALOMERuntime.PythonNode, Item.Item, adapt_InlineScriptNode_to_Item)
557   adapt.registerAdapterFactory(pilot.InlineFuncNode, Item.Item, adapt_InlineFuncNode_to_Item)
558   adapt.registerAdapterFactory(SALOMERuntime.PyFuncNode, Item.Item, adapt_InlineFuncNode_to_Item)
559   adapt.registerAdapterFactory(pilot.Node, Item.Item, adapt_Node_to_Item)
560
561   adapt.registerAdapterFactory(pilot.OutputPort, Item.Item, adapt_OutPort_to_Item)
562   adapt.registerAdapterFactory(SALOMERuntime.OutputPyPort, Item.Item, adapt_OutPort_to_Item)
563   adapt.registerAdapterFactory(SALOMERuntime.OutputCorbaPort, Item.Item, adapt_OutPort_to_Item)
564   adapt.registerAdapterFactory(pilot.InputPort, Item.Item, adapt_InPort_to_Item)
565   adapt.registerAdapterFactory(SALOMERuntime.InputPyPort, Item.Item, adapt_InPort_to_Item)
566   adapt.registerAdapterFactory(SALOMERuntime.InputCorbaPort, Item.Item, adapt_InPort_to_Item)
567   adapt.registerAdapterFactory(pilot.OutputDataStreamPort, Item.Item, adapt_OutStream_to_Item)
568   adapt.registerAdapterFactory(pilot.InputDataStreamPort, Item.Item, adapt_InStream_to_Item)
569   adapt.registerAdapterFactory(pilot.OutGate, Item.Item, adapt_OutGate_to_Item)
570   adapt.registerAdapterFactory(pilot.InGate, Item.Item, adapt_InGate_to_Item)
571
572   pilot_InputDataStreamPort=pilot.InputDataStreamPort