diff options
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();
+ }
}
}
|