df7ff897785936150e7efb2da8b5c30719c35420
[iramuteq] / iramuteq.py
1 #!/bin/env python
2 # -*- coding: utf-8 -*-
3 #Author: Pierre Ratinaud
4 #Copyright (c) 2008-2012, Pierre Ratinaud
5 #Lisense: GNU GPL
6
7 from optparse import OptionParser
8
9 parser = OptionParser()
10 parser.add_option("-f", "--file", dest="filename",
11                   help="open FILE", metavar="FILE", default=False)
12 (options, args) = parser.parse_args()
13
14 #print args
15 #print options
16
17 import sys
18 reload(sys)
19 import locale
20 import tempfile
21 import codecs
22 import os
23 import shutil
24 from random import randint
25 from ConfigParser import *
26 import webbrowser
27 import gettext
28 import logging
29 #------------------------------------
30 import wx
31 #import wx.aui
32 #import wx.lib.agw.aui as aui
33 import agw.aui as aui
34 import wx.html
35 import wx.grid
36 import wx.lib.hyperlink as hl
37 #from wx.lib.wordwrap import wordwrap
38 #------------------------------------
39 from functions import BugReport, PlaySound, ReadLexique, History, DoConf, ReadDicoAsDico, progressbar
40 from checkversion import NewVersion
41 from guifunct import *
42 from tableau import Tableau
43 from dialog import PrefDialog, EncodeDialog, CorpusPref
44 from tabfrequence import Frequences
45 from tabchi2 import ChiSquare
46 #from tabstudent import MakeStudent
47 from tabchddist import ChdCluster
48 from tabafcm import DoAFCM
49 from tabchdalc import AnalyseQuest
50 from tabsimi import DoSimi
51 from tabrsimple import InputText
52 from tabverges import Verges
53 #from textafcuci import AfcUci
54 #from textchdalc import AnalyseAlceste
55 from analysetxt import Alceste
56 from textdist import PamTxt
57 from textstat import Stat
58 from textaslexico import Lexico
59 from textsimi import SimiTxt
60 from textwordcloud import WordCloud
61 from profile_segment import ProfileSegment
62 from textcheckcorpus import checkcorpus
63 from openanalyse import OpenAnalyse
64 from corpusNG import BuildFromAlceste, Builder
65 from sheet import MySheet
66 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRapp, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
67 from chemins import ConstructRscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
68 from parse_factiva_xml import ImportFactiva
69 from tree import LeftTree
70 ##########################################################
71 ID_OpenData = wx.NewId()
72 ID_Import = wx.NewId()
73 ID_OpenText = wx.NewId()
74 ID_OnOpenAnalyse = wx.NewId()
75 ID_Freq = wx.NewId()
76 ID_Chi2 = wx.NewId()
77 ID_Student = wx.NewId()
78 ID_CHDSIM = wx.NewId()
79 ID_CHDAlceste = wx.NewId()
80 ID_TEXTAFCM = wx.NewId()
81 ID_TEXTSTAT = wx.NewId()
82 ID_ASLEX = wx.NewId()
83 ID_TEXTALCESTE = wx.NewId()
84 ID_TEXTPAM = wx.NewId()
85 ID_CHECKCORPUS = wx.NewId()
86 ID_Tabcontent = wx.NewId()
87 ID_AFCM = wx.NewId()
88 ID_SIMI = wx.NewId()
89 ID_CloseTab = wx.NewId()
90 ID_SaveTab = wx.NewId()
91 ID_CreateText = wx.NewId()
92 ID_ACCEUIL = wx.NewId()
93 ID_RESULT = wx.NewId()
94 ID_VIEWDATA = wx.NewId()
95 ID_HTMLcontent = wx.NewId()
96 ID_SimiTxt = wx.NewId()
97 ##########################################################
98 #elements de configuration
99 ##########################################################
100 #encodage
101 if sys.platform == 'darwin' :
102     sys.setdefaultencoding('utf-8')
103     wx.SetDefaultPyEncoding('utf-8')
104 else :
105     sys.setdefaultencoding(locale.getpreferredencoding())
106 #chemin de l'application
107
108 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
109 #chemin des images
110 ImagePath = os.path.join(AppliPath, 'images')
111 #configuration generale
112 DictConfigPath = ConstructGlobalPath(AppliPath)
113 ConfigGlob = ConfigParser()
114 ConfigGlob.read(DictConfigPath['global'])
115 #repertoire de l'utilisateur
116 if os.getenv('HOME') != None:
117     user_home = os.getenv('HOME')
118 else:
119     user_home = os.getenv('HOMEPATH')
120 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
121 #Si pas de fichiers de config utilisateur, on crée le repertoire
122 CreateIraDirectory(UserConfigPath, AppliPath)
123 #fichiers log pour windows (py2exe)
124 print 'PLUS DE LOG !!!!!!!!!!'
125 print 'LOGGING TEST'
126 log = logging.getLogger('iramuteq')
127 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
128 ch = logging.StreamHandler()
129 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
130 ch.setFormatter(formatter)
131 fh.setFormatter(formatter)
132 log.addHandler(ch)
133 log.addHandler(fh)
134 log.setLevel(logging.INFO)
135 #debug = False
136 #if not debug :
137 #    if sys.platform == 'win32' or sys.platform == 'darwin':
138 #        sys.stdout = open(os.path.join(UserConfigPath,'stdout.log'), 'w')
139 #        sys.stderr = open(os.path.join(UserConfigPath,'stderr.log'), 'w')
140 #chemin des fichiers de configuration utilisateur
141 #print sys.argv[0]
142 ConfigPath = ConstructConfigPath(UserConfigPath)
143 #####################################################################
144
145 class IraFrame(wx.Frame):
146     def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
147                  size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | 
148                                             wx.SUNKEN_BORDER | 
149                                             wx.CLIP_CHILDREN):
150         log.info('Starting...')
151         wx.Frame.__init__(self, parent, id, title, pos, size, style)
152         #configuration
153         self.AppliPath = AppliPath
154         self.images_path = os.path.join(AppliPath,'images')
155         self.UserConfigPath = UserConfigPath
156         self.RscriptsPath = ConstructRscriptsPath(AppliPath)
157         self.DictPath = ConstructDicoPath(AppliPath)
158         self.ConfigGlob = ConfigGlob
159         self.ConfigPath = ConstructConfigPath(UserConfigPath)
160         self.pref = RawConfigParser()
161         #langues
162         mylocale = wx.Locale(wx.LANGUAGE_FRENCH)
163         mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
164         mylocale.AddCatalog('iramuteq')
165         presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
166         presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
167         presLan_fr.install()
168
169
170         # tell FrameManager to manage this frame        
171         #self._mgr = wx.aui.AuiManager()
172         self._mgr = aui.AuiManager()
173         self._mgr.SetManagedWindow(self)
174         self.x = 0
175         # create menu
176 #--------------------------------------------------------------------------------
177         self.mb = wx.MenuBar()
178
179         file_menu = wx.Menu()
180         item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a questionnaire"), _(u"Open a questionnaire"))
181         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
182         file_menu.AppendItem(item)
183         
184         item = wx.MenuItem(file_menu, ID_OpenText, u"Ouvrir texte", u"Ouvrir un corpus texte")
185         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
186         file_menu.AppendItem(item)
187         
188         item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, u"Ouvrir une Analyse", "Ouvrir une Analyse")
189         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
190         file_menu.AppendItem(item)
191
192         item1 = wx.MenuItem(file_menu, ID_Import, u"Importer un corpus factiva...", "Importer un corpus factiva...")
193         item1.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_TIP))
194         file_menu.AppendItem(item1)
195         #item1.Enable(True)
196        
197         item = wx.MenuItem(file_menu, ID_SaveTab, u"Enregistrer l\'onglet sous...", u"Enregistrer l\'onglet sous ...")
198         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
199         #item.Enable(False)
200         file_menu.AppendItem(item)
201         
202         file_menu.Append(wx.ID_EXIT, u"Exit")
203         
204         edit_menu = wx.Menu()
205         edit_menu.Append(wx.ID_PREFERENCES, '', u'Préférences')
206         
207         view_menu = wx.Menu()
208         view_menu.Append(ID_ACCEUIL, u"Page d'accueil")
209         view_menu.Append(ID_VIEWDATA, u"Afficher les données")
210         view_menu.Append(ID_RESULT, u'Afficher les résultats')
211         #view_menu.AppendSeparator()
212
213         analyse_menu = wx.Menu()
214         analyse_menu.Append(ID_Freq, u"Fréquences")
215         analyse_menu.Append(ID_Chi2, u"Chi2")
216         #analyse_menu.Append(ID_Student, u"t de Student")
217         menu_classif = wx.Menu()
218         menu_classif.Append(ID_CHDAlceste, u"Méthode Alceste")
219         menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
220         analyse_menu.AppendMenu(-1, u"Classification", menu_classif)
221         analyse_menu.Append(ID_AFCM, u"AFCM")
222         analyse_menu.Append(ID_SIMI, u"Analyse de similitudes")
223         ID_RCODE = wx.NewId()
224         analyse_menu.Append(ID_RCODE, u"Code R...")
225
226         text_menu = wx.Menu()
227         text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
228         text_menu.Append(ID_TEXTSTAT, u"Statistiques textuelles")
229         text_menu.Append(ID_ASLEX, u"Spécificités et AFC")
230         #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
231         menu_classiftxt = wx.Menu()
232         menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode Alceste")
233         menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
234         text_menu.AppendMenu(-1, u"Classification", menu_classiftxt)
235         text_menu.Append(ID_SimiTxt, u'Analyse de similitude') 
236         ID_WC = wx.NewId()
237         text_menu.Append(ID_WC, u'Nuage de mots')
238         
239         help_menu = wx.Menu()
240         help_menu.Append(wx.ID_ABOUT, u'À propos...')
241         help_menu.Append(wx.ID_HELP, u'Aide en ligne')
242         
243         self.mb.Append(file_menu, _(u"File"))
244         self.mb.Append(edit_menu, _(u"Edition"))
245         self.mb.Append(view_menu, _(u"View"))
246         self.mb.Append(analyse_menu, _("Spreadsheet analysis"))
247         self.mb.Append(text_menu, _(u"Text analysis"))
248         self.mb.Append(help_menu, _(u"Help"))
249         
250         self.SetMenuBar(self.mb)
251 #--------------------------------------------------------------------
252         self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
253         self.statusbar.SetStatusWidths([-2, -3])
254         self.statusbar.SetStatusText(u"Prêt", 0)
255         self.statusbar.SetStatusText(u"Bienvenue", 1)
256
257         # min size for the frame itself isn't completely done.
258         # see the end up FrameManager::Update() for the test
259         # code. For now, just hard code a frame minimum size
260         self.SetMinSize(wx.Size(400, 400))
261
262         # create some toolbars
263         tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
264                          wx.TB_FLAT | wx.TB_NODIVIDER)
265         tb1.SetToolBitmapSize(wx.Size(16, 16))
266         tb1.AddLabelTool(ID_OpenData, "OpenData", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, wx.Size(16, 16)), shortHelp="Questionnaire", longHelp="Ouvrir un questionnaire")
267         tb1.AddSeparator()
268         tb1.AddLabelTool(ID_OpenText, "OpenText", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN, wx.ART_OTHER, wx.Size(16, 16)), shortHelp="Texte", longHelp="Ouvrir un corpus texte")
269
270         tb1.Realize()
271         
272 #------------------------------------------------------------------------------------------------
273
274         self.text_ctrl_txt = wx.TextCtrl(self, -1, "", wx.Point(0, 0), wx.Size(200, 200), wx.NO_BORDER | wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)
275                       
276         #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
277         #                  Name("Text").CenterPane())                      
278         self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
279                           Name("Text").CenterPane())
280         #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
281         #                  CenterPane())
282         self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
283                           CenterPane())
284         if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
285             with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
286                 f.write('')
287         self.history = History(os.path.join(UserConfigPath, 'history.db'))
288         self.tree = LeftTree(self)
289         self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption("Navigateur").
290                           Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
291                           MinimizeButton(True))
292         
293         #self.nb = wx.aui.AuiNotebook(self, -1, wx.DefaultPosition, wx.DefaultSize, wx.aui.AUI_NB_DEFAULT_STYLE | wx.aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.aui.AUI_NB_TAB_MOVE | wx.aui.AUI_NB_TAB_FLOAT| wx.NO_BORDER)
294         self.nb = aui.AuiNotebook(self, -1, wx.DefaultPosition, wx.DefaultSize, aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT| wx.NO_BORDER)
295         notebook_flags =  aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | aui.AUI_NB_TAB_MOVE | aui.AUI_NB_TAB_FLOAT| wx.NO_BORDER
296         self.nb.SetAGWWindowStyleFlag(notebook_flags)
297         self.nb.SetArtProvider(aui.ChromeTabArt())
298         #self.nb.SetArtProvider(aui.VC8TabArt())
299         #self.nb.parent = self
300         #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
301         #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
302         #                      Name("Tab_content").
303         #                      CenterPane())
304         self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
305                               Name("Tab_content").
306                               CenterPane())        
307         self.Sheet = MySheet(self)
308         #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
309         self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
310         #self.nb.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
311         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
312         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
313         # add the toolbars to the manager
314                         
315         #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
316         #                  Name("tb1").Caption("Fichiers").
317         #                  ToolbarPane().Top().
318         #                  LeftDockable(False).RightDockable(False))
319         self._mgr.AddPane(tb1, aui.AuiPaneInfo().
320                           Name("tb1").Caption("Fichiers").
321                           ToolbarPane().Top().
322                           LeftDockable(True).RightDockable(False))        
323         
324         self.ShowAPane("Intro_Text")
325         self._mgr.GetPane("lefttree").Show()
326         self._mgr.GetPane("classif_tb").Hide()
327         # "commit" all changes made to FrameManager   
328         self._mgr.Update()
329
330         # Show How To Use The Closing Panes Event
331 ##################################################################        
332         self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
333         self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
334         self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
335         self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
336         self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
337         self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
338         self.Bind(wx.EVT_MENU, self.import_factiva, id= ID_Import)
339         self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
340         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
341         self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
342         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
343         self.Bind(wx.EVT_MENU, self.OnCHDAlceste, id=ID_CHDAlceste)
344         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
345         self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
346         self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
347         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
348         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
349         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
350         self.Bind(wx.EVT_MENU, self.OnTextAlceste, id=ID_TEXTALCESTE)
351         self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
352         self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
353         self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
354         self.Bind(wx.EVT_MENU, self.OnSimi, id=ID_SIMI)
355         self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
356         self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
357         self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
358         self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
359         self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
360         self.Bind(wx.EVT_CLOSE, self.OnClose)
361 ##################################################################
362         flags = self._mgr.GetAGWFlags()
363         #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
364         #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
365         #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
366         flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
367         self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
368         self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
369         self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
370         self.DoUpdate()
371
372         self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
373         self.SetIcon(self._icon)
374 ##########################
375         self.ctrl = ""
376         self.input_path = [False]
377         self.TEMPDIR = tempfile.mkdtemp('iramuteq')
378         self.FileTabList = []
379         self.listbar=[]
380         self.DictTab = {}
381         self.FreqNum = 0
382         self.colsep = ''
383         self.txtsep = ''
384         self.g_header = False
385         self.g_id = False
386         self.table = ''
387         self.fileforR = ''
388         self.filename = ''
389         self.nastrings = ''
390         self.encode = ''
391         self.SysEncoding = sys.getdefaultencoding()
392         self.syscoding = sys.getdefaultencoding()
393         #print 'SysEncoding',self.SysEncoding
394         if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
395         self.type = ''
396
397         try :
398             self.pref.read(self.ConfigPath['preferences'])
399             if IsNew(self) :
400                 UpgradeConf(self)
401                 New = True
402             else :
403                 CopyConf(self)
404                 New = False
405         except :
406             UpgradeConf(self)
407             self.pref.read(self.ConfigPath['preferences'])
408             New = True
409         #configuration des chemins de R
410         self.PathPath = ConfigParser()
411         self.PathPath.read(ConfigPath['path'])
412         BestRPath = False
413         if not CheckRPath(self.PathPath) :
414             if sys.platform == 'win32':
415                 BestRPath = FindRPAthWin32()
416             else:
417                 BestRPath = FindRPathNix()
418             if BestRPath:
419                 self.PathPath.set('PATHS', 'rpath', BestRPath)
420                 with open(ConfigPath['path'], 'w') as f :
421                     self.PathPath.write(f)
422         else:
423             BestRPath = True 
424         if BestRPath :
425             self.RPath = self.PathPath.get('PATHS', 'rpath')
426             if New :
427                 CheckRPackages(self)
428             if not RLibsAreInstalled(self) :
429                 CheckRPackages(self)
430         else :
431             msg = u"""
432 Le chemin de l'executable de R n'a pas été trouvé.
433 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
434 Si R n'est pas installé dans le répertoire par défaut
435 (C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
436 vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" % self.ConfigPath['path']
437             dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
438             dlg.CenterOnParent()
439             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
440                  evt.Veto()
441             else :
442                 print 'ok'
443         if sys.platform == 'darwin':
444             self.Rapp = self.PathPath.get('PATHS', 'rapp')
445             RappOk = CheckRapp(self.Rapp)
446         self.DataPop = False
447         self.DataTxt = False
448         self.Text = ''
449         self.sound = self.pref.getboolean('iramuteq', 'sound')
450         self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
451         self.version = ConfigGlob.get('DEFAULT', 'version')
452         self.lexique = None
453         self.corpus = None
454 ##############################################################@
455         self.DisEnSaveTabAs(False)
456         self.ShowMenu(_("View"), False)
457         self.ShowMenu(_("Spreadsheet analysis"), False)
458         self.ShowMenu(_("Text analysis"), False)
459    
460         self._mgr.Update()
461
462     def OnVerif(self, evt) :
463         pack = CheckRPackages(self)
464         if pack :
465             dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
466             dlg.CenterOnParent()
467             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
468                  evt.Veto()
469
470     #FIXME  marche pas sous mac ?
471     def DisEnSaveTabAs(self, DISEN):
472     #Disable SaveTabAs
473         file_menu = self.mb.GetMenu(0)
474         items = file_menu.GetMenuItems()
475         items[4].Enable(DISEN)
476     
477     def ShowMenu(self, menu, Show=True):
478         menu_pos = self.mb.FindMenu(menu)
479         self.mb.EnableTop(menu_pos, Show)
480         self.mb.UpdateMenus()
481
482
483 #--------------------------------------------------------------------
484     def OnClose(self, event):
485         print 'onclose'
486         with open(self.ConfigPath['path'], 'w') as f :
487             self.PathPath.write(f)
488         if self.DictTab != {} :
489             savestates = [self.DictTab[item][0] for item in self.DictTab]
490             if False in savestates :
491                 notsave = [item for item in self.DictTab if self.DictTab[item][0] == False] 
492                 msg = u"""
493  Certains résultats ne sont pas enregistrés.
494  Voulez-vous fermer quand même ?"""
495                 dlg = wx.MessageDialog(self, msg, "Sauvegarde",
496                        wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
497                 dlg.CenterOnParent()
498                 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
499                     event.Veto()
500                     dlg.Destroy()
501                 else:
502                     dlg.Destroy()
503                     for item in notsave :
504                         for tmpfile in self.DictTab[item][1:] :
505                             os.remove(tmpfile)
506                             print 'remove : ' + tmpfile
507                     self._mgr.UnInit()
508                     del self._mgr
509                     self.Destroy()
510             else :
511                 self._mgr.UnInit()
512                 del self._mgr
513                 self.Destroy()
514         else :
515             self._mgr.UnInit()
516             del self._mgr
517             self.Destroy()
518             ##FIXME
519             #if sys.platform == 'win32' :
520             #    os.system("taskkill /im iramuteq.exe /f")
521             #    print 'meurtre de process'
522
523     def OnOpenData(self, event):
524         inputname, self.input_path = OnOpen(self, "Data")
525         if inputname:
526             self.filename = self.input_path[0]
527             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
528             get_table_param(self, self.input_path[0])
529             self.tableau.make_content()
530             self.tableau.show_tab()
531
532     def OnOpenAnalyse(self, event):
533         self.AnalysePath = OnOpen(self, "Analyse")
534         OpenAnalyse(self, self.AnalysePath[1][0], True)
535         self.ShowMenu(_("View"))
536
537     def OnOpenText(self, event):
538         inputname, self.input_path = OnOpen(self, "Texte")
539         self.filename = self.input_path[0]
540         if inputname:
541              self.OpenText()
542    
543     def OnViewData(self, event):
544         print self.type
545         print self.DataTxt
546         if self.type == "Data":
547             if not self.DataPop :
548                 self.Sheet.Populate(self.content)
549                 self.DataPop = True
550                 self.DataTxt = False
551             self.ShowAPane(u"Data")
552         elif self.type == "Texte" or self.type == 'Analyse' :
553             if not self.DataTxt :
554                 self.text_ctrl_txt.Clear()
555                 self.text_ctrl_txt.write(self.content)
556                 self.text_ctrl_txt.ShowPosition(0)
557                 self.DataTxt = True
558                 self.DataPop = False
559             self.ShowAPane(u"Text")
560         self._mgr.Update()
561         
562     def OpenText(self):
563         #dial = EncodeDialog(self)
564         dlg = wx.ProgressDialog("Ouverture...",
565                                    "Veuillez patienter...",
566                                    maximum=2,
567                                    parent=self,
568                                    style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
569                                    )
570         
571         builder =  Builder(self, dlg)
572         if builder.res == wx.ID_OK :
573             corpus = builder.doanalyse()
574             self.history.add(corpus.parametres)
575             self.tree.OnItemAppend(corpus.parametres)
576             OpenAnalyse(self, corpus.parametres)
577         #self.content = DoConf().totext(corpus.parametres)
578 #        parametres = DoConf(os.path.join(UserConfigPath,'corpus.cfg')).getoptions('corpus')
579 #        parametres['originalpath'] = self.filename
580 #        
581 #        parametres['pathout'] = PathOut(self.filename, 'corpus').dirout
582 #        dial = CorpusPref(self, parametres)
583 #        dial.CenterOnParent()
584 #        dial.txtpath.SetLabel(self.filename)
585 #        res = dial.ShowModal()
586 #        parametres = dial.doparametres()
587 #        print parametres
588 #        ReadLexique(self, lang = parametres['lang'])
589 #        self.expressions = ReadDicoAsDico(self.DictPath.get(parametres['lang'], 'french_exp'))
590 #        corpus = BuildFromAlceste(self.filename, parametres, self.lexique, self.expressions).corpus
591         #self.corpus_encodage =  dial.encodages[dial.list_encodages.GetSelection()][0]
592         #self.corpus_lang = dial.langues[dial.choice_dict.GetSelection()]
593             count = 1
594             keepGoing = dlg.Update(count, u"Lecture du fichier")
595 #        try :
596 #            with codecs.open(self.filename, 'rU', self.corpus_encodage) as f:
597 #                self.content = f.read()
598 #            #self.content = self.content.replace('\r','\n')
599 #        except UnicodeDecodeError :
600 #            msg = u"Ce fichier ne semble pas être encodé en %s" % self.corpus_encodage
601 #            dial = wx.MessageDialog(self, msg, u"Problème d'encodage", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
602 #            dial.CenterOnParent()
603 #            res = dial.ShowModal()
604 #            dial.Destroy()
605 #            self.OpenText()
606             self.ShowMenu(_("View"))
607             self.ShowMenu(_("Text analysis"))
608             self.ShowMenu(_(u"Spreadsheet analysis"), False)
609             self.type = "Texte"
610             self.DataTxt = False
611             self.Text = ''
612             count += 1
613             keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
614         dlg.Destroy()
615         #self.OnViewData(wx.EVT_BUTTON)
616         
617     def OnExit(self, event):
618         self.Close()
619
620     def OnAbout(self, event):
621         info = wx.AboutDialogInfo()
622         info.Name = ConfigGlob.get('DEFAULT', 'name')
623         info.Version = ConfigGlob.get('DEFAULT', 'version')
624         info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
625         info.Description = u"""
626 Interface de R pour les Analyses Multidimensionnelles 
627 de Textes et de Questionnaires
628
629 Un logiciel libre
630 construit avec des logiciels libres.
631
632 Laboratoire LERASS
633
634 REPERE
635 """
636         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
637         dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
638         info.Developers = dev
639         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
640 suivant les termes de la Licence Publique Générale GNU telle que publiée 
641 par la Free Software Foundation ; soit la version 2 de cette licence, 
642 soit (à votre convenance) une version ultérieure.
643
644 Iramuteq est diffusé dans l'espoir qu'il sera utile, 
645 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite 
646 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER. 
647 Voyez la Licence Publique Générale GNU pour plus de détails.
648
649 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
650 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
651 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
652         wx.AboutBox(info)
653
654     def GetDockArt(self):
655         return self._mgr.GetArtProvider()
656
657     def DoUpdate(self):
658         self._mgr.Update()
659
660     def OnPageChanged(self, event) :
661         new = event.GetSelection()
662         nobject = event.GetEventObject()
663         parent = nobject.GetParent()
664         if isinstance(parent, IraFrame) :
665             npage = self.nb.GetPage(new)
666             self.tree.GiveFocus(uuid=npage.parametres['uuid'])
667
668     def OnCloseTab(self, evt):
669         log.info('Closing tab %s' % str(evt.GetEventObject()))
670         ctrl = evt.GetEventObject()
671         if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
672             notebook = True
673         else :
674             notebook = False
675         page = self.nb.GetPage(self.nb.GetSelection())
676         if 'parametres' in dir(page) :
677             self.history.rmtab(page.parametres)
678             self.tree.CloseItem(uuid = page.parametres['uuid'])
679         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
680         if self.DictTab != {} :
681             if TabTitle in self.DictTab :
682                 ListFile=self.DictTab[TabTitle]
683                 if False in ListFile:
684                     msg = u"""
685 Certains résultats ne sont pas enregistrer.
686 Voulez-vous fermer quand même ?"""
687                     dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
688
689                     dlg.CenterOnParent()
690                     if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
691                         remove = False
692                         evt.Veto()
693                         dlg.Destroy()
694                     else :
695                         for f in ListFile[1:] :
696                             print 'remove', f
697                             os.remove(f)
698                             remove = True
699                         dlg.Destroy()
700                 elif True in ListFile :
701                     remove = True
702                 if remove:
703                    del self.DictTab[TabTitle]
704             else : 
705                 self.LastTabClose()
706         else :
707             remove = True
708         if self.nb.GetPageCount() == 1 and remove and not notebook :
709             self.LastTabClose()
710
711     
712     def LastTabClose(self) :
713         if self.nb.GetPageCount() == 1 :
714             self.DisEnSaveTabAs(False)
715             if self.DataTxt :
716                 self.ShowAPane("Text")
717             elif self.DataPop :
718                 self.ShowAPane("Data")
719             else :
720                 self.ShowAPane("Intro_Text")
721
722     def OnSaveTabAs(self, event):
723         SelectTab = self.nb.GetSelection()
724         TabTitle = self.nb.GetPageText(SelectTab)
725         FileToSave = self.DictTab[TabTitle]
726         NewListFile = []
727         dlg = wx.FileDialog(
728             self, message="Enregistrer sous...", defaultDir=os.getcwd(),
729             defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
730             )
731         dlg.SetFilterIndex(2)
732         dlg.CenterOnParent()
733         
734         if dlg.ShowModal() == wx.ID_OK:
735             Path = dlg.GetPath()
736             Dirname = os.path.dirname(Path)
737             Filename = dlg.GetFilename()
738         else :
739             Path = False
740         dlg.Destroy()
741         if Path:
742             shutil.copyfile(FileToSave[-1], Path)
743             os.remove(FileToSave[len(FileToSave) - 1])
744             NewListFile.append(True)
745             NewListFile.append(Path)
746             for f in FileToSave[1:-1] :
747                 Fileout = os.path.join(Dirname, os.path.basename(f))
748                 shutil.copyfile(f, Fileout)
749                 NewListFile.append(Fileout)
750                 os.remove(f)
751             TabText = Filename
752             self.DictTab[TabText] = NewListFile
753             del self.DictTab[TabTitle]
754             self.nb.SetPageText(SelectTab, TabText)
755
756     def GetStartPosition(self):
757
758         self.x = self.x + 20
759         x = self.x
760         pt = self.ClientToScreen(wx.Point(0, 0))
761         
762         return wx.Point(pt.x + x, pt.y + x)
763     
764     def ShowAPane(self, panel):
765         for pane in self._mgr.GetAllPanes() :
766             if not pane.IsToolbar() and pane.name != 'lefttree': 
767                 pane.Hide()
768         self._mgr.GetPane(panel).Show()
769         self._mgr.Update()
770         
771     def OnAcceuil(self, event):
772         self.ShowAPane(u"Intro_Text")
773         event.Skip()
774     #???
775 #    def OnCreateTab(self, event):
776 #        if not self._mgr.GetPane("Tab_content").name == "Tab_content":
777 #            self._mgr.AddPane(self.CreateTabCtrl(), aui.AuiPaneInfo().
778 #                              Name("Tab_content").
779 #                              CenterPane())
780 #            self._mgr.GetPane("Intro_Text").Hide()
781 #            self._mgr.GetPane("Tab_content").Show()
782 #            self.ctrl.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
783 #        else :
784 #            page = wx.TextCtrl(self, -1, str(text), style=wx.TE_MULTILINE)
785 #            self.ctrl.AddPage(page, "qsdqsd")
786 #            self.ctrl.SetSelection(self.ctrl.GetPageCount() - 1)
787 #        self._mgr.Update()
788     
789     
790     def CreateHTMLCtrl(self):
791         ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
792         if "gtk2" in wx.PlatformInfo:
793             ctrl.SetStandardFonts()
794         ctrl.SetPage(u"text")        
795         return ctrl
796
797     def ShowTab(self, evt):
798         self.ShowAPane("Tab_content")
799
800 ################################################################
801 #debut des analyses
802 ################################################################
803
804     def OnFreq(self, event):
805         try:
806             Frequences(self) 
807         except:
808             BugReport(self)
809             
810     def OnChi2(self, event):
811         try:
812         #    print('PAS DE DEBUG SUR CHI2')
813             chi = ChiSquare(self)
814         except:
815             BugReport(self)
816     
817     def OnStudent(self, event):
818         try:
819             MakeStudent(self) 
820         except:
821             BugReport(self)
822
823     def OnRCode(self, event):
824         try:
825             InputText(self)
826         except:
827             BugReport(self)
828
829     def OnCHDSIM(self, event):
830         try:
831         #    print 'ATTENTION!!!!'
832             chdsim = ChdCluster(self)
833             if chdsim.val == wx.ID_OK:
834                 PlaySound(self)
835         except:
836             BugReport(self)
837  
838     def OnCHDAlceste(self, event):
839         try:
840          #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
841             self.quest = AnalyseQuest(self)
842             if self.quest.val == wx.ID_OK:
843                 PlaySound(self)
844         except:
845             BugReport(self)
846
847     def OnSimiTxt(self, evt) :
848         #    print 'PLUS DE BUG SUR SIMITXT'
849         try :
850             self.Text = SimiTxt(self)
851             if self.Text.val == wx.ID_OK :
852                 PlaySound(self)
853         except :
854             BugReport(self)
855     
856     def OnWordCloud(self, evt) :
857         #    print 'PLUS DE BUG SUR WORDCLOUD'
858         try :
859             self.Text = WordCloud(self)
860             if self.Text.val == wx.ID_OK :
861                 PlaySound(self)
862         except :
863             BugReport(self)
864
865
866     def OnAFCM(self, event):
867         try:
868             DoAFCM(self)
869         except:
870             BugReport(self)
871
872     def OnCheckcorpus(self, evt):
873         try :
874             checkcorpus(self)
875         except :
876             BugReport(self)
877
878     def OnTextStat(self, event, corpus = None):
879             print 'PAS DE BUG SUR TEXT STAT'
880         #try:
881             self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
882             
883             if self.Text.val == wx.ID_OK :
884                 PlaySound(self)
885         #except:
886         #    BugReport(self)
887         
888     def OnTextSpec(self, event, corpus = None):  
889         #try:
890             #self.Text = AsLexico(self)
891             print('ATTENTION : PLUS DE BUG SUR LEXICO')
892             self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
893             if self.Text.val == wx.ID_OK :
894                 PlaySound(self)
895         #except:
896         #    BugReport(self)
897     
898     def OnTextAfcm(self, event):
899         try:
900             AfcUci(self)
901             PlaySound(self)
902         except:
903             BugReport(self)
904
905     def import_factiva(self,event):
906         try :
907             ImportFactiva(self)
908         except :
909             BugReport(self)
910
911     def OnTextAlceste(self, event, corpus = None):
912         #try:
913             print('ATTENTION : PLUS DE BUG SUR ALCESTE')
914             #RunAnalyse(self, corpus, Alceste, OptAlceste)
915             self.Text = Alceste(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
916             #self.history.addtab(self.Text.parametres)
917             #OpenAnalyse(self, self.Text.parametres['ira'])
918             if self.Text.val == wx.ID_OK:
919                 PlaySound(self)
920         #except:
921         #    BugReport(self)
922
923     def OnPamSimple(self, event):
924         try:
925             self.Text = PamTxt(self)
926             if self.Text.val == wx.ID_OK:
927                 PlaySound(self)
928         except:
929             BugReport(self)
930     
931     def OnSimi(self,evt):
932         try :
933             #print 'ATTENTION !!!! VERGES'
934             self.res = DoSimi(self, param = None)
935             #self.res = Verges(self)
936             if self.res.val == wx.ID_OK :
937                  PlaySound(self)
938         except :
939             BugReport(self)
940 #################################################################
941
942     def OnHelp(self, event):
943         webbrowser.open('http://www.iramuteq.org/documentation')
944     
945     def OnPref(self, event):
946         dlg = PrefDialog(self)
947         dlg.CenterOnParent()
948         self.val = dlg.ShowModal()
949
950     def Upgrade(self) :
951         if self.check_update:
952             NewVersion(self)
953         else:
954             print 'pas de verif'    
955         #IsNew(self)
956         #CheckRPackages(self)
957
958     def OnOpenFromCmdl(self):
959         truepath = True
960         if options.filename :
961             if os.path.exists(options.filename):
962                 self.filename = os.path.abspath(options.filename)
963             else:
964                 truepath = False
965         elif args :
966             if os.path.exists(os.path.realpath(args[0])):
967                 self.filename = os.path.abspath(os.path.realpath(args[0]))
968             else:
969                 truepath = False
970         else:
971             pass
972         if truepath :
973             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
974                 self.tableau = Tableau(self, self.filename)
975                 get_table_param(self, self.filename)
976                 self.tableau.make_content()
977                 self.tableau.show_tab()
978                 #open_data(self, self.filename)
979             elif os.path.splitext(self.filename)[1] == '.txt':
980                 self.OpenText()
981             elif os.path.splitext(self.filename)[1] == '.ira' :
982                 #self.corpus = Corpus(self)
983                 #self.Text = OpenAnalyse(self, self.filename)
984                 OpenAnalyse(self, self.filename)
985         if not truepath:
986             print 'ce fichier n\'existe pas'
987             
988         
989
990 class IntroPanel(wx.Panel):
991     def __init__(self, parent):
992         wx.Panel.__init__(self, parent)
993         #col = randint(0, 100)
994         col = 0
995         bckgrdcolor = wx.Colour(col, col, col)
996         self.SetBackgroundColour(bckgrdcolor)
997         txtcolour = wx.Colour(250, 250, 250)
998         linkcolor = wx.Colour(255, 0, 0)
999         sizer1 = wx.BoxSizer(wx.VERTICAL)
1000         sizer2 = wx.BoxSizer(wx.VERTICAL)
1001         sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1002         sizer4 = wx.BoxSizer(wx.VERTICAL)
1003         sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1004         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1005         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1006         grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1007         PanelPres = wx.Panel(self)
1008         PanelPres.SetBackgroundColour(bckgrdcolor)
1009         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1010         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1011         label_1.SetForegroundColour(wx.RED)
1012         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1013         label2.SetForegroundColour(txtcolour)
1014         label2.SetBackgroundColour(bckgrdcolor)
1015         #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1016         #label3.SetForegroundColour(txtcolour)
1017         #label3.SetBackgroundColour(bckgrdcolor)
1018         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1019         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1020         self.hyper2.SetBackgroundColour(bckgrdcolor)
1021         self.hyper2.EnableRollover(True)
1022         self.hyper2.SetUnderlines(False, False, True)
1023         self.hyper2.SetBold(True)
1024         self.hyper2.UpdateLink()
1025         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1026         label_lerass.SetForegroundColour(txtcolour)
1027         label_lerass.SetBackgroundColour(bckgrdcolor)
1028         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1029         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1030         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1031         self.hyper_lerass.EnableRollover(True)
1032         self.hyper_lerass.SetUnderlines(False, False, True)
1033         self.hyper_lerass.SetBold(True)
1034         self.hyper_lerass.UpdateLink()
1035         blank = wx.StaticText(PanelPres, -1, u'\n')
1036         blank1 = wx.StaticText(PanelPres, -1, u'\n')
1037         labellicence = wx.StaticText(PanelPres, -1, u'Licence GNU GPL')
1038         labellicence.SetForegroundColour(txtcolour)
1039         labellicence.SetBackgroundColour(bckgrdcolor)
1040         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1041         labelcopy.SetForegroundColour(txtcolour)
1042         labelcopy.SetBackgroundColour(bckgrdcolor)
1043         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1044         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1045         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1046         but_python = wx.BitmapButton(self, -1, python_img)
1047         but_lexique = wx.BitmapButton(self, -1, lexique_img)
1048         but_r = wx.BitmapButton(self, -1, r_img)
1049         self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1050         self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1051         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1052         
1053         
1054         #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1055         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1056         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1057         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1058         sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1059         sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1060         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1061         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1062         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1063         sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1064         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1065         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1066         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1067         sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1068         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1069         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1070         sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1071         PanelPres.SetSizer(sizer2)
1072         sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1073         sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1074         sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1075         grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1076         grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1077         grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1078         
1079         sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1080         sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1081         self.SetSizer(sizer1)
1082         sizer1.Fit(self)
1083     
1084     def OnPython(self,evt):
1085         webbrowser.open('http://www.python.org')
1086     
1087     def OnLexique(self,evt):
1088         webbrowser.open('http://www.lexique.org')
1089         
1090     def OnR(self,evt):
1091         webbrowser.open('http://www.r-project.org')
1092
1093 class MySplashScreen(wx.SplashScreen):
1094     def __init__(self):
1095         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1096         wx.SplashScreen.__init__(self, bmp,
1097                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1098                                  3000, None, -1)
1099         self.Bind(wx.EVT_CLOSE, self.OnClose)
1100         self.fc = wx.FutureCall(1500, self.ShowMain)
1101
1102     def OnClose(self, evt):
1103         evt.Skip()
1104         self.Hide()
1105         
1106         if self.fc.IsRunning():
1107             self.fc.Stop()
1108             self.ShowMain()
1109
1110     def ShowMain(self):
1111         frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(950, 650))
1112         frame.Show()
1113         frame.Upgrade()
1114         frame.OnOpenFromCmdl()
1115 #        if self.fc.IsRunning():
1116 #            self.Raise()
1117         #wx.CallAfter(frame.ShowTip)
1118         
1119 class MyApp(wx.App):
1120     def OnInit(self):
1121         """
1122         Create and show the splash screen.  It will then create and show
1123         the main frame when it is time to do so.
1124         """
1125
1126         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1127         self.SetAppName("Iramuteq")       
1128         splash = MySplashScreen()
1129         splash.Show()
1130         return True
1131
1132 def main():
1133     app = MyApp(False)
1134     app.MainLoop()
1135
1136 if __name__ == '__main__':
1137     __name__ = 'Main'
1138     main()