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