title: Drag and drop ZK TreeModel issue
body: <p>I'm having problems with drag and drop, I wouldn't like to allow one node to be moved within one own subnode, for example:</p>
  
  <p>1--</p>
  
  <pre><code>  |--2
  
         |--3
  </code></pre>
  
  <p>the node 2 can't be moved to node 3, if this happen node 3 has a new subnode but has no parent. The same can't happen with the node 1 that can't be moved to node 2.</p>
  
  <p>Is there a way to prevent this without to implement a method in my viewmodel?</p>
  
  <p>or this is a bug in the compnent.</p>
  
  <p>I'm using AbstractTreeModel, because my tree can become very big and I want it to be loaded on demand, the most examples on the web are about DefaultTreeModel and I can't adapt this examples to my solution.</p>
  
  <p>I'm using ZK 7.0.0 and any help I will apreciate.</p>
  
  <p>bellow is the code used to implement:</p>
  
  <p>.zul file :</p>
  
  <pre><code>&lt;zk&gt;
  &lt;separator height="10px" /&gt;
  &lt;tree id="tree" rows="7" model="@load(vmName.unidadeTreeModel)"
      droppable="true" onDrop="@command('mudaUnidadePai', valor=event)" &gt; 
      &lt;treecols&gt;
          &lt;treecol style="font-weight: bold;"&gt;
              &lt;label value="Nome"
                  style="font-weight: bold;" /&gt;
                  &lt;label value="Editar" /&gt;
                  &lt;label value="Excluir"/&gt;
                  &lt;label value="Numero" /&gt;
          &lt;/treecol&gt;
      &lt;/treecols&gt;
      &lt;template name="model"&gt;
          &lt;treeitem &gt;
              &lt;treerow draggable="true" droppable="true"                                       
                onDrop="@command('mudaUnidadePai',
                valor=event)"&gt;
                  &lt;treecell label="@load(each.descricao)"&gt;
                          &lt;a  label="Editar"                              
                              onClick="@command('editarSelected', selected=each)" /&gt;
                          &lt;a label="Excluir"                               
                              onClick="@command('confirmarExclusaoSelected',  
                             selected=each)" /&gt;
                          &lt;label value="@load(each.numero)"/&gt;
                    &lt;/treecell&gt;
                 &lt;/treerow&gt;
             &lt;/treeitem&gt;
          &lt;/template&gt;
      &lt;/tree&gt;
  &lt;/zk&gt;
  </code></pre>
  
  <p>Here is code of my Abstract tree model :</p>
  
  <p>public class UnidadeTreeModel extends AbstractTreeModel{</p>
  
  <pre><code>private static final long serialVersionUID = 3854683349236034878L;
  
  private UnidadeServiceImpl unidadeService;
  
  public UnidadeTreeModel(Unidade unidade) {
      super(unidade);
      unidadeService = (UnidadeServiceImpl) SpringUtil.getBean("unidadeService");
  }
  
  public boolean isLeaf(Unidade node) {
      Unidade newNode = unidadeService.atualizar(node);
      return newNode.getUnidades() == null || newNode.getUnidades().size() == 0;
  }
  
  public Unidade getChild(Unidade parent, int index) {
      Unidade newParent = unidadeService.atualizar(parent);
      if ((newParent).getUnidades() != null &amp;&amp; ((Unidade) newParent).getUnidades().size() &gt; index) {
          return (newParent).getUnidades().get(index);
      } else {
          return null;
      }
  }
  
  public int getChildCount(Unidade parent) {
      Unidade newParent = unidadeService.atualizar(parent);
      return ((newParent).getUnidades() != null) ? ((Unidade) newParent).getUnidades().size() : 0;
  }
  
  public int getIndexOfChild(Unidade parent, Unidade child) {
      Unidade newParent = unidadeService.atualizar(parent);
      for (int i = 0; i &lt; newParent.getUnidades().size(); i++) {
          if (child.equals(newParent.getUnidades().get(i))) {
              return i;
          }
      }
      return -1;
  }
  </code></pre>
  
  <p>}</p>
  
  <p>And Finally part of the code from my viewModel: </p>
  
  <p>@Controller
  @Scope("session")
  public class OrganizacaoViewModel extends AbstractViewModelEnderecoLista implements IViewModelEnderecoLista, Serializable {</p>
  
  <pre><code>private static final long serialVersionUID = 5809964914070454399L;
  
  private static final Logger LOGGER = LoggerFactory.getLogger(OrganizacaoViewModel.class);
  
  @Wire
  Tree tree;
  
  @Init
  @Override
  public void init(@ContextParam(ContextType.SESSION) Session session, @ContextParam(ContextType.VIEW) Component component) {
  
      setService((UnidadeServiceImpl) SpringUtil.getBean("unidadeService"));
      tipoUnidadeService = (TipoUnidadeServiceImpl) SpringUtil.getBean("tipoUnidadeService");
  }
  
  @AfterCompose(superclass = true)
  @Override
  public void atualizarView() {
      montaArvore();
      atualizarLista();
      BindUtils.postNotifyChange(null, null, OrganizacaoViewModel.this, "*");
  }
  
     public void montaArvore() {
  
      if (getService().buscarRaiz(true) == null) {
  
          root = new Unidade();
          root.setNumero("NBASE");
          root.setDescricao("DBASE");
          root.setRaiz(true);
          try {
              getService().gravar(root);
          } catch (DuplicateEntryException e) {
              LOGGER.info("Montar arvore", e);
          }
      }
      if (unidadeTreeModel != null) {
          paths = unidadeTreeModel.getOpenPaths();
      } else {
          unidadeTreeModel = new UnidadeTreeModel(getService().buscarRaiz(true));
      }
      unidadeTreeModel.addOpenPaths(paths);
      tree.setModel(unidadeTreeModel);
      paths = null;
  }
  @Command
  public void mudaUnidadePai(@BindingParam("valor") DropEvent evento) {
  
      if (evento.getTarget().getId().equals("tree")) {
          // caso unidade seja arrastado para arvore, unidade volta para a raiz
          Treerow row = (Treerow) evento.getDragged();
          Treeitem item = (Treeitem) row.getParent();
          Unidade filho = item.getValue();
          filho.setParent(getService().buscarRaiz(true));
          try {
              getService().gravar(filho);
          } catch (DuplicateEntryException e) {
              LOGGER.info("Mudar unidade pai", e);
          }
      } else {
          // extrai novo filho
          Treerow row = (Treerow) evento.getDragged();
          Treeitem item = (Treeitem) row.getParent();
          Unidade filho = item.getValue();
  
          Treerow row2 = (Treerow) evento.getTarget();
          Treeitem item2 = (Treeitem) row2.getParent();
          Unidade pai = item2.getValue();
          pai.getUnidades().add(filho);
          filho.setParent(pai);
              try {
                  getService().gravar(filho);
              } catch (DuplicateEntryException e) {
                  LOGGER.info("Mudae unidade pai", e);
              }
           }
      BindUtils.postNotifyChange(null, null, OrganizacaoViewModel.this, "*");
  
  }
  </code></pre>
  
  <p>}</p>