/** * 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.priorizacao.ui.pages; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.portlet.PortletPreferences; import javax.servlet.http.HttpServletRequest; import org.apache.wicket.RequestCycle; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.PropertyListView; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.protocol.http.WebRequest; import br.gov.camara.edemocracia.portlets.priorizacao.PropostaDisplay; import br.gov.camara.edemocracia.portlets.priorizacao.VotosUsuario; import br.gov.camara.edemocracia.portlets.priorizacao.model.Eixo; import br.gov.camara.edemocracia.portlets.priorizacao.model.Proposta; import br.gov.camara.edemocracia.portlets.priorizacao.service.PriorizacaoServiceUtil; import br.gov.camara.edemocracia.portlets.priorizacao.ui.components.PropostasVotacao; import br.gov.camara.edemocracia.portlets.priorizacao.ui.panels.MenuPanel; import br.gov.camara.edemocracia.portlets.priorizacao.ui.util.UIUtils; import br.gov.camara.liferay.comum.StaticImage; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.util.PortalUtil; /** * Página inicial de apresentação das propostas * * @author robson * */ public class HomePage extends WebPage { private WebMarkupContainer votos; private PropertyListView<Eixo> eixos; private static final Log LOG = LogFactoryUtil.getLog(HomePage.class); public HomePage() { initVotosUsuario(); initAjuda(); initMenu(); initEixos(); } private void initMenu() { add(new MenuPanel("menu")); } private void initAjuda() { PortletPreferences pp = UIUtils.getPortletPreferences(); String mensagem = pp.getValue("mensagem", ""); if (mensagem == null) mensagem = ""; String url = pp.getValue("url", ""); if (url == null) url = ""; if (mensagem.isEmpty()) { WebMarkupContainer link = new WebMarkupContainer("link"); link.add(new Label("mensagem")); link.setVisible(false); votos.add(link); } else { ExternalLink link = new ExternalLink("link", Model.of(url)); if (url.isEmpty()) link.setEnabled(false); link.add(new Label("mensagem", Model.of(mensagem))); votos.add(link); } } /** * Número de votos disponível para o usuário */ private void initVotosUsuario() { votos = new WebMarkupContainer("votos", new CompoundPropertyModel<VotosUsuario>( new LoadableDetachableModel<VotosUsuario>() { @Override protected VotosUsuario load() { try { HttpServletRequest request = ((WebRequest) (RequestCycle .get()).getRequest()) .getHttpServletRequest(); long scopeGroupId = PortalUtil .getScopeGroupId(request); return PriorizacaoServiceUtil .getVotosUsuario(scopeGroupId); } catch (PortalException e) { throw new RuntimeException(e); } catch (SystemException e) { throw new RuntimeException(e); } } })) { @Override protected void onConfigure() { super.onConfigure(); if (getDefaultModelObject() == null) setVisible(false); else { VotosUsuario votosUsuario = (VotosUsuario) getDefaultModelObject(); setVisible(votosUsuario.getTotalVotos() > 0 || votosUsuario.getVotosDisponiveis() > 0); } } }; votos.setOutputMarkupId(true); add(votos); votos.add(new Label("votosDisponiveis") { /** * */ private static final long serialVersionUID = 2740627999411702017L; @Override protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag) { String texto; int votos = ((Integer)getDefaultModelObject()); if (votos > 1) texto = LanguageUtil.format(UIUtils.getUserLocale(), "you-have-x-available-votes", votos); else if (votos == 1) texto = LanguageUtil.get(UIUtils.getUserLocale(), "you-have-1-available-vote"); else texto = LanguageUtil.get(UIUtils.getUserLocale(), "you-do-not-have-available-votes"); replaceComponentTagBody(markupStream, openTag, texto); } @Override protected void onConfigure() { super.onConfigure(); if (getDefaultModelObject() != null && ((Integer) getDefaultModelObject()) > 0) setVisible(true); else setVisible(false); } }); votos.add(new Label("totalVotos") { /** * */ private static final long serialVersionUID = -5536952667180535257L; @Override protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag) { String texto; int votos = ((Integer)getDefaultModelObject()); if (votos > 1) texto = LanguageUtil.format(UIUtils.getUserLocale(), "you-have-voted-x-times", votos); else if (votos == 1) texto = LanguageUtil.get(UIUtils.getUserLocale(), "you-have-voted-1-time"); else texto = LanguageUtil.get(UIUtils.getUserLocale(), "you-do-not-voted"); replaceComponentTagBody(markupStream, openTag, texto); } @Override protected void onConfigure() { super.onConfigure(); if (getDefaultModelObject() != null && ((Integer) getDefaultModelObject()) > 0) setVisible(true); else setVisible(false); } }); } private void initEixos() { LoadableDetachableModel<List<Eixo>> eixosModel = new LoadableDetachableModel<List<Eixo>>() { @Override protected List<Eixo> load() { try { HttpServletRequest request = ((WebRequest) (RequestCycle .get()).getRequest()).getHttpServletRequest(); long scopeGroupId = PortalUtil.getScopeGroupId(request); return PriorizacaoServiceUtil.listarEixos(scopeGroupId); } catch (SystemException e) { return null; } catch (PortalException e) { return null; } } }; final String iconeExpandirUrl = UIUtils.getThemeDisplay().getPathThemeImages() + "/custom/iconeExpandir.gif"; eixos = new PropertyListView<Eixo>("eixos", eixosModel) { @Override protected void populateItem(ListItem<Eixo> item) { item.setVisible(item.getModelObject() != null); final Long eixoId = item.getModelObject() != null ? item .getModelObject().getEixoId() : null; LoadableDetachableModel<List<PropostaDisplay>> propostasModel = new LoadableDetachableModel<List<PropostaDisplay>>() { @Override protected List<PropostaDisplay> load() { try { if (eixoId != null) return PriorizacaoServiceUtil .listarPropostaDisplay(eixoId); else return null; } catch (SystemException e) { return null; } catch (PortalException e) { return null; } } }; item.add(new StaticImage("abrir", iconeExpandirUrl)); // Imagem item.add(new Label("titulo")); item.add(new Label("sumario")); final PropostasVotacao propostas = new PropostasVotacao("propostas", propostasModel) { @Override protected void onAjaxRequest(final AjaxRequestTarget target) { target.addComponent(votos); final PropostasVotacao thisComponent = this; // Atualiza todos os eixos eixos.visitChildren(PropostasVotacao.class, new IVisitor<PropostasVotacao>() { @Override public Object component(PropostasVotacao component) { if (component != thisComponent) { component.rerenderComponent(target); } return CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER; } }); } }; propostas.setVisible(getPropostasCount(eixoId) != 0); item.add(propostas); } }; eixos.setReuseItems(true); add(eixos); } /** * Obtém a lista de propostas de um eixo * * @param eixoId * @return */ private Iterator<IModel<Proposta>> listPropostas(Long eixoId) { ArrayList<IModel<Proposta>> retorno = new ArrayList<IModel<Proposta>>(); if (eixoId != null) { try { for (Proposta proposta : PriorizacaoServiceUtil .listarPropostasPorEixoId(eixoId)) { final long propostaId = proposta.getPropostaId(); retorno.add(new CompoundPropertyModel<Proposta>( new LoadableDetachableModel<Proposta>(proposta) { @Override protected Proposta load() { try { return PriorizacaoServiceUtil .getProposta(propostaId); } catch (PortalException e) { // TODO Log LOG.error("Erro ao obter proposta.", e); return null; } catch (SystemException e) { // TODO Log LOG.error("Erro ao obter proposta.", e); return null; } } })); } } catch (SystemException e) { // TODO Log } } return retorno.iterator(); } private int getPropostasCount(long eixoId) { try { return PriorizacaoServiceUtil.getPropostasCountByEixoId(eixoId); } catch (SystemException e) { // TODO LOG.error("Erro ao obter número de propostas do eixo", e); } return 0; } }