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