import clr
clr.AddReference('gtk-sharp')
import Gtk
import re

class programa :
    def __init__ (self):
        Gtk.Application.Init ()
        self.ips = []
        self.lista = []
        self.ip_label = []
        self.ip_barra = []
        self.genera_gui()
        Gtk.Application.Run ()

    def genera_gui (self):
        self.w = Gtk.Window ("Comprobador de regexp")
        self.w.DefaultWidth=800
        self.w.DefaultHeight=600
        self.w.DeleteEvent += self.cerrar_ventana
        self.box = Gtk.VBox(False,4)

        # El menú
        self.mb = Gtk.MenuBar ()
        self.file_menu = Gtk.Menu ()

        self.imprime_item = Gtk.MenuItem("Imprime")
        self.file_menu.Append (self.imprime_item)

        self.exit_item = Gtk.MenuItem("Salir")
        self.file_menu.Append (self.exit_item)
        
        self.file_item = Gtk.MenuItem("Archivo")
        self.file_item.Submenu = self.file_menu

        self.mb.Append (self.file_item)

        self.box.PackStart(self.mb, False, False, 0)

        # La caja de texto
        self.caja_texto = Gtk.VBox(False,4)
        self.texto = Gtk.TextView()
        cadena = self.texto.Buffer
        cadena.Text = "Hola mundo"
        
        # La caja con los widgets
        self.box2 = Gtk.VPaned ()

        self.caja_form = Gtk.HBox(False,4)
        self.b = Gtk.Button ("Comprobar")
        self.e = Gtk.Entry ()

        # Empaquetamos los widgets
        self.caja_texto.Add(self.texto)
        self.box.Add(self.box2)

        self.box2.Add1(self.caja_form)
        self.box2.Add2(self.caja_texto)

        self.caja_form.Add(self.e)
        self.caja_form.Add(self.b)
        self.w.Add (self.box)
        
        self.w.ShowAll ()

        # Poner un TextView 
        # Conectamos las señales
        self.b.Clicked += self.marca_regex
        self.exit_item.Activated += self.cerrar_ventana
        self.imprime_item.Activated += self.imprime

        tabla = self.texto.Buffer.TagTable

        tag = Gtk.TextTag("regexp")
        tag.Background = "red"
        tag.Foreground = "white"
        tabla.Add(tag)

        tag = Gtk.TextTag("subregexp")
        tag.Background = "blue"
        tag.Foreground = "white"
        tabla.Add(tag)

    def marca_regex (self, o, args):
        texto = self.texto.Buffer
        texto.RemoveAllTags(texto.StartIter,texto.EndIter)
        texto = self.texto.Buffer

        mi_regexp = self.e.Text

        try: 
            iter = re.finditer(mi_regexp,texto.Text)
            
            for ma in iter:
                
                def colorea (incio,fin,tipo) :
                    iter_inicio =texto.GetIterAtOffset(inicio)
                    iter_fin  =texto.GetIterAtOffset(fin)
                    texto.ApplyTag(texto.TagTable.Lookup(tipo),iter_inicio,iter_fin)

                inicio,fin = ma.span()
                colorea(inicio,fin,"regexp")
                
                # ¿Hay más grupos?
                if (ma.lastindex != None):
                    for i in range(0,ma.lastindex):
                        print "Grupo: %d, %s" % (i+1, ma.group(i))
                        inicio,fin = ma.span(i+1)
                        colorea(inicio,fin,"subregexp")
                
        except Exception:
            m = Gtk.MessageDialog(self.w,Gtk.DialogFlags.DestroyWithParent,Gtk.MessageType.Info,Gtk.ButtonsType.None,"Expresion Regular con errores")
            m.Show()

    def cerrar_ventana (self, o, args):
        Gtk.Application.Quit ()
        
    def imprime (self, o, args):
        print self.e.Text

p = programa()
