#!/usr/bin/env python
# encoding: iso-8859-15
#
#Minë. Mundo Interactivo-Narrativo en Español [Tierra-Media]
#Copyright (C) 2002  Pablo Ruiz Múzquiz
#
#
#This program is free software; you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation; either version 2 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
#Boa:MDIChild:frSala

#Contiene la clase frSala que es un Frame para editar Salas de Minë
#Es decir el Mardentan.

#GPT Me falta comentar a fondo. Es un fichero generado por Boa con lo que la 
#distribución de elementos es caótica en la parte que genera Boa.

from wxPython.wx import *
import SalaEditable
import Sala
import os
import xml.sax._exceptions
import logging

log = logging.getLogger("Editor")
xmlerrores = xml.sax._exceptions

def create(parent):
    return frSala(parent)

[wxID_FRSALA, wxID_FRSALABTID, wxID_FRSALACBDESCRIPCION, 
 wxID_FRSALACBDIRECCION, wxID_FRSALACBENCUENTRO, wxID_FRSALACBOBJETO, 
 wxID_FRSALACBSUBTIPO, wxID_FRSALACBTIPO, wxID_FRSALADES_BTDEL, 
 wxID_FRSALADES_BTNEW, wxID_FRSALADES_LBDIF, wxID_FRSALADES_SPDIFICULTAD, 
 wxID_FRSALADES_TXTEXTO, wxID_FRSALAENC_BTDEL, wxID_FRSALAENC_BTNEW, 
 wxID_FRSALAENC_LBCANTIDAD, wxID_FRSALAENC_LBDESCRIPCION, 
 wxID_FRSALAENC_SPDIFICULTAD, wxID_FRSALAENC_SPPROBABILIDAD, 
 wxID_FRSALAENC_TXCANTIDAD, wxID_FRSALAENC_TXDESCRIPCION, 
 wxID_FRSALAENC_TXMAXIMO, wxID_FRSALALBAREA, wxID_FRSALALBAURA, 
 wxID_FRSALALBAUTOR, wxID_FRSALALBCANTIDAD, wxID_FRSALALBCOMENTARIO, 
 wxID_FRSALALBDIFICULTADEN, wxID_FRSALALBDIFICULTADOB, wxID_FRSALALBID, 
 wxID_FRSALALBLUZ, wxID_FRSALALBMAXIMO, wxID_FRSALALBMAXIMOEN, 
 wxID_FRSALALBNOMBRE, wxID_FRSALALBOCULTABILIDAD, wxID_FRSALALBPROBABILIDAD, 
 wxID_FRSALALBPROBABILIDADEN, wxID_FRSALALBSUBTIPO, wxID_FRSALALBTIPO, 
 wxID_FRSALALBVOLUMEN, wxID_FRSALANOTEBOOK1, wxID_FRSALAOBJ_BTDEL, 
 wxID_FRSALAOBJ_BTNEW, wxID_FRSALAOBJ_LBDESCRIPCION, 
 wxID_FRSALAOBJ_SPDIFICULTAD, wxID_FRSALAOBJ_SPPROBABILIDAD, 
 wxID_FRSALAOBJ_TXCANTIDAD, wxID_FRSALAOBJ_TXDESCRIPCION, 
 wxID_FRSALAOBJ_TXMAXIMO, wxID_FRSALAPANEL1, wxID_FRSALAPANELDESCRIPCION, 
 wxID_FRSALAPANELENCUENTROS, wxID_FRSALAPANELOBJETOS, wxID_FRSALAPANELSALIDAS, 
 wxID_FRSALARBCOMBATE, wxID_FRSALASAL_BTDEL, wxID_FRSALASAL_BTNEW, 
 wxID_FRSALASAL_CBTIPOCIERRE, wxID_FRSALASAL_LBDATOSCIERRE, 
 wxID_FRSALASAL_LBDESCRIPCION, wxID_FRSALASAL_LBDIF, wxID_FRSALASAL_LBID, 
 wxID_FRSALASAL_LBMENSAJECERRADO, wxID_FRSALASAL_LBTIPO_CIERRE, 
 wxID_FRSALASAL_SBCIERRE, wxID_FRSALASAL_SPDIFICULTAD, 
 wxID_FRSALASAL_TXDATOSCIERRE, wxID_FRSALASAL_TXDESCRIPCION, 
 wxID_FRSALASAL_TXID, wxID_FRSALASAL_TXMENSAJECERRADO, wxID_FRSALASPAURA, 
 wxID_FRSALASPLUZ, wxID_FRSALASPOCULTABILIDAD, wxID_FRSALATXAREA, 
 wxID_FRSALATXAUTOR, wxID_FRSALATXCOMENTARIO, wxID_FRSALATXID, 
 wxID_FRSALATXNOMBRE, wxID_FRSALATXVOLUMEN, 
] = map(lambda _init_ctrls: wxNewId(), range(79))

class frSala(wxMDIChildFrame):

    def _init_coll_notebook1_Pages(self, parent):
        # generated method, don't edit

        parent.AddPage(imageId=-1, page=self.panelDescripcion, select=True,
              text='Descripciones')
        parent.AddPage(imageId=-1, page=self.panelSalidas, select=False,
              text='Salidas')
        parent.AddPage(imageId=-1, page=self.panelObjetos, select=False,
              text='Objetos')
        parent.AddPage(imageId=-1, page=self.panelEncuentros, select=False,
              text='Encuentros')

    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wxMDIChildFrame.__init__(self, id=wxID_FRSALA, name=u'frSala',
              parent=prnt, pos=wxPoint(286, 146), size=wxSize(735, 560),
              style=wxRESIZE_BORDER | wxDEFAULT_FRAME_STYLE | 4, title='Sala')
        self.SetClientSize(wxSize(727, 533))
        EVT_CLOSE(self, self.OnFrsalaClose)

        self.panel1 = wxPanel(id=wxID_FRSALAPANEL1, name='panel1', parent=self,
              pos=wxPoint(0, 0), size=wxSize(727, 533), style=wxTAB_TRAVERSAL)

        self.lbAutor = wxStaticText(id=wxID_FRSALALBAUTOR, label='Autor',
              name='lbAutor', parent=self.panel1, pos=wxPoint(0, 76),
              size=wxSize(80, 12), style=wxALIGN_RIGHT)

        self.txAutor = wxTextCtrl(id=wxID_FRSALATXAUTOR, name='txAutor',
              parent=self.panel1, pos=wxPoint(88, 72), size=wxSize(224, 21),
              style=0, value='')
        EVT_KEY_UP(self.txAutor, self.OnTxautorKeyUp)

        self.lbArea = wxStaticText(id=wxID_FRSALALBAREA, label='Area',
              name='lbArea', parent=self.panel1, pos=wxPoint(8, 44),
              size=wxSize(72, 12), style=wxALIGN_RIGHT)

        self.txArea = wxTextCtrl(id=wxID_FRSALATXAREA, name='txArea',
              parent=self.panel1, pos=wxPoint(88, 40), size=wxSize(120, 21),
              style=0, value='')
        self.txArea.Enable(True)
        EVT_TEXT_ENTER(self.txArea, wxID_FRSALATXAREA,
              self.OnTxareaTextEnter_KillFocusEvent)
        EVT_KILL_FOCUS(self.txArea, self.OnTxareaTextEnter_KillFocusEvent)
        EVT_KEY_UP(self.txArea, self.OnTxareaKeyUp)

        self.lbNombre = wxStaticText(id=wxID_FRSALALBNOMBRE, label='Nombre',
              name='lbNombre', parent=self.panel1, pos=wxPoint(8, 108),
              size=wxSize(72, 13), style=wxALIGN_RIGHT)

        self.txNombre = wxTextCtrl(id=wxID_FRSALATXNOMBRE, name='txNombre',
              parent=self.panel1, pos=wxPoint(88, 104), size=wxSize(224, 21),
              style=0, value='')
        EVT_KEY_UP(self.txNombre, self.OnTxnombreKeyUp)

        self.txComentario = wxTextCtrl(id=wxID_FRSALATXCOMENTARIO,
              name='txComentario', parent=self.panel1, pos=wxPoint(88, 136),
              size=wxSize(472, 21), style=0, value='')
        EVT_KEY_UP(self.txComentario, self.OnTxcomentarioKeyUp)

        self.lbComentario = wxStaticText(id=wxID_FRSALALBCOMENTARIO,
              label='Comentario', name='lbComentario', parent=self.panel1,
              pos=wxPoint(0, 136), size=wxSize(80, 16), style=wxALIGN_RIGHT)

        self.lbLuz = wxStaticText(id=wxID_FRSALALBLUZ, label='Luz',
              name='lbLuz', parent=self.panel1, pos=wxPoint(320, 42),
              size=wxSize(56, 13), style=wxALIGN_RIGHT)

        self.lbAura = wxStaticText(id=wxID_FRSALALBAURA, label='Aura',
              name='lbAura', parent=self.panel1, pos=wxPoint(320, 76),
              size=wxSize(56, 13), style=wxALIGN_RIGHT)

        self.lbVolumen = wxStaticText(id=wxID_FRSALALBVOLUMEN, label='Volumen',
              name='lbVolumen', parent=self.panel1, pos=wxPoint(320, 11),
              size=wxSize(56, 13), style=wxALIGN_RIGHT)

        self.txVolumen = wxTextCtrl(id=wxID_FRSALATXVOLUMEN, name='txVolumen',
              parent=self.panel1, pos=wxPoint(384, 8), size=wxSize(48, 21),
              style=0, value='')
        EVT_KEY_UP(self.txVolumen, self.OnTxvolumenKeyUp)

        self.lbOcultabilidad = wxStaticText(id=wxID_FRSALALBOCULTABILIDAD,
              label='Ocultabilidad', name='lbOcultabilidad', parent=self.panel1,
              pos=wxPoint(312, 108), size=wxSize(64, 13), style=wxALIGN_RIGHT)

        self.notebook1 = wxNotebook(id=wxID_FRSALANOTEBOOK1, name='notebook1',
              parent=self.panel1, pos=wxPoint(24, 176), size=wxSize(672, 336),
              style=0)

        self.panelDescripcion = wxPanel(id=wxID_FRSALAPANELDESCRIPCION,
              name='panelDescripcion', parent=self.notebook1, pos=wxPoint(0, 0),
              size=wxSize(664, 310), style=wxTAB_TRAVERSAL)

        self.panelObjetos = wxPanel(id=wxID_FRSALAPANELOBJETOS,
              name='panelObjetos', parent=self.notebook1, pos=wxPoint(0, 0),
              size=wxSize(664, 310), style=wxTAB_TRAVERSAL)

        self.des_txTexto = wxTextCtrl(id=wxID_FRSALADES_TXTEXTO,
              name='des_txTexto', parent=self.panelDescripcion, pos=wxPoint(176,
              88), size=wxSize(416, 152), style=wxTE_MULTILINE, value='')
        EVT_TEXT_ENTER(self.des_txTexto, wxID_FRSALADES_TXTEXTO,
              self.OnDes_TxtextoTextEnter_KillFocusEvent)
        EVT_KILL_FOCUS(self.des_txTexto,
              self.OnDes_TxtextoTextEnter_KillFocusEvent)
        EVT_KEY_UP(self.des_txTexto, self.OnDes_txtextoKeyUp)

        self.cbDescripcion = wxComboBox(choices=[], id=wxID_FRSALACBDESCRIPCION,
              name='cbDescripcion', parent=self.panelDescripcion,
              pos=wxPoint(40, 32), size=wxSize(125, 210), style=wxCAPTION | 4,
              validator=wxDefaultValidator, value='')
        self.cbDescripcion.SetLabel('')
        EVT_COMBOBOX(self.cbDescripcion, wxID_FRSALACBDESCRIPCION,
              self.OnCbdescripcionCombobox)

        self.des_lbDif = wxStaticText(id=wxID_FRSALADES_LBDIF,
              label='Dificultad', name='des_lbDif',
              parent=self.panelDescripcion, pos=wxPoint(176, 58),
              size=wxSize(68, 13), style=wxALIGN_RIGHT)

        self.cbObjeto = wxComboBox(choices=[], id=wxID_FRSALACBOBJETO,
              name='cbObjeto', parent=self.panelObjetos, pos=wxPoint(40, 32),
              size=wxSize(125, 210), style=wxCAPTION | 4,
              validator=wxDefaultValidator, value='')
        self.cbObjeto.SetLabel('')
        EVT_COMBOBOX(self.cbObjeto, wxID_FRSALACBOBJETO,
              self.OnCbobjetoCombobox)
        EVT_KILL_FOCUS(self.cbObjeto, self.OnCbobjetoKillFocus)

        self.lbProbabilidad = wxStaticText(id=wxID_FRSALALBPROBABILIDAD,
              label='Probabilidad', name='lbProbabilidad',
              parent=self.panelObjetos, pos=wxPoint(184, 82), size=wxSize(64,
              13), style=wxALIGN_RIGHT)

        self.lbCantidad = wxStaticText(id=wxID_FRSALALBCANTIDAD,
              label='Cantidad', name='lbCantidad', parent=self.panelObjetos,
              pos=wxPoint(328, 51), size=wxSize(48, 13), style=wxALIGN_RIGHT)

        self.obj_txCantidad = wxTextCtrl(id=wxID_FRSALAOBJ_TXCANTIDAD,
              name=u'obj_txCantidad', parent=self.panelObjetos, pos=wxPoint(384,
              48), size=wxSize(48, 21), style=0, value='')
        EVT_KEY_UP(self.obj_txCantidad, self.OnObj_txcantidadKeyUp)

        self.lbMaximo = wxStaticText(id=wxID_FRSALALBMAXIMO, label='M\xe1ximo',
              name='lbMaximo', parent=self.panelObjetos, pos=wxPoint(328, 80),
              size=wxSize(48, 16), style=wxALIGN_RIGHT)

        self.obj_txMaximo = wxTextCtrl(id=wxID_FRSALAOBJ_TXMAXIMO,
              name=u'obj_txMaximo', parent=self.panelObjetos, pos=wxPoint(384,
              80), size=wxSize(48, 21), style=0, value='')
        EVT_KEY_UP(self.obj_txMaximo, self.OnObj_txmaximoKeyUp)

        self.lbDificultadOb = wxStaticText(id=wxID_FRSALALBDIFICULTADOB,
              label='Dificultad', name='lbDificultadOb',
              parent=self.panelObjetos, pos=wxPoint(184, 50), size=wxSize(64,
              13), style=wxALIGN_RIGHT)

        self.panelSalidas = wxPanel(id=wxID_FRSALAPANELSALIDAS,
              name='panelSalidas', parent=self.notebook1, pos=wxPoint(0, 0),
              size=wxSize(664, 310), style=wxTAB_TRAVERSAL)

        self.panelEncuentros = wxPanel(id=wxID_FRSALAPANELENCUENTROS,
              name='panelEncuentros', parent=self.notebook1, pos=wxPoint(0, 0),
              size=wxSize(664, 310), style=wxTAB_TRAVERSAL)

        self.cbDireccion = wxComboBox(choices=[], id=wxID_FRSALACBDIRECCION,
              name='cbDireccion', parent=self.panelSalidas, pos=wxPoint(40, 32),
              size=wxSize(125, 210), style=4, validator=wxDefaultValidator,
              value='')
        self.cbDireccion.SetLabel('')
        EVT_COMBOBOX(self.cbDireccion, wxID_FRSALACBDIRECCION,
              self.OnCbdireccionCombobox)
        EVT_KILL_FOCUS(self.cbDireccion, self.OnCbdireccionKillFocus)

        self.sal_lbDescripcion = wxStaticText(id=wxID_FRSALASAL_LBDESCRIPCION,
              label='Texto', name='sal_lbDescripcion', parent=self.panelSalidas,
              pos=wxPoint(168, 72), size=wxSize(35, 13), style=wxALIGN_RIGHT)

        self.sal_txDescripcion = wxTextCtrl(id=wxID_FRSALASAL_TXDESCRIPCION,
              name='sal_txDescripcion', parent=self.panelSalidas,
              pos=wxPoint(208, 72), size=wxSize(416, 40), style=wxTE_MULTILINE,
              value='')
        EVT_KEY_UP(self.sal_txDescripcion, self.OnSal_txdescripcionKeyUp)

        self.sal_lbDif = wxStaticText(id=wxID_FRSALASAL_LBDIF,
              label='Dificultad', name='sal_lbDif', parent=self.panelSalidas,
              pos=wxPoint(464, 34), size=wxSize(64, 13), style=wxALIGN_RIGHT)

        self.sal_lbId = wxStaticText(id=wxID_FRSALASAL_LBID, label='Id',
              name='sal_lbId', parent=self.panelSalidas, pos=wxPoint(176, 35),
              size=wxSize(26, 13), style=0)

        self.sal_txId = wxTextCtrl(id=wxID_FRSALASAL_TXID, name='sal_txId',
              parent=self.panelSalidas, pos=wxPoint(208, 32), size=wxSize(224,
              21), style=0, value='')
        EVT_KEY_UP(self.sal_txId, self.OnSal_txidKeyUp)

        self.cbEncuentro = wxComboBox(choices=[], id=wxID_FRSALACBENCUENTRO,
              name='cbEncuentro', parent=self.panelEncuentros, pos=wxPoint(40,
              32), size=wxSize(125, 210), style=wxCAPTION | 4,
              validator=wxDefaultValidator, value='')
        self.cbEncuentro.SetLabel('')
        EVT_COMBOBOX(self.cbEncuentro, wxID_FRSALACBENCUENTRO,
              self.OnCbencuentroCombobox)
        EVT_KILL_FOCUS(self.cbEncuentro, self.OnCbencuentroKillFocus)

        self.enc_lbDescripcion = wxStaticText(id=wxID_FRSALAENC_LBDESCRIPCION,
              label='Texto:', name=u'enc_lbDescripcion',
              parent=self.panelEncuentros, pos=wxPoint(176, 128),
              size=wxSize(48, 13), style=wxALIGN_RIGHT)

        self.enc_txDescripcion = wxTextCtrl(id=wxID_FRSALAENC_TXDESCRIPCION,
              name=u'enc_txDescripcion', parent=self.panelEncuentros,
              pos=wxPoint(184, 152), size=wxSize(424, 56), style=wxTE_MULTILINE,
              value='')
        EVT_KEY_UP(self.enc_txDescripcion, self.OnEnc_txdescripcionKeyUp)

        self.lbDificultadEn = wxStaticText(id=wxID_FRSALALBDIFICULTADEN,
              label='Dificultad', name='lbDificultadEn',
              parent=self.panelEncuentros, pos=wxPoint(176, 50), size=wxSize(72,
              13), style=wxALIGN_RIGHT)

        self.lbProbabilidadEn = wxStaticText(id=wxID_FRSALALBPROBABILIDADEN,
              label='Probabilidad', name='lbProbabilidadEn',
              parent=self.panelEncuentros, pos=wxPoint(176, 98), size=wxSize(72,
              13), style=wxALIGN_RIGHT)

        self.enc_lbCantidad = wxStaticText(id=wxID_FRSALAENC_LBCANTIDAD,
              label='Cantidad', name=u'enc_lbCantidad',
              parent=self.panelEncuentros, pos=wxPoint(320, 51), size=wxSize(50,
              13), style=wxALIGN_RIGHT)

        self.enc_txCantidad = wxTextCtrl(id=wxID_FRSALAENC_TXCANTIDAD,
              name=u'enc_txCantidad', parent=self.panelEncuentros,
              pos=wxPoint(376, 48), size=wxSize(48, 21), style=0, value='')
        EVT_KEY_UP(self.enc_txCantidad, self.OnEnc_txcantidadKeyUp)

        self.lbMaximoEn = wxStaticText(id=wxID_FRSALALBMAXIMOEN,
              label='M\xe1ximo', name='lbMaximoEn', parent=self.panelEncuentros,
              pos=wxPoint(320, 99), size=wxSize(48, 13), style=wxALIGN_RIGHT)

        self.enc_txMaximo = wxTextCtrl(id=wxID_FRSALAENC_TXMAXIMO,
              name=u'enc_txMaximo', parent=self.panelEncuentros,
              pos=wxPoint(376, 96), size=wxSize(48, 21), style=0, value='')
        EVT_KEY_UP(self.enc_txMaximo, self.OnEnc_txmaximoKeyUp)

        self.sal_btNew = wxButton(id=wxID_FRSALASAL_BTNEW, label=u'Nueva',
              name=u'sal_btNew', parent=self.panelSalidas, pos=wxPoint(40, 256),
              size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.sal_btNew, wxID_FRSALASAL_BTNEW, self.OnSal_btnewButton)

        self.sal_btDel = wxButton(id=wxID_FRSALASAL_BTDEL, label='Borrar',
              name='sal_btDel', parent=self.panelSalidas, pos=wxPoint(128, 256),
              size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.sal_btDel, wxID_FRSALASAL_BTDEL, self.OnSal_btdelButton)

        self.des_btNew = wxButton(id=wxID_FRSALADES_BTNEW, label=u'Nueva',
              name=u'des_btNew', parent=self.panelDescripcion, pos=wxPoint(40,
              256), size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.des_btNew, wxID_FRSALADES_BTNEW, self.OnDes_btnewButton)

        self.des_btDel = wxButton(id=wxID_FRSALADES_BTDEL, label='Borrar',
              name='des_btDel', parent=self.panelDescripcion, pos=wxPoint(128,
              256), size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.des_btDel, wxID_FRSALADES_BTDEL, self.OnDes_btdelButton)

        self.lbTipo = wxStaticText(id=wxID_FRSALALBTIPO, label='Tipo',
              name='lbTipo', parent=self.panel1, pos=wxPoint(456, 11),
              size=wxSize(48, 13), style=wxALIGN_RIGHT)

        self.lbSubtipo = wxStaticText(id=wxID_FRSALALBSUBTIPO, label='Subtipo',
              name='lbSubtipo', parent=self.panel1, pos=wxPoint(456, 44),
              size=wxSize(48, 12), style=wxALIGN_RIGHT)

        self.rbCombate = wxRadioBox(choices=['si', 'no'],
              id=wxID_FRSALARBCOMBATE, label='Combate', majorDimension=2,
              name='rbCombate', parent=self.panel1, point=wxPoint(472, 80),
              size=wxSize(88, 40), style=wxRA_SPECIFY_COLS,
              validator=wxDefaultValidator)
        EVT_RADIOBOX(self.rbCombate, wxID_FRSALARBCOMBATE,
              self.OnRbcombateRadiobox)

        self.sal_cbTipoCierre = wxChoice(choices=['ninguno', 'cerradura',
              'horario', 'magia'], id=wxID_FRSALASAL_CBTIPOCIERRE,
              name='sal_cbTipoCierre', parent=self.panelSalidas,
              pos=wxPoint(232, 152), size=wxSize(96, 21), style=0,
              validator=wxDefaultValidator)
        self.sal_cbTipoCierre.Enable(False)

        self.sal_lbTipo_Cierre = wxStaticText(id=wxID_FRSALASAL_LBTIPO_CIERRE,
              label='Tipo', name='sal_lbTipo_Cierre', parent=self.panelSalidas,
              pos=wxPoint(200, 156), size=wxSize(21, 13), style=0)

        self.sal_sbCierre = wxStaticBox(id=wxID_FRSALASAL_SBCIERRE,
              label='Cierre', name='sal_sbCierre', parent=self.panelSalidas,
              pos=wxPoint(176, 128), size=wxSize(456, 112), style=0)

        self.sal_txMensajeCerrado = wxTextCtrl(id=wxID_FRSALASAL_TXMENSAJECERRADO,
              name='sal_txMensajeCerrado', parent=self.panelSalidas,
              pos=wxPoint(232, 184), size=wxSize(384, 37), style=wxTE_MULTILINE,
              value='')
        self.sal_txMensajeCerrado.Enable(False)

        self.sal_lbMensajeCerrado = wxStaticText(id=wxID_FRSALASAL_LBMENSAJECERRADO,
              label='Mensaje', name='sal_lbMensajeCerrado',
              parent=self.panelSalidas, pos=wxPoint(184, 192), size=wxSize(40,
              13), style=0)

        self.sal_txDatosCierre = wxTextCtrl(id=wxID_FRSALASAL_TXDATOSCIERRE,
              name='sal_txDatosCierre', parent=self.panelSalidas,
              pos=wxPoint(408, 152), size=wxSize(200, 21), style=0, value='')
        self.sal_txDatosCierre.Enable(False)

        self.sal_lbDatosCierre = wxStaticText(id=wxID_FRSALASAL_LBDATOSCIERRE,
              label='Datos', name='sal_lbDatosCierre', parent=self.panelSalidas,
              pos=wxPoint(368, 156), size=wxSize(28, 13), style=0)

        self.cbTipo = wxComboBox(choices=[''], id=wxID_FRSALACBTIPO,
              name='cbTipo', parent=self.panel1, pos=wxPoint(512, 8),
              size=wxSize(125, 21), style=wxCB_DROPDOWN,
              validator=wxDefaultValidator, value='')
        self.cbTipo.SetLabel('')
        self.cbTipo.SetAutoLayout(False)
        EVT_COMBOBOX(self.cbTipo, wxID_FRSALACBTIPO, self.OnCbtipoCombobox)

        self.cbSubtipo = wxComboBox(choices=['sin_subtipo'],
              id=wxID_FRSALACBSUBTIPO, name='cbSubtipo', parent=self.panel1,
              pos=wxPoint(512, 40), size=wxSize(125, 21), style=0,
              validator=wxDefaultValidator, value='')
        self.cbSubtipo.SetLabel('')
        EVT_COMBOBOX(self.cbSubtipo, wxID_FRSALACBSUBTIPO,
              self.OnCbsubtipoCombobox)

        self.lbId = wxStaticText(id=wxID_FRSALALBID, label=u'Nombre Corto',
              name=u'lbId', parent=self.panel1, pos=wxPoint(8, 12),
              size=wxSize(73, 13), style=wxALIGN_RIGHT)

        self.txId = wxTextCtrl(id=wxID_FRSALATXID, name=u'txId',
              parent=self.panel1, pos=wxPoint(88, 8), size=wxSize(120, 21),
              style=0, value=u'')
        self.txId.Enable(True)
        EVT_KILL_FOCUS(self.txId, self.OnTxidTextEnter_KillFocusEvent)
        EVT_TEXT_ENTER(self.txId, wxID_FRSALATXID,
              self.OnTxidTextEnter_KillFocusEvent)
        EVT_KEY_UP(self.txId, self.OnTxidKeyUp)

        self.btId = wxButton(id=wxID_FRSALABTID, label=u'Cambiar ID',
              name=u'btId', parent=self.panel1, pos=wxPoint(224, 24),
              size=wxSize(75, 23), style=0)
        self.btId.Enable(False)
        EVT_BUTTON(self.btId, wxID_FRSALABTID, self.OnBtidButton)

        self.obj_spDificultad = wxSpinCtrl(id=wxID_FRSALAOBJ_SPDIFICULTAD,
              initial=50, max=100, min=0, name=u'obj_spDificultad',
              parent=self.panelObjetos, pos=wxPoint(256, 48), size=wxSize(48,
              21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.obj_spDificultad, wxID_FRSALAOBJ_SPDIFICULTAD,
              self.OnObj_spdificultadSpinctrl)
        EVT_KEY_UP(self.obj_spDificultad, self.OnObj_spdificultadSpinctrl)

        self.obj_spProbabilidad = wxSpinCtrl(id=wxID_FRSALAOBJ_SPPROBABILIDAD,
              initial=50, max=100, min=0, name=u'obj_spProbabilidad',
              parent=self.panelObjetos, pos=wxPoint(256, 80), size=wxSize(48,
              21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.obj_spProbabilidad, wxID_FRSALAOBJ_SPPROBABILIDAD,
              self.OnObj_spprobabilidadSpinctrl)
        EVT_KEY_UP(self.obj_spProbabilidad, self.OnObj_spprobabilidadSpinctrl)

        self.obj_btNew = wxButton(id=wxID_FRSALAOBJ_BTNEW, label=u'Nueva',
              name=u'obj_btNew', parent=self.panelObjetos, pos=wxPoint(40, 256),
              size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.obj_btNew, wxID_FRSALAOBJ_BTNEW, self.OnObj_btnewButton)

        self.obj_btDel = wxButton(id=wxID_FRSALAOBJ_BTDEL, label='Borrar',
              name=u'obj_btDel', parent=self.panelObjetos, pos=wxPoint(128,
              256), size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.obj_btDel, wxID_FRSALAOBJ_BTDEL, self.OnObj_btdelButton)

        self.obj_lbDescripcion = wxStaticText(id=wxID_FRSALAOBJ_LBDESCRIPCION,
              label=u'Descripcion', name=u'obj_lbDescripcion',
              parent=self.panelObjetos, pos=wxPoint(184, 128), size=wxSize(72,
              13), style=wxALIGN_RIGHT)

        self.obj_txDescripcion = wxTextCtrl(id=wxID_FRSALAOBJ_TXDESCRIPCION,
              name=u'obj_txDescripcion', parent=self.panelObjetos,
              pos=wxPoint(256, 124), size=wxSize(320, 21), style=0, value=u'')
        EVT_KEY_UP(self.obj_txDescripcion, self.OnObj_txdescripcionKeyUp)

        self.enc_spDificultad = wxSpinCtrl(id=wxID_FRSALAENC_SPDIFICULTAD,
              initial=0, max=100, min=0, name=u'enc_spDificultad',
              parent=self.panelEncuentros, pos=wxPoint(256, 48), size=wxSize(48,
              21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.enc_spDificultad, wxID_FRSALAENC_SPDIFICULTAD,
              self.OnEnc_spdificultadSpinctrl)
        EVT_KEY_UP(self.enc_spDificultad, self.OnEnc_spdificultadSpinctrl)

        self.enc_spProbabilidad = wxSpinCtrl(id=wxID_FRSALAENC_SPPROBABILIDAD,
              initial=0, max=100, min=0, name=u'enc_spProbabilidad',
              parent=self.panelEncuentros, pos=wxPoint(256, 96), size=wxSize(48,
              21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.enc_spProbabilidad, wxID_FRSALAENC_SPPROBABILIDAD,
              self.OnEnc_spprobabilidadSpinctrl)
        EVT_KEY_UP(self.enc_spProbabilidad, self.OnEnc_spprobabilidadSpinctrl)

        self.enc_btNew = wxButton(id=wxID_FRSALAENC_BTNEW, label=u'Nueva',
              name=u'enc_btNew', parent=self.panelEncuentros, pos=wxPoint(40,
              256), size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.enc_btNew, wxID_FRSALAENC_BTNEW, self.OnEnc_btnewButton)

        self.enc_btDel = wxButton(id=wxID_FRSALAENC_BTDEL, label='Borrar',
              name=u'enc_btDel', parent=self.panelEncuentros, pos=wxPoint(128,
              256), size=wxSize(75, 23), style=0)
        EVT_BUTTON(self.enc_btDel, wxID_FRSALAENC_BTDEL, self.OnEnc_btdelButton)

        self.spLuz = wxSpinCtrl(id=wxID_FRSALASPLUZ, initial=50, max=100, min=0,
              name=u'spLuz', parent=self.panel1, pos=wxPoint(384, 40),
              size=wxSize(48, 21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.spLuz, wxID_FRSALASPLUZ, self.OnSpluzSpinctrl)
        EVT_KEY_UP(self.spLuz, self.OnSpluzSpinctrl)

        self.spAura = wxSpinCtrl(id=wxID_FRSALASPAURA, initial=50, max=100,
              min=0, name=u'spAura', parent=self.panel1, pos=wxPoint(384, 72),
              size=wxSize(48, 21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.spAura, wxID_FRSALASPAURA, self.OnSpauraSpinctrl)
        EVT_KEY_UP(self.spAura, self.OnSpauraSpinctrl)

        self.spOcultabilidad = wxSpinCtrl(id=wxID_FRSALASPOCULTABILIDAD,
              initial=50, max=100, min=0, name=u'spOcultabilidad',
              parent=self.panel1, pos=wxPoint(384, 104), size=wxSize(48, 21),
              style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.spOcultabilidad, wxID_FRSALASPOCULTABILIDAD,
              self.OnSpocultabilidadSpinctrl)
        EVT_KEY_UP(self.spOcultabilidad, self.OnSpocultabilidadSpinctrl)

        self.des_spDificultad = wxSpinCtrl(id=wxID_FRSALADES_SPDIFICULTAD,
              initial=50, max=100, min=0, name=u'des_spDificultad',
              parent=self.panelDescripcion, pos=wxPoint(256, 56),
              size=wxSize(48, 21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.des_spDificultad, wxID_FRSALADES_SPDIFICULTAD,
              self.OnDes_spdificultadSpinctrl)
        EVT_TEXT_ENTER(self.des_spDificultad, wxID_FRSALADES_SPDIFICULTAD,
              self.OnDes_spdificultadSpinctrl)
        EVT_KILL_FOCUS(self.des_spDificultad, self.OnDes_spdificultadSpinctrl)
        EVT_KEY_UP(self.des_spDificultad, self.OnDes_spdificultadSpinctrl)

        self.sal_spDificultad = wxSpinCtrl(id=wxID_FRSALASAL_SPDIFICULTAD,
              initial=50, max=100, min=0, name=u'sal_spDificultad',
              parent=self.panelSalidas, pos=wxPoint(536, 32), size=wxSize(48,
              21), style=wxSP_ARROW_KEYS)
        EVT_SPINCTRL(self.sal_spDificultad, wxID_FRSALASAL_SPDIFICULTAD,
              self.OnSal_spdificultadSpinctrl)
        EVT_KEY_UP(self.sal_spDificultad, self.OnSal_spdificultadSpinctrl)

        self._init_coll_notebook1_Pages(self.notebook1)

    def __init__(self, parent):
        self._init_ctrls(parent)
        self.padre=parent
        self.intDescripcionSeleccionada = -1
        self.intSalidaSeleccionada = -1
        self.intObjetoSeleccionado = -1
        self.intEncuentroSeleccionado = -1
        #Inicializamos el comboBox de tipos y de subtipos
        self.cbTipo.Append('sin_tipo',["sin_subtipo"])
        for tipo in Sala.TIPOS_SALA:
            self.cbTipo.Append(tipo,Sala.TIPOS_SALA[tipo])
        
        self.cbTipo.SetSelection(self.cbTipo.FindString('sin_tipo'))
        self.cbSubtipo.SetSelection(self.cbSubtipo.FindString('sin_subtipo'))
              
        #variables que gestionan el estado de la sala
        #aun sin implementar su uso
        self.blModificado = False
        self.blNuevo = True

    def __actualizar_cbSubtipo(self):
        #recuperamos la lista de subtipos para ese tipo
        nTipoSel = self.cbTipo.GetSelection()
        subtipos = self.cbTipo.GetClientData(nTipoSel)
        for subtipo in subtipos:
            #Pegamos la lista de subtipos al combobox de subtipos
            self.cbSubtipo.Append(subtipo)
                
           
    def __actualizarDescripcion(self, des):
    #actualiza los controles del panel de descripción con la descripción dada
        # Por algún motivo esotérico, cuando la descripción es un poco larga
	# (puede que de más de 256 caracteres), al hacer SetValue el programa
	# casca con un core dump :-?. Sin embargo, si hacemos un SetValue
	# vacío y luego añadimos el texto con AppendText, funciona :-???
        self.des_txTexto.SetValue("")
        self.des_txTexto.AppendText(des["texto"])
        self.des_spDificultad.SetValue(des["dificultad"])

    def __actualizarComboDescripcion(self):
        #GPT añadido para cambio de implementación de las descripciones
        self.cbDescripcion.Clear()
        i = 0
        for des in self.sala.descripcion:
            self.cbDescripcion.Append("Descripcion" + `i`,des)
            i = i+1
        if self.cbDescripcion.GetCount() > 0:
            self.intDescripcionSeleccionada = 0
            self.cbDescripcion.SetSelection(0)
            self.__actualizarDescripcion(self.cbDescripcion.GetClientData(0))
        else:
            self.intDescripcionSeleccionada = -1
       
        
    def __limpiarDescripcion(self):
    #inicializa todos los campos de descripción borrando el contenido   
        self.des_txTexto.SetValue("")
        self.des_spDificultad.SetValue(0)
        #self.des_spBtDif.SetValue(0)
        #self.des_txDif.SetValue("0")
    
    def __actualizarComboSalidas(self):
        self.cbDireccion.Clear()        
        for sal in self.sala.salidas:
            self.cbDireccion.Append(sal["direccion"],sal)        
        if self.cbDireccion.GetCount() > 0:
            self.intSalidaSeleccionada = 0
            self.cbDireccion.SetSelection(0)
            self.__actualizar_sal(self.cbDireccion.GetClientData(0))
        else:
            self.intSalidaSeleccionada = -1
            
    def __actualizarComboObjetos(self):
        self.cbObjeto.Clear()
        for obj in self.sala.objetos:
            self.cbObjeto.Append(obj["id"],obj)
        if self.cbObjeto.GetCount() > 0:
            self.intObjetoSeleccionado = 0
            self.cbObjeto.SetSelection(0)
            self.__actualizarObjeto(self.cbObjeto.GetClientData(0))
        else:   
            self.intObjetoSeleccionado = -1
            self.obj_spDificultad.Enable = False
            self.obj_spProbabilidad.Enable = False
            self.obj_txMaximo.Enable = False
            self.obj_txCantidad.Enable = False
            self.obj_txDescripcion.Enable = False
            
    def __actualizarComboEncuentros(self):
        self.cbEncuentro.Clear()
        for enc in self.sala.encuentros:
            self.cbEncuentro.Append(enc["id"],enc)
        if self.cbEncuentro.GetCount() > 0:
            self.intEncuentroSeleccionado = 0
            self.cbEncuentro.SetSelection(0)
            self.__actualizarEncuentro(self.cbEncuentro.GetClientData(0))
        else:   
            self.intEncuentroSeleccionado = -1
            self.enc_spDificultad.Enable = False
            self.enc_spProbabilidad.Enable = False
            self.enc_txMaximo.Enable = False
            self.enc_txCantidad.Enable = False
            self.enc_txDescripcion.Enable = False
            
    
    def __actualizar_sal(self,sal):
        self.sal_txDescripcion.SetValue(sal["descripcion"])
        self.sal_spDificultad.SetValue(sal["dificultad"])
        self.sal_txId.SetValue(sal["id"])
        
            
    def __limpiar_sal(self):
        #self.cbDireccion.setValue("")
        self.sal_txDescripcion.SetValue("")
        self.sal_spDificultad.SetValue(0)
        self.sal_txId.SetValue("")
        #self.sal_cbTipoCierre.SetStringSelection("")
        #self.sal_txDatosCierre.SetValue(sal["datos_cierre"])
        #self.sal_txMensajeCerrado.SetValue(sal["mensaje_cerrado"])        
  
    def __actualizarObjeto(self,obj):
        self.obj_spDificultad.SetValue(obj["dificultad"])
        self.obj_spProbabilidad.SetValue(obj["probabilidad"])
        self.obj_txMaximo.SetValue(`obj["maximo"]`)
        self.obj_txCantidad.SetValue(`obj["cantidad"]`)
        self.obj_txDescripcion.SetValue(obj["descripcion"])
        self.obj_spDificultad.Enable = True
        self.obj_spProbabilidad.Enable = True
        self.obj_txMaximo.Enable = True
        self.obj_txCantidad.Enable = True        
     
    def __limpiarObjeto(self):
        self.obj_spDificultad.SetValue(0)
        self.obj_spProbabilidad.SetValue(0)
        self.obj_txMaximo.SetValue("1")
        self.obj_txCantidad.SetValue("1")
        self.obj_txDescripcion.SetValue("")

    def __actualizarEncuentro(self,enc):
        self.enc_spDificultad.SetValue(enc["dificultad"])
        self.enc_spProbabilidad.SetValue(enc["probabilidad"])
        self.enc_txMaximo.SetValue(`enc["maximo"]`)
        self.enc_txCantidad.SetValue(`enc["cantidad"]`)
        self.enc_txDescripcion.SetValue(enc["descripcion"])
        self.enc_spDificultad.Enable = True
        self.enc_spProbabilidad.Enable = True
        self.enc_txMaximo.Enable = True
        self.enc_txCantidad.Enable = True
        self.enc_txDescripcion.Enable = True        
     
    def __limpiarEncuentro(self):
        self.enc_spDificultad.SetValue(0)
        self.enc_spProbabilidad.SetValue(0)
        self.enc_txMaximo.SetValue("1")
        self.enc_txCantidad.SetValue("1")
        self.enc_txDescripcion.SetValue("")
       
    def SetFile(self,filename):
        #Carga un fichero de Sala y rellena todos los controles con la información
        try:
	    if len(filename) > 0:
                self.sala=SalaEditable.nueva_xml(filename)
                self.blNuevo = False
	    else:
		self.sala=SalaEditable.nueva_vacia()
                self.blNuevo = True

            #self.cbTipo.Clear()
     
            #---------------------------------------------
            # Controles de propiedades generales de la sala
            #-----------------------------------------------
            self.SetTitle("Mardertan: "+self.sala.id)
	    self.txId.SetValue(self.sala.id.split('-')[1])
            self.txNombre.SetValue(self.sala.nombre)
            self.txAutor.SetValue(self.sala.autor)
            self.txArea.SetValue(self.sala.area)
            self.txId.Enable(False)
            self.txArea.Enable(False)
            self.btId.Enable(True)
            self.txComentario.SetValue(self.sala.comentario)
            self.txVolumen.SetValue(`self.sala.volumen`)               
            self.spLuz.SetValue(self.sala.luz)
            self.spAura.SetValue(self.sala.aura)
            self.spOcultabilidad.SetValue(self.sala.ocultabilidad)
            
            self.rbCombate.SetStringSelection(self.sala.combate)
            self.cbTipo.SetSelection(self.cbTipo.FindString(self.sala.tipo))
            
            self.__actualizar_cbSubtipo()
            #posibles errores si no se encuentra el valor adecuado pq se introdujo mal
            self.cbSubtipo.SetSelection(self.cbSubtipo.FindString(self.sala.subtipo))
            #self.cbSubtipo.SetStringSelection(self.sala.subtipo)
    
            #Rellenamos los combobox de las descripciones, Salidas, Objetos y encuentros
           
           ####################
           #Eliminado para cambio de implementación de las descripciones
           # i = 0
           # for des in self.sala.descripcion:
           #     self.cbDescripcion.Append("Descripcion" + `i`,des)
           #     i = i+1
           # 
           # if self.cbDescripcion.GetCount() > 0:
           #    des = self.cbDescripcion.GetClientData(0)
           #    self.__actualizarDescripcion(des)
	   # else:
		#self.des_txTexto.SetValue("")
                #self.des_spDificultad.SetValue(0)
            self.__actualizarComboDescripcion()
            self.__actualizarComboSalidas()
            self.__actualizarComboObjetos()
            self.__actualizarComboEncuentros()

        finally:
            pass
            """
            except xmlerrores.SAXParseException, mensaje_error:
            sin controlar todavía
            self.res.configure(text="El fichero que intentabas abrir tiene un error sintáctico \nen la línea "+str(mensaje_error._linenum)+', carácter '+str(mensaje_error._colnum)+". Por favor, revísalo.",justify=LEFT)"""
    
    #horroroso, hay que remodelarlo entero, pero por ahora funciona...
    def guardar(self):
        ZonaError = 'ZonaError'
        SalaError = 'SalaError'
        log.debug("Probando el guardar en " + self.GetTitle())
        try:
            log.debug('Antes de añadir sala por primera vez')
            self.padre.frArb.addSala(self.sala.area,self.sala.id.split('-')[1])
           
        except ZonaError:
            #no existe esa zona 
            #mensaje preguntando
            caption = 'Guardar Sala'
            mensaje = 'La zona ' + self.sala.area + ' no existe\n'
            mensaje = mensaje + '¿Desea crearla?'
            dlg = wxMessageDialog(self, mensaje,
                             caption, wxYES_NO | wxICON_EXCLAMATION )
            try:
                respuesta=dlg.ShowModal()
                if respuesta==wxID_YES:
                    #log.debug('Añadimos la zona')
                    self.padre.frArb.addZona(self.sala.area)
                    directorio = os.path.join(Sala.DIR_DESC_SALAS, self.sala.area)
                    #se crea el directorio físico. 
                    #Quizás hacer la creacion del directorio sea algo del arbol
                    #en el addZona
                    os.mkdir(directorio)           
                    #log.debug('Añadimos la sala')
                    self.sala.salvar() #antes por si da error                    
                    self.padre.frArb.addSala(self.sala.area,self.sala.id.split('-')[1])
                    
                else:
                    #log.debug('Ha pinchado en no') 
                    pass    
            finally:
                dlg.Destroy()
        except SalaError:
                #la sala existe (y la zona tb)
                #se puede preguntar si se desea sobreescribir...
                #por ahora no se implementa
                self.sala.salvar()
        else:     #del try   
            #la zona existe pero la sala en esa zona no
            self.sala.salvar()        
        
        self.SetTitle((self.GetTitle()).replace("*",""))
        self.blModificado = False
        self.blNuevo = False
        self.txId.Enable(False)
        self.txArea.Enable(False)
        self.btId.Enable(True)
    
    def borrar(self):
        ZonaError = 'ZonaError'
        #mensaje preguntando
        caption = 'Borrar Sala'
        mensaje = '¿Desea borrar la sala ' + self.sala.id + ' ?'
        dlg = wxMessageDialog(self, mensaje,
                             caption, wxYES_NO | wxICON_QUESTION  )
        try:
            respuesta=dlg.ShowModal()
            if respuesta==wxID_YES:
                try:
                    self.padre.frArb.removeSala(self.sala.area,self.sala.id.split('-')[1])
                    os.remove(os.path.join(Sala.DIR_DESC_SALAS,self.sala.area,self.sala.id + Sala.EXT_DESC_SALAS ))
                    #self.__init__(self.padre)
                    self.setFile("")
                except ZonaError:
                    #No debería darse cuando todo esté bien gestionado
                    pass
            else:
                #log.debug('Ha pinchado en no') 
                pass    
        finally:
            dlg.Destroy()        
    
    def cerrar(self):
        if self.blModificado == true:
            mensaje= 'Hay datos no guardados. Si cierra la sala los perderá.\n'         
            mensaje= mensaje + '¿Desea continuar?'
            caption= 'Cerrar Sala'
            dlg = wxMessageDialog(self, mensaje,
                                 caption, wxYES_NO | wxICON_EXCLAMATION )
            try:
                respuesta=dlg.ShowModal()
                if respuesta==wxID_YES:
                    self.Destroy()
                    devolver = True
                else:
                    devolver = False
                    pass
            finally:
                dlg.Destroy()            

        else:
            self.Destroy()
            devolver = True                    
        return devolver

    def modificado(self):
        if self.blModificado == False:
            self.blModificado = True
            self.SetTitle("*"+"Mardertan: "+self.sala.id +"*")
            #poner aqui el código necesario para habilitar /deshabilitar items de menu del padre
                    
    #Control de eventos
    
    #Propiedades generales de la sala
    
    #boton de cambiar ID
    def OnBtidButton(self, event):
        mensaje= 'Si cambia el ID de la sala, se creará una sala nueva con ' 
        mensaje= mensaje + 'ese ID sin borrarse la antigua (si existiera)\n'
        mensaje= mensaje + '¿Desea continuar?'
        caption= 'cambiar ID'
        dlg = wxMessageDialog(self, mensaje,
                             caption, wxYES_NO | wxICON_EXCLAMATION )
        try:
            respuesta=dlg.ShowModal()
            if respuesta==wxID_YES:
                self.txId.Enable(True)
                self.txArea.Enable(True)
                self.btId.Enable(False)                
            else:
                pass
        finally:
            dlg.Destroy()
        event.Skip()

    
    # Gestión de los eventos de perder el foco y enter de las características
    # de la sala
    def OnTxidTextEnter_KillFocusEvent(self, event):
        #evento cuando se modifica el valor del campo txid ya sea por un Enter
        #o por perder el foco
        #if self.sala.id <> self.txId.GetValue():
        #    self.sala.id = self.txArea.GetValue() + '-' + self.txId.GetValue()
        #    self.blNuevo = True            
        #    self.SetTitle("Mardertan: "+self.sala.id)
        #    self.modificado()            
        event.Skip()
     
    def OnTxareaTextEnter_KillFocusEvent(self, event):
        #if self.sala.area <> self.txArea.GetValue():
        #    self.sala.area =self.txArea.GetValue()
        #    self.sala.id = self.txArea.GetValue() + '-' + self.txId.GetValue()
        #    self.blNuevo = True            
        #    self.SetTitle("Mardertan: "+self.sala.id)
        #    self.modificado()
        event.Skip()

    def OnTxareaKeyUp(self, event):
        if self.sala.area <> self.txArea.GetValue():
            self.sala.area =self.txArea.GetValue()
            self.sala.id = self.txArea.GetValue() + '-' + self.txId.GetValue()
            self.blNuevo = True            
            self.SetTitle("*Mardertan: "+self.sala.id+"*")            
            self.blModificado = True
            #self.modificado()
        event.Skip()

    def OnTxidKeyUp(self, event):
        if self.sala.id <> self.txId.GetValue():
            self.sala.id = self.txArea.GetValue() + '-' + self.txId.GetValue()
            self.blNuevo = True            
            self.SetTitle("*Mardertan: "+self.sala.id+"*")            
            self.blModificado = True
            #self.modificado()
        event.Skip()
       
    def On_KillFocusEvent(self,event):
        if event.target.name in ['txAutor', 'txNombre', 'txComentario', 'txVolumen']:
            CONTROLES_SALA[event.target.name] = event.target.text
                   
    def OnTxautorKeyUp(self, event):
        self.sala.autor = self.txAutor.GetValue()
        self.modificado()
        event.Skip()   
   

    def OnTxnombreKeyUp(self, event):
        self.sala.nombre = self.txNombre.GetValue()
        self.modificado()
        event.Skip()


    def OnTxcomentarioKeyUp(self, event):
        self.sala.comentario = self.txComentario.GetValue()
        self.modificado()
        event.Skip()


    def OnTxvolumenKeyUp(self, event):
        self.sala.volumen= self.txVolumen.GetValue()
        self.modificado()
        event.Skip()
                    
    def OnCbtipoCombobox(self, event):
        #gestionamos el cambio de valores del tipo. Cuando éste cambia debemos de
        #cambiar la lista de valores del subtipo, siempre y cuando no se selecione
        #sin tipo
        #miramos si ha cambiado el tipo
        tipoSel = self.cbTipo.GetStringSelection()
        if self.sala.tipo <> tipoSel:
            #limpiamos el subtipo
            self.cbSubtipo.Clear()
            #añadimos el subtipo base "sin_subtipo"
            self.cbSubtipo.Append('sin_subtipo')
            if tipoSel <> 'sin_tipo':            
                self.__actualizar_cbSubtipo()
                
            #seleccionamos el valor "sin_subtipo" por claridad
            self.cbSubtipo.SetSelection(self.cbSubtipo.FindString('sin_subtipo'))
            #self.cbSubtipo.SetStringSelection('sin_subtipo')
            #actualizamos la variable del tipo al valor del control
            self.sala.tipo = tipoSel
            
            self.modificado()
        event.Skip()

    def OnCbsubtipoCombobox(self, event):
        self.sala.subtipo = self.cbSubtipo.GetStringSelection()
        self.modificado()
        event.Skip()
    
    def OnSpluzSpinctrl(self, event):        
        self.sala.luz = int(self.spLuz.GetValue())
        self.modificado()
        event.Skip()

    def OnSpauraSpinctrl(self, event):
        self.sala.aura = int(self.spAura.GetValue())
        self.modificado()
        event.Skip()

    def OnSpocultabilidadSpinctrl(self, event):
        self.sala.ocultabilidad = int(self.spOcultabilidad.GetValue())
        self.modificado()
        event.Skip()
   
    def OnRbcombateRadiobox(self, event):
        self.sala.combate = self.rbCombate.GetStringSelection()        
        self.modificado()
        event.Skip()
    
    #pestaña de la descripcion   
    #Evento para el comboBox de la descripción, él rellena el resto
 #Cambio en el tratamiento de la descripcion    
    #def OnCbdescripcionCombobox(self, event):
    #    if self.cbDescripcion.GetCount() > 0:
#	    sel=self.cbDescripcion.GetSelection()
#	    des=self.cbDescripcion.GetClientData(sel)
#	    self.__actualizarDescripcion(des)
#	else:
#	    self.des_txTexto.SetValue("")
#	    self.des_spDificultad.SetValue(0)
#        event.Skip()    

    def OnCbdescripcionCombobox(self, event):
        sel=self.cbDescripcion.GetSelection()
        des=self.cbDescripcion.GetClientData(sel)
        self.__actualizarDescripcion(des)
        self.intDescripcionSeleccionada = sel
        event.Skip()
            
     
    def OnDes_spdificultadSpinctrl(self, event):
        sel=self.cbDescripcion.GetSelection()
        des=self.cbDescripcion.GetClientData(sel)
        des["dificultad"]=int(self.des_spDificultad.GetValue())
        self.modificado()
        event.Skip()

            
    def OnDes_TxdifKillFocus(self, event):
        dif = int(self.des_txDif.GetValue())
        #recuperamos el objeto descripción que está mostrando ahora mismo en 
        #el combobox
        sel=self.cbDescripcion.GetSelection()
        des=self.cbDescripcion.GetClientData(sel)   
        #miramos si el valor ha sido modificado
        if des["dificultad"] <> dif:
            self.des_spBtDif.SetValue(dif)              
            #actualizamos la variable
            des["dificultad"] = dif
            self.modificado()
        event.Skip()
    
    def OnDes_TxtextoTextEnter_KillFocusEvent(self, event):
        #recuperamos el objeto descripción que está mostrando ahora mismo en 
        #el combobox
        try:
            texto = self.des_txTexto.GetValue()
            sel=self.cbDescripcion.GetSelection()
            des=self.cbDescripcion.GetClientData(sel)
            #miramos si el valor ha cambiado, si es así actualizamos la variable
            if des["texto"] <> texto:
                des["texto"] = texto
                self.modificado()
        except:
            pass
        event.Skip()
    
    def OnDes_txtextoKeyUp(self, event):
        #recuperamos el objeto descripción que está mostrando ahora mismo en 
        #el combobox
        try:
            texto = self.des_txTexto.GetValue()
            sel=self.cbDescripcion.GetSelection()
            des=self.cbDescripcion.GetClientData(sel)
            des["texto"] = texto
            self.modificado()
        except:
            pass
        event.Skip()
    
    def OnDes_btnewButton(self, event):
        des = self.sala.add_descripcion(0,"",None)
        self.modificado()
        self.__limpiarDescripcion()
        self.cbDescripcion.Append("Descripcion"+str(self.cbDescripcion.GetCount()),des)        
        self.cbDescripcion.SetSelection(self.cbDescripcion.GetCount()-1)
        event.Skip()

    def OnDes_btdelButton(self, event):
        #Mostrar un mensaje preguntando
        msg = '¿Desea borrar la descripción?'
        caption= 'Borrar Descripción'
        dlg = wxMessageDialog(self, msg, caption, wxYES_NO | wxICON_EXCLAMATION )
        try:
            respuesta=dlg.ShowModal()        
            if respuesta==wxID_YES:            
                #recuperamos el objeto descripción que está mostrando ahora 
                #mismo en el combobox
                sel=self.cbDescripcion.GetSelection()
                des=self.cbDescripcion.GetClientData(sel)
                #borramos la descripción
                self.sala.borrar_descripcion(des)
                self.modificado()
                self.cbDescripcion.Delete(sel)
                try:
                    self.cbDescripcion.SetSelection(0)                  
                    des = self.cbDescripcion.GetClientData(0)
                    self.__actualizarDescripcion(des)
                #si nos encontramos con una excepción es que no hay datos
                except:                
                    self.__limpiarDescripcion()                                      
        finally:
            dlg.Destroy()
    
    #pestaña de las salidas    
    def OnCbdireccionCombobox(self, event):
        sel=self.cbDireccion.GetSelection()
        sal=self.cbDireccion.GetClientData(sel)        
        self.__actualizar_sal(sal)
        self.intSalidaSeleccionada = sel
        event.Skip()
     
    def OnCbdireccionKillFocus(self, event):        
        if self.intSalidaSeleccionada <> -1:
            sal=self.cbDireccion.GetClientData(self.intSalidaSeleccionada)
            if sal["direccion"] <> self.cbDireccion.GetValue():
                sal["direccion"]=self.cbDireccion.GetValue()
                self.modificado()
                self.__actualizarComboSalidas()
                self.cbDireccion.SetSelection(self.intSalidaSeleccionada)
        event.Skip()          

    def OnSal_spdificultadSpinctrl(self, event):
        sal=self.cbDireccion.GetClientData(self.intSalidaSeleccionada)
        sal["dificultad"] = self.sal_spDificultad.GetValue()
        self.modificado()
        event.Skip()

    
    def OnSal_txdescripcionKeyUp(self, event):
        sal=self.cbDireccion.GetClientData(self.intSalidaSeleccionada)
        sal["descripcion"] = self.sal_txDescripcion.GetValue() 
        self.modificado()
        event.Skip()

    def OnSal_txidKeyUp(self, event):
        sal=self.cbDireccion.GetClientData(self.intSalidaSeleccionada)
        sal["id"]=self.sal_txId.GetValue()
        self.modificado()
        event.Skip()

   
    def OnSal_btnewButton(self, event):
        #add_salida(self,direccion,dif,id,desc,tipo_cierre,datos_cierre,mensaje_cerrado, personaje_mira, personaje_cruza)
        sal = self.sala.add_salida("Direccion",0,"","","","","","","")
        self.modificado()
        self.__limpiar_sal()
        self.cbDireccion.Append("Direccion",sal)
        self.cbDireccion.SetSelection(self.cbDireccion.GetCount()-1)
        event.Skip()

    def OnSal_btdelButton(self, event):
        #Mostrar un mensaje preguntando
        msg = '¿Desea borrar la salida?'
        caption= 'Borrar Salida'
        dlg = wxMessageDialog(self, msg, caption, wxYES_NO | wxICON_EXCLAMATION )
        try:
            respuesta=dlg.ShowModal()        
            if respuesta==wxID_YES:            
                #recuperamos el objeto salida que está mostrando ahora 
                #mismo en el combobox
                sel=self.cbDireccion.GetSelection()
                sal=self.cbDireccion.GetClientData(sel)
                #borramos la Salida
                self.sala.borrar_salida(sal)
                self.modificado()
                #self.cbDireccion.Delete(sel)
                self.__actualizarComboSalidas()
                try:
                    self.cbDireccion.SetSelection(0)                  
                    log.debug("Despues del set selection")
                    sal = self.cbDireccion.GetClientData(0)
                    log.debug("Despues del getclientdata")
                    self.__actualizar_sal(sal)
                    log.debug("Despues del actualizar sala")
                #si nos encontramos con una excepción es que no hay datos
                except:
                    log.debug("Excepcion en la sala")
                    self.__limpiar_sal()                                      
        finally:
            dlg.Destroy()       
        event.Skip()
    
    #pestaña de los objetos
    def OnCbobjetoCombobox(self, event):
        sel=self.cbObjeto.GetSelection()
        obj=self.cbObjeto.GetClientData(sel)
        self.__actualizarObjeto(obj)
        self.intObjetoSeleccionado = sel
        event.Skip()
       
    def OnCbobjetoKillFocus(self, event):
        if self.intObjetoSeleccionado <> -1:
            obj=self.cbObjeto.GetClientData(self.intObjetoSeleccionado)
            if obj["id"] <> self.cbObjeto.GetValue():
                obj["id"]=self.cbObjeto.GetValue()
                self.modificado()
                self.__actualizarComboObjetos()
                self.cbObjeto.SetSelection(self.intObjetoSeleccionado)
        event.Skip()      

    def OnObj_txdescripcionKeyUp(self, event):
        obj=self.cbObjeto.GetClientData(self.intObjetoSeleccionado)
        obj["descripcion"]=self.obj_spDificultad.GetValue()
        self.modificado()
        event.Skip()

    def OnObj_spdificultadSpinctrl(self, event):
        obj=self.cbObjeto.GetClientData(self.intObjetoSeleccionado)
        obj["dificultad"]=int(self.obj_spDificultad.GetValue())
        self.modificado()
        event.Skip()

    def OnObj_spprobabilidadSpinctrl(self, event):
        obj=self.cbObjeto.GetClientData(self.intObjetoSeleccionado)
        obj["probabilidad"]=int(self.obj_spProbabilidad.GetValue())
        self.modificado()
        event.Skip()
 
    def OnObj_txcantidadKeyUp(self, event):
        obj=self.cbObjeto.GetClientData(self.intObjetoSeleccionado)
        obj["cantidad"] = int(self.obj_txCantidad.GetValue())
        self.modificado()
        event.Skip() 
    
    def OnObj_txmaximoKeyUp(self, event):
        obj=self.cbObjeto.GetClientData(self.intObjetoSeleccionado)
        obj["maximo"] = int(self.obj_txMaximo.GetValue())
        self.modificado()
        event.Skip()
    
    def OnObj_btnewButton(self, event):
        # def add_objeto(self,id,probabilidad,maximo,dificultad,cantidad,descripcion):
        obj = self.sala.add_objeto("Objeto",0,1,0,1,"","")
        self.modificado()
        self.__limpiarObjeto()
        self.cbObjeto.Append("Objeto",obj)
        self.intObjetoSeleccionado = self.cbObjeto.GetCount()-1
        self.cbObjeto.SetSelection(self.intObjetoSeleccionado)        
        event.Skip()

    def OnObj_btdelButton(self, event):
        #Mostrar un mensaje preguntando
        msg = '¿Desea borrar el Objeto?'
        caption= 'Borrar Objeto'
        dlg = wxMessageDialog(self, msg, caption, wxYES_NO | wxICON_EXCLAMATION )
        try:
            respuesta=dlg.ShowModal()        
            if respuesta==wxID_YES:            
                #recuperamos el objeto objeto que está mostrando ahora 
                #mismo en el combobox
                sel=self.cbObjeto.GetSelection()
                obj=self.cbObjeto.GetClientData(sel)
                #borramos el objeto
                self.sala.borrar_objeto(obj)
                self.modificado()
                #self.cbDireccion.Delete(sel)
                self.__actualizarComboObjetos()
                try:
                    self.cbObjeto.SetSelection(0)                  
                    obj = self.cbObjeto.GetClientData(0)
                    self.__actualizarObjeto(obj)
                #si nos encontramos con una excepción es que no hay datos
                except:
                    self.__limpiarObjeto()                                      
        finally:
            dlg.Destroy()       
        event.Skip() 
    
    #pestaña de los encuentros
    def OnCbencuentroCombobox(self, event):
        sel=self.cbEncuentro.GetSelection()
        enc=self.cbEncuentro.GetClientData(sel)
        self.__actualizarEncuentro(enc)
        self.intEncuentroSeleccionado = sel
        event.Skip()
        
    def OnCbencuentroKillFocus(self, event):
        if self.intEncuentroSeleccionado <> -1:
            enc=self.cbEncuentro.GetClientData(self.intEncuentroSeleccionado)
            if enc["id"] <> self.cbEncuentro.GetValue():
                enc["id"]=self.cbEncuentro.GetValue()
                self.modificado()
                self.__actualizarComboEncuentros()
                self.cbEncuentro.SetSelection(self.intEncuentroSeleccionado)
        event.Skip()        
   
    def OnEnc_txdescripcionKeyUp(self, event):
        enc=self.cbObjeto.GetClientData(self.intEncuentroSeleccionado)
        enc["descripcion"] = self.enc_txDescripcion.GetValue()
        self.modificado()
        event.Skip()

    def OnEnc_spdificultadSpinctrl(self, event):
        enc=self.cbEncuentro.GetClientData(self.intEncuentroSeleccionado)
        enc["dificultad"]=int(self.enc_spDificultad.GetValue())
        self.modificado()
        event.Skip()
    
    def OnEnc_spprobabilidadSpinctrl(self, event):
        enc=self.cbObjeto.GetClientData(self.intEncuentroSeleccionado)
        enc["probabilidad"]=int(self.enc_spProbabilidad.GetValue())
        self.modificado()
        event.Skip()
    
    def OnEnc_txcantidadKeyUp(self, event):
        enc=self.cbObjeto.GetClientData(self.intEncuentroSeleccionado)
        enc["cantidad"] = int(self.enc_txCantidad.GetValue())
        self.modificado()
        event.Skip()  
     
    def OnEnc_txmaximoKeyUp(self, event):
        enc=self.cbEncuentro.GetClientData(self.intEncuentroSeleccionado)
        enc["maximo"] = int(self.enc_txMaximo.GetValue())
        self.modificado()
        event.Skip()
    
    def OnEnc_btnewButton(self, event):
        #add_encuentro(self,id,max,prob,dif,des,cantidad):
        enc = self.sala.add_encuentro("Encuentro",1,0,0,"",1)
        self.modificado()
        self.__limpiarEncuentro()
        self.cbEncuentro.Append("Encuentro",enc)
        self.intEncuentroSeleccionado = self.cbEncuentro.GetCount()-1
        self.cbEncuentro.SetSelection(self.intEncuentroSeleccionado)        
        event.Skip()

    def OnEnc_btdelButton(self, event):
        #Mostrar un mensaje preguntando
        msg = '¿Desea borrar el Encuentro?'
        caption= 'Borrar Encuentro'
        dlg = wxMessageDialog(self, msg, caption, wxYES_NO | wxICON_EXCLAMATION )
        try:
            respuesta=dlg.ShowModal()        
            if respuesta==wxID_YES:            
                #recuperamos el objeto objeto que está mostrando ahora 
                #mismo en el combobox
                sel=self.cbEncuentro.GetSelection()
                enc=self.cbEncuentro.GetClientData(sel)
                #borramos el objeto
                self.sala.borrar_encuentro(enc)
                self.modificado()
                self.__actualizarComboEncuentros()
                try:
                    self.cbEncuentro.SetSelection(0)                  
                    enc = self.cbEncuentro.GetClientData(0)
                    self.__actualizarObjeto(enc)
                #si nos encontramos con una excepción es que no hay datos
                except:
                    self.__limpiarEncuentro()                                      
        finally:
            dlg.Destroy()       
        event.Skip() 


    def OnFrsalaClose(self, event):
        self.cerrar()
        #event.Skip()

   

