...
[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, progressbar
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 ID_exportmeta = 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         'subcorpusmeta' : 'subcorpusmeta.png',
195         'subcorpusthema' : 'subcorpusthema.png',
196         'preferences' : 'preferences.png',
197         'exportmetatable' : 'exportmetatable.png',
198          }
199 #####################################################################
200
201 class IraFrame(wx.Frame):
202     def __init__(self, parent, id= -1, title="", pos=wx.DefaultPosition,
203                  size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | 
204                                             wx.SUNKEN_BORDER | 
205                                             wx.CLIP_CHILDREN):
206         log.info('Starting...')
207         wx.Frame.__init__(self, parent, id, title, pos, size, style)
208         #configuration
209         self.AppliPath = AppliPath
210         self.images_path = os.path.join(AppliPath,'images')
211         self.UserConfigPath = UserConfigPath
212         #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
213         self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
214         self.RscriptsPath.basefiles(RscriptsPath)
215         #self.DictPath = ConstructDicoPath(AppliPath)
216         self.DictPath = ConstructDicoPath(UserConfigPath)
217         self.ConfigGlob = ConfigGlob
218         self.ConfigPath = ConstructConfigPath(UserConfigPath)
219         self.pref = RawConfigParser()
220         #workaround for import problem
221         self.SimiFromCluster = SimiFromCluster
222         #langues
223         gettext.install('iramuteq',  os.path.join(AppliPath,'locale'), unicode=True)
224         #langues = ['fr_FR', 'en', 'pt_PT']
225         #for l in langues :
226         #    pass
227         self.preslangue = {}
228         for langue in code_langues :
229             self.preslangue[langue] = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=[code_langues[langue]])
230         self.setlangue()
231         #self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
232         #self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
233         # tell FrameManager to manage this frame        
234         #self._mgr = wx.aui.AuiManager()
235         self._mgr = aui.AuiManager()
236         self._mgr.SetManagedWindow(self)
237         self.x = 0
238         # create menu
239 #--------------------------------------------------------------------------------
240         self.images_analyses = images_analyses
241         for img in images_analyses :
242             self.images_analyses[img] = wx.Image(os.path.join(self.images_path, self.images_analyses[img]), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()
243         self.mb = wx.MenuBar()
244
245         file_menu = wx.Menu()
246         item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
247         #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
248         item.SetBitmap(self.images_analyses['matroot'])
249         file_menu.AppendItem(item)
250         
251         item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
252         item.SetBitmap(self.images_analyses['textroot'])
253         file_menu.AppendItem(item)
254         
255         item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
256         item.SetBitmap(self.images_analyses['iramuteq'])
257         file_menu.AppendItem(item)
258
259         item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
260         item.SetBitmap(self.images_analyses['TXM'])
261         file_menu.AppendItem(item)
262         
263         item = wx.MenuItem(file_menu, ID_ImportEuro, _(u"Import from Europress").decode('utf8'), _(u"Import from Europress").decode('utf8'))
264         item.SetBitmap(self.images_analyses['europress'])
265         file_menu.AppendItem(item)        
266         
267         menuFactiva = wx.Menu()
268         fact_from_xml = wx.MenuItem(menuFactiva, ID_Fact_xml, _(u"from xml").decode('utf8'))
269         fact_from_xml.SetBitmap(self.images_analyses['factiva_xml'])
270         fact_from_mail = wx.MenuItem(menuFactiva, ID_Fact_mail, _(u"from mail").decode('utf8'))
271         fact_from_mail.SetBitmap(self.images_analyses['factiva_mail'])
272         fact_from_txt = wx.MenuItem(menuFactiva, ID_Fact_copy, _(u"from copy/paste").decode('utf8'))
273         fact_from_txt.SetBitmap(self.images_analyses['factiva_copy'])
274         menuFactiva.AppendItem(fact_from_xml)
275         menuFactiva.AppendItem(fact_from_mail)
276         menuFactiva.AppendItem(fact_from_txt)
277         file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
278
279         menuTools = wx.Menu()
280         splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
281         extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
282         extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
283         menuTools.AppendItem(splitvar)
284         menuTools.AppendItem(extractmod)
285         menuTools.AppendItem(extractthem)
286         self.ID_splitvar = splitvar.GetId()
287         self.ID_extractmod = extractmod.GetId()
288         self.ID_extractthem = extractthem.GetId()
289         file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
290
291                
292         #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
293         #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
294         #file_menu.AppendItem(item)
295         
296         file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
297         
298         edit_menu = wx.Menu()
299         pref = wx.MenuItem(edit_menu, wx.ID_PREFERENCES, _(u'Preferences').decode('utf8'))
300         pref.SetBitmap(self.images_analyses['preferences'])
301         edit_menu.AppendItem(pref)
302         #edit_menu.Append(wx.ID_PREFERENCES, _(u'Preferences').decode('utf8'))
303         
304         view_menu = wx.Menu()
305         home = wx.MenuItem(view_menu, ID_ACCEUIL, _(u"Home page").decode('utf8'))
306         home.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_GO_HOME, size = (16,16)))
307         view_menu.AppendItem(home)
308         #view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
309         results = wx.MenuItem(view_menu, ID_RESULT, _(u'Show results').decode('utf8'))
310         results.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_LIST_VIEW, size = (16,16)))
311         view_menu.AppendItem(results)
312         #view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
313         #view_menu.AppendSeparator()
314         matrix_menu = wx.Menu()
315         matanalyses = [[ID_Freq, _(u"Frequencies").decode('utf8'), 'freq'],
316                        [ID_FreqMulti, _(u"Multiple  Frequencies").decode('utf8'), 'freqmulti'],
317                        [ID_Chi2, _(u"Chi2").decode('utf8'), 'chi2'],
318                        {'name' : _(u"Clustering").decode('utf8'),
319                         'content' : [[ID_CHDReinert, _(u"Reinert's Method").decode('utf8'), 'reinertmatrix']]},
320                        [ID_SIMI, _(u"Similarities Analysis").decode('utf8'), 'simimatrix'],
321                        [ID_proto, _(u"Prototypical Analysis").decode('utf8'), 'proto'],
322                        [ID_Splitfromvar, _(u"Split from variable").decode('utf8'), 'subcorpusmeta'],
323                         ]
324         
325         for analyse in matanalyses :
326             if not isinstance(analyse, dict) :
327                 item = wx.MenuItem(matrix_menu, analyse[0], analyse[1])
328                 item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)))
329                 matrix_menu.AppendItem(item)
330             else :
331                 nmenu = wx.Menu()
332                 for subana in analyse['content'] :
333                     item = wx.MenuItem(nmenu, subana[0], subana[1])
334                     item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)))
335                     nmenu.AppendItem(item)
336                 matrix_menu.AppendMenu(-1, analyse['name'], nmenu)
337         #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Frequencies").decode('utf8'))
338         #item.SetBitmap(self.images_analyses['freq'])
339         #matrix_menu.AppendItem(item)
340         #matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
341         #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Multiple  Frequencies").decode('utf8'))
342         #item.SetBitmap(self.images_analyses['freqmulti'])
343         #matrix_menu.Append(ID_FreqMulti, _(u'Multiple frequencies').decode('utf8'))
344         #matrix_menu.AppendItem(item)
345         #matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
346         #matrix_menu.Append(ID_Student, u"t de Student")
347         #menu_classif = wx.Menu()
348         #menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
349         #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
350         #matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
351         #matrix_menu.Append(ID_AFCM, u"AFCM")
352         #matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
353         #matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
354         ID_RCODE = wx.NewId()
355         #matrix_menu.Append(ID_RCODE, u"Code R...") 
356         #menu_splittab = wx.Menu()
357         #ID_SPLITVAR = wx.NewId()
358         #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
359         #menu_splittab.AppendItem(splitvar)
360         #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
361         self.matrix_menu = matrix_menu
362         
363         text_menu = wx.Menu()
364         analyses_text = [[ID_TEXTSTAT, _(u"Statistics").decode('utf8'), 'stat'],
365                          [ID_ASLEX, _(u"Specificities and CA").decode('utf8'), 'spec'],
366                          {'name' : _(u"Clustering").decode('utf8'),
367                           'content' : [[ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'), 'alceste']]},
368                          [ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'), 'simitxt'],
369                          [ID_WC, _(u"WordCloud").decode('utf8'), 'wordcloud'],
370                          {'name' : _(u"Sub corpus").decode('utf8'),
371                           'content' : [[ID_Subtxtfrommeta, _(u'Sub corpus from metadata').decode('utf8'), 'subcorpusmeta'],
372                                        [ID_Subtxtfromthem, _(u'Sub corpus from thematic').decode('utf8'), 'subcorpusthema']]},
373                          [ID_exportmeta, _(u"Export metadata table").decode('utf8'), 'exportmetatable'],
374                          ]
375         
376         for analyse in analyses_text :
377             if not isinstance(analyse, dict) :
378                 item = wx.MenuItem(text_menu, analyse[0], analyse[1])
379                 item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)))
380                 text_menu.AppendItem(item)
381             else :
382                 nmenu = wx.Menu()
383                 for subana in analyse['content'] :
384                     item = wx.MenuItem(nmenu, subana[0], subana[1])
385                     item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)))
386                     nmenu.AppendItem(item)
387                 text_menu.AppendMenu(-1, analyse['name'], nmenu)
388         #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
389 #         text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
390 #         text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
391 #         #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
392 #         menu_classiftxt = wx.Menu()
393 #         menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
394 #         #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
395 #         text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
396 #         text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) 
397 #         
398 #         text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
399         self.text_menu = text_menu
400         
401         help_menu = wx.Menu()
402         about = wx.MenuItem(help_menu, wx.ID_ABOUT, _(u"About...").decode('utf8'))
403         about.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_INFORMATION, size = (16,16)))
404         help_menu.AppendItem(about)
405         #help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
406         help = wx.MenuItem(help_menu, wx.ID_HELP, _(u"Online help...").decode('utf8'))
407         help.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_HELP, size = (16,16)))
408         help_menu.AppendItem(help)
409         #help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
410         
411         self.mb.Append(file_menu, _(u"File").decode('utf8'))
412         self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
413         self.mb.Append(view_menu, _(u"View").decode('utf8'))
414         self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
415         self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
416         self.mb.Append(help_menu, _(u"Help").decode('utf8'))
417         
418         self.SetMenuBar(self.mb)
419 #--------------------------------------------------------------------
420         self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
421         self.statusbar.SetStatusWidths([-2, -3])
422         self.statusbar.SetStatusText(_(u"Ready").decode('utf8'), 0)
423         self.statusbar.SetStatusText(_(u"Welcome").decode('utf8'), 1)
424
425         # min size for the frame itself isn't completely done.
426         # see the end up FrameManager::Update() for the test
427         # code. For now, just hard code a frame minimum size
428         self.SetMinSize(wx.Size(400, 400))
429
430         # create some toolbars
431         tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
432                          wx.TB_FLAT | wx.TB_NODIVIDER)
433         tb1.SetToolBitmapSize(wx.Size(16, 16))
434         tb1.AddLabelTool(ID_OpenData, "OpenData", self.images_analyses['matroot'], shortHelp=_(u"Matrix").decode('utf8'), longHelp=_(u"Open a matrix").decode('utf8'))
435         tb1.AddSeparator()
436         tb1.AddLabelTool(ID_OpenText, "OpenText", self.images_analyses['textroot'], shortHelp=_(u"Text").decode('utf8'), longHelp=_(u"Open a text corpus").decode('utf8'))
437         tb1.AddSeparator()
438         tb1.AddLabelTool(ID_OnOpenAnalyse, "OpenAnalyse", self.images_analyses['iramuteq'], shortHelp= _(u"Open an analysis").decode('utf8'), longHelp=_(u"Open an analysis").decode('utf8'))
439         tb1.AddSeparator()
440         tb1.AddLabelTool(ID_ImportTXM, "ImportTXM", self.images_analyses['TXM'], shortHelp= _(u"Import from TXM").decode('utf8'), longHelp=_(u"Import from TXM").decode('utf8'))
441         tb1.AddSeparator()
442         tb1.AddLabelTool(ID_ImportEuro, "ImportEuro", self.images_analyses['europress'], shortHelp= _(u"Import from Europress").decode('utf8'), longHelp=_(u"Import from Europress").decode('utf8'))
443         tb1.AddSeparator()
444         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'))
445         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'))
446         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'))
447         tb1.AddSeparator()
448         tb1.AddLabelTool(wx.ID_PREFERENCES, "Preferences", self.images_analyses['preferences'], shortHelp= _(u"Preferences").decode('utf8'), longHelp=_(u"Preferences").decode('utf8'))
449         tb1.AddSeparator()
450         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'))
451         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'))
452         tb1.Realize()
453         
454         tb_text = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
455                          wx.TB_FLAT | wx.TB_NODIVIDER)
456         for analyse in analyses_text :
457             if not isinstance(analyse, dict) :
458                 tb_text.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1])
459             else :
460                 for subana in analyse['content'] :
461                     tb_text.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1])
462         tb_text.Realize()
463         
464         tb_mat = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
465                          wx.TB_FLAT | wx.TB_NODIVIDER)
466         for analyse in matanalyses :
467             if not isinstance(analyse, dict) :
468                 tb_mat.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1])
469             else :
470                 for subana in analyse['content'] :
471                     tb_mat.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1])        
472         tb_mat.Realize()
473         
474         tb_help = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
475                          wx.TB_FLAT | wx.TB_NODIVIDER)
476         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'))
477         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'))
478         tb_help.Realize()
479 #------------------------------------------------------------------------------------------------
480
481         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)
482                       
483         #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
484         #                  Name("Text").CenterPane())                      
485         self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
486                           Name("Text").CenterPane())
487         #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
488         #                  CenterPane())
489         self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
490                           CenterPane())
491         #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
492         #    with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
493         #        f.write('')
494         self.history = History(os.path.join(UserConfigPath, 'history.db'))
495         self.tree = LeftTree(self)
496         self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Historic").decode('utf8')).
497                           Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
498                           MinimizeButton(True))
499         
500         #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)
501         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)
502         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
503         self.nb.SetAGWWindowStyleFlag(notebook_flags)
504         self.nb.SetArtProvider(aui.ChromeTabArt())
505         #self.nb.SetArtProvider(aui.VC8TabArt())
506         #self.nb.parent = self
507         #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
508         #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
509         #                      Name("Tab_content").
510         #                      CenterPane())
511         self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
512                               Name("Tab_content").
513                               CenterPane())        
514         
515         #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
516         #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
517         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
518         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
519         # add the toolbars to the manager
520                         
521         #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
522         #                  Name("tb1").Caption("Fichiers").
523         #                  ToolbarPane().Top().
524         #                  LeftDockable(False).RightDockable(False))
525         self._mgr.AddPane(tb1, aui.AuiPaneInfo().
526                           Name("tb1").Caption("Fichiers").
527                           ToolbarPane().Top().
528                           LeftDockable(True).RightDockable(False))
529         
530         self._mgr.AddPane(tb_text, aui.AuiPaneInfo().
531                           Name("tb_text").Caption("analyse_text").
532                           ToolbarPane().Top().
533                           LeftDockable(True).RightDockable(False))
534         
535         self._mgr.AddPane(tb_mat, aui.AuiPaneInfo().
536                           Name("tb_mat").Caption("analyse_matrix").
537                           ToolbarPane().Top().
538                           LeftDockable(True).RightDockable(False))
539                 
540         self._mgr.AddPane(tb_help, aui.AuiPaneInfo().
541                           Name("tb_help").Caption("help").
542                           ToolbarPane().Top().
543                           LeftDockable(True).RightDockable(False))
544                 
545         self._mgr.GetPane('tb_text').Hide()
546         self._mgr.GetPane('tb_mat').Hide()
547         
548         self.ShowAPane("Intro_Text")
549         self._mgr.GetPane("lefttree").Show()
550         self._mgr.GetPane("classif_tb").Hide()
551         # "commit" all changes made to FrameManager   
552         self._mgr.Update()
553
554         # Show How To Use The Closing Panes Event
555 ##################################################################        
556         self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
557         self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
558         self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
559         self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
560         self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
561         self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
562         self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
563         self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
564         self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
565         self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
566         self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
567         self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
568         self.Bind(wx.EVT_MENU, self.OnFreqMulti, id=ID_FreqMulti)
569         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
570         self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
571         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
572         self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
573         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
574         self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
575         self.Bind(wx.EVT_MENU, self.OnSplitVar, id = ID_Splitfromvar)
576         #self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
577         #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
578         #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
579         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
580         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
581         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
582         self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
583         self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
584         self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
585         self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
586         self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfrommeta)
587         self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfromthem)
588         self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
589         self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
590         #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
591         self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
592         self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
593         self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
594         self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
595         self.Bind(wx.EVT_MENU, self.OnImportEuropress, id=ID_ImportEuro)
596         self.Bind(wx.EVT_MENU, self.OnExportMeta, id=ID_exportmeta)
597         self.Bind(wx.EVT_CLOSE, self.OnClose)
598 ##################################################################
599         flags = self._mgr.GetAGWFlags()
600         #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
601         #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
602         #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
603         flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
604         self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
605         self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
606         self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
607         self.DoUpdate()
608
609         self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
610         self.SetIcon(self._icon)
611 ##########################
612         self.ctrl = ""
613         self.input_path = [False]
614         self.TEMPDIR = tempfile.mkdtemp('iramuteq')
615         self.FileTabList = []
616         self.listbar=[]
617         self.DictTab = {}
618         self.FreqNum = 0
619         self.colsep = ''
620         self.txtsep = ''
621         self.g_header = False
622         self.g_id = False
623         self.table = ''
624         self.fileforR = ''
625         self.filename = ''
626         self.nastrings = ''
627         self.encode = ''
628         self.SysEncoding = sys.getdefaultencoding()
629         self.syscoding = sys.getdefaultencoding()
630         #print 'SysEncoding',self.SysEncoding
631         if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
632         self.type = ''
633
634 ##############################################################@
635         self.ShowMenu('view', True)
636         self.ShowMenu('matrix', False)
637         self.ShowMenu('text', False)
638    
639         self._mgr.Update()
640
641         self.DataPop = False
642         self.DataTxt = False
643         self.Text = ''
644
645         self.lexique = None
646         self.corpus = None
647
648     def finish_init(self) :
649         try :
650             self.pref.read(self.ConfigPath['preferences'])
651             if IsNew(self) :
652                 UpgradeConf(self)
653                 self.pref.read(self.ConfigPath['preferences'])
654                 New = True
655             else :
656                 CopyConf(self)
657                 New = False
658         except :
659             UpgradeConf(self)
660             self.pref.read(self.ConfigPath['preferences'])
661             New = True
662         self.sound = self.pref.getboolean('iramuteq', 'sound')
663         self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
664         self.version = ConfigGlob.get('DEFAULT', 'version')
665         #configuration des chemins de R
666         self.PathPath = ConfigParser()
667         self.PathPath.read(ConfigPath['path'])
668         BestRPath = False
669         if not CheckRPath(self.PathPath) :
670             if sys.platform == 'win32':
671                 BestRPath = FindRPAthWin32()
672             else:
673                 BestRPath = FindRPathNix()
674             if BestRPath:
675                 self.PathPath.set('PATHS', 'rpath', BestRPath)
676                 with open(ConfigPath['path'], 'w') as f :
677                     self.PathPath.write(f)
678         else:
679             BestRPath = True 
680         if BestRPath :
681             self.RPath = self.PathPath.get('PATHS', 'rpath')
682             if New :
683                 CheckRPackages(self)
684             if not RLibsAreInstalled(self) :
685                 CheckRPackages(self)
686         else :
687             msg = '\n'.join([_(u"Can't find R executable").decode('utf8'), _(u"If R is not installed, get it from http://www.r-project.org.").decode('utf8'),
688                              _(u"If R is installed, report its path in Preferences.").decode('utf8'),
689                              _(u"IRaMuTeQ does not work without R.").decode('utf8')])
690             dlg = wx.MessageDialog(self, msg, _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
691             dlg.CenterOnParent()
692             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
693                 pass
694             dlg.Destroy()
695
696     def setlangue(self) :
697         self.pref.read(self.ConfigPath['preferences'])
698         try :
699             guilangue = self.pref.get('iramuteq', 'guilanguage')
700         except :
701             guilangue = DefaultConf.get('iramuteq', 'guilanguage')
702         self.preslangue.get(guilangue, 'english').install()
703
704     def OnVerif(self, evt) :
705         pack = CheckRPackages(self)
706         if pack :
707             dlg = wx.MessageDialog(self, _(u"Installation OK").decode('utf8'), _(u"Installation").decode('utf8'), wx.OK | wx.ICON_INFORMATION | wx.STAY_ON_TOP)
708             dlg.CenterOnParent()
709             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
710                 evt.Veto()
711
712     def ShowMenu(self, menu, Show=True):
713         if menu == 'text' :
714             menu_pos = 4
715             if Show :
716                 self._mgr.GetPane('tb_text').Show()
717             else :
718                 self._mgr.GetPane('tb_text').Hide()   
719         elif menu == 'matrix' :
720             menu_pos = 3
721             if Show :
722                 self._mgr.GetPane('tb_mat').Show()
723             else :
724                 self._mgr.GetPane('tb_mat').Hide()           
725         elif menu == 'view' :
726             menu_pos = 2
727         else :
728             menu_pos = None
729             
730         #menu_pos = self.mb.FindMenu(menu)
731         if not menu_pos is None :
732             self.mb.EnableTop(menu_pos, Show)
733             self.mb.UpdateMenus()
734         self._mgr.Update()
735
736 #--------------------------------------------------------------------
737     def OnClose(self, event):
738         print 'onclose'
739         with open(self.ConfigPath['path'], 'w') as f :
740             self.PathPath.write(f)
741         self._mgr.UnInit()
742         del self._mgr
743         self.Destroy()
744
745     def OnOpenData(self, event):
746         inputname, self.input_path = OnOpen(self, "Data")
747         if inputname:
748             #filename = self.input_path[0]
749             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
750             val = get_table_param(self, self.input_path[0])
751             if val == wx.ID_OK :
752                 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
753                 wx.SafeYield()
754                 try :
755                     self.tableau.make_content()
756                     OpenAnalyse(self, self.tableau.parametres)
757                     self.tree.OnItemAppend(self.tableau.parametres)
758                     del busy 
759                 except :
760                     del busy
761                     BugReport(self)
762                 #self.tableau.show_tab()
763
764     def OnOpenAnalyse(self, event):
765         self.AnalysePath = OnOpen(self, "Analyse")
766         if self.AnalysePath :
767             OpenAnalyse(self, self.AnalysePath[1][0], True)
768             self.ShowMenu('view')
769
770     def OnOpenText(self, event):
771         inputname, self.input_path = OnOpen(self, "Texte")
772         self.filename = self.input_path[0]
773         if inputname:
774             self.OpenText()
775    
776     def OnSubText(self, evt, corpus = None, parametres = None):
777         if corpus is None :
778             corpus = self.tree.getcorpus()
779         if evt.GetId() == ID_Subtxtfrommeta :
780             parametres = {'frommeta' : True}
781         elif evt.GetId() == ID_Subtxtfromthem :
782             parametres = {'fromtheme' : True}
783         builder = SubBuilder(self, corpus, parametres)
784         if builder.res == wx.ID_OK :
785             busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
786             wx.SafeYield()
787             corpus = builder.doanalyse()
788             self.history.add(corpus.parametres)
789             OpenAnalyse(self, corpus.parametres)
790             self.tree.OnItemAppend(corpus.parametres)
791             del busy
792             
793     def OpenText(self):
794         dlg = progressbar(self, 5) 
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 OnExportMeta(self, evt, corpus = None):
1101         if corpus is None :
1102             corpus = self.tree.getcorpus()
1103         try :
1104             ExportMetaTable(self, corpus)
1105         except :
1106             BugReport(self) 
1107
1108     def ExtractTools(self, evt) :
1109         ID = evt.GetId()
1110         if ID == self.ID_splitvar :
1111             Extract(self, 'splitvar')
1112         elif ID == self.ID_extractmod :
1113             Extract(self, 'mods')
1114         elif ID == self.ID_extractthem :
1115             Extract(self, 'them')
1116
1117     def OnTextReinert(self, event, corpus = None):
1118         try:
1119             #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
1120             #RunAnalyse(self, corpus, Alceste, OptAlceste)
1121             if corpus is None :
1122                 corpus = self.tree.getcorpus()            
1123             self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
1124             if self.Text.val == wx.ID_OK:
1125                 PlaySound(self)
1126         except:
1127             BugReport(self)
1128
1129     def OnPamSimple(self, event, corpus = None):
1130         try:
1131             if corpus is None :
1132                 corpus = self.tree.getcorpus()
1133             self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
1134             if self.Text.val == wx.ID_OK:
1135                 PlaySound(self)
1136         except:
1137             BugReport(self)
1138
1139     def SimiCluster(self, parametres = {}, fromprof = False, tableau = None) :
1140         self.analyse_matrix(DoSimi, parametres = parametres, analyse_type = 'simiclustermatrix', matrix = tableau, dlgnb = 5)
1141     
1142 #    def OnSimi(self,evt):
1143 #        try :
1144             #print 'ATTENTION !!!! VERGES'
1145             #print 'PLUS DE BUG SUR SIMI'
1146 #            self.res = DoSimi(self, param = None)
1147             #self.res = Verges(self)
1148 #            if self.res.val == wx.ID_OK :
1149 #                PlaySound(self)
1150 #        except :
1151 #            BugReport(self)
1152 #################################################################
1153
1154     def OnHelp(self, event):
1155         webbrowser.open('http://www.iramuteq.org/documentation')
1156     
1157     def OnPref(self, event):
1158         dlg = PrefDialog(self)
1159         dlg.CenterOnParent()
1160         self.val = dlg.ShowModal()
1161         dlg.Destroy()
1162
1163     def Upgrade(self) :
1164         if self.check_update:
1165             NewVersion(self)
1166         else:
1167             print 'pas de verif'    
1168         #IsNew(self)
1169         #CheckRPackages(self)
1170
1171     def OnOpenFromCmdl(self):
1172         truepath = True
1173         if options.filename :
1174             if os.path.exists(options.filename):
1175                 self.filename = os.path.abspath(options.filename)
1176             else:
1177                 truepath = False
1178         elif args :
1179             if os.path.exists(os.path.realpath(args[0])):
1180                 self.filename = os.path.abspath(os.path.realpath(args[0]))
1181             else:
1182                 truepath = False
1183         else:
1184             pass
1185         if truepath :
1186             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1187                 self.tableau = Tableau(self, self.filename)
1188                 val = get_table_param(self, self.filename)
1189                 if val == wx.ID_OK :
1190                     self.tableau.make_content()
1191                     OpenAnalyse(self, self.tableau.parametres)
1192                     self.tree.OnItemAppend(self.tableau.parametres)
1193                 #get_table_param(self, self.filename)
1194                 #self.tableau.make_content()
1195                 #self.tableau.show_tab()
1196                 #open_data(self, self.filename)
1197             elif os.path.splitext(self.filename)[1] == '.txt':
1198                 self.OpenText()
1199             elif os.path.splitext(self.filename)[1] == '.ira' :
1200                 #self.corpus = Corpus(self)
1201                 #self.Text = OpenAnalyse(self, self.filename)
1202                 OpenAnalyse(self, self.filename)
1203         if not truepath:
1204             print 'This file does not exist'
1205             
1206         
1207
1208 class IntroPanel(wx.Panel):
1209     def __init__(self, parent):
1210         wx.Panel.__init__(self, parent)
1211         #col = randint(0, 255)
1212         #col1 = randint(0,255)
1213         #col2 = randint(0,255)
1214         #col = 57
1215         col = 161
1216         col1 = 198
1217         col2 = 224
1218         bckgrdcolor = wx.Colour(col, col1, col2)
1219         self.SetBackgroundColour(bckgrdcolor)
1220         txtcolour = wx.Colour(250, 250, 250)
1221         linkcolor = wx.Colour(255, 0, 0)
1222         sizer1 = wx.BoxSizer(wx.VERTICAL)
1223         sizer2 = wx.BoxSizer(wx.VERTICAL)
1224         sizer4 = wx.BoxSizer(wx.HORIZONTAL)
1225         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1226         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1227         grid_sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
1228         
1229         iralink = hl.HyperLinkCtrl(self, wx.ID_ANY, u"http://www.iramuteq.org", URL="http://www.iramuteq.org")
1230         iralink.SetColours(linkcolor, linkcolor, "RED")
1231         iralink.SetBackgroundColour(bckgrdcolor)
1232         iralink.EnableRollover(True)
1233         iralink.SetUnderlines(False, False, True)
1234         iralink.SetBold(True)
1235         iralink.UpdateLink()
1236         
1237         PanelPres = wx.Panel(self)
1238         bckgrdcolor = wx.Colour(randint(0, 255), randint(0, 255), randint(0, 255))
1239         PanelPres.SetBackgroundColour(bckgrdcolor)
1240         
1241         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1242         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1243         label_1.SetForegroundColour(wx.RED)
1244         
1245         iraicone = wx.Image(os.path.join(ImagePath,'iraicone100x100.png'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1246         but_ira = wx.StaticBitmap(self, -1, bitmap = iraicone)
1247
1248         
1249         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1250         label2.SetForegroundColour(txtcolour)
1251         label2.SetBackgroundColour(bckgrdcolor)
1252         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1253         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1254         self.hyper2.SetBackgroundColour(bckgrdcolor)
1255         self.hyper2.EnableRollover(True)
1256         self.hyper2.SetUnderlines(False, False, True)
1257         self.hyper2.SetBold(True)
1258         self.hyper2.UpdateLink()
1259         
1260         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1261         label_lerass.SetForegroundColour(txtcolour)
1262         label_lerass.SetBackgroundColour(bckgrdcolor)
1263         
1264         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1265         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1266         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1267         self.hyper_lerass.EnableRollover(True)
1268         self.hyper_lerass.SetUnderlines(False, False, True)
1269         self.hyper_lerass.SetBold(True)
1270         self.hyper_lerass.UpdateLink()
1271         
1272         blank = wx.StaticText(PanelPres, -1, u'\n')
1273         blank1 = wx.StaticText(PanelPres, -1, u'\n')
1274         
1275         labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1276         labellicence.SetForegroundColour(txtcolour)
1277         labellicence.SetBackgroundColour(bckgrdcolor)
1278         
1279         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1280         labelcopy.SetForegroundColour(txtcolour)
1281         labelcopy.SetBackgroundColour(bckgrdcolor)
1282         
1283         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1284         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1285         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1286         but_python = wx.BitmapButton(self, -1, python_img)
1287         but_lexique = wx.BitmapButton(self, -1, lexique_img)
1288         but_r = wx.BitmapButton(self, -1, r_img)
1289         self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1290         self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1291         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1292         
1293         
1294         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1295         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1296         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1297         sizer4.Add(label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
1298         
1299         sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1300         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1301         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1302         sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1303         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1304         sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1305         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1306         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1307         sizer1.Add(sizer4, 2, wx.ALIGN_CENTER_HORIZONTAL, 0)
1308         sizer1.Add(but_ira, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
1309         sizer1.Add(iralink, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_TOP, 5)
1310         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 10)
1311         PanelPres.SetSizer(sizer2)
1312         grid_sizer_2.Add(but_python, 1, wx.ALIGN_BOTTOM)
1313         grid_sizer_2.Add(but_lexique, 1, wx.ALIGN_BOTTOM)
1314         grid_sizer_2.Add(but_r, 1,  wx.ALIGN_BOTTOM)
1315         
1316         sizer1.Add(PanelPres, 0, wx.EXPAND |wx.ALL, 10)
1317         sizer1.Add(grid_sizer_2, 2, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 1)
1318         self.SetSizer(sizer1)
1319         sizer1.Fit(self)
1320     
1321     def OnPython(self,evt):
1322         webbrowser.open('http://www.python.org')
1323     
1324     def OnLexique(self,evt):
1325         webbrowser.open('http://www.lexique.org')
1326         
1327     def OnR(self,evt):
1328         webbrowser.open('http://www.r-project.org')
1329
1330 class MySplashScreen(wx.SplashScreen):
1331     def __init__(self):
1332         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1333         wx.SplashScreen.__init__(self, bmp,
1334                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1335                                  2000, None, -1)
1336         self.Bind(wx.EVT_CLOSE, self.OnClose)
1337         self.fc = wx.FutureCall(1, self.ShowMain)
1338
1339     def OnClose(self, evt):
1340         evt.Skip()
1341         self.Hide()
1342         
1343         if self.fc.IsRunning():
1344             self.fc.Stop()
1345             self.ShowMain()
1346
1347     def ShowMain(self):
1348         displaySize = wx.DisplaySize()
1349         w = displaySize[0]/1.2
1350         h = displaySize[1]/1.2
1351         frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1352         frame.Show()
1353         frame.finish_init()
1354         frame.Upgrade()
1355         frame.OnOpenFromCmdl()
1356 #        if self.fc.IsRunning():
1357 #            self.Raise()
1358         #wx.CallAfter(frame.ShowTip)
1359         
1360 class MyApp(wx.App):
1361     def OnInit(self):
1362         """
1363         Create and show the splash screen.  It will then create and show
1364         the main frame when it is time to do so.
1365         """
1366         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1367         self.SetAppName("Iramuteq")       
1368         splash = MySplashScreen()
1369         splash.Show()
1370         return True
1371
1372 def main():
1373     app = MyApp(False)
1374     app.MainLoop()
1375
1376 if __name__ == '__main__':
1377     __name__ = 'Main'
1378     main()