diff options
author | Uwe Stieber | 2012-10-01 07:33:53 +0000 |
---|---|---|
committer | Uwe Stieber | 2012-10-01 07:33:53 +0000 |
commit | 2104cb69f132ec23c7eeace43b4941de6a829678 (patch) | |
tree | 6d5b86ae845de76beef728791706fba9481c52e5 | |
parent | 3525da18a2c6137e8ad4ca03cd59a30fd328685e (diff) | |
download | org.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.java | 161 | ||||
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/controls/NavigatorContentProvider.java | 339 | ||||
-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.java | 524 |
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(); + } +} |