...
[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         dlg.Destroy()
1154
1155     def Upgrade(self) :
1156         if self.check_update:
1157             NewVersion(self)
1158         else:
1159             print 'pas de verif'    
1160         #IsNew(self)
1161         #CheckRPackages(self)
1162
1163     def OnOpenFromCmdl(self):
1164         truepath = True
1165         if options.filename :
1166             if os.path.exists(options.filename):
1167                 self.filename = os.path.abspath(options.filename)
1168             else:
1169                 truepath = False
1170         elif args :
1171             if os.path.exists(os.path.realpath(args[0])):
1172                 self.filename = os.path.abspath(os.path.realpath(args[0]))
1173             else:
1174                 truepath = False
1175         else:
1176             pass
1177         if truepath :
1178             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1179                 self.tableau = Tableau(self, self.filename)
1180                 val = get_table_param(self, self.filename)
1181                 if val == wx.ID_OK :
1182                     self.tableau.make_content()
1183                     OpenAnalyse(self, self.tableau.parametres)
1184                     self.tree.OnItemAppend(self.tableau.parametres)
1185                 #get_table_param(self, self.filename)
1186                 #self.tableau.make_content()
1187                 #self.tableau.show_tab()
1188                 #open_data(self, self.filename)
1189             elif os.path.splitext(self.filename)[1] == '.txt':
1190                 self.OpenText()
1191             elif os.path.splitext(self.filename)[1] == '.ira' :
1192                 #self.corpus = Corpus(self)
1193                 #self.Text = OpenAnalyse(self, self.filename)
1194                 OpenAnalyse(self, self.filename)
1195         if not truepath:
1196             print 'ce fichier n\'existe pas'
1197             
1198         
1199
1200 class IntroPanel(wx.Panel):
1201     def __init__(self, parent):
1202         wx.Panel.__init__(self, parent)
1203         col = randint(0, 255)
1204         col1 = randint(0,255)
1205         col2 = randint(0,255)
1206         #col = 57
1207         bckgrdcolor = wx.Colour(col, col1, col2)
1208         self.SetBackgroundColour(bckgrdcolor)
1209         txtcolour = wx.Colour(250, 250, 250)
1210         linkcolor = wx.Colour(255, 0, 0)
1211         sizer1 = wx.BoxSizer(wx.VERTICAL)
1212         sizer2 = wx.BoxSizer(wx.VERTICAL)
1213         sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1214         sizer4 = wx.BoxSizer(wx.HORIZONTAL)
1215         sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1216         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1217         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1218         grid_sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
1219         PanelPres = wx.Panel(self)
1220         bckgrdcolor = wx.Colour(randint(0, 255), randint(0, 255), randint(0, 255))
1221         PanelPres.SetBackgroundColour(bckgrdcolor)
1222         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1223         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1224         label_1.SetForegroundColour(wx.RED)
1225         iraicone = wx.Image(os.path.join(ImagePath,'iraicone248x248.png'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1226         but_ira = wx.StaticBitmap(self, -1, bitmap = iraicone)
1227         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1228         label2.SetForegroundColour(txtcolour)
1229         label2.SetBackgroundColour(bckgrdcolor)
1230         #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1231         #label3.SetForegroundColour(txtcolour)
1232         #label3.SetBackgroundColour(bckgrdcolor)
1233         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1234         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1235         self.hyper2.SetBackgroundColour(bckgrdcolor)
1236         self.hyper2.EnableRollover(True)
1237         self.hyper2.SetUnderlines(False, False, True)
1238         self.hyper2.SetBold(True)
1239         self.hyper2.UpdateLink()
1240         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1241         label_lerass.SetForegroundColour(txtcolour)
1242         label_lerass.SetBackgroundColour(bckgrdcolor)
1243         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1244         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1245         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1246         self.hyper_lerass.EnableRollover(True)
1247         self.hyper_lerass.SetUnderlines(False, False, True)
1248         self.hyper_lerass.SetBold(True)
1249         self.hyper_lerass.UpdateLink()
1250         blank = wx.StaticText(PanelPres, -1, u'\n')
1251         blank1 = wx.StaticText(PanelPres, -1, u'\n')
1252         labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1253         labellicence.SetForegroundColour(txtcolour)
1254         labellicence.SetBackgroundColour(bckgrdcolor)
1255         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1256         labelcopy.SetForegroundColour(txtcolour)
1257         labelcopy.SetBackgroundColour(bckgrdcolor)
1258         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1259         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1260         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1261         but_python = wx.BitmapButton(self, -1, python_img)
1262         but_lexique = wx.BitmapButton(self, -1, lexique_img)
1263         but_r = wx.BitmapButton(self, -1, r_img)
1264         self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1265         self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1266         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1267         
1268         
1269         #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1270         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1271         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1272         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1273         sizer4.Add(label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
1274         
1275         sizer2.Add(label2, 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(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1279         sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1280         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1281         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1282         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1283         sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1284         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1285         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1286         sizer1.Add(sizer4, 1, wx.ALIGN_CENTER_HORIZONTAL, 0)
1287         sizer1.Add(but_ira, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
1288         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1289         PanelPres.SetSizer(sizer2)
1290         #sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1291         sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1292         #sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1293         grid_sizer_2.Add(but_python, 1, wx.ALIGN_BOTTOM)
1294         grid_sizer_2.Add(but_lexique, 1, wx.ALIGN_BOTTOM)
1295         grid_sizer_2.Add(but_r, 1,  wx.ALIGN_BOTTOM)
1296         
1297         sizer1.Add(sizer5, 0, wx.EXPAND |wx.ALL, 10)
1298         sizer1.Add(grid_sizer_2, 2, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 1)
1299         self.SetSizer(sizer1)
1300         sizer1.Fit(self)
1301     
1302     def OnPython(self,evt):
1303         webbrowser.open('http://www.python.org')
1304     
1305     def OnLexique(self,evt):
1306         webbrowser.open('http://www.lexique.org')
1307         
1308     def OnR(self,evt):
1309         webbrowser.open('http://www.r-project.org')
1310
1311 class MySplashScreen(wx.SplashScreen):
1312     def __init__(self):
1313         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1314         wx.SplashScreen.__init__(self, bmp,
1315                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1316                                  2000, None, -1)
1317         self.Bind(wx.EVT_CLOSE, self.OnClose)
1318         self.fc = wx.FutureCall(1, self.ShowMain)
1319
1320     def OnClose(self, evt):
1321         evt.Skip()
1322         self.Hide()
1323         
1324         if self.fc.IsRunning():
1325             self.fc.Stop()
1326             self.ShowMain()
1327
1328     def ShowMain(self):
1329         displaySize = wx.DisplaySize()
1330         w = displaySize[0]/1.2
1331         h = displaySize[1]/1.2
1332         frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1333         frame.Show()
1334         frame.finish_init()
1335         frame.Upgrade()
1336         frame.OnOpenFromCmdl()
1337 #        if self.fc.IsRunning():
1338 #            self.Raise()
1339         #wx.CallAfter(frame.ShowTip)
1340         
1341 class MyApp(wx.App):
1342     def OnInit(self):
1343         """
1344         Create and show the splash screen.  It will then create and show
1345         the main frame when it is time to do so.
1346         """
1347         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1348         self.SetAppName("Iramuteq")       
1349         splash = MySplashScreen()
1350         splash.Show()
1351         return True
1352
1353 def main():
1354     app = MyApp(False)
1355     app.MainLoop()
1356
1357 if __name__ == '__main__':
1358     __name__ = 'Main'
1359     main()