Archive for agosto, 2010



Menu de Contexto, Menu Pop-up, Menuzinho que abre quando clicamos com o botão direito do
mouse e etc, isso tudo quer dizer a mesma coisa.
Nesse post mostrarei com adicionar uma opção no menu de contexto de uma aplicação Flex
utilizando as classes ContextMenu e ContextMenuItem.

Conteúdo do arquivo principal:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
	creationComplete="addContextMenuItems()" contextMenu="{cm}">
	
	<mx:Script source="script.as" />
	
</mx:Application>

Conteúdo do arquivo de script:

import flash.net.navigateToURL;		
			
//Váriavel do tipo ContextMenu "Bindable", ou seja, atrelada a um componente
//nesse caso a própria aplicação na propriedade contextMenu, observe a tag Application.			 
[Bindable] private var cm:ContextMenu;

private function addContextMenuItems():void {
	//Definimos a variável cm com o construtor padrão da classe ContextMenu 
	cm = new ContextMenu();
	
	//Cria uma nova instância da classe ContextMenuItem, passando o texto a ser exibido e 
        //opcionalmente a criação do separador embaixo do item
	var cmi:ContextMenuItem = new ContextMenuItem('Visite http://alexonflex.com',true);
	
	//Ao usar a palavra adobe não é aceita, não ocorre erro porém,
	//simplesmente o item não aparecerá no menu 
	var cmi02:ContextMenuItem = new ContextMenuItem('Acesse Adobe Labs',true);
	var cmi03:ContextMenuItem = new ContextMenuItem('Acesse Adobi Labs',true);
	
	//Adiciona ao item o evento que será chamado ao clicar no item no menu
	cmi.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, cmiClickHandler);
	cmi02.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, cmiClickHandler);
	
	//Se este método não for invocado aparecerá no menu algumas opção do Flash
	//como Quality, Play, Loop ...
	cm.hideBuiltInItems();
	
	//Adiciona o item ao menu de contexto
	cm.customItems = [cmi, cmi02, cmi03];
}		

private function cmiClickHandler(event:ContextMenuEvent):void {
	//Dúvidas? http://alexonflex.com/2010/08/06/navegar-para-um-url-com-flex/
	navigateToURL(new URLRequest("http://alexonflex.com"));
}

Se tudo der certo:

Obs.:
1 – Clique aqui para visualizar, no Adobe Labs, a lista completa de palavras reservadas.

2 – Os itens customizados aparecem quando você usa o botão direito do mouse, o que não ocorre quando usada a tecla de menu do teclado.


Vou aproveitar que hoje eu tô tomado no jiraya então tem mais post pra essa galera antenada com o flex e que apronta confusões de montão, como diria o narrador da sessão da tarde kkkkk.

Vou continuar trabalhando em cima do projeto do post Inserindo ícones em uma DataGrid com itemRenderer.

A primeira alteração é adicionar mais uma propriedade as tags clube no model.

<mx:Model id="modelPaulistas">
	<clubes>
		<clube nome="Palmeiras" libertadores="true" quantidade="1" />
		<clube nome="Santos" libertadores="true" quantidade="2" />
		<clube nome="São Paulo" libertadores="true" quantidade="3" />
		<clube nome="Corinthians" libertadores="false" quantidade="0" />
	</clubes>
</mx:Model>

Em seguida adicionamos a datagrid a propreidade editable=”true” para que as células possam ser editadas,
por padrão editable é false.

<mx:DataGrid x="10" y="10" dataProvider="{modelPaulistas.clube}" editable="true">

Também temos que determinar quais as colunas que terão suas células editáveis, setando editable igual a true ou false, no caso precisamos apenas que uma coluna seja editável, a de quantidade.

<mx:DataGridColumn editable="true"
	headerText="Quantidade" dataField="quantidade"
	editorDataField="value"/>

Neste momento já possível editar o conteúdo da célula, no modo normal a célula é um Text e quando em foco a célula se torna um TextInput, mas pode ser alterado e é aí que entra o a propriedade itemEditor, através dela podemos setar o componente que será utilizado na hora da edição, podendo ser: Label, Button, Combobox, Checkbox, NumericStepper, DateField, Image, TextArea.
Como estamos lidando com números pequenos, o NumericStepper é o mais adequado.

<mx:DataGridColumn editable="true"
	headerText="Quantidade" dataField="quantidade"
	editorDataField="value">
	<mx:itemEditor>
		<mx:Component>
			<mx:NumericStepper/>
		</mx:Component>
	</mx:itemEditor>
</mx:DataGridColumn>

Mais sobre NumericStepper no Adobe Livedocs.

Link para Donwload do Projeto


Dando continuidade ao post Inserindo ícones em uma DataGrid com itemRenderer, mostro como utilizar o itemRenderer de outra forma, no flex existem muitas possibilidades de se chegar a um objetivo, pra descobrir a melhor forma de empregar cada solução, vai ter que programar muito.

Em meio as minhas pesquisas descobri essa forma de itemRender inline, ou seja, inserido na própria DataGridColumn, sem a necessidade de criação de outro arquivo.

No outro post, eu usei como itemRenderer um componente externo, dataGridIcons.mxml, referenciado na propriedade itemRenderer, para exibir uma imagem associada a propriedade libertadores.

<mx:DataGridColumn headerText="Libertadores" itemRenderer="dataGridIcons"/>

Na coluna clube podemos associar uma imagem ao nome do time utilizando o itemRender inline como abaixo:

<!--
Abaixo a estrutura básica da DataGridColumn com itemRenderer, os elementos 
dentro da tag mx:Component  tem o mesmo comportamento de um arquivo 
externo, onde podemos acessar os dados da DataGrid através do objeto data.			
-->
<mx:DataGridColumn headerText="Clube" dataField="nome">
	<mx:itemRenderer>
		<mx:Component>
			<mx:VBox horizontalAlign="center">
				<mx:Image id="imgIcon" toolTip="{data.nome}"
					source="icons/{data.nome}.png"							
					width="32" height="32" 
					scaleContent="true" maintainAspectRatio="false"/>
			</mx:VBox>
		</mx:Component>
	</mx:itemRenderer>
</mx:DataGridColumn>

Resultado:

Créditos pelo ícones: VeryIcon


Para abrir uma página em uma nova janela ou simplesmente redirecionar a página utilizamos o método navigateToURL(urlRequest), onde urlRequest é uma variável do tipo URLRequest que recebe uma string e retorna um objeto aceito pelo navigateToURL.

Usando o mesmo código no post anterior, você pode fazer o teste adicionando a Label o código abaixo.

click="navigateToURL(new URLRequest('http://alexonflex.com'))"

Exemplo no Adobe Livedocs.


O código abaixo mostra como alterar o cursor do mouse em Flex utilizando a classe
CursorManager, seu método setCursor(class), onde class é uma variável

que contém uma imagem embutida, e também o método removeAllCursors() utilizado

para o cursor voltar a ser o do sistema operacional.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

	<mx:Script>
		<![CDATA[

			import mx.managers.CursorManager;
			import mx.controls.Alert;

			/*
			A metadata [Embed] importa arquivos JPEG, GIF, PNG, SVG e SWF em tempo de compilação.
			Também importa imgens de um arquivo SWC.
			Obs.:Isso faz com que a imagem fique incorporada a sua Aplicação Flex ou AIR.
			*/
			[Embed(source="url.png")]public var urlIcon:Class;

		]]>
	</mx:Script>

	<mx:Label x="10" y="10" fontSize="18" id="lbl"
		toolTip="http://alexonflex.com" text="Alex on Flex"
		mouseOver="CursorManager.setCursor(urlIcon)"
		mouseOut="CursorManager.removeAllCursors()"	/>

</mx:Application>