📄 treecombostrategy.java
字号:
package com.swtplus.widgets.combo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.TreeListener;
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.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import com.swtplus.internal.Assert;
import com.swtplus.widgets.PCombo;
/**
* TreeComboStrategy creates a Tree widget within a PCombo's dropdown.
* The value object returned to the PCombo is a TreeItem.
*/
public class TreeComboStrategy implements IComboStrategy {
private Tree tree;
private int visibleItemCount = 5;
private int treeStyle;
private boolean ignoreSelection = false;
/**
* Creates a TreeComboStrategy with the given strategy style and the
* given SWT Tree style.
*
* @param style style bits for this strategy (currently none available)
* @param treeStyle SWT style bits to be given to Tree constructor
*/
public TreeComboStrategy(int style,int treeStyle) {
this.treeStyle = treeStyle;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#getSize(int)
*/
public Point getSize(int comboWidth) {
//this is a small hack to select an item if none is selected
//if we dont do this, the tree will autoselect an item if it
//is given focus and no item is selected
TreeItem[] items = tree.getSelection();
if (items.length == 0 && tree.getItemCount() > 0){
TreeItem item = tree.getItem(0);
tree.setSelection(new TreeItem[]{item});
}
int x = Math.max(comboWidth,tree.computeSize(SWT.DEFAULT,SWT.DEFAULT).x);
int y = tree.getHeaderHeight() + (visibleItemCount * tree.getItemHeight());
return new Point(x,y);
}
/* (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) {
tree = new Tree(parent,treeStyle);
tree.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
if (!ignoreSelection){
TreeItem[] items = tree.getSelection();
updater.update(items[0],true);
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}}
);
tree.addTreeListener(new TreeListener(){
public void treeCollapsed(TreeEvent arg0) {
ignoreSelection = true;
tree.getDisplay().asyncExec(new Runnable(){
public void run() {
ignoreSelection = false;
}}
);
}
public void treeExpanded(TreeEvent arg0) {
}}
);
return tree;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#keyUp(com.swtplus.widgets.combo.IComboUpdater)
*/
public void keyUp(IComboUpdater updater) {
if (tree.getItemCount() == 0)
return;
TreeItem[] sel = tree.getSelection();
if (sel.length == 0)
return;
TreeItem newSelect = getPreviousItem(sel[0]);
if (newSelect == null)
return;
tree.setSelection(new TreeItem[]{newSelect});
tree.showSelection();
TreeItem[] items = tree.getSelection();
if (items.length < 1)
return;
updater.update(items[0],false);
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#keyDown(com.swtplus.widgets.combo.IComboUpdater)
*/
public void keyDown(IComboUpdater updater) {
if (tree.getItemCount() == 0)
return;
TreeItem[] sel = tree.getSelection();
if (sel.length == 0)
return;
TreeItem newSelect = getNextItem(sel[0]);
if (newSelect == null)
return;
tree.setSelection(new TreeItem[]{newSelect});
tree.showSelection();
TreeItem[] items = tree.getSelection();
if (items.length < 1)
return;
updater.update(items[0],false);
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#selectValue(java.lang.Object)
*/
public void selectValue(Object newValue) {
tree.setSelection(new TreeItem[]{(TreeItem) newValue});
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#canReturnFocusOnMouseDown()
*/
public boolean canReturnFocusOnMouseDown() {
return false;
}
/**
* 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 visibleItemCount Items to be visible
*
*/
public void setVisibleItemCount(int visibleItemCount) {
this.visibleItemCount = visibleItemCount;
}
/**
* Returns the Tree widget created on the popup.
*
* @return Tree widget
*/
public Tree getTree() {
return tree;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#mouseWheel(int)
*/
public void mouseWheel(int linesToScroll) {
while (linesToScroll != 0){
TreeItem item = null;
if (linesToScroll < 0){
item = getNextItem(tree.getTopItem());
linesToScroll ++;
} else {
item = getPreviousItem(tree.getTopItem());
linesToScroll --;
}
if (item != null)
tree.setTopItem(item);
}
}
private TreeItem getNextItem(TreeItem item){
TreeItem next = null;
if (item.getExpanded() && item.getItemCount() >0){
next = item.getItems()[0];
} else {
try{
if (item.getParentItem() == null){
if (tree.getItemCount() > tree.indexOf(item) + 1)
next = tree.getItem(tree.indexOf(item) + 1);
} else {
TreeItem parent = item.getParentItem();
if (parent.getItemCount() > parent.indexOf(item) + 1){
next = parent.getItem(parent.indexOf(item) + 1);
} else {
parent = parent.getParentItem();
if (parent != null){
if (parent.getItemCount() > parent.indexOf(item) + 1)
next = parent.getItem(parent.indexOf(item) + 1);
} else {
if (tree.getItemCount() > tree.indexOf(item) + 1)
next = tree.getItem(tree.indexOf(item) + 1);
}
}
}
} catch (IllegalArgumentException e) {
//do nothing, let next = null
}
}
return next;
}
private TreeItem getPreviousItem(TreeItem item){
TreeItem previous = null;
try{
int index = 0;
if (item.getParentItem() == null){
index = tree.indexOf(item);
if (index > 0)
previous = tree.getItem(index -1);
} else {
index = item.getParentItem().indexOf(item);
if (index > 0){
TreeItem parent = item.getParentItem();
previous = parent.getItem(parent.indexOf(item) -1);
} else {
previous = item.getParentItem();
}
}
} catch (IllegalArgumentException e) {
//do nothing, let previous = null
}
return previous;
}
/* (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) {
if (element == null)
return "";
if (element instanceof String)
return (String) element;
TreeItem item = (TreeItem) element;
return item.getText();
}
public Image getImage(Object element) {
if (element == null)
return null;
if (element instanceof String)
return null;
TreeItem item = (TreeItem) element;
return item.getImage();
}
public String getToolTip(Object element) {
if (element == null)
return "";
if (element instanceof String)
return (String) element;
TreeItem item = (TreeItem) element;
return item.getText();
}
public void dispose() {
}
};
return labelProvider;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#jumpTo(java.lang.String)
*/
public void jumpTo(String beginning) {
TreeItem[] items = tree.getItems();
jumpTo2(items,beginning);
}
private boolean jumpTo2(TreeItem[] items, String beginning){
for (int i = 0; i < items.length; i++) {
TreeItem item = items[i];
if (item.getText().toLowerCase().startsWith(beginning.toLowerCase())){
tree.setTopItem(item);
return true;
}
if (item.getExpanded() && item.getItemCount() > 0){
if (jumpTo2(item.getItems(),beginning))
return true;
}
}
return false;
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#initializeEditor(org.eclipse.swt.widgets.Text)
*/
public void initializeEditor(Text editor) {
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#initialize(com.swtplus.widgets.combo.PCombo)
*/
public void initialize(PCombo pCombo) {
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#checkValue(java.lang.Object)
*/
public void checkValue(Object newValue) {
Assert.isTrue(newValue instanceof String || newValue instanceof TreeItem,"Value must be of type String or TreeItem");
}
/* (non-Javadoc)
* @see com.swtplus.widgets.combo.IComboStrategy#isLazyCreation()
*/
public boolean isLazyCreation() {
return false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -