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