Next: 3.8.2 La inserción de
Up: 3.8 El comportamiento del
Previous: 3.8 El comportamiento del
En la interacción del usuario con el editor se pueden distinguir los
dos casos siguientes:
- Cuando se ha cargado un texto y éste aún no ha sido
analizado, el usuario puede modificar libremente el texto para
proceder cuando estime conveniente a realizar un análisis
léxico-sintáctico. En este caso la intervención de las funciones
propias de ICEeditor es escasa, confiando en los métodos
predefinidos para las instancias de textedit, los cuales
permiten realizar las operaciones convencionales de edición de texto simple.
- Cuando en el editor hay un texto que ya ha sido analizado, todas
las alteraciones que se intenten realizar sobre él serán filtradas
por las funciones especiales definidas en ICEeditor.
El interés de esta sección se centra en el segundo caso,
naturalmente, puesto que es el que está directamente relacionado con
el mantenimineto de la consistencia entre la información de
análisis y el texto del editor y en la que están involucradas las
capacidades incrementales del analizador subyacente.
El usuario puede interactuar con todos los elementos que constituyen
ICEeditor en cualquier orden. Para determinar cuándo se deben
activar las funciones propias del editor se deben capturar los eventos
de ratón.
El siguiente fragmento de código captura los eventos producidos por
la pulsación del botón izquierdo del ratón en el editor:
(te-set-local-binding texteditor 'down0 'modify-parsered-text)
La función modify-parsered-text toma como argumento una
instancia de un objeto {textedit} y realiza las siguientes
acciones:
- Terminar la operación de edición anterior.
- Obtener la posición (en caracteres) en la que se pulsó el
ratón sobre el texto.
- Buscar el componente léxico cuyo texto está situado más cerca de dicha
posición.
- Se comprueba que dicho componente léxico no había sido borrrado con
enterioridad, en cuyo caso se emite una advertencia
sonora
.
- Si dicho componente léxico no había sido previamente borrado, entonces
se establecen adecuadamente los valores de las variables de
operación, dependiendo del tipo de opración que se vaya a realizar:
- Inserción
- Se establece el texto inicial de la operación
a la cadena nula y el nuevo texto al valor ()
.
- Se sitúan los cursores #:ICEeditor:te-begin-op-cursor
y #:ICEeditor:
te-end-op-cursor
y el cursor de inserción del editor al principio del texto
correspondiente al componente léxico
.
- Se calcula la distancia horizontal y vertical
existente entre el primer carácter y el último del componente léxico
señalado por el usuario al pulsar con el ratón
.
- Se establece a cero la longitud del texto incluido inicialmente
en la operación, mediante la
asignación de este valor a la variable #:ICEeditor:te-op-length.
- Se cambia la forma del cursor del editor al valor
contenido en
#:ICEeditor:cursor-for-insert.
- Borrado
- Se establece como texto inicial el texto
almacenado en la TTLT y como texto final la cadena vacía.
- La longitud de la operación se toma de la
longitud del texto del componente léxico.
- Se utiliza la selección
#:ICEeditor:te-delete-sel para resaltar el texto borrado.
- La foma del cursor se cambia al valor almacenado
en #:ICEeditor:
cursor-for-delete.
- Modificación
- Se establece el texto inicial de la operación
como el texto almacenado en la TTLT. Esta es una acción correcta
aunque se realicen múltiples modificaciones de un mismo componente léxico,
puesto que en el parser incremental se parte del texto utilizado en el
análisis anterior.
- Se establce el texto final al valor ()
para indicar que no se ha establecido aún ningún valor para esta
variable. No se puede utilizar la cadena vacía por las mismas
razones expuestas en el caso de la
inserción.
- Se sitúa el cursor
#:ICEeditor:te-begin-op-cursor en la posición inicial del texto
correspondiente al componente léxico.
- Se sitúa el cursor
#:ICEeditor:te-end-op-cursor en la posición siguiente al último
carácter del texto del componente léxico.
- Se almacena el desplazamiento horizontal y
vertical existente entre el primer carácter y el último en las
variables #:ICEeditor:te-end-item-x y
#:ICEeditor:te-end-item-y, respectivamente.
- Se establece la longitud de la operación a la
longitud del componente léxico.
- Se incluye en la selección
#:ICEeditor:te-modify-sel el texto actual del componente léxico.
- Se cambia la forma del cursor a la almacenada en
#:ICEeditor:
te-cursor-for-modify.
- información
- Se incluye dentro de la selección
#:ICEeditor:te-info-sel el texto del componente léxico señalado por el
usuario, para que aparezca resaltado en las fuentes y colores
correspondientes a la operación de información.
- Se muestra al usuario una ventana con los datos
relevantes del componente léxico.
- Se elimina el texto de la
selección
.
- Se cambia la forma del cursor a
#:ICEeditor:cursor-for-info.
- Se almacena en un array asignado a la variable #:ICEeditor:current-op
la siguiente información que será
utilizada por las otras funciones que tratan con la edición
interactiva de componentes léxicos:
- El número del componente léxico.
- Las coordenadas horizontal y vertical de inicio del
testo del componente léxico.
- El texto inicial del componente léxico.
- El texto final del componente léxico
.
- Se utiliza la forma funcall para realizar una llamada a la
función normal utilizada en los editores textedit cuando
tiene lugar un evento provocado por la pulsación del botón izquierdo
del ratón.
Con ello se consigue establecer toda la información
necesaria para tratar correctamente el proceso de edición de los
componentes léxicos. Dicho proceso consta de dos operaciones básicas:
- La inserción de caracteres en el texto de un componente léxico.
- El borrado de caracteres de un componente léxico, sean éstos de los
originales del componente léxico o de los insertados posteriormente.
Next: 3.8.2 La inserción de
Up: 3.8 El comportamiento del
Previous: 3.8 El comportamiento del
Miguel A. Alonso Pardo
Thu Nov 20 16:47:01 CET 1997