...
[iramuteq] / iramuteq.py
1 #!/bin/env python
2 # -*- coding: utf-8 -*-
3 #Author: Pierre Ratinaud
4 #Copyright (c) 2008-2012, Pierre Ratinaud
5 #License: GNU GPL
6
7 from optparse import OptionParser
8
9 parser = OptionParser()
10 parser.add_option("-f", "--file", dest="filename",
11                   help="open FILE", metavar="FILE", default=False)
12 (options, args) = parser.parse_args()
13
14 import sys
15 reload(sys)
16 import locale
17 import tempfile
18 import codecs
19 import os
20 from random import randint
21 from ConfigParser import ConfigParser, RawConfigParser
22 import webbrowser
23 import gettext
24 import logging
25 #------------------------------------
26 import wx
27 import wx.lib.agw.aui as aui
28 import wx.html
29 import wx.grid
30 import wx.lib.hyperlink as hl
31 #------------------------------------
32 from functions import BugReport, PlaySound, History
33 from checkversion import NewVersion
34 from guifunct import *
35 from tableau import Tableau
36 from dialog import PrefDialog
37 from tabfrequence import Frequences, FreqMultiple
38 from tabchi2 import ChiSquare
39 #from tabstudent import MakeStudent
40 from tabchddist import ChdCluster
41 from tabafcm import DoAFCM
42 from tabchdalc import AnalyseQuest
43 from tabsimi import DoSimi
44 from tabrsimple import InputText
45 from tabverges import Prototypical
46 from tabsplitvar import SplitMatrixFromVar
47 #from textdist import AnalysePam
48 from textstat import Stat
49 from textaslexico import Lexico
50 from textsimi import SimiTxt, SimiFromCluster
51 from textwordcloud import WordCloud, ClusterCloud
52 from textreinert import Reinert
53 #from textcheckcorpus import checkcorpus
54 from openanalyse import OpenAnalyse
55 from corpus import Builder, SubBuilder
56 from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
57 from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
58 from parse_factiva_xml import ImportFactiva
59 from tools import Extract
60
61 from tree import LeftTree
62 ##########################################################
63 ID_OpenData = wx.NewId()
64 ID_Import = wx.NewId()
65 ID_OpenText = wx.NewId()
66 ID_OnOpenAnalyse = wx.NewId()
67 ID_Freq = wx.NewId()
68 ID_Chi2 = wx.NewId()
69 ID_Student = wx.NewId()
70 ID_CHDSIM = wx.NewId()
71 ID_CHDReinert = wx.NewId()
72 ID_TEXTAFCM = wx.NewId()
73 ID_TEXTSTAT = wx.NewId()
74 ID_ASLEX = wx.NewId()
75 ID_TEXTREINERT = wx.NewId()
76 ID_TEXTPAM = wx.NewId()
77 ID_CHECKCORPUS = wx.NewId()
78 ID_Tabcontent = wx.NewId()
79 ID_AFCM = wx.NewId()
80 ID_SIMI = wx.NewId()
81 ID_CloseTab = wx.NewId()
82 ID_SaveTab = wx.NewId()
83 ID_CreateText = wx.NewId()
84 ID_ACCEUIL = wx.NewId()
85 ID_RESULT = wx.NewId()
86 ID_HTMLcontent = wx.NewId()
87 ID_SimiTxt = wx.NewId()
88 ID_proto = wx.NewId()
89 ID_ImportTXM = wx.NewId()
90 ID_FreqMulti = wx.NewId()
91 ID_Splitfromvar = wx.NewId()
92 ID_Subtxtfrommeta = wx.NewId()
93 ID_Subtxtfromthem = wx.NewId()
94 ID_WC = wx.NewId()
95 ID_ImportEuro = wx.NewId()
96 ID_Fact_xml = wx.NewId()
97 ID_Fact_mail = wx.NewId()
98 ID_Fact_copy = wx.NewId()
99 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_Freq, _(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"), _(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.NO_DEFAULT | 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             self.tree.OnItemAppend(corpus.parametres)
790             OpenAnalyse(self, corpus.parametres)
791             del busy
792             
793     def OpenText(self):
794         dlg = wx.ProgressDialog("Ouverture...",
795                                    "Veuillez patienter...",
796                                    maximum=2,
797                                    parent=self,
798                                    style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
799                                    )
800         
801         builder =  Builder(self, dlg)
802         if builder.res == wx.ID_OK :
803             try :
804                 corpus = builder.doanalyse()
805                 self.history.add(corpus.parametres)
806                 self.tree.OnItemAppend(corpus.parametres)
807                 OpenAnalyse(self, corpus.parametres)
808             except :
809                 dlg.Destroy()
810                 BugReport(self)
811             else :
812                 count = 1
813                 keepGoing = dlg.Update(count, u"Lecture du fichier")
814                 self.ShowMenu('view')
815                 self.ShowMenu('text')
816                 self.ShowMenu('matrix', False)
817                 self.type = "Texte"
818                 self.DataTxt = False
819                 self.Text = ''
820                 count += 1
821                 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
822                 dlg.Destroy()
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             if self.DataTxt :
902                 self.ShowAPane("Text")
903             elif self.DataPop :
904                 self.ShowAPane("Data")
905             else :
906                 self.ShowAPane("Intro_Text")
907
908     def GetStartPosition(self):
909
910         self.x = self.x + 20
911         x = self.x
912         pt = self.ClientToScreen(wx.Point(0, 0))
913         
914         return wx.Point(pt.x + x, pt.y + x)
915     
916     def ShowAPane(self, panel):
917         for pane in self._mgr.GetAllPanes() :
918             if not pane.IsToolbar() and pane.name != 'lefttree': 
919                 pane.Hide()
920         self._mgr.GetPane(panel).Show()
921         self._mgr.Update()
922         
923     def OnAcceuil(self, event):
924         self.ShowAPane(u"Intro_Text")
925         event.Skip()
926     
927     def CreateHTMLCtrl(self):
928         ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
929         if "gtk2" in wx.PlatformInfo:
930             ctrl.SetStandardFonts()
931         ctrl.SetPage(u"text")        
932         return ctrl
933
934     def ShowTab(self, evt):
935         self.ShowAPane("Tab_content")
936
937 ################################################################
938 #debut des analyses
939 ################################################################
940     def analyse_matrix(self, analyse, analyse_type = '', matrix = None, parametres = None, dlgnb = 1):
941         if matrix is None :
942             matrix = self.tree.getmatrix()
943         if parametres is not None :
944             parametres['type'] = analyse_type
945         else :
946             parametres = {'type' : analyse_type}
947         try :
948         #print 'plus de bug@@@@@@@@@@@@@@@@@@@@@@'
949             analyse(self, matrix, parametres = parametres, dlg = dlgnb)
950         except:
951             BugReport(self)           
952
953     def OnFreq(self, event, matrix = None):
954         self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
955     
956     def OnFreqMulti(self, event, matrix = None):
957         self.analyse_matrix(FreqMultiple, analyse_type = 'freqmulti', matrix = matrix, dlgnb = 3)
958
959     def OnChi2(self, event, matrix = None):
960         self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3) 
961
962     def OnSimiTab(self, event, matrix = None):
963         self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5)
964
965     def OnCHDReinert(self, event, matrix = None):
966         #if matrix is None :
967         #    matrix = self.tree.getmatrix()
968         #AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = 3)
969         self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5)
970             
971     def OnStudent(self, event):
972         try:
973             MakeStudent(self) 
974         except:
975             BugReport(self)
976
977     def OnRCode(self, event):
978         try:
979             InputText(self)
980         except:
981             BugReport(self)
982
983     def OnCHDSIM(self, event):
984         try:
985         #    print 'ATTENTION!!!!'
986             chdsim = ChdCluster(self)
987             if chdsim.val == wx.ID_OK:
988                 PlaySound(self)
989         except:
990             BugReport(self)
991  
992 #     def OnCHDReinert(self, event):
993 #         try:
994 #          #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
995 #             self.quest = AnalyseQuest(self)
996 #             if self.quest.val == wx.ID_OK:
997 #                 PlaySound(self)
998 #         except:
999 #             BugReport(self)
1000     
1001     def OnProto(self, evt, matrix = None) :
1002         self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3) 
1003         #Prototypical(self, {'type' : 'proto'})
1004     
1005     def OnSplitVar(self, evt, matrix = None):
1006         if matrix is None :
1007             matrix = self.tree.getmatrix()
1008         self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', parametres = {'pathout': matrix.pathout.dirout}, dlgnb = 3)
1009         #matrix = self.tree.getmatrix()
1010         
1011
1012     def OnSimiTxt(self, evt, corpus = None) :
1013         #    print 'PLUS DE BUG SUR SIMITXT'
1014         try :
1015             #self.Text = SimiTxt(self)
1016             if corpus is None :
1017                 corpus = self.tree.getcorpus()            
1018             self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
1019             if self.Text.val == wx.ID_OK :
1020                 PlaySound(self)
1021         except :
1022             BugReport(self)
1023     
1024     def OnWordCloud(self, evt, corpus = None) :
1025         #    print 'PLUS DE BUG SUR WORDCLOUD'
1026         try :
1027             if corpus is None :
1028                 corpus = self.tree.getcorpus()            
1029             self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
1030             if self.Text.val == wx.ID_OK :
1031                 PlaySound(self)
1032         except :
1033             BugReport(self)
1034
1035     def OnClusterCloud(self, corpus, parametres = None) :
1036         self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
1037
1038     def OnAFCM(self, event):
1039         try:
1040             DoAFCM(self)
1041         except:
1042             BugReport(self)
1043
1044     def OnTextStat(self, event, corpus = None):
1045             #print 'PAS DE BUG SUR TEXT STAT'
1046         try:
1047             if corpus is None :
1048                 corpus = self.tree.getcorpus()
1049             self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
1050             
1051             if self.Text.val == wx.ID_OK :
1052                 PlaySound(self)
1053         except:
1054             BugReport(self)
1055         
1056     def OnTextSpec(self, event, corpus = None):  
1057         try:
1058             #self.Text = AsLexico(self)
1059             #print('ATTENTION : PLUS DE BUG SUR LEXICO')
1060             if corpus is None :
1061                 corpus = self.tree.getcorpus()
1062             self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
1063             if self.Text.val == wx.ID_OK :
1064                 PlaySound(self)
1065         except:
1066             BugReport(self)
1067     
1068     def OnTextAfcm(self, event):
1069         try:
1070             AfcUci(self)
1071             PlaySound(self)
1072         except:
1073             BugReport(self)
1074
1075     def import_factiva_xml(self,event):
1076         try :
1077             ImportFactiva(self, 'xml')
1078         except :
1079             BugReport(self)
1080
1081     def import_factiva_mail(self, evt) :
1082         try :
1083             ImportFactiva(self, 'mail')
1084         except :
1085             BugReport(self)
1086
1087     def import_factiva_txt(self, evt) :
1088         try :
1089             ImportFactiva(self, 'txt')
1090         except :
1091             BugReport(self)
1092
1093     def OnImportTXM(self, evt) :
1094         try :
1095             ImportFactiva(self, 'txm')
1096         except :
1097             BugReport(self)
1098     
1099     def OnImportEuropress(self, evt) :
1100         try :
1101             ImportFactiva(self, 'euro')
1102         except :
1103             BugReport(self)
1104     
1105     def OnExportMeta(self, evt, corpus = None):
1106         if corpus is None :
1107             corpus = self.tree.getcorpus()
1108         try :
1109             ExportMetaTable(self, corpus)
1110         except :
1111             BugReport(self) 
1112
1113     def ExtractTools(self, evt) :
1114         ID = evt.GetId()
1115         if ID == self.ID_splitvar :
1116             Extract(self, 'splitvar')
1117         elif ID == self.ID_extractmod :
1118             Extract(self, 'mods')
1119         elif ID == self.ID_extractthem :
1120             Extract(self, 'them')
1121
1122     def OnTextReinert(self, event, corpus = None):
1123         try:
1124             #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
1125             #RunAnalyse(self, corpus, Alceste, OptAlceste)
1126             if corpus is None :
1127                 corpus = self.tree.getcorpus()            
1128             self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
1129             if self.Text.val == wx.ID_OK:
1130                 PlaySound(self)
1131         except:
1132             BugReport(self)
1133
1134     def OnPamSimple(self, event, corpus = None):
1135         try:
1136             if corpus is None :
1137                 corpus = self.tree.getcorpus()
1138             self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
1139             if self.Text.val == wx.ID_OK:
1140                 PlaySound(self)
1141         except:
1142             BugReport(self)
1143
1144     def SimiCluster(self, parametres = {}, fromprof = False, tableau = None) :
1145         self.analyse_matrix(DoSimi, parametres = parametres, analyse_type = 'simiclustermatrix', matrix = tableau, dlgnb = 5)
1146     
1147 #    def OnSimi(self,evt):
1148 #        try :
1149             #print 'ATTENTION !!!! VERGES'
1150             #print 'PLUS DE BUG SUR SIMI'
1151 #            self.res = DoSimi(self, param = None)
1152             #self.res = Verges(self)
1153 #            if self.res.val == wx.ID_OK :
1154 #                PlaySound(self)
1155 #        except :
1156 #            BugReport(self)
1157 #################################################################
1158
1159     def OnHelp(self, event):
1160         webbrowser.open('http://www.iramuteq.org/documentation')
1161     
1162     def OnPref(self, event):
1163         dlg = PrefDialog(self)
1164         dlg.CenterOnParent()
1165         self.val = dlg.ShowModal()
1166         dlg.Destroy()
1167
1168     def Upgrade(self) :
1169         if self.check_update:
1170             NewVersion(self)
1171         else:
1172             print 'pas de verif'    
1173         #IsNew(self)
1174         #CheckRPackages(self)
1175
1176     def OnOpenFromCmdl(self):
1177         truepath = True
1178         if options.filename :
1179             if os.path.exists(options.filename):
1180                 self.filename = os.path.abspath(options.filename)
1181             else:
1182                 truepath = False
1183         elif args :
1184             if os.path.exists(os.path.realpath(args[0])):
1185                 self.filename = os.path.abspath(os.path.realpath(args[0]))
1186             else:
1187                 truepath = False
1188         else:
1189             pass
1190         if truepath :
1191             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1192                 self.tableau = Tableau(self, self.filename)
1193                 val = get_table_param(self, self.filename)
1194                 if val == wx.ID_OK :
1195                     self.tableau.make_content()
1196                     OpenAnalyse(self, self.tableau.parametres)
1197                     self.tree.OnItemAppend(self.tableau.parametres)
1198                 #get_table_param(self, self.filename)
1199                 #self.tableau.make_content()
1200                 #self.tableau.show_tab()
1201                 #open_data(self, self.filename)
1202             elif os.path.splitext(self.filename)[1] == '.txt':
1203                 self.OpenText()
1204             elif os.path.splitext(self.filename)[1] == '.ira' :
1205                 #self.corpus = Corpus(self)
1206                 #self.Text = OpenAnalyse(self, self.filename)
1207                 OpenAnalyse(self, self.filename)
1208         if not truepath:
1209             print 'ce fichier n\'existe pas'
1210             
1211         
1212
1213 class IntroPanel(wx.Panel):
1214     def __init__(self, parent):
1215         wx.Panel.__init__(self, parent)
1216         col = randint(0, 255)
1217         col1 = randint(0,255)
1218         col2 = randint(0,255)
1219         #col = 57
1220         bckgrdcolor = wx.Colour(col, col1, col2)
1221         self.SetBackgroundColour(bckgrdcolor)
1222         txtcolour = wx.Colour(250, 250, 250)
1223         linkcolor = wx.Colour(255, 0, 0)
1224         sizer1 = wx.BoxSizer(wx.VERTICAL)
1225         sizer2 = wx.BoxSizer(wx.VERTICAL)
1226         sizer4 = wx.BoxSizer(wx.HORIZONTAL)
1227         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1228         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1229         grid_sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
1230         
1231         iralink = hl.HyperLinkCtrl(self, wx.ID_ANY, u"http://www.iramuteq.org", URL="http://www.iramuteq.org")
1232         iralink.SetColours(linkcolor, linkcolor, "RED")
1233         iralink.SetBackgroundColour(bckgrdcolor)
1234         iralink.EnableRollover(True)
1235         iralink.SetUnderlines(False, False, True)
1236         iralink.SetBold(True)
1237         iralink.UpdateLink()
1238         
1239         PanelPres = wx.Panel(self)
1240         bckgrdcolor = wx.Colour(randint(0, 255), randint(0, 255), randint(0, 255))
1241         PanelPres.SetBackgroundColour(bckgrdcolor)
1242         
1243         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1244         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1245         label_1.SetForegroundColour(wx.RED)
1246         
1247         iraicone = wx.Image(os.path.join(ImagePath,'iraicone100x100.png'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1248         but_ira = wx.StaticBitmap(self, -1, bitmap = iraicone)
1249
1250         
1251         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1252         label2.SetForegroundColour(txtcolour)
1253         label2.SetBackgroundColour(bckgrdcolor)
1254         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1255         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1256         self.hyper2.SetBackgroundColour(bckgrdcolor)
1257         self.hyper2.EnableRollover(True)
1258         self.hyper2.SetUnderlines(False, False, True)
1259         self.hyper2.SetBold(True)
1260         self.hyper2.UpdateLink()
1261         
1262         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1263         label_lerass.SetForegroundColour(txtcolour)
1264         label_lerass.SetBackgroundColour(bckgrdcolor)
1265         
1266         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1267         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1268         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1269         self.hyper_lerass.EnableRollover(True)
1270         self.hyper_lerass.SetUnderlines(False, False, True)
1271         self.hyper_lerass.SetBold(True)
1272         self.hyper_lerass.UpdateLink()
1273         
1274         blank = wx.StaticText(PanelPres, -1, u'\n')
1275         blank1 = wx.StaticText(PanelPres, -1, u'\n')
1276         
1277         labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1278         labellicence.SetForegroundColour(txtcolour)
1279         labellicence.SetBackgroundColour(bckgrdcolor)
1280         
1281         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1282         labelcopy.SetForegroundColour(txtcolour)
1283         labelcopy.SetBackgroundColour(bckgrdcolor)
1284         
1285         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1286         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1287         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1288         but_python = wx.BitmapButton(self, -1, python_img)
1289         but_lexique = wx.BitmapButton(self, -1, lexique_img)
1290         but_r = wx.BitmapButton(self, -1, r_img)
1291         self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1292         self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1293         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1294         
1295         
1296         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1297         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1298         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1299         sizer4.Add(label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
1300         
1301         sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1302         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1303         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
1304         sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1305         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
1306         sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1307         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1308         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1309         sizer1.Add(sizer4, 2, wx.ALIGN_CENTER_HORIZONTAL, 0)
1310         sizer1.Add(but_ira, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
1311         sizer1.Add(iralink, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_TOP, 5)
1312         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 10)
1313         PanelPres.SetSizer(sizer2)
1314         grid_sizer_2.Add(but_python, 1, wx.ALIGN_BOTTOM)
1315         grid_sizer_2.Add(but_lexique, 1, wx.ALIGN_BOTTOM)
1316         grid_sizer_2.Add(but_r, 1,  wx.ALIGN_BOTTOM)
1317         
1318         sizer1.Add(PanelPres, 0, wx.EXPAND |wx.ALL, 10)
1319         sizer1.Add(grid_sizer_2, 2, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 1)
1320         self.SetSizer(sizer1)
1321         sizer1.Fit(self)
1322     
1323     def OnPython(self,evt):
1324         webbrowser.open('http://www.python.org')
1325     
1326     def OnLexique(self,evt):
1327         webbrowser.open('http://www.lexique.org')
1328         
1329     def OnR(self,evt):
1330         webbrowser.open('http://www.r-project.org')
1331
1332 class MySplashScreen(wx.SplashScreen):
1333     def __init__(self):
1334         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1335         wx.SplashScreen.__init__(self, bmp,
1336                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1337                                  2000, None, -1)
1338         self.Bind(wx.EVT_CLOSE, self.OnClose)
1339         self.fc = wx.FutureCall(1, self.ShowMain)
1340
1341     def OnClose(self, evt):
1342         evt.Skip()
1343         self.Hide()
1344         
1345         if self.fc.IsRunning():
1346             self.fc.Stop()
1347             self.ShowMain()
1348
1349     def ShowMain(self):
1350         displaySize = wx.DisplaySize()
1351         w = displaySize[0]/1.2
1352         h = displaySize[1]/1.2
1353         frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1354         frame.Show()
1355         frame.finish_init()
1356         frame.Upgrade()
1357         frame.OnOpenFromCmdl()
1358 #        if self.fc.IsRunning():
1359 #            self.Raise()
1360         #wx.CallAfter(frame.ShowTip)
1361         
1362 class MyApp(wx.App):
1363     def OnInit(self):
1364         """
1365         Create and show the splash screen.  It will then create and show
1366         the main frame when it is time to do so.
1367         """
1368         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1369         self.SetAppName("Iramuteq")       
1370         splash = MySplashScreen()
1371         splash.Show()
1372         return True
1373
1374 def main():
1375     app = MyApp(False)
1376     app.MainLoop()
1377
1378 if __name__ == '__main__':
1379     __name__ = 'Main'
1380     main()