| 1 | #! /usr/bin/python |
|---|
| 2 | #-*- coding: utf-8 -*- |
|---|
| 3 | |
|---|
| 4 | """Este programa es software libre; lo puedes redistribuir y/o modificar |
|---|
| 5 | bajo los terminos de la Licencia Publica General (GNU GPL) como fue |
|---|
| 6 | publicada por la Free Software Foundation; cualquier versión 2 de la licencia. |
|---|
| 7 | |
|---|
| 8 | Este programa es distribuido con la esperanza de que será útil, |
|---|
| 9 | pero SIN GARANTIA ALGUNA; ni con la garantÃa explÃcita de |
|---|
| 10 | MERCABILIDAD o de que SERVIRA PARA UN PROPOSITO EN PARTICULAR. |
|---|
| 11 | Mire la Licencia Pública General de la GNU para más detalles. |
|---|
| 12 | """ |
|---|
| 13 | DEBUG=False |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | import wx, threading |
|---|
| 17 | import wx.stc as stc |
|---|
| 18 | import os |
|---|
| 19 | import os.path as path |
|---|
| 20 | # Para llamar el about |
|---|
| 21 | import wx.lib.dialogs as dialogs |
|---|
| 22 | #Para buscar el ejecutable del python |
|---|
| 23 | import sys |
|---|
| 24 | # Para i18n |
|---|
| 25 | import gettext |
|---|
| 26 | gettext.install("pyragua",unicode=1) |
|---|
| 27 | _ = gettext.gettext |
|---|
| 28 | |
|---|
| 29 | from PanelArchivos import PanelArchivos |
|---|
| 30 | from PanelProyecto import PanelProyecto |
|---|
| 31 | from PanelInferior import PanelInferior |
|---|
| 32 | from PanelCodigo import PanelCodigo |
|---|
| 33 | from ChangeBrowser import ChangeBrowser |
|---|
| 34 | from ClassBrowser.ClassBrowser import ClassBrowser |
|---|
| 35 | from PyraguaDropTarget import PyraguaDropTarget |
|---|
| 36 | from Utils import * |
|---|
| 37 | from about import About |
|---|
| 38 | from Proyecto import Proyecto |
|---|
| 39 | |
|---|
| 40 | #La ruta en la que está actualmente el pyragua |
|---|
| 41 | dir_pyragua="" |
|---|
| 42 | pyragua_version="0.2.5" |
|---|
| 43 | class 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 | |
|---|
| 664 | class 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 | |
|---|
| 704 | def main(): |
|---|
| 705 | #Calculo la ruta del pyragua si es diferente del dir actual me cambio |
|---|
| 706 | app = Pyragua(0) |
|---|
| 707 | app.MainLoop() |
|---|
| 708 | |
|---|
| 709 | |
|---|
| 710 | if __name__ == "__main__": |
|---|
| 711 | main() |
|---|