⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treecombostrategy.java

📁 利用它可以做出非常漂亮的swt界面,包含的组件有PShelf Plist
💻 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 + -