From df86b6fec4ffbdb531785dd56925e06cad39c879 Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 5 Jun 2012 10:59:44 +0800 Subject: Target Explorer: Refresh the first level children upon expanding a directory. --- .../te/tcf/core/concurrent/CallbackMonitor.java | 183 +++++++++++++++++++++ .../org/eclipse/tcf/te/tcf/core/nls/Messages.java | 1 + .../tcf/te/tcf/core/nls/Messages.properties | 1 + .../filesystem/core/model/AbstractTreeNode.java | 7 +- .../te/tcf/filesystem/core/model/FSTreeNode.java | 49 ++++++ .../ui/controls/NavigatorContentProvider.java | 48 +++++- .../processes/core/callbacks/CallbackMonitor.java | 183 --------------------- .../core/callbacks/QueryDoneGetChildren.java | 1 + .../core/callbacks/QueryDoneGetContext.java | 1 + .../callbacks/RefreshChildrenDoneOpenChannel.java | 1 + .../core/callbacks/RefreshDoneGetChildren.java | 1 + .../core/callbacks/RefreshDoneGetContext.java | 1 + .../te/tcf/processes/core/model/ProcessModel.java | 9 - .../tcf/processes/core/model/ProcessTreeNode.java | 7 + .../tcf/te/tcf/processes/core/nls/Messages.java | 1 - .../te/tcf/processes/core/nls/Messages.properties | 1 - .../controls/ProcessNavigatorContentProvider.java | 59 +------ 17 files changed, 300 insertions(+), 254 deletions(-) create mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/concurrent/CallbackMonitor.java delete mode 100644 target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/CallbackMonitor.java diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/concurrent/CallbackMonitor.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/concurrent/CallbackMonitor.java new file mode 100644 index 000000000..506f45371 --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/concurrent/CallbackMonitor.java @@ -0,0 +1,183 @@ +/******************************************************************************* + * 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.core.concurrent; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.tcf.core.activator.CoreBundleActivator; +import org.eclipse.tcf.te.tcf.core.nls.Messages; + +/** + * A helper class used to synchronize multiple threads. It is used + * to join multiple threads which collaborate to create the pre-condition + * of the callback code. + *

+ * A callback monitor maintains a map containing a set of locks. + * The collaborating threads should unlock one of its own lock in + * it and wake up the callback if all the locks in the map is opened. + *

+ * The following is an example: + *

+ * class Thread1 extends Thread {
+ * 		CallbackMonitor monitor;
+ * 		public Thread1(CallbackMonitor monitor){
+ * 			this.monitor = monitor;
+ * 		}
+ * 		public void run() {
+ * 			// Do the work
+ * 			...
+ * 			// Unlock this thread.
+ * 			monitor.unlock(this)
+ * 		}
+ * }
+ * class Thread2 extends Thread {
+ * 		CallbackMonitor monitor;
+ * 		public Thread2(CallbackMonitor monitor){
+ * 			this.monitor = monitor;
+ * 		}
+ * 		public void run() {
+ * 			// Do the work
+ * 			...
+ * 			// Unlock this thread.
+ * 			monitor.unlock(this)
+ * 		}
+ * }
+ * ...
+ * public void collaborate() {
+ * 		Runnable callback = new Runnable() {
+ * 			public void run() {
+ * 				// Do something which must be done after all the threads end.
+ * 				...
+ * 			}
+ * 		};
+ * 		CallbackMonitor monitor = new CallbackMonitor(callback);
+ * 		Thread1 thread1 = new Thread1(monitor);
+ * 		Thread2 thread2 = new Thread2(monitor);
+ * 		...
+ * 		monitor.lock(thread1, thread2, ...);
+ * 		thread1.start();
+ * 		thread2.start();
+ * 		...
+ * }
+ * 
+ *

+ * The above creates multiple threads which lock on the monitor and + * invoke unlock when they end. The keys they used can be anything which + * are unique among the threads. Once all threads end, the callback defined + * in the method will be invoked and do the thing which requires to be done + * after the end of these threads. + *

+ * Note:The threads which require collaboration on the callback + * monitor should be started only after all the locks corresponding to them + * are added. + *

+ * For example, the above threads are started after the monitor locks all the threads: + *

+ * 		monitor.lock(thread1, thread2, ...);
+ * 		thread1.start();
+ * 		thread2.start();
+ * 		...
+ * 
+ */ +public class CallbackMonitor { + // The callback which is invoked after all the locks are unlocked. + private ICallback callback; + // The lock map containing the keys and the corresponding running results. + private Map locks; + + /** + * Create a callback monitor with the specified callback. + * + * @param callback The callback to be invoked after all the locks being unlocked. + */ + public CallbackMonitor(ICallback callback) { + Assert.isNotNull(callback); + this.callback = callback; + this.locks = Collections.synchronizedMap(new HashMap()); + } + + /** + * Create a callback monitor with the specified callback and the keys. + * + * @param callback The callback to be invoked after all the locks being unlocked. + * @param keys The keys to lock and unlock the locks. + */ + public CallbackMonitor(ICallback callback, Object... keys) { + Assert.isNotNull(callback); + this.callback = callback; + this.locks = Collections.synchronizedMap(new HashMap()); + for (Object key : keys) { + this.locks.put(key, null); + } + } + + /** + * Add multiple locks with the specified keys. + * + * @param keys The keys whose locks are added. + */ + public synchronized void lock(Object... keys) { + for(Object key : keys) { + this.locks.put(key, null); + } + } + + /** + * Add a lock with the specified key. + * + * @param key The key whose lock is added. + */ + public synchronized void lock(Object key) { + Assert.isNotNull(key); + this.locks.put(key, null); + } + + /** + * Unlock the lock with the specified key and status + * check if all the locks have been unlocked. If all the + * locks have been unlocked, then invoke the callback. + * + * @param key The key to unlock its lock. + */ + public synchronized void unlock(Object key, IStatus status) { + Assert.isNotNull(key); + Assert.isNotNull(status); + locks.put(key, status); + IStatus current = getCurrentStatus(); + if (current != null) { + callback.done(this, current); + } + } + + /** + * Check if all the locks are unlocked and return a running status. + * + * @return a MultiStatus object describing running result or null if not completed yet. + */ + private synchronized IStatus getCurrentStatus() { + List list = new ArrayList(); + for (Entryentry : locks.entrySet()) { + IStatus status = entry.getValue(); + if (status == null) return null; + list.add(status); + } + IStatus[] children = list.toArray(new IStatus[list.size()]); + return new MultiStatus(CoreBundleActivator.getUniqueIdentifier(), 0, children, Messages.CallbackMonitor_AllTasksFinished, null); + } +} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java index 3828f111f..74181e5ba 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.java @@ -97,4 +97,5 @@ public class Messages extends NLS { public static String AbstractExternalValueAdd_output; public static String ValueAddLauncher_launch_command; + public static String CallbackMonitor_AllTasksFinished; } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties index 16c948018..b0f1d8552 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/nls/Messages.properties @@ -36,3 +36,4 @@ AbstractExternalValueAdd_error_invalidLocation=Invalid value-add location. Execu AbstractExternalValueAdd_output=Output read from value-add: {0}. Target id = {1} ValueAddLauncher_launch_command=Launch value-add with arguments: {0}. Target id = {1}. Value-add id = {2} +CallbackMonitor_AllTasksFinished=All tasks are finished\! diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java index 0ff6cc759..cfe37bbf2 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/AbstractTreeNode.java @@ -29,7 +29,7 @@ import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModelProvider; */ public abstract class AbstractTreeNode extends PlatformObject implements IPeerModelProvider{ // The unique id of this node. - private final UUID uniqueId = UUID.randomUUID(); + protected final UUID uniqueId = UUID.randomUUID(); /** * The tree node name. @@ -305,4 +305,9 @@ public abstract class AbstractTreeNode extends PlatformObject implements IPeerMo public List getChildren() { return new ArrayList(children); } + + /** + * Refresh the children's children. + */ + public abstract void refreshChildren(); } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/FSTreeNode.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/FSTreeNode.java index b7907244f..cebc1b7a6 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/FSTreeNode.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.core/src/org/eclipse/tcf/te/tcf/filesystem/core/model/FSTreeNode.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; import org.eclipse.core.runtime.Assert; @@ -37,6 +38,7 @@ import org.eclipse.tcf.services.IFileSystem.DirEntry; import org.eclipse.tcf.services.IFileSystem.FileAttrs; import org.eclipse.tcf.te.runtime.callback.Callback; import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.tcf.core.concurrent.CallbackMonitor; import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager.DoneOpenChannel; import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IWindowsFileAttributes; import org.eclipse.tcf.te.tcf.filesystem.core.internal.UserAccount; @@ -618,6 +620,19 @@ public final class FSTreeNode extends AbstractTreeNode implements Cloneable { return new QueryDoneOpenChannel(this, callback); } + /** + * Override the queryChildren to refresh the second level children upon expanding. + */ + @Override + public void queryChildren() { + queryChildren(new Callback(){ + @Override + protected void internalDone(Object caller, IStatus status) { + refreshChildren(); + } + }); + } + /* * (non-Javadoc) * @see org.eclipse.tcf.te.tcf.filesystem.core.model.AbstractTreeNode#getParent() @@ -626,4 +641,38 @@ public final class FSTreeNode extends AbstractTreeNode implements Cloneable { public FSTreeNode getParent() { return (FSTreeNode) parent; } + + /* + * (non-Javadoc) + * @see org.eclipse.tcf.te.tcf.filesystem.core.model.AbstractTreeNode#refreshChildren() + */ + @Override + public void refreshChildren() { + List children = getChildren(); + if(!children.isEmpty()) { + ICallback callback = new Callback(){ + @Override + protected void internalDone(Object caller, IStatus status) { + queryDone(); + } + }; + final CallbackMonitor monitor = new CallbackMonitor(callback); + for(FSTreeNode child : children) { + if(child.isDirectory() && !child.childrenQueried && !child.childrenQueryRunning) { + monitor.lock(child.uniqueId); + } + } + for(FSTreeNode child : children) { + if(child.isDirectory() && !child.childrenQueried && !child.childrenQueryRunning) { + final UUID uuid = child.uniqueId; + child.queryChildren(new Callback(){ + @Override + protected void internalDone(Object caller, IStatus status) { + monitor.unlock(uuid, status); + } + }); + } + } + } + } } 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 733f0501d..c123f968c 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 @@ -13,6 +13,9 @@ 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; @@ -22,7 +25,7 @@ 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 { +public abstract class NavigatorContentProvider extends TreeContentProvider implements ITreeViewerListener { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) @@ -36,6 +39,49 @@ public abstract class NavigatorContentProvider extends TreeContentProvider { 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) */ diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/CallbackMonitor.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/CallbackMonitor.java deleted file mode 100644 index bd71dccb2..000000000 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/CallbackMonitor.java +++ /dev/null @@ -1,183 +0,0 @@ -/******************************************************************************* - * 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.processes.core.callbacks; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; -import org.eclipse.tcf.te.tcf.processes.core.activator.CoreBundleActivator; -import org.eclipse.tcf.te.tcf.processes.core.nls.Messages; - -/** - * A helper class used to synchronize multiple threads. It is used - * to join multiple threads which collaborate to create the pre-condition - * of the callback code. - *

- * A callback monitor maintains a map containing a set of locks. - * The collaborating threads should unlock one of its own lock in - * it and wake up the callback if all the locks in the map is opened. - *

- * The following is an example: - *

- * class Thread1 extends Thread {
- * 		CallbackMonitor monitor;
- * 		public Thread1(CallbackMonitor monitor){
- * 			this.monitor = monitor;
- * 		}
- * 		public void run() {
- * 			// Do the work
- * 			...
- * 			// Unlock this thread.
- * 			monitor.unlock(this)
- * 		}
- * }
- * class Thread2 extends Thread {
- * 		CallbackMonitor monitor;
- * 		public Thread2(CallbackMonitor monitor){
- * 			this.monitor = monitor;
- * 		}
- * 		public void run() {
- * 			// Do the work
- * 			...
- * 			// Unlock this thread.
- * 			monitor.unlock(this)
- * 		}
- * }
- * ...
- * public void collaborate() {
- * 		Runnable callback = new Runnable() {
- * 			public void run() {
- * 				// Do something which must be done after all the threads end.
- * 				...
- * 			}
- * 		};
- * 		CallbackMonitor monitor = new CallbackMonitor(callback);
- * 		Thread1 thread1 = new Thread1(monitor);
- * 		Thread2 thread2 = new Thread2(monitor);
- * 		...
- * 		monitor.lock(thread1, thread2, ...);
- * 		thread1.start();
- * 		thread2.start();
- * 		...
- * }
- * 
- *

- * The above creates multiple threads which lock on the monitor and - * invoke unlock when they end. The keys they used can be anything which - * are unique among the threads. Once all threads end, the callback defined - * in the method will be invoked and do the thing which requires to be done - * after the end of these threads. - *

- * Note:The threads which require collaboration on the callback - * monitor should be started only after all the locks corresponding to them - * are added. - *

- * For example, the above threads are started after the monitor locks all the threads: - *

- * 		monitor.lock(thread1, thread2, ...);
- * 		thread1.start();
- * 		thread2.start();
- * 		...
- * 
- */ -public class CallbackMonitor { - // The callback which is invoked after all the locks are unlocked. - private ICallback callback; - // The lock map containing the keys and the corresponding running results. - private Map locks; - - /** - * Create a callback monitor with the specified callback. - * - * @param callback The callback to be invoked after all the locks being unlocked. - */ - public CallbackMonitor(ICallback callback) { - Assert.isNotNull(callback); - this.callback = callback; - this.locks = Collections.synchronizedMap(new HashMap()); - } - - /** - * Create a callback monitor with the specified callback and the keys. - * - * @param callback The callback to be invoked after all the locks being unlocked. - * @param keys The keys to lock and unlock the locks. - */ - public CallbackMonitor(ICallback callback, Object... keys) { - Assert.isNotNull(callback); - this.callback = callback; - this.locks = Collections.synchronizedMap(new HashMap()); - for (Object key : keys) { - this.locks.put(key, null); - } - } - - /** - * Add multiple locks with the specified keys. - * - * @param keys The keys whose locks are added. - */ - public synchronized void lock(Object... keys) { - for(Object key : keys) { - this.locks.put(key, null); - } - } - - /** - * Add a lock with the specified key. - * - * @param key The key whose lock is added. - */ - public synchronized void lock(Object key) { - Assert.isNotNull(key); - this.locks.put(key, null); - } - - /** - * Unlock the lock with the specified key and status - * check if all the locks have been unlocked. If all the - * locks have been unlocked, then invoke the callback. - * - * @param key The key to unlock its lock. - */ - public synchronized void unlock(Object key, IStatus status) { - Assert.isNotNull(key); - Assert.isNotNull(status); - locks.put(key, status); - IStatus current = getCurrentStatus(); - if (current != null) { - callback.done(this, current); - } - } - - /** - * Check if all the locks are unlocked and return a running status. - * - * @return a MultiStatus object describing running result or null if not completed yet. - */ - private synchronized IStatus getCurrentStatus() { - List list = new ArrayList(); - for (Entryentry : locks.entrySet()) { - IStatus status = entry.getValue(); - if (status == null) return null; - list.add(status); - } - IStatus[] children = list.toArray(new IStatus[list.size()]); - return new MultiStatus(CoreBundleActivator.getUniqueIdentifier(), 0, children, Messages.CallbackMonitor_AllTasksFinished, null); - } -} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetChildren.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetChildren.java index 9dd16b50c..e0721592f 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetChildren.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetChildren.java @@ -16,6 +16,7 @@ import org.eclipse.tcf.protocol.IToken; import org.eclipse.tcf.services.IProcesses; import org.eclipse.tcf.services.ISysMonitor; import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.tcf.core.concurrent.CallbackMonitor; import org.eclipse.tcf.te.tcf.processes.core.activator.CoreBundleActivator; import org.eclipse.tcf.te.tcf.processes.core.model.ProcessTreeNode; diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetContext.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetContext.java index abd5f4bb0..625eb80b2 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetContext.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/QueryDoneGetContext.java @@ -20,6 +20,7 @@ import org.eclipse.tcf.services.IProcesses; import org.eclipse.tcf.services.IProcesses.ProcessContext; import org.eclipse.tcf.services.ISysMonitor; import org.eclipse.tcf.te.runtime.callback.Callback; +import org.eclipse.tcf.te.tcf.core.concurrent.CallbackMonitor; import org.eclipse.tcf.te.tcf.processes.core.model.ProcessTreeNode; /** diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshChildrenDoneOpenChannel.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshChildrenDoneOpenChannel.java index 15a0c2c32..d042613de 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshChildrenDoneOpenChannel.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshChildrenDoneOpenChannel.java @@ -22,6 +22,7 @@ import org.eclipse.tcf.services.ISysMonitor; import org.eclipse.tcf.te.runtime.callback.Callback; import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; import org.eclipse.tcf.te.tcf.core.Tcf; +import org.eclipse.tcf.te.tcf.core.concurrent.CallbackMonitor; import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager; import org.eclipse.tcf.te.tcf.processes.core.model.ProcessTreeNode; diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetChildren.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetChildren.java index 58c6cbca6..0b62f02dd 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetChildren.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetChildren.java @@ -21,6 +21,7 @@ import org.eclipse.tcf.protocol.IToken; import org.eclipse.tcf.services.IProcesses; import org.eclipse.tcf.services.ISysMonitor; import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.tcf.core.concurrent.CallbackMonitor; import org.eclipse.tcf.te.tcf.processes.core.activator.CoreBundleActivator; import org.eclipse.tcf.te.tcf.processes.core.model.ProcessTreeNode; diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetContext.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetContext.java index eb477a74f..9a114bc21 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetContext.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/callbacks/RefreshDoneGetContext.java @@ -22,6 +22,7 @@ import org.eclipse.tcf.services.IProcesses; import org.eclipse.tcf.services.IProcesses.ProcessContext; import org.eclipse.tcf.services.ISysMonitor; import org.eclipse.tcf.te.runtime.callback.Callback; +import org.eclipse.tcf.te.tcf.core.concurrent.CallbackMonitor; import org.eclipse.tcf.te.tcf.processes.core.model.ProcessTreeNode; /** diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessModel.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessModel.java index 9f9f79417..cbd5cb4ff 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessModel.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessModel.java @@ -21,11 +21,9 @@ import org.eclipse.tcf.protocol.Protocol; import org.eclipse.tcf.te.core.interfaces.IViewerInput; import org.eclipse.tcf.te.runtime.callback.Callback; import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; -import org.eclipse.tcf.te.tcf.core.Tcf; 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.tcf.processes.core.activator.CoreBundleActivator; -import org.eclipse.tcf.te.tcf.processes.core.callbacks.RefreshChildrenDoneOpenChannel; import org.eclipse.tcf.te.tcf.processes.core.nls.Messages; /** @@ -220,12 +218,5 @@ public class ProcessModel implements ITreeNodeModel{ public boolean isRefreshStopped() { return stopped; } - - /** - * Refresh the children without refreshing itself. - */ - public void refreshChildren(ProcessTreeNode node) { - Tcf.getChannelManager().openChannel(node.peerNode.getPeer(), null, new RefreshChildrenDoneOpenChannel(node)); - } } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessTreeNode.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessTreeNode.java index c9d38b57f..6615c45b8 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessTreeNode.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/model/ProcessTreeNode.java @@ -20,9 +20,11 @@ import org.eclipse.tcf.services.IProcesses.ProcessContext; import org.eclipse.tcf.services.ISysMonitor; import org.eclipse.tcf.services.ISysMonitor.SysMonitorContext; import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback; +import org.eclipse.tcf.te.tcf.core.Tcf; import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager.DoneOpenChannel; import org.eclipse.tcf.te.tcf.filesystem.core.model.AbstractTreeNode; import org.eclipse.tcf.te.tcf.processes.core.callbacks.QueryDoneOpenChannel; +import org.eclipse.tcf.te.tcf.processes.core.callbacks.RefreshChildrenDoneOpenChannel; import org.eclipse.tcf.te.tcf.processes.core.callbacks.RefreshDoneOpenChannel; /** @@ -258,4 +260,9 @@ public final class ProcessTreeNode extends AbstractTreeNode { public ProcessTreeNode getParent() { return (ProcessTreeNode) parent; } + + @Override + public void refreshChildren() { + Tcf.getChannelManager().openChannel(peerNode.getPeer(), null, new RefreshChildrenDoneOpenChannel(this)); + } } diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.java index a82ac3d8e..f5990ca43 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.java @@ -47,7 +47,6 @@ public class Messages extends NLS { public static String ProcessStreamWriterRunnable_error_writeFailed; public static String ProcessStreamReaderRunnable_error_appendFailed; - public static String CallbackMonitor_AllTasksFinished; public static String PendingOperation_label; public static String ProcessLabelProvider_RootNodeLabel; public static String AttachStep_error_connect; diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.properties b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.properties index 3f90dc6ac..6385a5d2e 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.properties +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/nls/Messages.properties @@ -25,7 +25,6 @@ ProcessLauncher_cause_ioexception=An IOException occurred. ProcessStreamReaderRunnable_error_readFailed=Failed to read data from stream with id ''{0}''.\n\nPossible Cause:\n{1} ProcessStreamWriterRunnable_error_writeFailed=Failed to write data to stream with id ''{0}''.\n\nPossible Cause:\n{1} ProcessStreamReaderRunnable_error_appendFailed=Failed to append data from stream with id ''{0}'' to data receiver.\n\nLost data:\n{1}. -CallbackMonitor_AllTasksFinished=All tasks are finished\! PendingOperation_label=Pending... ProcessLabelProvider_RootNodeLabel=Processes AttachStep_error_connect=Failed to attach to context: {0} diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/controls/ProcessNavigatorContentProvider.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/controls/ProcessNavigatorContentProvider.java index 3017c544c..80633075c 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/controls/ProcessNavigatorContentProvider.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.ui/src/org/eclipse/tcf/te/tcf/processes/ui/controls/ProcessNavigatorContentProvider.java @@ -10,15 +10,11 @@ package org.eclipse.tcf.te.tcf.processes.ui.controls; 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.swt.widgets.Display; import org.eclipse.tcf.te.tcf.filesystem.core.model.ITreeNodeModel; import org.eclipse.tcf.te.tcf.filesystem.ui.controls.NavigatorContentProvider; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel; import org.eclipse.tcf.te.tcf.processes.core.model.ProcessModel; -import org.eclipse.tcf.te.tcf.processes.core.model.ProcessTreeNode; import org.eclipse.ui.IMemento; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.navigator.NavigatorFilterService; @@ -32,31 +28,10 @@ import org.eclipse.ui.navigator.INavigatorFilterService; * Processes content provider for the common navigator of Target Explorer. */ @SuppressWarnings("restriction") -public class ProcessNavigatorContentProvider extends NavigatorContentProvider implements ICommonContentProvider, ITreeViewerListener { +public class ProcessNavigatorContentProvider extends NavigatorContentProvider implements ICommonContentProvider { // The "Single Thread" filter id private final static String SINGLE_THREAD_FILTER_ID = "org.eclipse.tcf.te.tcf.processes.ui.navigator.filter.singleThread"; //$NON-NLS-1$ - /* - * (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); - refreshChildren(newInput); - } - - /* - * (non-Javadoc) - * @see org.eclipse.tcf.te.ui.trees.TreeContentProvider#dispose() - */ - @Override - public void dispose() { - super.dispose(); - this.viewer.removeTreeListener(this); - } - /* * (non-Javadoc) * @see org.eclipse.tcf.te.tcf.filesystem.ui.controls.NavigatorContentProvider#doGetModel(org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel) @@ -103,36 +78,4 @@ public class ProcessNavigatorContentProvider extends NavigatorContentProvider i @Override public void saveState(IMemento aMemento) { } - - /* - * (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 element = event.getElement(); - refreshChildren(element); - } - - /** - * Refresh the element's children if it is a process node and its children has - * already been queried. - */ - private void refreshChildren(Object object) { - if(object instanceof ProcessTreeNode) { - ProcessTreeNode parent = (ProcessTreeNode) object; - if (parent.childrenQueried && !parent.childrenQueryRunning) { - ProcessModel pModel = ProcessModel.getProcessModel(parent.peerNode); - pModel.refreshChildren(parent); - } - } - } } -- cgit v1.2.3