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