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