blob: f175164ba6912d3936bc80bf4e01e95998dec173 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 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.utility.internal.swing;
import javax.swing.Icon;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.ListModel;
/**
* This implementation of LongListComponent.Browser uses a
* JOptionPane to prompt the user for the selection. The JOPtionPane
* is passed a FilteringListPanel to assist the user in making
* a selection.
*/
public class FilteringListBrowser<T>
implements ListChooser.ListBrowser
{
private FilteringListPanel<T> panel;
/**
* Default constructor.
*/
public FilteringListBrowser() {
super();
this.panel = this.buildPanel();
}
protected FilteringListPanel<T> buildPanel() {
return new LocalFilteringListPanel<T>();
}
/**
* Prompt the user using a JOptionPane with a filtering
* list panel.
*/
public void browse(ListChooser chooser) {
this.initializeCellRenderer(chooser);
int option =
JOptionPane.showOptionDialog(
chooser,
this.message(chooser),
this.title(chooser),
this.optionType(chooser),
this.messageType(chooser),
this.icon(chooser),
this.selectionValues(chooser),
this.initialSelectionValue(chooser)
);
if (option == JOptionPane.OK_OPTION) {
chooser.getModel().setSelectedItem(this.panel.selection());
}
// clear the text field so the list box is re-filtered
this.panel.textField().setText(""); //$NON-NLS-1$
}
protected void initializeCellRenderer(JComboBox comboBox) {
// default behavior should be to use the cell renderer from the combobox.
this.panel.listBox().setCellRenderer(comboBox.getRenderer());
}
/**
* the message can be anything - here we build a component
*/
protected Object message(JComboBox comboBox) {
this.panel.setCompleteList(this.convertToArray(comboBox.getModel()));
this.panel.setSelection(comboBox.getModel().getSelectedItem());
return this.panel;
}
protected String title(@SuppressWarnings("unused") JComboBox comboBox) {
return null;
}
protected int optionType(@SuppressWarnings("unused") JComboBox comboBox) {
return JOptionPane.OK_CANCEL_OPTION;
}
protected int messageType(@SuppressWarnings("unused") JComboBox comboBox) {
return JOptionPane.QUESTION_MESSAGE;
}
protected Icon icon(@SuppressWarnings("unused") JComboBox comboBox) {
return null;
}
protected Object[] selectionValues(@SuppressWarnings("unused") JComboBox comboBox) {
return null;
}
protected Object initialSelectionValue(@SuppressWarnings("unused") JComboBox comboBox) {
return null;
}
/**
* Convert the list of objects in the specified list model
* into an array.
*/
protected Object[] convertToArray(ListModel model) {
int size = model.getSize();
Object[] result = new Object[size];
for (int i = 0; i < size; i++) {
result[i] = model.getElementAt(i);
}
return result;
}
// ********** custom panel **********
protected static class LocalFilteringListPanel<S> extends FilteringListPanel<S> {
protected static final Object[] EMPTY_ARRAY = new Object[0];
protected LocalFilteringListPanel() {
super(EMPTY_ARRAY, null);
}
/**
* Disable the performance tweak because JOptionPane
* will try open wide enough to disable the horizontal scroll bar;
* and it looks a bit clumsy.
*/
@Override
protected String prototypeCellValue() {
return null;
}
}
}