/**
* 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.components;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.WebComponent;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.PropertyListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import br.gov.camara.edemocracia.portlets.priorizacao.PropostaDisplay;
import br.gov.camara.edemocracia.portlets.priorizacao.TotalVotosExcedidoException;
import br.gov.camara.edemocracia.portlets.priorizacao.VotosPorPropostaExcedidoException;
import br.gov.camara.edemocracia.portlets.priorizacao.model.Configuracao;
import br.gov.camara.edemocracia.portlets.priorizacao.service.ConfiguracaoLocalServiceUtil;
import br.gov.camara.edemocracia.portlets.priorizacao.service.PriorizacaoServiceUtil;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.pages.HomePage;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.pages.VotacaoPage;
import br.gov.camara.edemocracia.portlets.priorizacao.ui.util.UIUtils;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
/**
* @author p_7339
*
*/
public class PropostasVotacao extends Panel {
private static final long serialVersionUID = 1L;
private PropertyListView<PropostaDisplay> propostasList;
// private List<Long> propostasOrdenadas;
private boolean isVotacaoAberta() {
try {
Configuracao config = ConfiguracaoLocalServiceUtil
.getConfiguracaoPorGrupo(UIUtils.getScopeGroupId());
return config.isVotacaoAberta();
} catch (Exception e) {
return false;
}
}
/**
* Formulário
*/
private Form<?> form;
public PropostasVotacao(String id, IModel<List<PropostaDisplay>> propostas) {
super(id, propostas);
final String context = RequestCycle.get().getRequest()
.getRelativePathPrefixToContextRoot();
final boolean permissaoParaVotar = UIUtils.possuiPermissoes(
"br.gov.camara.edemocracia.portlets.priorizacao", "VOTE");
final boolean votacaoAberta = permissaoParaVotar && isVotacaoAberta();
form = new Form<Object>("form");
add(form);
form.add(new WebMarkupContainer("votos") {
@Override
public boolean isVisible() {
return permissaoParaVotar;
}
});
propostasList = new PropertyListView<PropostaDisplay>("propostas",
new LoadableDetachableModel<List<PropostaDisplay>>() {
@Override
public List<PropostaDisplay> load() {
return PropostasVotacao.this.getModelObject();
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(final ListItem<PropostaDisplay> item) {
final long propostaId = item.getModelObject().getProposta()
.getPropostaId();
PageParameters parameters = new PageParameters();
parameters.add("proposta",Long.toString(propostaId));
BookmarkablePageLink<VotacaoPage> propostaIdentificadorLink = new BookmarkablePageLink<VotacaoPage>("proposta.identificadorLink", VotacaoPage.class, parameters);
Label propostaIdentificadorSpan = new Label("proposta.identificadorSPAN",item.getModelObject().getProposta().getIdentificador());
//Configurando visibilidade
boolean textoPropostaEmpty = item.getModelObject().getProposta().getTexto().isEmpty();
propostaIdentificadorLink.setVisible(!textoPropostaEmpty);
propostaIdentificadorSpan.setVisible(textoPropostaEmpty);
if (item.getModelObject().getVotosUsuario() > 0) {
// item.add(new AttributeModifier("style", true,
// Model.of("background-color: #f3f3f3;")));
propostaIdentificadorLink.add(new Label("proposta.identificador")
.add(new AttributeModifier("style", true, Model
.of("font-weight:bold;"))));
item.add(propostaIdentificadorLink.add((new AttributeModifier("style", true, Model
.of("font-weight:bold;")))));
item.add(propostaIdentificadorSpan.add(new AttributeModifier("style", true, Model
.of("font-weight:bold;"))));
item.add(new Label("proposta.ementa")
.add(new AttributeModifier("style", true, Model
.of("font-weight:bold;"))));
} else {
propostaIdentificadorLink.add(new Label("proposta.identificador"));
item.add(propostaIdentificadorLink);
item.add(propostaIdentificadorSpan);
item.add(new Label("proposta.ementa"));
}
// item.add(new Label("totalVotos").setVisible(item
// .getModelObject().getTotalVotos() > 0));
// item.add(new Label("votosUsuario").setVisible(item
// .getModelObject().getVotosUsuario() > 0));
AjaxButton cancelarVoto = new AjaxButton("cancelarVoto", form) {
@Override
protected void onSubmit(AjaxRequestTarget target,
Form<?> form) {
target.addComponent(form);
PropostasVotacao.this.onAjaxRequest(target);
try {
PriorizacaoServiceUtil.deleteVoto(propostaId);
} catch (SystemException e) {
throw new RuntimeException(e);
} catch (PortalException e) {
error("Proposta excluída");
throw new RestartResponseException(HomePage.class);
}
}
@Override
public boolean isVisible() {
return votacaoAberta;
}
};
cancelarVoto.add(new WebComponent("icone") {
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
String imageUrl;
if (item.getModelObject().isPodeCancelarVoto())
imageUrl = "ico_menos.png";
else
imageUrl = "ico_menos_inativo.png";
tag.put("src", context + "html/imagens/" + imageUrl);
}
});
item.add(cancelarVoto);
item.add(new WebComponent("votosUsuario") {
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
Integer votos = (Integer) getDefaultModelObject();
if (votos == null)
votos = 0;
tag.put("src", context + "html/imagens/ico_check"
+ votos + ".png");
}
@Override
public boolean isVisible() {
return permissaoParaVotar;
}
});
AjaxButton votar = new AjaxButton("votar", form) {
@Override
protected void onSubmit(AjaxRequestTarget target,
Form<?> form) {
target.addComponent(form);
PropostasVotacao.this.onAjaxRequest(target);
try {
PriorizacaoServiceUtil.addVoto(propostaId);
} catch (TotalVotosExcedidoException e) {
error("Você já excedeu a quantidade máxima de votos");
} catch (VotosPorPropostaExcedidoException e) {
error("Você já votou o máximo de vezes nesta proposta");
} catch (SystemException e) {
throw new RuntimeException(e);
} catch (PortalException e) {
error("Proposta excluída");
throw new RestartResponseException(HomePage.class);
}
}
@Override
public boolean isVisible() {
return votacaoAberta;
}
};
votar.add(new WebComponent("icone") {
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
checkComponentTag(tag, "img");
String imageUrl;
if (item.getModelObject().isPodeVotar())
imageUrl = "ico_mais.png";
else
imageUrl = "ico_mais_inativo.png";
tag.put("src", context + "html/imagens/" + imageUrl);
}
});
item.add(votar);
}
};
form.add(propostasList);
}
public void rerenderComponent(AjaxRequestTarget target) {
target.addComponent(form);
}
// private final ReentrantLock lock = new ReentrantLock();
/**
* Retorna a lista em uma ordem consistente entre todas as chamadas
*
* @return
*
private List<PropostaDisplay> getPropostasOrdenadas() {
if (propostasOrdenadas != null) {
return ordenaPropostas();
}
lock.lock();
try {
if (propostasOrdenadas != null) {
return ordenaPropostas();
}
ArrayList<Long> ordem = new ArrayList<Long>();
for (PropostaDisplay proposta : getModelObject())
ordem.add(proposta.getProposta().getPropostaId());
propostasOrdenadas = ordem;
} finally {
lock.unlock();
}
return getModelObject();
}
private List<PropostaDisplay> ordenaPropostas() {
HashMap<Long, PropostaDisplay> propostas = new HashMap<Long, PropostaDisplay>();
for (PropostaDisplay proposta : getModelObject())
propostas.put(proposta.getProposta().getPropostaId(), proposta);
List<PropostaDisplay> retorno = new ArrayList<PropostaDisplay>();
for (Long propostaId : propostasOrdenadas) {
PropostaDisplay pd = propostas.get(propostaId);
if (pd != null) {
retorno.add(pd);
propostas.remove(propostaId);
}
}
// Adiciona ao final da lista as novas propostas
if (!propostas.isEmpty()) {
lock.lock();
try {
ArrayList<Long> novaListaOrdenada = new ArrayList<Long>(
propostasOrdenadas);
for (Long propostaId : novaListaOrdenada) {
propostas.remove(propostaId);
}
for (PropostaDisplay pd : propostas.values()) {
retorno.add(pd);
novaListaOrdenada.add(pd.getProposta().getPropostaId());
}
propostasOrdenadas = novaListaOrdenada;
} finally {
lock.unlock();
}
}
return retorno;
}*/
/**
* Método chamado quando houver alguma requisição AJAX
*
* @param target
*/
protected void onAjaxRequest(AjaxRequestTarget target) {
}
/**
*
* @return
*/
@SuppressWarnings("unchecked")
public IModel<List<PropostaDisplay>> getModel() {
return (IModel<List<PropostaDisplay>>) getDefaultModel();
}
/**
*
* @return
*/
@SuppressWarnings("unchecked")
public List<PropostaDisplay> getModelObject() {
return (List<PropostaDisplay>) getDefaultModelObject();
}
}