/tags/pyragua-0.2.5/pyragua/pyragua.py – Pyragua

root/tags/pyragua-0.2.5/pyragua/pyragua.py

Revision 403, 32.1 KB (checked in by ark, 2 years ago)

Ahora se busca en pyragua, y no en _pyragua, como antes

Line 
1#! /usr/bin/python
2#-*- coding: utf-8 -*-
3
4"""Este programa es software libre; lo puedes redistribuir y/o modificar
5bajo los terminos de la Licencia Publica General (GNU GPL) como fue
6publicada por la Free Software Foundation; cualquier versión 2 de la licencia.
7
8Este programa es distribuido con la esperanza de que será útil,
9pero SIN GARANTIA ALGUNA; ni con la garantía explícita de
10MERCABILIDAD o de que SERVIRA PARA UN PROPOSITO EN PARTICULAR.
11Mire la Licencia Pública General de la GNU para más detalles.
12"""
13DEBUG=False
14
15
16import  wx, threading
17import wx.stc as stc
18import os
19import os.path as path
20# Para llamar el about
21import  wx.lib.dialogs as dialogs
22#Para buscar el ejecutable del python
23import sys
24# Para i18n
25import gettext
26gettext.install("pyragua",unicode=1)
27_ = gettext.gettext
28
29from PanelArchivos import PanelArchivos
30from PanelProyecto import PanelProyecto
31from PanelInferior import PanelInferior
32from PanelCodigo import PanelCodigo
33from ChangeBrowser import ChangeBrowser
34from ClassBrowser.ClassBrowser import ClassBrowser
35from PyraguaDropTarget import PyraguaDropTarget
36from Utils import *
37from about import About
38from Proyecto import Proyecto
39
40#La ruta en la que está actualmente el pyragua
41dir_pyragua=""
42pyragua_version="0.2.5"
43class VentanaInicial(wx.Frame):
44    toolBarSize=(16,16)
45    def __init__(self,*args,**kwargs):
46
47        self.pyragua=kwargs['pyragua']
48        del kwargs['pyragua']
49        #Guardo la ruta del pyragua
50        self.dir_pyragua=self.pyragua.dir_pyragua
51
52        #padre es un parámetro que creo para que esta ventana pueda
53        #hablar con la aplicación por eso lo saco y lo elimino de los
54        #parámetros para que el constructor de frame no chille
55        self.padre=kwargs["padre"]
56        del kwargs["padre"]
57        wx.Frame.__init__(self,*args,**kwargs)
58        #El tipo de fin de línea por defecto
59        self.TIPO_EOL=stc.STC_EOL_CRLF
60
61        #Diccionario de proyectos
62        self.dProyectos={}
63        self.dProyectos['default']=Proyecto(self)
64
65        self.pVentana = wx.Panel(self, -1)
66        self.spVentana = wx.SplitterWindow(self.pVentana, -1, style=wx.SP_3D|wx.SP_BORDER)
67        self.pCodigo = PanelCodigo(self.spVentana, -1, padre=self)
68
69        #Pequeño arreglo para no alterar otros archivos que usan pCodigo
70
71        self.pNavegacion = self.pCodigo
72        self.pEdicion = wx.Panel(self.spVentana, -1)
73        self.spEdicion = wx.SplitterWindow(self.pEdicion, -1, style=wx.SP_3D|wx.SP_BORDER)
74        self.pArchivos = PanelArchivos(self.spEdicion,-1,padre=self)
75        self.pPyShell = PanelInferior(self.spEdicion, -1)
76
77        self.DropTarget=PyraguaDropTarget(self.pyragua)
78        #self.pVentana.SetDropTarget(self.DropTarget)
79
80        #Inicio los demonios
81        #self.BuscadorCambios= ChangeBrowser(self.pArchivos)
82
83        self.CrearMenu()
84        self.CrearToolBar(self.toolBarSize)
85        self.sBar=self.CreateStatusBar(3,0)
86
87        #Banderas para los toggle menu en el men ver
88        self.isNavSplit = False
89        self.isInfSplit = False
90
91        #Establece los anchos del status bar
92        self.sBar.SetStatusWidths([-5,-2,-2])
93
94        #Manejadores de los menus
95        self.Bind(wx.EVT_MENU,self.Nuevo,id=self.menuArchivo.ids["Nuevo"])
96        #self.Bind(wx.EVT_MENU,self.NuevoProyecto,id=self.menuArchivo.ids["Nuevo Proyecto"])
97        self.Bind(wx.EVT_MENU,self.Abrir,id=self.menuArchivo.ids["Abrir"])
98        self.Bind(wx.EVT_MENU,self.Guardar,id=self.menuArchivo.ids["Guardar"])
99        self.Bind(wx.EVT_MENU,self.GuardarComo,id=self.menuArchivo.ids["GuardarComo"])
100        self.Bind(wx.EVT_MENU,self.Cerrar,id=self.menuArchivo.ids["Cerrar"])
101        self.Bind(wx.EVT_MENU,self.OnCloseWindow,id=self.menuArchivo.ids["Salir"])
102
103        self.Bind(wx.EVT_MENU,self.Undo,id=self.menuEdicion.ids["Deshacer"])
104        self.Bind(wx.EVT_MENU,self.Redo,id=self.menuEdicion.ids["Rehacer"])
105        self.Bind(wx.EVT_MENU,self.Copiar,id=self.menuEdicion.ids["Copiar"])
106        self.Bind(wx.EVT_MENU,self.Cortar,id=self.menuEdicion.ids["Cortar"])
107        self.Bind(wx.EVT_MENU,self.Pegar,id=self.menuEdicion.ids["Pegar"])
108        self.Bind(wx.EVT_MENU,self.Buscar,id = self.menuEdicion.ids["Buscar"])
109        self.Bind(wx.EVT_MENU,self.GotoLine,id = self.menuEdicion.ids["Goto Line"])
110        self.Bind(wx.EVT_MENU,self.BuscarSiguiente,id = self.menuEdicion.ids["BuscarSiguiente"])
111        self.Bind(wx.EVT_MENU,self.BuscarAnterior,id = self.menuEdicion.ids["BuscarAnterior"])
112        self.Bind(wx.EVT_MENU,self.Reemplazar,id = self.menuEdicion.ids["Reemplazar"])
113        self.Bind(wx.EVT_MENU,self.ComentarBloque,id = self.menuEdicion.ids["Comentar"])
114        self.Bind(wx.EVT_MENU,self.DesComentarBloque,id = self.menuEdicion.ids["DesComentar"])
115        self.Bind(wx.EVT_MENU,self.CambiarEOL,id = self.menuEOL.ids["EOLWindows"])
116        self.Bind(wx.EVT_MENU,self.CambiarEOL,id = self.menuEOL.ids["EOLLinux"])
117        self.Bind(wx.EVT_MENU,self.CambiarEOL,id = self.menuEOL.ids["EOLMac"])
118        self.Bind(wx.EVT_MENU,self.ConvertirEOLs,id = self.menuEdicion.ids["ConvertirEOLs"] )
119
120        self.Bind(wx.EVT_MENU,self.alternarpNavegacion,id = self.menuVer.ids["Panel_Navegacion"])
121        self.Bind(wx.EVT_MENU,self.alternarpInferior,id = self.menuVer.ids["Panel_Inferior"])
122        self.Bind(wx.EVT_MENU,self.FinLinea,id = self.menuVer.ids["Fin_Linea"])
123
124        self.Bind(wx.EVT_MENU,self.Ejecutar,id=self.menuEjecutar.ids["Ejecutar"])
125
126        self.Bind(wx.EVT_MENU,self.about,id=self.menuAyuda.ids["About"])
127
128        #self.Bind(wx.EVT_MENU,self.Split,id = self.menuAyuda.ids["About"])
129
130        #Manejadores de la toolbar
131        self.Bind(wx.EVT_TOOL,self.Nuevo,id=self.toolBar.ids["Nuevo"])
132        self.Bind(wx.EVT_TOOL,self.Abrir,id=self.toolBar.ids["Abrir"])
133        self.Bind(wx.EVT_TOOL,self.Guardar,id=self.toolBar.ids["Guardar"])
134        self.Bind(wx.EVT_TOOL,self.GuardarComo,id=self.toolBar.ids["GuardarComo"])
135        self.Bind(wx.EVT_TOOL,self.Copiar,id=self.toolBar.ids["Copiar"])
136        self.Bind(wx.EVT_TOOL,self.Cortar,id=self.toolBar.ids["Cortar"])
137        self.Bind(wx.EVT_TOOL,self.Pegar,id=self.toolBar.ids["Pegar"])
138        self.Bind(wx.EVT_TOOL,self.Cerrar,id=self.toolBar.ids["Cerrar"])
139        self.Bind(wx.EVT_TOOL,self.Ejecutar,id=self.toolBar.ids["Ejecutar"])
140        self.Bind(wx.EVT_TOOL,self.Undo,id=self.toolBar.ids["Undo"])
141        self.Bind(wx.EVT_TOOL,self.Redo,id=self.toolBar.ids["Redo"])
142
143        # Manejadores de las busquedas
144        self.Bind(wx.EVT_FIND, self.OnFind)
145        self.Bind(wx.EVT_FIND_NEXT, self.OnFind)
146        self.Bind(wx.EVT_FIND_REPLACE, self.OnFind)
147        self.Bind(wx.EVT_FIND_REPLACE_ALL, self.OnFind)
148        self.Bind(wx.EVT_FIND_CLOSE, self.OnFindClose)
149
150        #Otros Manejadores
151        self.Bind(wx.EVT_CLOSE,self.OnCloseWindow)
152        self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING, self.onDClickSash)
153        #self.Bind(wx.EVT_CONTEXT_MENU, self.MenuEmergente)
154
155        #Icono de la ventana
156        ruta_ant=os.getcwd()
157        if self.dir_pyragua :
158            os.chdir(self.dir_pyragua)
159        PyraIcono = wx.Icon(os.path.join('imagenes','pyragua.ico'), wx.BITMAP_TYPE_ICO)
160        self.SetIcon(PyraIcono)
161        os.chdir(ruta_ant)
162
163        #Sizers y demás
164        self.Layout()
165        self.MostrarEOL()
166        #self.alternarpNavegacion()
167        self.SetSize((500,500))
168
169        #Muestro el pánel de navegación con el inicio de la aplicación
170        self.alternarpNavegacion()
171
172
173    def ConfirmarSalir(self):
174        """Le pregunta al usuario si está seguro que desea salir, retorna True si es así False
175        de lo contrario"""
176        dlg=wx.MessageDialog(self, _(u"Seguro que desea salir?"),
177                                                    _(u"Salir"), wx.CANCEL | wx.OK)
178        return dlg.ShowModal()==wx.ID_OK
179
180    def ComentarBloque( self,evento ):
181        pag = self.pArchivos.nArchivos.GetCurrentPage()
182        pag.stcEditor.STCComentarBloque()
183
184    def DesComentarBloque( self,evento ):
185        pag = self.pArchivos.nArchivos.GetCurrentPage()
186        pag.stcEditor.STCDesComentarBloque()
187
188    def OnCloseWindow(self, event):
189        """Este evento captura cuando se quiere cerrar el editor"""
190        #Seguro que desea salir?
191        if not self.ConfirmarSalir():
192            return
193
194        #Para que salgan de los hilos
195        #self.BuscadorCambios.hilo.Salir()
196        #print 'Saliendo de hilo Buscador cambios'
197
198        #Reviso que no haya archivos sin guardar
199
200        for a in self.pArchivos.lArchivos:
201            print a.stcEditor.GetModify(),a.nombre
202
203        archivos_modificados=[x for x in self.pArchivos.lArchivos if x.stcEditor.GetModify()]
204
205        print len(archivos_modificados)
206        for archivo in archivos_modificados:
207            archivo.PreguntarGuardar()
208
209        self.Destroy()
210
211    def Nuevo(self,evento):
212        u"""Este evento es llamado al crear un nuevo archivo"""
213        dlg=wx.FileDialog(self,"Seleccione el nombre del archivo", os.getcwd(),
214                          defaultFile="",
215                          wildcard="*.py",
216                          style=wx.SAVE | wx.CHANGE_DIR|wx.OVERWRITE_PROMPT )
217        salida = dlg.ShowModal()
218        if salida == wx.ID_OK:
219            #Seleccionaron bien el archivo
220            paths=dlg.GetPaths()
221            nombre=paths[0]
222            self.pArchivos.AgregarNuevoArchivo(nombre)
223            self.MostrarEOL()
224
225    def NuevoProyecto(self,evento):
226        self.dProyectos['default'].CrearProyecto()
227        pass
228
229    def Abrir(self,evento):
230        u"""Este evento es llamado al abrir un nuevo archivo"""
231        dlg=wx.FileDialog(self,_("Seleccione un archivo"), os.getcwd(),defaultFile="",
232        wildcard="Python files (*.py)|*.py;*.pyw|All files (*.*)|*.*",
233        style = wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR | wx.FILE_MUST_EXIST )
234
235        if dlg.ShowModal()== wx.ID_OK:
236        #Seleccionaron bien el archivo
237            paths=dlg.GetPaths()
238        #Puedo seleccionar varios archivosGetLineCount()
239            if DEBUG: print  "abrir", paths
240
241            self.AbrirArchivos(paths)
242
243    def AbrirArchivos ( self, paths ):
244        u"""Abre varios archivos en el pyragua"""
245        for p in paths:
246            self.pArchivos.AgregarArchivo(path.abspath(p))
247            #self.pArchivos.AnalizarArchivo()
248            # Agrego el archivo abierto al demonio que busca cambios
249            #self.BuscadorCambios.hilo.GuardarRegistro(path)
250            archivo=self.pArchivos.nArchivos.GetCurrentPage()
251            self.SetTitle("Pyragua "+ path.basename(archivo.nombre))
252
253
254        self.MostrarEOL(self.pArchivos.nArchivos.GetSelection())
255
256
257
258    def Cerrar(self,evento):
259        """Este método cierra la pestaña actual"""
260        if self.pArchivos.nArchivos.GetPageCount()>0:
261            pag = self.pArchivos.nArchivos.GetCurrentPage()
262
263            # Revisa y almacena que archivos han sido modificados
264            archivos_modificados=[x for x in self.pArchivos.lArchivos if x.stcEditor.GetModify()]
265
266            # Recorre la lista de archivos modificados y la compara con la de la pestaña que se cerrará
267            for archivo in archivos_modificados:
268                if archivo == pag:
269                    archivo.PreguntarGuardar() # Guarda el archivo
270
271            num = self.pArchivos.Cerrar(evento)
272            #self.BuscadorCambios.hilo.CerrarRegistro(num)
273
274    def Ejecutar(self,evento):
275        """Mira cual es la ventana seleccionada y ejecuta su contenido"""
276        if DEBUG : print "pyragua.py: Ejecutar"
277        hilo=threading.Thread(target=self.pArchivos.Ejecutar)
278        hilo.start()
279
280    def Guardar(self,evento):
281        """Guarda el archivo actual"""
282        estado,msg=self.pArchivos.Guardar(evento)
283        if estado:
284        #Todo salió bien, para la barra de tareas
285            self.sBar.SetStatusText(msg)
286            pag=self.pArchivos.nArchivos.GetCurrentPage()
287            num=self.pArchivos.nArchivos.GetSelection()
288            #self.BuscadorCambios.hilo.ActualizarModificaciones(pag.nombre,num)
289        else:
290            MostrarError(self,msg)
291
292    def GuardarComo(self, evento):
293        """Guarda el archivo actual"""
294        estado,msg=self.pArchivos.GuardarComo(evento)
295        if estado:
296        #Todo salió bien, para la barra de tareas
297            self.sBar.SetStatusText(msg)
298            pag=self.pArchivos.nArchivos.GetCurrentPage()
299            num=self.pArchivos.nArchivos.GetSelection()
300            print num , pag.nombre
301            #self.BuscadorCambios.z.ActualizarModificaciones(pag.nombre,num)
302        else:
303            MostrarError(self,msg)
304
305    def Undo(self,evento):
306        """Deshace la ultima opcion de usuario"""
307        if self.pArchivos.nArchivos.GetPageCount()>0:
308            pag= self.pArchivos.nArchivos.GetCurrentPage()
309            pag.stcEditor.DesHacer(evento)
310
311    def Redo(self,evento):
312        """Rehace la ultima opcion de usuario"""
313        if self.pArchivos.nArchivos.GetPageCount()>0:
314            pag= self.pArchivos.nArchivos.GetCurrentPage()
315            pag.stcEditor.ReHacer(evento)
316
317    def Copiar(self, evento):
318        """Copia el texto seleccionado en el portapapeles"""
319        if self.pArchivos.nArchivos.GetPageCount()>0:
320            pag = self.pArchivos.nArchivos.GetCurrentPage()
321            pag.stcEditor.OnCopy(evento)
322
323    def Cortar(self, evento):
324        """Corta el texto seleccionado y lo almacena en el portapapeles"""
325        if self.pArchivos.nArchivos.GetPageCount()>0:
326            pag = self.pArchivos.nArchivos.GetCurrentPage()
327            pag.stcEditor.OnCut(evento)
328
329    def Pegar(self, evento):
330        """Pega el texto que está contenido en el portapapeles"""
331        if self.pArchivos.nArchivos.GetPageCount()>0:
332            pag = self.pArchivos.nArchivos.GetCurrentPage()
333            pag.stcEditor.OnPaste(evento)
334
335    def GotoLine( self , evento):
336        """"""
337        # verifico si hay pestanas
338        if self.pArchivos.nArchivos.GetPageCount()>0:
339            pag = self.pArchivos.nArchivos.GetCurrentPage()
340            pag.GotoLine()
341
342    def Buscar(self, evento):
343        """ Metodo que crea un dialogo de busqueda"""
344        if self.pArchivos.nArchivos.GetPageCount()>0:
345            pag= self.pArchivos.nArchivos.GetCurrentPage()
346            data = wx.FindReplaceData()
347            data.SetFlags(wx.FR_DOWN)
348            if len(pag.stcEditor.GetSelectedText()) != 0:
349                data.SetFindString(pag.stcEditor.GetSelectedText())
350            dlg = wx.FindReplaceDialog(self, data, _("Buscar"))
351            pag.data = data  # save a reference to it...
352            dlg.Show(True)
353
354    def Reemplazar(self, evento):
355        """Metodo que crea un dialogo de busqueda y remplazo"""
356        if self.pArchivos.nArchivos.GetPageCount()>0:
357            pag= self.pArchivos.nArchivos.GetCurrentPage()
358            data = wx.FindReplaceData()
359            if len(pag.stcEditor.GetSelectedText()) != 0:
360                data.SetFindString(pag.stcEditor.GetSelectedText())
361            dlg = wx.FindReplaceDialog(self, data, _("Buscar y Remplazar"), wx.FR_REPLACEDIALOG)
362            self.data = data  # save a reference to it...
363            dlg.Show(True)
364
365    def BuscarSiguiente(self, evento):
366        """Busca el elemento siguente en TextCtrl"""
367        if self.pArchivos.nArchivos.GetPageCount()>0:
368            pag= self.pArchivos.nArchivos.GetCurrentPage()
369            if pag.BusquedaActiva :
370                if pag.stcEditor.GetSelectedText():
371                    pag.stcEditor.SetCurrentPos(pag.stcEditor.GetSelectionEnd())
372                pag.stcEditor.SearchAnchor()# El stc recomienda llamar este metodo antes de llamar a SearchNext
373                pos = pag.stcEditor.SearchNext(pag.data.GetFlags(),pag.data.GetFindString())
374                pag.stcEditor.EnsureVisible(pag.stcEditor.GetCurrentLine())
375                LineasEscondidas= pag.GetHideLines(pag.stcEditor.GetCurrentLine())
376                pag.stcEditor.ScrollToLine(pag.stcEditor.GetCurrentLine()-LineasEscondidas)
377                if pos ==-1:
378                    if MostrarAviso(self,_(u"Ha llegado al final del documento desea volver al principio")):
379                        pag.stcEditor.GotoPos(0)
380
381    def BuscarAnterior(self, evento):
382        """Busca el elemento anterior en TextCtrl"""
383        if self.pArchivos.nArchivos.GetPageCount()>0:
384            pag= self.pArchivos.nArchivos.GetCurrentPage()
385            if pag.BusquedaActiva :
386                pag.stcEditor.SearchAnchor()# El stc recomienda llamar este metodo antes de llamar a SearchNext
387                pos=pag.stcEditor.SearchPrev(pag.data.GetFlags(),pag.data.GetFindString())
388                pag.stcEditor.EnsureVisible(pag.stcEditor.GetCurrentLine())
389                LineasEscondidas= pag.GetHideLines(pag.stcEditor.GetCurrentLine())
390                pag.stcEditor.ScrollToLine(pag.stcEditor.GetCurrentLine()-LineasEscondidas)
391                if pos ==-1:
392                    if MostrarAviso(self,_(u"Ha llegado al principio del documento desea volver al final")):
393                        pag.stcEditor.GotoPos(pag.stcEditor.GetLineEndPosition(pag.stcEditor.GetLineCount()))
394
395    def OnFind(self, evento):
396        """Esta funcion se utiliza para buscar cadenas dentro de la pestana activa """
397        if self.pArchivos.nArchivos.GetPageCount()>0:
398            pag= self.pArchivos.nArchivos.GetCurrentPage()
399            pag.BuscarTexto(evento)
400
401    def OnFindClose(self, evento):
402        """Garantiza que al cerrar el dialogo de busqueda este cierre"""
403        evento.GetDialog().Destroy() #esto obtine el dialogo activo  y lo destuye
404
405    def CrearToolBar(self,tsize):
406        """Crea la barra de botones"""
407        self.toolBar=self.CreateToolBar(wx.TB_HORIZONTAL)
408        new_bmp =  wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR, tsize)
409        open_bmp = wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR, tsize)
410        copy_bmp = wx.ArtProvider.GetBitmap(wx.ART_COPY, wx.ART_TOOLBAR, tsize)
411        cut_bmp = wx.ArtProvider.GetBitmap(wx.ART_CUT, wx.ART_TOOLBAR, tsize)
412        paste_bmp= wx.ArtProvider.GetBitmap(wx.ART_PASTE, wx.ART_TOOLBAR, tsize)
413        close_bmp=wx.ArtProvider.GetBitmap(wx.ART_DELETE, wx.ART_TOOLBAR, tsize)
414        ejecutar_bmp=wx.ArtProvider.GetBitmap(wx.ART_EXECUTABLE_FILE, wx.ART_TOOLBAR, tsize)
415        guardar_bmp=wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE,wx.ART_TOOLBAR,tsize)
416        guardar_como_bmp=wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE_AS,wx.ART_TOOLBAR,tsize)
417        redo_bmp=wx.ArtProvider.GetBitmap(wx.ART_REDO,wx.ART_TOOLBAR,tsize)
418        undo_bmp=wx.ArtProvider.GetBitmap(wx.ART_UNDO,wx.ART_TOOLBAR,tsize)
419
420        self.toolBar.SetToolBitmapSize(tsize)
421
422        self.toolBar.ids={}
423        for i in ["Nuevo","Abrir","Guardar","GuardarComo","Copiar", "Cortar","Pegar","Cerrar","Ejecutar","Redo","Undo"]:
424            self.toolBar.ids[i]=wx.NewId()
425
426        self.toolBar.AddSimpleTool(self.toolBar.ids["Nuevo"],new_bmp,_("Nuevo"),_("Crear un nuevo archivo"))
427        self.toolBar.AddSimpleTool(self.toolBar.ids["Abrir"],open_bmp,_("Abrir"),_("Abrir un archivo"))
428        self.toolBar.AddSimpleTool(self.toolBar.ids["Guardar"],guardar_bmp,_("Guardar"),_("Guardar un archivo"))
429        self.toolBar.AddSimpleTool(self.toolBar.ids["GuardarComo"],guardar_como_bmp,_("Guardar Como"),_("Guardar un archivo con otro nombre"))
430        self.toolBar.AddSeparator()
431        self.toolBar.AddSimpleTool(self.toolBar.ids["Copiar"],copy_bmp,_("Copiar"),_("Copiar al portapapeles"))
432        self.toolBar.AddSimpleTool(self.toolBar.ids["Cortar"],cut_bmp,_("Cortar"),_("Corta el texto seleccionado"))
433        self.toolBar.AddSimpleTool(self.toolBar.ids["Pegar"],paste_bmp,_("Pegar"),_("Pegar del cortapapeles"))
434        self.toolBar.AddSeparator()
435        self.toolBar.AddSimpleTool(self.toolBar.ids["Cerrar"],close_bmp,_("Cerrar"),_("Cerrar el archivo actual"))
436        self.toolBar.AddSimpleTool(self.toolBar.ids["Ejecutar"],ejecutar_bmp,_("Ejecutar"),_("Ejecuta el archivo en un interprete de Python"))
437        self.toolBar.AddSeparator()
438        self.toolBar.AddSimpleTool(self.toolBar.ids["Undo"],undo_bmp,_("Deshacer"),_("Deshacer"))
439        self.toolBar.AddSimpleTool(self.toolBar.ids["Redo"],redo_bmp,_("Rehacer"),_("Rehacer"))
440
441        #Esto se necesita para que se muestre en windows
442        self.toolBar.Realize()
443
444    def CrearMenu(self):
445        """Crea el menu"""
446        self.menu = wx.MenuBar()
447        self.menuArchivo = wx.Menu()
448        self.menuEdicion = wx.Menu()
449        self.menuVer = wx.Menu()
450        self.menuEjecutar = wx.Menu()
451        self.menuAyuda = wx.Menu()
452        self.menuEOL=wx.Menu()
453
454        #Creo un listado de ids para cada men
455        self.menuArchivo.ids={}
456        self.menuEdicion.ids={}
457        self.menuVer.ids={}
458        self.menuEjecutar.ids={}
459        self.menuAyuda.ids={}
460        self.menuEOL.ids={}
461
462        #_for i in ["Nuevo","Nuevo Proyecto","Abrir","Guardar","GuardarComo","Cerrar","Salir"]:
463        for i in ["Nuevo","Abrir","Guardar","GuardarComo","Cerrar","Salir"]:
464            self.menuArchivo.ids[i]=wx.NewId()
465
466        for i in ["Deshacer", "Rehacer", "Copiar", "Cortar", "Pegar","Goto Line", "Buscar",
467        "BuscarSiguiente", "BuscarAnterior",
468        "Reemplazar","CambiarEOLs" ,"ConvertirEOLs","Comentar","DesComentar"]:
469            self.menuEdicion.ids[i]=wx.NewId()
470
471        for i in ["Panel_Navegacion", "Panel_Inferior","Fin_Linea"]:
472            self.menuVer.ids[i]=wx.NewId()
473
474        for i in ["Ejecutar"]:
475            self.menuEjecutar.ids[i]=wx.NewId()
476
477        for i in ["About"]:
478            self.menuAyuda.ids[i]=wx.NewId()
479
480        #Men fin de línea
481        for i in [ "EOLWindows", "EOLLinux", "EOLMac"]:
482            self.menuEOL.ids[i]=wx.NewId()
483
484        # Shortcuts y mensajes informativos para los mens
485        self.menuArchivo.Append(self.menuArchivo.ids["Nuevo"], _("&Nuevo\tCtrl-N"), _("Crea un nuevo archivo"))
486        #_self.menuArchivo.Append(self.menuArchivo.ids["Nuevo Proyecto"], _("&Nuevo Proyecto"), _("Crea un nuevo proyecto"))
487        self.menuArchivo.Append(self.menuArchivo.ids["Abrir"], _("&Abrir\tCtrl-O"), _("Abre un archivo"))
488        self.menuArchivo.Append(self.menuArchivo.ids["Guardar"], _("&Guardar\tCtrl-S"), _("Guarda los cambios del documento actual"))
489        self.menuArchivo.Append(self.menuArchivo.ids["GuardarComo"], _("Guardar C&omo"), _("Posibilita el guardar en otro tipo de archivo"))
490        self.menuArchivo.AppendSeparator()
491        self.menuArchivo.Append(self.menuArchivo.ids["Cerrar"], _("&Cerrar\tCtrl-W"), _("Cierra el archivo actual"))
492        self.menuArchivo.Append(self.menuArchivo.ids["Salir"],_("&Salir"),_("Salir de Pyragua"))
493
494        self.menuEOL.Append(self.menuEOL.ids["EOLWindows"],_(U"Windows (CR/LF)"),_(u"Formato de fin de línea de windows CR/LF"), wx.ITEM_RADIO)
495        self.menuEOL.Append(self.menuEOL.ids["EOLLinux"],_(U"GNU/Linux (LF)"),_(u"Formato de fin de línea de windows CR/LF"), wx.ITEM_RADIO)
496        self.menuEOL.Append(self.menuEOL.ids["EOLMac"],_(U"Mac (CR)"),_(u"Formato de fin de línea de windows CR/LF"), wx.ITEM_RADIO)
497
498        self.menuEdicion.Append(self.menuEdicion.ids["Deshacer"],_("&Deshacer\tCtrl-Z"),_(u"Deshace la ltima modificación"))
499        self.menuEdicion.Append(self.menuEdicion.ids["Rehacer"],_("&Rehacer\tCtrl-Y"),_(u"Rehace la ltima modificación deshecha"))
500        self.menuEdicion.AppendSeparator()
501        self.menuEdicion.Append(self.menuEdicion.ids["Copiar"], _("&Copiar\tCtrl-C"), _(u"Copia el texto seleccionado"))
502        self.menuEdicion.Append(self.menuEdicion.ids["Cortar"], _("Cor&tar\tCtrl-X"), _(u"Corta el texto seleccionado"))
503        self.menuEdicion.Append(self.menuEdicion.ids["Pegar"], _("&Pegar\tCtrl-V"), _(u"Pega el texto contenido en el portapapeles"))
504        self.menuEdicion.AppendSeparator()
505        self.menuEdicion.Append(self.menuEdicion.ids["Goto Line"],_("&Ir a la linea...\tCtrl-G"),_(u"Posiciona el cursor en la linea que el usuario desee"))
506        self.menuEdicion.Append(self.menuEdicion.ids["Buscar"],_("&Buscar...\tCtrl-B"),_(u"Busca una subcadena en el código fuente"))
507        self.menuEdicion.Append(self.menuEdicion.ids["BuscarSiguiente"],_("Buscar S&iguente\tF3"),_(u"Busca la siguente coincidencia"))
508        self.menuEdicion.Append(self.menuEdicion.ids["BuscarAnterior"],_("Buscar A&nterior\tF2"),_("Busca la anterior coincidencia"))
509        self.menuEdicion.Append(self.menuEdicion.ids["Reemplazar"],_("&Reemplazar\tCtrl-R"),_(u"Busca una subcadena y la remplaza con otra"))
510        self.menuEdicion.AppendSeparator()
511        self.menuEdicion.Append(self.menuEdicion.ids["Comentar"],_("Comentar...\tAlt-3"),_(u"Comenta el bloque seleccionado"))
512        self.menuEdicion.Append(self.menuEdicion.ids["DesComentar"],_("DesComentar...\tAlt-4"),_(u"DesComenta el bloque seleccionado"))
513        self.menuEdicion.AppendSeparator()
514        self.menuEdicion.AppendMenu(self.menuEdicion.ids["CambiarEOLs"], _(u"Cambiar fin de línea"),self.menuEOL)
515        self.menuEdicion.Append(self.menuEdicion.ids["ConvertirEOLs"],_(u"&Convertir Fin de Línea"),_(u"Cambia todos los fin de línea del archivo al formato actual"))
516
517
518        self.menuVer.AppendCheckItem(self.menuVer.ids["Panel_Navegacion"],_(u"&Panel de Navegación"),_(u"Muestra u oculta el panel de nevagación"))
519        #Check menú -> True para el inicio de la aplicación
520        self.menuVer.Check(self.menuVer.ids["Panel_Navegacion"], True)
521        self.menuVer.AppendCheckItem(self.menuVer.ids["Panel_Inferior"],_(u"&Pánel inferior"),_(u"Muestra u oculta el pánel inferior"))
522        self.menuVer.AppendSeparator()
523        self.menuVer.AppendCheckItem(self.menuVer.ids["Fin_Linea"],_(u"&Fin de Linea"),_(u"Muestra el fin de linea del archivo"))
524
525        self.menuEjecutar.Append(self.menuEjecutar.ids["Ejecutar"], _("&Ejecutar\tF5"), _(u"Ejecutar el archivo actual"))
526
527        self.menuAyuda.Append(self.menuAyuda.ids["About"], _("&Acerca de..."), _(u"Algo sobre el proyecto"))
528
529        self.menu.Append(self.menuArchivo,_(u"&Archivo"))
530        self.menu.Append(self.menuEdicion,_(u"&Edición"))
531        self.menu.Append(self.menuVer,_(u"&Ver"))
532        self.menu.Append(self.menuEjecutar,_(u"E&jecutar"))
533        self.menu.Append(self.menuAyuda,_(u"Ay&uda"))
534        self.SetMenuBar(self.menu)
535
536    def Layout(self):
537        """Se encarga de crear los sizers y de insertar todos los widgets"""
538        #Sizer principal
539        sVentana = wx.BoxSizer(wx.HORIZONTAL)
540        sPal = wx.BoxSizer(wx.HORIZONTAL)
541        sNavegacion = wx.BoxSizer(wx.VERTICAL)
542        sEdicion = wx.BoxSizer(wx.VERTICAL)
543
544        #_Propiedades para los paneles, los sizers y los splitter
545
546        self.spEdicion.SplitHorizontally(self.pArchivos, self.pPyShell)
547        sEdicion.Add(self.spEdicion, 1, wx.EXPAND, 0)
548        self.pEdicion.SetAutoLayout(True)
549        self.pEdicion.SetSizer(sEdicion)
550        sEdicion.Fit(self.pEdicion)
551        sEdicion.SetSizeHints(self.pEdicion)
552        self.spEdicion.Unsplit(self.pPyShell)
553
554        self.spVentana.SplitVertically(self.pNavegacion, self.pEdicion)
555        sPal.Add(self.spVentana, 1, wx.EXPAND, 0)
556        self.pVentana.SetAutoLayout(True)
557        self.pVentana.SetSizer(sPal)
558        sPal.Fit(self.pVentana)
559        sPal.SetSizeHints(self.pVentana)
560        self.spVentana.Unsplit(self.pNavegacion)
561
562        self.pVentana.SetAutoLayout(True)
563        self.pVentana.SetSizer(sPal)
564
565        sVentana.Add(self.pVentana, 1, wx.EXPAND, 0)
566        self.SetAutoLayout(True)
567        self.SetSizer(sVentana)
568        sVentana.Fit(self)
569        sVentana.SetSizeHints(self)
570        self.sVentana = sVentana
571
572        #self.Maximize()
573
574    def alternarpNavegacion(self, evento=None):
575        """Método para mostrar u ocultar el pánel de navegación"""
576        if self.isNavSplit:
577            self.spVentana.Unsplit(self.pNavegacion)
578            self.isNavSplit = False
579        else:
580            self.spVentana.SplitVertically(self.pNavegacion, self.pEdicion, 200)
581            self.isNavSplit = True
582
583    def alternarpInferior(self, evento):
584        """Método para mostrar u ocultar el pánel inferior"""
585        if self.isInfSplit:
586            self.spEdicion.Unsplit(self.pPyShell)
587            self.isInfSplit = False
588        else:
589            self.spEdicion.SplitHorizontally(self.pArchivos, self.pPyShell, 500)
590            self.isInfSplit = True
591
592    def FinLinea(self,evento):
593        """Este metodo muestra los fines de linea"""
594        if self.pArchivos.nArchivos.GetPageCount()>0:
595            pag= self.pArchivos.nArchivos.GetCurrentPage()
596            pag.stcEditor.SetViewEOL(not pag.stcEditor.GetViewEOL())
597
598    def about(self, evento):
599        """Acerca del proyecto"""
600        win = About(self, _("Acerca de Pyragua"), style=wx.DEFAULT_FRAME_STYLE | wx.TINY_CAPTION_HORIZ)
601        win.CenterOnParent(wx.BOTH)
602        win.Show(True)
603
604    def onDClickSash(self, evento):
605        self.spEdicion.SetMinimumPaneSize(20)
606        self.spVentana.SetMinimumPaneSize(20)
607
608    def CambiarEOL(self, evento):
609        """Cambia el tipo de EOL del archivo actual"""
610        id=evento.GetId()
611        if id==self.menuEOL.ids['EOLWindows']:
612            eol=stc.STC_EOL_CRLF
613        elif id==self.menuEOL.ids['EOLLinux']:
614            eol=stc.STC_EOL_LF
615        elif id==self.menuEOL.ids['EOLMac']:
616            eol=stc.STC_EOL_CR
617        else:
618            return
619        if self.pArchivos.nArchivos.GetPageCount()==0:
620            #El eol por defecto
621            self.TIPO_EOL=eol
622        else:
623            pag= self.pArchivos.nArchivos.GetPage(self.pArchivos.nArchivos.GetSelection())
624            #pag= self.pArchivos.nArchivos.GetCurrentPage()
625            pag.CambiarEOL(eol)
626        self.MostrarEOL(self.pArchivos.nArchivos.GetSelection())
627        if DEBUG : print "Cambiar EOL Pyragua", id, "eol",eol
628
629    def MostrarEOL(self, idPag=-1):
630        """Mostrar el tipo de EOL del archivo actual (el identificado por idPag) o el por defecto"""
631        if DEBUG :
632            print "EOL MOSTRAR",idPag
633
634        if idPag==-1:
635            #El eol por defecto
636            eol=self.TIPO_EOL
637        else:
638            pag= self.pArchivos.nArchivos.GetPage(idPag)
639            if not pag:
640                #Es un archivo nuevo
641                if DEBUG : print "MostrarEOL", "archivo nuevo", pag
642                eol=self.TIPO_EOL
643            else:
644                eol=pag.stcEditor.TIPO_EOL
645        if DEBUG: print "EOL MOSTRAR",idPag, "eol",eol, stc.STC_EOL_CRLF
646        if eol==stc.STC_EOL_CRLF:
647            strEOL="Win (CRLF)"
648            self.menuEOL.Check(self.menuEOL.ids["EOLWindows"], True)
649            if DEBUG : print "CRLF"
650        elif eol==stc.STC_EOL_CR:
651            strEOL="Mac (CR)"
652            self.menuEOL.Check(self.menuEOL.ids["EOLMac"], True)
653            if DEBUG : print "LF"
654        elif eol==stc.STC_EOL_LF:
655            strEOL="Lin (LF)"
656            self.menuEOL.Check(self.menuEOL.ids["EOLLinux"], True)
657            if DEBUG : print "CR"
658        self.SetStatusText(strEOL,2)
659
660    def ConvertirEOLs(self, evento):
661        pag=self.pArchivos.nArchivos.GetCurrentPage()
662        pag.stcEditor.ConvertEOLs(pag.stcEditor.GetEOLMode())
663
664class Pyragua(wx.App):
665    def OnInit(self):
666        wx.InitAllImageHandlers()
667
668        #Guardo la ruta del pyragua
669        if wx.Platform == '__WXMSW__' :
670            self.dir_pyragua=os.path.dirname(os.path.abspath(sys.argv[0]))
671        else:
672            self.dir_pyragua=os.path.dirname(__file__)
673            if not os.path.exists(os.path.join(self.dir_pyragua, "imagenes")):
674                #Necesario para cuando está instalado en linux
675                self.dir_pyragua=os.path.join('/','usr','pyragua')
676
677
678        #ClassBrowser
679        self.cb=ClassBrowser()
680
681        self.finicial=VentanaInicial(None,-1,"Pyragua",padre=self, pyragua=self)
682        self.finicial.Show(True)
683        self.AbrirSplash()  #descomentar cuando se solucione el problema
684        #self.SetTopWindow(self.splash) #descomentar cuando se solucione el problema
685        self.SetTopWindow(self.finicial) #comentar cuando se solucione el problema
686        if len(sys.argv)>1:
687            self.finicial.AbrirArchivos(sys.argv[1:])
688
689
690
691        return True
692
693    def AbrirSplash(self):
694        #inicio del splash
695        id_splash = wx.NewId()
696        #Me paso a la ruta del pyragua para cargar la imagen
697        ruta_ant=os.getcwd()
698        if self.finicial.dir_pyragua :
699            os.chdir(self.finicial.dir_pyragua)
700        self.splash = wx.SplashScreen(wx.Bitmap(os.path.join("imagenes","pyragua_splash.png")), wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT, 2000, self.finicial, id_splash, wx.DefaultPosition, wx.DefaultSize, wx.NO_BORDER | wx.FRAME_NO_TASKBAR | wx.STAY_ON_TOP)
701        os.chdir(ruta_ant)
702
703
704def main():
705    #Calculo la ruta del pyragua si es diferente del dir actual me cambio
706    app = Pyragua(0)
707    app.MainLoop()
708
709
710if __name__ == "__main__":
711  main()
Note: See TracBrowser for help on using the browser.