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