/** * Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados. * * e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro * dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do * Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão. * * Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA; * sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. * Veja a Licença Pública Geral Menor GNU para maiores detalhes. */ package br.gov.camara.edemocracia.portlets.wikilegis.ui.panels; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.wicket.markup.html.JavascriptPackageResource; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.RefreshingView; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import br.gov.camara.edemocracia.portlets.wikilegis.EstruturaDisplay; import br.gov.camara.edemocracia.portlets.wikilegis.service.WikiLegisServiceUtil; import br.gov.camara.edemocracia.portlets.wikilegis.ui.components.LinkToAnchor; import br.gov.camara.edemocracia.portlets.wikilegis.ui.util.UIUtils; import br.gov.camara.liferay.comum.StaticImage; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; /** * @author rpdmiranda * */ public class NavegadorPanel extends Panel { /** * */ private static final long serialVersionUID = 1L; private String imgAbrirArvore; /** * @param id */ public NavegadorPanel(String id) { super(id); init(); } private RefreshingView<EstruturaDisplay> raizes; private void init() { add(JavascriptPackageResource.getHeaderContribution("html/js/liferay/arvore.js")); imgAbrirArvore = UIUtils.getThemeDisplay().getPathThemeImages() + "/custom/iconeExpandir.gif"; initRaizes(); } private void initRaizes() { raizes = new RefreshingView<EstruturaDisplay>("raizes") { @Override protected Iterator<IModel<EstruturaDisplay>> getItemModels() { return listaEstrutura().iterator(); } @Override protected void populateItem(Item<EstruturaDisplay> item) { populateChild(item); } }; add(raizes); } /** * Popula um elemento com o nó atual e os nós filhos * * Como os elementos são reconstruidos a cada requisição, é possível testar * algumas funcionalidades (por exemplo, se tem elementos filhos) dentro do * próprio método * * @param item */ private void populateChild(Item<EstruturaDisplay> item) { Fragment frag = new Fragment("filho", "no", this); item.add(frag); StaticImage img = new StaticImage("imgExpandir", imgAbrirArvore); item.add(img); LinkToAnchor link = new LinkToAnchor("link", new PropertyModel<String>(item.getModel(), "nodeName")); frag.add(link); Label titulo = new Label("titulo", new PropertyModel<String>(item.getModel(), "texto")); link.add(titulo); final List<EstruturaDisplay> filhos = item.getModelObject().getFilhos(); if (filhos.isEmpty()) { img.setVisible(false); frag.add(new EmptyPanel("filhos").setVisible(false)); } else { img.setVisible(true); frag.add(new RefreshingView<EstruturaDisplay>("filhos") { @Override protected Iterator<IModel<EstruturaDisplay>> getItemModels() { return convertToListOfModels(filhos).iterator(); } @Override protected void populateItem(Item<EstruturaDisplay> item) { populateChild(item); } }); } } /** * Obtém a estrutura a ser visualizada * * @return */ private List<IModel<EstruturaDisplay>> listaEstrutura() { long groupId = UIUtils.getThemeDisplay().getScopeGroupId(); List<EstruturaDisplay> estruturas; try { estruturas = WikiLegisServiceUtil.listaEstrutura(groupId); } catch (PortalException e) { return Collections.emptyList(); } catch (SystemException e) { // TODO Log throw new RuntimeException("Unable to get structure children"); } return convertToListOfModels(estruturas); } /** * @param estruturas * @return */ private ArrayList<IModel<EstruturaDisplay>> convertToListOfModels( List<EstruturaDisplay> estruturas) { ArrayList<IModel<EstruturaDisplay>> retorno = new ArrayList<IModel<EstruturaDisplay>>(); for (EstruturaDisplay raiz : estruturas) { retorno.add(new CompoundPropertyModel<EstruturaDisplay>(Model.of(raiz))); } return retorno; } }