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

📄 treeviewer.java

📁 jfa2ce 源码帮助开发人员更好的理解运用
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************* * Copyright (c) 2004, 2006 IBM Corporation and others. * 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: *     IBM Corporation - initial API and implementation *******************************************************************************/package org.eclipse.jface.viewers;import java.util.Iterator;import java.util.List;import org.eclipse.jface.util.Assert;import org.eclipse.swt.SWT;import org.eclipse.swt.custom.TreeEditor;import org.eclipse.swt.events.DisposeEvent;import org.eclipse.swt.events.DisposeListener;import org.eclipse.swt.events.MouseAdapter;import org.eclipse.swt.events.MouseEvent;import org.eclipse.swt.events.TreeListener;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.graphics.Point;import org.eclipse.swt.graphics.Rectangle;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Control;import org.eclipse.swt.widgets.Event;import org.eclipse.swt.widgets.Item;import org.eclipse.swt.widgets.Listener;import org.eclipse.swt.widgets.Tree;import org.eclipse.swt.widgets.TreeColumn;import org.eclipse.swt.widgets.TreeItem;import org.eclipse.swt.widgets.Widget;/** * A concrete viewer based on an SWT <code>Tree</code> control. * <p> * This class is not intended to be subclassed outside the viewer framework. It * is designed to be instantiated with a pre-existing SWT tree control and * configured with a domain-specific content provider, label provider, element * filter (optional), and element sorter (optional). * </p> * <p> * Content providers for tree viewers must implement either the * {@link ITreeContentProvider} interface or (as of 3.2) the * {@link ILazyTreeContentProvider} interface. If the content provider is an * <code>ILazyTreeContentProvider</code>, the underlying Tree must be created * using the {@link SWT#VIRTUAL} style bit, and the tree viewer will not support * sorting or filtering. * </p> */public class TreeViewer extends AbstractTreeViewer {	/**	 * TreeColorAndFontCollector is an helper class for color and font support	 * for trees that support the ITableFontProvider and the	 * ITableColorProvider.	 * 	 * @see ITableColorProvider	 * @see ITableFontProvider	 */	private class TreeColorAndFontCollector {		ITableFontProvider fontProvider = null;		ITableColorProvider colorProvider = null;		/**		 * Create an instance of the receiver. Set the color and font providers		 * if provider can be cast to the correct type.		 * 		 * @param provider		 *            IBaseLabelProvider		 */		public TreeColorAndFontCollector(IBaseLabelProvider provider) {			if (provider instanceof ITableFontProvider) {				fontProvider = (ITableFontProvider) provider;			}			if (provider instanceof ITableColorProvider) {				colorProvider = (ITableColorProvider) provider;			}		}		/**		 * Create an instance of the receiver with no color and font providers.		 */		public TreeColorAndFontCollector() {		}		/**		 * Set the fonts and colors for the treeItem if there is a color and		 * font provider available.		 * 		 * @param treeItem		 *            The item to update.		 * @param element		 *            The element being represented		 * @param column		 *            The column index		 */		public void setFontsAndColors(TreeItem treeItem, Object element,				int column) {			if (colorProvider != null) {				treeItem.setBackground(column, colorProvider.getBackground(						element, column));				treeItem.setForeground(column, colorProvider.getForeground(						element, column));			}			if (fontProvider != null) {				treeItem.setFont(column, fontProvider.getFont(element, column));			}		}	}	/**	 * Internal tree viewer implementation.	 */	private TreeEditorImpl treeViewerImpl;	/**	 * This viewer's control.	 */	private Tree tree;	/**	 * This viewer's tree editor.	 */	private TreeEditor treeEditor;	/**	 * The color and font collector for the cells.	 */	private TreeColorAndFontCollector treeColorAndFont = new TreeColorAndFontCollector();		/**	 * Flag for whether the tree has been disposed of.	 */	private boolean treeIsDisposed = false;	/**	 * Creates a tree viewer on a newly-created tree control under the given	 * parent. The tree control is created using the SWT style bits	 * <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>. The	 * viewer has no input, no content provider, a default label provider, no	 * sorter, and no filters.	 * 	 * @param parent	 *            the parent control	 */	public TreeViewer(Composite parent) {		this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);	}	/**	 * Creates a tree viewer on a newly-created tree control under the given	 * parent. The tree control is created using the given SWT style bits. The	 * viewer has no input, no content provider, a default label provider, no	 * sorter, and no filters.	 * 	 * @param parent	 *            the parent control	 * @param style	 *            the SWT style bits used to create the tree.	 */	public TreeViewer(Composite parent, int style) {		this(new Tree(parent, style));	}	/**	 * Creates a tree viewer on the given tree control. The viewer has no input,	 * no content provider, a default label provider, no sorter, and no filters.	 * 	 * @param tree	 *            the tree control	 */	public TreeViewer(Tree tree) {		super();		this.tree = tree;		hookControl(tree);		treeEditor = new TreeEditor(tree);		initTreeViewerImpl();	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected void addTreeListener(Control c, TreeListener listener) {		((Tree) c).addTreeListener(listener);	}	/**	 * Cancels a currently active cell editor. All changes already done in the	 * cell editor are lost.	 * 	 * @since 3.1	 */	public void cancelEditing() {		treeViewerImpl.cancelEditing();	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected void doUpdateItem(final Item item, Object element) {		if (!(item instanceof TreeItem)) {			return;		}		TreeItem treeItem = (TreeItem) item;		if (treeItem.isDisposed()) {			unmapElement(element, treeItem);			return;		}		getColorAndFontCollector().setFontsAndColors(element);		IBaseLabelProvider prov = getLabelProvider();		ITableLabelProvider tprov = null;		ILabelProvider lprov = null;		IViewerLabelProvider vprov = null;		ITreePathLabelProvider pprov = null;				if(prov instanceof ILabelProvider) {			lprov = (ILabelProvider) prov;		}				if (prov instanceof IViewerLabelProvider) {			vprov = (IViewerLabelProvider) prov;		} 				if (prov instanceof ITableLabelProvider) {			tprov = (ITableLabelProvider) prov;		}				if (prov instanceof ITreePathLabelProvider) {			pprov = (ITreePathLabelProvider) prov;		}						int columnCount = tree.getColumnCount();		if (columnCount == 0) {// If no columns were created use the label								// provider			ViewerLabel updateLabel = new ViewerLabel(treeItem.getText(),					treeItem.getImage());			if (pprov != null) {				TreePath path = getTreePathFromItem(item);				buildLabel(updateLabel,path,pprov);			} else 				if(vprov != null) {					buildLabel(updateLabel,element,vprov);				} else{					if(lprov != null) {						buildLabel(updateLabel,element,lprov);					}				}			// As it is possible for user code to run the event			// loop check here.			if (treeItem.isDisposed()) {				unmapElement(element, treeItem);				return;			}			if (updateLabel.hasNewText()) {				treeItem.setText(updateLabel.getText());			}			if (updateLabel.hasNewImage()) {				treeItem.setImage(updateLabel.getImage());			}						if (!updateLabel.hasPendingDecorations())				getColorAndFontCollector().applyFontsAndColors(treeItem);		} else {// Use the table based support			for (int column = 0; column < columnCount; column++) {				// Similar code in TableViewer.doUpdateItem()				String text = "";//$NON-NLS-1$				Image image = null;				treeColorAndFont.setFontsAndColors(treeItem, element, column);				if (tprov == null) {					if (column == 0) {						ViewerLabel updateLabel = new ViewerLabel(treeItem								.getText(), treeItem.getImage());						if(vprov != null) {							buildLabel(updateLabel,element,vprov);						} else{							if(lprov != null) {								buildLabel(updateLabel,element,lprov);							}						}						// As it is possible for user code to run the event						// loop check here.						if (treeItem.isDisposed()) {							unmapElement(element, treeItem);							return;						}						text = updateLabel.getText();						image = updateLabel.getImage();					}				} else {					text = tprov.getColumnText(element, column);					image = tprov.getColumnImage(element, column);				}				// Avoid setting text to null				if (text == null) {					text = ""; //$NON-NLS-1$				}				treeItem.setText(column, text);				if (treeItem.getImage(column) != image) {					treeItem.setImage(column, image);				}			}			getColorAndFontCollector().applyFontsAndColors(treeItem);		}	}		/**	 * Override to handle tree paths.	 * @see org.eclipse.jface.viewers.StructuredViewer#buildLabel(org.eclipse.jface.viewers.ViewerLabel, java.lang.Object)	 */	protected void buildLabel(ViewerLabel updateLabel, Object elementOrPath) {		Object element;		if (elementOrPath instanceof TreePath) {			TreePath path = (TreePath) elementOrPath;			IBaseLabelProvider provider = getLabelProvider();			if (provider instanceof ITreePathLabelProvider) {				ITreePathLabelProvider pprov = (ITreePathLabelProvider) provider;				buildLabel(updateLabel, path, pprov);				return;			}			element = path.getLastSegment();		} else {			element = elementOrPath;		}		super.buildLabel(updateLabel, element);	}	/**	 * Starts editing the given element.	 * 	 * @param element	 *            the element	 * @param column	 *            the column number	 * @since 3.1	 */	public void editElement(Object element, int column) {		treeViewerImpl.editElement(element, column);	}	/**	 * Returns the cell editors of this tree viewer.	 * 	 * @return the list of cell editors	 * @since 3.1	 */	public CellEditor[] getCellEditors() {		return treeViewerImpl.getCellEditors();	}	/**	 * Returns the cell modifier of this tree viewer.	 * 	 * @return the cell modifier	 * @since 3.1	 */	public ICellModifier getCellModifier() {		return treeViewerImpl.getCellModifier();	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected Item[] getChildren(Widget o) {		if (o instanceof TreeItem) {			return ((TreeItem) o).getItems();		}		if (o instanceof Tree) {			return ((Tree) o).getItems();		}		return null;	}	/**	 * Returns the column properties of this tree viewer. The properties must	 * correspond with the columns of the tree control. They are used to	 * identify the column in a cell modifier.	 * 	 * @return the list of column properties	 * @since 3.1	 */	public Object[] getColumnProperties() {		return treeViewerImpl.getColumnProperties();	}	/*	 * (non-Javadoc) Method declared in Viewer.	 */	public Control getControl() {		return tree;	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected boolean getExpanded(Item item) {		return ((TreeItem) item).getExpanded();	}	/*	 * (non-Javadoc) Method declared in StructuredViewer.	 */	protected Item getItem(int x, int y) {		return getTree().getItem(getTree().toControl(new Point(x, y)));	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected int getItemCount(Control widget) {		return ((Tree) widget).getItemCount();	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected int getItemCount(Item item) {		return ((TreeItem) item).getItemCount();	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected Item[] getItems(Item item) {		return ((TreeItem) item).getItems();	}	/**	 * The tree viewer implementation of this <code>Viewer</code> framework	 * method ensures that the given label provider is an instance of either	 * <code>ITableLabelProvider</code> or <code>ILabelProvider</code>. If	 * it is an <code>ITableLabelProvider</code>, then it provides a separate	 * label text and image for each column. If it is an	 * <code>ILabelProvider</code>, then it provides only the label text and	 * image for the first column, and any remaining columns are blank.	 */	public IBaseLabelProvider getLabelProvider() {		return super.getLabelProvider();	}	/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected Item getParentItem(Item item) {		return ((TreeItem) item).getParentItem();	}		/*	 * (non-Javadoc) Method declared in AbstractTreeViewer.	 */	protected Item[] getSelection(Control widget) {		return ((Tree) widget).getSelection();	}	/**	 * Returns this tree viewer's tree control.	 * 	 * @return the tree control	 */	public Tree getTree() {		return tree;	}	/*	 * (non-Javadoc)	 * 	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#hookControl(org.eclipse.swt.widgets.Control)	 */	protected void hookControl(Control control) {		super.hookControl(control);		Tree treeControl = (Tree) control;		treeControl.addMouseListener(new MouseAdapter() {			public void mouseDown(MouseEvent e) {				treeViewerImpl.handleMouseDown(e);			}		});		if ((treeControl.getStyle() & SWT.VIRTUAL) != 0) {			treeControl.addDisposeListener(new DisposeListener(){				public void widgetDisposed(DisposeEvent e) {					treeIsDisposed = true;					unmapAllElements();				}});			treeControl.addListener(SWT.SetData, new Listener(){				public void handleEvent(Event event) {					if (getContentProvider() instanceof ILazyTreeContentProvider) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -