1 # -*- coding: utf-8 -*-
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
31 from treewidget import Tree
32 from Objecttreeitem import TreeItem
33 from Accas import AsException
34 from Noyau.N_CR import justify_text
35 from Accas import OPER,PROC,MACRO,FORM
36 from Accas import FACT,BLOC,SIMP
39 __version__="$Name: $"
40 __Id__="$Id: catabrowser.py,v 1.3 2002/09/10 15:59:37 eficas Exp $"
44 def __init__(self,parent,colonnes):
46 self.colonnes = colonnes
50 # recherche du nombre maxi de lignes et de colonnes....
51 for col in self.colonnes :
53 if len(col) > nb_l : nb_l = len(col)
55 self.nb_colonnes = len(self.colonnes)
56 # initialisation des coordonnées dans le canvas
59 self.x = self.x0 + self.incr
60 self.y = self.y0 + self.incr
63 self.scrolledcanvas=Pmw.ScrolledCanvas(self.parent,
67 Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
68 self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
69 self.canvas = self.scrolledcanvas.component('canvas')
70 self.affiche_colonnes()
72 def affiche_colonnes(self):
73 for i in range(self.nb_lignes):
75 self.aligne_colonnes()
77 self.scrolledcanvas.resizescrollregion()
81 x0,y0,xmax,ymax = self.canvas.bbox(ALL)
86 def trace_traits(self):
87 xmax,ymax = self.get_xy_max()
91 # trace les traits horizontaux
92 for i in range(self.nb_lignes):
93 tag_lig = 'ligne_'+`i`
94 l_id = self.canvas.find_withtag(tag_lig)
95 x0,y0,x1,y1 = self.bbox(l_id)
96 self.canvas.create_line(x0-self.incr,y0-self.incr,xmax,y0-self.incr)
97 self.canvas.create_line(self.x0,ymax,xmax,ymax)
98 # trace les traits verticaux
99 for j in range(self.nb_colonnes):
100 tag_col = 'colonne_'+`j`
101 l_id = self.canvas.find_withtag(tag_col)
102 x0,y0,x1,y1 = self.bbox(l_id)
103 self.canvas.create_line(x0-self.incr,y0-self.incr,x0-self.incr,ymax)
104 self.canvas.create_line(xmax,self.y0,xmax,ymax)
107 x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
109 x2,y2,x3,y3 = self.canvas.bbox(id)
116 def affiche_ligne(self,num_lig):
117 tag_lig = 'ligne_'+`num_lig`
119 for col in self.colonnes:
120 tag_col = 'colonne_'+`num_col`
121 x = 100*num_col+self.x
122 id = self.canvas.create_text(x,self.y,
123 text = justify_text(col[num_lig],cesure=60),
124 tag=(tag_lig,tag_col),
126 font = fontes.canvas)
127 x0,y0,x1,y1 = self.canvas.bbox(id)
129 l_id = self.canvas.find_withtag(tag_lig)
130 x0,y0,x1,y1 = self.bbox(l_id)
131 self.y = y1 + 2*self.incr
133 def aligne_colonnes(self):
135 for col in self.colonnes:
136 tag_col = 'colonne_'+`num_col`
137 l_id = self.canvas.find_withtag(tag_col)
138 if not l_id : continue
139 x0,y0,x1,y1 = self.bbox(l_id)
140 self.move(x1+self.incr,self.colonnes[num_col+1:],num_col+1)
143 def move(self,x,colonnes,num):
146 tag_col = 'colonne_'+`num_col`
147 l_id = self.canvas.find_withtag(tag_col)
148 if not l_id : continue
149 x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
150 self.canvas.move(tag_col,x+self.incr-x0,0)
153 class CATAPanel(Frame) :
154 """ Classe servant à créer le panneau représentant l'objet sélectionné dans l'arbre"""
155 def __init__(self,parent,panneau,node) :
157 self.panneau = panneau
159 Frame.__init__(self,self.panneau)
160 self.place(x=0,y=0,relheight=1,relwidth=1)
164 # création du label initial
166 text = 'Attributs de '+self.node.item.labeltext,
167 font = fontes.standard_gras_souligne)
168 label.pack(side='top',pady=10)
169 # création des listes correspondant aux colonnes du tableau à afficher
170 colonne1,colonne2 = self.get_listes()
171 # affichage du tableau
172 self.tableau = Tableau(self,(colonne1,colonne2))
173 self.tableau.affiche()
175 def get_listes(self):
176 self.node.item.get_dico_attributs()
177 l_cles_attributs = self.node.item.d_attributs.keys()
178 l_cles_attributs.sort()
182 for nom_attr in l_cles_attributs :
183 valeur = self.node.item.d_attributs[nom_attr]
184 if type(valeur) == types.TupleType:
187 if type(elem) == types.ClassType:
188 texte = texte + elem.__name__
190 texte = texte + str(elem)
191 elif type(valeur) == types.ClassType :
192 texte = valeur.__name__
195 liste1.append(nom_attr)
199 class CATAItem(TreeItem):
201 def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
203 self.labeltext = labeltext
205 self.setfunction = setfunction
206 self.objet_cata_ordonne = objet_cata_ordonne
208 def get_dico_fils(self):
210 if type(self.object) != types.TupleType:
211 for e in dir(self.object):
212 cmd = getattr(self.object,e)
214 d_fils[string.strip(cmd.nom)] = cmd
216 for obj in self.object :
220 d_fils[string.strip(cmd.nom)] = cmd
223 def get_dico_attributs(self):
225 if type(self.object) == types.TupleType :
226 self.d_attributs = d_attributs
228 l_noms_attributs = ['nom','op','sd_prod','reentrant','repetable','fr','docu','into','valide_vide','actif',
229 'regles','op_init','niveau','definition','code','niveaux','statut',
230 'defaut','min','max','homo','position','val_min','val_max','condition']
231 for nom_attribut in l_noms_attributs :
232 if hasattr(self.object,nom_attribut):
233 attr = getattr(self.object,nom_attribut)
234 d_attributs[nom_attribut] = attr
235 self.d_attributs = d_attributs
237 def get_liste_mc_ordonnee(self):
238 """ Retourne la liste ordonnée (suivant le catalogue) brute des fils
239 de l'entite courante """
240 if hasattr(self.objet_cata_ordonne,'ordre_mc'):
241 return self.objet_cata_ordonne.ordre_mc
243 l=self.objet_cata_ordonne.keys()
247 def GetLabelText(self):
248 return self.labeltext,None,None
256 def GetSubList(self):
258 if not hasattr(self,'d_fils'):
260 # on classe les fils dans l'odre du catalogue ...
261 l_cles_fils = self.get_liste_mc_ordonnee()
262 for k in l_cles_fils :
263 if type(self.objet_cata_ordonne) == types.InstanceType :
264 objet_cata = self.objet_cata_ordonne.entites[k]
266 objet_cata = self.objet_cata_ordonne.get(k,None)
267 item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
268 objet_cata_ordonne = objet_cata)
272 def GetIconName(self):
273 return 'ast-green-square'
278 class CMDItem(CATAItem):
280 def get_dico_fils(self):
281 self.d_fils = self.object.entites
283 class SIMPItem(CATAItem):
287 def GetIconName(self):
288 return 'ast-green-ball'
290 def IsExpandable(self):
293 class FACTItem(CMDItem):
294 def GetIconName(self):
295 return 'ast-green-los'
297 class BLOCItem(FACTItem): pass
299 class ATTRIBUTItem(SIMPItem):
300 def get_dico_attributs(self):
301 self.d_attributs = {}
303 def GetSubList(self):
306 def IsExpandable(self):
312 def GetIconName(self):
316 def __init__(self,parent,appli,cata,item = None):
328 self.top = Pmw.Dialog(self.parent,
329 title = "Visualisation d'un catalogue",
332 self.pane = Pmw.PanedWidget(self.top.component('dialogchildsite'),
335 orient = 'horizontal')
336 self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.5)
337 self.pane.add('panel',min = 0.4, max = 0.6, size = 0.5)
338 self.pane.pack(expand =1, fill = 'both')
339 self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
343 Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
344 self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
345 if self.item == None :
346 self.item = CATAItem(self.appli,"Catalogue",self.cata)
347 self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
349 self.node = self.tree.node_selected
351 def select_node(self,node):
352 self.nodes[node]=self.create_panel(node)
354 def create_panel(self,node):
355 if hasattr(node.item,"panel"):
356 return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
358 def quit(self,nom_bouton) :
362 self.top.wm_title("Browser de catalogue " )
363 self.top.wm_iconname("CataBrowser")
376 if isinstance(o,OPER):return OPER
377 elif isinstance(o,PROC):return PROC
378 elif isinstance(o,MACRO):return MACRO
379 elif isinstance(o,FORM):return MACRO
380 elif isinstance(o,SIMP):return SIMP
381 elif isinstance(o,FACT):return FACT
382 elif isinstance(o,BLOC):return BLOC
385 def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
387 if dispatch.has_key(t):
390 #print 'on a un objet de type :',t,' ',object
392 return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
395 return isinstance(cmd,OPER) or isinstance(cmd,PROC) or isinstance(cmd,MACRO) or isinstance(cmd,FORM)