📄 propertysheetviewerex.java
字号:
}
/**
* Sets the status line manager this view will use to show messages.
*
* @param manager
* the status line manager
*/
public void setStatusLineManager(IStatusLineManager manager) {
statusLineManager = manager;
}
/**
* Shows the categories.
*/
/* package */
void showCategories() {
isShowingCategories = true;
refresh();
}
/**
* Shows the expert properties.
*/
/* package */
void showExpert() {
isShowingExpertProperties = true;
refresh();
}
/**
* Updates the categories. Reuses old categories if possible.
*/
private void updateCategories() {
// lazy initialize
if (categories == null) {
categories = new PropertySheetCategory[0];
}
// get all the filtered child entries of the root
List childEntries = getFilteredEntries(rootEntry.getChildEntries());
// if the list is empty, just set an empty categories array
if (childEntries.size() == 0) {
categories = new PropertySheetCategory[0];
return;
}
// cache old categories by their descriptor name
Map categoryCache = new HashMap(categories.length * 2 + 1);
for (int i = 0; i < categories.length; i++) {
categories[i].removeAllEntries();
categoryCache.put(categories[i].getCategoryName(), categories[i]);
}
// create a list of categories to get rid of
List categoriesToRemove = new ArrayList(Arrays.asList(categories));
// Determine the categories
PropertySheetCategory misc = (PropertySheetCategory) categoryCache
.get(MISCELLANEOUS_CATEGORY_NAME);
if (misc == null) {
misc = new PropertySheetCategory(MISCELLANEOUS_CATEGORY_NAME);
}
boolean addMisc = false;
for (int i = 0; i < childEntries.size(); i++) {
IPropertySheetEntry childEntry = (IPropertySheetEntry) childEntries
.get(i);
String categoryName = childEntry.getCategory();
if (categoryName == null) {
misc.addEntry(childEntry);
addMisc = true;
categoriesToRemove.remove(misc);
} else {
PropertySheetCategory category = (PropertySheetCategory) categoryCache
.get(categoryName);
if (category == null) {
category = new PropertySheetCategory(categoryName);
categoryCache.put(categoryName, category);
} else {
categoriesToRemove.remove(category);
}
category.addEntry(childEntry);
}
}
// Add the PSE_MISC category if it has entries
if (addMisc) {
categoryCache.put(MISCELLANEOUS_CATEGORY_NAME, misc);
}
// Sort the categories.
// Rather than just sorting categoryCache.values(), we'd like the original order to be preserved
// (with misc added at the end, if needed) before passing to the sorter.
ArrayList categoryList = new ArrayList();
Set seen = new HashSet(childEntries.size());
for (int i = 0; i < childEntries.size(); i++) {
IPropertySheetEntry childEntry = (IPropertySheetEntry) childEntries
.get(i);
String categoryName = childEntry.getCategory();
if (categoryName != null && !seen.contains(categoryName)) {
seen.add(categoryName);
PropertySheetCategory category = (PropertySheetCategory) categoryCache
.get(categoryName);
if (category != null) {
categoryList.add(category);
}
}
}
if (addMisc && !seen.contains(MISCELLANEOUS_CATEGORY_NAME)) {
categoryList.add(misc);
}
PropertySheetCategory[] categoryArray = (PropertySheetCategory[]) categoryList
.toArray(new PropertySheetCategory[categoryList.size()]);
sorter.sort(categoryArray);
categories = categoryArray;
}
/**
* Update the category (but not its parent or children).
*
* @param category
* the category to update
* @param item
* the tree item for the given entry
*/
private void updateCategory(PropertySheetCategory category,
TreeItem item) {
// ensure that backpointer is correct
item.setData(category);
// Update the name and value columns
item.setText(0, category.getCategoryName());
item.setText(1, ""); //$NON-NLS-1$
// update the "+" icon
if (category.getAutoExpand()) {
// we auto expand categories when they first appear
createChildren(item);
item.setExpanded(true);
category.setAutoExpand(false);
} else {
// we do not want to auto expand categories if the user has
// collpased them
updatePlus(category, item);
}
}
/**
* Update the child entries or categories of the given entry or category. If
* the given node is the root entry and we are showing categories then the
* child entries are categories, otherwise they are entries.
*
* @param node
* the entry or category whose children we will update
* @param widget
* the widget for the given entry, either a
* <code>TableTree</code> if the node is the root node or a
* <code>TreeItem</code> otherwise.
*/
private void updateChildrenOf(Object node, Widget widget) {
// cast the entry or category
IPropertySheetEntry entry = null;
PropertySheetCategory category = null;
if (node instanceof IPropertySheetEntry) {
entry = (IPropertySheetEntry) node;
} else {
category = (PropertySheetCategory) node;
}
// get the current child tree items
TreeItem[] childItems = getChildItems(widget);
// optimization! prune collapsed subtrees
TreeItem item = null;
if (widget instanceof TreeItem) {
item = (TreeItem) widget;
}
if (item != null && !item.getExpanded()) {
// remove all children
for (int i = 0; i < childItems.length; i++) {
if (childItems[i].getData() != null) {
removeItem(childItems[i]);
}
}
// append a dummy if necessary
if (category != null || entry.hasChildEntries()) {
// may already have a dummy
// It is either a category (which always has at least one child)
// or an entry with chidren.
// Note that this test is not perfect, if we have filtering on
// then there in fact may be no entires to show when the user
// presses the "+" expand icon. But this is an acceptable
// compromise.
childItems = getChildItems(widget);
if (childItems.length == 0) {
new TreeItem(item, SWT.NULL);
}
}
return;
}
// get the child entries or categories
if (node == rootEntry && isShowingCategories) {
// update the categories
updateCategories();
}
List children = getChildren(node);
// remove items
Set set = new HashSet(childItems.length * 2 + 1);
for (int i = 0; i < childItems.length; i++) {
Object data = childItems[i].getData();
if (data != null) {
Object e = data;
int ix = children.indexOf(e);
if (ix < 0) { // not found
removeItem(childItems[i]);
} else { // found
set.add(e);
}
} else if (data == null) { // the dummy
childItems[i].dispose();
}
}
// WORKAROUND
int oldCnt = -1;
if (widget == tree) {
oldCnt = tree.getItemCount();
}
// add new items
int newSize = children.size();
for (int i = 0; i < newSize; i++) {
Object el = children.get(i);
if (!set.contains(el)) {
createItem(el, widget, i);
}
}
// WORKAROUND
if (widget == tree && oldCnt == 0 && tree.getItemCount() == 1) {
tree.setRedraw(false);
tree.setRedraw(true);
}
// get the child tree items after our changes
childItems = getChildItems(widget);
// update the child items
// This ensures that the children are in the correct order
// are showing the correct values.
for (int i = 0; i < newSize; i++) {
Object el = children.get(i);
if (el instanceof IPropertySheetEntry) {
updateEntry((IPropertySheetEntry) el, childItems[i]);
} else {
updateCategory((PropertySheetCategory) el, childItems[i]);
updateChildrenOf(el, childItems[i]);
}
}
// The tree's original selection may no longer apply after the update,
// so fire the selection changed event.
entrySelectionChanged();
}
/**
* Update the given entry (but not its children or parent)
*
* @param entry
* the entry we will update
* @param item
* the tree item for the given entry
*/
private void updateEntry(IPropertySheetEntry entry, TreeItem item) {
// ensure that backpointer is correct
item.setData(entry);
// update the name and value columns
item.setText(0, entry.getDisplayName());
item.setText(1, entry.getValueAsString());
Image image = entry.getImage();
if (item.getImage(1) != image) {
item.setImage(1, image);
}
// update the "+" icon
updatePlus(entry, item);
}
/**
* Updates the "+"/"-" icon of the tree item from the given entry
* or category.
*
* @param node the entry or category
* @param item the tree item being updated
*/
private void updatePlus(Object node, TreeItem item) {
// cast the entry or category
IPropertySheetEntry entry = null;
PropertySheetCategory category = null;
if (node instanceof IPropertySheetEntry) {
entry = (IPropertySheetEntry) node;
} else {
category = (PropertySheetCategory) node;
}
boolean hasPlus = item.getItemCount() > 0;
boolean needsPlus = category != null || entry.hasChildEntries();
boolean removeAll = false;
boolean addDummy = false;
if (hasPlus != needsPlus) {
if (needsPlus) {
addDummy = true;
} else {
removeAll = true;
}
}
if (removeAll) {
// remove all children
TreeItem[] items = item.getItems();
for (int i = 0; i < items.length; i++) {
removeItem(items[i]);
}
}
if (addDummy) {
new TreeItem(item, SWT.NULL); // append a dummy to create the
// plus sign
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -