package org.fanhongtao.swt.dialog;
import java.util.ArrayList;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
/**
* @author Fan Hongtao
* @created 2010-10-19
*/
public class ListInputDialog extends InputDialog
{
private String[] items = new String[] { "" };
private List list;
private boolean readOnly = true;
public ListInputDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue,
IInputValidator validator)
{
super(parentShell, dialogTitle, dialogMessage, initialValue, validator);
}
public String[] getItems()
{
return items;
}
public void setItems(String[] items)
{
this.items = items;
}
public List getList()
{
return list;
}
public void setList(List list)
{
this.list = list;
}
public boolean isReadOnly()
{
return readOnly;
}
public void setReadOnly(boolean readOnly)
{
this.readOnly = readOnly;
}
@Override
protected Control createDialogArea(Composite parent)
{
Composite composite = (Composite)super.createDialogArea(parent);
list = new List(composite, SWT.H_SCROLL | SWT.V_SCROLL);
list.setItems(items);
list.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
String[] selection = list.getSelection();
getText().setText(selection[0]);
buttonPressed(IDialogConstants.OK_ID);
}
});
GridData layoutData = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
layoutData.heightHint = convertVerticalDLUsToPixels(100);
list.setLayoutData(layoutData);
getText().addModifyListener(new ModifyListener()
{
@Override
public void modifyText(ModifyEvent arg0)
{
refreshSelectedList();
}
});
getText().addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e)
{
switch (e.keyCode)
{
case SWT.ARROW_UP:
{
int idx = list.getSelectionIndex();
list.setSelection(idx - 1);
break;
}
case SWT.ARROW_DOWN:
{
int idx = list.getSelectionIndex();
list.setSelection(idx - 1);
break;
}
default:
{
super.keyPressed(e);
}
}
}
});
return composite;
}
@Override
protected void buttonPressed(int buttonId)
{
if (buttonId == IDialogConstants.OK_ID)
{
if (readOnly)
{
if (list.getSelectionCount() == 0)
{
getText().setFocus();
return;
}
String[] selection = list.getSelection();
getText().setText(selection[0]);
}
}
super.buttonPressed(buttonId);
}
private void refreshSelectedList()
{
String inputText = getText().getText().toLowerCase();
ArrayList<String> matchedList = new ArrayList<String>();
for (String item : items)
{
if (item.toLowerCase().startsWith(inputText))
{
matchedList.add(item);
}
}
String[] matchedItems = matchedList.toArray(new String[0]);
list.setItems(matchedItems);
list.setSelection(0);
}
}