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