1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
30 from treewidget import Tree
31 from Objecttreeitem import TreeItem
32 from Accas import AsException
33 from Noyau.N_CR import justify_text
34 from Accas import OPER,PROC,MACRO,FORM
35 from Accas import FACT,BLOC,SIMP
38 __version__="$Name: $"
39 __Id__="$Id: catabrowser.py,v 1.1.1.1 2002/03/26 09:08:46 eficas Exp $"
43 def __init__(self,parent,colonnes):
45 self.colonnes = colonnes
49 # recherche du nombre maxi de lignes et de colonnes....
50 for col in self.colonnes :
52 if len(col) > nb_l : nb_l = len(col)
54 self.nb_colonnes = len(self.colonnes)
55 # initialisation des coordonnées dans le canvas
58 self.x = self.x0 + self.incr
59 self.y = self.y0 + self.incr
62 self.scrolledcanvas=Pmw.ScrolledCanvas(self.parent,
66 Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
67 self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
68 self.canvas = self.scrolledcanvas.component('canvas')
69 self.affiche_colonnes()
71 def affiche_colonnes(self):
72 for i in range(self.nb_lignes):
74 self.aligne_colonnes()
76 self.scrolledcanvas.resizescrollregion()
80 x0,y0,xmax,ymax = self.canvas.bbox(ALL)
85 def trace_traits(self):
86 xmax,ymax = self.get_xy_max()
90 # trace les traits horizontaux
91 for i in range(self.nb_lignes):
92 tag_lig = 'ligne_'+`i`
93 l_id = self.canvas.find_withtag(tag_lig)
94 x0,y0,x1,y1 = self.bbox(l_id)
95 self.canvas.create_line(x0-self.incr,y0-self.incr,xmax,y0-self.incr)
96 self.canvas.create_line(self.x0,ymax,xmax,ymax)
97 # trace les traits verticaux
98 for j in range(self.nb_colonnes):
99 tag_col = 'colonne_'+`j`
100 l_id = self.canvas.find_withtag(tag_col)
101 x0,y0,x1,y1 = self.bbox(l_id)
102 self.canvas.create_line(x0-self.incr,y0-self.incr,x0-self.incr,ymax)
103 self.canvas.create_line(xmax,self.y0,xmax,ymax)
106 x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
108 x2,y2,x3,y3 = self.canvas.bbox(id)
115 def affiche_ligne(self,num_lig):
116 tag_lig = 'ligne_'+`num_lig`
118 for col in self.colonnes:
119 tag_col = 'colonne_'+`num_col`
120 x = 100*num_col+self.x
121 id = self.canvas.create_text(x,self.y,
122 text = justify_text(col[num_lig],cesure=60),
123 tag=(tag_lig,tag_col),
125 font = fontes.canvas)
126 x0,y0,x1,y1 = self.canvas.bbox(id)
128 l_id = self.canvas.find_withtag(tag_lig)
129 x0,y0,x1,y1 = self.bbox(l_id)
130 self.y = y1 + 2*self.incr
132 def aligne_colonnes(self):
134 for col in self.colonnes:
135 tag_col = 'colonne_'+`num_col`
136 l_id = self.canvas.find_withtag(tag_col)
137 if not l_id : continue
138 x0,y0,x1,y1 = self.bbox(l_id)
139 self.move(x1+self.incr,self.colonnes[num_col+1:],num_col+1)
142 def move(self,x,colonnes,num):
145 tag_col = 'colonne_'+`num_col`
146 l_id = self.canvas.find_withtag(tag_col)
147 if not l_id : continue
148 x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
149 self.canvas.move(tag_col,x+self.incr-x0,0)
152 class CATAPanel(Frame) :
153 """ Classe servant à créer le panneau représentant l'objet sélectionné dans l'arbre"""
154 def __init__(self,parent,panneau,node) :
156 self.panneau = panneau
158 Frame.__init__(self,self.panneau)
159 self.place(x=0,y=0,relheight=1,relwidth=1)
163 # création du label initial
165 text = 'Attributs de '+self.node.item.labeltext,
166 font = fontes.standard_gras_souligne)
167 label.pack(side='top',pady=10)
168 # création des listes correspondant aux colonnes du tableau à afficher
169 colonne1,colonne2 = self.get_listes()
170 # affichage du tableau
171 self.tableau = Tableau(self,(colonne1,colonne2))
172 self.tableau.affiche()
174 def get_listes(self):
175 self.node.item.get_dico_attributs()
176 l_cles_attributs = self.node.item.d_attributs.keys()
177 l_cles_attributs.sort()
181 for nom_attr in l_cles_attributs :
182 valeur = self.node.item.d_attributs[nom_attr]
183 if type(valeur) == types.TupleType:
186 if type(elem) == types.ClassType:
187 texte = texte + elem.__name__
189 texte = texte + str(elem)
190 elif type(valeur) == types.ClassType :
191 texte = valeur.__name__
194 liste1.append(nom_attr)
198 class CATAItem(TreeItem):
200 def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
202 self.labeltext = labeltext
204 self.setfunction = setfunction
205 self.objet_cata_ordonne = objet_cata_ordonne
207 def get_dico_fils(self):
209 if type(self.object) != types.TupleType:
210 for e in dir(self.object):
211 cmd = getattr(self.object,e)
213 d_fils[string.strip(cmd.nom)] = cmd
215 for obj in self.object :
219 d_fils[string.strip(cmd.nom)] = cmd
222 def get_dico_attributs(self):
224 if type(self.object) == types.TupleType :
225 self.d_attributs = d_attributs
227 l_noms_attributs = ['nom','op','sd_prod','reentrant','repetable','fr','docu','into','valide_vide','actif',
228 'regles','op_init','niveau','definition','code','niveaux','statut',
229 'defaut','min','max','homo','position','val_min','val_max','condition']
230 for nom_attribut in l_noms_attributs :
231 if hasattr(self.object,nom_attribut):
232 attr = getattr(self.object,nom_attribut)
233 d_attributs[nom_attribut] = attr
234 self.d_attributs = d_attributs
236 def get_liste_mc_ordonnee(self):
237 """ Retourne la liste ordonnée (suivant le catalogue) brute des fils
238 de l'entite courante """
239 if hasattr(self.objet_cata_ordonne,'liste'):
240 return self.objet_cata_ordonne.liste
242 l=self.objet_cata_ordonne.keys()
246 def GetLabelText(self):
247 return self.labeltext,None,None
255 def GetSubList(self):
257 if not hasattr(self,'d_fils'):
259 # on classe les fils dans l'odre du catalogue ...
260 l_cles_fils = self.get_liste_mc_ordonnee()
261 for k in l_cles_fils :
262 if type(self.objet_cata_ordonne) == types.InstanceType :
263 objet_cata = self.objet_cata_ordonne.dico[k]
265 objet_cata = self.objet_cata_ordonne.get(k,None)
266 item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
267 objet_cata_ordonne = objet_cata)
271 def GetIconName(self):
272 return 'ast-green-square'
277 class CMDItem(CATAItem):
279 def get_dico_fils(self):
280 self.d_fils = self.object.entites
282 class SIMPItem(CATAItem):
286 def GetIconName(self):
287 return 'ast-green-ball'
289 def IsExpandable(self):
292 class FACTItem(CMDItem):
293 def GetIconName(self):
294 return 'ast-green-los'
296 class BLOCItem(FACTItem): pass
298 class ATTRIBUTItem(SIMPItem):
299 def get_dico_attributs(self):
300 self.d_attributs = {}
302 def GetSubList(self):
305 def IsExpandable(self):
311 def GetIconName(self):
315 def __init__(self,parent,appli,cata,item = None):
327 self.top = Pmw.Dialog(self.parent,
328 title = "Visualisation d'un catalogue",
331 self.pane = Pmw.PanedWidget(self.top.component('dialogchildsite'),
334 orient = 'horizontal')
335 self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.5)
336 self.pane.add('panel',min = 0.4, max = 0.6, size = 0.5)
337 self.pane.pack(expand =1, fill = 'both')
338 self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
342 Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
343 self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
344 if self.item == None :
345 self.item = CATAItem(self.appli,"Catalogue",self.cata)
346 self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
348 self.node = self.tree.node_selected
350 def select_node(self,node):
351 self.nodes[node]=self.create_panel(node)
353 def create_panel(self,node):
354 if hasattr(node.item,"panel"):
355 return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
357 def quit(self,nom_bouton) :
361 self.top.wm_title("Browser de catalogue " )
362 self.top.wm_iconname("CataBrowser")
375 if isinstance(o,OPER):return OPER
376 elif isinstance(o,PROC):return PROC
377 elif isinstance(o,MACRO):return MACRO
378 elif isinstance(o,FORM):return MACRO
379 elif isinstance(o,SIMP):return SIMP
380 elif isinstance(o,FACT):return FACT
381 elif isinstance(o,BLOC):return BLOC
384 def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
386 if dispatch.has_key(t):
389 #print 'on a un objet de type :',t,' ',object
391 return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
394 return isinstance(cmd,OPER) or isinstance(cmd,PROC) or isinstance(cmd,MACRO) or isinstance(cmd,FORM)