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