]> SALOME platform Git repositories - modules/yacs.git/blob - src/pyqt/gui/Items.py
Salome HOME
mergefrom branch BR_V511_PR tag mergeto_trunk_03feb09
[modules/yacs.git] / src / pyqt / gui / Items.py
1 #  Copyright (C) 2006-2008  CEA/DEN, EDF R&D
2 #
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.
7 #
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.
12 #
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
16 #
17 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 #
19 import sys
20 import pilot
21 import SALOMERuntime
22 import Item
23 import adapt
24 from qt import *
25 from qtcanvas import *
26 import Editor
27 import CItems
28 import pygraphviz
29 import traceback
30 import CONNECTOR
31 import graph
32 import panels
33
34 class DataLinkItem(Item.Item):
35   def __init__(self,pin,pout):
36     Item.Item.__init__(self)
37     self.pin=pin
38     self.pout=pout
39     self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
40
41   def getIconName(self):
42     return "datalink.png"
43
44 class StreamLinkItem(Item.Item):
45   def __init__(self,pin,pout):
46     Item.Item.__init__(self)
47     self.pin=pin
48     self.pout=pout
49     self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
50
51   def getIconName(self):
52     return "streamlink.png"
53
54 class ControlLinkItem(Item.Item):
55   def __init__(self,nodeup,nodedown):
56     Item.Item.__init__(self)
57     self.nodedown=nodedown
58     self.nodeup=nodeup
59     self.label= nodeup.getName()+"->"+nodedown.getName()
60
61   def getIconName(self):
62     return "controllink.png"
63
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)
68     self.item=item
69     self.label="Control Links"
70
71   def getIconName(self):
72     return "folder"
73   def isExpandable(self):
74     return True
75
76   def getChildren(self):
77     sublist=[]
78     for n in self.item.node.edGetDirectDescendants():
79       for p in n.getOutNodes():
80         sublist.append(ControlLinkItem(n,p))
81     return sublist
82
83   def addLink(self,link):
84     CONNECTOR.Emit(self,"add",link)
85
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)
90     self.item=item
91     self.label="Data Links"
92
93   def getIconName(self):
94     return "folder"
95   def isExpandable(self):
96     return True
97
98   def getChildren(self):
99     sublist=[]
100     for pout,pin in self.item.node.getSetOfInternalLinks():
101       if pout.getNode().getFather() != self.item.node and pin.getNode().getFather() != self.item.node:
102         continue
103       if isinstance(pin,pilot_InputDataStreamPort):
104         sublist.append(StreamLinkItem(pin,pout))
105       else:
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))
111     return sublist
112
113   def addLink(self,link):
114     CONNECTOR.Emit(self,"add",link)
115
116 class ItemComposedNode(Item.Item):
117   """Item pour les noeuds composes"""
118   n=0
119   def __init__(self,node):
120     #node is an instance of YACS::ENGINE::ComposedNode
121     Item.Item.__init__(self)
122     self.node=node
123     self.graph=None
124     self.label=node.getName()
125     self.datalinks=DataLinksItem(self)
126     self.controllinks=ControlLinksItem(self)
127
128   def isExpandable(self):
129     return True
130
131   def getChildren(self):
132     #liste des noeuds fils
133     liste=self.node.edGetDirectDescendants()
134     #On les adapte en item avant de les retourner
135     sublist=[]
136     for n in liste:
137       try:
138         sublist.append(Item.adapt(n))
139       except:
140         #print n
141         #traceback.print_exc()
142         raise
143     sublist.append(self.datalinks)
144     sublist.append(self.controllinks)
145     return sublist
146
147   def dblselected(self):
148     #print "ItemComposedNode dblselected"
149     root=self.node.getRootNode()
150     rootItem=Item.adapt(root)
151     if not self.emitting:
152       self.emitting=1
153       CONNECTOR.Emit(rootItem,"dblselected",self)
154       self.emitting=0
155
156   def selected(self):
157     #print "ItemComposedNode selected"
158     root=self.node.getRootNode()
159     rootItem=Item.adapt(root)
160     if not self.emitting:
161       self.emitting=1
162       CONNECTOR.Emit(rootItem,"selected",self)
163       self.emitting=0
164
165   def getIconName(self):
166     return "green-los"
167
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 )
173     return tabWidget
174
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)
185
186   def panel1(self,parent):
187     qvbox=QVBox(parent)
188     self.graph=graph.Graph(self,qvbox)
189     return qvbox
190
191   def layout(self,rankdir):
192     if self.graph:
193       self.graph.layout(rankdir)
194
195   panels=[("Panel1",panel1)]
196
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)
203     else:
204       self.controllinks.addLink(link)
205
206
207 class ItemForLoop(ItemComposedNode):
208   def box(self,parent):
209     return panels.PanelForLoop(parent,self)
210
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()
218     if nodes:
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")
225
226 class ItemWhile(ItemForLoop):
227   pass
228
229 class ItemForEach(ItemForLoop):
230   pass
231
232 class ItemSwitch(ItemComposedNode):
233   def addNode(self,service):
234     return
235
236 class ItemProc(ItemComposedNode):
237   """Item pour la procedure"""
238   def connecting(self,item):
239     print "ItemProc.connecting",item
240     self._connecting=item
241
242 class ItemPort(Item.Item):
243   """Item pour les ports """
244   panels=[]
245   def __init__(self,port,root=None):
246     Item.Item.__init__(self)
247     self.port=port
248     self.label=port.getName()
249     if root:
250       self.root=root
251     elif self.port.getNode().getFather():
252       root=self.port.getNode().getRootNode()
253       self.root=Item.adapt(root)
254     else:
255       self.root=None
256
257   def selected(self):
258     #print "ItemPort selected"
259     if not self.root:
260       return
261     if not self.emitting:
262       self.emitting=1
263       CONNECTOR.Emit(self.root,"selected",self)
264       self.emitting=0
265
266   def getIconName(self):
267     return "port.png"
268
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 )
274     return tabWidget
275   box=panel
276
277   def link(self,other):
278     print "ItemPort.link:",self,other
279
280   def connect(self):
281     print "ItemPort.connect:"
282     self.root.connecting(self)
283
284 class ItemInPort(ItemPort):
285   def getIconName(self):
286     return "inport.png"
287
288   def panel1(self,parent):
289     return panels.PanelInPort(parent,self)
290
291   panels=[("Panel1",panel1)]
292
293 class ItemOutPort(ItemPort):
294   def getIconName(self):
295     return "outport.png"
296
297   def panel1(self,parent):
298     return panels.PanelOutPort(parent,self)
299
300   panels=[("Panel1",panel1)]
301
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
308       return
309     try:
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)
315       fitem.addLink(l)
316       if not cflink:
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))
322       return
323
324 class ItemInStream(ItemPort):
325   def getIconName(self):
326     return "instream.png"
327
328 class ItemOutStream(ItemPort):
329   def getIconName(self):
330     return "outstream.png"
331
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
336       return
337     try:
338       father.edAddLink(self.port,other.port)
339       l=StreamLinkItem(other.port,self.port)
340       fitem=Item.adapt(father)
341       fitem.addLink(l)
342     except ValueError,ex:
343       traceback.print_exc()
344       QMessageBox.warning(None,"YACS error",str(ex))
345       return
346
347 class ItemInGate(ItemPort):
348   """Item for InGate"""
349   def __init__(self,port):
350     Item.Item.__init__(self)
351     self.port=port
352 class ItemOutGate(ItemPort):
353   """Item for OutGate"""
354   def __init__(self,port):
355     Item.Item.__init__(self)
356     self.port=port
357
358 class ItemNode(Item.Item):
359   """Item pour les noeuds elementaires
360      Il n a pas de fils
361   """
362   #attr donnant la liste des panels du noeud (nom,method)
363   panels=[]
364   def __init__(self,node):
365     Item.Item.__init__(self)
366     self.node=node
367     self.label=node.getName()
368     self.father=Item.adapt(node.getFather())
369
370   def selected(self):
371     #print "ItemNode selected"
372     root=self.node.getRootNode()
373     rootItem=Item.adapt(root)
374     if not self.emitting:
375       self.emitting=1
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)
380       self.emitting=0
381
382   def isExpandable(self):
383     return True
384
385   def getChildren(self):
386     sublist=[]
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))
395     return sublist
396
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 )
402     return tabWidget
403   box=panel
404
405 class ItemScriptNode(ItemNode):
406
407   def panel1(self,parent):
408     return panels.PanelScript(parent,self)
409
410   panels=[("Panel1",panel1)]
411
412   def getIconName(self):
413     return "green-ball"
414
415 class ItemFuncNode(ItemNode):
416   def panel1(self,parent):
417     return panels.PanelFunc(parent,self)
418
419   panels=[("Panel1",panel1)]
420
421   def getIconName(self):
422     return "green-ball"
423
424   def FuncChanged(self, newText ):
425     self.myFunc=str(newText)
426
427 class ItemService(ItemNode):
428   def panel1(self,parent):
429     """Retourne un widget pour browser/editer l'item"""
430     self.myName=self.node.getName()
431
432     qvbox=QVBox(parent)
433     qvbox.layout().setAlignment(Qt.AlignTop|Qt.AlignLeft)
434     qvbox.setSpacing( 5 )
435
436     row0=QHBox(qvbox)
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" )
442
443     row1=QHBox(qvbox)
444     label1=QLabel("Ref: ",row1)
445     self.lined1 = QLineEdit(row1)
446     if self.node.getComponent():
447       self.lined1.setText(self.node.getComponent().getName())
448     else:
449       self.lined1.setText("NO_COMPONENT_NAME")
450
451     row2=QHBox(qvbox)
452     label2=QLabel("Method: ",row2)
453     self.lined2 = QLineEdit(row2)
454     self.lined2.setText(self.node.getMethod())
455
456     row3=QHBox(qvbox)
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 )
461
462     return qvbox
463
464   panels=[("Panel1",panel1)]
465
466   def NameChanged(self, newText ):
467     self.myName=str(newText)
468
469   def NameReturn(self):
470     pass
471
472   def getIconName(self):
473     return "green-square"
474
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())
482
483 def adapt_Proc_to_Item(obj, protocol, alternate):
484   return ItemProc(obj)
485
486 def adapt_Node_to_Item(obj, protocol, alternate):
487   return ItemNode(obj)
488
489 def adapt_ComposedNode_to_Item(obj, protocol, alternate):
490   return ItemComposedNode(obj)
491
492 def adapt_ForLoop_to_Item(obj, protocol, alternate):
493   return ItemForLoop(obj)
494
495 def adapt_Switch_to_Item(obj, protocol, alternate):
496   return ItemSwitch(obj)
497
498 def adapt_While_to_Item(obj, protocol, alternate):
499   return ItemWhile(obj)
500
501 def adapt_ForEach_to_Item(obj, protocol, alternate):
502   return ItemForEach(obj)
503
504 def adapt_InlineFuncNode_to_Item(obj, protocol, alternate):
505   return ItemFuncNode(obj)
506
507 def adapt_InlineScriptNode_to_Item(obj, protocol, alternate):
508   return ItemScriptNode(obj)
509
510 def adapt_ServiceNode_to_Item(obj, protocol, alternate):
511   return ItemService(obj)
512
513 def adapt_Port_to_Item(obj, protocol, alternate):
514   return ItemPort(obj)
515
516 def adapt_InPort_to_Item(obj, protocol, alternate):
517   return ItemInPort(obj)
518
519 def adapt_OutPort_to_Item(obj, protocol, alternate):
520   return ItemOutPort(obj)
521
522 def adapt_InStream_to_Item(obj, protocol, alternate):
523   return ItemInStream(obj)
524
525 def adapt_OutStream_to_Item(obj, protocol, alternate):
526   return ItemOutStream(obj)
527
528 def adapt_InGate_to_Item(obj, protocol, alternate):
529   return ItemInGate(obj)
530
531 def adapt_OutGate_to_Item(obj, protocol, alternate):
532   return ItemOutGate(obj)
533
534 if hasattr(pilot,"ProcPtr"):
535   #SWIG 1.3.24
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)
543
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)
549
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)
554
555   pilot_InputDataStreamPort=pilot.InputDataStreamPortPtr
556
557 else:
558   #SWIG 1.3.29
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)
563
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)
568
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)
578
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)
589
590   pilot_InputDataStreamPort=pilot.InputDataStreamPort