]> SALOME platform Git repositories - modules/adao.git/blob - src/daSalome/daGUI/daGuiImpl/adaoGuiManager.py
Salome HOME
Correction de la fonction Remove
[modules/adao.git] / src / daSalome / daGUI / daGuiImpl / adaoGuiManager.py
1 # -*- coding: utf-8 -*-
2 #  Copyright (C) 2010 EDF R&D
3 #
4 #  This library is free software; you can redistribute it and/or
5 #  modify it under the terms of the GNU Lesser General Public
6 #  License as published by the Free Software Foundation; either
7 #  version 2.1 of the License.
8 #
9 #  This library is distributed in the hope that it will be useful,
10 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 #  Lesser General Public License for more details.
13 #
14 #  You should have received a copy of the GNU Lesser General Public
15 #  License along with this library; if not, write to the Free Software
16 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 """
22 This file centralizes the definitions and implementations of ui components used
23 in the GUI part of the module.
24 """
25
26 __author__ = "aribes/gboulant"
27
28 import traceback
29 from PyQt4.QtCore import QObject
30 from PyQt4 import QtGui,QtCore
31 import SalomePyQt
32 sgPyQt = SalomePyQt.SalomePyQt()
33
34 from daGuiImpl.enumerate import Enumerate
35 from daGuiImpl.adaoCase import AdaoCase
36 from daEficasWrapper.adaoEficasWrapper import AdaoEficasWrapper
37 from daEficasWrapper.eficasWrapper import EficasObserver
38 from daEficasWrapper.eficasWrapper import EficasEvent
39 import adaoGuiHelper
40 import adaoStudyEditor
41
42 __cases__ = {}
43
44 #
45 # ==============================================================================
46 # Classes to manage the building of UI components
47 # ==============================================================================
48 #
49 UI_ELT_IDS = Enumerate([
50         'ADAO_MENU_ID',
51         'NEW_ADAOCASE_ID',
52         'OPEN_ADAOCASE_ID',
53         'EDIT_ADAOCASE_POP_ID',
54         'REMOVE_ADAOCASE_POP_ID',
55         'YACS_EXPORT_POP_ID',
56         ],offset=950)
57
58 ACTIONS_MAP={
59     UI_ELT_IDS.NEW_ADAOCASE_ID:"newAdaoCase",
60     UI_ELT_IDS.OPEN_ADAOCASE_ID:"openAdaoCase",
61     UI_ELT_IDS.EDIT_ADAOCASE_POP_ID:"editAdaoCase",
62     UI_ELT_IDS.REMOVE_ADAOCASE_POP_ID:"removeAdaoCase",
63     UI_ELT_IDS.YACS_EXPORT_POP_ID:"exportCaseToYACS",
64 }
65
66 class AdaoGuiUiComponentBuilder:
67     """
68     The initialisation of this class creates the graphic components involved
69     in the GUI (menu, menu item, toolbar). A ui component builder should be
70     created for each opened study and associated to its context (see usage in OMAGUI.py).
71     """
72     def __init__(self):
73         self.initUiComponents()
74
75     def initUiComponents(self):
76
77         objectTR = QObject()
78
79         # create top-level menu
80         mid = sgPyQt.createMenu( "ADAO", -1, UI_ELT_IDS.ADAO_MENU_ID, sgPyQt.defaultMenuGroup() )
81         # create toolbar
82         tid = sgPyQt.createTool( "ADAO" )
83
84         a = sgPyQt.createAction( UI_ELT_IDS.NEW_ADAOCASE_ID, "New case", "New case", "Create a new adao case", "" )
85         sgPyQt.createMenu(a, mid)
86         sgPyQt.createTool(a, tid)
87         a = sgPyQt.createAction( UI_ELT_IDS.OPEN_ADAOCASE_ID, "Open case", "Open case", "Open a adao case", "" )
88         sgPyQt.createMenu(a, mid)
89         sgPyQt.createTool(a, tid)
90
91         # the following action are used in context popup
92         a = sgPyQt.createAction( UI_ELT_IDS.EDIT_ADAOCASE_POP_ID, "Edit case", "Edit case", "Edit the selected study case", "" )
93         a = sgPyQt.createAction( UI_ELT_IDS.REMOVE_ADAOCASE_POP_ID, "Remove case", "Remove case", "Remove the selected study case", "" )
94         a = sgPyQt.createAction( UI_ELT_IDS.YACS_EXPORT_POP_ID, "Export to YACS", "Export to YACS", "Generate a YACS graph executing this case", "" )
95
96     def createPopupMenuOnItem(self,popup,salomeSudyId, item):
97         if adaoStudyEditor.isValidAdaoCaseItem(salomeSudyId, item):
98           popup.addAction( sgPyQt.action( UI_ELT_IDS.EDIT_ADAOCASE_POP_ID ) )
99           popup.addAction( sgPyQt.action( UI_ELT_IDS.REMOVE_ADAOCASE_POP_ID ) )
100           popup.addAction( sgPyQt.action( UI_ELT_IDS.YACS_EXPORT_POP_ID ) )
101
102         return popup
103
104 class AdaoGuiActionImpl(EficasObserver):
105     """
106     This class implements the ui actions concerning the management of oma study
107     cases.
108     """
109
110     def __init__(self):
111         pass
112         # This dialog is created once so that it can be recycled for each call
113         # to newOmaCase().
114         #self.__dlgNewStudyCase = DlgNewStudyCase()
115         self.__parent = SalomePyQt.SalomePyQt().getDesktop()
116         self.__dlgEficasWrapper = AdaoEficasWrapper(parent=SalomePyQt.SalomePyQt().getDesktop())
117         self.__dlgEficasWrapper.addObserver(self)
118         self.__Eficas_viewId = -1
119
120     # ==========================================================================
121     # Processing of ui actions
122     #
123     def processAction(self,actionId):
124         """
125         Main switch function for ui actions processing
126         """
127         if ACTIONS_MAP.has_key(actionId):
128             try:
129                 functionName = ACTIONS_MAP[actionId]
130                 getattr(self,functionName)()
131             except:
132                 traceback.print_exc()
133         else:
134             msg = "The requested action is not implemented: " + str(actionId)
135             print msg
136
137     def showEficas(self):
138       if self.__Eficas_viewId == -1:
139         self.__dlgEficasWrapper.init_gui()
140
141
142         # Scroll Widget
143         area = QtGui.QScrollArea(SalomePyQt.SalomePyQt().getDesktop());
144         area.setWidget( self.__dlgEficasWrapper)
145         area.setWidgetResizable(1)
146
147         wmType = "ADAO View"
148         self.__Eficas_viewId = sgPyQt.createView(wmType, area)
149         sgPyQt.setViewClosable(self.__Eficas_viewId, False)
150       else:
151         if SalomePyQt.SalomePyQt().getActiveView() != self.__Eficas_viewId :
152           result_activate = SalomePyQt.SalomePyQt().activateView(self.__Eficas_viewId)
153           if result_activate == False:
154             self.__dlgEficasWrapper.init_gui()
155
156             # Scroll Widget
157             area = QtGui.QScrollArea(SalomePyQt.SalomePyQt().getDesktop());
158             area.setWidget( self.__dlgEficasWrapper)
159             area.setWidgetResizable(1)
160
161             wmType = "ADAO View"
162             self.__Eficas_viewId = sgPyQt.createView(wmType, area)
163             sgPyQt.setViewClosable(self.__Eficas_viewId, False)
164
165     def activate(self):
166       self.showEficas()
167
168     # Actions from SALOME GUI
169
170     def newAdaoCase(self):
171       self.showEficas()
172       self.__dlgEficasWrapper.fileNew()
173
174     def openAdaoCase(self):
175       self.showEficas()
176       global __cases__
177       fichier = QtGui.QFileDialog.getOpenFileName(SalomePyQt.SalomePyQt().getDesktop(),
178                                                   self.__dlgEficasWrapper.trUtf8('Ouvrir Fichier'),
179                                                   self.__dlgEficasWrapper.CONFIGURATION.savedir,
180                                                   self.__dlgEficasWrapper.trUtf8('JDC Files (*.comm);;''All Files (*)'))
181       if fichier.isNull(): return
182       new_case = AdaoCase()
183       new_case.set_filename(str(fichier))
184       new_case.set_name(str(fichier.split('/')[-1]))
185       salomeStudyId   = adaoGuiHelper.getActiveStudyId()
186       salomeStudyItem = adaoStudyEditor.addInStudy(salomeStudyId, new_case)
187       case_key = (salomeStudyId, salomeStudyItem.GetID())
188       __cases__[case_key] = new_case
189
190       # Open file in Eficas
191       self.__dlgEficasWrapper.Openfile(new_case.get_filename())
192       callbackId = [salomeStudyId, salomeStudyItem]
193       self.__dlgEficasWrapper.setCallbackId(callbackId)
194       self.showEficas()
195       adaoGuiHelper.refreshObjectBrowser()
196
197     def editAdaoCase(self):
198       # First we show eficas - all cases are reloaded
199       global __cases__
200
201       # Take study item
202       salomeStudyId   = adaoGuiHelper.getActiveStudyId()
203       salomeStudyItem = adaoGuiHelper.getSelectedItem(salomeStudyId)
204       case_key = (salomeStudyId, salomeStudyItem.GetID())
205
206       # ShowEficas, If case is an empty case - case is destroyed by reopen
207       self.showEficas()
208       try:
209         case = __cases__[case_key]
210         # Search if case is in Eficas !
211         callbackId = [salomeStudyId, salomeStudyItem]
212         case_open_in_eficas = self.__dlgEficasWrapper.selectCase(callbackId)
213
214         # If case is not in eficas Open It !
215         if case_open_in_eficas == False:
216           if case.get_filename() != "":
217             self.__dlgEficasWrapper.Openfile(case.get_filename())
218             callbackId = [salomeStudyId, salomeStudyItem]
219             self.__dlgEficasWrapper.setCallbackId(callbackId)
220       except:
221         # Case has been destroyed - create a new one
222         self.__dlgEficasWrapper.fileNew()
223
224     def removeAdaoCase(self):
225       global __cases__
226
227       # First step: selectCase
228       salomeStudyId   = adaoGuiHelper.getActiveStudyId()
229       salomeStudyItem = adaoGuiHelper.getSelectedItem(salomeStudyId)
230       callbackId = [salomeStudyId, salomeStudyItem]
231       case_open_in_eficas = self.__dlgEficasWrapper.selectCase(callbackId)
232
233       # If case is in eficas close it !
234       if case_open_in_eficas:
235         # fileClose: remove the CallbackId
236         # fileClose: sends a destroy event
237         self.__dlgEficasWrapper.fileClose()
238       else:
239         # Test if case exists
240         case_key = (salomeStudyId, salomeStudyItem.GetID())
241         if __cases__.has_key(case_key):
242           __cases__.pop(case_key)
243           adaoStudyEditor.removeItem(salomeStudyId, salomeStudyItem)
244           adaoGuiHelper.refreshObjectBrowser()
245
246     def exportCaseToYACS(self):
247       global __cases__
248
249       # Get case from study
250       salomeStudyId   = adaoGuiHelper.getActiveStudyId()
251       salomeStudyItem = adaoGuiHelper.getSelectedItem(salomeStudyId)
252       case_key = (salomeStudyId, salomeStudyItem.GetID())
253       case = __cases__[case_key]
254
255       # Generates YACS schema and export it
256       msg = case.exportCaseToYACS()
257
258       # If msg is not empty -> error found
259       if msg != "":
260         adaoGuiHelper.gui_warning(self.__parent, msg)
261
262     # ==========================================================================
263     # Processing notifications from adaoEficasWrapper
264     #
265     __processOptions={
266         EficasEvent.EVENT_TYPES.CLOSE   : "_processEficasCloseEvent",
267         EficasEvent.EVENT_TYPES.SAVE    : "_processEficasSaveEvent",
268         EficasEvent.EVENT_TYPES.NEW     : "_processEficasNewEvent",
269         EficasEvent.EVENT_TYPES.DESTROY : "_processEficasDestroyEvent",
270         EficasEvent.EVENT_TYPES.OPEN    : "_processEficasOpenEvent",
271         EficasEvent.EVENT_TYPES.REOPEN  : "_processEficasReOpenEvent"
272         }
273     def processEficasEvent(self, eficasWrapper, eficasEvent):
274         """
275         Implementation of the interface EficasObserver. The implementation is a
276         switch on the possible types of events defined in EficasEvent.EVENT_TYPES.
277         @overload
278         """
279         functionName = self.__processOptions.get(eficasEvent.eventType, lambda : "_processEficasUnknownEvent")
280         return getattr(self,functionName)(eficasWrapper, eficasEvent)
281
282     def _processEficasCloseEvent(self, eficasWrapper, eficasEvent):
283         pass
284
285     def _processEficasNewEvent(self, eficasWrapper, eficasEvent):
286       global __cases__
287       new_case = AdaoCase()
288       case_name = eficasWrapper.getCaseName()
289       new_case.set_name(case_name)
290       salomeStudyId   = adaoGuiHelper.getActiveStudyId()
291       salomeStudyItem = adaoStudyEditor.addInStudy(salomeStudyId, new_case)
292       case_key = (salomeStudyId, salomeStudyItem.GetID())
293       __cases__[case_key] = new_case
294       adaoGuiHelper.refreshObjectBrowser()
295       callbackId = [salomeStudyId, salomeStudyItem]
296       self.__dlgEficasWrapper.setCallbackId(callbackId)
297
298     def _processEficasReOpenEvent(self, eficasWrapper, eficasEvent):
299       global __cases__
300       try:
301         callbackId = eficasEvent.callbackId
302         [salomeStudyId, salomeStudyItem] = callbackId
303         case_key = (salomeStudyId, salomeStudyItem.GetID())
304         case = __cases__[case_key]
305         # Search if case is in Eficas !
306         callbackId = [salomeStudyId, salomeStudyItem]
307         case_open_in_eficas = self.__dlgEficasWrapper.selectCase(callbackId)
308         # If case is not in eficas Open It !
309         if case_open_in_eficas == False:
310           if case.get_filename() != "":
311             self.__dlgEficasWrapper.Openfile(case.get_filename())
312             callbackId = [salomeStudyId, salomeStudyItem]
313             self.__dlgEficasWrapper.setCallbackId(callbackId)
314           else:
315             # Since I am an empty case I destroy myself before reloading
316             adaoStudyEditor.removeItem(salomeStudyId, salomeStudyItem)
317             adaoGuiHelper.refreshObjectBrowser()
318             __cases__.pop(case_key)
319             callbackId = [salomeStudyId, salomeStudyItem]
320             self.__dlgEficasWrapper.removeCallbackId(callbackId)
321       except:
322         print "Oups - cannot reopen case !"
323         traceback.print_exc()
324
325     def _processEficasOpenEvent(self, eficasWrapper, eficasEvent):
326       global __cases__
327
328       # Ouverture du fichier
329       self.__dlgEficasWrapper.Openfile(self.__dlgEficasWrapper.getOpenFileName())
330
331       # Creation d'un nouveau cas
332       new_case = AdaoCase()
333       salomeStudyId   = adaoGuiHelper.getActiveStudyId()
334       salomeStudyItem = adaoStudyEditor.addInStudy(salomeStudyId, new_case)
335       case_key = (salomeStudyId, salomeStudyItem.GetID())
336       __cases__[case_key] = new_case
337
338       # Connexion du nouveau cas
339       callbackId = [salomeStudyId, salomeStudyItem]
340       self.__dlgEficasWrapper.setCallbackId(callbackId)
341
342       # On sauvegarde le cas
343       self._processEficasSaveEvent(self.__dlgEficasWrapper, None, callbackId)
344
345     def _processEficasSaveEvent(self, eficasWrapper, eficasEvent, callbackId=None):
346         global __cases__
347         if callbackId is None:
348           callbackId = eficasEvent.callbackId
349           if callbackId is None:
350             raise DevelException("the callback data should not be None. Can't guess what are the study and case")
351           [targetSalomeStudyId,targetSalomeStudyItem] = callbackId
352           if ( targetSalomeStudyId is None ) or ( targetSalomeStudyItem is None ):
353             raise DevelException("the parameters targetSalomeStudyId and targetSalomeStudyItem should not be None")
354         else:
355           [targetSalomeStudyId,targetSalomeStudyItem] = callbackId
356
357         # Get Editor All infos we need !
358         case_name = eficasWrapper.getCaseName()
359         file_case_name = eficasWrapper.getFileCaseName()
360         if case_name != "" :
361           # Get case
362           old_case_key = (targetSalomeStudyId, targetSalomeStudyItem.GetID())
363           case =__cases__[old_case_key]
364
365           # Set new informations
366           case.set_name(case_name)
367           if str(case_name).startswith("Untitled"):
368             pass
369           else:
370             case.set_filename(file_case_name)
371           adaoStudyEditor.updateItem(targetSalomeStudyId, targetSalomeStudyItem, case)
372
373           # Case key changed !
374           #new_case_key = (targetSalomeStudyId, targetSalomeStudyItem.GetID())
375           # A ne pas inverser !!!
376           #__cases__.pop(old_case_key)
377           #__cases__[new_case_key] = case
378
379           adaoGuiHelper.refreshObjectBrowser()
380
381     def _processEficasDestroyEvent(self, eficasWrapper, eficasEvent):
382         global __cases__
383         callbackId = eficasEvent.callbackId
384         if callbackId is None:
385             raise DevelException("the callback data should not be None. Can't guess what are the study and case")
386         [targetSalomeStudyId,targetSalomeStudyItem] = callbackId
387         if ( targetSalomeStudyId is None ) or ( targetSalomeStudyItem is None ):
388             raise DevelException("the parameters targetSalomeStudyId and targetSalomeStudyItem should not be None")
389
390         case_key = (targetSalomeStudyId, targetSalomeStudyItem.GetID())
391         __cases__.pop(case_key)
392         adaoStudyEditor.removeItem(targetSalomeStudyId, targetSalomeStudyItem)
393         adaoGuiHelper.refreshObjectBrowser()
394
395     def _processEficasUnknownEvent(self, eficasWrapper, eficasEvent):
396       print "Unknown Eficas Event"