/**
* 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.movetopico.view;
import java.util.Collection;
import javax.swing.tree.DefaultMutableTreeNode;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.extensions.wizard.Wizard;
import org.apache.wicket.extensions.wizard.dynamic.DynamicWizardModel;
import org.apache.wicket.extensions.wizard.dynamic.DynamicWizardStep;
import org.apache.wicket.extensions.wizard.dynamic.IDynamicWizardStep;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.tree.BaseTree;
import org.apache.wicket.markup.html.tree.LinkTree;
import br.gov.camara.edemocracia.movetopico.model.BuliderModeloArvoreForuns;
import br.gov.camara.edemocracia.movetopico.model.Forum;
import br.gov.camara.edemocracia.movetopico.model.InfoMoverTopico;
import br.gov.camara.edemocracia.movetopico.model.ModeloListaComunidadesDestino;
import br.gov.camara.edemocracia.movetopico.model.ModeloListaTopicosDeForum;
import br.gov.camara.edemocracia.movetopico.model.Topico;
import br.gov.camara.edemocracia.movetopico.service.MoveTopicoLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.model.Group;
import com.liferay.portlet.messageboards.model.MBCategoryConstants;
public class MoveTopicosWizard extends Wizard {
/**
*
*/
private static final long serialVersionUID = -3271119522088888547L;
private DynamicWizardModel modelo;
private InfoMoverTopico info;
public MoveTopicosWizard(String id, Group comunidadeOrigem, long idUsuario) {
super(id);
info = new InfoMoverTopico(idUsuario, comunidadeOrigem.getGroupId(), comunidadeOrigem.getName(),comunidadeOrigem.getFriendlyURL());
modelo = new DynamicWizardModel(new ForumOrigemStep()) {
/**
*
*/
private static final long serialVersionUID = 472362717938017089L;
@Override
public void finish() {
try {
MoveTopicoLocalServiceUtil.moveTopico(info);
setResponsePage(new SucessoAoMoverPage());
} catch (PortalException e) {
e.printStackTrace();
setResponsePage(new FalhaAoMoverPage());
} catch (SystemException e) {
e.printStackTrace();
setResponsePage(new FalhaAoMoverPage());
}
super.finish();
}
};
modelo.setLastVisible(false);
init(modelo);
}
private class ForumOrigemStep extends DynamicWizardStep {
/**
*
*/
private static final long serialVersionUID = -4185799867162685606L;
public ForumOrigemStep() {
super(null,"Escolha o fórum","Clique no fórum cujo tópico será movido");
setComplete(false);
LinkTree arvoreForums = new LinkTree("forums",
new BuliderModeloArvoreForuns(info.getIdComunidadeOrigem()).construir()) {
private static final long serialVersionUID = 6698027674151343855L;
@Override
protected void onNodeLinkClicked(Object node, BaseTree tree,
AjaxRequestTarget target) {
Collection<Object> selectedNodes = tree.getTreeState()
.getSelectedNodes();
setComplete(selectedNodes.contains(node));
if (isComplete()) {
DefaultMutableTreeNode noArvore = (DefaultMutableTreeNode) node;
if (noArvore.getUserObject() instanceof Forum) {
Forum forum = (Forum) noArvore.getUserObject();
info.setIdForumOrigem(forum.getId());
info.setNomeForumOrigem(forum.getNome());
} else {
info.setIdForumOrigem(MBCategoryConstants.DEFAULT_PARENT_CATEGORY_ID);
info.setNomeForumOrigem("Forum da comunidade " + info.getNomeComunidadeOrigem());
}
}
}
};
add(arvoreForums);
}
@Override
public boolean isLastStep() {
return false;
}
@Override
public IDynamicWizardStep next() {
return new TopicoStep(this);
}
}
private class TopicoStep extends DynamicWizardStep {
/**
*
*/
private static final long serialVersionUID = 2870739302876867478L;
public TopicoStep(IDynamicWizardStep previous) {
super(previous,"Escolha o Tópico","CLique no tópico a mover");
setComplete(false);
ListView<Topico> topicos = new ListView<Topico>("topicos",
new ModeloListaTopicosDeForum(info.getIdComunidadeOrigem(), info.getIdForumOrigem())) {
private static final long serialVersionUID = -5113198906301138306L;
@Override
protected void populateItem(final ListItem<Topico> item) {
Link<Void> linkTopico = new AjaxFallbackLink<Void>(
"link_topico") {
private static final long serialVersionUID = 2729459814700718807L;
@Override
public void onClick(AjaxRequestTarget target) {
info.setIdTopico(item.getModelObject().getId());
info.setNomeTopico(item.getModelObject().getAssunto());
setComplete(true);
}
};
Label nomeTopico = new Label("nome_topico", item.getModelObject().toString());
linkTopico.setOutputMarkupId(true);
linkTopico.add(nomeTopico);
item.add(linkTopico);
}
};
topicos.setOutputMarkupId(true);
add(topicos);
}
@Override
public boolean isLastStep() {
return false;
}
@Override
public IDynamicWizardStep next() {
return new ComunidadeDestinoStep(this);
}
}
private class ComunidadeDestinoStep extends DynamicWizardStep {
/**
*
*/
private static final long serialVersionUID = 3775185109321135772L;
public ComunidadeDestinoStep(IDynamicWizardStep previousStep) {
super(previousStep,"Escolha a Comunidade de Destino","Clique na comunidade para onde o tópico será movido");
ListView<Group> comunidades = new ListView<Group>("comunidades",
new ModeloListaComunidadesDestino(info.getIdUsuario(),info.getIdComunidadeOrigem())) {
private static final long serialVersionUID = -5113198906301138306L;
@Override
protected void populateItem(final ListItem<Group> item) {
Link<Void> linkComunidade = new AjaxFallbackLink<Void>(
"link_comunidade") {
private static final long serialVersionUID = 2729459814700718807L;
@Override
public void onClick(AjaxRequestTarget target) {
Group comunidade = item.getModelObject();
info.setIdComunidadeDestino(comunidade.getGroupId());
info.setUrlComunidadeDestino(comunidade.getFriendlyURL());
info.setNomeComunidadeDestino(comunidade.getName());
setComplete(true);
}
};
Label nomeComunidade = new Label("nome_comunidade", item.getModelObject().getName());
linkComunidade.setOutputMarkupId(true);
linkComunidade.add(nomeComunidade);
item.add(linkComunidade);
}
};
comunidades.setOutputMarkupId(true);
add(comunidades);
}
@Override
public boolean isLastStep() {
return false;
}
@Override
public IDynamicWizardStep next() {
return new ForumDestinoStep(this);
}
}
private class ForumDestinoStep extends DynamicWizardStep {
private static final long serialVersionUID = -88860392537324502L;
public ForumDestinoStep(IDynamicWizardStep previousStep) {
super(previousStep,"Escolha o Fórum de destino","Clique no fórum para onde o tópico será movido");
setComplete(false);
LinkTree arvoreForums = new LinkTree("forums",
new BuliderModeloArvoreForuns(info.getIdComunidadeDestino()).construir()) {
private static final long serialVersionUID = 6698027674151343855L;
@Override
protected void onNodeLinkClicked(Object node, BaseTree tree,
AjaxRequestTarget target) {
Collection<Object> selectedNodes = tree.getTreeState()
.getSelectedNodes();
setComplete(selectedNodes.contains(node));
if (isComplete()) {
DefaultMutableTreeNode noArvore = (DefaultMutableTreeNode) node;
if (noArvore.getUserObject() instanceof Forum) {
Forum forum = (Forum) noArvore.getUserObject();
info.setIdForumDestino(forum.getId());
info.setNomeForumDestino(forum.getNome());
} else {
info.setIdForumDestino(MBCategoryConstants.DEFAULT_PARENT_CATEGORY_ID);
info.setNomeForumDestino("Forum da comunidade " + info.getNomeComunidadeDestino());
}
}
}
};
add(arvoreForums);
}
@Override
public boolean isLastStep() {
return false;
}
@Override
public IDynamicWizardStep next() {
return new ConfirmaMovimentacaoStep(this);
}
}
private class ConfirmaMovimentacaoStep extends DynamicWizardStep {
/**
*
*/
private static final long serialVersionUID = -6822513350959878576L;
public ConfirmaMovimentacaoStep(IDynamicWizardStep previousStep) {
super(previousStep,"Conclusão","Confirme a movimentação");
add(new Label("topico",info.getNomeTopico()));
add(new Label("forum_origem",info.getNomeForumOrigem()));
add(new ExternalLink("link_comunidade_origem", info.getUrlComunidadeOrigem(), info.getNomeComunidadeOrigem()));
add(new Label("forum_destino",info.getNomeForumDestino()));
add(new ExternalLink("link_comunidade_destino",info.getUrlComunidadeDestino(),info.getNomeComunidadeDestino()));
setComplete(true);
}
@Override
public boolean isLastStep() {
return true;
}
@Override
public IDynamicWizardStep next() {
return null;
}
}
}