venerdì 27 novembre 2009

SWT: Combo box con modello integrato

Il widget Combo della libreria SWT non consente l'inserimento nel drop down menu' di oggetti qualunque, ma solo di String. Questa è ovviamente una limitazione perché richiede che il combobox sia affiancato da un modello dati che consenta la correlazione fra indice selezionato e oggetto a cui ci si riferisce.
Creare un wrapper per il Combo che contenga un semplice modello dati lineare (monodimensionale) è un'operazione quasi banale. Nell'esempio sottostante si suppone che BusinessObject sia il capostipite degli oggetti che si vogliono selezionare tramite il Combo; questo wrapper rende il comportamento di Combo piu' simile al suo duale Swing JComboBox.

public class BusinessObjectCombo extends Combo {

public BusinessObjectCombo(Composite parent, int style) {
super(parent, style);
}

/**
* An internal list to keep track of all elements this combo is displaying.
*/
private List model = new LinkedList();


/**
* Provides the business object corresponding to the selected element in the combo.
* @return the business object from the combo
*/
public synchronized final BusinessObject getSelectedBusinessObject(){
// get the selected index
int index = this.getSelectionIndex();
// return the element from the model
return this.model.get(index);
}

/**
* Adds a new business object to the combo and to the internal model.
* @param newElement
*/
public synchronized final void add(BusinessObject newElement){
// check arguments
if( newElement == null )
return;
else{
// add the element to the list and to the combo
this.model.add(newElement);
this.add( newElement.toString() );
}
}

/**
* Removes the specified element from the combo.
* @param element
*/
public synchronized final void remove(BusinessObject element){
// get the index from the model
int index = this.model.indexOf(element);
if( index >= 0 ){
this.model.remove(index);
this.remove(index);
}

}


/**
* Clears all the elements from the combo and the internal model.
*/
public synchronized final void clear(){
this.model = new LinkedList();
this.removeAll();
}


/**
* Adds all the elements from the specified collection.
* @param businessObjects
*/
public synchronized final void addAll(Collection businessObjects ){
for( BusinessObject bo : businessObjects )
this.add( bo );
}

}

Nessun commento: