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