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