/**
* 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.Collections;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.validation.validator.StringValidator;
import br.gov.camara.edemocracia.portlets.wikilegis.model.Estrutura;
import br.gov.camara.edemocracia.portlets.wikilegis.service.WikiLegisServiceUtil;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.components.EstruturaDropDown;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.model.ElementoEstrutura;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.pages.HomePage;
import br.gov.camara.edemocracia.portlets.wikilegis.ui.util.UIUtils;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
public class NovaEstruturaPanel extends Panel {
private static final long serialVersionUID = 1L;
private static final Log LOG = LogFactoryUtil.getLog(NovaEstruturaPanel.class);
////////////////////////////////
//Componentes
////////////////////////////////
private Form<Void> form;
/**
* Nome do novo agrupamento
*/
private TextField<String> novoAgrupamento;
/**
* Nó pai
*/
private EstruturaDropDown pai;
/**
* Em qual posição?
*/
private DropDownChoice<Estrutura> posicao;
/**
* Botão para criar
*/
private Button criar;
/**
* Botão para cancelar
*/
private BookmarkablePageLink<HomePage> cancelar;
public NovaEstruturaPanel(String id) {
super(id);
}
@Override
protected void onInitialize() {
super.onInitialize();
init();
}
private void init() {
initForm();
initNovoAgrupamento();
initPai();
initPosicao();
initCriar();
initCancelar();
}
private void initForm() {
form = new Form<Void>("form") {
@Override
protected void onSubmit() {
criaEstrutura();
}
};
add(form);
}
private void initNovoAgrupamento() {
novoAgrupamento = new TextField<String>("novoAgrupamento", Model.of(""));
novoAgrupamento.add(StringValidator.maximumLength(300));
novoAgrupamento.setOutputMarkupId(true);
form.add(novoAgrupamento);
}
private void initPai() {
pai = new EstruturaDropDown("pai",UIUtils.getScopeGroupId()) ;
pai.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
recarregaPosicao();
if (target != null)
target.addComponent(posicao);
}
});
form.add(pai);
}
private void initPosicao() {
posicao = new DropDownChoice<Estrutura>("posicao");
posicao.setNullValid(true);
posicao.setOutputMarkupId(true);
posicao.setChoiceRenderer(new IChoiceRenderer<Estrutura>() {
private static final long serialVersionUID = 1L;
@Override
public Object getDisplayValue(Estrutura object) {
return object.getTexto();
}
@Override
public String getIdValue(Estrutura object, int index) {
return Long.toString(object.getEstruturaId());
}
});
posicao.setOutputMarkupId(true);
recarregaPosicao();
form.add(posicao);
}
private void initCriar() {
criar = new Button("criar");
form.add(criar);
}
private void initCancelar() {
cancelar = new BookmarkablePageLink<HomePage>("cancelar", HomePage.class);
form.add(cancelar);
}
/**
* Cria uma nova estrutura na posição informada
*/
private void criaEstrutura() {
ElementoEstrutura noPai = pai.getModelObject();
Estrutura noPosicao = posicao.getModelObject();
long paiId = (noPai == null) ? 0l : noPai.getEstruturaId();
long antesDeId = (noPosicao == null) ? 0l : noPosicao.getEstruturaId();
try {
posicao.setModelObject(WikiLegisServiceUtil.criaEstrutura(UIUtils.getScopeGroupId(), paiId, antesDeId, novoAgrupamento.getModelObject()));
novoAgrupamento.setModelObject("");
} catch (Exception e) {
// TODO Log
LOG.error("Erro ao criar nova estrutura na posição informada",e);
error("Erro ao gravar nova estrutura");
}
}
/**
* Recarrega a lista de elementos para a posição
*/
private void recarregaPosicao() {
ElementoEstrutura noPai = pai.getModelObject();
long estruturaPaiId = (noPai == null) ? 0l : noPai.getEstruturaId();
posicao.setChoices(new EstruturaListModel(UIUtils.getScopeGroupId(), estruturaPaiId));
@SuppressWarnings("unchecked")
List<Estrutura> choices = (List<Estrutura>) posicao.getChoices();
if (choices.isEmpty())
posicao.setModel(new Model<Estrutura>());
else
posicao.setModel(Model.of(choices.get(choices.size()-1)));
}
/**
* Lista de elementos de um nível da estrutura
*
* @author robson
*
*/
private static class EstruturaListModel extends LoadableDetachableModel<List<Estrutura>> {
private static final long serialVersionUID = 1L;
private final long groupId;
private final long estruturaPaiId;
private EstruturaListModel(long groupId, long estruturaPaiId) {
this.groupId = groupId;
this.estruturaPaiId = estruturaPaiId;
}
@Override
protected List<Estrutura> load() {
try {
return WikiLegisServiceUtil.listaEstruturaFilhos(groupId, estruturaPaiId);
} catch (Exception e) {
// XXX Log
LOG.error("Erro ao obter lista de elementos da estrutura.Param estruturaPaiId=\""+estruturaPaiId+"\", groupId=\""+groupId+"\" ",e);
return Collections.emptyList();
}
}
}
}