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