This is an archived page. It's not actively maintained.

Actualizar comandos

 

En esta secci贸n veremos como actualizar comandos.

Invocando comandos

Si un comando tiene un atributo oncommand, podemos invocarlo simplemente usando el m茅todo doCommand del comando o de un elemento vinculado a 茅l. Para otros comandos, necesitaremos usar un par de l铆neas de c贸digo. Necesitamos usar estos pasos adicionales cuando invocamos comandos implementados por un controlador. Adem谩s, tendremos que hacerlo cuando creemos nuestros comandos de men煤, por ejemplo para implementar los comandos del men煤 editar en nuestra aplicaci贸n.

Afortunadamente, el c贸digo extra es bastante simple. Todo lo que necesitamos hacer es obtener el controlador y llamar al comando. Un forma sencilla de hacerlo es la siguiente:

var controlador = document.commandDispatcher.getControllerForCommand("cmd_paste");
if (controlador && controlador.isCommandEnabled("cmd_paste"))
  controlador.doCommand(command);
}

El c贸digo mostrado arriba primero obtiene el controlador para comando 鈥榗md_paste鈥 del despachador de comandos. Entonces comprueba que el comando esta habilitado y lo ejecuta usando el m茅todo doCommand. Hay que fijarse en que no hace falta adivinar que elemento o controlador usar, el despachador de comandos hace esa faena por nosotros. Tamb铆en podr铆amos ejecutar el m茅todo doCommand sin comprobar si el comando est谩 habilitado o no, aunque mejor no hacerlo.

El c贸digo de arriba es lo suficientemente gen茅rico como para crear una funci贸n que tome un parametro, comando, y lo ejecute. Esta funci贸n podr铆a entonces ser reusada para todos los comandos. De hecho, esto es tan com煤n que Mozilla incluye una librer铆a que hace justo esto. S铆 incluyes el gui贸n 鈥chrome://global/content/globalOverlay.js鈥 en un archivo XUL, puede llamar el m茅todo goDoCommand que ejecutar谩 el comando que se le pase como parametro. El c贸digo para esa funci贸n son simplemente unas pocas l铆neas, as铆 que podemos incluirla directamente en nuestro c贸digo si por alguna raz贸n no queremos incluir la librer铆a.

<script src="chrome://global/content/globalOverlay.js"/>

<command id="cmd_paste" oncommand="goDoCommand('cmd_paste');/>
<button label="Pegar" command="cmd_paste"/>

Este ejemplo implementa un bot贸n Pegar. Est谩 vinculado con un comando que a su vez invoca ese mismo comando para que lo gestione el controlador por defecto. Este c贸digo es todo lo que se necesita para implementar la funcionalidad del comando pegar en nuestra aplicaci贸n. La 煤nica cosa que nos falta es asegurarnos de que el comando pegar, y por ende el bot贸n, este habilitado y se actualize en el momento oportuno, lo que se describe a continuaci贸n.

Actualizadores de comandos

Un actualizador de comandos es una caracter铆stica extra del elemento commandset, que nos permite actualizar el estado de uno o m谩s comandos cuando ciertos eventos ocurren. Necesitamos pensar cuando un comando es v谩lido y cuando no lo es. Adem谩s debemos considerar cuando debe cambiar el estado y cuando deb茅n los comandos ser actualizados.

Por ejemplo, el comando pegar es v谩lido cuando una caja de texto tiene el foco y hay algo en el portapapeles que pegar. El comando se habilitar谩 cuando la caja de texto obtenga el foco o el contenido del portapales cambie. Un actualizador de comandos escuchar谩 a estas situaciones y podr谩 ejecutar c贸digo que habilite o deshabilite comandos como sea necesario.

Un simple actualizador de comandos puede ser como el siguiente:

<commandset id="actualizaPegarElemento"
            commandupdater="true"
            events="focus"
            oncommandupdate="goUpdateCommand('cmd_paste');"/>

Un actualizador de comandos es indicado cuando se usa el atributo commandupdater, el cual debe ser true. El atributo event se usa para definir los eventos a los cuales debe escuchar el actualizador. Podemos especificar varios eventos si los separamos con comas. En este ejemplo el actualizador de comandos escucha al evento 鈥榝ocus鈥. Esto har谩 que los comandos se actualizen con un elemento reciba el foco.

Cuando ocurre un evento de foco, el c贸digo en el atributo oncommandupdate es ejecutado. En el ejemplo, la funci贸n goupdateCommand es llamada, que es la funci贸n implementada en globalOverlay.js descrita anteriormente. Esto actualizara el comando y habilitar谩 o deshabilitar谩 los botones y men煤s necesarios. El c贸digo detr谩s de todo esto es bastante sencillo. Simplement coge el controlador adecuado, llama su m茅todo isCommandEnabled y el comando queda habilitado o deshabilitado. Si hay varios comandos a actualizar, llamaremos la funci贸n goUpdateCommand una vez para cada comando.

Cabe mencionar que el actualizador de comandos recibir谩 avisos sobre todos los eventos de foco en todos los elementos, incluso si otros gestores de eventos responden al evento. Esencialmente, un actualizador de comandos es como un gestor de eventos global.

Los actualizadores de comandos puede escuchar a los siguientes eventos, aunque es posible crear nuestros propios eventos.

   * focus: ocurre cuando un elemento obtiene el foco
   * select: ocurre cuando el texto seleccionado cambia
   * undo: ocurre cuando el buffer de deshacer cambia
   * clipboard: ocurre cuando los contenidos del portapapeles cambian

Los siguientes ejemplos demuestran como se usan los actualizadores de comandos en el navegador Mozilla para actualizar los comandos del men煤 editar. Las funciones usadas pueden ser encontradas en el fichero 鈥chrome://communicator/content/utilityOverlay.js鈥.

<commandset id="globalEditMenuItems"
            commandupdater="true"
            events="focus"
            oncommandupdate="goUpdateGlobalEditMenuItems()"/>
<commandset id="selectEditMenuItems"
            commandupdater="true"
            events="select"
            oncommandupdate="goUpdateSelectEditMenuItems()"/>
<commandset id="undoEditMenuItems"
            commandupdater="true"
            events="undo"
            oncommandupdate="goUpdateUndoEditMenuItems()"/>
<commandset id="clipboardEditMenuItems"
            commandupdater="true"
            events="clipboard"
            oncommandupdate="goUpdatePasteMenuItems()"/>