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