| /******************************************************************************* |
| * Copyright (c) 2008, 2009 Oracle. All rights reserved. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v1.0, which accompanies this distribution |
| * and is available at http://www.eclipse.org/legal/epl-v10.html. |
| * |
| * Contributors: |
| * Oracle - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.jpt.common.ui.internal.swt; |
| |
| import org.eclipse.jpt.common.utility.internal.StringConverter; |
| import org.eclipse.jpt.common.utility.model.value.ListValueModel; |
| import org.eclipse.jpt.common.utility.model.value.WritablePropertyValueModel; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.widgets.Combo; |
| |
| /** |
| * This adapter provides a more object-oriented interface to the items and |
| * selected item in a <code>Combo</code>. |
| * <p> |
| * <b>listHolder</b> contains the items in the <code>Combo</code>.<br> |
| * <b>selectedItemHolder</b> contains the items in 'listHolder' that are |
| * selected in the <code>Combo</code>. |
| * |
| * @param <E> The type of the items in <b>listHolder</b> |
| * @version 2.0 |
| * @since 2.0 |
| */ |
| @SuppressWarnings("nls") |
| public class ComboModelAdapter<E> extends AbstractComboModelAdapter<E> { |
| |
| // ********** static methods ********** |
| |
| /** |
| * Adapt the specified model list and selection to the specified combo. |
| * Use the default string converter to convert the model items to strings |
| * to be displayed in the combo, which calls #toString() on the |
| * items in the model list. |
| */ |
| public static <T> ComboModelAdapter<T> adapt( |
| ListValueModel<T> listHolder, |
| WritablePropertyValueModel<T> selectedItemHolder, |
| Combo combo) |
| { |
| return adapt( |
| listHolder, |
| selectedItemHolder, |
| combo, |
| StringConverter.Default.<T>instance() |
| ); |
| } |
| |
| /** |
| * Adapt the specified model list and selection to the specified combo. |
| * Use the specified string converter to convert the model items to strings |
| * to be displayed in the combo. |
| */ |
| public static <T> ComboModelAdapter<T> adapt( |
| ListValueModel<T> listHolder, |
| WritablePropertyValueModel<T> selectedItemHolder, |
| Combo combo, |
| StringConverter<T> stringConverter) |
| { |
| return new ComboModelAdapter<T>( |
| listHolder, |
| selectedItemHolder, |
| combo, |
| stringConverter |
| ); |
| } |
| |
| |
| // ********** constructors ********** |
| |
| /** |
| * Constructor - the list holder, selections holder, combo, and |
| * string converter are required. |
| */ |
| protected ComboModelAdapter( |
| ListValueModel<E> listHolder, |
| WritablePropertyValueModel<E> selectedItemHolder, |
| Combo combo, |
| StringConverter<E> stringConverter) |
| { |
| super(listHolder, |
| selectedItemHolder, |
| new SWTComboHolder(combo), |
| stringConverter); |
| } |
| |
| |
| // ********** Internal member ********** |
| |
| private static class SWTComboHolder implements ComboHolder { |
| private final Combo combo; |
| private final boolean editable; |
| private String selectedItem; |
| |
| SWTComboHolder(Combo combo) { |
| super(); |
| this.combo = combo; |
| this.editable = (combo.getStyle() & SWT.READ_ONLY) == 0; |
| } |
| |
| public void add(String item, int index) { |
| this.combo.add(item, index); |
| |
| // It is possible the selected item was set before the combo is being |
| // populated, update the selected item if it's matches the item being |
| // added |
| if ((this.selectedItem != null) && this.selectedItem.equals(item)) { |
| this.setText(this.selectedItem); |
| this.selectedItem = null; |
| } |
| } |
| |
| public void addDisposeListener(DisposeListener disposeListener) { |
| this.combo.addDisposeListener(disposeListener); |
| } |
| |
| public void addModifyListener(ModifyListener modifyListener) { |
| this.combo.addModifyListener(modifyListener); |
| } |
| |
| public void addSelectionListener(SelectionListener selectionListener) { |
| this.combo.addSelectionListener(selectionListener); |
| } |
| |
| public void deselectAll() { |
| this.combo.deselectAll(); |
| } |
| |
| public int getItemCount() { |
| return this.combo.getItemCount(); |
| } |
| |
| public String[] getItems() { |
| return this.combo.getItems(); |
| } |
| |
| public int getSelectionIndex() { |
| return this.combo.getSelectionIndex(); |
| } |
| |
| public String getText() { |
| return this.combo.getText(); |
| } |
| |
| public boolean isDisposed() { |
| return this.combo.isDisposed(); |
| } |
| |
| public boolean isEditable() { |
| return this.editable; |
| } |
| |
| public boolean isPopulating() { |
| return this.combo.getData("populating") == Boolean.TRUE; |
| } |
| |
| public void remove(int start, int end) { |
| this.combo.remove(start, end); |
| } |
| |
| public void removeAll() { |
| this.combo.removeAll(); |
| } |
| |
| public void removeDisposeListener(DisposeListener disposeListener) { |
| this.combo.removeDisposeListener(disposeListener); |
| } |
| |
| public void removeModifyListener(ModifyListener modifyListener) { |
| this.combo.removeModifyListener(modifyListener); |
| } |
| |
| public void removeSelectionListener(SelectionListener selectionListener) { |
| this.combo.removeSelectionListener(selectionListener); |
| } |
| |
| public void setItem(int index, String item) { |
| this.combo.setItem(index, item); |
| } |
| |
| public void setItems(String[] items) { |
| this.combo.setItems(items); |
| } |
| |
| public void setPopulating(boolean populating) { |
| this.combo.setData("populating", Boolean.valueOf(populating)); |
| } |
| |
| public void setText(String item) { |
| |
| // Keep track of the selected item since it's possible the selected |
| // item is before the combo is populated |
| if (this.combo.getItemCount() == 0) { |
| this.selectedItem = item; |
| } |
| else { |
| this.selectedItem = null; |
| } |
| this.combo.setText(item); |
| } |
| } |
| } |