2011-09-26 3 views
0

J'essaie d'utiliser GWT CellTree pour afficher un modèle de données hétérogène et hiérarchique. Je dois être capable de faire une seule sélection, mais être capable de sélectionner les nœuds parents ainsi que les nœuds enfants. Par exemple, si vous regardez le code example de GWT, vous verrez qu'ils ne fournissent qu'un modèle de sélection pour les noeuds de congé.GWT CellTree Sélection des nœuds parents

J'ai essayé d'étendre leur exemple en fournissant un modèle de sélection pour tous les nœuds. Cependant, cela semble impossible. Donc ce que j'ai fini avec où 3 SelectionModels un pour chaque type de noeud (Compositeur, PlayList, Song).

Qu'est-ce qui me manque?

Merci d'avance.

Répondre

1

Dans le getNodeInfo fonction de votre TreeViewModel vous devez passer le selectionModel à chaque nouvelle DefaultNodeInfo exemple à chaque niveau.

return new DefaultNodeInfo<MyDTO>(dataProvider,new MyDTOCell(),selectionModel,null); 

puis dans le SelectionChangeEventHandler vous faire quelque chose comme ceci:

selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { 
    @Override 
    public void onSelectionChange(SelectionChangeEvent event) { 
     Object object = selectionModel.getSelectedObject(); 
     if (object instanceof MyRootDTO) 
     { 
       // DO SOMETHING with root level selected node 
     } 
     else if (object instanceof MySecondLevelDTO) { 
     // DO SOMETHING WITH 2. level selected node 
     } 
     // additional levels 
}); 

Mise à jour:
Pour contourner le problème de frappe, vous pouvez définir une classe de base abstraite qui est étendu par tous vos DTO.

public abstract class BaseModel { 

    public static final ProvidesKey<BaseModel> KEY_PROVIDER = new ProvidesKey<BaseModel>() { 
     public Object getKey(BaseModel item) { 
     return item == null ? null : item.getId(); 
     } 
    }; 

    public abstract Object getId(); 
} 

Dans votre vous étendez de la DTO BaseModel et mettre en œuvre la méthode abstraite getId():

public class MyDTO extends BaseModel { 
     @Override 
     public Object getId() { 
      //return unique ID (i.e. MyDTO_1) 
     } 
} 
+0

Merci pour la réponse ... Je suppose que je manque quelque chose parce que, je pensais que le selectionModel est fortement typé. Donc, pour le nœud racine, vous devez passer dans un modèle de sélection et pour le deuxième niveau, vous devez passer dans selectionModel . Comment pourrais-je contourner cela? Merci d'avance. – hba

+0

C'est vrai. Cependant, pour contourner le problème, vous pouvez créer une classe de base abstraite (BaseModel) qui implémente l'interface ProviderKey. Tous vos DTO étendent cette classe BaseModel. (voir mise à jour sur ma réponse) –

+0

Je me suis retrouvé avec une approche différente. J'ai créé un SelectionModelController qui contient 3 selectionModels. Après quelques jours de jeu avec ce widget, j'ai réalisé qu'il n'avait pas besoin de mes autres besoins et j'ai donc écrit le mien. Merci encore. – hba

Questions connexes