lot of things :)
[iramuteq] / iramuteq.py
index db25305..d1b6077 100644 (file)
@@ -13,7 +13,6 @@ parser.add_option("-f", "--file", dest="filename",
 
 #print args
 #print options
-
 import sys
 reload(sys)
 import locale
@@ -29,12 +28,13 @@ import logging
 #------------------------------------
 import wx
 #import wx.aui
-#import wx.lib.agw.aui as aui
-import agw.aui as aui
+if wx.__version__ >= '2.11' :
+    import wx.lib.agw.aui as aui
+else :
+    import aui
 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 checkversion import NewVersion
@@ -49,23 +49,24 @@ from tabafcm import DoAFCM
 from tabchdalc import AnalyseQuest
 from tabsimi import DoSimi
 from tabrsimple import InputText
-from tabverges import Verges
+from tabverges import Prototypical
 #from textafcuci import AfcUci
-#from textchdalc import AnalyseAlceste
 from analysetxt import Alceste
-from textdist import PamTxt
+from textdist import AnalysePam
 from textstat import Stat
 from textaslexico import Lexico
-from textsimi import SimiTxt
-from textwordcloud import WordCloud
+from textsimi import SimiTxt, SimiFromCluster
+from textwordcloud import WordCloud, ClusterCloud
 from profile_segment import ProfileSegment
-from textcheckcorpus import checkcorpus
+#from textcheckcorpus import checkcorpus
 from openanalyse import OpenAnalyse
-from corpusNG import BuildFromAlceste, Builder
+from corpus 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 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 tools import Extract
+
 from tree import LeftTree
 ##########################################################
 ID_OpenData = wx.NewId()
@@ -94,17 +95,18 @@ ID_RESULT = wx.NewId()
 ID_VIEWDATA = wx.NewId()
 ID_HTMLcontent = wx.NewId()
 ID_SimiTxt = wx.NewId()
+ID_proto = wx.NewId()
 ##########################################################
 #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())
-#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')
@@ -118,28 +120,37 @@ if os.getenv('HOME') != None:
 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
+#Si pas de fichiers de config utilisateur, on cree le repertoire
 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'))
-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)
-log.addHandler(ch)
 log.addHandler(fh)
+if sys.platform != 'win32' and sys.platform != 'darwin':
+    ch = logging.StreamHandler()
+    ch.setFormatter(formatter)
+    log.addHandler(ch)
 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)
+
+langues = {'french' : wx.LANGUAGE_FRENCH,
+            'english' : wx.LANGUAGE_ENGLISH,}
 #####################################################################
 
 class IraFrame(wx.Frame):
@@ -153,20 +164,21 @@ class IraFrame(wx.Frame):
         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()
+        #workaround for import problem
+        self.SimiFromCluster = SimiFromCluster
         #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)
+        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'])
+        self.setlangue()
         # tell FrameManager to manage this frame        
         #self._mgr = wx.aui.AuiManager()
         self._mgr = aui.AuiManager()
@@ -177,37 +189,51 @@ class IraFrame(wx.Frame):
         self.mb = wx.MenuBar()
 
         file_menu = wx.Menu()
-        item = wx.MenuItem(file_menu, ID_OpenData, _(u"Open a questionnaire"), _(u"Open a questionnaire"))
+        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))
         file_menu.AppendItem(item)
         
-        item = wx.MenuItem(file_menu, ID_OpenText, u"Ouvrir texte", u"Ouvrir un corpus texte")
+        item = wx.MenuItem(file_menu, ID_OpenText, _(u"Open a text corpora").decode('utf8'), _(u"Open a text corpora").decode('utf8'))
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         file_menu.AppendItem(item)
         
-        item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, u"Ouvrir une Analyse", "Ouvrir une Analyse")
+        item = wx.MenuItem(file_menu, ID_OnOpenAnalyse, _(u"Open an analysis").decode('utf8'), _(u"Open an analysis").decode('utf8'))
         item.SetBitmap(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN))
         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 ...")
+        
+        menuFactiva = wx.Menu()
+        fact_from_xml = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from xml").decode('utf8'))
+        fact_from_mail = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from mail").decode('utf8'))
+        fact_from_txt = wx.MenuItem(menuFactiva, wx.ID_ANY, _(u"from copy/paste").decode('utf8'))
+        menuFactiva.AppendItem(fact_from_xml)
+        menuFactiva.AppendItem(fact_from_mail)
+        menuFactiva.AppendItem(fact_from_txt)
+        file_menu.AppendMenu(-1, _(u"Import from factiva"), 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'))
+        menuTools.AppendItem(splitvar)
+        menuTools.AppendItem(extractmod)
+        self.ID_splitvar = splitvar.GetId()
+        self.ID_extractmod = extractmod.GetId()
+        file_menu.AppendMenu(-1, _(u"Tools"), 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))
-        #item.Enable(False)
         file_menu.AppendItem(item)
         
-        file_menu.Append(wx.ID_EXIT, u"Exit")
+        file_menu.Append(wx.ID_EXIT, _(u"Exit"))
         
         edit_menu = wx.Menu()
-        edit_menu.Append(wx.ID_PREFERENCES, '', u'Préférences')
+        edit_menu.Append(wx.ID_PREFERENCES, '', _(u'Preferences').decode('utf8'))
         
         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')
+        view_menu.Append(ID_ACCEUIL, _(u"Home page").decode('utf8'))
+        view_menu.Append(ID_VIEWDATA, _(u"Show data").decode('utf8'))
+        view_menu.Append(ID_RESULT, _(u'Show results').decode('utf8'))
         #view_menu.AppendSeparator()
 
         analyse_menu = wx.Menu()
@@ -215,22 +241,23 @@ class IraFrame(wx.Frame):
         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")
+        menu_classif.Append(ID_CHDAlceste, u"Méthode GNEPA")
+        #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_AFCM, u"AFCM")
         analyse_menu.Append(ID_SIMI, u"Analyse de similitudes")
+        analyse_menu.Append(ID_proto, _(u"Prototypical analysis"))
         ID_RCODE = wx.NewId()
         analyse_menu.Append(ID_RCODE, u"Code R...")
 
         text_menu = wx.Menu()
-        text_menu.Append(ID_CHECKCORPUS, u"Vérifier le corpus")
+        #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")
+        menu_classiftxt.Append(ID_TEXTALCESTE, u"Méthode GNEPA")
+        #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()
@@ -240,12 +267,12 @@ class IraFrame(wx.Frame):
         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"))
+        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(analyse_menu, _("Spreadsheet 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)
 #--------------------------------------------------------------------
@@ -281,9 +308,9 @@ class IraFrame(wx.Frame):
         #                  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._mgr.AddPane(self.tree, aui.AuiPaneInfo().Name("lefttree").Caption("Navigateur").
@@ -307,7 +334,6 @@ class IraFrame(wx.Frame):
         self.Sheet = MySheet(self)
         #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.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
@@ -335,15 +361,20 @@ class IraFrame(wx.Frame):
         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.OnFreq, id=ID_Freq)
         self.Bind(wx.EVT_MENU, self.OnChi2, id=ID_Chi2)
         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.OnAFCM, id=ID_AFCM)
+        self.Bind(wx.EVT_MENU, self.OnProto, id=ID_proto)
         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.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.OnTextAfcm, id=ID_TEXTAFCM)
@@ -394,10 +425,27 @@ class IraFrame(wx.Frame):
         if self.SysEncoding == 'mac-roman' : self.SysEncoding = 'MacRoman'
         self.type = ''
 
+##############################################################@
+        self.DisEnSaveTabAs(False)
+        self.ShowMenu(_("View"), False)
+        self.ShowMenu(_("Spreadsheet analysis"), False)
+        self.ShowMenu(_("Text analysis"), 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)
+                self.pref.read(self.ConfigPath['preferences'])
                 New = True
             else :
                 CopyConf(self)
@@ -406,6 +454,9 @@ class IraFrame(wx.Frame):
             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'])
@@ -432,47 +483,48 @@ class IraFrame(wx.Frame):
 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)
+(souvent 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)
             dlg.CenterOnParent()
             if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
                  evt.Veto()
+            dlg.Destroy()
+
+
+    def setlangue(self) :
+        try :
+            self.pref.read(self.ConfigPath['preferences'])
+            guilangue = self.pref.get('iramuteq', 'guilanguage')
+            if guilangue == 'french' :
+                self.presLan_fr.install()
             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()
+                self.presLan_en.install()
+            mylocale = wx.Locale(langues[guilangue])
+            mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
+            mylocale.AddCatalog('iramuteq')
+        except :
+            self.presLan_fr.install()
+            mylocale = wx.Locale(langues['french'])
+            mylocale.AddCatalogLookupPathPrefix(os.path.join(AppliPath,'locale'))
+            mylocale.AddCatalog('iramuteq')
+
 
     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", u"Installation", wx.OK | wx.ICON_INFORMATION)
             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)
+        for item in items :
+            if item.GetId() == ID_SaveTab :
+                item.Enable(DISEN)
     
     def ShowMenu(self, menu, Show=True):
         menu_pos = self.mb.FindMenu(menu)
@@ -515,7 +567,6 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
             self._mgr.UnInit()
             del self._mgr
             self.Destroy()
-            ##FIXME
             #if sys.platform == 'win32' :
             #    os.system("taskkill /im iramuteq.exe /f")
             #    print 'meurtre de process'
@@ -570,10 +621,13 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
         
         builder =  Builder(self, dlg)
         if builder.res == wx.ID_OK :
-            corpus = builder.doanalyse()
-            self.history.add(corpus.parametres)
-            self.tree.OnItemAppend(corpus.parametres)
-            OpenAnalyse(self, corpus.parametres)
+            try :
+                corpus = builder.doanalyse()
+                self.history.add(corpus.parametres)
+                self.tree.OnItemAppend(corpus.parametres)
+                OpenAnalyse(self, corpus.parametres)
+            except :
+                BugReport(self)
         #self.content = DoConf().totext(corpus.parametres)
 #        parametres = DoConf(os.path.join(UserConfigPath,'corpus.cfg')).getoptions('corpus')
 #        parametres['originalpath'] = self.filename
@@ -590,28 +644,24 @@ vous devez signaler le chemin de l'éxecutable de R dans les préférences."""
 #        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()
+            else :
+                count = 1
+                keepGoing = dlg.Update(count, u"Lecture du fichier")
+    #            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)
         
     def OnExit(self, event):
@@ -663,17 +713,18 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, États-Unis."""
         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'])
 
     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())
-        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())
@@ -707,7 +758,6 @@ Voulez-vous fermer quand même ?"""
             remove = True
         if self.nb.GetPageCount() == 1 and remove and not notebook :
             self.LastTabClose()
-
     
     def LastTabClose(self) :
         if self.nb.GetPageCount() == 1 :
@@ -771,21 +821,6 @@ Voulez-vous fermer quand même ?"""
     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))
@@ -843,26 +878,35 @@ Voulez-vous fermer quand même ?"""
                 PlaySound(self)
         except:
             BugReport(self)
+    
+    def OnProto(self, evt) :
+        Prototypical(self, {'type' : 'proto'})
 
     def OnSimiTxt(self, evt, corpus = None) :
-            print 'PLUS DE BUG SUR SIMITXT'
-        #try :
+        #    print 'PLUS DE BUG SUR SIMITXT'
+        try :
             #self.Text = SimiTxt(self)
+            if corpus is None :
+                corpus = self.tree.getcorpus()            
             self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
-        #except :
-        #    BugReport(self)
+        except :
+            BugReport(self)
     
-    def OnWordCloud(self, evt) :
+    def OnWordCloud(self, evt, corpus = None) :
         #    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 = progressbar(self, 3))
             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 = progressbar(self, 3))
 
     def OnAFCM(self, event):
         try:
@@ -870,31 +914,35 @@ Voulez-vous fermer quand même ?"""
         except:
             BugReport(self)
 
-    def OnCheckcorpus(self, evt):
-        try :
-            checkcorpus(self)
-        except :
-            BugReport(self)
+#    def OnCheckcorpus(self, evt):
+#        try :
+#            checkcorpus(self)
+#        except :
+#            BugReport(self)
 
     def OnTextStat(self, event, corpus = None):
-            print 'PAS DE BUG SUR TEXT STAT'
-        #try:
+            #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 = progressbar(self, 7))
             
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
-        #except:
-        #    BugReport(self)
+        except:
+            BugReport(self)
         
     def OnTextSpec(self, event, corpus = None):  
-        #try:
+        try:
             #self.Text = AsLexico(self)
-            print('ATTENTION : PLUS DE BUG SUR LEXICO')
+            #print('ATTENTION : PLUS DE BUG SUR LEXICO')
+            if corpus is None :
+                corpus = self.tree.getcorpus()
             self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
             if self.Text.val == wx.ID_OK :
                 PlaySound(self)
-        #except:
-        #    BugReport(self)
+        except:
+            BugReport(self)
     
     def OnTextAfcm(self, event):
         try:
@@ -903,35 +951,60 @@ Voulez-vous fermer quand même ?"""
         except:
             BugReport(self)
 
-    def import_factiva(self,event):
+    def import_factiva_xml(self,event):
         try :
-            ImportFactiva(self)
+            ImportFactiva(self, 'xml')
         except :
             BugReport(self)
 
+    def import_factiva_mail(self, evt) :
+        try :
+            ImportFactiva(self, 'mail')
+        except :
+            BugReport(self)
+
+    def import_factiva_txt(self, evt) :
+        try :
+            ImportFactiva(self, 'txt')
+        except :
+            BugReport(self)
+
+    def ExtractTools(self, evt) :
+        ID = evt.GetId()
+        if ID == self.ID_splitvar :
+            Extract(self, 'splitvar')
+        else :
+            Extract(self, 'mods')
+
     def OnTextAlceste(self, event, corpus = None):
-        #try:
-            print('ATTENTION : PLUS DE BUG SUR ALCESTE')
+        try:
+            #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
             #RunAnalyse(self, corpus, Alceste, OptAlceste)
+            if corpus is None :
+                corpus = self.tree.getcorpus()            
             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 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:
-            self.Text = PamTxt(self)
+            if corpus is None :
+                corpus = self.tree.getcorpus()
+            self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
             if self.Text.val == wx.ID_OK:
                 PlaySound(self)
         except:
             BugReport(self)
+
+    def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
+        DoSimi(self, param = parametres, fromprof =  fromprof, pathout = pathout, listactives = listactives, actives = actives, tableau = tableau)
     
     def OnSimi(self,evt):
         try :
             #print 'ATTENTION !!!! VERGES'
+            #print 'PLUS DE BUG SUR SIMI'
             self.res = DoSimi(self, param = None)
             #self.res = Verges(self)
             if self.res.val == wx.ID_OK :
@@ -991,7 +1064,9 @@ Voulez-vous fermer quand même ?"""
 class IntroPanel(wx.Panel):
     def __init__(self, parent):
         wx.Panel.__init__(self, parent)
-        #col = randint(0, 100)
+        #col = randint(0, 255)
+        #col1 = randint(0,255)
+        #col2 = randint(0,255)
         col = 0
         bckgrdcolor = wx.Colour(col, col, col)
         self.SetBackgroundColour(bckgrdcolor)
@@ -1096,9 +1171,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,
-                                 3000, None, -1)
+                                 2000, None, -1)
         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()
@@ -1109,8 +1184,9 @@ class MySplashScreen(wx.SplashScreen):
             self.ShowMain()
 
     def ShowMain(self):
-        frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(950, 650))
+        frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(1100, 800))
         frame.Show()
+        frame.finish_init()
         frame.Upgrade()
         frame.OnOpenFromCmdl()
 #        if self.fc.IsRunning():
@@ -1123,7 +1199,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.
         """
-
         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
         self.SetAppName("Iramuteq")       
         splash = MySplashScreen()