Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Stieber2012-10-01 07:33:53 +0000
committerUwe Stieber2012-10-01 07:33:53 +0000
commit2104cb69f132ec23c7eeace43b4941de6a829678 (patch)
tree6d5b86ae845de76beef728791706fba9481c52e5
parent3525da18a2c6137e8ad4ca03cd59a30fd328685e (diff)
downloadorg.eclipse.tcf-2104cb69f132ec23c7eeace43b4941de6a829678.tar.gz
org.eclipse.tcf-2104cb69f132ec23c7eeace43b4941de6a829678.tar.xz
org.eclipse.tcf-2104cb69f132ec23c7eeace43b4941de6a829678.zip
Target Explorer: Rework launch node content provider
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.launch.ui/src/org/eclipse/tcf/te/launch/ui/viewer/LaunchNavigatorContentProvider.java161
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/NavigatorContentProvider.java339
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/TreeContentProvider.java (renamed from target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeContentProvider.java)4
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/CommonViewerListener.java524
4 files changed, 519 insertions, 509 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.launch.ui/src/org/eclipse/tcf/te/launch/ui/viewer/LaunchNavigatorContentProvider.java b/target_explorer/plugins/org.eclipse.tcf.te.launch.ui/src/org/eclipse/tcf/te/launch/ui/viewer/LaunchNavigatorContentProvider.java
index 70cc60d17..61bdd7f79 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.launch.ui/src/org/eclipse/tcf/te/launch/ui/viewer/LaunchNavigatorContentProvider.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.launch.ui/src/org/eclipse/tcf/te/launch/ui/viewer/LaunchNavigatorContentProvider.java
@@ -15,6 +15,7 @@ import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
@@ -28,13 +29,16 @@ import org.eclipse.tcf.te.runtime.events.EventManager;
import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener;
import org.eclipse.tcf.te.runtime.model.interfaces.IContainerModelNode;
import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
-import org.eclipse.tcf.te.ui.trees.TreeContentProvider;
import org.eclipse.ui.PlatformUI;
/**
* Launches content provider for the common navigator of Target Explorer.
*/
-public class LaunchNavigatorContentProvider extends TreeContentProvider implements IEventListener {
+public class LaunchNavigatorContentProvider implements ITreeContentProvider, IEventListener {
+ private final static Object[] NO_ELEMENTS = new Object[0];
+
+ // The viewer
+ private Viewer viewer;
/**
* Constructor.
@@ -45,80 +49,10 @@ public class LaunchNavigatorContentProvider extends TreeContentProvider implemen
}
/* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
- */
- @Override
- public Object getParent(Object element) {
- if (element instanceof LaunchNode) {
- LaunchNode node = (LaunchNode)element;
- if (node.getParent() == null ||
- node.isType(LaunchNode.TYPE_ROOT) ||
- (!isTypeNodeVisible() && node.isType(LaunchNode.TYPE_LAUNCH_CONFIG)) ||
- (!isRootNodeVisible() && node.isType(LaunchNode.TYPE_LAUNCH_CONFIG_TYPE))) {
- return node.getModel().getModelRoot();
- }
-
- return node.getParent();
- }
- return null;
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
- */
- @Override
- public void inputChanged(final Viewer viewer, Object oldInput, Object newInput) {
- super.inputChanged(viewer, oldInput, newInput);
-
- if (newInput != null && !newInput.equals(oldInput)) {
- LaunchModel model = LaunchModel.getLaunchModel(newInput);
- if (model != null) {
- LaunchNode lastLaunchedNode = null;
- long nodeValue = -1;
- for (IModelNode typeNode : model.getRootNode().getChildren()) {
- for (IModelNode launchNode : ((IContainerModelNode)typeNode).getChildren()) {
- ILaunchConfiguration config = ((LaunchNode)launchNode).getLaunchConfiguration();
- String lastLaunched = DefaultPersistenceDelegate.getAttribute(config, ICommonLaunchAttributes.ATTR_LAST_LAUNCHED, (String)null);
- if (lastLaunched != null) {
- long last = Long.parseLong(lastLaunched);
- if (last > nodeValue) {
- nodeValue = last;
- lastLaunchedNode = (LaunchNode)launchNode;
- }
- }
- }
- }
- if (lastLaunchedNode != null) {
- final LaunchNode node = lastLaunchedNode;
- ExecutorsUtil.executeInUI(new Runnable() {
- @Override
- public void run() {
- viewer.setSelection(new StructuredSelection(node));
- }
- });
- }
- }
- }
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#dispose()
- */
- @Override
- public void dispose() {
- super.dispose();
- EventManager.getInstance().removeEventListener(this);
- }
-
- /*
- * (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren(Object element) {
- super.getChildren(element);
if (element instanceof LaunchNode) {
LaunchNode node = (LaunchNode)element;
@@ -158,6 +92,7 @@ public class LaunchNavigatorContentProvider extends TreeContentProvider implemen
}
return getChildren(model.getRootNode());
}
+
return NO_ELEMENTS;
}
@@ -205,6 +140,80 @@ public class LaunchNavigatorContentProvider extends TreeContentProvider implemen
return false;
}
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ @Override
+ public Object getParent(Object element) {
+ if (element instanceof LaunchNode) {
+ LaunchNode node = (LaunchNode)element;
+ if (node.getParent() == null ||
+ node.isType(LaunchNode.TYPE_ROOT) ||
+ (!isTypeNodeVisible() && node.isType(LaunchNode.TYPE_LAUNCH_CONFIG)) ||
+ (!isRootNodeVisible() && node.isType(LaunchNode.TYPE_LAUNCH_CONFIG_TYPE))) {
+ return node.getModel().getModelRoot();
+ }
+
+ return node.getParent();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
+ */
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void inputChanged(final Viewer viewer, Object oldInput, Object newInput) {
+ this.viewer = viewer;
+ if (newInput != null && !newInput.equals(oldInput)) {
+ LaunchModel model = LaunchModel.getLaunchModel(newInput);
+ if (model != null) {
+ LaunchNode lastLaunchedNode = null;
+ long nodeValue = -1;
+ for (IModelNode typeNode : model.getRootNode().getChildren()) {
+ for (IModelNode launchNode : ((IContainerModelNode)typeNode).getChildren()) {
+ ILaunchConfiguration config = ((LaunchNode)launchNode).getLaunchConfiguration();
+ String lastLaunched = DefaultPersistenceDelegate.getAttribute(config, ICommonLaunchAttributes.ATTR_LAST_LAUNCHED, (String)null);
+ if (lastLaunched != null) {
+ long last = Long.parseLong(lastLaunched);
+ if (last > nodeValue) {
+ nodeValue = last;
+ lastLaunchedNode = (LaunchNode)launchNode;
+ }
+ }
+ }
+ }
+ if (lastLaunchedNode != null) {
+ final LaunchNode node = lastLaunchedNode;
+ ExecutorsUtil.executeInUI(new Runnable() {
+ @Override
+ public void run() {
+ viewer.setSelection(new StructuredSelection(node));
+ }
+ });
+ }
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ EventManager.getInstance().removeEventListener(this);
+ }
+
+
/**
* If the root node of the tree is visible.
*
@@ -215,7 +224,7 @@ public class LaunchNavigatorContentProvider extends TreeContentProvider implemen
}
/**
- * If the launch config type node in the tree is visible.
+ * If the launch configuration type node in the tree is visible.
*
* @return true if it is visible.
*/
@@ -237,14 +246,14 @@ public class LaunchNavigatorContentProvider extends TreeContentProvider implemen
*/
@Override
public void eventFired(EventObject event) {
- final TreeViewer viewer = this.viewer;
+ final Viewer viewer = this.viewer;
if (event.getSource() instanceof LaunchModel) {
final LaunchModel model = (LaunchModel)event.getSource();
- if (model != null) {
+ if (model != null && viewer instanceof TreeViewer) {
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
- viewer.refresh((isRootNodeVisible() ? model.getRootNode() : model.getModelRoot()), true);
+ ((TreeViewer)viewer).refresh((isRootNodeVisible() ? model.getRootNode() : model.getModelRoot()), true);
}
});
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/NavigatorContentProvider.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/NavigatorContentProvider.java
index 6a65b751c..d6bb7a3fa 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/NavigatorContentProvider.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/NavigatorContentProvider.java
@@ -1,170 +1,169 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.tcf.filesystem.ui.controls;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.ITreeViewerListener;
-import org.eclipse.jface.viewers.TreeExpansionEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.tcf.te.tcf.filesystem.core.model.AbstractTreeNode;
-import org.eclipse.tcf.te.tcf.filesystem.core.model.ITreeNodeModel;
-import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
-import org.eclipse.tcf.te.ui.trees.TreeContentProvider;
-
-
-/**
- * The base navigator content provider for File System and Process Monitor
- */
-public abstract class NavigatorContentProvider extends TreeContentProvider implements ITreeViewerListener {
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
- */
- @Override
- public Object getParent(Object element) {
- if (element instanceof AbstractTreeNode) {
- AbstractTreeNode node = (AbstractTreeNode) element;
- AbstractTreeNode parent = node.getParent();
- if (parent != null) {
- if (parent.isSystemRoot()) {
- if (isRootNodeVisible()) return parent;
- return null;
- }
- return parent;
- }
- if (isRootNodeVisible()) return node.peerNode;
- }
- return null;
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeViewerListener#treeCollapsed(org.eclipse.jface.viewers.TreeExpansionEvent)
- */
- @Override
- public void treeCollapsed(TreeExpansionEvent event) {
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeViewerListener#treeExpanded(org.eclipse.jface.viewers.TreeExpansionEvent)
- */
- @Override
- public void treeExpanded(TreeExpansionEvent event) {
- Object object = event.getElement();
- if(object instanceof AbstractTreeNode) {
- AbstractTreeNode parent = (AbstractTreeNode) object;
- if (parent.childrenQueried && !parent.childrenQueryRunning) {
- parent.refreshChildren();
- }
- }
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
- */
- @Override
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- super.inputChanged(viewer, oldInput, newInput);
- this.viewer.addTreeListener(this);
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#dispose()
- */
- @Override
- public void dispose() {
- this.viewer.removeTreeListener(this);
- super.dispose();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
- */
- @Override
- public Object[] getChildren(Object parentElement) {
- super.getChildren(parentElement);
-
- if (parentElement instanceof IPeerModel) {
- final IPeerModel peerNode = (IPeerModel)parentElement;
- ITreeNodeModel model = doGetModel(peerNode);
- if (isRootNodeVisible()) {
- AbstractTreeNode root = model.getRoot();
- if(!root.childrenQueried && !root.childrenQueryRunning) {
- root.queryChildren();
- }
- return new Object[] { root };
- }
- return getChildren(model.getRoot());
- } else if (parentElement instanceof AbstractTreeNode) {
- AbstractTreeNode node = (AbstractTreeNode)parentElement;
- List<Object> current = new ArrayList<Object>(node.getChildren());
- if (!node.childrenQueried) {
- current.add(getPending(node));
- if (!node.childrenQueryRunning) {
- node.queryChildren();
- }
- }
- return current.toArray();
- }
-
- return NO_ELEMENTS;
- }
-
- /**
- * Get the tree node model for this peer node.
- *
- * @param peerNode The peer node from where to get the model.
- * @return The tree node model.
- */
- protected abstract ITreeNodeModel doGetModel(IPeerModel peerNode);
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
- */
- @Override
- public boolean hasChildren(final Object element) {
- Assert.isNotNull(element);
-
- boolean hasChildren = false;
-
- if (element instanceof AbstractTreeNode) {
- AbstractTreeNode node = (AbstractTreeNode)element;
- if(node.isSystemRoot()) {
- hasChildren = true;
- }
- else {
- hasChildren = !node.childrenQueried || super.hasChildren(element);
- }
- }
- else if (element instanceof IPeerModel) {
- IPeerModel peerModel = (IPeerModel) element;
- ITreeNodeModel model = doGetModel(peerModel);
- AbstractTreeNode root = model.getRoot();
- hasChildren = root != null ? hasChildren(root) : true;
- }
-
- return hasChildren;
- }
-
- /**
- * If the root node of the tree is visible.
- *
- * @return true if it is visible.
- */
- protected boolean isRootNodeVisible() {
- return true;
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.tcf.filesystem.ui.controls;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.viewers.ITreeViewerListener;
+import org.eclipse.jface.viewers.TreeExpansionEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.tcf.te.tcf.filesystem.core.model.AbstractTreeNode;
+import org.eclipse.tcf.te.tcf.filesystem.core.model.ITreeNodeModel;
+import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
+
+
+/**
+ * The base navigator content provider for File System and Process Monitor
+ */
+public abstract class NavigatorContentProvider extends TreeContentProvider implements ITreeViewerListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
+ */
+ @Override
+ public Object getParent(Object element) {
+ if (element instanceof AbstractTreeNode) {
+ AbstractTreeNode node = (AbstractTreeNode) element;
+ AbstractTreeNode parent = node.getParent();
+ if (parent != null) {
+ if (parent.isSystemRoot()) {
+ if (isRootNodeVisible()) return parent;
+ return null;
+ }
+ return parent;
+ }
+ if (isRootNodeVisible()) return node.peerNode;
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeViewerListener#treeCollapsed(org.eclipse.jface.viewers.TreeExpansionEvent)
+ */
+ @Override
+ public void treeCollapsed(TreeExpansionEvent event) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeViewerListener#treeExpanded(org.eclipse.jface.viewers.TreeExpansionEvent)
+ */
+ @Override
+ public void treeExpanded(TreeExpansionEvent event) {
+ Object object = event.getElement();
+ if(object instanceof AbstractTreeNode) {
+ AbstractTreeNode parent = (AbstractTreeNode) object;
+ if (parent.childrenQueried && !parent.childrenQueryRunning) {
+ parent.refreshChildren();
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ super.inputChanged(viewer, oldInput, newInput);
+ this.viewer.addTreeListener(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#dispose()
+ */
+ @Override
+ public void dispose() {
+ this.viewer.removeTreeListener(this);
+ super.dispose();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+ */
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ super.getChildren(parentElement);
+
+ if (parentElement instanceof IPeerModel) {
+ final IPeerModel peerNode = (IPeerModel)parentElement;
+ ITreeNodeModel model = doGetModel(peerNode);
+ if (isRootNodeVisible()) {
+ AbstractTreeNode root = model.getRoot();
+ if(!root.childrenQueried && !root.childrenQueryRunning) {
+ root.queryChildren();
+ }
+ return new Object[] { root };
+ }
+ return getChildren(model.getRoot());
+ } else if (parentElement instanceof AbstractTreeNode) {
+ AbstractTreeNode node = (AbstractTreeNode)parentElement;
+ List<Object> current = new ArrayList<Object>(node.getChildren());
+ if (!node.childrenQueried) {
+ current.add(getPending(node));
+ if (!node.childrenQueryRunning) {
+ node.queryChildren();
+ }
+ }
+ return current.toArray();
+ }
+
+ return NO_ELEMENTS;
+ }
+
+ /**
+ * Get the tree node model for this peer node.
+ *
+ * @param peerNode The peer node from where to get the model.
+ * @return The tree node model.
+ */
+ protected abstract ITreeNodeModel doGetModel(IPeerModel peerNode);
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
+ */
+ @Override
+ public boolean hasChildren(final Object element) {
+ Assert.isNotNull(element);
+
+ boolean hasChildren = false;
+
+ if (element instanceof AbstractTreeNode) {
+ AbstractTreeNode node = (AbstractTreeNode)element;
+ if(node.isSystemRoot()) {
+ hasChildren = true;
+ }
+ else {
+ hasChildren = !node.childrenQueried || super.hasChildren(element);
+ }
+ }
+ else if (element instanceof IPeerModel) {
+ IPeerModel peerModel = (IPeerModel) element;
+ ITreeNodeModel model = doGetModel(peerModel);
+ AbstractTreeNode root = model.getRoot();
+ hasChildren = root != null ? hasChildren(root) : true;
+ }
+
+ return hasChildren;
+ }
+
+ /**
+ * If the root node of the tree is visible.
+ *
+ * @return true if it is visible.
+ */
+ protected boolean isRootNodeVisible() {
+ return true;
+ }
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeContentProvider.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/TreeContentProvider.java
index 8b2a88c6e..b06e1ded1 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/TreeContentProvider.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/TreeContentProvider.java
@@ -7,7 +7,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.tcf.te.ui.trees;
+package org.eclipse.tcf.te.tcf.filesystem.ui.controls;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
@@ -24,6 +24,8 @@ import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.tcf.te.core.interfaces.IPropertyChangeProvider;
+import org.eclipse.tcf.te.ui.trees.CommonViewerListener;
+import org.eclipse.tcf.te.ui.trees.Pending;
/**
* The base tree content provider that defines several default methods.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/CommonViewerListener.java b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/CommonViewerListener.java
index 9d9c31818..40c6cdee2 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/CommonViewerListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui/src/org/eclipse/tcf/te/ui/trees/CommonViewerListener.java
@@ -1,262 +1,262 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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:
- * Wind River Systems - initial API and implementation
- *******************************************************************************/
-package org.eclipse.tcf.te.ui.trees;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.tcf.te.core.utils.Ancestor;
-import org.eclipse.tcf.te.ui.interfaces.ISchedulableEvent;
-
-/**
- * CommonViewerListener listens to the property change event from the
- * tree and update the viewer accordingly.
- */
-class CommonViewerListener extends Ancestor<Object> implements PropertyChangeListener, IPropertyChangeListener {
- // The timer that process the property events periodically.
- private static Timer viewerTimer;
- static {
- viewerTimer = new Timer("Viewer_Refresher", true); //$NON-NLS-1$
- }
- // The interval of the refreshing timer.
- private static final long INTERVAL = 333;
- // Maximum delay before immediate refreshing.
- private static final long MAX_DELAY = 1000;
- // The NULL object stands for refreshing the whole tree.
- private static final Object NULL = new Object();
- // The tree viewer
- private TreeViewer viewer;
- // The current queued property event sources.
- private List<EventObject> queue;
- // The timer task to process the property events periodically.
- private TimerTask task;
- // The content provider
- ITreeContentProvider contentProvider;
- // The time of last run.
- long lastRun;
-
- /***
- * Create an instance for the specified tree content provider.
- *
- * @param viewer The tree content provider.
- */
- public CommonViewerListener(TreeViewer viewer, ITreeContentProvider contentProvider) {
- Assert.isNotNull(viewer);
- this.viewer = viewer;
- this.contentProvider = contentProvider;
- this.task = new TimerTask(){
- @Override
- public void run() {
- handleEvent(true);
- }};
- viewerTimer.schedule(this.task, INTERVAL, INTERVAL);
- this.queue = Collections.synchronizedList(new ArrayList<EventObject>());
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.tcf.te.core.utils.Ancestor#getParent(java.lang.Object)
- */
- @Override
- protected Object getParent(Object element) {
- return contentProvider.getParent(element);
- }
-
- /*
- * (non-Javadoc)
- * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
- */
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- processEvent(event);
- }
-
- /**
- * Adding the event object into the queue and trigger the scheduling.
- *
- * @param event The event object.
- */
- private void processEvent(EventObject event) {
- if(!(event instanceof ISchedulableEvent) || ((ISchedulableEvent)event).isApplicable(viewer)) {
- queue.add(event);
- if(event instanceof ISchedulableEvent) {
- ((ISchedulableEvent)event).eventQueued();
- }
- viewerTimer.schedule(new TimerTask(){
- @Override
- public void run() {
- handleEvent(false);
- }}, 0);
- }
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
- */
- @Override
- public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
- processEvent(event);
- }
-
- /**
- * Get and empty the queued objects.
- *
- * @return The objects in current queue.
- */
- Object[] emptyQueue() {
- synchronized (queue) {
- Iterator<EventObject> iterator = queue.iterator();
- List<Object> objects = new ArrayList<Object>();
- while(iterator.hasNext()) {
- EventObject event = iterator.next();
- if(event instanceof ISchedulableEvent && !((ISchedulableEvent)event).isSchedulable()) {
- continue;
- }
- objects.add(event.getSource());
- iterator.remove();
- }
- return objects.toArray();
- }
- }
-
- /**
- * Check if it is ready for next run. If the time
- * has expired, then mark last run time and return true.
- *
- * @param scheduled if this processing is scheduled
- * @return true if it is time.
- */
- synchronized boolean checkReady(boolean scheduled) {
- if (scheduled || System.currentTimeMillis() - lastRun > MAX_DELAY) {
- lastRun = System.currentTimeMillis();
- return true;
- }
- return false;
- }
-
- /**
- * Handle the current events in the event queue.
- *
- * @param scheduled if this handling is scheduled.
- */
- void handleEvent(boolean scheduled) {
- if (checkReady(scheduled)) {
- Object[] objects = emptyQueue();
- if (objects.length > 0) {
- List<Object> list = mergeObjects(objects);
- Object object = getRefreshRoot(list);
- processObject(object);
- }
- }
- }
-
- /**
- * Get the refreshing root for the object list.
- *
- * @param objects The objects to be refreshed.
- * @return The root of these objects.
- */
- private Object getRefreshRoot(List<Object> objects) {
- if (objects.isEmpty()) {
- return NULL;
- }
- else if (objects.size() == 1) {
- Object object = objects.get(0);
- if (contentProvider.getParent(object) == null) {
- return NULL;
- }
- return object;
- }
- else {
- // If there are multiple root nodes, then select NULL as the final root.
- Object object = getAncestor(objects);
- if (object == null) {
- return NULL;
- }
- return object;
- }
- }
-
- /**
- * Merge the current objects into an ancestor object.
- *
- * @param objects The objects to be merged.
- * @return NULL or a list presenting the top objects.
- */
- private List<Object> mergeObjects(Object[] objects) {
- for (Object object : objects) {
- if (object == NULL) {
- // If one object is NULL, then return NULL
- List<Object> result = new ArrayList<Object>();
- result.add(NULL);
- return result;
- }
- }
- // Remove duplicates.
- List<Object> list = Arrays.asList(objects);
- Set<Object> set = new HashSet<Object>(list);
- objects = set.toArray();
- list = Arrays.asList(objects);
- return getAncestors(list);
- }
-
- /**
- * Process the object node.
- *
- * @param object The object to be processed.
- */
- void processObject(final Object object) {
- Assert.isNotNull(object);
- Tree tree = viewer.getTree();
- if (!tree.isDisposed()) {
- Display display = tree.getDisplay();
- if (display.getThread() == Thread.currentThread()) {
- if (object != NULL) {
- viewer.refresh(object);
- }
- else {
- viewer.refresh();
- }
- }
- else {
- display.asyncExec(new Runnable() {
- @Override
- public void run() {
- processObject(object);
- }
- });
- }
- }
- }
-
- /**
- * Cancel the current task and the current timer.
- */
- public void cancel() {
- task.cancel();
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 Wind River Systems, Inc. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.ui.trees;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EventObject;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.tcf.te.core.utils.Ancestor;
+import org.eclipse.tcf.te.ui.interfaces.ISchedulableEvent;
+
+/**
+ * CommonViewerListener listens to the property change event from the
+ * tree and update the viewer accordingly.
+ */
+public class CommonViewerListener extends Ancestor<Object> implements PropertyChangeListener, IPropertyChangeListener {
+ // The timer that process the property events periodically.
+ private static Timer viewerTimer;
+ static {
+ viewerTimer = new Timer("Viewer_Refresher", true); //$NON-NLS-1$
+ }
+ // The interval of the refreshing timer.
+ private static final long INTERVAL = 333;
+ // Maximum delay before immediate refreshing.
+ private static final long MAX_DELAY = 1000;
+ // The NULL object stands for refreshing the whole tree.
+ private static final Object NULL = new Object();
+ // The tree viewer
+ private TreeViewer viewer;
+ // The current queued property event sources.
+ private List<EventObject> queue;
+ // The timer task to process the property events periodically.
+ private TimerTask task;
+ // The content provider
+ ITreeContentProvider contentProvider;
+ // The time of last run.
+ long lastRun;
+
+ /***
+ * Create an instance for the specified tree content provider.
+ *
+ * @param viewer The tree content provider.
+ */
+ public CommonViewerListener(TreeViewer viewer, ITreeContentProvider contentProvider) {
+ Assert.isNotNull(viewer);
+ this.viewer = viewer;
+ this.contentProvider = contentProvider;
+ this.task = new TimerTask(){
+ @Override
+ public void run() {
+ handleEvent(true);
+ }};
+ viewerTimer.schedule(this.task, INTERVAL, INTERVAL);
+ this.queue = Collections.synchronizedList(new ArrayList<EventObject>());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.tcf.te.core.utils.Ancestor#getParent(java.lang.Object)
+ */
+ @Override
+ protected Object getParent(Object element) {
+ return contentProvider.getParent(element);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+ */
+ @Override
+ public void propertyChange(PropertyChangeEvent event) {
+ processEvent(event);
+ }
+
+ /**
+ * Adding the event object into the queue and trigger the scheduling.
+ *
+ * @param event The event object.
+ */
+ private void processEvent(EventObject event) {
+ if(!(event instanceof ISchedulableEvent) || ((ISchedulableEvent)event).isApplicable(viewer)) {
+ queue.add(event);
+ if(event instanceof ISchedulableEvent) {
+ ((ISchedulableEvent)event).eventQueued();
+ }
+ viewerTimer.schedule(new TimerTask(){
+ @Override
+ public void run() {
+ handleEvent(false);
+ }}, 0);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+ */
+ @Override
+ public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
+ processEvent(event);
+ }
+
+ /**
+ * Get and empty the queued objects.
+ *
+ * @return The objects in current queue.
+ */
+ Object[] emptyQueue() {
+ synchronized (queue) {
+ Iterator<EventObject> iterator = queue.iterator();
+ List<Object> objects = new ArrayList<Object>();
+ while(iterator.hasNext()) {
+ EventObject event = iterator.next();
+ if(event instanceof ISchedulableEvent && !((ISchedulableEvent)event).isSchedulable()) {
+ continue;
+ }
+ objects.add(event.getSource());
+ iterator.remove();
+ }
+ return objects.toArray();
+ }
+ }
+
+ /**
+ * Check if it is ready for next run. If the time
+ * has expired, then mark last run time and return true.
+ *
+ * @param scheduled if this processing is scheduled
+ * @return true if it is time.
+ */
+ synchronized boolean checkReady(boolean scheduled) {
+ if (scheduled || System.currentTimeMillis() - lastRun > MAX_DELAY) {
+ lastRun = System.currentTimeMillis();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Handle the current events in the event queue.
+ *
+ * @param scheduled if this handling is scheduled.
+ */
+ void handleEvent(boolean scheduled) {
+ if (checkReady(scheduled)) {
+ Object[] objects = emptyQueue();
+ if (objects.length > 0) {
+ List<Object> list = mergeObjects(objects);
+ Object object = getRefreshRoot(list);
+ processObject(object);
+ }
+ }
+ }
+
+ /**
+ * Get the refreshing root for the object list.
+ *
+ * @param objects The objects to be refreshed.
+ * @return The root of these objects.
+ */
+ private Object getRefreshRoot(List<Object> objects) {
+ if (objects.isEmpty()) {
+ return NULL;
+ }
+ else if (objects.size() == 1) {
+ Object object = objects.get(0);
+ if (contentProvider.getParent(object) == null) {
+ return NULL;
+ }
+ return object;
+ }
+ else {
+ // If there are multiple root nodes, then select NULL as the final root.
+ Object object = getAncestor(objects);
+ if (object == null) {
+ return NULL;
+ }
+ return object;
+ }
+ }
+
+ /**
+ * Merge the current objects into an ancestor object.
+ *
+ * @param objects The objects to be merged.
+ * @return NULL or a list presenting the top objects.
+ */
+ private List<Object> mergeObjects(Object[] objects) {
+ for (Object object : objects) {
+ if (object == NULL) {
+ // If one object is NULL, then return NULL
+ List<Object> result = new ArrayList<Object>();
+ result.add(NULL);
+ return result;
+ }
+ }
+ // Remove duplicates.
+ List<Object> list = Arrays.asList(objects);
+ Set<Object> set = new HashSet<Object>(list);
+ objects = set.toArray();
+ list = Arrays.asList(objects);
+ return getAncestors(list);
+ }
+
+ /**
+ * Process the object node.
+ *
+ * @param object The object to be processed.
+ */
+ void processObject(final Object object) {
+ Assert.isNotNull(object);
+ Tree tree = viewer.getTree();
+ if (!tree.isDisposed()) {
+ Display display = tree.getDisplay();
+ if (display.getThread() == Thread.currentThread()) {
+ if (object != NULL) {
+ viewer.refresh(object);
+ }
+ else {
+ viewer.refresh();
+ }
+ }
+ else {
+ display.asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ processObject(object);
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * Cancel the current task and the current timer.
+ */
+ public void cancel() {
+ task.cancel();
+ }
+}

Back to the top