ZK Ajax Web framework

Dei uma olhada no site deles e foi o que eu entendi também…uma pena, porque acho que os caras aqui onde trabalho não irão aceitar liberar os fontes, como eles estão em um momento de contenção de dispesas talvez não queiram pagar a licença :cry: .

valeu pela resposta SanjuanRJ.

Abraços

Cara, sinceramente eu não ligo muito para isso. Eu usaria e pronto.

Eu tenho umas dúvidas com ZK, seria legal a gente trocar msn para podermos debater algumas boas práticas no zk.

Ou até mesmo postar aqui nesse tópico.

O que você acha?

Acho uma boa idéia…

Prefiro utilizar o forum, porque onde trabalho não é permitido utilizar o MSN, além disso acho que postando no guj outras pessoas podem paticipar fazendo com que aprendamos mais ainda :slight_smile: .

Quais são suas dúvidas?

[]'s

Queria saber como você está fazendo para exibir uma lista dentro de outras lista.

Por exemplo um contato que tem vários telefones dentro dele.

Eu quero exibir os contatos adicionados e permitir que ele altere ou exclua o contato dessa lista.

Para isso eu estava pensando em inserir essa lista em um Listbox que já tem a propriedade de pegar o item selecionado para mim, mas não sei se é a melhor opção.

Dentro dessa de cada lisitem eu colocaria um listcell com um

    para mostrar os itens de cada contato.

    Apesar de não achar isso ruim, eu gostaria de fazer de uma forma diferente, pq assim fica um de baixo do outro, quandon eu queria colocar um do lado do outro.

    Não sei se fui muitom claro, mas acho que deu para entender, assim que chegar em casa eu posto o código para você ver.

Queria saber também, se você está usando o data binding e também se está usando o conceito de exibir uma janela modal com uma página dentro dela(Aquela parada de um Desktop poder ter várias páginas dentro dela).

Esse lance de exibir uma janela apartir de uma outra página é bem interessante. Ou seja, você pode visualizar itens de uma outra página enquanto navega na atual.

E eu tentei inserir um Enum em uma lista mas vi que eles não dão suporte a enum :? , precisa ser uma Collection mesmo.

Valeu!!!

Oi SanjuanRJ,

Não sei se entendi a sua primeira dúvida mas é o seguinte… se vc quiser colocar os dados um do lado do outro (ex: Contato, tel 01, tel02, tel03, tel04) em um forma tabular no listbox e assumindo que cada contato terá um número diferente de telefones acredito que vc terá que construir o objeto (Listbox) e seu conteúdo dinamicamente, ou seja, você terá que: criar uma classe MyListBox extends ListBox (ou na própria window e depois utilizar binding) e na página utilizar o atributo “use” e assim por diante; como o número de tels dos contados variam vc terá que descobrir antecipadamente qual é o número máximo de colunas para cria-las adequadamente.

A outra dúvida sobre as janelas, acho (não fiz ainda) que se vc fizer de forma dinamica também vai rolar; eu consegui inserir uma página com lista e digitação de dados em uma tab e funcionou corretamente, em uma janela acho que não teria o porque de não funcionar.
Eu falo dinamicamente porque não achei uma tag na window para apontar o fonte da página.
O código ficaria + ou - assim:

            Include inc = new Include();
            inc.setSrc("nomedapagina.zul");

            super.appendChild(inc);

Utilizei os bindings também e funcionou sem problemas, basta criar uma classe MyController extends Window e seguir em frente… é só seguir os tutoriais e não tem erro rsrsrssr.

Espero ter ajudado…como disse antes estou testando o ZK ainda, mas até o momento já está confirmado que será utilizado em pelo menos em um projeto falta o cliente fechar.

Pelo que testei e entendi até o momento o ZK é uma idéia show de bola mas para fazer uns bons milagres nele tem que “sacar” bem a parte dinâmica que não é muito difícil e tem bastante explicações nos tutoriais. Pena que o JSF/RichFaces está meio longe de chegar nesse ponto. Testei bastante o RichFaces e o IceFaces mas não consegui fazer o que o ZK faz com extrema facilidade como inserir uma página em uma tab, na verdade queria utilizar o JSF porque é mais utilizado no mercado e torço para que ele dê certo (mais ainda rsrsr).
O esquema para resolver a questão do ajax no ZK ficou muito bom, se o JSF/RichFaces e os outros não arrumar uma idéia semelhante rápidamente logo irá surgir um outro framework e vai detonar tudo. Isso sem falar da integração do ZK com a codificação java, javascript, Ruby groovy feito tudo de forma (até onde eu entedi) bem fácil.

[]'s

[quote=SanjuanRJ]
E eu tentei inserir um Enum em uma lista mas vi que eles não dão suporte a enum :? , precisa ser uma Collection mesmo.
Valeu!!![/quote]
Para lista eu não tentei, acho que dá suporte sim. Abaixo um trecho onde utilizei para povoar um combobox, por exemplo, utilizando databinding:

[code]
// No Controller…
public class BA_Queue_Controller extends Window {
private static final long serialVersionUID = 1L;
public Class status_list = domain.enums.BAStatus.class;
// …

// Na View

<combobox id="cb_status"
                    model="@{window.status_list}"
                    selectedItem="@{selected.status; save-when:none;}"
                    value="@{selected.status.toString; access:load;}" />
[/code]Também é muito prático para gerar gráficos e exibir relatórios (jasper), integração com hibernate.

Oi genildof,

Antes obrigado pelo dica...

Qual versão vc está utilizando do ZK?
Vc utiliza o eclipse, netbeans ou o quê para editar o código?

 Vc está fazendo teste, implementando sistemas internos ou sistemas para serem vendidos com o ZK?

 Por que vc optou pelo ZK e não pelo JSF?

 Desculpe o monte de perguntas rsrsss...

[]'s

Estava dando uma olhada nos pacotes de licensa comercial do ZK e me deparei com algumas dúvidas.

Existem três tipos de pacotes comerciais Standard, Professional e Enterprise.

No Enterprise tem um tal de Enterprise Functions:
ZK Cascading Style, Resumable Download…

O que seria esse ZK Cascading Style?

Se eu adquirir o pacote Professional posso mudar o CSS dos componentes?

Mandei um email pra eles, mas até agora nada de resposta.

Olá fantomas,

Estou usando o ZK em um projeto interno desde a versão 2.4. Migrei há pouco para a versão 3.5 que tem muitas novas funcionalidades. Vindo do desenvolvimento desktop - delphi, swing - sempre utilizei frameworks web baseados em componentes e que também pudessem ser programados diretamente por classes java, como o ZK e o Click. No caso do ZK, a produtividade me chamou atenção, e pricipalmente a possibilidade de utilizar ajax programando em java e não em javascript. Para o desenvolvimento uso apenas o Eclipse mesmo, em sua versão mais ‘leve’, embora haja um excelente plugin do ZK para o Netbeans. No site do ZK tem um tutorial sobre como programar o Eclipse para usufruir de sintaxe highlight e code completion ao editar as páginas ‘.zul’. Como apenas a parte lógica do meu projeto é compilada, faço edições em runtime no design das páginas apartir de uma tela de manutenção do próprio sistema utilizando isso aqui, sem a necessidade de restart do container ou mesmo reload do context.

Sobre JSF, nunca utilizei, não posso falar muito. Mas pelo que notei parece complicado.
[]'s.

Fala pessoal.

Eu comecei a mexer com esse framework mas acabei desistindo, já que nunca conseguia muito material sobre ele, exceto no seu próprio site, que tem muitos bons exemplos.

A idéia de montarmos uma lista de discussão seria ideal! :smiley:

Agora uma perguntinha, alguém sabe alguma técnica pra controle de acesso usando o ZK?
Porque tipo, usando o JSF eu uso o PhaseListener, pra gerenciar o ciclo de vida do JSF, no ZK tem algo parecido?

Valeu pela resposta genildof

Então…para controlar acessos é indicado utilizar o ACEGI: http://www.zkoss.org/smalltalks/zkacegi/zkacegi.dsp

flws

Valeu kra vou dar uma olhada…
Agora pessoal, uma opinião pessoal…

Este framework está no mercado há alguns anos, é muito poderoso, facilita em muito o desenvolvimento, mas pq será que não vingou?
Digo, quase não se é falado sobre ele, há poucos materiais na internet… Será que tem chances dele ser um framework bem aceito pela comunidade?
É bem pessoal essa opinião, na verdade posso estar enganado, me corrijam por favor :smiley:

Aproveitando aqui… :smiley:
Alguém sabe se o ZK tem suporte a internacionalização??? Se tiver podem me passar alguma referência?? :smiley:

Cara estou usando o ZK num projeto e estou achando bastante interessante e fácil de integrar com o Java

Já trabalhei com o ExtJs, mas o ZK é bem mais fácil, porque, você não precisa programar em Javascript nele apesar dele te dar essa opção também.

Com relação a internacionalização dá pra mudar sim, você configura no zk.xml.

Baixe essa documentação:

http://prdownloads.sourceforge.net/zk1/zk-devref-3.5.1.zip?download

Espero ter ajudado!

abraços!

Acredito que os problemas com performance, somente resolvidos apartir da release 3.0 no ano passado, contribuiram para esta ‘impopularidade’. Mas isso mudou muito desde então, penso que ainda pode vingar .
Também é minha humilde opnião :mrgreen:.

A propósito, a futura release do ZK Studio vai ter um editor WYSIWYG.

Dá uma olhada neste link também: http://www.zkoss.org/smalltalks/i18n/i18n.dsp

[quote=felipempantoja]
Este framework está no mercado há alguns anos, é muito poderoso, facilita em muito o desenvolvimento, mas pq será que não vingou?
Digo, quase não se é falado sobre ele, há poucos materiais na internet… Será que tem chances dele ser um framework bem aceito pela comunidade?
É bem pessoal essa opinião, na verdade posso estar enganado, me corrijam por favor[/quote]

Não diria que não vingou…acho que abocanhou uma boa fatia do mercado e parece que vai aumentar ainda mais sua utilização. Na minha opinião o que pegou e o que ainda deve estar pegando é a questão da licença e algumas coisas relacionadas a paradigmas. frameworks semelhantes ao struts ainda são bastante utilizados, e frameworks orientados a eventos estão começando a aparecer e ganhar força “recentemente” vamos dizer assim, principalmente com o advento do JSF e Ajax. Muito provavelmente os frameworks do tipo JSF vão brevemente incorporar as idéias que existem no ZK na intenção de atingir mais flexibilidade e agilidade.

[]'s

genildof,
muito maneiro esse futuro editor hein… show de bola!

fantomas,
Eu sempre tive receio de estudar esse framework com medo justamente “não vingar”, mas como vc falou, acho que uns dos maiores problemas é a questão da licença, mas com certeza o framework cumpre com o que promete no que diz respeito a produtividade, é sensacional!
Espero realmente que dê certo, ou como vc falou, que outros frameworks mais conhecidos como JSF incorporem as idéias do ZK.

Pessoal, valeu pelo esclarecimento aí.
Abração a todos :smiley:

Estou usando esse framework em um projeto freelancer e não me preocupo muito com essa história de vingar ou não porque é importante você conhecer outros frameworks do mercado também.

Quero levar a idéia de abrirmos um grupo de discussão exclusivo para esse framework, para podermos centrar mais as informações.

Estou desenvolvendo uma página e depois vou postar os fontes dela aqui para vocês darem uma olhada e ver se ficou legal.

Valeu!!!

Estou tendo um problema no zk, no qual eu não consigo usar a anotação de model do databinding em um componente que não seja do tipo listbox. Isso é muito ruim. Tentei usar em um radiogroup ou em um <h:ul> e tive o mesmo erro.

Alguém sabe se dá para usar databind nesses componentes também?

Se não der, qual seria a melhor alternativa para eu montar uma lista dentro de outra lista?

.zul

<?page id="testZul" title=" New ZUL Title" cacheable="false" 
	language="xul/html" zscriptLanguage="Java" contentType="text/html;charset=UTF-8"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>


<zk xmlns="http://www.zkoss.org/2005/zul"
	xmlns:h="http://www.w3.org/1999/xhtml"
	xmlns:a="http://www.zkoss.org/2005/zk/annotation"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
<window id="winProdutora" border="none" use="action.ProdutoraCadastro">

	<tabbox>
		<tabs>
			<tab label="Dados Gerais" />
			<tab label="Contato" />
		</tabs>
		<tabpanels>
			<tabpanel>
				<groupbox mold="3d">
					<caption label="Editora/Gravadora"  />
					<grid>
						<columns>
							<column width="15%" />
							<column width="85%" />
						</columns>
						<rows>
							<row>

								<label value="Tipo: " />
											
								<a:bind model="winProdutora.listTipoProdutora" selectedItem="winProdutora.produtora.tipo" />
								<listbox rows="1" mold="select" id="produtoraTipo">
									<listhead />
									<a:bind _var="tipoProdutora" label="tipoProdutora"/>
									<listitem />
								</listbox>	
									
							</row>
							<row>
								<label value="Nome: "  />
								<a:bind value="winProdutora.produtora.nome" />
								<textbox />
							</row>
							<row>
								<label value="Site: " />
								<a:bind value="winProdutora.produtora.site" />
								<textbox id="site" />
							</row>
						</rows>
					</grid>
				</groupbox>
				
				<h:br />
				
				<groupbox mold="3d">
						<caption label="Telefone:"  />

						<grid>
							<columns>
								<column width="5%" />
								<column width="5%" />
								<column width="5%" />
								<column width="85%" />
							</columns>
							<rows>
								<row spans="1,3">
									<label value="Ramal: " />
									<a:bind value="winProdutora.empresaTelefone.Ramal" />
									<textbox cols="3" maxlength="3"  />
								</row>
								<row>
									<label value="DDI: " />
									<a:bind value="winProdutora.empresaTelefone.DDI" />
									<textbox cols="3" maxlength="3" constraint="no empty" />
									
									<label value="DDD: " />
									<a:bind value="winProdutora.empresaTelefone.DDD" />
									<textbox cols="3" maxlength="3"  constraint="no empty"  />
	
								</row>
								<row>
									<label value="Telefone: " />
									<a:bind value="winProdutora.empresaTelefone.Telefone" />
									<textbox constraint="no empty" />
									<label value="Tipo: " />
									
									<a:bind model="winProdutora.listTipoTelefone" selectedItem="winProdutora.empresaTelefone.Tipo" />
									<listbox rows="1" mold="select" id="empresaTelefoneTipo">
										<listhead />
										<a:bind _var="tipoEmpresaTelefone" label="tipoEmpresaTelefone"/>
										<listitem />
									</listbox>	
									 
								</row>
							</rows>
						</grid>
						<h:br />
						<button label="Adicionar" forward="onClick=onAdicionarEmpresaTelefone" />
						<separator bar="true" />
						
						<h:br />
						
						<a:bind model="winProdutora.produtora.telefones" selectedItem="winProdutora.empresaTelefoneSelecionado"/>							
						<listbox width="100%" id="empresaTelefoneAdicionadoListbox" >
							<listhead sizable="true">
								<listheader label="Ramal" />
								<listheader label="DDI" />
								<listheader label="DDD" />
								<listheader label="Telefone"/>
								<listheader label="Tipo" />
							</listhead>		
							<a:bind _var="thisTelefoneEmpresa"/>
							<listitem>
								<a:bind label="thisTelefoneEmpresa.Ramal"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.DDI"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.DDD"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.Telefone"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.Tipo"/>
								<listcell />
							</listitem>	
						</listbox>
					
					</groupbox>
								
				<h:br />
			
				<groupbox mold="3d">
					<caption label="Endereço:"  />
					<grid>
						<columns>
							<column width="20%" />
							<column width="20%" />
							<column width="20%" />
							<column width="40%" />
						</columns>
						<rows>
							<row spans="1,3">
								<label value="CEP: " />
								<hbox>
									<textbox />
									<space />
									<button label="Buscar" />
								</hbox>
							</row>
							<row>
								<label value="Logradouro: " />
								<a:bind value="winProdutora.produtora.endereco.CEP" />
								<textbox />
								<label value="Número: " />
								<a:bind value="winProdutora.produtora.endereco.numero" />
								<textbox  />
							</row>
							<row>
								<label value="Complemento: " />
								<a:bind value="winProdutora.produtora.endereco.complemento" />
								<textbox  />
								<label value="Bairro: " />
								<a:bind value="winProdutora.produtora.endereco.bairro" />
								<textbox />
							</row>
							<row>
								<label value="Localidade: " />
								<a:bind value="winProdutora.produtora.endereco.localidade" />
								<textbox />
								<label value="UF: " />
								<a:bind value="winProdutora.produtora.endereco.UF" />
								<textbox />
							</row>
							<row spans="1,3">
								<label value="País: " />								
								
								<a:bind model="winProdutora.listPais" selectedItem="winProdutora.produtora.endereco.pais" />
								<listbox rows="1" mold="select" id="empresaEnderecoPais" >
									<listhead />
									<a:bind _var="tipoPais" label="tipoPais"/>
									<listitem />
								</listbox>
							</row>
						</rows>
					</grid>
				</groupbox>
			</tabpanel>
			<tabpanel>
				<groupbox mold="3d">
					<caption label="Contato:"  />
					
					<grid>
						<columns>
							<column width="20%" />
							<column width="80%" />
						</columns>
						<rows>
							<row>
								<label value="Nome: " />
								<a:bind value="winProdutora.contato.nome" />
								<textbox id="contatoNome" constraint="no empty" />
							</row>
							<row>
								<label value="Departamento: " />
								<a:bind value="winProdutora.contato.departamento" />
								<textbox id="contatoDepartamento" constraint="no empty" />
							</row>
							<row>
								<label value="Função: " />
								<a:bind value="winProdutora.contato.funcao" />
								<textbox id="contatoFuncao" constraint="no empty" />
							</row>
						</rows>
					</grid>
				</groupbox>
				
				<h:br />
				
				<groupbox mold="3d">
					<caption label="Contato de Internet:"  />
					<grid>
						<columns>
							<column width="15%" />
							<column width="85%" />
						</columns>
						<rows>
							<row>
								<label value="E-mail: "/>
								<hbox>
									<a:bind value="winProdutora.contatoEmail.nome; save-when:none" />
									<textbox id="contatoEmail" constraint="/(.+@.+\.[a-z]+)?/: Digite um E-mail válido, ou deixe em branco." />
									<button label="Adicionar" forward="onClick=onAdicionarContatoEmail" />
								</hbox>
							</row>
							<row valign="bottom">
								<label value="E-mail Adicionados: "/>
								<a:bind model="winProdutora.contato.emails" selectedItem="winProdutora.contatoEmailSelecionado" />
								<listbox id="contatoEmailAdicionadoListbox" >
									<listhead />
									<a:bind _var="mail" label="mail.nome"/>
									<listitem />
								</listbox>
							</row>
							<row>
								<label value="MSN: "  />
								<a:bind value="winProdutora.contato.msn" />
								<textbox constraint="/(.+@.+\.[a-z]+)?/: Digite um MSN válido, ou deixe em branco." />
							</row>
							<row>
								<label value="Skype: " />
								<a:bind value="winProdutora.contato.skype" />
								<textbox />
							</row>
						</rows>
					</grid>
				</groupbox>
				
				<h:br />
				
				<groupbox mold="3d">
						<caption label="Telefone:"  />

						<grid>
							<columns>
								<column width="5%" />
								<column width="5%" />
								<column width="5%" />
								<column width="85%" />
							</columns>
							<rows>
								<row spans="1,3">
									<label value="Ramal: " />
									<a:bind value="winProdutora.contatoTelefone.ramal" />
									<textbox cols="3" maxlength="3" constraint="no empty" />
								</row>
								<row>
									<label value="DDI: " />
									<a:bind value="winProdutora.contatoTelefone.DDI" />
									<textbox cols="3" maxlength="3" constraint="no empty" />
									
									<label value="DDD: " />
									<a:bind value="winProdutora.contatoTelefone.DDD" />
									<textbox cols="3" maxlength="3" constraint="no empty" />
	
								</row>
								<row>
									<label value="Telefone: " />
									<a:bind value="winProdutora.contatoTelefone.telefone" />
									<textbox />
									<label value="Tipo: " />
	
									<a:bind model="winProdutora.listTipoTelefone" selectedItem="winProdutora.contatoTelefone.Tipo" />
									<listbox rows="1" mold="select">
										<listhead />
										<a:bind _var="tipoContatoTelefone" label="tipoContatoTelefone"/>
										<listitem />
									</listbox>	
	
								</row>
							</rows>
						</grid>
						<h:br />
						<button label="Adicionar" forward="onClick=onAdicionarContatoTelefone" />
						<separator bar="true" />
						
						<h:br />		
							
						
						<a:bind model="winProdutora.contato.telefones" selectedItem="winProdutora.contatoTelefoneSelecionado"/>							
						<listbox width="100%" id="contatoTelefoneAdicionadoListbox" >
							<listhead sizable="true">
								<listheader label="Ramal" />
								<listheader label="DDI" />
								<listheader label="DDD" />
								<listheader label="Telefone"/>
								<listheader label="Tipo" />
							</listhead>		
							<a:bind _var="thisTelefoneEmpresa"/>
							<listitem>
								<a:bind label="thisTelefoneEmpresa.Ramal"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.DDI"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.DDD"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.Telefone"/>
								<listcell />
								<a:bind label="thisTelefoneEmpresa.Tipo"/>
								<listcell />
							</listitem>	
						</listbox>
							
					</groupbox>
					
					<h:br />
					<separator bar="true" />
					<button label="Adicionar" forward="onClick=onAdicionarContato" />
					<h:br />
					
					<label value="Contatos Adicionados:" />
					<h:br />
					
					 
					<a:bind model="winProdutora.produtora.contatos" selectedItem="winProdutora.contatoSelecionado"/>							
						<listbox width="100%" id="contatoAdicionadoListbox" >
							<listhead />
								
							<a:bind _var="thisContato"/>
							<listitem>
								
								<listcell>
									<h:ul>
										
										<a:bind label="thisContato.nome"/>
										<h:li>
										
											<label value="Nome: " />
											<a:bind value="thisContato.nome"/>
											<label />
											
											<h:br />
											
											<label value="Departamento: " />
											<a:bind value="thisContato.departamento"/>
											<label />
											
											<h:br />
											
											<label value="Função: " />
											<a:bind value="thisContato.funcao"/>
											<label />
											
											<h:br />
											
											<label value="Emails: " />
											 
											<h:ul style="list-style-type: none">
												<h:li>
													<a:bind model="thisContato.emails" />
		       										<listbox width="50%" >
		       											<listhead />
		       											<a:bind _var="thisEmail"/>
		       											<listitem>
		       												<a:bind label="thisEmail.nome"/>
		       												<listcell />
		       											</listitem>
		       										</listbox>
	       										</h:li>
											</h:ul>
											
											<!-- 
											Dá erro de Cannot find associated CollectionItem
											<a:bind model="thisContato.emails" />
											<h:ul style="list-style-type: none">
												<h:li>
													<a:bind _var="thisEmail" label="thisEmail.nome"/>
													<label />
												</h:li>
											</h:ul>
											-->
										</h:li>
										
									</h:ul>
								</listcell>
							</listitem>	
						</listbox>
					
			</tabpanel>
		</tabpanels>
	</tabbox>
	<h:br />
	<separator bar="true" />
	<button label="Cadastrar" forward="onClick=onCadastrar" />
</window>
</zk>

.java

package action;

import java.util.ArrayList;
import java.util.List;

import model.entity.Contato;
import model.entity.Email;
import model.entity.Produtora;
import model.entity.Telefone;
import model.enums.ProdutoraTipo;
import model.enums.TelefoneTipo;

import org.zkoss.zk.ui.Components;
import org.zkoss.zk.ui.ext.AfterCompose;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Window;


/**
 * @author User
 *
 */
public class ProdutoraCadastro extends Window implements AfterCompose
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 6151686641266572000L;

	private Produtora        produtora = new Produtora();
	
	//Empresa Telefone
	private Telefone         empresaTelefone = new Telefone();
	private Telefone         empresaTelefoneSelecionado = new Telefone();
	
	//Contato
	private Contato          contato = new Contato();
	private Contato          contatoSelecionado = new Contato();
	
	//Contato Email
	private Email			 contatoEmail = new Email();
	private Email			 contatoEmailSelecionado = new Email();
	
	//Contato Telefone
	private Telefone         contatoTelefone = new Telefone();
	private Telefone         contatoTelefoneSelecionado = new Telefone();
	
	//Elementos	
	private Listbox          empresaTelefoneAdicionadoListbox;
	private Listbox          contatoTelefoneAdicionadoListbox;
	
	private Listbox          contatoEmailAdicionadoListbox;
	
	private Listbox          contatoAdicionadoListbox;
	
	
	
	
	public void afterCompose() 
	{		
		
        //wire variables
        Components.wireVariables(this, this);
        
        //NO need to register onXxx event listeners

        //auto forward
        Components.addForwards(this, this);
    }

	
	public void onCreate()
	{				
		//Evita de dar null point exception por contato estar null.
		produtora.setContatos(new ArrayList<Contato>());
	}
	
	@SuppressWarnings("unchecked")
	public void onAdicionarEmpresaTelefone()
	{
		produtora.setTelefones((List<Telefone>)empresaTelefoneAdicionadoListbox.getModel());
		produtora.getTelefones().add(new Telefone(empresaTelefone));
	}
	
	
	@SuppressWarnings("unchecked")
	public void onAdicionarContatoEmail()
	{
		contato.setEmails((List<Email>)contatoEmailAdicionadoListbox.getModel()); 
		contato.getEmails().add(new Email(contatoEmail));
	}
	
	@SuppressWarnings("unchecked")
	public void onAdicionarContatoTelefone()
	{
		contato.setTelefones((List<Telefone>)contatoTelefoneAdicionadoListbox.getModel());
		contato.getTelefones().add(new Telefone(contatoTelefone));
	}
	
	@SuppressWarnings("unchecked")
	public void onAdicionarContato()
	{
		produtora.setContatos((List<Contato>)contatoAdicionadoListbox.getModel());
		produtora.getContatos().add(new Contato(contato));
	}
	
	public void onCadastrar()
	{
		
		/*
		DaoFactory daoFactory = new DaoFactory();
		
		Produtora produtora = new Produtora();
		
		//geral
		produtora.setTipo(ProdutoraTipo.valueOf(ProdutoraTipo.class,tipo.getSelectedItem().getValue()));
		
		produtora.setNome(nome.getValue());
		produtora.setSite(site.getValue());
		
		//Telefone
		List<Telefone> listaTelefonesAdicionados = new ArrayList<Telefone>();
		
		for(int i = 0; i < empresaTelefoneAdicionado.getRows(); i++)
		{
			Listitem item = empresaTelefoneAdicionado.getItemAtIndex(i);
			listaTelefonesAdicionados.add((Telefone) item.getValue()); 
		}
		
		produtora.setTelefones(listaTelefonesAdicionados);
		
		//Endereço
		Endereco endereco = new Endereco();
		endereco.setCep(empresaEnderecoCEP.getValue());
		endereco.setLogradouro(empresaEnderecoLogradouro.getValue());
		endereco.setNumero(empresaEnderecoNumero.getValue());
		endereco.setComplemento(empresaEnderecoComplemento.getValue());
		endereco.setLocalidade(empresaEnderecoLocalidade.getValue());
		endereco.setBairro(empresaEnderecoBairro.getValue());
		endereco.setUF(empresaEnderecoUF.getValue());
		endereco.setPais((empresaEnderecoPais.getSelectedItem().getLabel()));
		
		produtora.setEndereco(endereco);
		
		//Salvar
		daoFactory.beginTransaction();
		
		//Telefone
		TelefoneDao telefoneDao = daoFactory.getTelefoneDao();
		for(Telefone tel : listaTelefonesAdicionados)
		{
			telefoneDao.saveOrUpdate(tel);
		}
		
		//Endereço
		EnderecoDao enderecoDao = daoFactory.getEnderecoDao();
		enderecoDao.saveOrUpdate(endereco);
		
		ProdutoraDao produtoDao = daoFactory.getProdutoDao();
		produtoDao.saveOrUpdate(produtora);
		
		daoFactory.commit();
		daoFactory.close();
		
		try 
		{
			if(Messagebox.show("Cadastro Efetuado com sucesso.<br />Deseja voltar para controle?",
					"Sucesso!!", Messagebox.YES | Messagebox.NO, Messagebox.NONE) == Messagebox.YES)
			{
				Executions.sendRedirect("gravadoraEditoraControle.zul");
			}
			else
			{
				Executions.sendRedirect("gravadoraEditoraCadastro.zul");
			}
		} 
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
		*/
	}
	
	//Tipos
	
	public List<String> getListTipoProdutora()
	{
		
		List<String> lista = new ArrayList<String>();
		
		for(ProdutoraTipo pt : ProdutoraTipo.values())
		{
			lista.add(pt.toString());
		}
		
		produtora.setTipo(lista.get(0));
		
		return lista;
	}
	

	public List<String> getListTipoTelefone()
	{
		List<String> lista = new ArrayList<String>();
		for(TelefoneTipo tt : TelefoneTipo.values())
		{
			lista.add(tt.toString());
		}

		empresaTelefone.setTipo(lista.get(0));
		contatoTelefone.setTipo(lista.get(0));
		
		return lista;
	}
	
	public List<String> getListPais()
	{
		List<String> lista = new ArrayList<String>();
		
		lista.add("Brasil");
		lista.add("Brasil");
		
		return lista;
	}


	public Produtora getProdutora() {
		return produtora;
	}



	public void setProdutora(Produtora produtora) {
		this.produtora = produtora;
	}



	public Telefone getEmpresaTelefone() {
		return empresaTelefone;
	}



	public void setEmpresaTelefone(Telefone empresaTelefone) {
		this.empresaTelefone = empresaTelefone;
	}


	public Telefone getEmpresaTelefoneSelecionado() {
		return empresaTelefoneSelecionado;
	}


	public void setEmpresaTelefoneSelecionado(Telefone empresaTelefoneSelecionado) {
		this.empresaTelefoneSelecionado = empresaTelefoneSelecionado;
	}


	public Email getContatoEmail() {
		return contatoEmail;
	}


	public void setContatoEmail(Email contatoEmail) {
		this.contatoEmail = contatoEmail;
	}


	public Listbox getContatoEmailAdicionadosListbox() {
		return contatoEmailAdicionadoListbox;
	}


	public void setContatoEmailAdicionadosListbox(
			Listbox contatoEmailAdicionadosListbox) {
		this.contatoEmailAdicionadoListbox = contatoEmailAdicionadosListbox;
	}


	public Email getContatoEmailSelecionado() {
		return contatoEmailSelecionado;
	}


	public void setContatoEmailSelecionado(Email contatoEmailSelecionado) {
		this.contatoEmailSelecionado = contatoEmailSelecionado;
	}


	public Telefone getContatoTelefone() {
		return contatoTelefone;
	}


	public void setContatoTelefone(Telefone contatoTelefone) {
		this.contatoTelefone = contatoTelefone;
	}


	public Telefone getContatoTelefoneSelecionado() {
		return contatoTelefoneSelecionado;
	}


	public void setContatoTelefoneSelecionado(Telefone contatoTelefoneSelecionado) {
		this.contatoTelefoneSelecionado = contatoTelefoneSelecionado;
	}


	public Contato getContato() {
		return contato;
	}


	public void setContato(Contato contato) {
		this.contato = contato;
	}


	public Contato getContatoSelecionado() {
		return contatoSelecionado;
	}


	public void setContatoSelecionado(Contato contatoSelecionado) {
		this.contatoSelecionado = contatoSelecionado;
	}	
	
}