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