2011-08-01 9 views
8

Tengo CellTree que utiliza un modelo MultiSelection con CheckboxCells como parte de una celda compuesta. Todo parece estar funcionando.GWT CellTree selection

Lo que en realidad estoy tratando de hacer es generar pestañas en mi interfaz para cada elemento que se puede seleccionar en el árbol. Suena trivial, pero estoy perplejo en cuanto a cómo obtener el MyData en un selectionChange. Los artículos deben permanecer seleccionados de modo que si I deselecciona ellos más tarde, las pestañas se eliminan de nuevo.

Necesito obtener el MyData para el artículo que acaba de seleccionar para saber cuál debe ser el contenido de la pestaña.

 final MultiSelectionModel<TableLight> selectionModel = new MultiSelectionModel<TableLight>(); 
    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { 

     public void onSelectionChange(SelectionChangeEvent event) { 

     } 
    }); 

Siento que me falta totalmente lo obvio. Todo lo que puedo hacer en el evento selectionChange es interrogar a mi controlador de selección para ver cuál es el conjunto seleccionado. ¿Hay alguna manera de adjuntar un oyente a una selección de árbol específica en lugar de un global "oyente ha cambiado"?

Cualquier sugerencia sería muy apreciada.

Respuesta

2

hay que acceder getSelectedSet() en su SelectionModel para obtener los elementos seleccionados en su CellTree. Lamentablemente parece que hay ahora la manera de obtener el último elemento seleccionado (como en el SingleSelectionModel).

final MultiSelectionModel<TableLight> selectionModel = new MultiSelectionModel<TableLight>(); 
    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { 

     public void onSelectionChange(SelectionChangeEvent event) { 
       Set<TableLight> selectedItems = selectionModel.getSelectedSet(); 
     } 
    }); 
+1

Sí, eso realmente apesta tan claramente que la información se conoce internamente. Pensé que tal vez habría otra manera. Lo que ya he tenido que hacer es obtener el conjunto seleccionado, luego encontrar la diferencia establecida para agregar/eliminar pestañas. – dpwr

4

Ok, para cualquiera que encuentre esto más adelante, ¡hay una manera!

Cuando agrega CheckboxCell a CompositeCell, puede especificar que se devuelva un FieldUpdater al que se llama cuando se cambia el campo.

  hasCells.add(new HasCell<TableLight, Boolean>() { 

      // Cell containing checkbox 
      private Cell cell = new CheckboxCell(true, false); 

      public Cell<Boolean> getCell() { 
       return cell; 
      } 

      public FieldUpdater<TableLight, Boolean> getFieldUpdater() { 
       return new FieldUpdater<TableLight, Boolean>() { 

        public void update(int index, TableLight object, Boolean value) { 
         if (value) { 
          tablesTabPanel.addTable(object); 
         } else { 
          tablesTabPanel.removeTable(object); 
         } 
        } 
       }; 
      } 

      public Boolean getValue(TableLight object) { 
       return selectionModel.isSelected(object); 
      } 
     }); 

Además, para evitar confusiones. Cuando estaba hablando de MyData arriba, eso es TableLight en el ejemplo.

7

Adición de un modelo de selección extendida le dará el último elemento seleccionado:

gridSelectionModel = new MultiSelectionModel<MyData>(KEY_PROVIDER){ 

     public void setSelected(MyData myData, boolean selected) { 
      super.setSelected(myData, selected); 
      if (selected){ 
       System.out.println("setSelected selected " + myData); 
       // call now some ui handler to use the last selected myData element 
      } 
     } 
    }; 

espero que esto ayude.