miércoles, 14 de noviembre de 2012

zk Google Maps


Trabajar con google maps en zk es muy fácil, y esto es gracias a que no hay que meterse con javascript, como se hace trabajando directamente con el api de mapas. En esta ocasión les muestro un ejemplo sencillo de como incluir un mapa y mostrar en un Messagebox las coordenadas donde se dió clic en cualquier parte del mapa. A continuación el ejemplo:



index.zul

<zk>
<window
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('com.zk.examples.vm.GoogleMapsVM')"
title="${labels.app.titleWindow}"
position="center"
mode="overlapped"
border="normal"
width="70%"
height="80%">

<gmaps id="mymap" width="100%" height="100%" onMapClick="@command('getCoordenadas')" />
</window>
</zk>


  1. Como se observa declarar el mapa es muy fácil solo se agrega la etiqueta marcada con gmaps, el ancho, alto y el evento onMapClick el cual usa un método llamado getCoordenadas que muestra el mensaje con las coordenadas.



package com.zk.examples.vm;

import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.gmaps.event.MapMouseEvent;
import org.zkoss.zul.Messagebox;

public class GoogleMapsVM {

@Command
public void getCoordenadas(@ContextParam(ContextType.TRIGGER_EVENT) MapMouseEvent event){
Messagebox.show("Has hecho clic en las coordenadas: Lat: "+event.getLat()+" Lng: "+event.getLng());

}
}

  1. En la clase GoogleMapsVM solo se recibe el evento MapMouseEvent, el cual fue lanzado por el evento onMapClick en el mapa declarado en el archivo index.zul.
  2. Por último en event.getLat() y event.getLng(), recuperamos la latitud y longitud.
Para mayor información del uso de google maps consulte la ayuda, (http://books.zkoss.org/wiki/ZK_Component_Reference/Diagrams_and_Reports/Gmaps).


Ejemplo completo:

googlemaps.zip

Importante: Este ejemplo esta probado en Eclipse con tomcat 7 por lo tanto puedes importar el proyecto en tu eclipse y adaptarlo al servidor de tu preferencia.


sábado, 20 de octubre de 2012

Tabbox, tabs creados desde código con Executions.createComponents

En esta oportunidad les muestro un ejemplo de como crear tabs y agregarlos al componente Tabbox y agregarlos dinámicamente a una ventana. A continuación el código zul:


index.zul

<zk>
<window
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vmp') @init('com.zk.examples.vm.TabboxVM')"
title="ZK TABBOX"
position="center"
mode="overlapped"
border="normal"
width="50%"
sizable="true"
maximizable="true"
closable="true"
height="50%">

<toolbar>
<toolbarbutton onClick="@command('window1')" label="Ventana 1" />
<toolbarbutton onClick="@command('window2')" label="ventana 2" />
<toolbarbutton onClick="@command('window3')" label="ventana 3" />
</toolbar>
<tabbox id="tb_tabbox" />
</window>
</zk>
  1. En la primera sección marcada con negrita hay 3 botones del tipo Toolbarbutton en donde cada uno de ellos hace referencia a un método para crear tabs.
  2. En <tabbox id="tb_tabbox" /> declaramos el componente y le asignamos a este un identificador con el nombre "tb_tabbox", El cual es utilizado por la clase TabboxVM para poder asignarle los tabs que contiene cada ventana.
A continuación muestro el contenido del archivo llamado v1.zul el cual sera agregado al tab y despues al componente Tabbox:

v1.zul

<zk>
 <window title="ventana 1" border="normal">
   CONTENIDO 1
 </window>
</zk>

TabboxVM.java

package com.zk.examples.vm;

import java.util.HashMap;
import java.util.Map;

import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.Selectors;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Tabpanel;
import org.zkoss.zul.Tabpanels;
import org.zkoss.zul.Tabs;

public class TabboxVM {

@AfterCompose
public void afterCompose(@ContextParam(ContextType.VIEW) Component view){
Selectors.wireComponents(view, this, false);
}

//Componentes UI
@Wire
Tabbox tb_tabbox;

@Command
public void window1(){
agregarTab("Ventana 1", "v1", "v1.zul");
}

@Command
public void window2(){
agregarTab("Ventana 2", "v2", "v2.zul");
}

@Command
public void window3(){
agregarTab("Ventana 3", "v3", "v3.zul");
}

private void agregarTab(String titulo, String id, String zul) {
Map<String, Object> arguments = new HashMap<String, Object>();
Tabpanel tabpanel = new Tabpanel();
Tab tab = new Tab(titulo);
tab.setId(id);
if(tb_tabbox.hasFellow(id)){
Messagebox.show("Ya esta abierta la ventana!");
return;
}

tab.setClosable(true);
tab.setSelected(true);

if (tb_tabbox.getTabs() == null){
tb_tabbox.appendChild(new Tabs());
tb_tabbox.appendChild(new Tabpanels());
}

tb_tabbox.getTabs().appendChild(tab);
arguments.put("tabularIndex", tab.getIndex());

tb_tabbox.getTabpanels().appendChild(tabpanel);
tb_tabbox.invalidate();

Executions.createComponents(zul, tabpanel, arguments);
}
}
  1. Se utiliza la anotación @AfterCompose y se hace uso de Selectors.wireComponents para poder manipular componentes en el patrón mvvm. La documentación menciona que hay que tener cuidado en utilizar esta caracteristica ya que puede afectar la forma en la que el binder trabaja, pero en esta ocasíon no afecta ya que no hacemos uso de datos que afectan la comunicación del binder con los componentes. (http://books.zkoss.org/wiki/ZK%20Developer's%20Reference/MVVM/Advance/Wire%20Components).
  2. En agregarTab se le pasa como primer parámetro el nombre el cual se le asignará al tab que se está creando, el segundo parámetro es el identificador que se le da al tab para poder validar si este ya esta agregado al Tabbox, como tercer parámetro se le pasa el nombre o la ruta donde se encuentra el archivo zul que se desea agregar al tab.
  3. En if(tb_tabbox.hasFellow(id)) sa valida si ya existe el identificador en el tabbox, muestra un mensaje avisando que ya existe.
  4. tab.setClosable(true), tab.setSelected(true), se asignan estas propiedades para decirle al tab que muestre un botón de cerrar y que se seleccione al momento de crearlo.
  5. En tb_tabbox.getTabs().appendChild(tab) se agrega el tab a la lista de tabs.
  6. En tb_tabbox.getTabpanels().appendChild(tabpanel) se agrega el tabpanel al que se le agregará el archivo zul.
  7. Por ultimó en Executions.createComponents(zul, tabpanel, arguments) se utiliza el método createComponents para asignar el archivo zul al padre que en este caso es tabpanel y se le pueden pasar algunos argumentos para después utilizarlos más tarde.

Las librerias de zk las puedes descargar desde este enlace, solo incluye las librerias en la carpeta lib de tu proyecto:
http://www.zkoss.org/download/zk

    Ejemplo completo:

    tabbox.zip

    Importante: Este ejemplo esta probado en Eclipse con tomcat 7 por lo tanto puedes importar el proyecto en tu eclipse y adaptarlo al servidor de tu preferencia.

    carga y descarga de archivos

    En esta oportunidad muestro este ejemplo de carga y descarga de archivos con zk MvvM.




    index.zul
    <zk>
    <window
    apply="org.zkoss.bind.BindComposer"
    viewModel="@id('vm') @init('com.zk.examples.vm.UploadDownloadVM')"
    title="${labels.app.titleWindow}"
    position="center"
    mode="overlapped"
    border="normal"
    width="300px"
    height="200px">
    <button
    label="${labels.app.upload}"
    upload="true,maxsize=8192"
    onUpload="@command('uploadFile',upload=event)"
    autodisable="self" />
    <button
    label="${labels.app.download}"
    mold="trendy"
    onClick="@command('downloadFile')"
    disabled="@bind(empty vm.media)"  />
    </window>
    </zk>
    1. En "viewModel" se inicializa la clase java que se va a encargar de procesar los eventos que necesitemos, mediante el binder.
    2. En "onUpload" se ase uso de la anotación @command para hacer referencia al método "uploadFile" en la clase UploadDownloadVM la cual se encargará se guardar el archivo en el servidor.
    3. En onClick="@command('downloadFile')" se captura el evento clic del botón para descargar el archivo.
    4. En disabled="@bind(empty vm.media)" mediante la anotación @bind, nos aseguramos que el botón descarga estará deshabilitado hasta que se le notifique que el objeto media contenga el archivo.

    Por último la clase que se encarga de procesar los eventos que están en el archivo index.zul.

    UploadDownloadVM.java

    package com.zk.examples.vm;

    import org.zkoss.bind.annotation.Command;
    import org.zkoss.bind.annotation.ContextParam;
    import org.zkoss.bind.annotation.ContextType;
    import org.zkoss.bind.annotation.NotifyChange;
    import org.zkoss.util.media.Media;
    import org.zkoss.util.resource.Labels;
    import org.zkoss.zk.ui.event.UploadEvent;
    import org.zkoss.zul.Filedownload;
    import org.zkoss.zul.Messagebox;
    import com.zk.examples.util.Util;

    public class UploadDownloadVM {
    private Media media;

    @NotifyChange("media")
     @Command
    public void uploadFile(@ContextParam(ContextType.TRIGGER_EVENT) UploadEvent event) {
    media = event.getMedia();
    if(Util.uploadFile(media))
    Messagebox.show(Labels.getLabel("app.successfull"));
    else
    Messagebox.show(Labels.getLabel("app.error"));
    }

    public Media getMedia(){
    return media;
    }

    @Command
    public void downloadFile(){
    if(media != null)
    Filedownload.save(media);
    }
    }

    1. En @NotifyChange("media"), esta de más mencionar que se notifica el método getMedia() que el archivo se ha subido al servidor y que el objeto media lo contiene, por lo tanto el binder manda el aviso y el botón descargar en su propiedad disabled es notificado que no está vacio y por lo tanto se habilita para poder descargar el archivo. Cabe mencionar que el desarrollador se encarga de extender esta lógica a su gusto, este ejemplo es meramente ilustrativo.
    2. public void uploadFile(@ContextParam(ContextType.TRIGGER_EVENT) UploadEvent event) este método contiene un parámetro de tipo UploadEvent, el cual es pasado a este desde el archivo index.zul.
    3. public void downloadFile(), Descargamos el archivo mediante la clase Filedownload con el método estático save. Esta clase no solo se limita a usar objetos de tipo Media. Para mayor información consulte en el API de ZK, la documentación completa acerca de esta clase.
    (http://www.zkoss.org/javadoc/latest/zk/org/zkoss/zhtml/Filedownload.html).

    Las librerias de zk las puedes descargar desde este enlace, solo incluye las librerias en la carpeta lib de tu proyecto:
    http://www.zkoss.org/download/zk

    Ejemplo completo:

    uploadDownload.zip


    Importante: Este ejemplo esta probado en Eclipse con tomcat 7 por lo tanto puedes importar el proyecto en tu eclipse y adaptarlo al servidor de tu preferencia.