locale under Mac OS X
[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 AnalysePam
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
109 #chemin de l'application
110 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
111 #chemin des images
112 ImagePath = os.path.join(AppliPath, 'images')
113 #configuration generale
114 DictConfigPath = ConstructGlobalPath(AppliPath)
115 ConfigGlob = ConfigParser()
116 ConfigGlob.read(DictConfigPath['global'])
117 #repertoire de l'utilisateur
118 if os.getenv('HOME') != None:
119     user_home = os.getenv('HOME')
120 else:
121     user_home = os.getenv('HOMEPATH')
122 UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
123 #Si pas de fichiers de config utilisateur, on cree le repertoire
124 CreateIraDirectory(UserConfigPath, AppliPath)
125 #fichiers log pour windows (py2exe)
126 log = logging.getLogger('iramuteq')
127 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
128 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
129 fh.setFormatter(formatter)
130 log.addHandler(fh)
131 if sys.platform != 'win32' and sys.platform != 'darwin':
132     ch = logging.StreamHandler()
133     ch.setFormatter(formatter)
134     log.addHandler(ch)
135 log.setLevel(logging.INFO)
136
137 class writer(object):
138     def write(self, data):
139         if data.strip() != '' :
140             log.info('ERROR : %s' % data)
141
142 class printer(object) :
143     def write(self, data) :
144         if data.strip() != '' :
145             log.info('Print : %s' % data)
146
147 sys.stderr = writer()
148 sys.stdout = printer()
149
150 ConfigPath = ConstructConfigPath(UserConfigPath)
151
152 langues = {'french' : wx.LANGUAGE_FRENCH,
153             'english' : wx.LANGUAGE_ENGLISH,}
154 #####################################################################
155
156 class IraFrame(wx.Frame):
157     def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
158                  size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | 
159                                             wx.SUNKEN_BORDER | 
160                                             wx.CLIP_CHILDREN):
161         log.info('Starting...')
162         wx.Frame.__init__(self, parent, id, title, pos, size, style)
163         #configuration
164         self.AppliPath = AppliPath
165         self.images_path = os.path.join(AppliPath,'images')
166         self.UserConfigPath = UserConfigPath
167         self.RscriptsPath = ConstructRscriptsPath(AppliPath)
168         #self.DictPath = ConstructDicoPath(AppliPath)
169         self.DictPath = ConstructDicoPath(UserConfigPath)
170         self.ConfigGlob = ConfigGlob
171         self.ConfigPath = ConstructConfigPath(UserConfigPath)
172         self.pref = RawConfigParser()
173         #workaround for import problem
174         self.SimiFromCluster = SimiFromCluster
175         #langues
176         gettext.install('iramuteq',  os.path.join(AppliPath,'locale'), unicode=True)
177         self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
178         self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
179         self.setlangue()
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").decode('utf8'), _(u"Open a matrix").decode('utf8'))
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").decode('utf8'), _(u"Open a text corpora").decode('utf8'))
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").decode('utf8'), _(u"Open an analysis").decode('utf8'))
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").decode('utf8'))
205         fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
206         fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
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").decode('utf8'))
214         extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
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...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
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').decode('utf8'))
230         
231         view_menu = wx.Menu()
232         view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
233         view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
234         view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
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 GNEPA")
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 GNEPA")
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").decode('utf8'))
268         self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
269         self.mb.Append(view_menu, _(u"View").decode('utf8'))
270         self.mb.Append(analyse_menu, _("Spreadsheet analysis").decode('utf8'))
271         self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
272         self.mb.Append(help_menu, _(u"Help").decode('utf8'))
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 ##############################################################@
425         self.DisEnSaveTabAs(False)
426         self.ShowMenu(_("View"), False)
427         self.ShowMenu(_("Spreadsheet analysis"), False)
428         self.ShowMenu(_("Text analysis"), False)
429    
430         self._mgr.Update()
431
432         self.DataPop = False
433         self.DataTxt = False
434         self.Text = ''
435
436         self.lexique = None
437         self.corpus = None
438
439     def finish_init(self) :
440         try :
441             self.pref.read(self.ConfigPath['preferences'])
442             if IsNew(self) :
443                 UpgradeConf(self)
444                 self.pref.read(self.ConfigPath['preferences'])
445                 New = True
446             else :
447                 CopyConf(self)
448                 New = False
449         except :
450             UpgradeConf(self)
451             self.pref.read(self.ConfigPath['preferences'])
452             New = True
453         self.sound = self.pref.getboolean('iramuteq', 'sound')
454         self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
455         self.version = ConfigGlob.get('DEFAULT', 'version')
456         #configuration des chemins de R
457         self.PathPath = ConfigParser()
458         self.PathPath.read(ConfigPath['path'])
459         BestRPath = False
460         if not CheckRPath(self.PathPath) :
461             if sys.platform == 'win32':
462                 BestRPath = FindRPAthWin32()
463             else:
464                 BestRPath = FindRPathNix()
465             if BestRPath:
466                 self.PathPath.set('PATHS', 'rpath', BestRPath)
467                 with open(ConfigPath['path'], 'w') as f :
468                     self.PathPath.write(f)
469         else:
470             BestRPath = True 
471         if BestRPath :
472             self.RPath = self.PathPath.get('PATHS', 'rpath')
473             if New :
474                 CheckRPackages(self)
475             if not RLibsAreInstalled(self) :
476                 CheckRPackages(self)
477         else :
478             msg = u"""
479 Le chemin de l'executable de R n'a pas Ã©té trouvé.
480 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
481 Si R n'est pas installé dans le répertoire par défaut
482 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
483 vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" 
484             dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
485             dlg.CenterOnParent()
486             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
487                  evt.Veto()
488             dlg.Destroy()
489
490
491     def setlangue(self) :
492         try :
493             self.pref.read(self.ConfigPath['preferences'])
494             guilangue = self.pref.get('iramuteq', 'guilanguage')
495             if guilangue == 'french' :
496                 self.presLan_fr.install()
497             else :
498                 self.presLan_en.install()
499             mylocale = wx.Locale(langues[guilangue])
500             mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
501             mylocale.AddCatalog('iramuteq')
502         except :
503             self.presLan_fr.install()
504             mylocale = wx.Locale(langues['french'])
505             mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
506             mylocale.AddCatalog('iramuteq')
507
508
509     def OnVerif(self, evt) :
510         pack = CheckRPackages(self)
511         if pack :
512             dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
513             dlg.CenterOnParent()
514             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
515                  evt.Veto()
516
517     def DisEnSaveTabAs(self, DISEN):
518     #Disable SaveTabAs
519         file_menu = self.mb.GetMenu(0)
520         items = file_menu.GetMenuItems()
521         for item in items :
522             if item.GetId() == ID_SaveTab :
523                 item.Enable(DISEN)
524     
525     def ShowMenu(self, menu, Show=True):
526         menu_pos = self.mb.FindMenu(menu)
527         self.mb.EnableTop(menu_pos, Show)
528         self.mb.UpdateMenus()
529
530
531 #--------------------------------------------------------------------
532     def OnClose(self, event):
533         print 'onclose'
534         with open(self.ConfigPath['path'], 'w') as f :
535             self.PathPath.write(f)
536         if self.DictTab != {} :
537             savestates = [self.DictTab[item][0] for item in self.DictTab]
538             if False in savestates :
539                 notsave = [item for item in self.DictTab if self.DictTab[item][0] == False] 
540                 msg = u"""
541  Certains résultats ne sont pas enregistrés.
542  Voulez-vous fermer quand même ?"""
543                 dlg = wx.MessageDialog(self, msg, "Sauvegarde",
544                        wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
545                 dlg.CenterOnParent()
546                 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
547                     event.Veto()
548                     dlg.Destroy()
549                 else:
550                     dlg.Destroy()
551                     for item in notsave :
552                         for tmpfile in self.DictTab[item][1:] :
553                             os.remove(tmpfile)
554                             print 'remove : ' + tmpfile
555                     self._mgr.UnInit()
556                     del self._mgr
557                     self.Destroy()
558             else :
559                 self._mgr.UnInit()
560                 del self._mgr
561                 self.Destroy()
562         else :
563             self._mgr.UnInit()
564             del self._mgr
565             self.Destroy()
566             #if sys.platform == 'win32' :
567             #    os.system("taskkill /im iramuteq.exe /f")
568             #    print 'meurtre de process'
569
570     def OnOpenData(self, event):
571         inputname, self.input_path = OnOpen(self, "Data")
572         if inputname:
573             self.filename = self.input_path[0]
574             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
575             get_table_param(self, self.input_path[0])
576             self.tableau.make_content()
577             self.tableau.show_tab()
578
579     def OnOpenAnalyse(self, event):
580         self.AnalysePath = OnOpen(self, "Analyse")
581         OpenAnalyse(self, self.AnalysePath[1][0], True)
582         self.ShowMenu(_("View"))
583
584     def OnOpenText(self, event):
585         inputname, self.input_path = OnOpen(self, "Texte")
586         self.filename = self.input_path[0]
587         if inputname:
588              self.OpenText()
589    
590     def OnViewData(self, event):
591         print self.type
592         print self.DataTxt
593         if self.type == "Data":
594             if not self.DataPop :
595                 self.Sheet.Populate(self.content)
596                 self.DataPop = True
597                 self.DataTxt = False
598             self.ShowAPane(u"Data")
599         elif self.type == "Texte" or self.type == 'Analyse' :
600             if not self.DataTxt :
601                 self.text_ctrl_txt.Clear()
602                 self.text_ctrl_txt.write(self.content)
603                 self.text_ctrl_txt.ShowPosition(0)
604                 self.DataTxt = True
605                 self.DataPop = False
606             self.ShowAPane(u"Text")
607         self._mgr.Update()
608         
609     def OpenText(self):
610         #dial = EncodeDialog(self)
611         dlg = wx.ProgressDialog("Ouverture...",
612                                    "Veuillez patienter...",
613                                    maximum=2,
614                                    parent=self,
615                                    style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
616                                    )
617         
618         builder =  Builder(self, dlg)
619         if builder.res == wx.ID_OK :
620             try :
621                 corpus = builder.doanalyse()
622                 self.history.add(corpus.parametres)
623                 self.tree.OnItemAppend(corpus.parametres)
624                 OpenAnalyse(self, corpus.parametres)
625             except :
626                 BugReport(self)
627         #self.content = DoConf().totext(corpus.parametres)
628 #        parametres = DoConf(os.path.join(UserConfigPath,'corpus.cfg')).getoptions('corpus')
629 #        parametres['originalpath'] = self.filename
630 #        
631 #        parametres['pathout'] = PathOut(self.filename, 'corpus').dirout
632 #        dial = CorpusPref(self, parametres)
633 #        dial.CenterOnParent()
634 #        dial.txtpath.SetLabel(self.filename)
635 #        res = dial.ShowModal()
636 #        parametres = dial.doparametres()
637 #        print parametres
638 #        ReadLexique(self, lang = parametres['lang'])
639 #        self.expressions = ReadDicoAsDico(self.DictPath.get(parametres['lang'], 'french_exp'))
640 #        corpus = BuildFromAlceste(self.filename, parametres, self.lexique, self.expressions).corpus
641         #self.corpus_encodage =  dial.encodages[dial.list_encodages.GetSelection()][0]
642         #self.corpus_lang = dial.langues[dial.choice_dict.GetSelection()]
643             else :
644                 count = 1
645                 keepGoing = dlg.Update(count, u"Lecture du fichier")
646     #            msg = u"Ce fichier ne semble pas Ãªtre encodé en %s" % self.corpus_encodage
647     #            dial = wx.MessageDialog(self, msg, u"Problème d'encodage", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
648     #            dial.CenterOnParent()
649     #            res = dial.ShowModal()
650     #            dial.Destroy()
651     #            self.OpenText()
652                 self.ShowMenu(_("View"))
653                 self.ShowMenu(_("Text analysis"))
654                 self.ShowMenu(_(u"Spreadsheet analysis"), False)
655                 self.type = "Texte"
656                 self.DataTxt = False
657                 self.Text = ''
658                 count += 1
659                 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
660                 dlg.Destroy()
661         #self.OnViewData(wx.EVT_BUTTON)
662         
663     def OnExit(self, event):
664         self.Close()
665
666     def OnAbout(self, event):
667         info = wx.AboutDialogInfo()
668         info.Name = ConfigGlob.get('DEFAULT', 'name')
669         info.Version = ConfigGlob.get('DEFAULT', 'version')
670         info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
671         info.Description = u"""
672 Interface de R pour les Analyses Multidimensionnelles 
673 de Textes et de Questionnaires
674
675 Un logiciel libre
676 construit avec des logiciels libres.
677
678 Laboratoire LERASS
679
680 REPERE
681 """
682         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
683         dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
684         info.Developers = dev
685         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
686 suivant les termes de la Licence Publique Générale GNU telle que publiée 
687 par la Free Software Foundation ; soit la version 2 de cette licence, 
688 soit (à votre convenance) une version ultérieure.
689
690 Iramuteq est diffusé dans l'espoir qu'il sera utile, 
691 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite 
692 de COMMERCIALISATION ou d'ADÉQUATION Ã€ UN USAGE PARTICULIER. 
693 Voyez la Licence Publique Générale GNU pour plus de détails.
694
695 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
696 avec Iramuteq ; sinon, veuillez Ã©crire Ã  la Free Software Foundation,
697 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, Ã‰tats-Unis."""
698         wx.AboutBox(info)
699
700     def GetDockArt(self):
701         return self._mgr.GetArtProvider()
702
703     def DoUpdate(self):
704         self._mgr.Update()
705
706     def OnPageChanged(self, event) :
707         new = event.GetSelection()
708         nobject = event.GetEventObject()
709         parent = nobject.GetParent()
710         if isinstance(parent, IraFrame) :
711             npage = self.nb.GetPage(new)
712             if 'parametres' in dir(npage) :
713                 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
714
715     def OnCloseTab(self, evt):
716         #log.info('Closing tab %s' % str(evt.GetEventObject()))
717         ctrl = evt.GetEventObject()
718         if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
719             notebook = True
720         else :
721             notebook = False
722         page = self.nb.GetPage(self.nb.GetSelection())
723         if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
724             self.history.rmtab(page.parametres)
725             self.tree.CloseItem(uuid = page.parametres['uuid'])
726         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
727         if self.DictTab != {} :
728             if TabTitle in self.DictTab :
729                 ListFile=self.DictTab[TabTitle]
730                 if False in ListFile:
731                     msg = u"""
732 Certains résultats ne sont pas enregistrer.
733 Voulez-vous fermer quand même ?"""
734                     dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
735
736                     dlg.CenterOnParent()
737                     if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
738                         remove = False
739                         evt.Veto()
740                         dlg.Destroy()
741                     else :
742                         for f in ListFile[1:] :
743                             print 'remove', f
744                             os.remove(f)
745                             remove = True
746                         dlg.Destroy()
747                 elif True in ListFile :
748                     remove = True
749                 if remove:
750                    del self.DictTab[TabTitle]
751             else : 
752                 self.LastTabClose()
753         else :
754             remove = True
755         if self.nb.GetPageCount() == 1 and remove and not notebook :
756             self.LastTabClose()
757     
758     def LastTabClose(self) :
759         if self.nb.GetPageCount() == 1 :
760             self.DisEnSaveTabAs(False)
761             if self.DataTxt :
762                 self.ShowAPane("Text")
763             elif self.DataPop :
764                 self.ShowAPane("Data")
765             else :
766                 self.ShowAPane("Intro_Text")
767
768     def OnSaveTabAs(self, event):
769         SelectTab = self.nb.GetSelection()
770         TabTitle = self.nb.GetPageText(SelectTab)
771         FileToSave = self.DictTab[TabTitle]
772         NewListFile = []
773         dlg = wx.FileDialog(
774             self, message="Enregistrer sous...", defaultDir=os.getcwd(),
775             defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
776             )
777         dlg.SetFilterIndex(2)
778         dlg.CenterOnParent()
779         
780         if dlg.ShowModal() == wx.ID_OK:
781             Path = dlg.GetPath()
782             Dirname = os.path.dirname(Path)
783             Filename = dlg.GetFilename()
784         else :
785             Path = False
786         dlg.Destroy()
787         if Path:
788             shutil.copyfile(FileToSave[-1], Path)
789             os.remove(FileToSave[len(FileToSave) - 1])
790             NewListFile.append(True)
791             NewListFile.append(Path)
792             for f in FileToSave[1:-1] :
793                 Fileout = os.path.join(Dirname, os.path.basename(f))
794                 shutil.copyfile(f, Fileout)
795                 NewListFile.append(Fileout)
796                 os.remove(f)
797             TabText = Filename
798             self.DictTab[TabText] = NewListFile
799             del self.DictTab[TabTitle]
800             self.nb.SetPageText(SelectTab, TabText)
801
802     def GetStartPosition(self):
803
804         self.x = self.x + 20
805         x = self.x
806         pt = self.ClientToScreen(wx.Point(0, 0))
807         
808         return wx.Point(pt.x + x, pt.y + x)
809     
810     def ShowAPane(self, panel):
811         for pane in self._mgr.GetAllPanes() :
812             if not pane.IsToolbar() and pane.name != 'lefttree': 
813                 pane.Hide()
814         self._mgr.GetPane(panel).Show()
815         self._mgr.Update()
816         
817     def OnAcceuil(self, event):
818         self.ShowAPane(u"Intro_Text")
819         event.Skip()
820     
821     def CreateHTMLCtrl(self):
822         ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
823         if "gtk2" in wx.PlatformInfo:
824             ctrl.SetStandardFonts()
825         ctrl.SetPage(u"text")        
826         return ctrl
827
828     def ShowTab(self, evt):
829         self.ShowAPane("Tab_content")
830
831 ################################################################
832 #debut des analyses
833 ################################################################
834
835     def OnFreq(self, event):
836         try:
837             Frequences(self) 
838         except:
839             BugReport(self)
840             
841     def OnChi2(self, event):
842         try:
843         #    print('PAS DE DEBUG SUR CHI2')
844             chi = ChiSquare(self)
845         except:
846             BugReport(self)
847     
848     def OnStudent(self, event):
849         try:
850             MakeStudent(self) 
851         except:
852             BugReport(self)
853
854     def OnRCode(self, event):
855         try:
856             InputText(self)
857         except:
858             BugReport(self)
859
860     def OnCHDSIM(self, event):
861         try:
862         #    print 'ATTENTION!!!!'
863             chdsim = ChdCluster(self)
864             if chdsim.val == wx.ID_OK:
865                 PlaySound(self)
866         except:
867             BugReport(self)
868  
869     def OnCHDAlceste(self, event):
870         try:
871          #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
872             self.quest = AnalyseQuest(self)
873             if self.quest.val == wx.ID_OK:
874                 PlaySound(self)
875         except:
876             BugReport(self)
877
878     def OnSimiTxt(self, evt, corpus = None) :
879         #    print 'PLUS DE BUG SUR SIMITXT'
880         try :
881             #self.Text = SimiTxt(self)
882             if corpus is None :
883                 corpus = self.tree.getcorpus()            
884             self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
885             if self.Text.val == wx.ID_OK :
886                 PlaySound(self)
887         except :
888             BugReport(self)
889     
890     def OnWordCloud(self, evt, corpus = None) :
891         #    print 'PLUS DE BUG SUR WORDCLOUD'
892         try :
893             if corpus is None :
894                 corpus = self.tree.getcorpus()            
895             self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = progressbar(self, 3))
896             if self.Text.val == wx.ID_OK :
897                 PlaySound(self)
898         except :
899             BugReport(self)
900
901
902     def OnAFCM(self, event):
903         try:
904             DoAFCM(self)
905         except:
906             BugReport(self)
907
908 #    def OnCheckcorpus(self, evt):
909 #        try :
910 #            checkcorpus(self)
911 #        except :
912 #            BugReport(self)
913
914     def OnTextStat(self, event, corpus = None):
915             #print 'PAS DE BUG SUR TEXT STAT'
916         try:
917             if corpus is None :
918                 corpus = self.tree.getcorpus()
919             self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
920             
921             if self.Text.val == wx.ID_OK :
922                 PlaySound(self)
923         except:
924             BugReport(self)
925         
926     def OnTextSpec(self, event, corpus = None):  
927         try:
928             #self.Text = AsLexico(self)
929             #print('ATTENTION : PLUS DE BUG SUR LEXICO')
930             if corpus is None :
931                 corpus = self.tree.getcorpus()
932             self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
933             if self.Text.val == wx.ID_OK :
934                 PlaySound(self)
935         except:
936             BugReport(self)
937     
938     def OnTextAfcm(self, event):
939         try:
940             AfcUci(self)
941             PlaySound(self)
942         except:
943             BugReport(self)
944
945     def import_factiva_xml(self,event):
946         try :
947             ImportFactiva(self, 'xml')
948         except :
949             BugReport(self)
950
951     def import_factiva_mail(self, evt) :
952         try :
953             ImportFactiva(self, 'mail')
954         except :
955             BugReport(self)
956
957     def import_factiva_txt(self, evt) :
958         try :
959             ImportFactiva(self, 'txt')
960         except :
961             BugReport(self)
962
963     def ExtractTools(self, evt) :
964         ID = evt.GetId()
965         if ID == self.ID_splitvar :
966             Extract(self, 'splitvar')
967         else :
968             Extract(self, 'mods')
969
970     def OnTextAlceste(self, event, corpus = None):
971         try:
972             #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
973             #RunAnalyse(self, corpus, Alceste, OptAlceste)
974             if corpus is None :
975                 corpus = self.tree.getcorpus()            
976             self.Text = Alceste(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
977             if self.Text.val == wx.ID_OK:
978                 PlaySound(self)
979         except:
980             BugReport(self)
981
982     def OnPamSimple(self, event, corpus = None):
983         try:
984             if corpus is None :
985                 corpus = self.tree.getcorpus()
986             self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
987             if self.Text.val == wx.ID_OK:
988                 PlaySound(self)
989         except:
990             BugReport(self)
991
992     def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
993         DoSimi(self, param = parametres, fromprof =  fromprof, pathout = pathout, listactives = listactives, actives = actives, tableau = tableau)
994     
995     def OnSimi(self,evt):
996         try :
997             #print 'ATTENTION !!!! VERGES'
998             #print 'PLUS DE BUG SUR SIMI'
999             self.res = DoSimi(self, param = None)
1000             #self.res = Verges(self)
1001             if self.res.val == wx.ID_OK :
1002                  PlaySound(self)
1003         except :
1004             BugReport(self)
1005 #################################################################
1006
1007     def OnHelp(self, event):
1008         webbrowser.open('http://www.iramuteq.org/documentation')
1009     
1010     def OnPref(self, event):
1011         dlg = PrefDialog(self)
1012         dlg.CenterOnParent()
1013         self.val = dlg.ShowModal()
1014
1015     def Upgrade(self) :
1016         if self.check_update:
1017             NewVersion(self)
1018         else:
1019             print 'pas de verif'    
1020         #IsNew(self)
1021         #CheckRPackages(self)
1022
1023     def OnOpenFromCmdl(self):
1024         truepath = True
1025         if options.filename :
1026             if os.path.exists(options.filename):
1027                 self.filename = os.path.abspath(options.filename)
1028             else:
1029                 truepath = False
1030         elif args :
1031             if os.path.exists(os.path.realpath(args[0])):
1032                 self.filename = os.path.abspath(os.path.realpath(args[0]))
1033             else:
1034                 truepath = False
1035         else:
1036             pass
1037         if truepath :
1038             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1039                 self.tableau = Tableau(self, self.filename)
1040                 get_table_param(self, self.filename)
1041                 self.tableau.make_content()
1042                 self.tableau.show_tab()
1043                 #open_data(self, self.filename)
1044             elif os.path.splitext(self.filename)[1] == '.txt':
1045                 self.OpenText()
1046             elif os.path.splitext(self.filename)[1] == '.ira' :
1047                 #self.corpus = Corpus(self)
1048                 #self.Text = OpenAnalyse(self, self.filename)
1049                 OpenAnalyse(self, self.filename)
1050         if not truepath:
1051             print 'ce fichier n\'existe pas'
1052             
1053         
1054
1055 class IntroPanel(wx.Panel):
1056     def __init__(self, parent):
1057         wx.Panel.__init__(self, parent)
1058         #col = randint(0, 255)
1059         #col1 = randint(0,255)
1060         #col2 = randint(0,255)
1061         col = 0
1062         bckgrdcolor = wx.Colour(col, col, col)
1063         self.SetBackgroundColour(bckgrdcolor)
1064         txtcolour = wx.Colour(250, 250, 250)
1065         linkcolor = wx.Colour(255, 0, 0)
1066         sizer1 = wx.BoxSizer(wx.VERTICAL)
1067         sizer2 = wx.BoxSizer(wx.VERTICAL)
1068         sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1069         sizer4 = wx.BoxSizer(wx.VERTICAL)
1070         sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1071         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1072         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1073         grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1074         PanelPres = wx.Panel(self)
1075         PanelPres.SetBackgroundColour(bckgrdcolor)
1076         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1077         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1078         label_1.SetForegroundColour(wx.RED)
1079         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1080         label2.SetForegroundColour(txtcolour)
1081         label2.SetBackgroundColour(bckgrdcolor)
1082         #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1083         #label3.SetForegroundColour(txtcolour)
1084         #label3.SetBackgroundColour(bckgrdcolor)
1085         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1086         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1087         self.hyper2.SetBackgroundColour(bckgrdcolor)
1088         self.hyper2.EnableRollover(True)
1089         self.hyper2.SetUnderlines(False, False, True)
1090         self.hyper2.SetBold(True)
1091         self.hyper2.UpdateLink()
1092         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1093         label_lerass.SetForegroundColour(txtcolour)
1094         label_lerass.SetBackgroundColour(bckgrdcolor)
1095         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1096         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1097         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1098         self.hyper_lerass.EnableRollover(True)
1099         self.hyper_lerass.SetUnderlines(False, False, True)
1100         self.hyper_lerass.SetBold(True)
1101         self.hyper_lerass.UpdateLink()
1102         blank = wx.StaticText(PanelPres, -1, u'\n')
1103         blank1 = wx.StaticText(PanelPres, -1, u'\n')
1104         labellicence = wx.StaticText(PanelPres, -1, u'Licence GNU GPL')
1105         labellicence.SetForegroundColour(txtcolour)
1106         labellicence.SetBackgroundColour(bckgrdcolor)
1107         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1108         labelcopy.SetForegroundColour(txtcolour)
1109         labelcopy.SetBackgroundColour(bckgrdcolor)
1110         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1111         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1112         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1113         but_python = wx.BitmapButton(self, -1, python_img)
1114         but_lexique = wx.BitmapButton(self, -1, lexique_img)
1115         but_r = wx.BitmapButton(self, -1, r_img)
1116         self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1117         self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1118         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1119         
1120         
1121         #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1122         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1123         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1124         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1125         sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1126         sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1127         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1128         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1129         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1130         sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1131         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1132         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1133         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1134         sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1135         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1136         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1137         sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1138         PanelPres.SetSizer(sizer2)
1139         sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1140         sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1141         sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1142         grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1143         grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1144         grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1145         
1146         sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1147         sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1148         self.SetSizer(sizer1)
1149         sizer1.Fit(self)
1150     
1151     def OnPython(self,evt):
1152         webbrowser.open('http://www.python.org')
1153     
1154     def OnLexique(self,evt):
1155         webbrowser.open('http://www.lexique.org')
1156         
1157     def OnR(self,evt):
1158         webbrowser.open('http://www.r-project.org')
1159
1160 class MySplashScreen(wx.SplashScreen):
1161     def __init__(self):
1162         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1163         wx.SplashScreen.__init__(self, bmp,
1164                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1165                                  2000, None, -1)
1166         self.Bind(wx.EVT_CLOSE, self.OnClose)
1167         self.fc = wx.FutureCall(1, self.ShowMain)
1168
1169     def OnClose(self, evt):
1170         evt.Skip()
1171         self.Hide()
1172         
1173         if self.fc.IsRunning():
1174             self.fc.Stop()
1175             self.ShowMain()
1176
1177     def ShowMain(self):
1178         frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(1100, 800))
1179         frame.Show()
1180         frame.finish_init()
1181         frame.Upgrade()
1182         frame.OnOpenFromCmdl()
1183 #        if self.fc.IsRunning():
1184 #            self.Raise()
1185         #wx.CallAfter(frame.ShowTip)
1186         
1187 class MyApp(wx.App):
1188     def OnInit(self):
1189         """
1190         Create and show the splash screen.  It will then create and show
1191         the main frame when it is time to do so.
1192         """
1193         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1194         self.SetAppName("Iramuteq")       
1195         splash = MySplashScreen()
1196         splash.Show()
1197         return True
1198
1199 def main():
1200     app = MyApp(False)
1201     app.MainLoop()
1202
1203 if __name__ == '__main__':
1204     __name__ = 'Main'
1205     main()