def __init__(self, data):
        gtk.VBox.__init__(self)

        self.data = data
        self.disco = self.data['metodo']['disco'][0]

        self.tabla = TablaParticiones()
        #self.tabla.set_doble_click(self.activar_tabla);
        self.tabla.set_seleccionar(self.table_row_selected)

        label = gtk.Label(_("""Use the following table to modify disk \
partitions to your liking. We recommend:
- Establish a minimum of {0} for the root partition (/).
- Create a swap space.""").format(humanize(ESPACIO_TOTAL)))
        label.set_line_wrap(False)
        label.set_justify(gtk.JUSTIFY_LEFT)
        label.set_alignment(0, 0)
        label.show()
        self.pack_start(label, False, False, 0)

        self.scroll = gtk.ScrolledWindow()
        self.scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
        self.scroll.set_size_request(0, 150)
        self.scroll.add(self.tabla)
        self.tabla.show()
        self.scroll.show()
        self.pack_start(self.scroll, True, True, 10)

        # btn_nueva
        self.btn_nueva = gtk.Button(_("New..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_nueva.set_image(image)
        self.btn_nueva.show()
        self.btn_nueva.connect("clicked", self.new_partition)

        # btn_editar
        self.btn_editar = gtk.Button(_("Edit..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_editar.set_image(image)
        self.btn_editar.show()
        self.btn_editar.connect("clicked", self.edit_partition)

        # btn_eliminar
        self.btn_eliminar = gtk.Button(_("Delete"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_eliminar.set_image(image)
        self.btn_eliminar.show()
        self.btn_eliminar.connect("clicked", self.delete_partition)

        # btn_redimension
        self.btn_redimension = gtk.Button(_("Resize..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_INDENT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_redimension.set_image(image)
        self.btn_redimension.show()
        self.btn_redimension.connect("clicked", self.resize_partition)

        # btn_deshacer
        self.btn_deshacer = gtk.Button(_("Undo all"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_UNDO, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_deshacer.set_image(image)
        self.btn_deshacer.show()
        self.btn_deshacer.connect("clicked", self.undo_all_actions)

        self.botonera1 = gtk.HButtonBox()
        self.botonera1.set_layout(gtk.BUTTONBOX_START)
        self.botonera1.set_homogeneous(False)
        self.botonera1.add(self.btn_nueva)
        self.botonera1.add(self.btn_editar)
        self.botonera1.add(self.btn_redimension)
        self.botonera1.add(self.btn_eliminar)
        self.botonera1.add(self.btn_deshacer)
        self.pack_start(self.botonera1, False, False, 0)
        # llenar la tabla por primera vez
        self.initialize(data)
class PasoPartManual(gtk.VBox):

    def __init__(self, data):
        gtk.VBox.__init__(self)

        self.data = data
        self.disco = self.data['metodo']['disco'][0]

        self.tabla = TablaParticiones()
        #self.tabla.set_doble_click(self.activar_tabla);
        self.tabla.set_seleccionar(self.table_row_selected)

        label = gtk.Label(_("""Use the following table to modify disk \
partitions to your liking. We recommend:
- Establish a minimum of {0} for the root partition (/).
- Create a swap space.""").format(humanize(ESPACIO_TOTAL)))
        label.set_line_wrap(False)
        label.set_justify(gtk.JUSTIFY_LEFT)
        label.set_alignment(0, 0)
        label.show()
        self.pack_start(label, False, False, 0)

        self.scroll = gtk.ScrolledWindow()
        self.scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
        self.scroll.set_size_request(0, 150)
        self.scroll.add(self.tabla)
        self.tabla.show()
        self.scroll.show()
        self.pack_start(self.scroll, True, True, 10)

        # btn_nueva
        self.btn_nueva = gtk.Button(_("New..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_nueva.set_image(image)
        self.btn_nueva.show()
        self.btn_nueva.connect("clicked", self.new_partition)

        # btn_editar
        self.btn_editar = gtk.Button(_("Edit..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_editar.set_image(image)
        self.btn_editar.show()
        self.btn_editar.connect("clicked", self.edit_partition)

        # btn_eliminar
        self.btn_eliminar = gtk.Button(_("Delete"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_eliminar.set_image(image)
        self.btn_eliminar.show()
        self.btn_eliminar.connect("clicked", self.delete_partition)

        # btn_redimension
        self.btn_redimension = gtk.Button(_("Resize..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_INDENT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_redimension.set_image(image)
        self.btn_redimension.show()
        self.btn_redimension.connect("clicked", self.resize_partition)

        # btn_deshacer
        self.btn_deshacer = gtk.Button(_("Undo all"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_UNDO, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_deshacer.set_image(image)
        self.btn_deshacer.show()
        self.btn_deshacer.connect("clicked", self.undo_all_actions)

        self.botonera1 = gtk.HButtonBox()
        self.botonera1.set_layout(gtk.BUTTONBOX_START)
        self.botonera1.set_homogeneous(False)
        self.botonera1.add(self.btn_nueva)
        self.botonera1.add(self.btn_editar)
        self.botonera1.add(self.btn_redimension)
        self.botonera1.add(self.btn_eliminar)
        self.botonera1.add(self.btn_deshacer)
        self.pack_start(self.botonera1, False, False, 0)
        # llenar la tabla por primera vez
        self.initialize(data)

    def initialize(self, data):
        '''
        Inicializa todas las variables
        '''
        self.lista = []         # Lista de las particiones hechas
        self.acciones = []      # Almacena las acciones pendientes a realizar
        self.fila_selec = None  # Ultima fila seleccionada de la tabla
        self.raiz = False

        self.set_buttons_insensitives()

        # Llenar la tabla con el contenido actual del disco
        if self.tabla != None:

            #l_part = Particiones().lista_particiones(self.disco)
            for particion in self.data['particiones']:
                p_disp = particion[0]
                p_ini = particion[1]
                p_fin = particion[2]
                p_tam = particion[3]
                p_format = particion[4]
                p_tipo = particion[5]
                p_usado = particion[7]
                p_libre = particion[8]
                p_num = particion[10]

                fila = [
                       msj.particion.get_dispositivo(p_disp, p_num),
                       msj.particion.get_tipo(p_tipo),
                       msj.particion.get_formato(p_format),
                       '',
                       humanize(floatify(p_tam)),
                       humanize(p_usado),
                       humanize(p_libre),
                       p_ini,
                       p_fin,
                       False,
                       PStatus.NORMAL,
                   ]
                self.lista.append(fila)

            self.fill_table()

    def set_buttons_insensitives(self):
        'Bloquea todos los botones de acciones'
        # Llevar los botones a su estado inicial
        self.btn_nueva.set_sensitive(False)
        self.btn_editar.set_sensitive(False)
        self.btn_redimension.set_sensitive(False)
        self.btn_eliminar.set_sensitive(False)

    def table_row_selected(self, fila):
        '''Acciones a tomar cuando una fila de la tabla es seleccionada'''

        # Si no se selecciona una fila valida
        if fila == None:
            print "Nada seleccionado."
            return
        else:
            self.fila_selec = fila

        # BTN_NUEVA
        if is_free(fila):
            # Activar solo si hay menos de 4 particiones primarias
            if is_primary(fila) and self.count_primary() < 4:
                self.btn_nueva.set_sensitive(True)
            # o si la part. libre es logica
            elif is_logic(fila) and self.count_logical() < 11:
                self.btn_nueva.set_sensitive(True)
            else:
                self.btn_nueva.set_sensitive(False)
        else:
            self.btn_nueva.set_sensitive(False)

        # BTN_USAR
        if is_usable(self.fila_selec):
            self.btn_editar.set_sensitive(True)
        else:
            self.btn_editar.set_sensitive(False)

        #BTN_REDIMENSION
        # Si la particion NO es libre
        # si el filesystem tiene redimensionador
        # y no se ha marcado la aprticion para usarla
        # y si hay espacio para redimensionar dentro de la particion
        if fila[TblCol.FORMATO] != msj.particion.libre \
        and is_resizable(fila[TblCol.FORMATO]) \
        and fila[TblCol.ESTADO] != PStatus.USED \
        and floatify(fila[TblCol.TAMANO]) > floatify(fila[TblCol.USADO]):
            self.btn_redimension.set_sensitive(True)
        else:
            self.btn_redimension.set_sensitive(False)

        # BTN_ELIMINAR
        # Solo se pueden eliminar particiones, no los espacios libres
        #TODO: Eliminar part. extendidas (necesita verificar part. logicas)
        if not is_free(fila):
            self.btn_eliminar.set_sensitive(True)
        else:
            self.btn_eliminar.set_sensitive(False)

    def count_primary(self):
        '''Cuenta la cantidad de particiones primarias. Las particiones
        extendidas cuentan como primarias'''
        total = 0
        for fila in self.lista:
            if is_primary(fila) and not is_free(fila):
                total = total + 1
        return total

    def count_logical(self):
        '''Cuenta la cantidad de particiones logicas que no sean vacias'''
        total = 0
        for fila in self.lista:
            if is_logic(fila) and not is_free(fila):
                total = total + 1
        return total

    def fill_table(self):
        '''Llena la tabla con las particiones existentes en el disco'''

        self.order_list()

        # Limpia previamente la tabla para inicializar su llenado
        self.tabla.liststore.clear()
        self.tabla.get_selection().unselect_all()

        # LLena la tabla con los datos
        for fila in self.lista:
            self.tabla.agregar_fila(fila)

            # Verifica si hay punto de montaje raiz "/"
            if fila[TblCol.MONTAJE] == '/':
                self.raiz = True
        if len(self.acciones) > 0:
            self.btn_deshacer.set_sensitive(True)
        else:
            self.btn_deshacer.set_sensitive(False)

    def order_list(self):
        'Ordena la lista por el inicio de la particion (metodo burbuja)'
        tamano = len(self.lista)
        for k in range(tamano - 1):
            ini = self.lista[k][TblCol.INICIO]
            ini_sig = self.lista[k + 1][TblCol.INICIO]
            if ini > ini_sig:
                f_temp = self.lista[k]
                self.lista[k] = self.lista[k + 1]
                self.lista[k + 1] = f_temp

    def delete_partition(self, widget):
        self.set_buttons_insensitives()
        w_elim = particion_eliminar.Main(self.lista, self.fila_selec, \
                                         self.acciones)
        self.lista = w_elim.lista
        self.acciones = w_elim.acciones
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def resize_partition(self, widget):
        self.set_buttons_insensitives()
        widget.set_sensitive(False)
        w_redim = particion_redimensionar.Main(self.disco, self.lista,
                                               self.fila_selec, self.acciones)
        self.acciones = w_redim.acciones
        self.lista = w_redim.lista
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def new_partition(self, widget):
        self.set_buttons_insensitives()
        widget.set_sensitive(False)
        w_nueva = particion_nueva.Main(self)
        # Se actualiza la tabla
        self.lista = w_nueva.lista
        self.acciones = w_nueva.acciones
        self.acciones
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def edit_partition(self, widget):
        self.set_buttons_insensitives()
        widget.set_sensitive(False)
        w_usar = particion_editar.Main(self.lista, self.fila_selec,
                                       self.acciones)
        self.lista = w_usar.lista
        self.acciones = w_usar.acciones
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def undo_all_actions(self, widget=None):
        self.initialize(self.data)
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"
Пример #3
0
class PasoPartManual(gtk.VBox):
    def __init__(self, data):
        gtk.VBox.__init__(self)

        self.data = data
        self.disco = self.data['metodo']['disco'][0]

        self.tabla = TablaParticiones()
        #self.tabla.set_doble_click(self.activar_tabla);
        self.tabla.set_seleccionar(self.table_row_selected)

        label = gtk.Label(
            _("""Use the following table to modify disk \
partitions to your liking. We recommend:
- Establish a minimum of {0} for the root partition (/).
- Create a swap space.""").format(humanize(ESPACIO_TOTAL)))
        label.set_line_wrap(False)
        label.set_justify(gtk.JUSTIFY_LEFT)
        label.set_alignment(0, 0)
        label.show()
        self.pack_start(label, False, False, 0)

        self.scroll = gtk.ScrolledWindow()
        self.scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
        self.scroll.set_size_request(0, 150)
        self.scroll.add(self.tabla)
        self.tabla.show()
        self.scroll.show()
        self.pack_start(self.scroll, True, True, 10)

        # btn_nueva
        self.btn_nueva = gtk.Button(_("New..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_nueva.set_image(image)
        self.btn_nueva.show()
        self.btn_nueva.connect("clicked", self.new_partition)

        # btn_editar
        self.btn_editar = gtk.Button(_("Edit..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_editar.set_image(image)
        self.btn_editar.show()
        self.btn_editar.connect("clicked", self.edit_partition)

        # btn_eliminar
        self.btn_eliminar = gtk.Button(_("Delete"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_eliminar.set_image(image)
        self.btn_eliminar.show()
        self.btn_eliminar.connect("clicked", self.delete_partition)

        # btn_redimension
        self.btn_redimension = gtk.Button(_("Resize..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_INDENT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_redimension.set_image(image)
        self.btn_redimension.show()
        self.btn_redimension.connect("clicked", self.resize_partition)

        # btn_deshacer
        self.btn_deshacer = gtk.Button(_("Undo all"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_UNDO, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_deshacer.set_image(image)
        self.btn_deshacer.show()
        self.btn_deshacer.connect("clicked", self.undo_all_actions)

        self.botonera1 = gtk.HButtonBox()
        self.botonera1.set_layout(gtk.BUTTONBOX_START)
        self.botonera1.set_homogeneous(False)
        self.botonera1.add(self.btn_nueva)
        self.botonera1.add(self.btn_editar)
        self.botonera1.add(self.btn_redimension)
        self.botonera1.add(self.btn_eliminar)
        self.botonera1.add(self.btn_deshacer)
        self.pack_start(self.botonera1, False, False, 0)
        # llenar la tabla por primera vez
        self.initialize(data)

    def initialize(self, data):
        '''
        Inicializa todas las variables
        '''
        self.lista = []  # Lista de las particiones hechas
        self.acciones = []  # Almacena las acciones pendientes a realizar
        self.fila_selec = None  # Ultima fila seleccionada de la tabla
        self.raiz = False

        self.set_buttons_insensitives()

        # Llenar la tabla con el contenido actual del disco
        if self.tabla != None:

            #l_part = Particiones().lista_particiones(self.disco)
            for particion in self.data['particiones']:
                p_disp = particion[0]
                p_ini = particion[1]
                p_fin = particion[2]
                p_tam = particion[3]
                p_format = particion[4]
                p_tipo = particion[5]
                p_usado = particion[7]
                p_libre = particion[8]
                p_num = particion[10]

                fila = [
                    msj.particion.get_dispositivo(p_disp, p_num),
                    msj.particion.get_tipo(p_tipo),
                    msj.particion.get_formato(p_format),
                    '',
                    humanize(floatify(p_tam)),
                    humanize(p_usado),
                    humanize(p_libre),
                    p_ini,
                    p_fin,
                    False,
                    PStatus.NORMAL,
                ]
                self.lista.append(fila)

            self.fill_table()

    def set_buttons_insensitives(self):
        'Bloquea todos los botones de acciones'
        # Llevar los botones a su estado inicial
        self.btn_nueva.set_sensitive(False)
        self.btn_editar.set_sensitive(False)
        self.btn_redimension.set_sensitive(False)
        self.btn_eliminar.set_sensitive(False)

    def table_row_selected(self, fila):
        '''Acciones a tomar cuando una fila de la tabla es seleccionada'''

        # Si no se selecciona una fila valida
        if fila == None:
            print "Nada seleccionado."
            return
        else:
            self.fila_selec = fila

        # BTN_NUEVA
        if is_free(fila):
            # Activar solo si hay menos de 4 particiones primarias
            if is_primary(fila) and self.count_primary() < 4:
                self.btn_nueva.set_sensitive(True)
            # o si la part. libre es logica
            elif is_logic(fila) and self.count_logical() < 11:
                self.btn_nueva.set_sensitive(True)
            else:
                self.btn_nueva.set_sensitive(False)
        else:
            self.btn_nueva.set_sensitive(False)

        # BTN_USAR
        if is_usable(self.fila_selec):
            self.btn_editar.set_sensitive(True)
        else:
            self.btn_editar.set_sensitive(False)

        #BTN_REDIMENSION
        # Si la particion NO es libre
        # si el filesystem tiene redimensionador
        # y no se ha marcado la aprticion para usarla
        # y si hay espacio para redimensionar dentro de la particion
        if fila[TblCol.FORMATO] != msj.particion.libre \
        and is_resizable(fila[TblCol.FORMATO]) \
        and fila[TblCol.ESTADO] != PStatus.USED \
        and floatify(fila[TblCol.TAMANO]) > floatify(fila[TblCol.USADO]):
            self.btn_redimension.set_sensitive(True)
        else:
            self.btn_redimension.set_sensitive(False)

        # BTN_ELIMINAR
        # Solo se pueden eliminar particiones, no los espacios libres
        #TODO: Eliminar part. extendidas (necesita verificar part. logicas)
        if not is_free(fila):
            self.btn_eliminar.set_sensitive(True)
        else:
            self.btn_eliminar.set_sensitive(False)

    def count_primary(self):
        '''Cuenta la cantidad de particiones primarias. Las particiones
        extendidas cuentan como primarias'''
        total = 0
        for fila in self.lista:
            if is_primary(fila) and not is_free(fila):
                total = total + 1
        return total

    def count_logical(self):
        '''Cuenta la cantidad de particiones logicas que no sean vacias'''
        total = 0
        for fila in self.lista:
            if is_logic(fila) and not is_free(fila):
                total = total + 1
        return total

    def fill_table(self):
        '''Llena la tabla con las particiones existentes en el disco'''

        self.order_list()

        # Limpia previamente la tabla para inicializar su llenado
        self.tabla.liststore.clear()
        self.tabla.get_selection().unselect_all()

        # LLena la tabla con los datos
        for fila in self.lista:
            self.tabla.agregar_fila(fila)

            # Verifica si hay punto de montaje raiz "/"
            if fila[TblCol.MONTAJE] == '/':
                self.raiz = True
        if len(self.acciones) > 0:
            self.btn_deshacer.set_sensitive(True)
        else:
            self.btn_deshacer.set_sensitive(False)

    def order_list(self):
        'Ordena la lista por el inicio de la particion (metodo burbuja)'
        tamano = len(self.lista)
        for k in range(tamano - 1):
            ini = self.lista[k][TblCol.INICIO]
            ini_sig = self.lista[k + 1][TblCol.INICIO]
            if ini > ini_sig:
                f_temp = self.lista[k]
                self.lista[k] = self.lista[k + 1]
                self.lista[k + 1] = f_temp

    def delete_partition(self, widget):
        self.set_buttons_insensitives()
        w_elim = particion_eliminar.Main(self.lista, self.fila_selec, \
                                         self.acciones)
        self.lista = w_elim.lista
        self.acciones = w_elim.acciones
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def resize_partition(self, widget):
        self.set_buttons_insensitives()
        widget.set_sensitive(False)
        w_redim = particion_redimensionar.Main(self.disco, self.lista,
                                               self.fila_selec, self.acciones)
        self.acciones = w_redim.acciones
        self.lista = w_redim.lista
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def new_partition(self, widget):
        self.set_buttons_insensitives()
        widget.set_sensitive(False)
        w_nueva = particion_nueva.Main(self)
        # Se actualiza la tabla
        self.lista = w_nueva.lista
        self.acciones = w_nueva.acciones
        self.acciones
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def edit_partition(self, widget):
        self.set_buttons_insensitives()
        widget.set_sensitive(False)
        w_usar = particion_editar.Main(self.lista, self.fila_selec,
                                       self.acciones)
        self.lista = w_usar.lista
        self.acciones = w_usar.acciones
        self.fill_table()
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"

    def undo_all_actions(self, widget=None):
        self.initialize(self.data)
        print "---ACCIONES---"
        print debug_list(self.acciones)
        print "--------------"
Пример #4
0
    def __init__(self, data):
        gtk.VBox.__init__(self)

        self.data = data
        self.disco = self.data['metodo']['disco'][0]

        self.tabla = TablaParticiones()
        #self.tabla.set_doble_click(self.activar_tabla);
        self.tabla.set_seleccionar(self.table_row_selected)

        label = gtk.Label(
            _("""Use the following table to modify disk \
partitions to your liking. We recommend:
- Establish a minimum of {0} for the root partition (/).
- Create a swap space.""").format(humanize(ESPACIO_TOTAL)))
        label.set_line_wrap(False)
        label.set_justify(gtk.JUSTIFY_LEFT)
        label.set_alignment(0, 0)
        label.show()
        self.pack_start(label, False, False, 0)

        self.scroll = gtk.ScrolledWindow()
        self.scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
        self.scroll.set_size_request(0, 150)
        self.scroll.add(self.tabla)
        self.tabla.show()
        self.scroll.show()
        self.pack_start(self.scroll, True, True, 10)

        # btn_nueva
        self.btn_nueva = gtk.Button(_("New..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_nueva.set_image(image)
        self.btn_nueva.show()
        self.btn_nueva.connect("clicked", self.new_partition)

        # btn_editar
        self.btn_editar = gtk.Button(_("Edit..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_editar.set_image(image)
        self.btn_editar.show()
        self.btn_editar.connect("clicked", self.edit_partition)

        # btn_eliminar
        self.btn_eliminar = gtk.Button(_("Delete"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_eliminar.set_image(image)
        self.btn_eliminar.show()
        self.btn_eliminar.connect("clicked", self.delete_partition)

        # btn_redimension
        self.btn_redimension = gtk.Button(_("Resize..."))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_INDENT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_redimension.set_image(image)
        self.btn_redimension.show()
        self.btn_redimension.connect("clicked", self.resize_partition)

        # btn_deshacer
        self.btn_deshacer = gtk.Button(_("Undo all"))
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_UNDO, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_deshacer.set_image(image)
        self.btn_deshacer.show()
        self.btn_deshacer.connect("clicked", self.undo_all_actions)

        self.botonera1 = gtk.HButtonBox()
        self.botonera1.set_layout(gtk.BUTTONBOX_START)
        self.botonera1.set_homogeneous(False)
        self.botonera1.add(self.btn_nueva)
        self.botonera1.add(self.btn_editar)
        self.botonera1.add(self.btn_redimension)
        self.botonera1.add(self.btn_eliminar)
        self.botonera1.add(self.btn_deshacer)
        self.pack_start(self.botonera1, False, False, 0)
        # llenar la tabla por primera vez
        self.initialize(data)
    def __init__(self, data):
        gtk.VBox.__init__(self)

        self.data = data
        self.disco = self.data["metodo"]["disco"][0]

        self.tabla = TablaParticiones()
        # self.tabla.set_doble_click(self.activar_tabla);
        self.tabla.set_seleccionar(self.table_row_selected)

        label = gtk.Label(
            """Utilice la siguiente tabla para modificar \
las particiones en disco a su gusto. Le recomendamos:
- Establecer un minimo de {0} para la partición raíz (/).
- Crear un área de intercambio (swap).""".format(
                humanize(ESPACIO_TOTAL)
            )
        )
        label.set_line_wrap(False)
        label.set_justify(gtk.JUSTIFY_LEFT)
        label.set_alignment(0, 0)
        label.show()
        self.pack_start(label, False, False, 0)

        self.scroll = gtk.ScrolledWindow()
        self.scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
        self.scroll.set_size_request(0, 150)
        self.scroll.add(self.tabla)
        self.tabla.show()
        self.scroll.show()
        self.pack_start(self.scroll, True, True, 10)

        # btn_nueva
        self.btn_nueva = gtk.Button("Nueva")
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_nueva.set_image(image)
        self.btn_nueva.show()
        self.btn_nueva.connect("clicked", self.new_partition)

        # btn_editar
        self.btn_editar = gtk.Button("Editar")
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_editar.set_image(image)
        self.btn_editar.show()
        self.btn_editar.connect("clicked", self.edit_partition)

        # btn_eliminar
        self.btn_eliminar = gtk.Button("Eliminar")
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_eliminar.set_image(image)
        self.btn_eliminar.show()
        self.btn_eliminar.connect("clicked", self.delete_partition)

        # btn_redimension
        self.btn_redimension = gtk.Button("Redimensionar")
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_INDENT, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_redimension.set_image(image)
        self.btn_redimension.show()
        self.btn_redimension.connect("clicked", self.resize_partition)

        # btn_deshacer
        self.btn_deshacer = gtk.Button("Deshacer todo")
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_UNDO, gtk.ICON_SIZE_SMALL_TOOLBAR)
        self.btn_deshacer.set_image(image)
        self.btn_deshacer.show()
        self.btn_deshacer.connect("clicked", self.undo_all_actions)

        self.botonera1 = gtk.HButtonBox()
        self.botonera1.set_layout(gtk.BUTTONBOX_START)
        self.botonera1.set_homogeneous(False)
        self.botonera1.add(self.btn_nueva)
        self.botonera1.add(self.btn_editar)
        self.botonera1.add(self.btn_redimension)
        self.botonera1.add(self.btn_eliminar)
        self.botonera1.add(self.btn_deshacer)
        self.pack_start(self.botonera1, False, False, 0)
        # llenar la tabla por primera vez
        self.initialize(data)