📄 propertysheetviewerex.java
字号:
/*******************************************************************************
* $Header: /cvsroot/EOS6/work_dir/niegy/com.primeton.studio.gef.ui/src/com/primeton/studio/gef/ui/properties/PropertySheetViewerEx.java,v 1.1 2006/11/17 03:15:13 niegy Exp $
* $Revision: 1.1 $
* $Date: 2006/11/17 03:15:13 $
*
*==============================================================================
*
* Copyright (c) 2001-2006 Primeton Technologies, Ltd.
* All rights reserved.
*
* Created on 2006-10-26
*******************************************************************************/
package com.primeton.studio.gef.ui.properties;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellEditorListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.internal.views.properties.PropertiesMessages;
import org.eclipse.ui.views.properties.IPropertySheetEntry;
import org.eclipse.ui.views.properties.IPropertySheetEntryListener;
import org.eclipse.ui.views.properties.PropertySheetEntry;
/**
* TODO此处填写 class 信息
*
* @author niegy (mailto:niegy@primeton.com)
*/
/*
* 修改历史
* $Log: PropertySheetViewerEx.java,v $
* Revision 1.1 2006/11/17 03:15:13 niegy
* create
*
*/
public class PropertySheetViewerEx extends Viewer {
// The input objects for the viewer
private Object[] input;
// The root entry of the viewer
private IPropertySheetEntry rootEntry;
// The current categories
private PropertySheetCategory[] categories;
// SWT widgets
private Tree tree;
private TreeEditor treeEditor;
private static String[] columnLabels = {
PropertiesMessages.PropertyViewer_property, PropertiesMessages.PropertyViewer_value };
private static String MISCELLANEOUS_CATEGORY_NAME = PropertiesMessages.PropertyViewer_misc;
// Cell editor support.
private int columnToEdit = 1;
private CellEditor cellEditor;
private IPropertySheetEntryListener entryListener;
private ICellEditorListener editorListener;
// Flag to indicate if categories (if any) should be shown
private boolean isShowingCategories = true;
// Flag to indicate expert properties should be shown
private boolean isShowingExpertProperties = false;
// The status line manager for showing messages
private IStatusLineManager statusLineManager;
// Cell editor activation listeners
private ListenerList activationListeners = new ListenerList();
// the property sheet sorter
private PropertySheetSorterEx sorter = new PropertySheetSorterEx();
/**
* Creates a property sheet viewer on a newly-created tree control
* under the given parent. The viewer has no input, and no root entry.
*
* @param parent
* the parent control
*/
public PropertySheetViewerEx(Composite parent) {
tree = new Tree(parent, SWT.FULL_SELECTION | SWT.SINGLE
| SWT.HIDE_SELECTION);
// configure the widget
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
// configure the columns
addColumns();
// add our listeners to the widget
hookControl();
// create a new tree editor
treeEditor = new TreeEditor(tree);
// create the entry and editor listener
createEntryListener();
createEditorListener();
}
/**
* Activate a cell editor for the given selected tree item.
*
* @param item
* the selected tree item
*/
private void activateCellEditor(TreeItem item) {
// ensure the cell editor is visible
tree.showSelection();
// Get the entry for this item
IPropertySheetEntry activeEntry = (IPropertySheetEntry) item.getData();
// Get the cell editor for the entry.
// Note that the editor parent must be the Tree control
cellEditor = activeEntry.getEditor(tree);
if (cellEditor == null) {
// unable to create the editor
return;
}
// activate the cell editor
cellEditor.activate();
// if the cell editor has no control we can stop now
Control control = cellEditor.getControl();
if (control == null) {
cellEditor.deactivate();
cellEditor = null;
return;
}
// add our editor listener
cellEditor.addListener(editorListener);
// set the layout of the tree editor to match the cell editor
CellEditor.LayoutData layout = cellEditor.getLayoutData();
treeEditor.horizontalAlignment = layout.horizontalAlignment;
treeEditor.grabHorizontal = layout.grabHorizontal;
treeEditor.minimumWidth = layout.minimumWidth;
treeEditor.setEditor(control, item, columnToEdit);
// set the error text from the cel editor
setErrorMessage(cellEditor.getErrorMessage());
// give focus to the cell editor
cellEditor.setFocus();
// notify of activation
fireCellEditorActivated(cellEditor);
}
/**
* Adds a cell editor activation listener. Has no effect if an identical
* activation listener is already registered.
*
* @param listener
* a cell editor activation listener
*/
/* package */
void addActivationListener(ICellEditorActivationListener listener) {
activationListeners.add(listener);
}
/**
* Add columns to the tree and set up the layout manager accordingly.
*/
private void addColumns() {
// create the columns
TreeColumn[] columns = tree.getColumns();
for (int i = 0; i < columnLabels.length; i++) {
String string = columnLabels[i];
if (string != null) {
TreeColumn column;
if (i < columns.length) {
column = columns[i];
} else {
column = new TreeColumn(tree, 0);
}
column.setText(string);
}
}
tree.addControlListener(new ControlAdapter() {
public void controlResized(ControlEvent e) {
Rectangle area = tree.getClientArea();
TreeColumn[] columns = tree.getColumns();
if (area.width > 0) {
columns[0].setWidth(area.width * 40 / 100);
columns[1].setWidth(area.width - columns[0].getWidth() - 4);
tree.removeControlListener(this);
}
}
});
}
/**
* Asks the entry currently being edited to apply its current cell editor
* value.
*/
private void applyEditorValue() {
TreeItem treeItem = treeEditor.getItem();
// treeItem can be null when view is opened
if (treeItem == null || treeItem.isDisposed()) {
return;
}
IPropertySheetEntry entry = (IPropertySheetEntry) treeItem.getData();
entry.applyEditorValue();
}
/**
* Creates the child items for the given widget (item or tree). This
* method is called when the item is expanded for the first time or when an
* item is assigned as the root of the tree.
* @param widget TreeItem or Tree to create the children in.
*/
private void createChildren(Widget widget) {
// get the current child items
TreeItem[] childItems = getChildItems(widget);
if (childItems.length > 0) {
Object data = childItems[0].getData();
if (data != null) {
// children already there!
return;
}
// remove the dummy
childItems[0].dispose();
}
// get the children and create their tree items
Object node = widget.getData();
List children = getChildren(node);
if (children.isEmpty()) {
// this item does't actually have any children
return;
}
for (int i = 0; i < children.size(); i++) {
// create a new tree item
createItem(children.get(i), widget, i);
}
}
/**
* Creates a new cell editor listener.
*/
private void createEditorListener() {
editorListener = new ICellEditorListener() {
public void cancelEditor() {
deactivateCellEditor();
}
public void editorValueChanged(boolean oldValidState,
boolean newValidState) {
//Do nothing
}
public void applyEditorValue() {
//Do nothing
}
};
}
/**
* Creates a new property sheet entry listener.
*/
private void createEntryListener() {
entryListener = new IPropertySheetEntryListener() {
public void childEntriesChanged(IPropertySheetEntry entry) {
// update the children of the given entry
if (entry == rootEntry) {
updateChildrenOf(entry, tree);
} else {
TreeItem item = findItem(entry);
if (item != null) {
updateChildrenOf(entry, item);
}
}
}
public void valueChanged(IPropertySheetEntry entry) {
// update the given entry
TreeItem item = findItem(entry);
if (item != null) {
updateEntry(entry, item);
}
}
public void errorMessageChanged(IPropertySheetEntry entry) {
// update the error message
setErrorMessage(entry.getErrorText());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -