/** * 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.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.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; public class AlterarEstruturaPanel extends Panel { private static final long serialVersionUID = 1L; private static final Log LOG = LogFactoryUtil.getLog(AlterarEstruturaPanel.class); private EstruturaDropDown agrupamentos; private Form<Void> form; private TextField<String> nomeAgrupamento; private DropDownChoice<ElementoEstrutura> paiAlt; private DropDownChoice<Estrutura> posicaoAlt; private BookmarkablePageLink<HomePage> cancelar; private Button gravar; public AlterarEstruturaPanel(String id) { super(id); } @Override protected void onInitialize() { super.onInitialize(); init(); } private void init() { initForm(); initAgrupamentos(); initNomeAgrupamento(); initPai(); initPosicao(); initGravar(); initCancelar(); desativarComponentes(); } private void initForm() { form = new Form<Void>("formAlteracao") { private static final long serialVersionUID = 1L; @Override protected void onSubmit() { gravarAlteracao(); } }; add(form); } private void initAgrupamentos() { agrupamentos = new EstruturaDropDown("agrupamentos",UIUtils.getScopeGroupId()); agrupamentos.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { if(agrupamentos.getModelObject() == null){ desativarComponentes(); }else{ ativarComponentes(); recarregaPai(getElementoPaiAtual()); recarregaPosicao(); recarregaNomeAgrupamento(); } if (target != null) { target.addComponent(paiAlt); target.addComponent(posicaoAlt); target.addComponent(nomeAgrupamento); target.addComponent(gravar); } } }); agrupamentos.setNullValid(false); form.add(agrupamentos); } private void initNomeAgrupamento() { nomeAgrupamento = new TextField<String>("nomeAgrupamento",Model.of("")); nomeAgrupamento.add(StringValidator.maximumLength(300)); nomeAgrupamento.setOutputMarkupId(true); form.add(nomeAgrupamento); } private void initGravar() { gravar = new Button("gravarAlteracao"); gravar.setOutputMarkupId(true); form.add(gravar); } private void initCancelar() { cancelar = new BookmarkablePageLink<HomePage>("cancelarAlteracao", HomePage.class); form.add(cancelar); } private void initPai() { paiAlt = new DropDownChoice<ElementoEstrutura>("paiAlt"); paiAlt.setNullValid(true); paiAlt.setOutputMarkupId(true); paiAlt.setChoiceRenderer(new IChoiceRenderer<ElementoEstrutura>() { private static final long serialVersionUID = 1L; @Override public Object getDisplayValue(ElementoEstrutura object) { return object.getTexto(); } @Override public String getIdValue(ElementoEstrutura object, int index) { return Long.toString(object.getEstruturaId()); } }); paiAlt.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { recarregaPosicao(); if (target != null) target.addComponent(posicaoAlt); } }); form.add(paiAlt); } private void initPosicao() { posicaoAlt = new DropDownChoice<Estrutura>("posicaoAlt"); posicaoAlt.setNullValid(true); posicaoAlt.setOutputMarkupId(true); posicaoAlt.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()); } }); form.add(posicaoAlt); } /** * Recarrega a lista de elementos para a posição */ private void recarregaPosicao() { ElementoEstrutura noPai = paiAlt.getModelObject(); long estruturaPaiId = (noPai == null) ? 0l : noPai.getEstruturaId(); ElementoEstrutura estruturaSelecionada = agrupamentos.getModelObject(); long estruturaSelecionadaId = (estruturaSelecionada == null) ? 0l : estruturaSelecionada.getEstruturaId(); long groupId = UIUtils.getScopeGroupId(); Estrutura anterior = null; Estrutura selecionado = null; ArrayList<Estrutura> filhosValidos = new ArrayList<Estrutura>(); try { List<Estrutura> estruturas = WikiLegisServiceUtil.listaEstruturaFilhos(groupId, estruturaPaiId); for(Estrutura estrutura : estruturas){ if (estrutura.getEstruturaId() != estruturaSelecionadaId) filhosValidos.add(estrutura); else selecionado = anterior; anterior = estrutura; } } catch (Exception e) { LOG.error("Erro ao obter lista de elementos da estrutura.Param estruturaPaiId=\""+estruturaPaiId+"\", groupId=\""+groupId+"\" ",e); } posicaoAlt.setChoices(filhosValidos); @SuppressWarnings("unchecked") List<Estrutura> choices = (List<Estrutura>) posicaoAlt.getChoices(); if (choices.isEmpty()) posicaoAlt.setModel(new Model<Estrutura>()); else if(selecionado == null) posicaoAlt.setModel(new Model<Estrutura>()); else posicaoAlt.setModel(Model.of(selecionado)); } /** * Recarrega a lista de elementos pai setando o combo para a estrutura Pai passada por parametro */ private void recarregaPai(long estruturaPaiAtualId) { ElementoEstrutura noPai = agrupamentos.getModelObject(); long estruturaPaiId = (noPai == null) ? 0l : noPai.getEstruturaId(); paiAlt.setChoices(new EstruturaListModelExclude(UIUtils.getScopeGroupId(), estruturaPaiId)); @SuppressWarnings("unchecked") List<ElementoEstrutura> choices = (List<ElementoEstrutura>) paiAlt.getChoices(); if (choices.isEmpty()){ paiAlt.setModel(new Model<ElementoEstrutura>()); } else{ paiAlt.setModel(new Model<ElementoEstrutura>()); for(ElementoEstrutura estrutura : choices){ if(estrutura.getEstruturaId() == estruturaPaiAtualId ){ paiAlt.setModel(Model.of(estrutura)); break; } } } } /* * Insere no textfield o nome do agrupamento selecionado em tela */ private void recarregaNomeAgrupamento() { ElementoEstrutura noPai = agrupamentos.getModelObject(); String textoArtigo = ""; Estrutura estrutura; try { estrutura = WikiLegisServiceUtil.getEstrutura(noPai.getEstruturaId()); } catch (PortalException e) { estrutura = null; LOG.error("Erro ao recuperar estrutura. Param estruturaId = "+noPai.getEstruturaId() ,e); estrutura = null; } catch (SystemException e) { estrutura = null; LOG.error("Erro ao recuperar estrutura. Param estruturaId = "+noPai.getEstruturaId() ,e); } if(noPai != null && estrutura != null) textoArtigo = estrutura.getTexto(); nomeAgrupamento.setModel(Model.of(textoArtigo)); } /* * ativa os componentes em tela */ private void ativarComponentes(){ paiAlt.setEnabled(true); posicaoAlt.setEnabled(true); nomeAgrupamento.setEnabled(true); gravar.setEnabled(true); } /* * desativa os componentes em tela */ private void desativarComponentes(){ paiAlt.setEnabled(false); paiAlt.setModel(null); posicaoAlt.setEnabled(false); posicaoAlt.setModel(null); nomeAgrupamento.setModel(null); nomeAgrupamento.setEnabled(false); gravar.setEnabled(false); } /** * * @return id do pai do elemento selecionado em tela */ private long getElementoPaiAtual() { ElementoEstrutura estruturaSelecionada = agrupamentos.getModelObject(); if(estruturaSelecionada != null){ try { Estrutura estrutura = WikiLegisServiceUtil.getEstrutura(estruturaSelecionada.getEstruturaId()); return estrutura.getPaiEstruturaId(); } catch (PortalException e) { LOG.error("Erro ao obter paiEstruturaId da estrutura.Param estruturaId=\""+estruturaSelecionada.getEstruturaId(),e); } catch (SystemException e) { LOG.error("Erro ao obter paiEstruturaId da estrutura.Param estruturaId=\""+estruturaSelecionada.getEstruturaId(),e); } } return 0l; } private void gravarAlteracao(){ ElementoEstrutura estruturaSelecionada = agrupamentos.getModelObject(); String novoNomeEstrutura = nomeAgrupamento.getModelObject(); long paiId = (paiAlt.getModelObject() == null ) ? 0l : paiAlt.getModelObject().getEstruturaId() ; long estruturaDepoisDe = (posicaoAlt.getModelObject() == null ) ? 0l : posicaoAlt.getModelObject().getEstruturaId() ; try { WikiLegisServiceUtil.atualizaEstrutura(estruturaSelecionada.getEstruturaId(), UIUtils.getScopeGroupId(), paiId, estruturaDepoisDe, novoNomeEstrutura); info("Suas alterações foram gravadas com sucesso!"); } catch (SystemException e) { // XXX LOG.error("Erro ao gravar alterações da estrutura.", e); error("Erro ao tentar gravar alterações"); } catch (PortalException e) { // XXX LOG.error("Erro ao gravar alterações da estrutura.", e); error("Erro ao tentar gravar alterações"); } } /** * Lista de elementos, organizados de forma hierárquica excluindo a estrutura do parametro * * @author robson * */ private static class EstruturaListModelExclude extends LoadableDetachableModel<List<ElementoEstrutura>> { private static final long serialVersionUID = 1L; private final long groupId; private final long estruturaAtualId; private EstruturaListModelExclude(long groupId, long estruturaAtualId) { this.groupId = groupId; this.estruturaAtualId = estruturaAtualId; } @Override protected List<ElementoEstrutura> load() { ArrayList<ElementoEstrutura> retorno = new ArrayList<ElementoEstrutura>(); try { List<Estrutura> raizes = WikiLegisServiceUtil.listaEstruturaFilhos(groupId, 0l); for (Estrutura estrutura : raizes) { adiciona(retorno, 0, estrutura); } return retorno; } catch (Exception e) { // XXX Log LOG.error("Erro ao obter lista de elementos.Param groupId=\""+groupId+"\",paiEstruturaId = \"0l\" ",e); return Collections.emptyList(); } } private void adiciona(ArrayList<ElementoEstrutura> retorno, int nivel, Estrutura estrutura) throws PortalException, SystemException { if (estrutura.getEstruturaId() != estruturaAtualId) { StringBuilder sb = new StringBuilder(nivel + estrutura.getTexto().length()); for (int i = 0; i < nivel; i++) sb.append("-"); sb.append(estrutura.getTexto()); retorno.add(new ElementoEstrutura(estrutura.getEstruturaId(), sb.toString())); List<Estrutura> filhos = WikiLegisServiceUtil.listaEstruturaFilhos(groupId, estrutura.getEstruturaId()); for (Estrutura filho : filhos) adiciona(retorno, nivel + 1, filho); } } } }