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