profile translation
[iramuteq] / iramuteq.py
index 0abc480..c84dd0d 100644 (file)
@@ -1,8 +1,8 @@
 #!/bin/env python
 # -*- coding: utf-8 -*-
 #Author: Pierre Ratinaud
 #!/bin/env python
 # -*- coding: utf-8 -*-
 #Author: Pierre Ratinaud
-#Copyright (c) 2008-2012, Pierre Ratinaud
-#Lisense: GNU GPL
+#Copyright (c) 2008-2016, Pierre Ratinaud
+#License: GNU GPL
 
 from optparse import OptionParser
 
 
 from optparse import OptionParser
 
@@ -11,61 +11,57 @@ parser.add_option("-f", "--file", dest="filename",
                   help="open FILE", metavar="FILE", default=False)
 (options, args) = parser.parse_args()
 
                   help="open FILE", metavar="FILE", default=False)
 (options, args) = parser.parse_args()
 
-#print args
-#print options
-
 import sys
 reload(sys)
 import locale
 import tempfile
 import codecs
 import os
 import sys
 reload(sys)
 import locale
 import tempfile
 import codecs
 import os
-import shutil
 from random import randint
 from random import randint
-from ConfigParser import *
+from ConfigParser import ConfigParser, RawConfigParser
 import webbrowser
 import gettext
 import logging
 #------------------------------------
 import wx
 import webbrowser
 import gettext
 import logging
 #------------------------------------
 import wx
-#import wx.aui
-#import wx.lib.agw.aui as aui
-import agw.aui as aui
+import wx.lib.agw.aui as aui
 import wx.html
 import wx.grid
 import wx.lib.hyperlink as hl
 import wx.html
 import wx.grid
 import wx.lib.hyperlink as hl
-#from wx.lib.wordwrap import wordwrap
 #------------------------------------
 #------------------------------------
-from functions import BugReport, PlaySound, ReadLexique, History, DoConf, ReadDicoAsDico, progressbar
+from functions import BugReport, PlaySound, History, progressbar
 from checkversion import NewVersion
 from guifunct import *
 from tableau import Tableau
 from checkversion import NewVersion
 from guifunct import *
 from tableau import Tableau
-from dialog import PrefDialog, EncodeDialog, CorpusPref
-from tabfrequence import Frequences
+from dialog import PrefDialog
+from tabfrequence import Frequences, FreqMultiple
 from tabchi2 import ChiSquare
 from tabchi2 import ChiSquare
+from tabchi2mcnemar import McNemar
 #from tabstudent import MakeStudent
 from tabchddist import ChdCluster
 from tabafcm import DoAFCM
 from tabchdalc import AnalyseQuest
 from tabsimi import DoSimi
 from tabrsimple import InputText
 #from tabstudent import MakeStudent
 from tabchddist import ChdCluster
 from tabafcm import DoAFCM
 from tabchdalc import AnalyseQuest
 from tabsimi import DoSimi
 from tabrsimple import InputText
-from tabverges import Verges
-#from textafcuci import AfcUci
-#from textchdalc import AnalyseAlceste
-from analysetxt import Alceste
-from textdist import PamTxt
+from tabverges import Prototypical
+from tabsplitvar import SplitMatrixFromVar
+#from textdist import AnalysePam
 from textstat import Stat
 from textaslexico import Lexico
 from textstat import Stat
 from textaslexico import Lexico
-from textsimi import SimiTxt
-from textwordcloud import WordCloud
-from profile_segment import ProfileSegment
-from textcheckcorpus import checkcorpus
+from textlabbe import DistLabbe
+from textsimi import SimiTxt, SimiFromCluster
+from textwordcloud import WordCloud, ClusterCloud
+from textreinert import Reinert
+#from textcheckcorpus import checkcorpus
 from openanalyse import OpenAnalyse
 from openanalyse import OpenAnalyse
-from corpusNG import BuildFromAlceste, Builder
-from sheet import MySheet
-from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRapp, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
-from chemins import ConstructRscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
+from corpus import Builder, SubBuilder
+from checkinstall import CreateIraDirectory, CheckRPath, FindRPAthWin32, FindRPathNix, CheckRPackages, IsNew, UpgradeConf, CopyConf, RLibsAreInstalled
+from chemins import RscriptsPath, ConstructConfigPath, ConstructDicoPath, ConstructGlobalPath, PathOut
 from parse_factiva_xml import ImportFactiva
 from parse_factiva_xml import ImportFactiva
+from parse_dmi import ImportDMI
+from tools import Extract
+from analyse_merge import AnalyseMerge
+
 from tree import LeftTree
 ##########################################################
 ID_OpenData = wx.NewId()
 from tree import LeftTree
 ##########################################################
 ID_OpenData = wx.NewId()
@@ -74,13 +70,14 @@ ID_OpenText = wx.NewId()
 ID_OnOpenAnalyse = wx.NewId()
 ID_Freq = wx.NewId()
 ID_Chi2 = wx.NewId()
 ID_OnOpenAnalyse = wx.NewId()
 ID_Freq = wx.NewId()
 ID_Chi2 = wx.NewId()
+ID_Chi2mc = wx.NewId()
 ID_Student = wx.NewId()
 ID_CHDSIM = wx.NewId()
 ID_Student = wx.NewId()
 ID_CHDSIM = wx.NewId()
-ID_CHDAlceste = wx.NewId()
+ID_CHDReinert = wx.NewId()
 ID_TEXTAFCM = wx.NewId()
 ID_TEXTSTAT = wx.NewId()
 ID_ASLEX = wx.NewId()
 ID_TEXTAFCM = wx.NewId()
 ID_TEXTSTAT = wx.NewId()
 ID_ASLEX = wx.NewId()
-ID_TEXTALCESTE = wx.NewId()
+ID_TEXTREINERT = wx.NewId()
 ID_TEXTPAM = wx.NewId()
 ID_CHECKCORPUS = wx.NewId()
 ID_Tabcontent = wx.NewId()
 ID_TEXTPAM = wx.NewId()
 ID_CHECKCORPUS = wx.NewId()
 ID_Tabcontent = wx.NewId()
@@ -91,20 +88,34 @@ ID_SaveTab = wx.NewId()
 ID_CreateText = wx.NewId()
 ID_ACCEUIL = wx.NewId()
 ID_RESULT = wx.NewId()
 ID_CreateText = wx.NewId()
 ID_ACCEUIL = wx.NewId()
 ID_RESULT = wx.NewId()
-ID_VIEWDATA = wx.NewId()
 ID_HTMLcontent = wx.NewId()
 ID_SimiTxt = wx.NewId()
 ID_HTMLcontent = wx.NewId()
 ID_SimiTxt = wx.NewId()
+ID_proto = wx.NewId()
+ID_ImportTXM = wx.NewId()
+ID_FreqMulti = wx.NewId()
+ID_Splitfromvar = wx.NewId()
+ID_Subtxtfrommeta = wx.NewId()
+ID_Subtxtfromthem = wx.NewId()
+ID_WC = wx.NewId()
+ID_ImportEuro = wx.NewId()
+ID_Fact_xml = wx.NewId()
+ID_Fact_mail = wx.NewId()
+ID_Fact_copy = wx.NewId()
+ID_exportmeta = wx.NewId()
+ID_importdmi = wx.NewId()
+ID_merge = wx.NewId()
+ID_labbe = wx.NewId()
 ##########################################################
 #elements de configuration
 ##########################################################
 #encodage
 if sys.platform == 'darwin' :
 ##########################################################
 #elements de configuration
 ##########################################################
 #encodage
 if sys.platform == 'darwin' :
-    sys.setdefaultencoding('utf-8')
-    wx.SetDefaultPyEncoding('utf-8')
+    sys.setdefaultencoding('UTF-8')
+    wx.SetDefaultPyEncoding('UTF-8')
 else :
     sys.setdefaultencoding(locale.getpreferredencoding())
 else :
     sys.setdefaultencoding(locale.getpreferredencoding())
-#chemin de l'application
 
 
+#chemin de l'application
 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
 #chemin des images
 ImagePath = os.path.join(AppliPath, 'images')
 AppliPath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv[0])))
 #chemin des images
 ImagePath = os.path.join(AppliPath, 'images')
@@ -112,34 +123,90 @@ ImagePath = os.path.join(AppliPath, 'images')
 DictConfigPath = ConstructGlobalPath(AppliPath)
 ConfigGlob = ConfigParser()
 ConfigGlob.read(DictConfigPath['global'])
 DictConfigPath = ConstructGlobalPath(AppliPath)
 ConfigGlob = ConfigParser()
 ConfigGlob.read(DictConfigPath['global'])
+DefaultConf = ConfigParser()
+DefaultConf.read(DictConfigPath['preferences'])
 #repertoire de l'utilisateur
 #repertoire de l'utilisateur
-if os.getenv('HOME') != None:
-    user_home = os.getenv('HOME')
-else:
-    user_home = os.getenv('HOMEPATH')
-UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq'))
-#Si pas de fichiers de config utilisateur, on crée le repertoire
+user_home = os.getenv('HOME')
+if user_home is None :
+    user_home = os.path.expanduser('~')
+
+UserConfigPath = os.path.abspath(os.path.join(user_home, '.iramuteq-%s' % ConfigGlob.get('DEFAULT', 'version_nb')))
+#Si pas de fichiers de config utilisateur, on cree le repertoire
 CreateIraDirectory(UserConfigPath, AppliPath)
 #fichiers log pour windows (py2exe)
 CreateIraDirectory(UserConfigPath, AppliPath)
 #fichiers log pour windows (py2exe)
-print 'PLUS DE LOG !!!!!!!!!!'
-print 'LOGGING TEST'
 log = logging.getLogger('iramuteq')
 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
 log = logging.getLogger('iramuteq')
 fh = logging.FileHandler(os.path.join(UserConfigPath,'stdout.log'))
-ch = logging.StreamHandler()
-formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-ch.setFormatter(formatter)
+formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
 fh.setFormatter(formatter)
 fh.setFormatter(formatter)
-log.addHandler(ch)
 log.addHandler(fh)
 log.addHandler(fh)
+if sys.platform != 'win32' and sys.platform != 'darwin':
+    ch = logging.StreamHandler()
+    ch.setFormatter(formatter)
+    log.addHandler(ch)
 log.setLevel(logging.INFO)
 log.setLevel(logging.INFO)
-#debug = False
-#if not debug :
-#    if sys.platform == 'win32' or sys.platform == 'darwin':
-#        sys.stdout = open(os.path.join(UserConfigPath,'stdout.log'), 'w')
-#        sys.stderr = open(os.path.join(UserConfigPath,'stderr.log'), 'w')
-#chemin des fichiers de configuration utilisateur
-#print sys.argv[0]
+
+class writer(object):
+    def write(self, data):
+        if data.strip() != '' :
+            log.info('ERROR : %s' % data)
+
+class printer(object) :
+    def write(self, data) :
+        if data.strip() != '' :
+            log.info('Print : %s' % data)
+
+sys.stderr = writer()
+sys.stdout = printer()
+
 ConfigPath = ConstructConfigPath(UserConfigPath)
 ConfigPath = ConstructConfigPath(UserConfigPath)
+
+langues = {'french' : wx.LANGUAGE_FRENCH,
+           'english' : wx.LANGUAGE_ENGLISH,
+           'portuguese' : wx.LANGUAGE_PORTUGUESE,
+           'italian' : wx.LANGUAGE_ITALIAN,
+           'spanish' : wx.LANGUAGE_SPANISH
+           }
+
+code_langues = {'french' : 'fr_FR',
+                'english' : 'en',
+                'portuguese' : 'pt_PT',
+                'italian' : 'it_IT',
+                'spanish' : 'es_ES'
+               }
+
+images_analyses = {
+        'textroot' : 'textroot.png',
+        'alceste' : 'reinert.png',
+        'corpus' : 'textcorpus.png',
+        'wordcloud' :'wordcloud.png',
+        'stat' :'stats.png',
+        'simitxt' : 'simitxt.png',
+        'clustersimitxt' :'clustersimitxt.png',
+        'clustercloud' : 'clustercloud.png',
+        'spec' : 'spec.png',
+        'matroot' : 'matroot.png',
+        'matrix' : 'matrix.png',
+        'freq' : 'frequences.png',
+        'freqmulti' : 'frequences.png',
+        'chi2' : 'chi2.png',
+        'chi2mcnemar' : 'chi2.png',
+        'reinertmatrix' : 'reinertmatrix.png',
+        'simimatrix' : 'simimatrix.png',
+        'simiclustermatrix' : 'simimatrix.png',
+        'proto' : 'proto.png',
+        'TXM' : 'TXM.png',
+        'europress' : 'europress.png',
+        'factiva_xml' : 'factiva_xml.png',
+        'factiva_copy' : 'factiva_copy.png',
+        'factiva_mail': 'factiva_mail.png',
+        'iramuteq' : 'iraicone.png',
+        'subcorpusmeta' : 'subcorpusmeta.png',
+        'subcorpusthema' : 'subcorpusthema.png',
+        'preferences' : 'preferences.png',
+        'exportmetatable' : 'exportmetatable.png',
+        'importdmi' : 'twitter.png',
+        'labbe' : 'spec.png'
+         }
 #####################################################################
 
 class IraFrame(wx.Frame):
 #####################################################################
 
 class IraFrame(wx.Frame):
@@ -147,26 +214,34 @@ class IraFrame(wx.Frame):
                  size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | 
                                             wx.SUNKEN_BORDER | 
                                             wx.CLIP_CHILDREN):
                  size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | 
                                             wx.SUNKEN_BORDER | 
                                             wx.CLIP_CHILDREN):
-        log.info('Starting...')
+        log.info('Starting... ' )
+        log.info('version : %s' % ConfigGlob.get('DEFAULT', 'version'))
         wx.Frame.__init__(self, parent, id, title, pos, size, style)
         #configuration
         self.AppliPath = AppliPath
         self.images_path = os.path.join(AppliPath,'images')
         self.UserConfigPath = UserConfigPath
         wx.Frame.__init__(self, parent, id, title, pos, size, style)
         #configuration
         self.AppliPath = AppliPath
         self.images_path = os.path.join(AppliPath,'images')
         self.UserConfigPath = UserConfigPath
-        self.RscriptsPath = ConstructRscriptsPath(AppliPath)
-        self.DictPath = ConstructDicoPath(AppliPath)
+        #self.RscriptsPath = ConstructRscriptsPath(AppliPath)
+        self.RscriptsPath = PathOut(dirout=os.path.join(AppliPath, 'Rscripts'))
+        self.RscriptsPath.basefiles(RscriptsPath)
+        #self.DictPath = ConstructDicoPath(AppliPath)
+        self.DictPath = ConstructDicoPath(UserConfigPath)
         self.ConfigGlob = ConfigGlob
         self.ConfigPath = ConstructConfigPath(UserConfigPath)
         self.pref = RawConfigParser()
         self.ConfigGlob = ConfigGlob
         self.ConfigPath = ConstructConfigPath(UserConfigPath)
         self.pref = RawConfigParser()
+        #workaround for import problem
+        self.SimiFromCluster = SimiFromCluster
         #langues
         #langues
-        mylocale = wx.Locale(wx.LANGUAGE_FRENCH)
-        mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
-        mylocale.AddCatalog('iramuteq')
-        presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
-        presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
-        presLan_fr.install()
-
-
+        gettext.install('iramuteq',  os.path.join(AppliPath,'locale'), unicode=True)
+        #langues = ['fr_FR', 'en', 'pt_PT']
+        #for l in langues :
+        #    pass
+        self.preslangue = {}
+        for langue in code_langues :
+            self.preslangue[langue] = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=[code_langues[langue]])
+        self.setlangue()
+        #self.presLan_fr = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['fr_FR'])
+        #self.presLan_en = gettext.translation("iramuteq", os.path.join(AppliPath,'locale'), languages=['en'])
         # tell FrameManager to manage this frame        
         #self._mgr = wx.aui.AuiManager()
         self._mgr = aui.AuiManager()
         # tell FrameManager to manage this frame        
         #self._mgr = wx.aui.AuiManager()
         self._mgr = aui.AuiManager()
@@ -174,85 +249,199 @@ class IraFrame(wx.Frame):
         self.x = 0
         # create menu
 #--------------------------------------------------------------------------------
         self.x = 0
         # create menu
 #--------------------------------------------------------------------------------
+        self.images_analyses = images_analyses
+        for img in images_analyses :
+            self.images_analyses[img] = wx.Image(os.path.join(self.images_path, self.images_analyses[img]), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap()
         self.mb = wx.MenuBar()
 
         file_menu = wx.Menu()
         self.mb = wx.MenuBar()
 
         file_menu = wx.Menu()
-        item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a questionnaire"), _(u"Open a questionnaire"))
-        item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
+        item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a matrix").decode('utf8'), _(u"Open a matrix").decode('utf8'))
+        #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
+        item.SetBitmap(self.images_analyses['matroot'])
         file_menu.AppendItem(item)
         
         file_menu.AppendItem(item)
         
-        item = wx.MenuItem(file_menu, ID_OpenText, u"Ouvrir texte", u"Ouvrir un corpus texte")
-        item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
+        item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpus").decode('utf8'), _(u"Open a text corpus").decode('utf8'))
+        item.SetBitmap(self.images_analyses['textroot'])
         file_menu.AppendItem(item)
         
         file_menu.AppendItem(item)
         
-        item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, u"Ouvrir une Analyse", "Ouvrir une Analyse")
-        item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
+        item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
+        item.SetBitmap(self.images_analyses['iramuteq'])
         file_menu.AppendItem(item)
 
         file_menu.AppendItem(item)
 
-        item1 = wx.MenuItem(file_menu, ID_Import, u"Importer un corpus factiva...", "Importer un corpus factiva...")
-        item1.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_TIP))
-        file_menu.AppendItem(item1)
-        #item1.Enable(True)
-       
-        item = wx.MenuItem(file_menu, ID_SaveTab, u"Enregistrer l\'onglet sous...", u"Enregistrer l\'onglet sous ...")
-        item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
-        #item.Enable(False)
+        item = wx.MenuItem(file_menu, ID_ImportTXM, _(u"Import from TXM").decode('utf8'), _(u"Import from TXM").decode('utf8'))
+        item.SetBitmap(self.images_analyses['TXM'])
         file_menu.AppendItem(item)
         file_menu.AppendItem(item)
-        
-        file_menu.Append(wx.ID_EXIT, u"Exit")
-        
+
+        item = wx.MenuItem(file_menu, ID_ImportEuro, _(u"Import from Europress").decode('utf8'), _(u"Import from Europress").decode('utf8'))
+        item.SetBitmap(self.images_analyses['europress'])
+        file_menu.AppendItem(item)
+
+        item = wx.MenuItem(file_menu, ID_importdmi, _(u"Import from DMI-TCAT (exp.)").decode('utf8'), _(u"Import from DMI-TCAT (exp.)").decode('utf8'))
+        item.SetBitmap(self.images_analyses['importdmi'])
+        file_menu.AppendItem(item)
+
+        item = wx.MenuItem(file_menu, ID_merge, _(u'Merge graphs').decode('utf8'), _(u'Merge graphs').decode('utf8'))
+        file_menu.AppendItem(item)
+
+        menuFactiva = wx.Menu()
+        fact_from_xml = wx.MenuItem(menuFactiva, ID_Fact_xml, _(u"from xml").decode('utf8'))
+        fact_from_xml.SetBitmap(self.images_analyses['factiva_xml'])
+        fact_from_mail = wx.MenuItem(menuFactiva, ID_Fact_mail, _(u"from mail").decode('utf8'))
+        fact_from_mail.SetBitmap(self.images_analyses['factiva_mail'])
+        fact_from_txt = wx.MenuItem(menuFactiva, ID_Fact_copy, _(u"from copy/paste").decode('utf8'))
+        fact_from_txt.SetBitmap(self.images_analyses['factiva_copy'])
+        menuFactiva.AppendItem(fact_from_xml)
+        menuFactiva.AppendItem(fact_from_mail)
+        menuFactiva.AppendItem(fact_from_txt)
+        file_menu.AppendMenu(-1, _(u"Import from factiva").decode('utf8'), menuFactiva)
+
+        menuTools = wx.Menu()
+        splitvar = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Split from variable").decode('utf8'))
+        extractmod = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract mods").decode('utf8'))
+        extractthem = wx.MenuItem(menuTools, wx.ID_ANY, _(u"Extract thematics").decode('utf8'))
+        menuTools.AppendItem(splitvar)
+        menuTools.AppendItem(extractmod)
+        menuTools.AppendItem(extractthem)
+        self.ID_splitvar = splitvar.GetId()
+        self.ID_extractmod = extractmod.GetId()
+        self.ID_extractthem = extractthem.GetId()
+        file_menu.AppendMenu(-1, _(u"Tools").decode('utf8'), menuTools)
+
+
+        #item = wx.MenuItem(file_menu, ID_SaveTab, _(u"Save tab as...").decode('utf8'), _(u"Save tab as...").decode('utf8'))
+        #item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS))
+        #file_menu.AppendItem(item)
+
+        file_menu.Append(wx.ID_EXIT, _(u"Exit").decode('utf8'))
+
         edit_menu = wx.Menu()
         edit_menu = wx.Menu()
-        edit_menu.Append(wx.ID_PREFERENCES, '', u'Préférences')
-        
+        pref = wx.MenuItem(edit_menu, wx.ID_PREFERENCES, _(u'Preferences').decode('utf8'))
+        pref.SetBitmap(self.images_analyses['preferences'])
+        edit_menu.AppendItem(pref)
+        #edit_menu.Append(wx.ID_PREFERENCES, _(u'Preferences').decode('utf8'))
+
         view_menu = wx.Menu()
         view_menu = wx.Menu()
-        view_menu.Append(ID_ACCEUIL, u"Page d'accueil")
-        view_menu.Append(ID_VIEWDATA, u"Afficher les données")
-        view_menu.Append(ID_RESULT, u'Afficher les résultats')
+        home = wx.MenuItem(view_menu, ID_ACCEUIL, _(u"Home page").decode('utf8'))
+        home.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_GO_HOME, size = (16,16)))
+        view_menu.AppendItem(home)
+        #view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
+        results = wx.MenuItem(view_menu, ID_RESULT, _(u'Show results').decode('utf8'))
+        results.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_LIST_VIEW, size = (16,16)))
+        view_menu.AppendItem(results)
+        #view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
         #view_menu.AppendSeparator()
         #view_menu.AppendSeparator()
-
-        analyse_menu = wx.Menu()
-        analyse_menu.Append(ID_Freq, u"Fréquences")
-        analyse_menu.Append(ID_Chi2, u"Chi2")
-        #analyse_menu.Append(ID_Student, u"t de Student")
-        menu_classif = wx.Menu()
-        menu_classif.Append(ID_CHDAlceste, u"Méthode Alceste")
-        menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
-        analyse_menu.AppendMenu(-1, u"Classification", menu_classif)
-        analyse_menu.Append(ID_AFCM, u"AFCM")
-        analyse_menu.Append(ID_SIMI, u"Analyse de similitudes")
+        matrix_menu = wx.Menu()
+        matanalyses = [[ID_Freq, _(u"Frequencies").decode('utf8'), 'freq'],
+                       [ID_FreqMulti, _(u"Multiple  Frequencies").decode('utf8'), 'freqmulti'],
+                       [ID_Chi2, _(u"Chi2").decode('utf8'), 'chi2'],
+                       [ID_Chi2mc, _(u"Chi2 McNemar").decode('utf8'), 'chi2mcnemar'],
+                       {'name' : _(u"Clustering").decode('utf8'),
+                        'content' : [[ID_CHDReinert, _(u"Reinert's Method").decode('utf8'), 'reinertmatrix']]},
+                       [ID_SIMI, _(u"Similarities Analysis").decode('utf8'), 'simimatrix'],
+                       [ID_proto, _(u"Prototypical Analysis").decode('utf8'), 'proto'],
+                       [ID_Splitfromvar, _(u"Split from variable").decode('utf8'), 'subcorpusmeta'],
+                        ]
+
+        for analyse in matanalyses :
+            if not isinstance(analyse, dict) :
+                item = wx.MenuItem(matrix_menu, analyse[0], analyse[1])
+                item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)))
+                matrix_menu.AppendItem(item)
+            else :
+                nmenu = wx.Menu()
+                for subana in analyse['content'] :
+                    item = wx.MenuItem(nmenu, subana[0], subana[1])
+                    item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)))
+                    nmenu.AppendItem(item)
+                matrix_menu.AppendMenu(-1, analyse['name'], nmenu)
+        #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Frequencies").decode('utf8'))
+        #item.SetBitmap(self.images_analyses['freq'])
+        #matrix_menu.AppendItem(item)
+        #matrix_menu.Append(ID_Freq, _(u"Frequencies").decode('utf8'))
+        #item = wx.MenuItem(matrix_menu, ID_Freq, _(u"Multiple  Frequencies").decode('utf8'))
+        #item.SetBitmap(self.images_analyses['freqmulti'])
+        #matrix_menu.Append(ID_FreqMulti, _(u'Multiple frequencies').decode('utf8'))
+        #matrix_menu.AppendItem(item)
+        #matrix_menu.Append(ID_Chi2, _(u"Chi2").decode('utf8'))
+        #matrix_menu.Append(ID_Student, u"t de Student")
+        #menu_classif = wx.Menu()
+        #menu_classif.Append(ID_CHDReinert, _(u"Reinert's Method").decode('utf8'))
+        #menu_classif.Append(ID_CHDSIM, u"Par matrice des distances")
+        #matrix_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classif)
+        #matrix_menu.Append(ID_AFCM, u"AFCM")
+        #matrix_menu.Append(ID_SIMI, _(u"Similarities Analysis").decode('utf8'))
+        #matrix_menu.Append(ID_proto, _(u"Prototypical Analysis").decode('utf8'))
         ID_RCODE = wx.NewId()
         ID_RCODE = wx.NewId()
-        analyse_menu.Append(ID_RCODE, u"Code R...")
+        #matrix_menu.Append(ID_RCODE, u"Code R...") 
+        #menu_splittab = wx.Menu()
+        #ID_SPLITVAR = wx.NewId()
+        #splitvar = wx.MenuItem(menu_splittab, ID_SPLITVAR, _(u"Split from variable").decode('utf8'))
+        #menu_splittab.AppendItem(splitvar)
+        #matrix_menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), menu_splittab)
+        self.matrix_menu = matrix_menu
 
         text_menu = wx.Menu()
 
         text_menu = wx.Menu()
-        text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
-        text_menu.Append(ID_TEXTSTAT, u"Statistiques textuelles")
-        text_menu.Append(ID_ASLEX, u"Spécificités et AFC")
-        #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
-        menu_classiftxt = wx.Menu()
-        menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode Alceste")
-        menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
-        text_menu.AppendMenu(-1, u"Classification", menu_classiftxt)
-        text_menu.Append(ID_SimiTxt, u'Analyse de similitude') 
-        ID_WC = wx.NewId()
-        text_menu.Append(ID_WC, u'Nuage de mots')
-        
+        analyses_text = [[ID_TEXTSTAT, _(u"Statistics").decode('utf8'), 'stat'],
+                         [ID_ASLEX, _(u"Specificities and CA").decode('utf8'), 'spec'],
+                         [ID_labbe, _(u"Labbe Distance").decode('utf8'),'labbe'],
+                         {'name' : _(u"Clustering").decode('utf8'),
+                          'content' : [[ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'), 'alceste']]},
+                         [ID_SimiTxt, _(u"Similarities Analysis").decode('utf8'), 'simitxt'],
+                         [ID_WC, _(u"WordCloud").decode('utf8'), 'wordcloud'],
+                         {'name' : _(u"Sub corpus").decode('utf8'),
+                          'content' : [[ID_Subtxtfrommeta, _(u'Sub corpus from metadata').decode('utf8'), 'subcorpusmeta'],
+                                       [ID_Subtxtfromthem, _(u'Sub corpus from thematic').decode('utf8'), 'subcorpusthema']]},
+                         [ID_exportmeta, _(u"Export metadata table").decode('utf8'), 'exportmetatable'],
+                         ]
+
+        for analyse in analyses_text :
+            if not isinstance(analyse, dict) :
+                item = wx.MenuItem(text_menu, analyse[0], analyse[1])
+                item.SetBitmap(self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)))
+                text_menu.AppendItem(item)
+            else :
+                nmenu = wx.Menu()
+                for subana in analyse['content'] :
+                    item = wx.MenuItem(nmenu, subana[0], subana[1])
+                    item.SetBitmap(self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)))
+                    nmenu.AppendItem(item)
+                text_menu.AppendMenu(-1, analyse['name'], nmenu)
+        #text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
+#         text_menu.Append(ID_TEXTSTAT, _(u"Statistics").decode('utf8'))
+#         text_menu.Append(ID_ASLEX, _(u"Specificities and CA").decode('utf8'))
+#         #text_menu.Append(ID_TEXTAFCM, u"AFC sur UCI / Vocabulaire")
+#         menu_classiftxt = wx.Menu()
+#         menu_classiftxt.Append(ID_TEXTREINERT, _(u"Reinert's Method").decode('utf8'))
+#         #menu_classiftxt.Append(ID_TEXTPAM, u"Par matrice des distances")
+#         text_menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), menu_classiftxt)
+#         text_menu.Append(ID_SimiTxt, _(u"Similarities Analysis").decode('utf8')) 
+#         
+#         text_menu.Append(ID_WC, _(u"WordCloud").decode('utf8'))
+        self.text_menu = text_menu
+
         help_menu = wx.Menu()
         help_menu = wx.Menu()
-        help_menu.Append(wx.ID_ABOUT, u'À propos...')
-        help_menu.Append(wx.ID_HELP, u'Aide en ligne')
-        
-        self.mb.Append(file_menu, _(u"File"))
-        self.mb.Append(edit_menu, _(u"Edition"))
-        self.mb.Append(view_menu, _(u"View"))
-        self.mb.Append(analyse_menu, _("Spreadsheet analysis"))
-        self.mb.Append(text_menu, _(u"Text analysis"))
-        self.mb.Append(help_menu, _(u"Help"))
-        
+        about = wx.MenuItem(help_menu, wx.ID_ABOUT, _(u"About...").decode('utf8'))
+        about.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_INFORMATION, size = (16,16)))
+        help_menu.AppendItem(about)
+        #help_menu.Append(wx.ID_ABOUT, _(u"About...").decode('utf8'))
+        help = wx.MenuItem(help_menu, wx.ID_HELP, _(u"Online help...").decode('utf8'))
+        help.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_HELP, size = (16,16)))
+        help_menu.AppendItem(help)
+        #help_menu.Append(wx.ID_HELP, _(u"Online help...").decode('utf8'))
+
+        self.mb.Append(file_menu, _(u"File").decode('utf8'))
+        self.mb.Append(edit_menu, _(u"Edition").decode('utf8'))
+        self.mb.Append(view_menu, _(u"View").decode('utf8'))
+        self.mb.Append(matrix_menu, _(u"Matrix analysis").decode('utf8'))
+        self.mb.Append(text_menu, _(u"Text analysis").decode('utf8'))
+        self.mb.Append(help_menu, _(u"Help").decode('utf8'))
+
         self.SetMenuBar(self.mb)
 #--------------------------------------------------------------------
         self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
         self.statusbar.SetStatusWidths([-2, -3])
         self.SetMenuBar(self.mb)
 #--------------------------------------------------------------------
         self.statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
         self.statusbar.SetStatusWidths([-2, -3])
-        self.statusbar.SetStatusText(u"Prêt", 0)
-        self.statusbar.SetStatusText(u"Bienvenue", 1)
+        self.statusbar.SetStatusText(_(u"Ready").decode('utf8'), 0)
+        self.statusbar.SetStatusText(_(u"Welcome").decode('utf8'), 1)
 
         # min size for the frame itself isn't completely done.
         # see the end up FrameManager::Update() for the test
 
         # min size for the frame itself isn't completely done.
         # see the end up FrameManager::Update() for the test
@@ -263,16 +452,57 @@ class IraFrame(wx.Frame):
         tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
                          wx.TB_FLAT | wx.TB_NODIVIDER)
         tb1.SetToolBitmapSize(wx.Size(16, 16))
         tb1 = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
                          wx.TB_FLAT | wx.TB_NODIVIDER)
         tb1.SetToolBitmapSize(wx.Size(16, 16))
-        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")
+        tb1.AddLabelTool(ID_OpenData, "OpenData", self.images_analyses['matroot'], shortHelp=_(u"Matrix").decode('utf8'), longHelp=_(u"Open a matrix").decode('utf8'))
         tb1.AddSeparator()
         tb1.AddSeparator()
-        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")
-
+        tb1.AddLabelTool(ID_OpenText, "OpenText", self.images_analyses['textroot'], shortHelp=_(u"Text").decode('utf8'), longHelp=_(u"Open a text corpus").decode('utf8'))
+        tb1.AddSeparator()
+        tb1.AddLabelTool(ID_OnOpenAnalyse, "OpenAnalyse", self.images_analyses['iramuteq'], shortHelp= _(u"Open an analysis").decode('utf8'), longHelp=_(u"Open an analysis").decode('utf8'))
+        tb1.AddSeparator()
+        tb1.AddLabelTool(ID_ImportTXM, "ImportTXM", self.images_analyses['TXM'], shortHelp= _(u"Import from TXM").decode('utf8'), longHelp=_(u"Import from TXM").decode('utf8'))
+        tb1.AddSeparator()
+        tb1.AddLabelTool(ID_ImportEuro, "ImportEuro", self.images_analyses['europress'], shortHelp= _(u"Import from Europress").decode('utf8'), longHelp=_(u"Import from Europress").decode('utf8'))
+        tb1.AddSeparator()
+        tb1.AddLabelTool(ID_importdmi, "ImportDMI", self.images_analyses['importdmi'], shortHelp= _(u"Import from DMI-TCAT (exp.)").decode('utf8'), longHelp=_(u"Import from DMI-TCAT (exp.)").decode('utf8'))
+        tb1.AddSeparator()
+        tb1.AddLabelTool(ID_Fact_xml, "ImportFactxml", self.images_analyses['factiva_xml'], shortHelp= _(u"Factiva from xml").decode('utf8'), longHelp=_(u"Factiva from xml").decode('utf8'))
+        tb1.AddLabelTool(ID_Fact_mail, "ImportFactmail", self.images_analyses['factiva_mail'], shortHelp= _(u"Factiva from mail").decode('utf8'), longHelp=_(u"Factiva from mail").decode('utf8'))
+        tb1.AddLabelTool(ID_Fact_copy, "ImportFactcopy", self.images_analyses['factiva_copy'], shortHelp= _(u"Factiva from copy/paste").decode('utf8'), longHelp=_(u"Factiva from copy/paste").decode('utf8'))
+        tb1.AddSeparator()
+        tb1.AddLabelTool(wx.ID_PREFERENCES, "Preferences", self.images_analyses['preferences'], shortHelp= _(u"Preferences").decode('utf8'), longHelp=_(u"Preferences").decode('utf8'))
+        tb1.AddSeparator()
+        tb1.AddLabelTool(ID_ACCEUIL, "Home", wx.ArtProvider_GetBitmap(wx.ART_GO_HOME, size = (16,16)), shortHelp= _(u"Home page").decode('utf8'), longHelp=_(u"Home page").decode('utf8'))
+        tb1.AddLabelTool(ID_RESULT, "Results", wx.ArtProvider_GetBitmap(wx.ART_LIST_VIEW, size = (16,16)), shortHelp= _(u'Show results').decode('utf8'), longHelp=_(u'Show results').decode('utf8'))
         tb1.Realize()
         tb1.Realize()
-        
+
+        tb_text = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
+                         wx.TB_FLAT | wx.TB_NODIVIDER)
+        for analyse in analyses_text :
+            if not isinstance(analyse, dict) :
+                tb_text.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1])
+            else :
+                for subana in analyse['content'] :
+                    tb_text.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1])
+        tb_text.Realize()
+
+        tb_mat = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
+                         wx.TB_FLAT | wx.TB_NODIVIDER)
+        for analyse in matanalyses :
+            if not isinstance(analyse, dict) :
+                tb_mat.AddLabelTool(analyse[0], analyse[1], self.images_analyses.get(analyse[2], wx.EmptyBitmap(16,16)), shortHelp = analyse[1], longHelp = analyse[1])
+            else :
+                for subana in analyse['content'] :
+                    tb_mat.AddLabelTool(subana[0], subana[1], self.images_analyses.get(subana[2], wx.EmptyBitmap(16,16)), shortHelp = subana[1], longHelp = subana[1])
+        tb_mat.Realize()
+
+        tb_help = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
+                         wx.TB_FLAT | wx.TB_NODIVIDER)
+        tb_help.AddLabelTool(wx.ID_ABOUT, "About", wx.ArtProvider_GetBitmap(wx.ART_INFORMATION, size=(16,16)), shortHelp=_(u"About...").decode('utf8'), longHelp=_(u"About...").decode('utf8'))
+        tb_help.AddLabelTool(wx.ID_HELP, "Help", wx.ArtProvider_GetBitmap(wx.ART_HELP, size=(16,16)), shortHelp=_(u"Online help...").decode('utf8'), longHelp=_(u"Online help...").decode('utf8'))
+        tb_help.Realize()
 #------------------------------------------------------------------------------------------------
 
         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)
 #------------------------------------------------------------------------------------------------
 
         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)
-                      
+
         #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
         #                  Name("Text").CenterPane())                      
         self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
         #self._mgr.AddPane(self.text_ctrl_txt, wx.aui.AuiPaneInfo().
         #                  Name("Text").CenterPane())                      
         self._mgr.AddPane(self.text_ctrl_txt, aui.AuiPaneInfo().
@@ -281,15 +511,15 @@ class IraFrame(wx.Frame):
         #                  CenterPane())
         self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
                           CenterPane())
         #                  CenterPane())
         self._mgr.AddPane(IntroPanel(self), aui.AuiPaneInfo().Name("Intro_Text").
                           CenterPane())
-        if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
-            with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
-                f.write('')
+        #if not os.path.exists(os.path.join(UserConfigPath, 'history.db')) :
+        #    with open(os.path.join(UserConfigPath, 'history.db'), 'w') as f :
+        #        f.write('')
         self.history = History(os.path.join(UserConfigPath, 'history.db'))
         self.tree = LeftTree(self)
         self.history = History(os.path.join(UserConfigPath, 'history.db'))
         self.tree = LeftTree(self)
-        self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption("Navigateur").
+        self._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption(_(u"Historic").decode('utf8')).
                           Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
                           MinimizeButton(True))
                           Left().MinSize(wx.Size(200,500)).Layer(1).Position(1).CloseButton(False).MaximizeButton(True).
                           MinimizeButton(True))
-        
+
         #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)
         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)
         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
         #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)
         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)
         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
@@ -303,15 +533,14 @@ class IraFrame(wx.Frame):
         #                      CenterPane())
         self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
                               Name("Tab_content").
         #                      CenterPane())
         self._mgr.AddPane(self.nb, aui.AuiPaneInfo().
                               Name("Tab_content").
-                              CenterPane())        
-        self.Sheet = MySheet(self)
+                              CenterPane())
+
         #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
         #self._mgr.AddPane(self.Sheet, wx.aui.AuiPaneInfo().Name("Data").CenterPane())
-        self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
-        #self.nb.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
+        #self._mgr.AddPane(self.Sheet, aui.AuiPaneInfo().Name("Data").CenterPane())
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
         # add the toolbars to the manager
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
         self.nb.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
         # add the toolbars to the manager
-                        
+
         #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
         #                  Name("tb1").Caption("Fichiers").
         #                  ToolbarPane().Top().
         #self._mgr.AddPane(tb1, wx.aui.AuiPaneInfo().
         #                  Name("tb1").Caption("Fichiers").
         #                  ToolbarPane().Top().
@@ -319,8 +548,26 @@ class IraFrame(wx.Frame):
         self._mgr.AddPane(tb1, aui.AuiPaneInfo().
                           Name("tb1").Caption("Fichiers").
                           ToolbarPane().Top().
         self._mgr.AddPane(tb1, aui.AuiPaneInfo().
                           Name("tb1").Caption("Fichiers").
                           ToolbarPane().Top().
-                          LeftDockable(True).RightDockable(False))        
-        
+                          LeftDockable(True).RightDockable(False))
+
+        self._mgr.AddPane(tb_text, aui.AuiPaneInfo().
+                          Name("tb_text").Caption("analyse_text").
+                          ToolbarPane().Top().
+                          LeftDockable(True).RightDockable(False))
+
+        self._mgr.AddPane(tb_mat, aui.AuiPaneInfo().
+                          Name("tb_mat").Caption("analyse_matrix").
+                          ToolbarPane().Top().
+                          LeftDockable(True).RightDockable(False))
+
+        self._mgr.AddPane(tb_help, aui.AuiPaneInfo().
+                          Name("tb_help").Caption("help").
+                          ToolbarPane().Top().
+                          LeftDockable(True).RightDockable(False))
+
+        self._mgr.GetPane('tb_text').Hide()
+        self._mgr.GetPane('tb_mat').Hide()
+
         self.ShowAPane("Intro_Text")
         self._mgr.GetPane("lefttree").Show()
         self._mgr.GetPane("classif_tb").Hide()
         self.ShowAPane("Intro_Text")
         self._mgr.GetPane("lefttree").Show()
         self._mgr.GetPane("classif_tb").Hide()
@@ -330,33 +577,50 @@ class IraFrame(wx.Frame):
         # Show How To Use The Closing Panes Event
 ##################################################################        
         self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
         # Show How To Use The Closing Panes Event
 ##################################################################        
         self.Bind(wx.EVT_MENU, self.OnAcceuil, id=ID_ACCEUIL)
-        self.Bind(wx.EVT_MENU, self.OnViewData, id=ID_VIEWDATA)
         self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
         self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
         self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
         self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
         self.Bind(wx.EVT_MENU, self.ShowTab, id=ID_RESULT)
         self.Bind(wx.EVT_MENU, self.OnOpenData, id=ID_OpenData)
         self.Bind(wx.EVT_MENU, self.OnOpenText, id=ID_OpenText)
         self.Bind(wx.EVT_MENU, self.OnOpenAnalyse, id=ID_OnOpenAnalyse)
-        self.Bind(wx.EVT_MENU, self.import_factiva, id= ID_Import)
+        self.Bind(wx.EVT_MENU, self.import_factiva_xml, fact_from_xml)
+        self.Bind(wx.EVT_MENU, self.import_factiva_mail, fact_from_mail)
+        self.Bind(wx.EVT_MENU, self.import_factiva_txt, fact_from_txt)
+        self.Bind(wx.EVT_MENU, self.ExtractTools, splitvar)
+        self.Bind(wx.EVT_MENU, self.ExtractTools, extractmod)
+        self.Bind(wx.EVT_MENU, self.ExtractTools, extractthem)
         self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
         self.Bind(wx.EVT_MENU, self.OnFreq, id=ID_Freq)
+        self.Bind(wx.EVT_MENU, self.OnFreqMulti, id=ID_FreqMulti)
         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
+        self.Bind(wx.EVT_MENU, self.OnChi2McNemar, id=ID_Chi2mc)
         self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
         self.Bind(wx.EVT_MENU, self.OnStudent, id=ID_Student)
         self.Bind(wx.EVT_MENU, self.OnCHDSIM, id=ID_CHDSIM)
-        self.Bind(wx.EVT_MENU, self.OnCHDAlceste, id=ID_CHDAlceste)
+        self.Bind(wx.EVT_MENU, self.OnCHDReinert, id=ID_CHDReinert)
         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
         self.Bind(wx.EVT_MENU, self.OnAFCM, id=ID_AFCM)
-        self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
-        self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
+        self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
+        self.Bind(wx.EVT_MENU, self.OnSplitVar, id = ID_Splitfromvar)
+        #self.Bind(wx.EVT_MENU, self.OnRCode, id=ID_RCODE)
+        #self.Bind(wx.EVT_MENU, self.OnSplitVar, id=ID_SPLITVAR)
+        #self.Bind(wx.EVT_MENU, self.OnCheckcorpus, id = ID_CHECKCORPUS)
         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
         self.Bind(wx.EVT_MENU, self.OnTextStat, id=ID_TEXTSTAT)
         self.Bind(wx.EVT_MENU, self.OnTextSpec, id=ID_ASLEX)
+        self.Bind(wx.EVT_MENU, self.OnTextLabbe, id=ID_labbe)
         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
         self.Bind(wx.EVT_MENU, self.OnTextAfcm, id=ID_TEXTAFCM)
-        self.Bind(wx.EVT_MENU, self.OnTextAlceste, id=ID_TEXTALCESTE)
+        self.Bind(wx.EVT_MENU, self.OnTextReinert, id=ID_TEXTREINERT)
         self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
         self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
         self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
         self.Bind(wx.EVT_MENU, self.OnPamSimple, id=ID_TEXTPAM)
         self.Bind(wx.EVT_MENU, self.OnSimiTxt, id=ID_SimiTxt)
         self.Bind(wx.EVT_MENU, self.OnWordCloud, id=ID_WC)
-        self.Bind(wx.EVT_MENU, self.OnSimi, id=ID_SIMI)
+        self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfrommeta)
+        self.Bind(wx.EVT_MENU, self.OnSubText, id = ID_Subtxtfromthem)
+        self.Bind(wx.EVT_MENU, self.OnSimiTab, id=ID_SIMI)
         self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
         self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT)
-        self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
+        #self.Bind(wx.EVT_MENU, self.OnSaveTabAs, id=ID_SaveTab)
         self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
         self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
         self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
         self.Bind(wx.EVT_MENU, self.OnAbout, id=wx.ID_ABOUT)
         self.Bind(wx.EVT_MENU, self.OnHelp, id=wx.ID_HELP)
         self.Bind(wx.EVT_MENU, self.OnPref, id=wx.ID_PREFERENCES)
+        self.Bind(wx.EVT_MENU, self.OnImportTXM, id=ID_ImportTXM)
+        self.Bind(wx.EVT_MENU, self.OnImportEuropress, id=ID_ImportEuro)
+        self.Bind(wx.EVT_MENU, self.OnImportDMI, id=ID_importdmi)
+        self.Bind(wx.EVT_MENU, self.OnExportMeta, id=ID_exportmeta)
+        self.Bind(wx.EVT_MENU, self.OnMergeGraph, id = ID_merge)
         self.Bind(wx.EVT_CLOSE, self.OnClose)
 ##################################################################
         flags = self._mgr.GetAGWFlags()
         self.Bind(wx.EVT_CLOSE, self.OnClose)
 ##################################################################
         flags = self._mgr.GetAGWFlags()
@@ -394,10 +658,26 @@ class IraFrame(wx.Frame):
         if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
         self.type = ''
 
         if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
         self.type = ''
 
+##############################################################@
+        self.ShowMenu('view', True)
+        self.ShowMenu('matrix', False)
+        self.ShowMenu('text', False)
+   
+        self._mgr.Update()
+
+        self.DataPop = False
+        self.DataTxt = False
+        self.Text = ''
+
+        self.lexique = None
+        self.corpus = None
+
+    def finish_init(self) :
         try :
             self.pref.read(self.ConfigPath['preferences'])
             if IsNew(self) :
                 UpgradeConf(self)
         try :
             self.pref.read(self.ConfigPath['preferences'])
             if IsNew(self) :
                 UpgradeConf(self)
+                self.pref.read(self.ConfigPath['preferences'])
                 New = True
             else :
                 CopyConf(self)
                 New = True
             else :
                 CopyConf(self)
@@ -406,6 +686,9 @@ class IraFrame(wx.Frame):
             UpgradeConf(self)
             self.pref.read(self.ConfigPath['preferences'])
             New = True
             UpgradeConf(self)
             self.pref.read(self.ConfigPath['preferences'])
             New = True
+        self.sound = self.pref.getboolean('iramuteq', 'sound')
+        self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
+        self.version = ConfigGlob.get('DEFAULT', 'version')
         #configuration des chemins de R
         self.PathPath = ConfigParser()
         self.PathPath.read(ConfigPath['path'])
         #configuration des chemins de R
         self.PathPath = ConfigParser()
         self.PathPath.read(ConfigPath['path'])
@@ -420,7 +703,7 @@ class IraFrame(wx.Frame):
                 with open(ConfigPath['path'], 'w') as f :
                     self.PathPath.write(f)
         else:
                 with open(ConfigPath['path'], 'w') as f :
                     self.PathPath.write(f)
         else:
-            BestRPath = True 
+            BestRPath = True
         if BestRPath :
             self.RPath = self.PathPath.get('PATHS', 'rpath')
             if New :
         if BestRPath :
             self.RPath = self.PathPath.get('PATHS', 'rpath')
             if New :
@@ -428,191 +711,135 @@ class IraFrame(wx.Frame):
             if not RLibsAreInstalled(self) :
                 CheckRPackages(self)
         else :
             if not RLibsAreInstalled(self) :
                 CheckRPackages(self)
         else :
-            msg = u"""
-Le chemin de l'executable de R n'a pas été trouvé.
-Si R n'est pas installé, vous devez l'installer (http://www.r-project.org/).
-Si R n'est pas installé dans le répertoire par défaut
-(C:\Program Files\R\R-2.x.x\R.exe sous windows ou /usr/bin/R sous linux ou Mac Os X)
-vous devez signaler le chemin de l'éxecutable de R dans les préférences.""" 
-            dlg = wx.MessageDialog(self, msg, u"Problème de configuration", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
+            msg = '\n'.join([_(u"Can't find R executable").decode('utf8'), _(u"If R is not installed, get it from http://www.r-project.org.").decode('utf8'),
+                             _(u"If R is installed, report its path in Preferences.").decode('utf8'),
+                             _(u"IRaMuTeQ does not work without R.").decode('utf8')])
+            dlg = wx.MessageDialog(self, msg, _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
             dlg.CenterOnParent()
             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
             dlg.CenterOnParent()
             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
-                 evt.Veto()
-            else :
-                print 'ok'
-        if sys.platform == 'darwin':
-            self.Rapp = self.PathPath.get('PATHS', 'rapp')
-            RappOk = CheckRapp(self.Rapp)
-        self.DataPop = False
-        self.DataTxt = False
-        self.Text = ''
-        self.sound = self.pref.getboolean('iramuteq', 'sound')
-        self.check_update = self.pref.getboolean('iramuteq', 'checkupdate')
-        self.version = ConfigGlob.get('DEFAULT', 'version')
-        self.lexique = None
-        self.corpus = None
-##############################################################@
-        self.DisEnSaveTabAs(False)
-        self.ShowMenu(_("View"), False)
-        self.ShowMenu(_("Spreadsheet analysis"), False)
-        self.ShowMenu(_("Text analysis"), False)
-   
-        self._mgr.Update()
+                pass
+            dlg.Destroy()
+
+    def setlangue(self) :
+        self.pref.read(self.ConfigPath['preferences'])
+        try :
+            guilangue = self.pref.get('iramuteq', 'guilanguage')
+        except :
+            guilangue = DefaultConf.get('iramuteq', 'guilanguage')
+        self.preslangue.get(guilangue, 'english').install()
 
     def OnVerif(self, evt) :
         pack = CheckRPackages(self)
         if pack :
 
     def OnVerif(self, evt) :
         pack = CheckRPackages(self)
         if pack :
-            dlg = wx.MessageDialog(self, u"Installation OK", u"Installation", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
+            dlg = wx.MessageDialog(self, _(u"Installation OK").decode('utf8'), _(u"Installation").decode('utf8'), wx.OK | wx.ICON_INFORMATION | wx.STAY_ON_TOP)
             dlg.CenterOnParent()
             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
             dlg.CenterOnParent()
             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
-                 evt.Veto()
-
-    #FIXME  marche pas sous mac ?
-    def DisEnSaveTabAs(self, DISEN):
-    #Disable SaveTabAs
-        file_menu = self.mb.GetMenu(0)
-        items = file_menu.GetMenuItems()
-        items[4].Enable(DISEN)
-    
+                evt.Veto()
+
     def ShowMenu(self, menu, Show=True):
     def ShowMenu(self, menu, Show=True):
-        menu_pos = self.mb.FindMenu(menu)
-        self.mb.EnableTop(menu_pos, Show)
-        self.mb.UpdateMenus()
+        if menu == 'text' :
+            menu_pos = 4
+            if Show :
+                self._mgr.GetPane('tb_text').Show()
+            else :
+                self._mgr.GetPane('tb_text').Hide()
+        elif menu == 'matrix' :
+            menu_pos = 3
+            if Show :
+                self._mgr.GetPane('tb_mat').Show()
+            else :
+                self._mgr.GetPane('tb_mat').Hide()
+        elif menu == 'view' :
+            menu_pos = 2
+        else :
+            menu_pos = None
 
 
+        #menu_pos = self.mb.FindMenu(menu)
+        if not menu_pos is None :
+            self.mb.EnableTop(menu_pos, Show)
+            self.mb.UpdateMenus()
+        self._mgr.Update()
 
 #--------------------------------------------------------------------
     def OnClose(self, event):
         print 'onclose'
         with open(self.ConfigPath['path'], 'w') as f :
             self.PathPath.write(f)
 
 #--------------------------------------------------------------------
     def OnClose(self, event):
         print 'onclose'
         with open(self.ConfigPath['path'], 'w') as f :
             self.PathPath.write(f)
-        if self.DictTab != {} :
-            savestates = [self.DictTab[item][0] for item in self.DictTab]
-            if False in savestates :
-                notsave = [item for item in self.DictTab if self.DictTab[item][0] == False] 
-                msg = u"""
- Certains résultats ne sont pas enregistrés.
- Voulez-vous fermer quand même ?"""
-                dlg = wx.MessageDialog(self, msg, "Sauvegarde",
-                       wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
-                dlg.CenterOnParent()
-                if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
-                    event.Veto()
-                    dlg.Destroy()
-                else:
-                    dlg.Destroy()
-                    for item in notsave :
-                        for tmpfile in self.DictTab[item][1:] :
-                            os.remove(tmpfile)
-                            print 'remove : ' + tmpfile
-                    self._mgr.UnInit()
-                    del self._mgr
-                    self.Destroy()
-            else :
-                self._mgr.UnInit()
-                del self._mgr
-                self.Destroy()
-        else :
-            self._mgr.UnInit()
-            del self._mgr
-            self.Destroy()
-            ##FIXME
-            #if sys.platform == 'win32' :
-            #    os.system("taskkill /im iramuteq.exe /f")
-            #    print 'meurtre de process'
+        self._mgr.UnInit()
+        del self._mgr
+        self.Destroy()
 
     def OnOpenData(self, event):
         inputname, self.input_path = OnOpen(self, "Data")
         if inputname:
 
     def OnOpenData(self, event):
         inputname, self.input_path = OnOpen(self, "Data")
         if inputname:
-            self.filename = self.input_path[0]
+            #filename = self.input_path[0]
             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
             self.tableau = Tableau(self,os.path.abspath(self.input_path[0]))
-            get_table_param(self, self.input_path[0])
-            self.tableau.make_content()
-            self.tableau.show_tab()
+            val = get_table_param(self, self.input_path[0])
+            if val == wx.ID_OK :
+                busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
+                wx.SafeYield()
+                try :
+                    self.tableau.make_content()
+                    OpenAnalyse(self, self.tableau.parametres)
+                    self.tree.OnItemAppend(self.tableau.parametres)
+                    del busy
+                except :
+                    del busy
+                    BugReport(self)
+                #self.tableau.show_tab()
 
     def OnOpenAnalyse(self, event):
         self.AnalysePath = OnOpen(self, "Analyse")
 
     def OnOpenAnalyse(self, event):
         self.AnalysePath = OnOpen(self, "Analyse")
-        OpenAnalyse(self, self.AnalysePath[1][0], True)
-        self.ShowMenu(_("View"))
+        if self.AnalysePath :
+            OpenAnalyse(self, self.AnalysePath[1][0], True)
+            self.ShowMenu('view')
 
     def OnOpenText(self, event):
         inputname, self.input_path = OnOpen(self, "Texte")
         self.filename = self.input_path[0]
         if inputname:
 
     def OnOpenText(self, event):
         inputname, self.input_path = OnOpen(self, "Texte")
         self.filename = self.input_path[0]
         if inputname:
-             self.OpenText()
+            self.OpenText()
    
    
-    def OnViewData(self, event):
-        print self.type
-        print self.DataTxt
-        if self.type == "Data":
-            if not self.DataPop :
-                self.Sheet.Populate(self.content)
-                self.DataPop = True
-                self.DataTxt = False
-            self.ShowAPane(u"Data")
-        elif self.type == "Texte" or self.type == 'Analyse' :
-            if not self.DataTxt :
-                self.text_ctrl_txt.Clear()
-                self.text_ctrl_txt.write(self.content)
-                self.text_ctrl_txt.ShowPosition(0)
-                self.DataTxt = True
-                self.DataPop = False
-            self.ShowAPane(u"Text")
-        self._mgr.Update()
-        
-    def OpenText(self):
-        #dial = EncodeDialog(self)
-        dlg = wx.ProgressDialog("Ouverture...",
-                                   "Veuillez patienter...",
-                                   maximum=2,
-                                   parent=self,
-                                   style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
-                                   )
-        
-        builder =  Builder(self, dlg)
+    def OnSubText(self, evt, corpus = None, parametres = None):
+        if corpus is None :
+            corpus = self.tree.getcorpus()
+        if evt.GetId() == ID_Subtxtfrommeta :
+            parametres = {'frommeta' : True}
+        elif evt.GetId() == ID_Subtxtfromthem :
+            parametres = {'fromtheme' : True}
+        builder = SubBuilder(self, corpus, parametres)
         if builder.res == wx.ID_OK :
         if builder.res == wx.ID_OK :
+            busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self)
+            wx.SafeYield()
             corpus = builder.doanalyse()
             self.history.add(corpus.parametres)
             corpus = builder.doanalyse()
             self.history.add(corpus.parametres)
-            self.tree.OnItemAppend(corpus.parametres)
             OpenAnalyse(self, corpus.parametres)
             OpenAnalyse(self, corpus.parametres)
-        #self.content = DoConf().totext(corpus.parametres)
-#        parametres = DoConf(os.path.join(UserConfigPath,'corpus.cfg')).getoptions('corpus')
-#        parametres['originalpath'] = self.filename
-#        
-#        parametres['pathout'] = PathOut(self.filename, 'corpus').dirout
-#        dial = CorpusPref(self, parametres)
-#        dial.CenterOnParent()
-#        dial.txtpath.SetLabel(self.filename)
-#        res = dial.ShowModal()
-#        parametres = dial.doparametres()
-#        print parametres
-#        ReadLexique(self, lang = parametres['lang'])
-#        self.expressions = ReadDicoAsDico(self.DictPath.get(parametres['lang'], 'french_exp'))
-#        corpus = BuildFromAlceste(self.filename, parametres, self.lexique, self.expressions).corpus
-        #self.corpus_encodage =  dial.encodages[dial.list_encodages.GetSelection()][0]
-        #self.corpus_lang = dial.langues[dial.choice_dict.GetSelection()]
-            count = 1
-            keepGoing = dlg.Update(count, u"Lecture du fichier")
-#        try :
-#            with codecs.open(self.filename, 'rU', self.corpus_encodage) as f:
-#                self.content = f.read()
-#            #self.content = self.content.replace('\r','\n')
-#        except UnicodeDecodeError :
-#            msg = u"Ce fichier ne semble pas être encodé en %s" % self.corpus_encodage
-#            dial = wx.MessageDialog(self, msg, u"Problème d'encodage", wx.OK | wx.NO_DEFAULT | wx.ICON_WARNING)
-#            dial.CenterOnParent()
-#            res = dial.ShowModal()
-#            dial.Destroy()
-#            self.OpenText()
-            self.ShowMenu(_("View"))
-            self.ShowMenu(_("Text analysis"))
-            self.ShowMenu(_(u"Spreadsheet analysis"), False)
-            self.type = "Texte"
-            self.DataTxt = False
-            self.Text = ''
-            count += 1
-            keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
-        dlg.Destroy()
-        #self.OnViewData(wx.EVT_BUTTON)
+            self.tree.OnItemAppend(corpus.parametres)
+            del busy
+            
+    def OpenText(self):
+        builder =  Builder(self, 5)
+        if builder.res == wx.ID_OK :
+            try :
+                corpus = builder.doanalyse()
+                self.history.add(corpus.parametres)
+                self.tree.OnItemAppend(corpus.parametres)
+                OpenAnalyse(self, corpus.parametres)
+            except :
+                builder.dlg.Destroy()
+                BugReport(self)
+            else :
+                count = 1
+                keepGoing = builder.dlg.Update(count, u"Lecture du fichier")
+                self.ShowMenu('view')
+                self.ShowMenu('text')
+                self.ShowMenu('matrix', False)
+                self.type = "Texte"
+                self.DataTxt = False
+                self.Text = ''
+                count += 1
+                keepGoing = builder.dlg.Update(count, u"Chargement du dictionnaire")
+                builder.dlg.Destroy()
         
     def OnExit(self, event):
         self.Close()
         
     def OnExit(self, event):
         self.Close()
@@ -622,6 +849,7 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
         info.Name = ConfigGlob.get('DEFAULT', 'name')
         info.Version = ConfigGlob.get('DEFAULT', 'version')
         info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
         info.Name = ConfigGlob.get('DEFAULT', 'name')
         info.Version = ConfigGlob.get('DEFAULT', 'version')
         info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
+        info.Translators = ConfigGlob.get('DEFAULT', 'translators').decode('utf8').split(';')
         info.Description = u"""
 Interface de R pour les Analyses Multidimensionnelles 
 de Textes et de Questionnaires
         info.Description = u"""
 Interface de R pour les Analyses Multidimensionnelles 
 de Textes et de Questionnaires
@@ -634,7 +862,7 @@ Laboratoire LERASS
 REPERE
 """
         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
 REPERE
 """
         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
-        dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
+        dev = ConfigGlob.get('DEFAULT', 'dev').decode('utf8').split(';')
         info.Developers = dev
         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
 suivant les termes de la Licence Publique Générale GNU telle que publiée 
         info.Developers = dev
         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
 suivant les termes de la Licence Publique Générale GNU telle que publiée 
@@ -663,55 +891,33 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
         parent = nobject.GetParent()
         if isinstance(parent, IraFrame) :
             npage = self.nb.GetPage(new)
         parent = nobject.GetParent()
         if isinstance(parent, IraFrame) :
             npage = self.nb.GetPage(new)
-            self.tree.GiveFocus(uuid=npage.parametres['uuid'])
+            if 'parametres' in dir(npage) :
+                self.tree.GiveFocus(uuid=npage.parametres['uuid'])
+                if npage.parametres.get('matrix', False) :
+                    self.ShowMenu('text', False)
+                    self.ShowMenu('matrix', True)
+                elif npage.parametres.get('corpus', False) :
+                    self.ShowMenu('text')
+                    self.ShowMenu('matrix', False)
 
     def OnCloseTab(self, evt):
 
     def OnCloseTab(self, evt):
-        log.info('Closing tab %s' % str(evt.GetEventObject()))
+        #log.info('Closing tab %s' % str(evt.GetEventObject()))
         ctrl = evt.GetEventObject()
         if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
             notebook = True
         else :
             notebook = False
         page = self.nb.GetPage(self.nb.GetSelection())
         ctrl = evt.GetEventObject()
         if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
             notebook = True
         else :
             notebook = False
         page = self.nb.GetPage(self.nb.GetSelection())
-        if 'parametres' in dir(page) :
+        if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
             self.history.rmtab(page.parametres)
             self.tree.CloseItem(uuid = page.parametres['uuid'])
         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
             self.history.rmtab(page.parametres)
             self.tree.CloseItem(uuid = page.parametres['uuid'])
         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
-        if self.DictTab != {} :
-            if TabTitle in self.DictTab :
-                ListFile=self.DictTab[TabTitle]
-                if False in ListFile:
-                    msg = u"""
-Certains résultats ne sont pas enregistrer.
-Voulez-vous fermer quand même ?"""
-                    dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
-
-                    dlg.CenterOnParent()
-                    if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
-                        remove = False
-                        evt.Veto()
-                        dlg.Destroy()
-                    else :
-                        for f in ListFile[1:] :
-                            print 'remove', f
-                            os.remove(f)
-                            remove = True
-                        dlg.Destroy()
-                elif True in ListFile :
-                    remove = True
-                if remove:
-                   del self.DictTab[TabTitle]
-            else : 
-                self.LastTabClose()
-        else :
-            remove = True
-        if self.nb.GetPageCount() == 1 and remove and not notebook :
-            self.LastTabClose()
 
 
+        if self.nb.GetPageCount() == 1 and not notebook :
+            self.LastTabClose()
     
     def LastTabClose(self) :
         if self.nb.GetPageCount() == 1 :
     
     def LastTabClose(self) :
         if self.nb.GetPageCount() == 1 :
-            self.DisEnSaveTabAs(False)
             if self.DataTxt :
                 self.ShowAPane("Text")
             elif self.DataPop :
             if self.DataTxt :
                 self.ShowAPane("Text")
             elif self.DataPop :
@@ -719,79 +925,30 @@ Voulez-vous fermer quand même ?"""
             else :
                 self.ShowAPane("Intro_Text")
 
             else :
                 self.ShowAPane("Intro_Text")
 
-    def OnSaveTabAs(self, event):
-        SelectTab = self.nb.GetSelection()
-        TabTitle = self.nb.GetPageText(SelectTab)
-        FileToSave = self.DictTab[TabTitle]
-        NewListFile = []
-        dlg = wx.FileDialog(
-            self, message="Enregistrer sous...", defaultDir=os.getcwd(),
-            defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
-            )
-        dlg.SetFilterIndex(2)
-        dlg.CenterOnParent()
-        
-        if dlg.ShowModal() == wx.ID_OK:
-            Path = dlg.GetPath()
-            Dirname = os.path.dirname(Path)
-            Filename = dlg.GetFilename()
-        else :
-            Path = False
-        dlg.Destroy()
-        if Path:
-            shutil.copyfile(FileToSave[-1], Path)
-            os.remove(FileToSave[len(FileToSave) - 1])
-            NewListFile.append(True)
-            NewListFile.append(Path)
-            for f in FileToSave[1:-1] :
-                Fileout = os.path.join(Dirname, os.path.basename(f))
-                shutil.copyfile(f, Fileout)
-                NewListFile.append(Fileout)
-                os.remove(f)
-            TabText = Filename
-            self.DictTab[TabText] = NewListFile
-            del self.DictTab[TabTitle]
-            self.nb.SetPageText(SelectTab, TabText)
-
     def GetStartPosition(self):
 
         self.x = self.x + 20
         x = self.x
         pt = self.ClientToScreen(wx.Point(0, 0))
     def GetStartPosition(self):
 
         self.x = self.x + 20
         x = self.x
         pt = self.ClientToScreen(wx.Point(0, 0))
-        
+
         return wx.Point(pt.x + x, pt.y + x)
         return wx.Point(pt.x + x, pt.y + x)
-    
+
     def ShowAPane(self, panel):
         for pane in self._mgr.GetAllPanes() :
     def ShowAPane(self, panel):
         for pane in self._mgr.GetAllPanes() :
-            if not pane.IsToolbar() and pane.name != 'lefttree': 
+            if not pane.IsToolbar() and pane.name != 'lefttree':
                 pane.Hide()
         self._mgr.GetPane(panel).Show()
         self._mgr.Update()
                 pane.Hide()
         self._mgr.GetPane(panel).Show()
         self._mgr.Update()
-        
+
     def OnAcceuil(self, event):
         self.ShowAPane(u"Intro_Text")
         event.Skip()
     def OnAcceuil(self, event):
         self.ShowAPane(u"Intro_Text")
         event.Skip()
-    #???
-#    def OnCreateTab(self, event):
-#        if not self._mgr.GetPane("Tab_content").name == "Tab_content":
-#            self._mgr.AddPane(self.CreateTabCtrl(), aui.AuiPaneInfo().
-#                              Name("Tab_content").
-#                              CenterPane())
-#            self._mgr.GetPane("Intro_Text").Hide()
-#            self._mgr.GetPane("Tab_content").Show()
-#            self.ctrl.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.OnCloseTab)
-#        else :
-#            page = wx.TextCtrl(self, -1, str(text), style=wx.TE_MULTILINE)
-#            self.ctrl.AddPage(page, "qsdqsd")
-#            self.ctrl.SetSelection(self.ctrl.GetPageCount() - 1)
-#        self._mgr.Update()
-    
-    
+
     def CreateHTMLCtrl(self):
         ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
         if "gtk2" in wx.PlatformInfo:
             ctrl.SetStandardFonts()
     def CreateHTMLCtrl(self):
         ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
         if "gtk2" in wx.PlatformInfo:
             ctrl.SetStandardFonts()
-        ctrl.SetPage(u"text")        
+        ctrl.SetPage(u"text")
         return ctrl
 
     def ShowTab(self, evt):
         return ctrl
 
     def ShowTab(self, evt):
@@ -800,23 +957,43 @@ Voulez-vous fermer quand même ?"""
 ################################################################
 #debut des analyses
 ################################################################
 ################################################################
 #debut des analyses
 ################################################################
-
-    def OnFreq(self, event):
-        try:
-            Frequences(self) 
-        except:
-            BugReport(self)
-            
-    def OnChi2(self, event):
-        try:
-        #    print('PAS DE DEBUG SUR CHI2')
-            chi = ChiSquare(self)
+    def analyse_matrix(self, analyse, analyse_type = '', matrix = None, parametres = None, dlgnb = 1):
+        if matrix is None :
+            matrix = self.tree.getmatrix()
+        if parametres is not None :
+            parametres['type'] = analyse_type
+        else :
+            parametres = {'type' : analyse_type}
+        try :
+        #print 'plus de bug@@@@@@@@@@@@@@@@@@@@@@'
+            analyse(self, matrix, parametres = parametres, dlg = dlgnb)
         except:
             BugReport(self)
         except:
             BugReport(self)
-    
+
+    def OnFreq(self, event, matrix = None):
+        self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
+
+    def OnFreqMulti(self, event, matrix = None):
+        self.analyse_matrix(FreqMultiple, analyse_type = 'freqmulti', matrix = matrix, dlgnb = 3)
+
+    def OnChi2(self, event, matrix = None):
+        self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3)
+
+    def OnChi2McNemar(self, event, matrix = None):
+        self.analyse_matrix(McNemar, matrix = matrix, analyse_type = 'chi2mcnemar', dlgnb = 3)
+
+    def OnSimiTab(self, event, matrix = None):
+        self.analyse_matrix(DoSimi, matrix = matrix, analyse_type = 'simimatrix', dlgnb = 5)
+
+    def OnCHDReinert(self, event, matrix = None):
+        #if matrix is None :
+        #    matrix = self.tree.getmatrix()
+        #AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = 3)
+        self.analyse_matrix(AnalyseQuest, matrix = matrix, analyse_type = 'reinertmatrix', dlgnb = 5)
+
     def OnStudent(self, event):
         try:
     def OnStudent(self, event):
         try:
-            MakeStudent(self) 
+            MakeStudent(self)
         except:
             BugReport(self)
 
         except:
             BugReport(self)
 
@@ -834,34 +1011,55 @@ Voulez-vous fermer quand même ?"""
                 PlaySound(self)
         except:
             BugReport(self)
                 PlaySound(self)
         except:
             BugReport(self)
-    def OnCHDAlceste(self, event):
-        try:
-         #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
-            self.quest = AnalyseQuest(self)
-            if self.quest.val == wx.ID_OK:
-                PlaySound(self)
-        except:
-            BugReport(self)
 
 
-    def OnSimiTxt(self, evt) :
+#     def OnCHDReinert(self, event):
+#         try:
+#          #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
+#             self.quest = AnalyseQuest(self)
+#             if self.quest.val == wx.ID_OK:
+#                 PlaySound(self)
+#         except:
+#             BugReport(self)
+    def OnMergeGraph(self, evt):
+        #FIXME
+        AnalyseMerge(self, {'type': 'merge', 'fileout' : '/tmp/test.txt'}, dlg = 5)
+
+    def OnProto(self, evt, matrix = None) :
+        self.analyse_matrix(Prototypical, matrix = matrix, analyse_type = 'proto', dlgnb = 3) 
+        #Prototypical(self, {'type' : 'proto'})
+
+    def OnSplitVar(self, evt, matrix = None):
+        if matrix is None :
+            matrix = self.tree.getmatrix()
+        self.analyse_matrix(SplitMatrixFromVar, matrix = matrix, analyse_type = 'splitvar', parametres = {'pathout': matrix.pathout.dirout}, dlgnb = 3)
+        #matrix = self.tree.getmatrix()
+
+
+    def OnSimiTxt(self, evt, corpus = None) :
         #    print 'PLUS DE BUG SUR SIMITXT'
         try :
         #    print 'PLUS DE BUG SUR SIMITXT'
         try :
-            self.Text = SimiTxt(self)
+            #self.Text = SimiTxt(self)
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = 3)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
             BugReport(self)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
             BugReport(self)
-    
-    def OnWordCloud(self, evt) :
+
+    def OnWordCloud(self, evt, corpus = None) :
         #    print 'PLUS DE BUG SUR WORDCLOUD'
         try :
         #    print 'PLUS DE BUG SUR WORDCLOUD'
         try :
-            self.Text = WordCloud(self)
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = 3)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
             BugReport(self)
 
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
         except :
             BugReport(self)
 
+    def OnClusterCloud(self, corpus, parametres = None) :
+        self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = 3)
 
     def OnAFCM(self, event):
         try:
 
     def OnAFCM(self, event):
         try:
@@ -869,32 +1067,41 @@ Voulez-vous fermer quand même ?"""
         except:
             BugReport(self)
 
         except:
             BugReport(self)
 
-    def OnCheckcorpus(self, evt):
-        try :
-            checkcorpus(self)
-        except :
-            BugReport(self)
-
     def OnTextStat(self, event, corpus = None):
     def OnTextStat(self, event, corpus = None):
-            print 'PAS DE BUG SUR TEXT STAT'
-        #try:
-            self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
-            
+            #print 'PAS DE BUG SUR TEXT STAT'
+        try:
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = 7)
+
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
-        #except:
-        #    BugReport(self)
-        
-    def OnTextSpec(self, event, corpus = None):  
-        #try:
+        except:
+            BugReport(self)
+
+    def OnTextSpec(self, event, corpus = None):
+        try:
             #self.Text = AsLexico(self)
             #self.Text = AsLexico(self)
-            print('ATTENTION : PLUS DE BUG SUR LEXICO')
-            self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
+            #print('ATTENTION : PLUS DE BUG SUR LEXICO')
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = 3)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
-        #except:
-        #    BugReport(self)
-    
+        except:
+            BugReport(self)
+
+    def OnTextLabbe(self, event, corpus = None):
+        try:
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = DistLabbe(self, corpus, parametres = {'type' : 'labbe'}, dlg = 3)
+            if self.Text.val == wx.ID_OK :
+                PlaySound(self)
+        except:
+            BugReport(self)
+
+
     def OnTextAfcm(self, event):
         try:
             AfcUci(self)
     def OnTextAfcm(self, event):
         try:
             AfcUci(self)
@@ -902,41 +1109,91 @@ Voulez-vous fermer quand même ?"""
         except:
             BugReport(self)
 
         except:
             BugReport(self)
 
-    def import_factiva(self,event):
+    def import_factiva_xml(self,event):
+        try :
+            ImportFactiva(self, 'xml')
+        except :
+            BugReport(self)
+
+    def import_factiva_mail(self, evt) :
         try :
         try :
-            ImportFactiva(self)
+            ImportFactiva(self, 'mail')
         except :
             BugReport(self)
 
         except :
             BugReport(self)
 
-    def OnTextAlceste(self, event, corpus = None):
-        #try:
-            print('ATTENTION : PLUS DE BUG SUR ALCESTE')
+    def import_factiva_txt(self, evt) :
+        try :
+            ImportFactiva(self, 'txt')
+        except :
+            BugReport(self)
+
+    def OnImportTXM(self, evt) :
+        try :
+            ImportFactiva(self, 'txm')
+        except :
+            BugReport(self)
+
+    def OnImportEuropress(self, evt) :
+        try :
+            ImportFactiva(self, 'euro')
+        except :
+            BugReport(self)
+
+    def OnImportDMI(self, evt):
+        ImportDMI(self, {})
+
+    def OnExportMeta(self, evt, corpus = None):
+        if corpus is None :
+            corpus = self.tree.getcorpus()
+        try :
+            ExportMetaTable(self, corpus)
+        except :
+            BugReport(self)
+
+    def ExtractTools(self, evt) :
+        ID = evt.GetId()
+        if ID == self.ID_splitvar :
+            Extract(self, 'splitvar')
+        elif ID == self.ID_extractmod :
+            Extract(self, 'mods')
+        elif ID == self.ID_extractthem :
+            Extract(self, 'them')
+
+    def OnTextReinert(self, event, corpus = None):
+        try:
+            #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
             #RunAnalyse(self, corpus, Alceste, OptAlceste)
             #RunAnalyse(self, corpus, Alceste, OptAlceste)
-            self.Text = Alceste(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
-            #self.history.addtab(self.Text.parametres)
-            #OpenAnalyse(self, self.Text.parametres['ira'])
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = 6)
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
-        #except:
-        #    BugReport(self)
+        except:
+            BugReport(self)
 
 
-    def OnPamSimple(self, event):
+    def OnPamSimple(self, event, corpus = None):
         try:
         try:
-            self.Text = PamTxt(self)
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = 6)
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
             BugReport(self)
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
             BugReport(self)
+
+    def SimiCluster(self, parametres = {}, fromprof = False, tableau = None) :
+        self.analyse_matrix(DoSimi, parametres = parametres, analyse_type = 'simiclustermatrix', matrix = tableau, dlgnb = 5)
     
     
-    def OnSimi(self,evt):
-        try :
+#    def OnSimi(self,evt):
+#        try :
             #print 'ATTENTION !!!! VERGES'
             #print 'ATTENTION !!!! VERGES'
-            self.res = DoSimi(self, param = None)
+            #print 'PLUS DE BUG SUR SIMI'
+#            self.res = DoSimi(self, param = None)
             #self.res = Verges(self)
             #self.res = Verges(self)
-            if self.res.val == wx.ID_OK :
-                 PlaySound(self)
-        except :
-            BugReport(self)
+#            if self.res.val == wx.ID_OK :
+#                PlaySound(self)
+#        except :
+#            BugReport(self)
 #################################################################
 
     def OnHelp(self, event):
 #################################################################
 
     def OnHelp(self, event):
@@ -946,6 +1203,7 @@ Voulez-vous fermer quand même ?"""
         dlg = PrefDialog(self)
         dlg.CenterOnParent()
         self.val = dlg.ShowModal()
         dlg = PrefDialog(self)
         dlg.CenterOnParent()
         self.val = dlg.ShowModal()
+        dlg.Destroy()
 
     def Upgrade(self) :
         if self.check_update:
 
     def Upgrade(self) :
         if self.check_update:
@@ -968,13 +1226,18 @@ Voulez-vous fermer quand même ?"""
             else:
                 truepath = False
         else:
             else:
                 truepath = False
         else:
-            pass
+            return
         if truepath :
             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
                 self.tableau = Tableau(self, self.filename)
         if truepath :
             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
                 self.tableau = Tableau(self, self.filename)
-                get_table_param(self, self.filename)
-                self.tableau.make_content()
-                self.tableau.show_tab()
+                val = get_table_param(self, self.filename)
+                if val == wx.ID_OK :
+                    self.tableau.make_content()
+                    OpenAnalyse(self, self.tableau.parametres)
+                    self.tree.OnItemAppend(self.tableau.parametres)
+                #get_table_param(self, self.filename)
+                #self.tableau.make_content()
+                #self.tableau.show_tab()
                 #open_data(self, self.filename)
             elif os.path.splitext(self.filename)[1] == '.txt':
                 self.OpenText()
                 #open_data(self, self.filename)
             elif os.path.splitext(self.filename)[1] == '.txt':
                 self.OpenText()
@@ -983,38 +1246,54 @@ Voulez-vous fermer quand même ?"""
                 #self.Text = OpenAnalyse(self, self.filename)
                 OpenAnalyse(self, self.filename)
         if not truepath:
                 #self.Text = OpenAnalyse(self, self.filename)
                 OpenAnalyse(self, self.filename)
         if not truepath:
-            print 'ce fichier n\'existe pas'
+            print 'This file does not exist'
             
         
 
 class IntroPanel(wx.Panel):
     def __init__(self, parent):
         wx.Panel.__init__(self, parent)
             
         
 
 class IntroPanel(wx.Panel):
     def __init__(self, parent):
         wx.Panel.__init__(self, parent)
-        #col = randint(0, 100)
-        col = 0
-        bckgrdcolor = wx.Colour(col, col, col)
+        #col = randint(0, 255)
+        #col1 = randint(0,255)
+        #col2 = randint(0,255)
+        #col = 57
+        col = 161
+        col1 = 198
+        col2 = 224
+        bckgrdcolor = wx.Colour(col, col1, col2)
         self.SetBackgroundColour(bckgrdcolor)
         txtcolour = wx.Colour(250, 250, 250)
         linkcolor = wx.Colour(255, 0, 0)
         sizer1 = wx.BoxSizer(wx.VERTICAL)
         sizer2 = wx.BoxSizer(wx.VERTICAL)
         self.SetBackgroundColour(bckgrdcolor)
         txtcolour = wx.Colour(250, 250, 250)
         linkcolor = wx.Colour(255, 0, 0)
         sizer1 = wx.BoxSizer(wx.VERTICAL)
         sizer2 = wx.BoxSizer(wx.VERTICAL)
-        sizer3 = wx.BoxSizer(wx.HORIZONTAL)
-        sizer4 = wx.BoxSizer(wx.VERTICAL)
-        sizer5 = wx.BoxSizer(wx.HORIZONTAL)
+        sizer4 = wx.BoxSizer(wx.HORIZONTAL)
         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
-        grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
+        grid_sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
+        
+        iralink = hl.HyperLinkCtrl(self, wx.ID_ANY, u"http://www.iramuteq.org", URL="http://www.iramuteq.org")
+        iralink.SetColours(linkcolor, linkcolor, "RED")
+        iralink.SetBackgroundColour(bckgrdcolor)
+        iralink.EnableRollover(True)
+        iralink.SetUnderlines(False, False, True)
+        iralink.SetBold(True)
+        iralink.UpdateLink()
+        
         PanelPres = wx.Panel(self)
         PanelPres = wx.Panel(self)
+        bckgrdcolor = wx.Colour(randint(0, 255), randint(0, 255), randint(0, 255))
         PanelPres.SetBackgroundColour(bckgrdcolor)
         PanelPres.SetBackgroundColour(bckgrdcolor)
+        
         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
         label_1.SetForegroundColour(wx.RED)
         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
         label_1.SetForegroundColour(wx.RED)
+        
+        iraicone = wx.Image(os.path.join(ImagePath,'iraicone100x100.png'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
+        but_ira = wx.StaticBitmap(self, -1, bitmap = iraicone)
+
+        
         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
         label2.SetForegroundColour(txtcolour)
         label2.SetBackgroundColour(bckgrdcolor)
         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
         label2.SetForegroundColour(txtcolour)
         label2.SetBackgroundColour(bckgrdcolor)
-        #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
-        #label3.SetForegroundColour(txtcolour)
-        #label3.SetBackgroundColour(bckgrdcolor)
         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
         self.hyper2.SetBackgroundColour(bckgrdcolor)
         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
         self.hyper2.SetBackgroundColour(bckgrdcolor)
@@ -1022,9 +1301,11 @@ class IntroPanel(wx.Panel):
         self.hyper2.SetUnderlines(False, False, True)
         self.hyper2.SetBold(True)
         self.hyper2.UpdateLink()
         self.hyper2.SetUnderlines(False, False, True)
         self.hyper2.SetBold(True)
         self.hyper2.UpdateLink()
+        
         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
         label_lerass.SetForegroundColour(txtcolour)
         label_lerass.SetBackgroundColour(bckgrdcolor)
         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
         label_lerass.SetForegroundColour(txtcolour)
         label_lerass.SetBackgroundColour(bckgrdcolor)
+        
         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
@@ -1032,14 +1313,18 @@ class IntroPanel(wx.Panel):
         self.hyper_lerass.SetUnderlines(False, False, True)
         self.hyper_lerass.SetBold(True)
         self.hyper_lerass.UpdateLink()
         self.hyper_lerass.SetUnderlines(False, False, True)
         self.hyper_lerass.SetBold(True)
         self.hyper_lerass.UpdateLink()
+        
         blank = wx.StaticText(PanelPres, -1, u'\n')
         blank1 = wx.StaticText(PanelPres, -1, u'\n')
         blank = wx.StaticText(PanelPres, -1, u'\n')
         blank1 = wx.StaticText(PanelPres, -1, u'\n')
-        labellicence = wx.StaticText(PanelPres, -1, u'Licence GNU GPL')
+        
+        labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
         labellicence.SetForegroundColour(txtcolour)
         labellicence.SetBackgroundColour(bckgrdcolor)
         labellicence.SetForegroundColour(txtcolour)
         labellicence.SetBackgroundColour(bckgrdcolor)
+        
         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
         labelcopy.SetForegroundColour(txtcolour)
         labelcopy.SetBackgroundColour(bckgrdcolor)
         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
         labelcopy.SetForegroundColour(txtcolour)
         labelcopy.SetBackgroundColour(bckgrdcolor)
+        
         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
@@ -1051,33 +1336,30 @@ class IntroPanel(wx.Panel):
         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
         
         
         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
         
         
-        #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
-        sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
+        sizer4.Add(label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
+        
         sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
-        #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 0, wx.ALIGN_CENTER, 5)
-        #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
-        #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
-        sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
+        sizer1.Add(sizer4, 2, wx.ALIGN_CENTER_HORIZONTAL, 0)
+        sizer1.Add(but_ira, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5)
+        sizer1.Add(iralink, 1, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_TOP, 5)
+        sizer2.Add(wx.StaticText(PanelPres, -1, u''), 0, wx.ALIGN_CENTER, 10)
         PanelPres.SetSizer(sizer2)
         PanelPres.SetSizer(sizer2)
-        sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
-        sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
-        sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
-        grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
-        grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
-        grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
+        grid_sizer_2.Add(but_python, 1, wx.ALIGN_BOTTOM)
+        grid_sizer_2.Add(but_lexique, 1, wx.ALIGN_BOTTOM)
+        grid_sizer_2.Add(but_r, 1,  wx.ALIGN_BOTTOM)
         
         
-        sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
-        sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
+        sizer1.Add(PanelPres, 0, wx.EXPAND |wx.ALL, 10)
+        sizer1.Add(grid_sizer_2, 2, wx.ALIGN_CENTER_HORIZONTAL|wx.ALL, 1)
         self.SetSizer(sizer1)
         sizer1.Fit(self)
     
         self.SetSizer(sizer1)
         sizer1.Fit(self)
     
@@ -1095,9 +1377,9 @@ class MySplashScreen(wx.SplashScreen):
         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
         wx.SplashScreen.__init__(self, bmp,
                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
         wx.SplashScreen.__init__(self, bmp,
                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
-                                 3000, None, -1)
+                                 1000, None, -1)
         self.Bind(wx.EVT_CLOSE, self.OnClose)
         self.Bind(wx.EVT_CLOSE, self.OnClose)
-        self.fc = wx.FutureCall(1500, self.ShowMain)
+        self.fc = wx.FutureCall(1, self.ShowMain)
 
     def OnClose(self, evt):
         evt.Skip()
 
     def OnClose(self, evt):
         evt.Skip()
@@ -1108,8 +1390,12 @@ class MySplashScreen(wx.SplashScreen):
             self.ShowMain()
 
     def ShowMain(self):
             self.ShowMain()
 
     def ShowMain(self):
-        frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(950, 650))
+        displaySize = wx.DisplaySize()
+        w = displaySize[0]/1.2
+        h = displaySize[1]/1.2
+        frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
         frame.Show()
         frame.Show()
+        frame.finish_init()
         frame.Upgrade()
         frame.OnOpenFromCmdl()
 #        if self.fc.IsRunning():
         frame.Upgrade()
         frame.OnOpenFromCmdl()
 #        if self.fc.IsRunning():
@@ -1122,7 +1408,6 @@ class MyApp(wx.App):
         Create and show the splash screen.  It will then create and show
         the main frame when it is time to do so.
         """
         Create and show the splash screen.  It will then create and show
         the main frame when it is time to do so.
         """
-
         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
         self.SetAppName("Iramuteq")       
         splash = MySplashScreen()
         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
         self.SetAppName("Iramuteq")       
         splash = MySplashScreen()