📄 listcombostrategy.java
字号:
package com.swtplus.widgets.combo;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
import com.swtplus.internal.Assert;
import com.swtplus.widgets.AutoComplete;
import com.swtplus.widgets.PCombo;
import com.swtplus.widgets.autocomplete.IAutoCompleteProvider;
/**
* ListComboStrategy creates a PCombo that is very similar to the SWT
* CCombo. This ListComboStrategy does have some benefits over a normal
* CCombo, namely focus-flicker minimization.
* <p>
* The value object returned to the PCombo is a String.
*/
public class ListComboStrategy implements IComboStrategy {
private List list;
private int visibleItemCount = 5;
private Image image = null;
private boolean autoComplete = false;
private int style;
public static final int AUTOCOMPLETE = 1 << 1;
/**
* Creates a ListComboStrategy with the given style.
*
* @param style strategy style bit
*/
public ListComboStrategy(int style) {
if ((style & AUTOCOMPLETE) == AUTOCOMPLETE){
autoComplete = true;
}
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#getSize(int)
*/
public Point getSize(int comboWidth) {
int x = Math.max(comboWidth,list.computeSize(SWT.DEFAULT,SWT.DEFAULT).x);
int items = Math.min(visibleItemCount,list.getItemCount());
return new Point(x,items * list.getItemHeight());
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#createContents(org.eclipse.swt.widgets.Composite, com.swtplus.widgets.combo.IComboUpdater)
*/
public Control createContents(Composite parent, final IComboUpdater updater)
{
list = new List(parent,SWT.V_SCROLL);
list.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
updater.update(list.getSelection()[0],true);
}
public void widgetDefaultSelected(SelectionEvent e) {
}}
);
return list;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#keyUp(com.swtplus.widgets.combo.IComboUpdater)
*/
public void keyUp(IComboUpdater updater) {
int sel = list.getSelectionIndex();
if (sel < 1)
return;
list.setSelection(sel -1);
list.showSelection();
updater.update(list.getSelection()[0],false);
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#keyDown(com.swtplus.widgets.combo.IComboUpdater)
*/
public void keyDown(IComboUpdater updater) {
if (list.getItemCount() == 0)
return;
int sel = list.getSelectionIndex();
if (sel == -1){
list.setSelection(0);
} else if (sel != list.getItemCount() -1){
list.setSelection(sel +1);
} else if (sel == list.getItemCount()){
return;
}
list.showSelection();
updater.update(list.getSelection()[0],false);
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#selectValue(java.lang.Object)
*/
public void selectValue(Object newValue) {
list.setSelection(new String[]{(String) newValue});
}
/**
* Returns the List widget created on the popup.
*
* @return the underlying List widget
*/
public List getList() {
return list;
}
/**
* Returns the number of items that will be visible in the
* popup.
*
* @return Items to be visible
*/
public int getVisibleItemCount() {
return visibleItemCount;
}
/**
* Sets how many items will be visible in the popup.
* @param itemsToShow Items to be visible
*
*/
public void setVisibleItemCount(int itemsToShow) {
this.visibleItemCount = itemsToShow;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#canReturnFocusOnMouseDown()
*/
public boolean canReturnFocusOnMouseDown() {
return true;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#mouseWheel(int)
*/
public void mouseWheel(int linesToScroll){
linesToScroll = -linesToScroll;
if (list.getItemCount() == 0)
return;
int current = list.getTopIndex();
current += linesToScroll;
if (current < 0){
current = 0;
} else if (current > list.getItemCount() -1){
current = list.getItemCount() -1;
}
list.setTopIndex(current);
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#dispose()
*/
public void dispose() {
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#createLabelProvider()
*/
public IComboLabelProvider createLabelProvider(){
IComboLabelProvider labelProvider = new IComboLabelProvider(){
public String getText(Object element) {
return (String) element;
}
public Image getImage(Object element) {
return image;
}
public String getToolTip(Object element) {
return (String) element;
}
public void dispose() {
}
};
return labelProvider;
}
/**
* Returns the default image.
*
* @return default image
*/
public Image getImage() {
return image;
}
/**
* Sets a default image to be used for the PCombo.
*
* @param image default image
*/
public void setImage(Image image) {
this.image = image;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#jumpTo(java.lang.String)
*/
public void jumpTo(String beginning) {
String[] items = list.getItems();
for (int i = 0; i < items.length; i++) {
String item = items[i];
if (item.toLowerCase().startsWith(beginning.toLowerCase())){
list.setTopIndex(i);
break;
}
}
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#initializeEditor(org.eclipse.swt.widgets.Text)
*/
public void initializeEditor(Text editor) {
if (autoComplete == true){
int acStyle = SWT.NONE;
if ((style & PCombo.RESIZE) == PCombo.RESIZE){
acStyle = AutoComplete.RESIZE;
}
new AutoComplete(editor,acStyle,new IAutoCompleteProvider() {
public String[] getValues(String[] values, String typedText) {
String[] listValues = list.getItems();
ArrayList display = new ArrayList();
for (int i = 0; i < listValues.length; i++) {
if (listValues[i].toLowerCase().startsWith(typedText.toLowerCase()))
display.add(listValues[i]);
}
return (String[]) display.toArray(new String[0]);
}
});
}
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#initialize(com.swtplus.widgets.combo.PCombo)
*/
public void initialize(PCombo pCombo) {
style = pCombo.getStyle();
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#checkValue(java.lang.Object)
*/
public void checkValue(Object newValue) {
Assert.isTrue(newValue instanceof String,"Value must be instance of String");
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#isLazyCreation()
*/
public boolean isLazyCreation() {
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -