...
[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         #langues = ['fr_FR', 'en', 'pt_PT']
179         #for l in langues :
180         #    pass
181         self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
182         self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
183         self.setlangue()
184         # tell FrameManager to manage this frame        
185         #self._mgr = wx.aui.AuiManager()
186         self._mgr = aui.AuiManager()
187         self._mgr.SetManagedWindow(self)
188         self.x = 0
189         # create menu
190 #--------------------------------------------------------------------------------
191         self.mb = wx.MenuBar()
192
193         file_menu = wx.Menu()
194         item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
195         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
196         file_menu.AppendItem(item)
197         
198         item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
199         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
200         file_menu.AppendItem(item)
201         
202         item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
203         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
204         file_menu.AppendItem(item)
205
206         
207         menuFactiva = wx.Menu()
208         fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
209         fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
210         fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
211         menuFactiva.AppendItem(fact_from_xml)
212         menuFactiva.AppendItem(fact_from_mail)
213         menuFactiva.AppendItem(fact_from_txt)
214         file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
215
216         item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
217         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
218         file_menu.AppendItem(item)
219
220         menuTools = wx.Menu()
221         splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
222         extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
223         extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
224         menuTools.AppendItem(splitvar)
225         menuTools.AppendItem(extractmod)
226         menuTools.AppendItem(extractthem)
227         self.ID_splitvar = splitvar.GetId()
228         self.ID_extractmod = extractmod.GetId()
229         self.ID_extractthem = extractthem.GetId()
230         file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
231
232                
233         #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
234         #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
235         #file_menu.AppendItem(item)
236         
237         file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
238         
239         edit_menu = wx.Menu()
240         edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
241         
242         view_menu = wx.Menu()
243         view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
244         view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
245         view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
246         #view_menu.AppendSeparator()
247         matrix_menu = wx.Menu()
248         matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
249         matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
250         #matrix_menu.Append(ID_Student, u"t de Student")
251         menu_classif = wx.Menu()
252         menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
253         #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
254         matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
255         #matrix_menu.Append(ID_AFCM, u"AFCM")
256         matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
257         matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
258         ID_RCODE = wx.NewId()
259         matrix_menu.Append(ID_RCODE, u"Code R...") 
260         #menu_splittab = wx.Menu()
261         #ID_SPLITVAR = wx.NewId()
262         #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
263         #menu_splittab.AppendItem(splitvar)
264         #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
265         self.matrix_menu = matrix_menu
266         
267         text_menu = wx.Menu()
268         #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
269         text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
270         text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
271         #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
272         menu_classiftxt = wx.Menu()
273         menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
274         #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
275         text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
276         text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) 
277         ID_WC = wx.NewId()
278         text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
279         self.text_menu = text_menu
280         
281         help_menu = wx.Menu()
282         help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
283         help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
284         
285         self.mb.Append(file_menu, _(u"File").decode('utf8'))
286         self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
287         self.mb.Append(view_menu, _(u"View").decode('utf8'))
288         self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
289         self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
290         self.mb.Append(help_menu, _(u"Help").decode('utf8'))
291         
292         self.SetMenuBar(self.mb)
293 #--------------------------------------------------------------------
294         self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
295         self.statusbar.SetStatusWidths([-2, -3])
296         self.statusbar.SetStatusText(u"Prêt", 0)
297         self.statusbar.SetStatusText(u"Bienvenue", 1)
298
299         # min size for the frame itself isn't completely done.
300         # see the end up FrameManager::Update() for the test
301         # code. For now, just hard code a frame minimum size
302         self.SetMinSize(wx.Size(400, 400))
303
304         # create some toolbars
305         tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
306                          wx.TB_FLAT | wx.TB_NODIVIDER)
307         tb1.SetToolBitmapSize(wx.Size(16, 16))
308         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")
309         tb1.AddSeparator()
310         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")
311
312         tb1.Realize()
313         
314 #------------------------------------------------------------------------------------------------
315
316         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)
317                       
318         #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
319         #                  Name("Text").CenterPane())                      
320         self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
321                           Name("Text").CenterPane())
322         #self._mgr.AddPane(IntroPanel(self), wx.aui.AuiPaneInfo().Name("Intro_Text").
323         #                  CenterPane())
324         self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
325                           CenterPane())
326         #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
327         #    with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
328         #        f.write('')
329         self.history = History(os.path.join(UserConfigPath, 'history.db'))
330         self.tree = LeftTree(self)
331         self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Navigator").decode('utf8')).
332                           Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
333                           MinimizeButton(True))
334         
335         #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)
336         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)
337         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
338         self.nb.SetAGWWindowStyleFlag(notebook_flags)
339         self.nb.SetArtProvider(aui.ChromeTabArt())
340         #self.nb.SetArtProvider(aui.VC8TabArt())
341         #self.nb.parent = self
342         #self._notebook_style = aui.AUI_NB_DEFAULT_STYLE | aui.AUI_NB_TAB_EXTERNAL_MOVE | wx.NO_BORDER
343         #self._mgr.AddPane(self.nb, wx.aui.AuiPaneInfo().
344         #                      Name("Tab_content").
345         #                      CenterPane())
346         self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
347                               Name("Tab_content").
348                               CenterPane())        
349         
350         #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
351         #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
352         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
353         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
354         # add the toolbars to the manager
355                         
356         #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
357         #                  Name("tb1").Caption("Fichiers").
358         #                  ToolbarPane().Top().
359         #                  LeftDockable(False).RightDockable(False))
360         self._mgr.AddPane(tb1, aui.AuiPaneInfo().
361                           Name("tb1").Caption("Fichiers").
362                           ToolbarPane().Top().
363                           LeftDockable(True).RightDockable(False))        
364         
365         self.ShowAPane("Intro_Text")
366         self._mgr.GetPane("lefttree").Show()
367         self._mgr.GetPane("classif_tb").Hide()
368         # "commit" all changes made to FrameManager   
369         self._mgr.Update()
370
371         # Show How To Use The Closing Panes Event
372 ##################################################################        
373         self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
374         self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
375         self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
376         self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
377         self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
378         self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
379         self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
380         self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
381         self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
382         self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
383         self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
384         self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
385         self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
386         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
387         self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
388         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
389         self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
390         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
391         self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
392         self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
393         #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
394         #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
395         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
396         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
397         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
398         self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
399         self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
400         self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
401         self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
402         self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
403         self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
404         #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
405         self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
406         self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
407         self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
408         self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
409         self.Bind(wx.EVT_CLOSE, self.OnClose)
410 ##################################################################
411         flags = self._mgr.GetAGWFlags()
412         #flags &= ~wx.aui.AUI_MGR_TRANSPARENT_HINT
413         #flags &= ~wx.aui.AUI_MGR_VENETIAN_BLINDS_HINT
414         #flags &= ~wx.aui.AUI_MGR_RECTANGLE_HINT
415         flags &= ~(aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING)
416         self._mgr.SetAGWFlags(self._mgr.GetAGWFlags() ^ (aui.AUI_MGR_RECTANGLE_HINT | aui.AUI_MGR_ALLOW_FLOATING))
417         self._mgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_GRADIENT_TYPE, aui.AUI_GRADIENT_HORIZONTAL)
418         self.GetDockArt().SetColor(aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR, "#00FFF9")
419         self.DoUpdate()
420
421         self._icon = wx.Icon(os.path.join(ImagePath, "iraicone.ico"), wx.BITMAP_TYPE_ICO)
422         self.SetIcon(self._icon)
423 ##########################
424         self.ctrl = ""
425         self.input_path = [False]
426         self.TEMPDIR = tempfile.mkdtemp('iramuteq')
427         self.FileTabList = []
428         self.listbar=[]
429         self.DictTab = {}
430         self.FreqNum = 0
431         self.colsep = ''
432         self.txtsep = ''
433         self.g_header = False
434         self.g_id = False
435         self.table = ''
436         self.fileforR = ''
437         self.filename = ''
438         self.nastrings = ''
439         self.encode = ''
440         self.SysEncoding = sys.getdefaultencoding()
441         self.syscoding = sys.getdefaultencoding()
442         #print 'SysEncoding',self.SysEncoding
443         if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
444         self.type = ''
445
446 ##############################################################@
447         self.DisEnSaveTabAs(False)
448         self.ShowMenu(_("View").decode('utf8'), False)
449         self.ShowMenu(_("Matrix analysis").decode('utf8'), False)
450         self.ShowMenu(_("Text analysis").decode('utf8'), False)
451    
452         self._mgr.Update()
453
454         self.DataPop = False
455         self.DataTxt = False
456         self.Text = ''
457
458         self.lexique = None
459         self.corpus = None
460
461     def finish_init(self) :
462         try :
463             self.pref.read(self.ConfigPath['preferences'])
464             if IsNew(self) :
465                 UpgradeConf(self)
466                 self.pref.read(self.ConfigPath['preferences'])
467                 New = True
468             else :
469                 CopyConf(self)
470                 New = False
471         except :
472             UpgradeConf(self)
473             self.pref.read(self.ConfigPath['preferences'])
474             New = True
475         self.sound = self.pref.getboolean('iramuteq', 'sound')
476         self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
477         self.version = ConfigGlob.get('DEFAULT', 'version')
478         #configuration des chemins de R
479         self.PathPath = ConfigParser()
480         self.PathPath.read(ConfigPath['path'])
481         BestRPath = False
482         if not CheckRPath(self.PathPath) :
483             if sys.platform == 'win32':
484                 BestRPath = FindRPAthWin32()
485             else:
486                 BestRPath = FindRPathNix()
487             if BestRPath:
488                 self.PathPath.set('PATHS', 'rpath', BestRPath)
489                 with open(ConfigPath['path'], 'w') as f :
490                     self.PathPath.write(f)
491         else:
492             BestRPath = True 
493         if BestRPath :
494             self.RPath = self.PathPath.get('PATHS', 'rpath')
495             if New :
496                 CheckRPackages(self)
497             if not RLibsAreInstalled(self) :
498                 CheckRPackages(self)
499         else :
500             msg = u"""
501 Le chemin de l'executable de R n'a pas été trouvé.
502 Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
503 Si R n'est pas installé dans le répertoire par défaut
504 (souvent C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
505 vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" 
506             dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
507             dlg.CenterOnParent()
508             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
509                 pass
510             dlg.Destroy()
511
512
513     def setlangue(self) :
514         try :
515             self.pref.read(self.ConfigPath['preferences'])
516             guilangue = self.pref.get('iramuteq', 'guilanguage')
517             if guilangue == 'french' :
518                 self.presLan_fr.install()
519             elif guilangue == 'portuguese' :
520                 self.presLan_pt.install()
521             else :
522                 self.presLan_en.install()
523             mylocale = wx.Locale(langues[guilangue])
524             mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
525             mylocale.AddCatalog('iramuteq')
526         except :
527             self.presLan_fr.install()
528             mylocale = wx.Locale(langues['french'])
529             mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
530             mylocale.AddCatalog('iramuteq')
531
532
533     def OnVerif(self, evt) :
534         pack = CheckRPackages(self)
535         if pack :
536             dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.ICON_INFORMATION)
537             dlg.CenterOnParent()
538             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
539                 evt.Veto()
540
541     def DisEnSaveTabAs(self, DISEN):
542     #Disable SaveTabAs
543         file_menu = self.mb.GetMenu(0)
544         items = file_menu.GetMenuItems()
545         for item in items :
546             if item.GetId() == ID_SaveTab :
547                 item.Enable(DISEN)
548     
549     def ShowMenu(self, menu, Show=True):
550         menu_pos = self.mb.FindMenu(menu)
551         self.mb.EnableTop(menu_pos, Show)
552         self.mb.UpdateMenus()
553
554
555 #--------------------------------------------------------------------
556     def OnClose(self, event):
557         print 'onclose'
558         with open(self.ConfigPath['path'], 'w') as f :
559             self.PathPath.write(f)
560         self._mgr.UnInit()
561         del self._mgr
562         self.Destroy()
563
564     def OnOpenData(self, event):
565         inputname, self.input_path = OnOpen(self, "Data")
566         if inputname:
567             #filename = self.input_path[0]
568             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
569             val = get_table_param(self, self.input_path[0])
570             if val == wx.ID_OK :
571                 self.tableau.make_content()
572                 OpenAnalyse(self, self.tableau.parametres)
573                 self.tree.OnItemAppend(self.tableau.parametres)
574                 #self.tableau.show_tab()
575
576     def OnOpenAnalyse(self, event):
577         self.AnalysePath = OnOpen(self, "Analyse")
578         OpenAnalyse(self, self.AnalysePath[1][0], True)
579         self.ShowMenu(_("View"))
580
581     def OnOpenText(self, event):
582         inputname, self.input_path = OnOpen(self, "Texte")
583         self.filename = self.input_path[0]
584         if inputname:
585             self.OpenText()
586    
587     def OnViewData(self, event):
588         print self.type
589         print self.DataTxt
590         if self.type == "Data":
591             if not self.DataPop :
592                 self.Sheet.Populate(self.content)
593                 self.DataPop = True
594                 self.DataTxt = False
595             self.ShowAPane(u"Data")
596         elif self.type == "Texte" or self.type == 'Analyse' :
597             if not self.DataTxt :
598                 self.text_ctrl_txt.Clear()
599                 self.text_ctrl_txt.write(self.content)
600                 self.text_ctrl_txt.ShowPosition(0)
601                 self.DataTxt = True
602                 self.DataPop = False
603             self.ShowAPane(u"Text")
604         self._mgr.Update()
605     
606     def OnSubText(self, corpus, parametres = None):
607         if corpus is None :
608             corpus = self.tree.getcorpus()
609         builder = SubBuilder(self, corpus, parametres)
610         if builder.res == wx.ID_OK :
611             busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
612             wx.SafeYield()
613             corpus = builder.doanalyse()
614             self.history.add(corpus.parametres)
615             self.tree.OnItemAppend(corpus.parametres)
616             OpenAnalyse(self, corpus.parametres)
617             del busy
618             
619     def OpenText(self):
620         dlg = wx.ProgressDialog("Ouverture...",
621                                    "Veuillez patienter...",
622                                    maximum=2,
623                                    parent=self,
624                                    style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
625                                    )
626         
627         builder =  Builder(self, dlg)
628         if builder.res == wx.ID_OK :
629             try :
630                 corpus = builder.doanalyse()
631                 self.history.add(corpus.parametres)
632                 self.tree.OnItemAppend(corpus.parametres)
633                 OpenAnalyse(self, corpus.parametres)
634             except :
635                 BugReport(self)
636             else :
637                 count = 1
638                 keepGoing = dlg.Update(count, u"Lecture du fichier")
639                 self.ShowMenu(_(u"View").decode('utf8'))
640                 self.ShowMenu(_(u"Text analysis").decode('utf8'))
641                 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
642                 self.type = "Texte"
643                 self.DataTxt = False
644                 self.Text = ''
645                 count += 1
646                 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
647                 dlg.Destroy()
648         #self.OnViewData(wx.EVT_BUTTON)
649         
650     def OnExit(self, event):
651         self.Close()
652
653     def OnAbout(self, event):
654         info = wx.AboutDialogInfo()
655         info.Name = ConfigGlob.get('DEFAULT', 'name')
656         info.Version = ConfigGlob.get('DEFAULT', 'version')
657         info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
658         info.Description = u"""
659 Interface de R pour les Analyses Multidimensionnelles 
660 de Textes et de Questionnaires
661
662 Un logiciel libre
663 construit avec des logiciels libres.
664
665 Laboratoire LERASS
666
667 REPERE
668 """
669         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
670         dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
671         info.Developers = dev
672         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
673 suivant les termes de la Licence Publique Générale GNU telle que publiée 
674 par la Free Software Foundation ; soit la version 2 de cette licence, 
675 soit (à votre convenance) une version ultérieure.
676
677 Iramuteq est diffusé dans l'espoir qu'il sera utile, 
678 mais SANS AUCUNE GARANTIE ; sans même une garantie implicite 
679 de COMMERCIALISATION ou d'ADÉQUATION À UN USAGE PARTICULIER. 
680 Voyez la Licence Publique Générale GNU pour plus de détails.
681
682 Vous devriez avoir reçu une copie de la Licence Publique Générale GNU
683 avec Iramuteq ; sinon, veuillez écrire à la Free Software Foundation,
684 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
685         wx.AboutBox(info)
686
687     def GetDockArt(self):
688         return self._mgr.GetArtProvider()
689
690     def DoUpdate(self):
691         self._mgr.Update()
692
693     def OnPageChanged(self, event) :
694         new = event.GetSelection()
695         nobject = event.GetEventObject()
696         parent = nobject.GetParent()
697         if isinstance(parent, IraFrame) :
698             npage = self.nb.GetPage(new)
699             if 'parametres' in dir(npage) :
700                 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
701                 if npage.parametres.get('matrix', False) :
702                     self.ShowMenu(_(u"Text analysis").decode('utf8'), False)
703                     self.ShowMenu(_(u"Matrix analysis").decode('utf8'), True)
704                 elif npage.parametres.get('corpus', False) :
705                     self.ShowMenu(_(u"Text analysis").decode('utf8'))
706                     self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
707
708     def OnCloseTab(self, evt):
709         #log.info('Closing tab %s' % str(evt.GetEventObject()))
710         ctrl = evt.GetEventObject()
711         if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
712             notebook = True
713         else :
714             notebook = False
715         page = self.nb.GetPage(self.nb.GetSelection())
716         if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
717             self.history.rmtab(page.parametres)
718             self.tree.CloseItem(uuid = page.parametres['uuid'])
719         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
720 #         if self.DictTab != {} :
721 #             if TabTitle in self.DictTab :
722 #                 ListFile=self.DictTab[TabTitle]
723 #                 if False in ListFile:
724 #                     msg = u"""
725 # Certains résultats ne sont pas enregistrer.
726 # Voulez-vous fermer quand même ?"""
727 #                     dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
728
729 #                     dlg.CenterOnParent()
730 #                     if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
731 #                         remove = False
732 #                         evt.Veto()
733 #                         dlg.Destroy()
734 #                     else :
735 #                         for f in ListFile[1:] :
736 #                             print 'remove', f
737 #                             os.remove(f)
738 #                             remove = True
739 #                         dlg.Destroy()
740 #                 elif True in ListFile :
741 #                     remove = True
742 #                 if remove:
743 #                     del self.DictTab[TabTitle]
744 #             else : 
745 #                 self.LastTabClose()
746 #        else :
747 #            remove = True
748         if self.nb.GetPageCount() == 1 and not notebook :
749             self.LastTabClose()
750     
751     def LastTabClose(self) :
752         if self.nb.GetPageCount() == 1 :
753             #self.DisEnSaveTabAs(False)
754             if self.DataTxt :
755                 self.ShowAPane("Text")
756             elif self.DataPop :
757                 self.ShowAPane("Data")
758             else :
759                 self.ShowAPane("Intro_Text")
760
761 #     def OnSaveTabAs(self, event):
762 #         SelectTab = self.nb.GetSelection()
763 #         TabTitle = self.nb.GetPageText(SelectTab)
764 #         FileToSave = self.DictTab[TabTitle]
765 #         NewListFile = []
766 #         dlg = wx.FileDialog(
767 #             self, message="Enregistrer sous...", defaultDir=os.getcwd(),
768 #             defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
769 #             )
770 #         dlg.SetFilterIndex(2)
771 #         dlg.CenterOnParent()
772 #         
773 #         if dlg.ShowModal() == wx.ID_OK:
774 #             Path = dlg.GetPath()
775 #             Dirname = os.path.dirname(Path)
776 #             Filename = dlg.GetFilename()
777 #         else :
778 #             Path = False
779 #         dlg.Destroy()
780 #         if Path:
781 #             shutil.copyfile(FileToSave[-1], Path)
782 #             os.remove(FileToSave[len(FileToSave) - 1])
783 #             NewListFile.append(True)
784 #             NewListFile.append(Path)
785 #             for f in FileToSave[1:-1] :
786 #                 Fileout = os.path.join(Dirname, os.path.basename(f))
787 #                 shutil.copyfile(f, Fileout)
788 #                 NewListFile.append(Fileout)
789 #                 os.remove(f)
790 #             TabText = Filename
791 #             self.DictTab[TabText] = NewListFile
792 #             del self.DictTab[TabTitle]
793 #             self.nb.SetPageText(SelectTab, TabText)
794
795     def GetStartPosition(self):
796
797         self.x = self.x + 20
798         x = self.x
799         pt = self.ClientToScreen(wx.Point(0, 0))
800         
801         return wx.Point(pt.x + x, pt.y + x)
802     
803     def ShowAPane(self, panel):
804         for pane in self._mgr.GetAllPanes() :
805             if not pane.IsToolbar() and pane.name != 'lefttree': 
806                 pane.Hide()
807         self._mgr.GetPane(panel).Show()
808         self._mgr.Update()
809         
810     def OnAcceuil(self, event):
811         self.ShowAPane(u"Intro_Text")
812         event.Skip()
813     
814     def CreateHTMLCtrl(self):
815         ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
816         if "gtk2" in wx.PlatformInfo:
817             ctrl.SetStandardFonts()
818         ctrl.SetPage(u"text")        
819         return ctrl
820
821     def ShowTab(self, evt):
822         self.ShowAPane("Tab_content")
823
824 ################################################################
825 #debut des analyses
826 ################################################################
827     def analyse_matrix(self, analyse, analyse_type = '', matrix = None, dlgnb = 1):
828         if matrix is None :
829             matrix = self.tree.getmatrix()
830         #try :
831         analyse(self, matrix, parametres = {'type' : analyse_type}, dlg = progressbar(self, dlgnb))
832         #except:
833         #    BugReport(self)           
834
835     def OnFreq(self, event, matrix = None):
836         self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
837         #if matrix is None :
838         #    matrix = self.tree.getmatrix()
839         #try:
840         #    Frequences(self, matrix, parametres = {'type' : 'freq'}, dlg = progressbar(self, 3)) 
841         #except:
842         #    BugReport(self)
843
844     def OnChi2(self, event, matrix = None):
845         #try:
846         self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3) 
847         #except:
848         #    BugReport(self)
849
850     def OnSimiTab(self, event, matrix = None):
851         if matrix is None :
852             matrix = self.tree.getmatrix()
853         try:
854             DoSimi(self, matrix, parametres = {'type' : 'simimatrix'}, dlg = progressbar(self, 3)) 
855         except:
856             BugReport(self)
857
858     def OnCHDReinert(self, event, matrix = None):
859         if matrix is None :
860             matrix = self.tree.getmatrix()
861         AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = progressbar(self, 3))
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', 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()