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