📄 treeviewer.java
字号:
/******************************************************************************* * 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 + -