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