Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.runtime.model/src/org/eclipse/tcf/te/runtime/model/ContainerModelNode.java12
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/interfaces/properties/IPropertiesContainer.java12
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/properties/PropertiesContainer.java29
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/interfacesl/tracing/ITraceIds.java (renamed from target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/tracing/ITraceIds.java)2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/ChannelManager.java82
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelListener.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelOpenListener.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/ScannerRunnable.java68
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/interfaces/IModelListener.java16
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ChannelStateChangeListener.java6
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ModelAdapter.java7
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/nodes/PeerModel.java33
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java24
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/META-INF/MANIFEST.MF2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/interfaces/tracing/ITraceIds.java (renamed from target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/internal/tracing/ITraceIds.java)2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessLauncher.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessProcessesListener.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessStreamsListener.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/META-INF/MANIFEST.MF2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/interfaces/tracing/ITraceIds.java (renamed from target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/internal/tracing/ITraceIds.java)2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsLauncher.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsListener.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsStreamsListener.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/plugin.xml11
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/AttributesSection.java4
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/GeneralInformationSection.java6
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/ServicesSection.java6
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/TransportSection.java131
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/EventListener.java39
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/ModelListener.java21
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/META-INF/MANIFEST.MF2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/interfaces/tracing/ITraceIds.java (renamed from target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/internal/tracing/ITraceIds.java)2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/streams/OutputStreamMonitor.java2
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/.options3
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/activator/UIPlugin.java17
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/interfaces/tracing/ITraceIds.java21
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/Editor.java133
-rw-r--r--target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/EditorEventListener.java42
38 files changed, 510 insertions, 245 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime.model/src/org/eclipse/tcf/te/runtime/model/ContainerModelNode.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime.model/src/org/eclipse/tcf/te/runtime/model/ContainerModelNode.java
index d9c21cc14..35ee8901c 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.runtime.model/src/org/eclipse/tcf/te/runtime/model/ContainerModelNode.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime.model/src/org/eclipse/tcf/te/runtime/model/ContainerModelNode.java
@@ -10,7 +10,6 @@
package org.eclipse.tcf.te.runtime.model;
import java.util.ArrayList;
-import java.util.EventObject;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.locks.Lock;
@@ -18,7 +17,6 @@ import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
-import org.eclipse.tcf.te.runtime.events.EventManager;
import org.eclipse.tcf.te.runtime.model.interfaces.IContainerModelNode;
import org.eclipse.tcf.te.runtime.model.interfaces.IModelNode;
@@ -129,9 +127,7 @@ public class ContainerModelNode extends ModelNode implements IContainerModelNode
childListLock.unlock();
}
- EventObject event = newEvent(this, NOTIFY_ADDED, null, new IModelNode[] { node });
- if (event != null) EventManager.getInstance().fireEvent(event);
-
+ fireChangeEvent(NOTIFY_ADDED, null, new IModelNode[] { node });
return true;
}
return false;
@@ -152,8 +148,7 @@ public class ContainerModelNode extends ModelNode implements IContainerModelNode
try { childListLock.lock(); removed = childList.remove(node); } finally { childListLock.unlock(); }
// Unlink the parent and fire the removed notification if the element got removed
if (removed) {
- EventObject event = newEvent(this, NOTIFY_REMOVED, new IModelNode[] { node }, null);
- if (event != null) EventManager.getInstance().fireEvent(event);
+ fireChangeEvent(NOTIFY_REMOVED, new IModelNode[] { node }, null);
}
return removed;
@@ -176,8 +171,7 @@ public class ContainerModelNode extends ModelNode implements IContainerModelNode
}
if (removed) {
- EventObject event = newEvent(this, NOTIFY_REMOVED, children, null);
- if (event != null) EventManager.getInstance().fireEvent(event);
+ fireChangeEvent(NOTIFY_REMOVED, children, null);
}
return removed;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/interfaces/properties/IPropertiesContainer.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/interfaces/properties/IPropertiesContainer.java
index 139bd61ff..fcdb1316d 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/interfaces/properties/IPropertiesContainer.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/interfaces/properties/IPropertiesContainer.java
@@ -42,8 +42,20 @@ public interface IPropertiesContainer extends IAdaptable {
public boolean changeEventsEnabled();
/**
+ * Fires a change event with the given parameter.
+ *
+ * @param key The property key. Must not be <code>null</code>.
+ * @param oldValue The old properties value, or <code>null</code>.
+ * @param newValue The new properties value, or <code>null</code>.
+ */
+ public void fireChangeEvent(String key, Object oldValue, Object newValue);
+
+ /**
* Set the properties from the given map. Calling this method
* will overwrite all previous set properties.
+ * <p>
+ * <b>Note:</b> The method will have no effect if the given properties are the
+ * same as the already set properties.
*
* @param properties The map of properties to set. Must not be <code>null</code>.
*/
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/properties/PropertiesContainer.java b/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/properties/PropertiesContainer.java
index 635b6c100..e85c7a387 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/properties/PropertiesContainer.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.runtime/src/org/eclipse/tcf/te/runtime/properties/PropertiesContainer.java
@@ -143,12 +143,22 @@ public class PropertiesContainer extends PlatformObject implements IPropertiesCo
return changeEventsEnabled;
}
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer#fireChangeEvent(java.lang.String, java.lang.Object, java.lang.Object)
+ */
+ @Override
+ public void fireChangeEvent(String key, Object oldValue, Object newValue) {
+ Assert.isNotNull(key);
+ EventObject event = newEvent(this, key, oldValue, newValue);
+ if (event != null) EventManager.getInstance().fireEvent(event);
+ }
+
/**
* Creates a new property change notification event object. The event object is initialized
* with the given parameter.
* <p>
- * This method is typically called from {@link #setProperty(String, Object)} in case the
- * property changed it's value. <code>Null</code> is returned if no event should be fired.
+ * This method is typically called from {@link #fireChangeEvent(String, Object, Object)}.
+ * <code>Null</code> is returned if no event should be fired.
*
* @param source The source object. Must not be <code>null</code>.
* @param key The property key. Must not be <code>null</code>.
@@ -157,7 +167,7 @@ public class PropertiesContainer extends PlatformObject implements IPropertiesCo
*
* @return The new property change notification event instance or <code>null</code>.
*/
- public final EventObject newEvent(Object source, String key, Object oldValue, Object newValue) {
+ private final EventObject newEvent(Object source, String key, Object oldValue, Object newValue) {
Assert.isNotNull(source);
Assert.isNotNull(key);
@@ -346,9 +356,14 @@ public class PropertiesContainer extends PlatformObject implements IPropertiesCo
Assert.isTrue(checkThreadAccess(), "Illegal Thread Access"); //$NON-NLS-1$
Assert.isNotNull(properties);
+ // Change the properties only if they have changed really
+ if (this.properties.equals(properties)) return;
+
+ // Clear out all old properties
this.properties.clear();
+ // Apply everything from the given properties
this.properties.putAll(properties);
-
+ // And signal the change
postSetProperties(properties);
}
@@ -362,8 +377,7 @@ public class PropertiesContainer extends PlatformObject implements IPropertiesCo
Assert.isTrue(checkThreadAccess(), "Illegal Thread Access"); //$NON-NLS-1$
Assert.isNotNull(properties);
- EventObject event = newEvent(this, "properties", null, properties); //$NON-NLS-1$
- if (event != null) EventManager.getInstance().fireEvent(event);
+ fireChangeEvent("properties", null, properties); //$NON-NLS-1$
}
/* (non-Javadoc)
@@ -459,8 +473,7 @@ public class PropertiesContainer extends PlatformObject implements IPropertiesCo
Assert.isTrue(checkThreadAccess(), "Illegal Thread Access"); //$NON-NLS-1$
Assert.isNotNull(key);
- EventObject event = newEvent(this, key, oldValue, value);
- if (event != null) EventManager.getInstance().fireEvent(event);
+ fireChangeEvent(key, oldValue, value);
}
/* (non-Javadoc)
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/tracing/ITraceIds.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/interfacesl/tracing/ITraceIds.java
index 9c77bccaf..0438d85c6 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/tracing/ITraceIds.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/interfacesl/tracing/ITraceIds.java
@@ -7,7 +7,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.tcf.te.tcf.core.internal.tracing;
+package org.eclipse.tcf.te.tcf.core.interfacesl.tracing;
/**
* TCF core plug-in trace slot identifiers.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/ChannelManager.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/ChannelManager.java
index 151f3687d..3e6882ed3 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/ChannelManager.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/ChannelManager.java
@@ -25,8 +25,8 @@ import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.tcf.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.core.interfaces.IChannelManager;
+import org.eclipse.tcf.te.tcf.core.interfacesl.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.core.internal.nls.Messages;
-import org.eclipse.tcf.te.tcf.core.internal.tracing.ITraceIds;
/**
@@ -102,16 +102,14 @@ public final class ChannelManager extends PlatformObject implements IChannelMana
*/
@Override
public void openChannel(final IPeer peer, final boolean forceNew, final DoneOpenChannel done) {
- if (Protocol.isDispatchThread()) {
- internalOpenChannel(peer, forceNew, done);
- } else {
- Protocol.invokeLater(new Runnable() {
- @Override
- public void run() {
- internalOpenChannel(peer, forceNew, done);
- }
- });
- }
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ internalOpenChannel(peer, forceNew, done);
+ }
+ };
+ if (Protocol.isDispatchThread()) runnable.run();
+ else Protocol.invokeLater(runnable);
}
/**
@@ -237,16 +235,14 @@ public final class ChannelManager extends PlatformObject implements IChannelMana
*/
@Override
public void openChannel(final Map<String, String> peerAttributes, final boolean forceNew, final DoneOpenChannel done) {
- if (Protocol.isDispatchThread()) {
- internalOpenChannel(peerAttributes, forceNew, done);
- } else {
- Protocol.invokeLater(new Runnable() {
- @Override
- public void run() {
- internalOpenChannel(peerAttributes, forceNew, done);
- }
- });
- }
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ internalOpenChannel(peerAttributes, forceNew, done);
+ }
+ };
+ if (Protocol.isDispatchThread()) runnable.run();
+ else Protocol.invokeLater(runnable);
}
/**
@@ -338,16 +334,14 @@ public final class ChannelManager extends PlatformObject implements IChannelMana
*/
@Override
public void closeChannel(final IChannel channel) {
- if (Protocol.isDispatchThread()) {
- internalCloseChannel(channel);
- } else {
- Protocol.invokeLater(new Runnable() {
- @Override
- public void run() {
- internalCloseChannel(channel);
- }
- });
- }
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ internalCloseChannel(channel);
+ }
+ };
+ if (Protocol.isDispatchThread()) runnable.run();
+ else Protocol.invokeLater(runnable);
}
/**
@@ -383,16 +377,16 @@ public final class ChannelManager extends PlatformObject implements IChannelMana
CoreBundleActivator.getTraceHandler().trace(NLS.bind(Messages.ChannelManager_closeChannel_closed_message, id),
0, ITraceIds.TRACE_CHANNEL_MANAGER, IStatus.INFO, this);
}
+
+ // Clean the reference counter and the channel map
+ refCounters.remove(id);
+ channels.remove(id);
} else {
if (CoreBundleActivator.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_CHANNEL_MANAGER)) {
CoreBundleActivator.getTraceHandler().trace(NLS.bind(Messages.ChannelManager_closeChannel_inuse_message, id, counter.toString()),
0, ITraceIds.TRACE_CHANNEL_MANAGER, IStatus.INFO, this);
}
}
-
- // Clean the reference counter and the channel map
- refCounters.remove(id);
- channels.remove(id);
}
/* (non-Javadoc)
@@ -400,16 +394,14 @@ public final class ChannelManager extends PlatformObject implements IChannelMana
*/
@Override
public void closeAll() {
- if (Protocol.isDispatchThread()) {
- internalCloseAll();
- } else {
- Protocol.invokeLater(new Runnable() {
- @Override
- public void run() {
- internalCloseAll();
- }
- });
- }
+ Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ internalCloseAll();
+ }
+ };
+ if (Protocol.isDispatchThread()) runnable.run();
+ else Protocol.invokeLater(runnable);
}
/**
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelListener.java
index a6858df6f..71397ac2f 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelListener.java
@@ -14,9 +14,9 @@ import org.eclipse.osgi.util.NLS;
import org.eclipse.tcf.protocol.IChannel;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.tcf.core.Tcf;
+import org.eclipse.tcf.te.tcf.core.interfacesl.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.core.internal.interfaces.IChannelOpenListener;
import org.eclipse.tcf.te.tcf.core.internal.nls.Messages;
-import org.eclipse.tcf.te.tcf.core.internal.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.core.internal.utils.LogUtils;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelOpenListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelOpenListener.java
index 5a9930561..0cf6fcfbb 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelOpenListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.core/src/org/eclipse/tcf/te/tcf/core/internal/listener/InternalChannelOpenListener.java
@@ -17,9 +17,9 @@ import org.eclipse.tcf.protocol.IChannel;
import org.eclipse.tcf.protocol.IChannel.IChannelListener;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.tcf.core.Tcf;
+import org.eclipse.tcf.te.tcf.core.interfacesl.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.core.internal.interfaces.IChannelOpenListener;
import org.eclipse.tcf.te.tcf.core.internal.nls.Messages;
-import org.eclipse.tcf.te.tcf.core.internal.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.core.internal.utils.LogUtils;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/ScannerRunnable.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/ScannerRunnable.java
index e2c0f7b9f..b6bd9f3e1 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/ScannerRunnable.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/ScannerRunnable.java
@@ -49,6 +49,8 @@ public class ScannerRunnable implements Runnable, IChannel.IChannelListener {
/* default */ IChannel channel = null;
// Mark if the used channel is a shared channel instance
/* default */ boolean sharedChannel = false;
+ // The state of the peer node at the point of time the runnable starts execution
+ private int oldState = IPeerModelProperties.STATE_UNKNOWN;
/**
* Constructor.
@@ -79,7 +81,9 @@ public class ScannerRunnable implements Runnable, IChannel.IChannelListener {
*/
@Override
public void run() {
- if (peerNode != null && peerNode.getPeer() != null) {
+ // Remember the peer node state
+ oldState = peerNode.getIntProperty(IPeerModelProperties.PROP_STATE);
+ if (peerNode.getPeer() != null) {
// Check if there is a shared channel available which is still in open state
channel = Tcf.getChannelManager().getChannel(peerNode.getPeer());
if (channel == null || channel.getState() != IChannel.STATE_OPEN) {
@@ -108,12 +112,18 @@ public class ScannerRunnable implements Runnable, IChannel.IChannelListener {
channel.removeChannelListener(this);
}
+ // Turn off change notifications temporarily
+ boolean changed = peerNode.setChangeEventsEnabled(false);
+ // Flag to set for refreshing the editor tab list
+ boolean refreshEditorTabs = false;
+
// Set the peer state property
- if (peerNode != null) {
- int counter = peerNode.getIntProperty(IPeerModelProperties.PROP_CHANNEL_REF_COUNTER);
- peerNode.setProperty(IPeerModelProperties.PROP_STATE, counter > 0 ? IPeerModelProperties.STATE_CONNECTED : IPeerModelProperties.STATE_REACHABLE);
- peerNode.setProperty(IPeerModelProperties.PROP_LAST_SCANNER_ERROR, null);
- }
+ int counter = peerNode.getIntProperty(IPeerModelProperties.PROP_CHANNEL_REF_COUNTER);
+ peerNode.setProperty(IPeerModelProperties.PROP_STATE, counter > 0 ? IPeerModelProperties.STATE_CONNECTED : IPeerModelProperties.STATE_REACHABLE);
+ peerNode.setProperty(IPeerModelProperties.PROP_LAST_SCANNER_ERROR, null);
+ // If the old state had been one of the error states before, and is now changed to
+ // either reachable or connected, the editor tabs needs refreshment.
+ refreshEditorTabs = oldState != IPeerModelProperties.STATE_CONNECTED && oldState != IPeerModelProperties.STATE_REACHABLE;
if (channel != null && channel.getState() == IChannel.STATE_OPEN) {
// Keep the channel open as long as the query for the remote peers is running.
@@ -127,12 +137,9 @@ public class ScannerRunnable implements Runnable, IChannel.IChannelListener {
// Get the remote services
Collection<String> remoteServices = new ArrayList<String>(channel.getRemoteServices());
- // Get the update service
+ // Update the services
ILocatorModelUpdateService updateService = model.getService(ILocatorModelUpdateService.class);
- if (updateService != null) {
- // Update the services nodes
- updateService.updatePeerServices(peerNode, localServices, remoteServices);
- }
+ updateService.updatePeerServices(peerNode, localServices, remoteServices);
// Use the open channel to ask the remote peer what other peers it knows
ILocator locator = channel.getRemoteService(ILocator.class);
@@ -252,6 +259,16 @@ public class ScannerRunnable implements Runnable, IChannel.IChannelListener {
// And close the channel
if (!sharedChannel && !keepOpen) channel.close();
}
+
+ // Re-enable the change events a fire a "properties" change event
+ if (changed) {
+ peerNode.setChangeEventsEnabled(true);
+ peerNode.fireChangeEvent("properties", null, peerNode.getProperties()); //$NON-NLS-1$
+ }
+
+ if (refreshEditorTabs) {
+ peerNode.fireChangeEvent("editor.refreshTab", Boolean.FALSE, Boolean.TRUE); //$NON-NLS-1$
+ }
}
/* (non-Javadoc)
@@ -268,11 +285,38 @@ public class ScannerRunnable implements Runnable, IChannel.IChannelListener {
// Set the peer state property, if the scanner the runnable
// has been scheduled from is still active.
- if (peerNode != null && (parentScanner == null || parentScanner != null && !parentScanner.isTerminated())) {
+ if (parentScanner == null || parentScanner != null && !parentScanner.isTerminated()) {
+ // Turn off change notifications temporarily
+ boolean changed = peerNode.setChangeEventsEnabled(false);
+
peerNode.setProperty(IPeerModelProperties.PROP_CHANNEL_REF_COUNTER, null);
boolean timeout = error instanceof SocketTimeoutException || (error instanceof ConnectException && error.getMessage() != null && error.getMessage().startsWith("Connection timed out:")); //$NON-NLS-1$
peerNode.setProperty(IPeerModelProperties.PROP_STATE, timeout ? IPeerModelProperties.STATE_NOT_REACHABLE : IPeerModelProperties.STATE_ERROR);
peerNode.setProperty(IPeerModelProperties.PROP_LAST_SCANNER_ERROR, error instanceof SocketTimeoutException ? null : error);
+
+ // Clear out previously determined services
+ ILocatorModel model = (ILocatorModel)peerNode.getAdapter(ILocatorModel.class);
+ if (model != null) {
+ ILocatorModelUpdateService updateService = model.getService(ILocatorModelUpdateService.class);
+ updateService.updatePeerServices(peerNode, null, null);
+ }
+
+ // Clean out DNS name detection
+ peerNode.setProperty("dns.name.transient", null); //$NON-NLS-1$
+ peerNode.setProperty("dns.lastIP.transient", null); //$NON-NLS-1$
+ peerNode.setProperty("dns.skip.transient", null); //$NON-NLS-1$
+
+ // Re-enable the change events a fire a "properties" change event
+ if (changed) {
+ peerNode.setChangeEventsEnabled(true);
+ peerNode.fireChangeEvent("properties", null, peerNode.getProperties()); //$NON-NLS-1$
+ }
+
+ // If the old state had been one of the reachable states before, and is now changed to
+ // either not reachable or error, the editor tabs needs refreshment.
+ if (oldState != IPeerModelProperties.STATE_NOT_REACHABLE && oldState != IPeerModelProperties.STATE_ERROR) {
+ peerNode.fireChangeEvent("editor.refreshTab", Boolean.FALSE, Boolean.TRUE); //$NON-NLS-1$
+ }
}
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/interfaces/IModelListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/interfaces/IModelListener.java
index b8a6373b7..8e348dca5 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/interfaces/IModelListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/interfaces/IModelListener.java
@@ -9,13 +9,11 @@
*******************************************************************************/
package org.eclipse.tcf.te.tcf.locator.interfaces;
-import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorModel;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
/**
- * Interface for clients to implement that wishes to listen
- * to changes to the locator model.
+ * Interface for clients to implement that wishes to listen to changes to the locator model.
*/
public interface IModelListener {
@@ -34,16 +32,4 @@ public interface IModelListener {
* @param model The disposed locator model.
*/
public void locatorModelDisposed(ILocatorModel model);
-
- /**
- * Invoked if the peer model properties have changed.
- * <p>
- * <b>Note:</b> This method is called in addition to the change events send out by the peer
- * model. If it is required to determine which property has changed in detail, register a
- * {@link IEventListener} instead.
- *
- * @param model The parent locator model.
- * @param peer The changed peer model.
- */
- public void peerModelChanged(ILocatorModel model, IPeerModel peer);
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ChannelStateChangeListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ChannelStateChangeListener.java
index c5c5264f3..09e6ff740 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ChannelStateChangeListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ChannelStateChangeListener.java
@@ -13,13 +13,13 @@ import org.eclipse.core.runtime.Assert;
import org.eclipse.tcf.protocol.IChannel;
import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
+import org.eclipse.tcf.te.tcf.core.interfaces.listeners.IChannelStateChangeListener;
import org.eclipse.tcf.te.tcf.locator.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.locator.interfaces.ITracing;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorModel;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModelProperties;
import org.eclipse.tcf.te.tcf.locator.interfaces.services.ILocatorModelLookupService;
-import org.eclipse.tcf.te.tcf.core.interfaces.listeners.IChannelStateChangeListener;
/**
@@ -76,7 +76,9 @@ public class ChannelStateChangeListener implements IChannelStateChangeListener {
counter--;
if (counter < 0) counter = 0;
node.setProperty(IPeerModelProperties.PROP_CHANNEL_REF_COUNTER, counter);
- if (counter == 0) node.setProperty(IPeerModelProperties.PROP_STATE, IPeerModelProperties.STATE_REACHABLE);
+ if (counter == 0 && node.isProperty(IPeerModelProperties.PROP_STATE, IPeerModelProperties.STATE_CONNECTED)) {
+ node.setProperty(IPeerModelProperties.PROP_STATE, IPeerModelProperties.STATE_REACHABLE);
+ }
}
break;
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ModelAdapter.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ModelAdapter.java
index 458518052..255efbd04 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ModelAdapter.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/listener/ModelAdapter.java
@@ -32,11 +32,4 @@ public class ModelAdapter implements IModelListener {
public void locatorModelDisposed(ILocatorModel model) {
}
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.tcf.locator.core.interfaces.IModelListener#peerModelChanged(org.eclipse.tcf.te.tcf.locator.core.interfaces.nodes.ILocatorModel, org.eclipse.tcf.te.tcf.locator.core.interfaces.nodes.IPeerModel)
- */
- @Override
- public void peerModelChanged(ILocatorModel model, IPeerModel peer) {
- }
-
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/nodes/PeerModel.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/nodes/PeerModel.java
index 0351d703b..218336f73 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/nodes/PeerModel.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/nodes/PeerModel.java
@@ -17,7 +17,6 @@ import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.runtime.interfaces.workingsets.IWorkingSetElement;
import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
-import org.eclipse.tcf.te.tcf.locator.interfaces.IModelListener;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.ILocatorModel;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModelProperties;
@@ -218,21 +217,6 @@ public class PeerModel extends PropertiesContainer implements IPeerModel, IWorki
peerId = getPeer().getID();
Assert.isNotNull(peerId);
- if (changeEventsEnabled()) {
- final IModelListener[] listeners = model.getListener();
- if (listeners.length > 0) {
- Protocol.invokeLater(new Runnable() {
- @Override
- @SuppressWarnings("synthetic-access")
- public void run() {
- for (IModelListener listener : listeners) {
- listener.peerModelChanged(model, PeerModel.this);
- }
- }
- });
- }
- }
-
super.postSetProperties(properties);
}
@@ -251,23 +235,6 @@ public class PeerModel extends PropertiesContainer implements IPeerModel, IWorki
Assert.isNotNull(peerId);
}
- // Notify registered listeners that the peer changed. Property
- // changes for property slots ending with ".silent" are suppressed.
- if (changeEventsEnabled() && !key.endsWith(".silent")) { //$NON-NLS-1$
- final IModelListener[] listeners = model.getListener();
- if (listeners.length > 0) {
- Protocol.invokeLater(new Runnable() {
- @Override
- @SuppressWarnings("synthetic-access")
- public void run() {
- for (IModelListener listener : listeners) {
- listener.peerModelChanged(model, PeerModel.this);
- }
- }
- });
- }
- }
-
super.postSetProperty(key, value, oldValue);
}
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java
index 2eaf67923..400aa8b7e 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.locator/src/org/eclipse/tcf/te/tcf/locator/services/LocatorModelUpdateService.java
@@ -140,17 +140,7 @@ public class LocatorModelUpdateService extends AbstractLocatorModelService imple
}
// Notify listeners
- final IModelListener[] listeners = getLocatorModel().getListener();
- if (listeners.length > 0) {
- Protocol.invokeLater(new Runnable() {
- @Override
- public void run() {
- for (IModelListener listener : listeners) {
- listener.peerModelChanged(getLocatorModel(), parent);
- }
- }
- });
- }
+ parent.fireChangeEvent("changed", null, children); //$NON-NLS-1$
}
/* (non-Javadoc)
@@ -177,16 +167,6 @@ public class LocatorModelUpdateService extends AbstractLocatorModelService imple
}
// Notify listeners
- final IModelListener[] listeners = getLocatorModel().getListener();
- if (listeners.length > 0) {
- Protocol.invokeLater(new Runnable() {
- @Override
- public void run() {
- for (IModelListener listener : listeners) {
- listener.peerModelChanged(getLocatorModel(), parent);
- }
- }
- });
- }
+ parent.fireChangeEvent("changed", null, children); //$NON-NLS-1$
}
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/META-INF/MANIFEST.MF
index 13eec1d21..ec8cb3c28 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/META-INF/MANIFEST.MF
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/META-INF/MANIFEST.MF
@@ -16,6 +16,6 @@ Bundle-ActivationPolicy: lazy
Bundle-Localization: plugin
Export-Package: org.eclipse.tcf.te.tcf.processes.core.activator;x-internal:=true,
org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher,
- org.eclipse.tcf.te.tcf.processes.core.internal.tracing;x-internal:=true,
+ org.eclipse.tcf.te.tcf.processes.core.interfaces.tracing;x-internal:=true,
org.eclipse.tcf.te.tcf.processes.core.launcher,
org.eclipse.tcf.te.tcf.processes.core.nls
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/internal/tracing/ITraceIds.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/interfaces/tracing/ITraceIds.java
index 285feade3..df003ac9d 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/internal/tracing/ITraceIds.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/interfaces/tracing/ITraceIds.java
@@ -7,7 +7,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.tcf.te.tcf.processes.core.internal.tracing;
+package org.eclipse.tcf.te.tcf.processes.core.interfaces.tracing;
/**
* Core plug-in trace slot identifiers.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessLauncher.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessLauncher.java
index fe3da269a..476016e0a 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessLauncher.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessLauncher.java
@@ -62,7 +62,7 @@ import org.eclipse.tcf.te.tcf.processes.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessContextAwareListener;
import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessLauncher;
import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessStreamsProxy;
-import org.eclipse.tcf.te.tcf.processes.core.internal.tracing.ITraceIds;
+import org.eclipse.tcf.te.tcf.processes.core.interfaces.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.processes.core.nls.Messages;
/**
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessProcessesListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessProcessesListener.java
index 4ec625b2c..6251db486 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessProcessesListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessProcessesListener.java
@@ -16,7 +16,7 @@ import org.eclipse.tcf.services.IProcesses;
import org.eclipse.tcf.services.IProcesses.ProcessesListener;
import org.eclipse.tcf.te.tcf.processes.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessContextAwareListener;
-import org.eclipse.tcf.te.tcf.processes.core.internal.tracing.ITraceIds;
+import org.eclipse.tcf.te.tcf.processes.core.interfaces.tracing.ITraceIds;
import org.eclipse.tcf.te.runtime.events.EventManager;
import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessStreamsListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessStreamsListener.java
index 8b83450ec..e59269143 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessStreamsListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.processes.core/src/org/eclipse/tcf/te/tcf/processes/core/launcher/ProcessStreamsListener.java
@@ -27,7 +27,7 @@ import org.eclipse.tcf.services.IProcesses;
import org.eclipse.tcf.services.IStreams;
import org.eclipse.tcf.te.tcf.processes.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.processes.core.interfaces.launcher.IProcessContextAwareListener;
-import org.eclipse.tcf.te.tcf.processes.core.internal.tracing.ITraceIds;
+import org.eclipse.tcf.te.tcf.processes.core.interfaces.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.processes.core.nls.Messages;
import org.eclipse.tcf.util.TCFTask;
import org.eclipse.tcf.te.core.async.AsyncCallbackCollector;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/META-INF/MANIFEST.MF
index ff3c831c4..73ed19866 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/META-INF/MANIFEST.MF
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/META-INF/MANIFEST.MF
@@ -16,6 +16,6 @@ Bundle-ActivationPolicy: lazy
Bundle-Localization: plugin
Export-Package: org.eclipse.tcf.te.tcf.terminals.core.activator;x-internal:=true,
org.eclipse.tcf.te.tcf.terminals.core.interfaces.launcher,
- org.eclipse.tcf.te.tcf.terminals.core.internal.tracing;x-internal:=true,
+ org.eclipse.tcf.te.tcf.terminals.core.interfaces.tracing;x-internal:=true,
org.eclipse.tcf.te.tcf.terminals.core.launcher,
org.eclipse.tcf.te.tcf.terminals.core.nls;x-internal:=true
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/internal/tracing/ITraceIds.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/interfaces/tracing/ITraceIds.java
index 30e9e559b..f0b42046f 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/internal/tracing/ITraceIds.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/interfaces/tracing/ITraceIds.java
@@ -7,7 +7,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.tcf.te.tcf.terminals.core.internal.tracing;
+package org.eclipse.tcf.te.tcf.terminals.core.interfaces.tracing;
/**
* Core plug-in trace slot identifiers.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsLauncher.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsLauncher.java
index d481a654a..01d6dd587 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsLauncher.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsLauncher.java
@@ -57,7 +57,7 @@ import org.eclipse.tcf.te.tcf.core.streams.StreamsDataReceiver;
import org.eclipse.tcf.te.tcf.terminals.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.terminals.core.interfaces.launcher.ITerminalsContextAwareListener;
import org.eclipse.tcf.te.tcf.terminals.core.interfaces.launcher.ITerminalsLauncher;
-import org.eclipse.tcf.te.tcf.terminals.core.internal.tracing.ITraceIds;
+import org.eclipse.tcf.te.tcf.terminals.core.interfaces.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.terminals.core.nls.Messages;
/**
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsListener.java
index ec70d4fda..f28b6f7f4 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsListener.java
@@ -16,7 +16,7 @@ import org.eclipse.tcf.services.ITerminals;
import org.eclipse.tcf.services.ITerminals.TerminalContext;
import org.eclipse.tcf.te.tcf.terminals.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.terminals.core.interfaces.launcher.ITerminalsContextAwareListener;
-import org.eclipse.tcf.te.tcf.terminals.core.internal.tracing.ITraceIds;
+import org.eclipse.tcf.te.tcf.terminals.core.interfaces.tracing.ITraceIds;
import org.eclipse.tcf.te.runtime.events.EventManager;
import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsStreamsListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsStreamsListener.java
index 79ac2fcab..e928966c7 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsStreamsListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.terminals.core/src/org/eclipse/tcf/te/tcf/terminals/core/launcher/TerminalsStreamsListener.java
@@ -28,7 +28,7 @@ import org.eclipse.tcf.services.ITerminals;
import org.eclipse.tcf.services.ITerminals.TerminalContext;
import org.eclipse.tcf.te.tcf.terminals.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.tcf.terminals.core.interfaces.launcher.ITerminalsContextAwareListener;
-import org.eclipse.tcf.te.tcf.terminals.core.internal.tracing.ITraceIds;
+import org.eclipse.tcf.te.tcf.terminals.core.interfaces.tracing.ITraceIds;
import org.eclipse.tcf.te.tcf.terminals.core.nls.Messages;
import org.eclipse.tcf.util.TCFTask;
import org.eclipse.tcf.te.core.async.AsyncCallbackCollector;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/plugin.xml
index 673290d49..d8046a60a 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/plugin.xml
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/plugin.xml
@@ -2,6 +2,17 @@
<?eclipse version="3.4"?>
<plugin>
+<!-- Event listener contributions -->
+ <extension point="org.eclipse.tcf.te.runtime.eventListeners">
+ <eventListener
+ class="org.eclipse.tcf.te.tcf.ui.navigator.EventListener">
+ <eventSourceType
+ bundleId="org.eclipse.tcf.te.tcf.locator"
+ class="org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel">
+ </eventSourceType>
+ </eventListener>
+ </extension>
+
<!-- Common navigator contributions -->
<extension point="org.eclipse.ui.navigator.viewer">
<viewerContentBinding viewerId="org.eclipse.tcf.te.ui.views.TargetExplorer">
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/AttributesSection.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/AttributesSection.java
index 0f24d5406..83e97d1a9 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/AttributesSection.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/AttributesSection.java
@@ -318,10 +318,8 @@ public class AttributesSection extends AbstractSection {
Protocol.invokeLater(new Runnable() {
@Override
public void run() {
- // Refresh the locator model
- //od.getModel().getService(ILocatorModelRefreshService.class).refresh();
// Trigger a change event for the original data node
- od.setProperties(od.getProperties());
+ od.fireChangeEvent("properties", null, od.getProperties()); //$NON-NLS-1$
}
});
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/GeneralInformationSection.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/GeneralInformationSection.java
index 4d6a5698b..3b9888dfd 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/GeneralInformationSection.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/GeneralInformationSection.java
@@ -230,7 +230,7 @@ public class GeneralInformationSection extends AbstractSection implements IValid
if (linkState != null && linkStateImage != null) {
String state = wc.getStringProperty(IPeerModelProperties.PROP_STATE);
- linkState.setText(Messages.getString("GeneralInformationSection_state_" + (state != null ? state : "_1"))); //$NON-NLS-1$ //$NON-NLS-2$
+ linkState.setText(Messages.getString("GeneralInformationSection_state_" + (state != null ? state.replace('-', '_') : "_1"))); //$NON-NLS-1$ //$NON-NLS-2$
switch (wc.getIntProperty(IPeerModelProperties.PROP_STATE)) {
case 0:
@@ -363,10 +363,8 @@ public class GeneralInformationSection extends AbstractSection implements IValid
Protocol.invokeLater(new Runnable() {
@Override
public void run() {
- // Refresh the locator model
- //od.getModel().getService(ILocatorModelRefreshService.class).refresh();
// Trigger a change event for the original data node
- od.setProperties(od.getProperties());
+ od.fireChangeEvent("properties", null, od.getProperties()); //$NON-NLS-1$
}
});
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/ServicesSection.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/ServicesSection.java
index b0950350c..41ffe5524 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/ServicesSection.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/ServicesSection.java
@@ -142,7 +142,9 @@ public class ServicesSection extends AbstractSection {
}
});
- SWTControlUtil.setText(local, odc.getStringProperty(IPeerModelProperties.PROP_LOCAL_SERVICES));
- SWTControlUtil.setText(remote, odc.getStringProperty(IPeerModelProperties.PROP_REMOTE_SERVICES));
+ String value = odc.getStringProperty(IPeerModelProperties.PROP_LOCAL_SERVICES);
+ SWTControlUtil.setText(local, value != null ? value : ""); //$NON-NLS-1$
+ value = odc.getStringProperty(IPeerModelProperties.PROP_REMOTE_SERVICES);
+ SWTControlUtil.setText(remote, value != null ? value : ""); //$NON-NLS-1$
}
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/TransportSection.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/TransportSection.java
index c597c12c1..ccaef95b1 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/TransportSection.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/editor/sections/TransportSection.java
@@ -9,6 +9,8 @@
*******************************************************************************/
package org.eclipse.tcf.te.tcf.ui.editor.sections;
+import java.io.IOException;
+import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -17,12 +19,20 @@ import org.eclipse.swt.SWT;
import org.eclipse.swt.events.TypedEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.tcf.core.TransientPeer;
+import org.eclipse.tcf.protocol.IChannel;
import org.eclipse.tcf.protocol.IPeer;
import org.eclipse.tcf.protocol.Protocol;
import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
+import org.eclipse.tcf.te.runtime.persistence.interfaces.IPersistenceService;
import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
+import org.eclipse.tcf.te.runtime.services.ServiceManager;
+import org.eclipse.tcf.te.tcf.core.Tcf;
import org.eclipse.tcf.te.tcf.core.interfaces.ITransportTypes;
+import org.eclipse.tcf.te.tcf.locator.ScannerRunnable;
import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
+import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModelProperties;
+import org.eclipse.tcf.te.tcf.locator.nodes.PeerRedirector;
import org.eclipse.tcf.te.tcf.ui.editor.controls.TransportSectionTypeControl;
import org.eclipse.tcf.te.tcf.ui.editor.controls.TransportSectionTypePanelControl;
import org.eclipse.tcf.te.tcf.ui.nls.Messages;
@@ -210,6 +220,96 @@ public class TransportSection extends AbstractSection implements IValidatableWiz
updateEnablement();
}
+ /**
+ * Stores the page widgets current values to the given peer node.
+ * <p>
+ * This method may called multiple times during the lifetime of the page and
+ * the given peer node might be even <code>null</code>.
+ *
+ * @param node The GDB Remote configuration node or <code>null</code>.
+ */
+ public void extractData(final IPeerModel node) {
+ // If no data is available, we are done
+ if (node == null) return;
+
+ // Extract the transport type and transport attributes into the working copy
+ String transportType = transportTypeControl.getSelectedTransportType();
+ String oldTransportType = wc.getStringProperty(IPeer.ATTR_TRANSPORT_NAME);
+ if (transportType.equals(oldTransportType)) {
+ // Transport type hasn't changed, check the transport attributes
+ IWizardConfigurationPanel panel = transportTypePanelControl.getConfigurationPanel(transportType);
+ // Use a temporary properties container. Otherwise we cannot know here which data
+ // the panel is handling.
+ IPropertiesContainer temp = new PropertiesContainer();
+ if (panel instanceof ISharedDataWizardPage) ((ISharedDataWizardPage)panel).extractData(temp);
+
+ boolean changed = false;
+ for (String key : temp.getProperties().keySet()) {
+ changed |= !wc.isProperty(key, temp.getProperty(key));
+ if (changed) break;
+ }
+
+ // If the data has not changed too, we are done here
+ if (!changed) return;
+
+ // Copy the new data to the working copy
+ for (String key : temp.getProperties().keySet()) {
+ wc.setProperty(key, temp.getProperty(key));
+ }
+ } else {
+ // The transport type changed. This means that we have to remove
+ // the old transport attributes from the working copy first
+ IWizardConfigurationPanel panel = transportTypePanelControl.getConfigurationPanel(oldTransportType);
+ if (panel instanceof ISharedDataWizardPage) ((ISharedDataWizardPage)panel).removeData(wc);
+ // And now add the new transport attributes
+ panel = transportTypePanelControl.getConfigurationPanel(transportType);
+ if (panel instanceof ISharedDataWizardPage) ((ISharedDataWizardPage)panel).extractData(wc);
+ }
+
+ // Copy the working copy data back to the original properties container
+ Protocol.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ // To update the peer attributes, the peer needs to be recreated
+ IPeer oldPeer = node.getPeer();
+ // Create a write able copy of the peer attributes
+ Map<String, String> attributes = new HashMap<String, String>(oldPeer.getAttributes());
+ // Determine the removed attributes
+ for (String key : attributes.keySet()) {
+ if (wc.getProperty(key) == null) attributes.remove(key);
+ }
+ // Update with the current configured attributes
+ for (String key : wc.getProperties().keySet()) {
+ String value = wc.getStringProperty(key);
+ if (value != null) {
+ attributes.put(key, value);
+ } else {
+ attributes.remove(key);
+ }
+ }
+
+ // If there is still a open channel to the old peer, close it by force
+ IChannel channel = Tcf.getChannelManager().getChannel(oldPeer);
+ if (channel != null) channel.close();
+
+ // Create the new peer
+ IPeer newPeer = oldPeer instanceof PeerRedirector ? new PeerRedirector(((PeerRedirector)oldPeer).getParent(), attributes) : new TransientPeer(attributes);
+ // Update the peer node instance (silently)
+ boolean changed = node.setChangeEventsEnabled(false);
+ node.setProperty(IPeerModelProperties.PROP_INSTANCE, newPeer);
+ // As the transport changed, we have to reset the state back to "unknown"
+ // and clear out the services and DNS markers
+ node.setProperty(IPeerModelProperties.PROP_STATE, IPeerModelProperties.STATE_UNKNOWN);
+ node.setProperty(IPeerModelProperties.PROP_LOCAL_SERVICES, null);
+ node.setProperty(IPeerModelProperties.PROP_REMOTE_SERVICES, null);
+ node.setProperty("dns.name.transient", null); //$NON-NLS-1$
+ node.setProperty("dns.lastIP.transient", null); //$NON-NLS-1$
+ node.setProperty("dns.skip.transient", null); //$NON-NLS-1$
+ if (changed) node.setChangeEventsEnabled(true);
+ }
+ });
+ }
+
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.wizards.interfaces.IValidatableWizardPage#validatePage()
*/
@@ -245,6 +345,37 @@ public class TransportSection extends AbstractSection implements IValidatableWiz
// Nothing to do if not on save or saving is not needed
if (!onSave || !needsSaving) return;
+ // Extract the data into the original data node
+ extractData(od);
+
+ // If the working copy and the original data copy differs at this point,
+ // the data changed really and we have to write the peer to the persistence
+ // storage.
+ if (!odc.equals(wc)) {
+ try {
+ // Get the persistence service
+ IPersistenceService persistenceService = ServiceManager.getInstance().getService(IPersistenceService.class);
+ if (persistenceService == null) throw new IOException("Persistence service instance unavailable."); //$NON-NLS-1$
+ // Save the peer node to the new persistence storage
+ persistenceService.write(od.getPeer().getAttributes());
+ } catch (IOException e) {
+ // Pass on to the editor page
+ }
+
+ Protocol.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ // Trigger a change event for the original data node
+ od.fireChangeEvent("properties", null, od.getProperties()); //$NON-NLS-1$
+ // And make sure the editor tabs are updated
+ od.fireChangeEvent("editor.refreshTab", Boolean.FALSE, Boolean.TRUE); //$NON-NLS-1$
+ }
+ });
+
+ // As the transport section changed, force a scan of the peer
+ ScannerRunnable runnable = new ScannerRunnable(null, od);
+ Protocol.invokeLater(runnable);
+ }
}
/**
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/EventListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/EventListener.java
new file mode 100644
index 000000000..62738056e
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/EventListener.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.ui.navigator;
+
+import java.util.EventObject;
+
+import org.eclipse.tcf.te.runtime.events.ChangeEvent;
+import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerModel;
+import org.eclipse.tcf.te.ui.views.events.AbstractEventListener;
+
+/**
+ * UI event listener updating the target explorer view.
+ */
+public class EventListener extends AbstractEventListener {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.tcf.te.runtime.interfaces.events.IEventListener#eventFired(java.util.EventObject)
+ */
+ @Override
+ public void eventFired(EventObject event) {
+ if (event instanceof ChangeEvent) {
+ final ChangeEvent changeEvent = (ChangeEvent)event;
+ final Object source = changeEvent.getSource();
+
+ // Property changes for individual peer model nodes refreshes the node only
+ if (source instanceof IPeerModel) {
+ refresh(source, false);
+ }
+ }
+ }
+
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/ModelListener.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/ModelListener.java
index 2b5e2037a..961560c8b 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/ModelListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.ui/src/org/eclipse/tcf/te/tcf/ui/navigator/ModelListener.java
@@ -59,25 +59,4 @@ public class ModelListener extends ModelAdapter {
}
}
}
-
- /* (non-Javadoc)
- * @see org.eclipse.tcf.te.tcf.locator.core.listener.ModelAdapter#peerModelChanged(org.eclipse.tcf.te.tcf.locator.core.interfaces.nodes.ILocatorModel, org.eclipse.tcf.te.tcf.locator.core.interfaces.nodes.IPeerModel)
- */
- @Override
- public void peerModelChanged(final ILocatorModel model, final IPeerModel peer) {
- if (parentModel.equals(model)) {
- Tree tree = viewer.getTree();
- if (tree != null && !tree.isDisposed()) {
- Display display = tree.getDisplay();
- display.asyncExec(new Runnable() {
- @Override
- public void run() {
- if (viewer.getTree() != null && !viewer.getTree().isDisposed()) {
- viewer.refresh(peer);
- }
- }
- });
- }
- }
- }
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/META-INF/MANIFEST.MF b/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/META-INF/MANIFEST.MF
index 52741df3e..ad63e8e01 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/META-INF/MANIFEST.MF
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/META-INF/MANIFEST.MF
@@ -27,10 +27,10 @@ Export-Package: org.eclipse.tcf.te.ui.terminals.actions,
org.eclipse.tcf.te.ui.terminals.events,
org.eclipse.tcf.te.ui.terminals.help,
org.eclipse.tcf.te.ui.terminals.interfaces,
+ org.eclipse.tcf.te.ui.terminals.interfaces.tracing;x-internal:=true,
org.eclipse.tcf.te.ui.terminals.internal;x-internal:=true,
org.eclipse.tcf.te.ui.terminals.internal.dialogs;x-internal:=true,
org.eclipse.tcf.te.ui.terminals.internal.handler;x-internal:=true,
- org.eclipse.tcf.te.ui.terminals.internal.tracing;x-internal:=true,
org.eclipse.tcf.te.ui.terminals.launcher,
org.eclipse.tcf.te.ui.terminals.manager,
org.eclipse.tcf.te.ui.terminals.nls;x-internal:=true,
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/internal/tracing/ITraceIds.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/interfaces/tracing/ITraceIds.java
index aa4a8b4e2..9923bed75 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/internal/tracing/ITraceIds.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/interfaces/tracing/ITraceIds.java
@@ -7,7 +7,7 @@
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.tcf.te.ui.terminals.internal.tracing;
+package org.eclipse.tcf.te.ui.terminals.interfaces.tracing;
/**
* Core plug-in trace slot identifiers.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/streams/OutputStreamMonitor.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/streams/OutputStreamMonitor.java
index 2f383e339..609cf2b80 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/streams/OutputStreamMonitor.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/streams/OutputStreamMonitor.java
@@ -22,7 +22,7 @@ import org.eclipse.osgi.util.NLS;
import org.eclipse.tcf.te.runtime.interfaces.IDisposable;
import org.eclipse.tcf.te.runtime.services.interfaces.constants.ILineSeparatorConstants;
import org.eclipse.tcf.te.ui.terminals.activator.UIPlugin;
-import org.eclipse.tcf.te.ui.terminals.internal.tracing.ITraceIds;
+import org.eclipse.tcf.te.ui.terminals.interfaces.tracing.ITraceIds;
import org.eclipse.tcf.te.ui.terminals.nls.Messages;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/.options b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/.options
new file mode 100644
index 000000000..f4eca9121
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/.options
@@ -0,0 +1,3 @@
+org.eclipse.tcf.te.ui.views/debugmode = 0
+
+org.eclipse.tcf.te.ui.views/trace/editor/eventListener = false
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/activator/UIPlugin.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/activator/UIPlugin.java
index 4bd2226b5..ed2fa9893 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/activator/UIPlugin.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/activator/UIPlugin.java
@@ -14,6 +14,7 @@ import java.net.URL;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
+import org.eclipse.tcf.te.runtime.tracing.TraceHandler;
import org.eclipse.tcf.te.ui.views.interfaces.ImageConsts;
import org.eclipse.tcf.te.ui.views.listeners.WorkbenchWindowListener;
import org.eclipse.ui.IWindowListener;
@@ -26,9 +27,10 @@ import org.osgi.framework.BundleContext;
* The activator class controls the plug-in life cycle
*/
public class UIPlugin extends AbstractUIPlugin {
-
// The shared instance
private static UIPlugin plugin;
+ // The trace handler instance
+ private static TraceHandler traceHandler;
// The global window listener instance
private IWindowListener windowListener;
@@ -58,6 +60,18 @@ public class UIPlugin extends AbstractUIPlugin {
return null;
}
+ /**
+ * Returns the bundles trace handler.
+ *
+ * @return The bundles trace handler.
+ */
+ public static TraceHandler getTraceHandler() {
+ if (traceHandler == null) {
+ traceHandler = new TraceHandler(getUniqueIdentifier());
+ }
+ return traceHandler;
+ }
+
/* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
*/
@@ -83,6 +97,7 @@ public class UIPlugin extends AbstractUIPlugin {
}
plugin = null;
+ traceHandler = null;
super.stop(context);
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/interfaces/tracing/ITraceIds.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/interfaces/tracing/ITraceIds.java
new file mode 100644
index 000000000..4d4de5b8a
--- /dev/null
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/interfaces/tracing/ITraceIds.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.views.interfaces.tracing;
+
+/**
+ * TCF core plug-in trace slot identifiers.
+ */
+public interface ITraceIds {
+
+ /**
+ * If activated, tracing information about the editor event listeners is printed out.
+ */
+ public static String TRACE_EDITOR_EVENT_LISTENER = "trace/editor/eventListener"; //$NON-NLS-1$
+}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/Editor.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/Editor.java
index 9a6623955..8b4bf9622 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/Editor.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/Editor.java
@@ -9,6 +9,11 @@
*******************************************************************************/
package org.eclipse.tcf.te.ui.views.internal.editor;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.tcf.te.ui.views.extensions.EditorPageBinding;
@@ -51,44 +56,7 @@ public class Editor extends FormEditor implements IPersistableEditor, ITabbedPro
// Get all applicable editor page bindings
EditorPageBinding[] bindings = EditorPageBindingExtensionPointManager.getInstance().getApplicableEditorPageBindings(input);
for (EditorPageBinding binding : bindings) {
- String pageId = binding.getPageId();
- if (pageId != null) {
- // Get the corresponding editor page instance
- IEditorPage page = EditorPageExtensionPointManager.getInstance().getEditorPage(pageId, true);
- if (page != null) {
- try {
- // Associate this editor with the page instance.
- // This is typically done in the constructor, but we are
- // utilizing a default constructor to instantiate the page.
- page.initialize(this);
-
- // Read in the "insertBefore" and "insertAfter" properties of the binding
- String insertBefore = binding.getInsertBefore().trim();
- String insertAfter = binding.getInsertAfter().trim();
-
- // insertBefore will eclipse insertAfter is both is specified.
- if (!"".equals(insertBefore)) { //$NON-NLS-1$
- // If it is "first", we insert the page at index 0
- if ("first".equalsIgnoreCase(insertBefore)) { //$NON-NLS-1$
- addPage(0, page);
- } else {
- // Find the index of the page we shall insert this page before
- int index = getIndexOf(insertBefore);
- if (index != -1) addPage(index, page);
- else addPage(page);
- }
- } else if (!"".equals(insertAfter) && !"last".equalsIgnoreCase(insertAfter)) { //$NON-NLS-1$ //$NON-NLS-2$
- // Find the index of the page we shall insert this page after
- int index = getIndexOf(insertAfter);
- if (index != -1 && index + 1 < pages.size()) addPage(index + 1, page);
- else addPage(page);
- } else {
- // And add the page to the editor as last page.
- addPage(page);
- }
- } catch (PartInitException e) { /* ignored on purpose */ }
- }
- }
+ processPageBinding(binding);
}
if (mementoToRestore != null) {
@@ -104,6 +72,95 @@ public class Editor extends FormEditor implements IPersistableEditor, ITabbedPro
}
/**
+ * Update the editor page list. Pages which are not longer valid
+ * will be removed and pages now being valid gets added.
+ */
+ public void updatePageList() {
+ // Get the editor input object
+ IEditorInput input = getEditorInput();
+ // Get all applicable editor page bindings
+ List<EditorPageBinding> bindings = new ArrayList<EditorPageBinding>(Arrays.asList(EditorPageBindingExtensionPointManager.getInstance().getApplicableEditorPageBindings(input)));
+ // Get a copy of the currently added pages
+ List<Object> oldPages = new ArrayList<Object>(Arrays.asList(pages.toArray()));
+ // Loop through the old pages and determine if the page is still applicable
+ Iterator<Object> iterator = oldPages.iterator();
+ while (iterator.hasNext()) {
+ Object element = iterator.next();
+ // Skip over pages not being a form page.
+ if (!(element instanceof IFormPage)) continue;
+ IFormPage page = (IFormPage)element;
+ // Find the corresponding page binding
+ EditorPageBinding binding = null;
+ for (EditorPageBinding candidate : bindings) {
+ if (candidate.getPageId().equals(page.getId())) {
+ binding = candidate;
+ break;
+ }
+ }
+ if (binding != null) {
+ // Found binding -> page is still applicable
+ bindings.remove(binding);
+ } else {
+ // No binding found -> page is not longer applicable
+ removePage(pages.indexOf(page));
+ }
+ }
+ // If the are remaining bindings left, this are new pages.
+ // --> Process them now
+ for (EditorPageBinding binding : bindings) {
+ processPageBinding(binding);
+ }
+ }
+
+ /**
+ * Process the given editor page binding.
+ *
+ * @param binding The editor page binding. Must not be <code>null</code>.
+ */
+ protected void processPageBinding(EditorPageBinding binding) {
+ Assert.isNotNull(binding);
+
+ String pageId = binding.getPageId();
+ if (pageId != null) {
+ // Get the corresponding editor page instance
+ IEditorPage page = EditorPageExtensionPointManager.getInstance().getEditorPage(pageId, true);
+ if (page != null) {
+ try {
+ // Associate this editor with the page instance.
+ // This is typically done in the constructor, but we are
+ // utilizing a default constructor to instantiate the page.
+ page.initialize(this);
+
+ // Read in the "insertBefore" and "insertAfter" properties of the binding
+ String insertBefore = binding.getInsertBefore().trim();
+ String insertAfter = binding.getInsertAfter().trim();
+
+ // insertBefore will eclipse insertAfter is both is specified.
+ if (!"".equals(insertBefore)) { //$NON-NLS-1$
+ // If it is "first", we insert the page at index 0
+ if ("first".equalsIgnoreCase(insertBefore)) { //$NON-NLS-1$
+ addPage(0, page);
+ } else {
+ // Find the index of the page we shall insert this page before
+ int index = getIndexOf(insertBefore);
+ if (index != -1) addPage(index, page);
+ else addPage(page);
+ }
+ } else if (!"".equals(insertAfter) && !"last".equalsIgnoreCase(insertAfter)) { //$NON-NLS-1$ //$NON-NLS-2$
+ // Find the index of the page we shall insert this page after
+ int index = getIndexOf(insertAfter);
+ if (index != -1 && index + 1 < pages.size()) addPage(index + 1, page);
+ else addPage(page);
+ } else {
+ // And add the page to the editor as last page.
+ addPage(page);
+ }
+ } catch (PartInitException e) { /* ignored on purpose */ }
+ }
+ }
+ }
+
+ /**
* Returns the index of the page with the given id.
*
* @param pageId The page id. Must not be <code>null</code>.
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/EditorEventListener.java b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/EditorEventListener.java
index 970f4b578..9fa83f8e4 100644
--- a/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/EditorEventListener.java
+++ b/target_explorer/plugins/org.eclipse.tcf.te.ui.views/src/org/eclipse/tcf/te/ui/views/internal/editor/EditorEventListener.java
@@ -12,11 +12,14 @@ package org.eclipse.tcf.te.ui.views.internal.editor;
import java.util.EventObject;
import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.tcf.te.runtime.events.ChangeEvent;
import org.eclipse.tcf.te.runtime.events.EventManager;
import org.eclipse.tcf.te.runtime.interfaces.IDisposable;
import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
import org.eclipse.tcf.te.ui.events.AbstractEventListener;
+import org.eclipse.tcf.te.ui.views.activator.UIPlugin;
+import org.eclipse.tcf.te.ui.views.interfaces.tracing.ITraceIds;
import org.eclipse.ui.forms.editor.IFormPage;
/**
@@ -58,21 +61,46 @@ public class EditorEventListener extends AbstractEventListener implements IDispo
*/
@Override
public void eventFired(EventObject event) {
+ // Ignore everything not being a change event
+ if (!(event instanceof ChangeEvent)) return;
+
+ ChangeEvent changeEvent = (ChangeEvent)event;
+
+ if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_EDITOR_EVENT_LISTENER)) {
+ UIPlugin.getTraceHandler().trace("Entered eventFired(...). eventId='" + changeEvent.getEventId() + "'" //$NON-NLS-1$ //$NON-NLS-2$
+ + ", oldValue='" + changeEvent.getOldValue() + "'" //$NON-NLS-1$ //$NON-NLS-2$
+ + ", newValue='" + changeEvent.getNewValue() + "'", //$NON-NLS-1$ //$NON-NLS-2$
+ 0, ITraceIds.TRACE_EDITOR_EVENT_LISTENER,
+ IStatus.INFO, this);
+ }
+
// Get the event source
Object source = event.getSource();
// Double check with the parent editors input object
Object node = editor.getEditorInput() != null ? editor.getEditorInput().getAdapter(Object.class) : null;
// If the editor input cannot be determined or it does not match the event source
// --> return immediately
- if (node == null || !node.equals(source)) return;
+ if (node == null || !node.equals(source)) {
+ if (UIPlugin.getTraceHandler().isSlotEnabled(0, ITraceIds.TRACE_EDITOR_EVENT_LISTENER)) {
+ UIPlugin.getTraceHandler().trace("Dropping out of eventFired(...). Event source does not match editor input.", //$NON-NLS-1$
+ 0, ITraceIds.TRACE_EDITOR_EVENT_LISTENER,
+ IStatus.WARNING, this);
+ }
- // Update the active page content by calling IFormPage#setActive(boolean)
- Object page = editor.getSelectedPage();
- if (page instanceof IFormPage) {
- ((IFormPage)page).setActive(((IFormPage)page).isActive());
+ return;
}
- // Update the editor part name
- editor.updatePartName();
+ if ("editor.refreshTab".equals(changeEvent.getEventId())) { //$NON-NLS-1$
+ editor.updatePageList();
+ } else {
+ // Update the active page content by calling IFormPage#setActive(boolean)
+ Object page = editor.getSelectedPage();
+ if (page instanceof IFormPage) {
+ ((IFormPage)page).setActive(((IFormPage)page).isActive());
+ }
+
+ // Update the editor part name
+ editor.updatePartName();
+ }
}
}

Back to the top