📄 propertysheetviewerex.java
字号:
* Selection in the viewer occurred. Check if there is an active cell
* editor. If yes, deactivate it and check if a new cell editor must be
* activated.
*
* @param selection
* the TreeItem that is selected
*/
private void handleSelect(TreeItem selection) {
// deactivate the current cell editor
if (cellEditor != null) {
applyEditorValue();
deactivateCellEditor();
}
// get the new selection
TreeItem[] sel = new TreeItem[] { selection };
if (sel.length == 0) {
setMessage(null);
setErrorMessage(null);
} else {
Object object = sel[0].getData(); // assume single selection
if (object instanceof IPropertySheetEntry) {
// get the entry for this item
IPropertySheetEntry activeEntry = (IPropertySheetEntry) object;
// display the description for the item
setMessage(activeEntry.getDescription());
// activate a cell editor on the selection
activateCellEditor(sel[0]);
}
}
entrySelectionChanged();
}
/**
* The expand icon for a node in this viewer has been selected to collapse a
* subtree. Deactivate the cell editor
*
* @param event
* the SWT tree event
*/
private void handleTreeCollapse(TreeEvent event) {
if (cellEditor != null) {
applyEditorValue();
deactivateCellEditor();
}
}
/**
* The expand icon for a node in this viewer has been selected to expand the
* subtree. Create the children 1 level deep.
* <p>
* Note that we use a "dummy" item (no user data) to show a "+" icon beside
* an item which has children before the item is expanded now that it is
* being expanded we have to create the real child items
* </p>
*
* @param event
* the SWT tree event
*/
private void handleTreeExpand(TreeEvent event) {
createChildren(event.item);
}
/**
* Hides the categories.
*/
/* package */
void hideCategories() {
isShowingCategories = false;
categories = null;
refresh();
}
/**
* Hides the expert properties.
*/
/* package */
void hideExpert() {
isShowingExpertProperties = false;
refresh();
}
/**
* Establish this viewer as a listener on the control
*/
private void hookControl() {
// Handle selections in the Tree
// Part1: Double click only (allow traversal via keyboard without
// activation
tree.addSelectionListener(new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
// The viewer only owns the status line when there is
// no 'active' cell editor
if (cellEditor == null || !cellEditor.isActivated()) {
updateStatusLine(e.item);
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent e) {
handleSelect((TreeItem) e.item);
}
});
// Part2: handle single click activation of cell editor
tree.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent event) {
// only activate if there is a cell editor
Point pt = new Point(event.x, event.y);
TreeItem item = tree.getItem(pt);
if (item != null) {
handleSelect(item);
}
}
});
// Add a tree listener to expand and collapse which
// allows for lazy creation of children
tree.addTreeListener(new TreeListener() {
public void treeExpanded(final TreeEvent event) {
handleTreeExpand(event);
}
public void treeCollapsed(final TreeEvent event) {
handleTreeCollapse(event);
}
});
// Refresh the tree when F5 pressed
tree.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if (e.character == SWT.ESC) {
deactivateCellEditor();
} else if (e.keyCode == SWT.F5) {
// The following will simulate a reselect
setInput(getInput());
}
}
});
}
/**
* Update the status line based on the data of item.
* @param item
*/
protected void updateStatusLine(Widget item) {
setMessage(null);
setErrorMessage(null);
// Update the status line
if (item != null) {
if (item.getData() instanceof PropertySheetEntry) {
PropertySheetEntry psEntry = (PropertySheetEntry) item.getData();
// For entries, show the description if any, else show the label
String desc = psEntry.getDescription();
if (desc != null && desc.length() > 0) {
setMessage(psEntry.getDescription());
} else {
setMessage(psEntry.getDisplayName());
}
}
else if (item.getData() instanceof PropertySheetCategory) {
PropertySheetCategory psCat = (PropertySheetCategory) item.getData();
setMessage(psCat.getCategoryName());
}
}
}
/**
* Updates all of the items in the tree.
* <p>
* Note that this means ensuring that the tree items reflect the state of
* the model (entry tree) it does not mean telling the model to update
* itself.
* </p>
*/
public void refresh() {
if (rootEntry != null) {
updateChildrenOf(rootEntry, tree);
}
}
/**
* Removes the given cell editor activation listener from this viewer. Has
* no effect if an identical activation listener is not registered.
*
* @param listener
* a cell editor activation listener
*/
/* package */
void removeActivationListener(ICellEditorActivationListener listener) {
activationListeners.remove(listener);
}
/**
* Remove the given item from the tree. Remove our listener if the
* item's user data is a an entry then set the user data to null
*
* @param item
* the item to remove
*/
private void removeItem(TreeItem item) {
Object data = item.getData();
if (data instanceof IPropertySheetEntry) {
((IPropertySheetEntry) data)
.removePropertySheetEntryListener(entryListener);
}
item.setData(null);
item.dispose();
}
/**
* Reset the selected properties to their default values.
*/
public void resetProperties() {
// Determine the selection
IStructuredSelection selection = (IStructuredSelection) getSelection();
// Iterate over entries and reset them
Iterator itr = selection.iterator();
while (itr.hasNext()) {
((IPropertySheetEntry) itr.next()).resetPropertyValue();
}
}
/**
* Sets the error message to be displayed in the status line.
*
* @param errorMessage
* the message to be displayed, or <code>null</code>
*/
private void setErrorMessage(String errorMessage) {
// show the error message
if (statusLineManager != null) {
statusLineManager.setErrorMessage(errorMessage);
}
}
/**
* The <code>PropertySheetViewer</code> implementation of this method
* declared on <code>Viewer</code> method sets the objects for which the
* viewer is currently showing properties.
* <p>
* The input must be an <code>Object[]</code> or <code>null</code>.
* </p>
*
* @param newInput
* the input of this viewer, or <code>null</code> if none
*/
public void setInput(Object newInput) {
// need to save any changed value when user clicks elsewhere
applyEditorValue();
// deactivate our cell editor
deactivateCellEditor();
// set the new input to the root entry
input = (Object[]) newInput;
if (input == null) {
input = new Object[0];
}
if (rootEntry != null) {
rootEntry.setValues(input);
// ensure first level children are visible
updateChildrenOf(rootEntry, tree);
}
}
/**
* Sets the message to be displayed in the status line. This message is
* displayed when there is no error message.
*
* @param message
* the message to be displayed, or <code>null</code>
*/
private void setMessage(String message) {
// show the message
if (statusLineManager != null) {
statusLineManager.setMessage(message);
}
}
/**
* Sets the root entry for this property sheet viewer. The root entry is not
* visible in the viewer.
*
* @param root
* the root entry
*/
public void setRootEntry(IPropertySheetEntry root) {
// If we have a root entry, remove our entry listener
if (rootEntry != null) {
rootEntry.removePropertySheetEntryListener(entryListener);
}
rootEntry = root;
// Set the root as user data on the tree
tree.setData(rootEntry);
// Add an IPropertySheetEntryListener to listen for entry change
// notifications
rootEntry.addPropertySheetEntryListener(entryListener);
// Pass our input to the root, this will trigger entry change
// callbacks to update this viewer
setInput(input);
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.Viewer#setSelection(org.eclipse.jface.viewers.ISelection, boolean)
*/
public void setSelection(ISelection selection, boolean reveal) {
//Do nothing by default
}
/**
* Sets the sorter for this viewer.
* <p>
* The default sorter sorts categories and entries alphabetically.
* A viewer update needs to be triggered after the sorter has changed.
* </p>
* @param sorter the sorter to set (<code>null</code> will reset to the
* default sorter)
* @since 3.1
*/
public void setSorter(PropertySheetSorterEx sorter) {
if (null == sorter) {
sorter = new PropertySheetSorterEx();
}
this.sorter = sorter;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -