...
[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 corpora").decode('utf8'), _(u"Open a text corpora").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             self.history.add(corpus.parametres)
602             self.tree.OnItemAppend(corpus.parametres)
603             OpenAnalyse(self, corpus.parametres)
604             
605     def OpenText(self):
606         dlg = wx.ProgressDialog("Ouverture...",
607                                    "Veuillez patienter...",
608                                    maximum=2,
609                                    parent=self,
610                                    style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
611                                    )
612         
613         builder =  Builder(self, dlg)
614         if builder.res == wx.ID_OK :
615             try :
616                 corpus = builder.doanalyse()
617                 self.history.add(corpus.parametres)
618                 self.tree.OnItemAppend(corpus.parametres)
619                 OpenAnalyse(self, corpus.parametres)
620             except :
621                 BugReport(self)
622             else :
623                 count = 1
624                 keepGoing = dlg.Update(count, u"Lecture du fichier")
625                 self.ShowMenu(_(u"View").decode('utf8'))
626                 self.ShowMenu(_(u"Text analysis").decode('utf8'))
627                 self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
628                 self.type = "Texte"
629                 self.DataTxt = False
630                 self.Text = ''
631                 count += 1
632                 keepGoing = dlg.Update(count, u"Chargement du dictionnaire")
633                 dlg.Destroy()
634         #self.OnViewData(wx.EVT_BUTTON)
635         
636     def OnExit(self, event):
637         self.Close()
638
639     def OnAbout(self, event):
640         info = wx.AboutDialogInfo()
641         info.Name = ConfigGlob.get('DEFAULT', 'name')
642         info.Version = ConfigGlob.get('DEFAULT', 'version')
643         info.Copyright = ConfigGlob.get('DEFAULT', 'copyright')
644         info.Description = u"""
645 Interface de R pour les Analyses Multidimensionnelles 
646 de Textes et de Questionnaires
647
648 Un logiciel libre
649 construit avec des logiciels libres.
650
651 Laboratoire LERASS
652
653 REPERE
654 """
655         info.WebSite = ("http://www.iramuteq.org", u"Site web IRaMuTeQ")
656         dev = ConfigGlob.get('DEFAULT', 'dev').split(';')
657         info.Developers = dev
658         info.License = u"""Iramuteq est un logiciel libre ; vous pouvez le diffuser et/ou le modifier 
659 suivant les termes de la Licence Publique GĂ©nĂ©rale GNU telle que publiĂ©e 
660 par la Free Software Foundation ; soit la version 2 de cette licence, 
661 soit (Ă  votre convenance) une version ultĂ©rieure.
662
663 Iramuteq est diffusĂ© dans l'espoir qu'il sera utile, 
664 mais SANS AUCUNE GARANTIE ; sans mĂŞme une garantie implicite 
665 de COMMERCIALISATION ou d'ADÉQUATION Ă€ UN USAGE PARTICULIER. 
666 Voyez la Licence Publique GĂ©nĂ©rale GNU pour plus de dĂ©tails.
667
668 Vous devriez avoir reçu une copie de la Licence Publique GĂ©nĂ©rale GNU
669 avec Iramuteq ; sinon, veuillez Ă©crire Ă  la Free Software Foundation,
670 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, Ă‰tats-Unis."""
671         wx.AboutBox(info)
672
673     def GetDockArt(self):
674         return self._mgr.GetArtProvider()
675
676     def DoUpdate(self):
677         self._mgr.Update()
678
679     def OnPageChanged(self, event) :
680         new = event.GetSelection()
681         nobject = event.GetEventObject()
682         parent = nobject.GetParent()
683         if isinstance(parent, IraFrame) :
684             npage = self.nb.GetPage(new)
685             if 'parametres' in dir(npage) :
686                 self.tree.GiveFocus(uuid=npage.parametres['uuid'])
687                 if npage.parametres.get('matrix', False) :
688                     self.ShowMenu(_(u"Text analysis").decode('utf8'), False)
689                     self.ShowMenu(_(u"Matrix analysis").decode('utf8'), True)
690                 elif npage.parametres.get('corpus', False) :
691                     self.ShowMenu(_(u"Text analysis").decode('utf8'))
692                     self.ShowMenu(_(u"Matrix analysis").decode('utf8'), False)
693
694     def OnCloseTab(self, evt):
695         #log.info('Closing tab %s' % str(evt.GetEventObject()))
696         ctrl = evt.GetEventObject()
697         if isinstance(ctrl.GetParent(), aui.AuiNotebook) or isinstance(ctrl.GetParent(), wx.Panel):
698             notebook = True
699         else :
700             notebook = False
701         page = self.nb.GetPage(self.nb.GetSelection())
702         if 'parametres' in dir(page) and isinstance(ctrl.GetParent(), IraFrame) :
703             self.history.rmtab(page.parametres)
704             self.tree.CloseItem(uuid = page.parametres['uuid'])
705         TabTitle = self.nb.GetPageText(self.nb.GetSelection())
706 #         if self.DictTab != {} :
707 #             if TabTitle in self.DictTab :
708 #                 ListFile=self.DictTab[TabTitle]
709 #                 if False in ListFile:
710 #                     msg = u"""
711 # Certains rĂ©sultats ne sont pas enregistrer.
712 # Voulez-vous fermer quand mĂŞme ?"""
713 #                     dlg = wx.MessageDialog(self, msg, "Sauvegarde",wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
714
715 #                     dlg.CenterOnParent()
716 #                     if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
717 #                         remove = False
718 #                         evt.Veto()
719 #                         dlg.Destroy()
720 #                     else :
721 #                         for f in ListFile[1:] :
722 #                             print 'remove', f
723 #                             os.remove(f)
724 #                             remove = True
725 #                         dlg.Destroy()
726 #                 elif True in ListFile :
727 #                     remove = True
728 #                 if remove:
729 #                     del self.DictTab[TabTitle]
730 #             else : 
731 #                 self.LastTabClose()
732 #        else :
733 #            remove = True
734         if self.nb.GetPageCount() == 1 and not notebook :
735             self.LastTabClose()
736     
737     def LastTabClose(self) :
738         if self.nb.GetPageCount() == 1 :
739             #self.DisEnSaveTabAs(False)
740             if self.DataTxt :
741                 self.ShowAPane("Text")
742             elif self.DataPop :
743                 self.ShowAPane("Data")
744             else :
745                 self.ShowAPane("Intro_Text")
746
747 #     def OnSaveTabAs(self, event):
748 #         SelectTab = self.nb.GetSelection()
749 #         TabTitle = self.nb.GetPageText(SelectTab)
750 #         FileToSave = self.DictTab[TabTitle]
751 #         NewListFile = []
752 #         dlg = wx.FileDialog(
753 #             self, message="Enregistrer sous...", defaultDir=os.getcwd(),
754 #             defaultFile="resultat.html", wildcard="Tous les fichiers|*", style=wx.SAVE | wx.OVERWRITE_PROMPT
755 #             )
756 #         dlg.SetFilterIndex(2)
757 #         dlg.CenterOnParent()
758 #         
759 #         if dlg.ShowModal() == wx.ID_OK:
760 #             Path = dlg.GetPath()
761 #             Dirname = os.path.dirname(Path)
762 #             Filename = dlg.GetFilename()
763 #         else :
764 #             Path = False
765 #         dlg.Destroy()
766 #         if Path:
767 #             shutil.copyfile(FileToSave[-1], Path)
768 #             os.remove(FileToSave[len(FileToSave) - 1])
769 #             NewListFile.append(True)
770 #             NewListFile.append(Path)
771 #             for f in FileToSave[1:-1] :
772 #                 Fileout = os.path.join(Dirname, os.path.basename(f))
773 #                 shutil.copyfile(f, Fileout)
774 #                 NewListFile.append(Fileout)
775 #                 os.remove(f)
776 #             TabText = Filename
777 #             self.DictTab[TabText] = NewListFile
778 #             del self.DictTab[TabTitle]
779 #             self.nb.SetPageText(SelectTab, TabText)
780
781     def GetStartPosition(self):
782
783         self.x = self.x + 20
784         x = self.x
785         pt = self.ClientToScreen(wx.Point(0, 0))
786         
787         return wx.Point(pt.x + x, pt.y + x)
788     
789     def ShowAPane(self, panel):
790         for pane in self._mgr.GetAllPanes() :
791             if not pane.IsToolbar() and pane.name != 'lefttree': 
792                 pane.Hide()
793         self._mgr.GetPane(panel).Show()
794         self._mgr.Update()
795         
796     def OnAcceuil(self, event):
797         self.ShowAPane(u"Intro_Text")
798         event.Skip()
799     
800     def CreateHTMLCtrl(self):
801         ctrl = wx.html.HtmlWindow(self, -1, wx.DefaultPosition, wx.Size(400, 300))
802         if "gtk2" in wx.PlatformInfo:
803             ctrl.SetStandardFonts()
804         ctrl.SetPage(u"text")        
805         return ctrl
806
807     def ShowTab(self, evt):
808         self.ShowAPane("Tab_content")
809
810 ################################################################
811 #debut des analyses
812 ################################################################
813     def analyse_matrix(self, analyse, analyse_type = '', matrix = None, dlgnb = 1):
814         if matrix is None :
815             matrix = self.tree.getmatrix()
816         #try :
817         analyse(self, matrix, parametres = {'type' : analyse_type}, dlg = progressbar(self, dlgnb))
818         #except:
819         #    BugReport(self)           
820
821     def OnFreq(self, event, matrix = None):
822         self.analyse_matrix(Frequences, analyse_type = 'freq', matrix = matrix, dlgnb = 3)
823         #if matrix is None :
824         #    matrix = self.tree.getmatrix()
825         #try:
826         #    Frequences(self, matrix, parametres = {'type' : 'freq'}, dlg = progressbar(self, 3)) 
827         #except:
828         #    BugReport(self)
829
830     def OnChi2(self, event, matrix = None):
831         #try:
832         self.analyse_matrix(ChiSquare, matrix = matrix, analyse_type = 'chi2', dlgnb = 3) 
833         #except:
834         #    BugReport(self)
835
836     def OnSimiTab(self, event, matrix = None):
837         if matrix is None :
838             matrix = self.tree.getmatrix()
839         try:
840             DoSimi(self, matrix, parametres = {'type' : 'simimatrix'}, dlg = progressbar(self, 3)) 
841         except:
842             BugReport(self)
843
844     def OnCHDReinert(self, event, matrix = None):
845         if matrix is None :
846             matrix = self.tree.getmatrix()
847         AnalyseQuest(self, matrix, parametres = {'type' : 'reinertmatrix'}, dlg = progressbar(self, 3))
848             
849     def OnStudent(self, event):
850         try:
851             MakeStudent(self) 
852         except:
853             BugReport(self)
854
855     def OnRCode(self, event):
856         try:
857             InputText(self)
858         except:
859             BugReport(self)
860
861     def OnCHDSIM(self, event):
862         try:
863         #    print 'ATTENTION!!!!'
864             chdsim = ChdCluster(self)
865             if chdsim.val == wx.ID_OK:
866                 PlaySound(self)
867         except:
868             BugReport(self)
869  
870 #     def OnCHDReinert(self, event):
871 #         try:
872 #          #   print('PLUS DE BUG SUR ALCESTE QUESTIONNAIRE')
873 #             self.quest = AnalyseQuest(self)
874 #             if self.quest.val == wx.ID_OK:
875 #                 PlaySound(self)
876 #         except:
877 #             BugReport(self)
878     
879     def OnProto(self, evt) :
880         Prototypical(self, {'type' : 'proto'})
881
882     def OnSimiTxt(self, evt, corpus = None) :
883         #    print 'PLUS DE BUG SUR SIMITXT'
884         try :
885             #self.Text = SimiTxt(self)
886             if corpus is None :
887                 corpus = self.tree.getcorpus()            
888             self.Text = SimiTxt(self, corpus, parametres = {'type': 'simitxt'}, dlg = progressbar(self, 3))
889             if self.Text.val == wx.ID_OK :
890                 PlaySound(self)
891         except :
892             BugReport(self)
893     
894     def OnWordCloud(self, evt, corpus = None) :
895         #    print 'PLUS DE BUG SUR WORDCLOUD'
896         try :
897             if corpus is None :
898                 corpus = self.tree.getcorpus()            
899             self.Text = WordCloud(self, corpus, parametres = {'type' : 'wordcloud'}, dlg = progressbar(self, 3))
900             if self.Text.val == wx.ID_OK :
901                 PlaySound(self)
902         except :
903             BugReport(self)
904
905     def OnClusterCloud(self, corpus, parametres = None) :
906         self.Text = ClusterCloud(self, corpus, parametres = parametres, dlg = progressbar(self, 3))
907
908     def OnAFCM(self, event):
909         try:
910             DoAFCM(self)
911         except:
912             BugReport(self)
913
914     def OnTextStat(self, event, corpus = None):
915             #print 'PAS DE BUG SUR TEXT STAT'
916         try:
917             if corpus is None :
918                 corpus = self.tree.getcorpus()
919             self.Text = Stat(self, corpus, parametres = {'type': 'stat'}, dlg = progressbar(self, 7))
920             
921             if self.Text.val == wx.ID_OK :
922                 PlaySound(self)
923         except:
924             BugReport(self)
925         
926     def OnTextSpec(self, event, corpus = None):  
927         try:
928             #self.Text = AsLexico(self)
929             #print('ATTENTION : PLUS DE BUG SUR LEXICO')
930             if corpus is None :
931                 corpus = self.tree.getcorpus()
932             self.Text = Lexico(self, corpus, parametres = {'type' : 'spec'}, dlg = progressbar(self, 3))
933             if self.Text.val == wx.ID_OK :
934                 PlaySound(self)
935         except:
936             BugReport(self)
937     
938     def OnTextAfcm(self, event):
939         try:
940             AfcUci(self)
941             PlaySound(self)
942         except:
943             BugReport(self)
944
945     def import_factiva_xml(self,event):
946         try :
947             ImportFactiva(self, 'xml')
948         except :
949             BugReport(self)
950
951     def import_factiva_mail(self, evt) :
952         try :
953             ImportFactiva(self, 'mail')
954         except :
955             BugReport(self)
956
957     def import_factiva_txt(self, evt) :
958         try :
959             ImportFactiva(self, 'txt')
960         except :
961             BugReport(self)
962
963     def OnImportTXM(self, evt) :
964         try :
965             ImportFactiva(self, 'txm')
966         except :
967             BugReport(self)
968
969     def ExtractTools(self, evt) :
970         ID = evt.GetId()
971         if ID == self.ID_splitvar :
972             Extract(self, 'splitvar')
973         elif ID == self.ID_extractmod :
974             Extract(self, 'mods')
975         elif ID == self.ID_extractthem :
976             Extract(self, 'them')
977
978     def OnTextReinert(self, event, corpus = None):
979         try:
980             #print('ATTENTION : PLUS DE BUG SUR ALCESTE')
981             #RunAnalyse(self, corpus, Alceste, OptAlceste)
982             if corpus is None :
983                 corpus = self.tree.getcorpus()            
984             self.Text = Reinert(self, corpus, parametres = {'type': 'alceste'}, dlg = progressbar(self,6))
985             if self.Text.val == wx.ID_OK:
986                 PlaySound(self)
987         except:
988             BugReport(self)
989
990     def OnPamSimple(self, event, corpus = None):
991         try:
992             if corpus is None :
993                 corpus = self.tree.getcorpus()
994             self.Text = AnalysePam(self, corpus, parametres = {'type' : 'pamtxt'}, dlg = progressbar(self,6))
995             if self.Text.val == wx.ID_OK:
996                 PlaySound(self)
997         except:
998             BugReport(self)
999
1000     def SimiCluster(self, parametres = {}, fromprof = False, pathout = '', listactives = [], actives = [], tableau = None) :
1001         DoSimi(self, param = parametres, fromprof =  fromprof, listactives = listactives, actives = actives, tableau = tableau)
1002     
1003 #    def OnSimi(self,evt):
1004 #        try :
1005             #print 'ATTENTION !!!! VERGES'
1006             #print 'PLUS DE BUG SUR SIMI'
1007 #            self.res = DoSimi(self, param = None)
1008             #self.res = Verges(self)
1009 #            if self.res.val == wx.ID_OK :
1010 #                PlaySound(self)
1011 #        except :
1012 #            BugReport(self)
1013 #################################################################
1014
1015     def OnHelp(self, event):
1016         webbrowser.open('http://www.iramuteq.org/documentation')
1017     
1018     def OnPref(self, event):
1019         dlg = PrefDialog(self)
1020         dlg.CenterOnParent()
1021         self.val = dlg.ShowModal()
1022
1023     def Upgrade(self) :
1024         if self.check_update:
1025             NewVersion(self)
1026         else:
1027             print 'pas de verif'    
1028         #IsNew(self)
1029         #CheckRPackages(self)
1030
1031     def OnOpenFromCmdl(self):
1032         truepath = True
1033         if options.filename :
1034             if os.path.exists(options.filename):
1035                 self.filename = os.path.abspath(options.filename)
1036             else:
1037                 truepath = False
1038         elif args :
1039             if os.path.exists(os.path.realpath(args[0])):
1040                 self.filename = os.path.abspath(os.path.realpath(args[0]))
1041             else:
1042                 truepath = False
1043         else:
1044             pass
1045         if truepath :
1046             if os.path.splitext(self.filename)[1] in ['.csv', '.xls', '.ods']:
1047                 self.tableau = Tableau(self, self.filename)
1048                 get_table_param(self, self.filename)
1049                 self.tableau.make_content()
1050                 self.tableau.show_tab()
1051                 #open_data(self, self.filename)
1052             elif os.path.splitext(self.filename)[1] == '.txt':
1053                 self.OpenText()
1054             elif os.path.splitext(self.filename)[1] == '.ira' :
1055                 #self.corpus = Corpus(self)
1056                 #self.Text = OpenAnalyse(self, self.filename)
1057                 OpenAnalyse(self, self.filename)
1058         if not truepath:
1059             print 'ce fichier n\'existe pas'
1060             
1061         
1062
1063 class IntroPanel(wx.Panel):
1064     def __init__(self, parent):
1065         wx.Panel.__init__(self, parent)
1066         col = randint(0, 255)
1067         col1 = randint(0,255)
1068         col2 = randint(0,255)
1069         col = 57
1070         bckgrdcolor = wx.Colour(col, col1, col2)
1071         self.SetBackgroundColour(bckgrdcolor)
1072         txtcolour = wx.Colour(250, 250, 250)
1073         linkcolor = wx.Colour(255, 0, 0)
1074         sizer1 = wx.BoxSizer(wx.VERTICAL)
1075         sizer2 = wx.BoxSizer(wx.VERTICAL)
1076         sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1077         sizer4 = wx.BoxSizer(wx.VERTICAL)
1078         sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1079         grid_sizer_1 = wx.FlexGridSizer(1, 4, 0, 0)
1080         grid_sizer_3 = wx.FlexGridSizer(1, 4, 0, 0)
1081         grid_sizer_2 = wx.FlexGridSizer(1, 3, 0, 0)
1082         PanelPres = wx.Panel(self)
1083         PanelPres.SetBackgroundColour(bckgrdcolor)
1084         label_1 = wx.StaticText(self, -1, u"IRaMuTeQ", size=(-1, -1))
1085         label_1.SetFont(wx.Font(46, wx.TELETYPE, wx.NORMAL, wx.BOLD, 0, "Purisa"))
1086         label_1.SetForegroundColour(wx.RED)
1087         label2 = wx.StaticText(PanelPres, -1 , u'\nVersion ' + ConfigGlob.get('DEFAULT', 'version') + '\n')
1088         label2.SetForegroundColour(txtcolour)
1089         label2.SetBackgroundColour(bckgrdcolor)
1090         #label3 = wx.StaticText(PanelPres, -1 , u'Equipe ')
1091         #label3.SetForegroundColour(txtcolour)
1092         #label3.SetBackgroundColour(bckgrdcolor)
1093         self.hyper2 = hl.HyperLinkCtrl(PanelPres, wx.ID_ANY, u"REPERE", URL="http://repere.no-ip.org/")
1094         self.hyper2.SetColours(linkcolor, linkcolor, "RED")
1095         self.hyper2.SetBackgroundColour(bckgrdcolor)
1096         self.hyper2.EnableRollover(True)
1097         self.hyper2.SetUnderlines(False, False, True)
1098         self.hyper2.SetBold(True)
1099         self.hyper2.UpdateLink()
1100         label_lerass = wx.StaticText(PanelPres, -1, u'Laboratoire ')
1101         label_lerass.SetForegroundColour(txtcolour)
1102         label_lerass.SetBackgroundColour(bckgrdcolor)
1103         self.hyper_lerass = hl.HyperLinkCtrl(PanelPres, -1, u'LERASS', URL="http://www.lerass.com")
1104         self.hyper_lerass.SetColours(linkcolor, linkcolor, "RED")
1105         self.hyper_lerass.SetBackgroundColour(bckgrdcolor)
1106         self.hyper_lerass.EnableRollover(True)
1107         self.hyper_lerass.SetUnderlines(False, False, True)
1108         self.hyper_lerass.SetBold(True)
1109         self.hyper_lerass.UpdateLink()
1110         blank = wx.StaticText(PanelPres, -1, u'\n')
1111         blank1 = wx.StaticText(PanelPres, -1, u'\n')
1112         labellicence = wx.StaticText(PanelPres, -1, _(u"License GNU GPL").decode('utf8'))
1113         labellicence.SetForegroundColour(txtcolour)
1114         labellicence.SetBackgroundColour(bckgrdcolor)
1115         labelcopy = wx.StaticText(PanelPres, -1, ConfigGlob.get('DEFAULT', 'copyright'))
1116         labelcopy.SetForegroundColour(txtcolour)
1117         labelcopy.SetBackgroundColour(bckgrdcolor)
1118         python_img = wx.Image(os.path.join(ImagePath,'python-logo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1119         r_img = wx.Image(os.path.join(ImagePath,'Rlogo.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1120         lexique_img = wx.Image(os.path.join(ImagePath,'LexTexte4.jpg'), wx.BITMAP_TYPE_ANY).ConvertToBitmap()
1121         but_python = wx.BitmapButton(self, -1, python_img)
1122         but_lexique = wx.BitmapButton(self, -1, lexique_img)
1123         but_r = wx.BitmapButton(self, -1, r_img)
1124         self.Bind(wx.EVT_BUTTON, self.OnPython, but_python)
1125         self.Bind(wx.EVT_BUTTON, self.OnLexique, but_lexique)
1126         self.Bind(wx.EVT_BUTTON, self.OnR, but_r)
1127         
1128         
1129         #grid_sizer_1.Add(label3, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1130         grid_sizer_1.Add(self.hyper2, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1131         grid_sizer_3.Add(label_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1132         grid_sizer_3.Add(self.hyper_lerass, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1133         sizer4.Add(label_1, 0, wx.ALIGN_CENTER, 5)
1134         sizer2.Add(label2, 0, wx.ALIGN_CENTER, 5)
1135         #sizer2.Add(wx.StaticText(PanelPres, -1, u''), 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(grid_sizer_3, 0, wx.ALIGN_CENTER, 5)
1139         sizer2.Add(wx.StaticText(PanelPres, -1, u' '), 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(grid_sizer_1, 0, wx.ALIGN_CENTER, 5)
1143         sizer2.Add(labellicence, 0, wx.ALIGN_CENTER, 5)
1144         sizer2.Add(labelcopy, 0, wx.ALIGN_CENTER, 5)
1145         sizer1.Add(sizer4, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1146         PanelPres.SetSizer(sizer2)
1147         sizer5.Add(blank, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 2)
1148         sizer5.Add(PanelPres, 1, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 0)
1149         sizer5.Add(blank1, 1, wx.ALIGN_CENTER_HORIZONTAL,2)
1150         grid_sizer_2.Add(but_python, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1151         grid_sizer_2.Add(but_lexique, 1,wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1152         grid_sizer_2.Add(but_r, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALIGN_CENTER_VERTICAL)
1153         
1154         sizer1.Add(sizer5, 3, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 1)
1155         sizer1.Add(grid_sizer_2, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
1156         self.SetSizer(sizer1)
1157         sizer1.Fit(self)
1158     
1159     def OnPython(self,evt):
1160         webbrowser.open('http://www.python.org')
1161     
1162     def OnLexique(self,evt):
1163         webbrowser.open('http://www.lexique.org')
1164         
1165     def OnR(self,evt):
1166         webbrowser.open('http://www.r-project.org')
1167
1168 class MySplashScreen(wx.SplashScreen):
1169     def __init__(self):
1170         bmp = wx.Image(os.path.join(ImagePath, 'splash.png')).ConvertToBitmap()
1171         wx.SplashScreen.__init__(self, bmp,
1172                                  wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
1173                                  2000, None, -1)
1174         self.Bind(wx.EVT_CLOSE, self.OnClose)
1175         self.fc = wx.FutureCall(1, self.ShowMain)
1176
1177     def OnClose(self, evt):
1178         evt.Skip()
1179         self.Hide()
1180         
1181         if self.fc.IsRunning():
1182             self.fc.Stop()
1183             self.ShowMain()
1184
1185     def ShowMain(self):
1186         displaySize = wx.DisplaySize()
1187         w = displaySize[0]/1.2
1188         h = displaySize[1]/1.2
1189         frame = IraFrame(None, -1, "IRaMuTeQ " + ConfigGlob.get('DEFAULT', 'version'), size=(w, h))
1190         frame.Show()
1191         frame.finish_init()
1192         frame.Upgrade()
1193         frame.OnOpenFromCmdl()
1194 #        if self.fc.IsRunning():
1195 #            self.Raise()
1196         #wx.CallAfter(frame.ShowTip)
1197         
1198 class MyApp(wx.App):
1199     def OnInit(self):
1200         """
1201         Create and show the splash screen.  It will then create and show
1202         the main frame when it is time to do so.
1203         """
1204         wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
1205         self.SetAppName("Iramuteq")       
1206         splash = MySplashScreen()
1207         splash.Show()
1208         return True
1209
1210 def main():
1211     app = MyApp(False)
1212     app.MainLoop()
1213
1214 if __name__ == '__main__':
1215     __name__ = 'Main'
1216     main()