diff --git a/org.eclipse.core.externaltools/pom.xml b/org.eclipse.core.externaltools/pom.xml index 02caa34cfebc9f8400102042433a2df56a009d95..1dcab250a89e226ffdd9f9612ab21d17ed5de3e1 100644 --- a/org.eclipse.core.externaltools/pom.xml +++ b/org.eclipse.core.externaltools/pom.xml @@ -14,7 +14,7 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.core</groupId> <artifactId>org.eclipse.core.externaltools</artifactId> diff --git a/org.eclipse.core.variables/pom.xml b/org.eclipse.core.variables/pom.xml index 7fbd58886b7c72aac190745af9685de7298effd0..397d8f91651f4b055d8063060332ae9e8c1bf224 100644 --- a/org.eclipse.core.variables/pom.xml +++ b/org.eclipse.core.variables/pom.xml @@ -14,7 +14,7 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.core</groupId> <artifactId>org.eclipse.core.variables</artifactId> diff --git a/org.eclipse.debug.core/META-INF/MANIFEST.MF b/org.eclipse.debug.core/META-INF/MANIFEST.MF index 9e15c244fa2462638f61b769e4fbf6ae3e33afda..480148cba9aa4278d06e9c66b0acd750446e4ba2 100644 --- a/org.eclipse.debug.core/META-INF/MANIFEST.MF +++ b/org.eclipse.debug.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.debug.core; singleton:=true -Bundle-Version: 3.15.100.qualifier +Bundle-Version: 3.16.0.qualifier Bundle-ClassPath: . Bundle-Activator: org.eclipse.debug.core.DebugPlugin Bundle-Vendor: %providerName @@ -12,7 +12,7 @@ Export-Package: org.eclipse.debug.core, org.eclipse.debug.core.model, org.eclipse.debug.core.sourcelookup, org.eclipse.debug.core.sourcelookup.containers, - org.eclipse.debug.internal.core;x-friends:="org.eclipse.debug.ui,org.eclipse.debug.tests,org.eclipse.debug.examples.mixedmode,org.eclipse.jdt.launching", + org.eclipse.debug.internal.core;x-friends:="org.eclipse.debug.ui,org.eclipse.debug.tests,org.eclipse.debug.examples.mixedmode,org.eclipse.jdt.launching,org.eclipse.ui.console", org.eclipse.debug.internal.core.commands;x-friends:="org.eclipse.debug.ui", org.eclipse.debug.internal.core.groups;x-friends:="org.eclipse.debug.ui", org.eclipse.debug.internal.core.groups.observer;x-internal:=true, diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/IBinaryStreamListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBinaryStreamListener.java new file mode 100644 index 0000000000000000000000000000000000000000..b21697abe5496ee6a5da2cdca07d3a0fe425e83e --- /dev/null +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/IBinaryStreamListener.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.core; + +import org.eclipse.debug.core.model.IBinaryStreamMonitor; + +/** + * A stream listener is notified of changes to a binary stream monitor. + * <p> + * Clients may implement this interface. + * </p> + * + * @see IBinaryStreamMonitor + * @see IStreamListener + * @since 3.16 + */ +public interface IBinaryStreamListener { + + /** + * Notifies this listener that data has been appended to the given stream + * monitor. + * + * @param data the content appended; not <code>null</code> + * @param monitor the stream monitor to which content was appended + */ + void streamAppended(byte[] data, IBinaryStreamMonitor monitor); +} diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamMonitor.java new file mode 100644 index 0000000000000000000000000000000000000000..1fe05444b71428bd282c380b0a101fc92fbfcd25 --- /dev/null +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamMonitor.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.core.model; + +import org.eclipse.debug.core.IBinaryStreamListener; + +/** + * A variant of {@link IStreamMonitor} which does not touch the received content + * and pass it as bytes instead of strings. + * <p> + * A stream monitor manages the contents of the stream a process is writing to, + * and notifies registered listeners of changes in the stream. + * </p> + * <p> + * Clients may implement this interface. Generally, a client that provides an + * implementation of the {@link IBinaryStreamsProxy} interface must also provide + * an implementation of this interface. + * </p> + * + * @see org.eclipse.debug.core.model.IStreamsProxy + * @see org.eclipse.debug.core.model.IFlushableStreamMonitor + * @since 3.16 + */ +public interface IBinaryStreamMonitor extends IFlushableStreamMonitor { + /** + * Adds the given listener to this stream monitor's registered listeners. + * Has no effect if an identical listener is already registered. + * + * @param listener the listener to add + */ + void addBinaryListener(IBinaryStreamListener listener); + + /** + * Returns the entire current contents of the stream. An empty array is + * returned if the stream is empty. + * <p> + * Note: the current content is influenced by the buffering mechanism. + * </p> + * + * @return the stream contents as array + * @see #isBuffered() + * @see #flushContents() + */ + byte[] getData(); + + /** + * Removes the given listener from this stream monitor's registered listeners. + * Has no effect if the listener is not already registered. + * + * @param listener the listener to remove + */ + void removeBinaryListener(IBinaryStreamListener listener); +} diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamsProxy.java new file mode 100644 index 0000000000000000000000000000000000000000..d355e26c73a45bf8069ad9701a5abcffb5d47794 --- /dev/null +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBinaryStreamsProxy.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.core.model; + +import java.io.IOException; + +/** + * A variant of {@link IStreamsProxy} which does not touch the proxied content + * and pass it as bytes instead of strings. + * <p> + * A streams proxy acts as proxy between the streams of a process and interested + * clients. This abstraction allows implementations of <code>IProcess</code> to + * handle I/O related to the standard input, output, and error streams + * associated with a process. + * </p> + * <p> + * Clients implementing the <code>IProcess</code> interface for a process which + * produce or consumes binary content should consider to implement this + * interface instead of just {@link IStreamsProxy}. + * </p> + * + * @see IProcess + * @see IStreamsProxy + * @since 3.16 + */ +public interface IBinaryStreamsProxy extends IStreamsProxy2 { + /** + * Returns a monitor for the error stream of this proxy's process, or + * <code>null</code> if not supported. + * <p> + * The monitor is connected to the error stream of the associated process. + * </p> + * <p> + * In contrast to {@link #getErrorStreamMonitor()} which will decode the + * stream content to strings, the {@link IBinaryStreamMonitor} will provide + * the raw stream data. + * </p> + * + * @return an error stream monitor, or <code>null</code> if none + */ + IBinaryStreamMonitor getBinaryErrorStreamMonitor(); + + /** + * Returns a monitor for the output stream of this proxy's process, or + * <code>null</code> if not supported. + * <p> + * The monitor is connected to the output stream of the associated process. + * </p> + * <p> + * In contrast to {@link #getOutputStreamMonitor()} which will decode the + * stream content to strings, the {@link IBinaryStreamMonitor} will provide + * the raw stream data. + * </p> + * + * @return an output stream monitor, or <code>null</code> if none + */ + IBinaryStreamMonitor getBinaryOutputStreamMonitor(); + + /** + * Writes the given data to the output stream connected to the standard + * input stream of this proxy's process. + * + * @param data the data to be written + * @exception IOException when an error occurs writing to the underlying + * <code>OutputStream</code>. + */ + default void write(byte[] data) throws IOException { + write(data, 0, data.length); + } + + /** + * Writes the given data to the output stream connected to the standard + * input stream of this proxy's process. + * + * @param data the data to be written + * @param offset start offset in the data + * @param length number of bytes to write + * @exception IOException when an error occurs writing to the underlying + * <code>OutputStream</code>. + */ + void write(byte[] data, int offset, int length) throws IOException; +} diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java index a0e5f832e20a664abb76997851be08ce80c92e4e..5272b58f92ebfd51361417939733a42065c98835 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IBreakpoint.java @@ -43,12 +43,12 @@ import org.eclipse.debug.core.DebugPlugin; * markerType="com.example.BreakpointMarker"> * </breakpoint> * </extension> - * <extension point="org.eclipse.core.resources.markers"> - * <marker + * <extension + * point="org.eclipse.core.resources.markers" * id="com.example.BreakpointMarker" - * super type="org.eclipse.debug.core.breakpointMarker" - * attribute name ="exampleAttribute"> - * </marker> + * name="Example Breakpoint"> + * <super type="org.eclipse.debug.core.breakpointMarker"/> + * <attribute name="exampleAttribute"/> * </extension> * </pre> * <p> diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java index e0c309ac5b0f67c32ea439540c55228a68cc33b1..651fbf5aea90d786fef352e4388cbaf2e524c307 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IFlushableStreamMonitor.java @@ -22,6 +22,8 @@ package org.eclipse.debug.core.model; * Clients may implement this interface. * </p> * @since 2.1 + * @see IStreamMonitor + * @see IBinaryStreamMonitor */ public interface IFlushableStreamMonitor extends IStreamMonitor { diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java index aa26d7acbdad86f71a508b72d87ba3fee3503216..8a5677e375243e7ce123bec9314d8ee48cd7f8b1 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamMonitor.java @@ -27,6 +27,7 @@ import org.eclipse.debug.core.IStreamListener; * </p> * @see org.eclipse.debug.core.model.IStreamsProxy * @see org.eclipse.debug.core.model.IFlushableStreamMonitor + * @see org.eclipse.debug.core.model.IBinaryStreamMonitor */ public interface IStreamMonitor { /** diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java index 83e5755b25a1d5f841c2a5cbc834d55629842d33..72d00a2fb9e22a99c8a4b64a24f1ba946551fb87 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/IStreamsProxy.java @@ -27,6 +27,7 @@ import java.io.IOException; * provide an implementation of this interface. * </p> * @see IProcess + * @see IBinaryStreamsProxy */ public interface IStreamsProxy { /** diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java index db02ab6494fce7a985fd8efcaf7f651599649e26..6d8539d66de607acad99300694644dcaeb1d83f2 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/BreakpointManager.java @@ -763,7 +763,7 @@ public class BreakpointManager implements IBreakpointManager, IResourceChangeLis } }; getWorkspace().run(runnable, null, 0, null); - addBreakpoints(fAdded.toArray(new IBreakpoint[fAdded.size()]), false); + addBreakpoints(fAdded.toArray(new IBreakpoint[fAdded.size()]), true); } catch (CoreException e) { DebugPlugin.log(e); } diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java index ef77a06102c9cce054f77742370d1b1d77bef962..7ed21a6eaf840a2ac370f6dd2425e09ab19f1dcc 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2019 IBM Corporation and others. + * Copyright (c) 2000, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -10,6 +10,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Paul Pazderski - Bug 558463: add handling of raw stream content instead of strings *******************************************************************************/ package org.eclipse.debug.internal.core; @@ -22,11 +23,10 @@ import java.util.Vector; import org.eclipse.debug.core.DebugPlugin; /** - * Writes to the input stream of a system process, - * queueing output if the stream is blocked. + * Writes to the input stream of a system process, queuing output if the stream + * is blocked. * - * The input stream monitor writes to system in via - * an output stream. + * The input stream monitor writes to system in via an output stream. */ public class InputStreamMonitor { @@ -34,14 +34,17 @@ public class InputStreamMonitor { * The stream which is being written to (connected to system in). */ private OutputStream fStream; + /** * The queue of output. */ - private Vector<String> fQueue; + private Vector<byte[]> fQueue; + /** * The thread which writes to the stream. */ private Thread fThread; + /** * A lock for ensuring that writes to the queue are contiguous */ @@ -101,8 +104,25 @@ public class InputStreamMonitor { * @param text text to append */ public void write(String text) { - synchronized(fLock) { - fQueue.add(text); + synchronized (fLock) { + fQueue.add(fCharset == null ? text.getBytes() : text.getBytes(fCharset)); + fLock.notifyAll(); + } + } + + /** + * Appends the given binary data to the stream, or queues the text to be + * written at a later time if the stream is blocked. + * + * @param data data to append; not <code>null</code> + * @param offset start offset in data + * @param length number of bytes in data + */ + public void write(byte[] data, int offset, int length) { + synchronized (fLock) { + byte[] copy = new byte[length]; + System.arraycopy(data, offset, copy, 0, length); + fQueue.add(copy); fLock.notifyAll(); } } @@ -151,14 +171,10 @@ public class InputStreamMonitor { */ protected void writeNext() { while (!fQueue.isEmpty() && !fClosed) { - String text = fQueue.firstElement(); + byte[] data = fQueue.firstElement(); fQueue.removeElementAt(0); try { - if (fCharset != null) { - fStream.write(text.getBytes(fCharset)); - } else { - fStream.write(text.getBytes()); - } + fStream.write(data); fStream.flush(); } catch (IOException e) { DebugPlugin.log(e); @@ -180,7 +196,8 @@ public class InputStreamMonitor { * Closes the output stream attached to the standard input stream of this * monitor's process. * - * @exception IOException if an exception occurs closing the input stream + * @exception IOException if an exception occurs closing the input stream or + * stream is already closed */ public void closeInputStream() throws IOException { if (!fClosed) { diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java index 1a193b812e24bf57e4107e5f0f2677587c7caec5..cf60a2d752ddd2466e7742a965a3688c3245a30e 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java @@ -987,7 +987,7 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig /* * Get Preferred delegate with all fallbacks - * + * */ public ILaunchConfigurationDelegate getPreferredLaunchDelegate(String mode) throws CoreException { Set<String> modes = getModes(); diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java index 9b4d8dc9f48bd8e87b1ba3245b4dae0e5d7fff20..9f460fdc15af1de8e2f2ea574f366ad00e7d22b0 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java @@ -896,7 +896,7 @@ public class LaunchConfigurationInfo { String strAttr1 = null; String strAttr2 = null; if (fgIsSun14x) { - if(attr2 instanceof String & attr1 instanceof String) { + if(attr2 instanceof String && attr1 instanceof String) { // this is a hack for bug 110215, on SUN 1.4.x, \r // is stripped off when the stream is written to the // DOM diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java index 92676174825f92bdf9ae572eebee68bdcb823b3a..ad5ac42457384d0fcd23847e355f94e505dfc906 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java @@ -1630,7 +1630,7 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe LaunchDelegate delegate = getLaunchDelegateExtension(typeid, delegateid, modeset); if (delegate != null) { //take type id, modeset, delegate and create entry - if(!IInternalDebugCoreConstants.EMPTY_STRING.equals(typeid) & modeset != null) { + if(!IInternalDebugCoreConstants.EMPTY_STRING.equals(typeid) && modeset != null) { fPreferredDelegates.add(new PreferredDelegate(delegate, typeid, modeset)); } } diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java index 0bbcdf62ec7539e52491ee7d1f3b55ce2178bfe9..494a9c2970a0d2abfe1cbc308dd9232aeabf7a35 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/NullStreamsProxy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2013 IBM Corporation and others. + * Copyright (c) 2000, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -16,11 +16,13 @@ package org.eclipse.debug.internal.core; import java.io.IOException; import java.io.InputStream; +import org.eclipse.debug.core.IBinaryStreamListener; import org.eclipse.debug.core.IStreamListener; +import org.eclipse.debug.core.model.IBinaryStreamMonitor; +import org.eclipse.debug.core.model.IBinaryStreamsProxy; import org.eclipse.debug.core.model.IStreamMonitor; -import org.eclipse.debug.core.model.IStreamsProxy2; -public class NullStreamsProxy implements IStreamsProxy2 { +public class NullStreamsProxy implements IBinaryStreamsProxy { private NullStreamMonitor outputStreamMonitor; private NullStreamMonitor errorStreamMonitor; @@ -48,7 +50,21 @@ public class NullStreamsProxy implements IStreamsProxy2 { public void write(String input) throws IOException { } - private class NullStreamMonitor implements IStreamMonitor { + @Override + public IBinaryStreamMonitor getBinaryErrorStreamMonitor() { + return errorStreamMonitor; + } + + @Override + public IBinaryStreamMonitor getBinaryOutputStreamMonitor() { + return outputStreamMonitor; + } + + @Override + public void write(byte[] data, int offset, int length) throws IOException { + } + + private class NullStreamMonitor implements IBinaryStreamMonitor { private InputStream fStream; public NullStreamMonitor(InputStream stream) { @@ -80,8 +96,34 @@ public class NullStreamsProxy implements IStreamsProxy2 { return ""; //$NON-NLS-1$ } + @Override + public void flushContents() { + } + + @Override + public void setBuffered(boolean buffer) { + } + + @Override + public boolean isBuffered() { + return false; + } + @Override public void removeListener(IStreamListener listener) { } + + @Override + public void addBinaryListener(IBinaryStreamListener listener) { + } + + @Override + public byte[] getData() { + return new byte[0]; + } + + @Override + public void removeBinaryListener(IBinaryStreamListener listener) { + } } } diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java index 4c64c2654981f729f8d049d88718cff20c50b275..916858aab7c2c6d44cdfd4952ce05acb023461ed 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2019 IBM Corporation and others. + * Copyright (c) 2000, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -11,13 +11,14 @@ * Contributors: * IBM Corporation - initial API and implementation * Paul Pazderski - Bug 545769: fixed rare UTF-8 character corruption bug + * Paul Pazderski - Bug 558463: add handling of raw stream content instead of strings *******************************************************************************/ package org.eclipse.debug.internal.core; import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.concurrent.atomic.AtomicBoolean; @@ -25,58 +26,69 @@ import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.IBinaryStreamListener; import org.eclipse.debug.core.IStreamListener; -import org.eclipse.debug.core.model.IFlushableStreamMonitor; +import org.eclipse.debug.core.model.IBinaryStreamMonitor; /** - * Monitors the output stream of a system process and notifies - * listeners of additions to the stream. - * - * The output stream monitor reads system out (or err) via - * and input stream. + * Monitors the output stream of a system process and notifies listeners of + * additions to the stream. + * <p> + * The output stream monitor reads system out (or err) via and input stream. */ -public class OutputStreamMonitor implements IFlushableStreamMonitor { +public class OutputStreamMonitor implements IBinaryStreamMonitor { + /** + * The size of the read buffer. + */ + private static final int BUFFER_SIZE = 8192; + /** * The stream being monitored (connected system out or err). */ private InputStream fStream; /** - * A collection of listeners + * A collection of listeners interested in decoded content. */ private ListenerList<IStreamListener> fListeners = new ListenerList<>(); /** - * Whether content is being buffered + * A collection of listeners interested in the raw content. */ - private boolean fBuffered = true; + private ListenerList<IBinaryStreamListener> fBinaryListeners = new ListenerList<>(); /** - * The local copy of the stream contents + * The buffered stream content since last flush. Value of <code>null</code> + * indicates disabled buffering. + * + * @see #isBuffered() */ - private StringBuilder fContents; + private ByteArrayOutputStream fContents; /** - * The thread which reads from the stream + * Decoder used for the buffered content. This is required to keep the state + * of an incomplete character. */ - private Thread fThread; + private StreamDecoder fBufferedDecoder; + private String fCachedDecodedContents; /** - * The size of the read buffer + * The thread which reads from the stream */ - private static final int BUFFER_SIZE= 8192; + private Thread fThread; /** - * Whether or not this monitor has been killed. - * When the monitor is killed, it stops reading - * from the stream immediately. + * Whether or not this monitor has been killed. When the monitor is killed, + * it stops reading from the stream immediately. */ - private boolean fKilled= false; + private boolean fKilled = false; private long lastSleep; private Charset fCharset; + private StreamDecoder fDecoder; + private final AtomicBoolean fDone; /** @@ -84,13 +96,15 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor { * out or err). * * @param stream input stream to read from - * @param charset stream charset or <code>null</code> for system default + * @param charset stream charset or <code>null</code> for system default; + * unused if only the binary interface is used */ public OutputStreamMonitor(InputStream stream, Charset charset) { fStream = new BufferedInputStream(stream, 8192); fCharset = charset; - fContents= new StringBuilder(); + fDecoder = new StreamDecoder(charset == null ? Charset.defaultCharset() : charset); fDone = new AtomicBoolean(false); + setBuffered(true); } /** @@ -112,35 +126,97 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor { fListeners.add(listener); } + @Override + public synchronized void addBinaryListener(IBinaryStreamListener listener) { + fBinaryListeners.add(listener); + } + /** - * Causes the monitor to close all - * communications between it and the + * Causes the monitor to close all communications between it and the * underlying stream by waiting for the thread to terminate. */ protected void close() { if (fThread != null) { - Thread thread= fThread; - fThread= null; + Thread thread = fThread; + fThread = null; try { thread.join(); } catch (InterruptedException ie) { } fListeners = new ListenerList<>(); + fBinaryListeners = new ListenerList<>(); } } /** - * Notifies the listeners that text has - * been appended to the stream. - * @param text the text that was appended to the stream + * Notifies the listeners that content has been appended to the stream. Will + * notify both, binary and text listeners. + * + * @param data that has been appended; not <code>null</code> + * @param offset start of valid data + * @param length number of valid bytes */ - private void fireStreamAppended(String text) { - getNotifier().notifyAppend(text); + private void fireStreamAppended(final byte[] data, int offset, int length) { + if (!fListeners.isEmpty()) { + StringBuilder sb = new StringBuilder(); + fDecoder.decode(sb, data, offset, length); + final String text = sb.toString(); + for (final IStreamListener listener : fListeners) { + SafeRunner.run(new ISafeRunnable() { + @Override + public void run() throws Exception { + listener.streamAppended(text, OutputStreamMonitor.this); + } + + @Override + public void handleException(Throwable exception) { + DebugPlugin.log(exception); + } + }); + } + } + if (!fBinaryListeners.isEmpty()) { + final byte[] validData; + if (offset > 0 || length < data.length) { + validData = new byte[length]; + System.arraycopy(data, offset, validData, 0, length); + } else { + validData = data; + } + for (final IBinaryStreamListener listener : fBinaryListeners) { + SafeRunner.run(new ISafeRunnable() { + @Override + public void run() throws Exception { + listener.streamAppended(validData, OutputStreamMonitor.this); + } + + @Override + public void handleException(Throwable exception) { + DebugPlugin.log(exception); + } + }); + } + } } @Override public synchronized String getContents() { - return fContents.toString(); + if (!isBuffered()) { + return ""; //$NON-NLS-1$ + } + if (fCachedDecodedContents != null) { + return fCachedDecodedContents; + } + StringBuilder sb = new StringBuilder(); + byte[] data = getData(); + fBufferedDecoder.decode(sb, data, 0, data.length); + fCachedDecodedContents = sb.toString(); + return fCachedDecodedContents; + } + + @Override + public synchronized byte[] getData() { + return isBuffered() ? fContents.toByteArray() : new byte[0]; } private void read() { @@ -154,30 +230,29 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor { /** * Continually reads from the stream. * <p> - * This method, along with the <code>startReading</code> - * method is used to allow <code>OutputStreamMonitor</code> - * to implement <code>Runnable</code> without publicly - * exposing a <code>run</code> method. + * This method, along with the {@link #startMonitoring()} method is used to + * allow {@link OutputStreamMonitor} to implement {@link Runnable} without + * publicly exposing a {@link Runnable#run()} method. */ private void internalRead() { lastSleep = System.currentTimeMillis(); long currentTime = lastSleep; - char[] chars = new char[BUFFER_SIZE]; + byte[] buffer = new byte[BUFFER_SIZE]; int read = 0; - try (InputStreamReader reader = (fCharset == null ? new InputStreamReader(fStream) : new InputStreamReader(fStream, fCharset))) { + try { while (read >= 0) { try { if (fKilled) { break; } - read = reader.read(chars); + read = fStream.read(buffer); if (read > 0) { - String text = new String(chars, 0, read); synchronized (this) { if (isBuffered()) { - fContents.append(text); + fCachedDecodedContents = null; + fContents.write(buffer, 0, read); } - fireStreamAppended(text); + fireStreamAppended(buffer, 0, read); } } } catch (IOException ioe) { @@ -204,13 +279,17 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor { } } } - } catch (IOException e) { - DebugPlugin.log(e); + } finally { + try { + fStream.close(); + } catch (IOException e) { + DebugPlugin.log(e); + } } } protected void kill() { - fKilled= true; + fKilled = true; } @Override @@ -218,6 +297,11 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor { fListeners.remove(listener); } + @Override + public synchronized void removeBinaryListener(IBinaryStreamListener listener) { + fBinaryListeners.remove(listener); + } + /** * Starts a thread which reads from the stream */ @@ -233,57 +317,37 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor { @Override public synchronized void setBuffered(boolean buffer) { - fBuffered = buffer; + if (isBuffered() != buffer) { + fCachedDecodedContents = null; + if (buffer) { + fContents = new ByteArrayOutputStream(); + fBufferedDecoder = new StreamDecoder(fCharset == null ? Charset.defaultCharset() : fCharset); + } else { + fContents = null; + fBufferedDecoder = null; + } + } } @Override public synchronized void flushContents() { - fContents.setLength(0); + if (isBuffered()) { + fCachedDecodedContents = null; + fContents.reset(); + } } @Override public synchronized boolean isBuffered() { - return fBuffered; - } - - private ContentNotifier getNotifier() { - return new ContentNotifier(); + return fContents != null; } /** * @return {@code true} if reading the underlying stream is done. - * {@code false} if reading the stream has not started or is not done. + * {@code false} if reading the stream has not started or is not + * done. */ public boolean isReadingDone() { return fDone.get(); } - - class ContentNotifier implements ISafeRunnable { - - private IStreamListener fListener; - private String fText; - - @Override - public void handleException(Throwable exception) { - DebugPlugin.log(exception); - } - - @Override - public void run() throws Exception { - fListener.streamAppended(fText, OutputStreamMonitor.this); - } - - public void notifyAppend(String text) { - if (text == null) { - return; - } - fText = text; - for (IStreamListener iStreamListener : fListeners) { - fListener = iStreamListener; - SafeRunner.run(this); - } - fListener = null; - fText = null; - } - } } diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamDecoder.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamDecoder.java new file mode 100644 index 0000000000000000000000000000000000000000..7cb15a73615048b29381d77b7b578cb832b2b29a --- /dev/null +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamDecoder.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2017 Andreas Loth and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Andreas Loth - initial API and implementation + *******************************************************************************/ + +package org.eclipse.debug.internal.core; + +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CoderResult; +import java.nio.charset.CodingErrorAction; + +/** + * Wraps CharsetDecoder to decode a byte stream statefully to characters. + * + * @since 3.7 org.eclipse.ui.console + */ +public class StreamDecoder { + // For more context see https://bugs.eclipse.org/bugs/show_bug.cgi?id=507664 + + static private final int BUFFER_SIZE = 4096; + + private final CharsetDecoder decoder; + private final ByteBuffer inputBuffer; + private final CharBuffer outputBuffer; + private boolean finished; + + public StreamDecoder(Charset charset) { + this.decoder = charset.newDecoder(); + this.decoder.onMalformedInput(CodingErrorAction.REPLACE); + this.decoder.onUnmappableCharacter(CodingErrorAction.REPLACE); + this.inputBuffer = ByteBuffer.allocate(StreamDecoder.BUFFER_SIZE); + this.inputBuffer.flip(); + this.outputBuffer = CharBuffer.allocate(StreamDecoder.BUFFER_SIZE); + this.finished = false; + } + + private void consume(StringBuilder consumer) { + this.outputBuffer.flip(); + consumer.append(this.outputBuffer); + this.outputBuffer.clear(); + } + + private void internalDecode(StringBuilder consumer, byte[] buffer, int offset, int length) { + assert (offset >= 0); + assert (length >= 0); + int position = offset; + int end = offset + length; + assert (end <= buffer.length); + boolean finishedReading = false; + do { + CoderResult result = this.decoder.decode(this.inputBuffer, this.outputBuffer, false); + if (result.isOverflow()) { + this.consume(consumer); + } else if (result.isUnderflow()) { + this.inputBuffer.compact(); + int remaining = this.inputBuffer.remaining(); + assert (remaining > 0); + int read = Math.min(remaining, end - position); + if (read > 0) { + this.inputBuffer.put(buffer, position, read); + position += read; + } else { + finishedReading = true; + } + this.inputBuffer.flip(); + } else { + assert false; + } + } while (!finishedReading); + } + + public void decode(StringBuilder consumer, byte[] buffer, int offset, int length) { + this.internalDecode(consumer, buffer, offset, length); + this.consume(consumer); + } + + public void finish(StringBuilder consumer) { + if (this.finished) { + return; + } + this.finished = true; + CoderResult result; + result = this.decoder.decode(this.inputBuffer, this.outputBuffer, true); + assert (result.isOverflow() || result.isUnderflow()); + do { + result = this.decoder.flush(this.outputBuffer); + if (result.isOverflow()) { + this.consume(consumer); + } else { + assert result.isUnderflow(); + } + } while (!result.isUnderflow()); + this.consume(consumer); + } + +} diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java index f8aa4ef0da92b57821c3cd6bd81370b4935ca19a..0f14b7d1a7a84788525fbaacaab0c87d7fb92e60 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2013 IBM Corporation and others. + * Copyright (c) 2000, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -17,15 +17,19 @@ package org.eclipse.debug.internal.core; import java.io.IOException; import java.nio.charset.Charset; +import org.eclipse.debug.core.model.IBinaryStreamMonitor; +import org.eclipse.debug.core.model.IBinaryStreamsProxy; import org.eclipse.debug.core.model.IStreamMonitor; import org.eclipse.debug.core.model.IStreamsProxy; import org.eclipse.debug.core.model.IStreamsProxy2; /** - * Standard implementation of a streams proxy for IStreamsProxy. + * Standard implementation of a streams proxy for {@link IStreamsProxy}, + * {@link IStreamsProxy2} and {@link IBinaryStreamsProxy}. + * <p> + * Will use the same monitor instances for binary and string stream handling. */ - -public class StreamsProxy implements IStreamsProxy, IStreamsProxy2 { +public class StreamsProxy implements IBinaryStreamsProxy { /** * The monitor for the output stream (connected to standard out of the process) */ @@ -155,4 +159,22 @@ public class StreamsProxy implements IStreamsProxy, IStreamsProxy2 { } + @Override + public IBinaryStreamMonitor getBinaryErrorStreamMonitor() { + return fErrorMonitor; + } + + @Override + public IBinaryStreamMonitor getBinaryOutputStreamMonitor() { + return fOutputMonitor; + } + + @Override + public void write(byte[] data, int offset, int length) throws IOException { + if (!isClosed(false)) { + fInputMonitor.write(data, offset, length); + } else { + throw new IOException(); + } + } } diff --git a/org.eclipse.debug.core/forceQualifierUpdate.txt b/org.eclipse.debug.core/forceQualifierUpdate.txt new file mode 100644 index 0000000000000000000000000000000000000000..e3185a3bd627646336dd678248df95de813ddb2e --- /dev/null +++ b/org.eclipse.debug.core/forceQualifierUpdate.txt @@ -0,0 +1,2 @@ +# To force a version qualifier update add the bug here +Bug 566471 - I20200828-0150 - Comparator Errors Found diff --git a/org.eclipse.debug.core/pom.xml b/org.eclipse.debug.core/pom.xml index 61af1aa1b3e9b14615cb0cebf3984dd79072d38a..55df17e89776444983fa3397ca82be18268cb771 100644 --- a/org.eclipse.debug.core/pom.xml +++ b/org.eclipse.debug.core/pom.xml @@ -14,10 +14,10 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.debug</groupId> <artifactId>org.eclipse.debug.core</artifactId> - <version>3.15.100-SNAPSHOT</version> + <version>3.16.0-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF b/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF index cc379e56125a02af42e5b589764b4729779270e6..a5f7859db1055a3f150c7219e484807acc74bda2 100644 --- a/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF +++ b/org.eclipse.debug.examples.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: org.eclipse.debug.examples.core;singleton:=true -Bundle-Version: 1.4.700.qualifier +Bundle-Version: 1.4.800.qualifier Bundle-Activator: org.eclipse.debug.examples.core.pda.DebugCorePlugin Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.resources, diff --git a/org.eclipse.debug.examples.core/pom.xml b/org.eclipse.debug.examples.core/pom.xml index 280d038542f9ec7a9e3b0eeefed205a6563ae655..cfdf35b2dee66bfb089ee02a479d5af11a055b00 100644 --- a/org.eclipse.debug.examples.core/pom.xml +++ b/org.eclipse.debug.examples.core/pom.xml @@ -14,10 +14,10 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.debug</groupId> <artifactId>org.eclipse.debug.examples.core</artifactId> - <version>1.4.700-SNAPSHOT</version> + <version>1.4.800-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java index c1a21a99bc8122d284518d88c8fd48507bf05451..c7a207b074528324bc2babfef3c45ef2489afd6e 100644 --- a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java +++ b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDALineBreakpoint.java @@ -19,7 +19,6 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.LineBreakpoint; import org.eclipse.debug.examples.core.pda.DebugCorePlugin; @@ -62,16 +61,13 @@ public class PDALineBreakpoint extends LineBreakpoint implements IPDAEventListen * @throws CoreException if unable to create the breakpoint */ public PDALineBreakpoint(final IResource resource, final int lineNumber) throws CoreException { - IWorkspaceRunnable runnable = new IWorkspaceRunnable() { - @Override - public void run(IProgressMonitor monitor) throws CoreException { - IMarker marker = resource.createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$ - setMarker(marker); - marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE); - marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); - marker.setAttribute(IBreakpoint.ID, getModelIdentifier()); - marker.setAttribute(IMarker.MESSAGE, "Line Breakpoint: " + resource.getName() + " [line: " + lineNumber + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } + IWorkspaceRunnable runnable = monitor -> { + IMarker marker = resource.createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$ + setMarker(marker); + marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE); + marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + marker.setAttribute(IBreakpoint.ID, getModelIdentifier()); + marker.setAttribute(IMarker.MESSAGE, "Line Breakpoint: " + resource.getName() + " [line: " + lineNumber + "]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ }; run(getMarkerRule(resource), runnable); } diff --git a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java index 55eb369bac234a97eadd157de32be1ed6793e55b..e9629042ae9e2eb2e56864cb35aa0f54c5f5b0d4 100644 --- a/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java +++ b/org.eclipse.debug.examples.core/src/org/eclipse/debug/examples/core/pda/breakpoints/PDARunToLineBreakpoint.java @@ -18,8 +18,6 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IBreakpoint; @@ -38,18 +36,15 @@ public class PDARunToLineBreakpoint extends PDALineBreakpoint { * @exception DebugException if unable to create the breakpoint */ public PDARunToLineBreakpoint(final IFile resource, final int lineNumber) throws DebugException { - IWorkspaceRunnable runnable = new IWorkspaceRunnable() { - @Override - public void run(IProgressMonitor monitor) throws CoreException { - // associate with workspace root to avoid drawing in editor ruler - IMarker marker = ResourcesPlugin.getWorkspace().getRoot().createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$ - setMarker(marker); - marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE); - marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); - marker.setAttribute(IBreakpoint.ID, getModelIdentifier()); - setRegistered(false); - fSourceFile = resource; - } + IWorkspaceRunnable runnable = monitor -> { + // associate with workspace root to avoid drawing in editor ruler + IMarker marker = ResourcesPlugin.getWorkspace().getRoot().createMarker("org.eclipse.debug.examples.core.pda.markerType.lineBreakpoint"); //$NON-NLS-1$ + setMarker(marker); + marker.setAttribute(IBreakpoint.ENABLED, Boolean.TRUE); + marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + marker.setAttribute(IBreakpoint.ID, getModelIdentifier()); + setRegistered(false); + fSourceFile = resource; }; run(getMarkerRule(resource), runnable); } diff --git a/org.eclipse.debug.examples.memory/pom.xml b/org.eclipse.debug.examples.memory/pom.xml index cd82309d2b6517ab6c44b7fd7437c7a454c970ca..96c26ed6bc02dfd4d77d09280614267d507c6555 100644 --- a/org.eclipse.debug.examples.memory/pom.xml +++ b/org.eclipse.debug.examples.memory/pom.xml @@ -14,7 +14,7 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.debug</groupId> <artifactId>org.eclipse.debug.examples.memory</artifactId> diff --git a/org.eclipse.debug.examples.mixedmode/pom.xml b/org.eclipse.debug.examples.mixedmode/pom.xml index 7d4975fe7dea641a59f1736faa51c5d7dc7b4c12..8ff465b560371ac05c07ab73e196369a681a531d 100644 --- a/org.eclipse.debug.examples.mixedmode/pom.xml +++ b/org.eclipse.debug.examples.mixedmode/pom.xml @@ -14,7 +14,7 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.debug</groupId> <artifactId>org.eclipse.debug.examples.mixedmode</artifactId> diff --git a/org.eclipse.debug.examples.ui/pom.xml b/org.eclipse.debug.examples.ui/pom.xml index 3f44fc16de3a8dc67c43202929c21844102fdece..f192d2a0fed421d37f396aa0aa5d47db90e24896 100644 --- a/org.eclipse.debug.examples.ui/pom.xml +++ b/org.eclipse.debug.examples.ui/pom.xml @@ -14,7 +14,7 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.debug</groupId> <artifactId>org.eclipse.debug.examples.ui</artifactId> diff --git a/org.eclipse.debug.tests/META-INF/MANIFEST.MF b/org.eclipse.debug.tests/META-INF/MANIFEST.MF index fa85ae8123999f7894de76b8effaa669384c73e8..2f725b1673d429f454511323676de5c0e83e2dff 100644 --- a/org.eclipse.debug.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.debug.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.debug.tests;singleton:=true -Bundle-Version: 3.11.700.qualifier +Bundle-Version: 3.11.800.qualifier Bundle-Activator: org.eclipse.debug.tests.TestsPlugin Bundle-Localization: plugin Require-Bundle: org.eclipse.ui;bundle-version="[3.6.0,4.0.0)", diff --git a/org.eclipse.debug.tests/plugin.properties b/org.eclipse.debug.tests/plugin.properties index 2643d02af79ba934de911eb9b8d62369bf02a14f..8fcb3b9f3e530a50f341e6d8acb2e0581c90c631 100755 --- a/org.eclipse.debug.tests/plugin.properties +++ b/org.eclipse.debug.tests/plugin.properties @@ -20,4 +20,5 @@ renderingType.name.0 = Rendering Two renderingType.name.1 = Rendering Default launchConfigurationType.name = Test Launch Type extension.name = Debug File System -launchConfigurationType.name.0 = Cancelling Launch Type \ No newline at end of file +launchConfigurationType.name.0 = Cancelling Launch Type +testBreakpoint.name = Test Breakpoint \ No newline at end of file diff --git a/org.eclipse.debug.tests/plugin.xml b/org.eclipse.debug.tests/plugin.xml index b697fbdca6ccbd93cbe32c771e9a1a66a6d982c8..ab1d612ec9fa671d88e9e397d892668c4aba4d76 100644 --- a/org.eclipse.debug.tests/plugin.xml +++ b/org.eclipse.debug.tests/plugin.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.4"?> <!-- - Copyright (c) 2009 IBM Corporation and others. + Copyright (c) 2009, 2020 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 @@ -31,7 +31,7 @@ id="rendering_type_3" name="%renderingType.name.1" class="org.eclipse.debug.tests.view.memory.RenderingTypeDelegate"> - </renderingType> + </renderingType> <renderingBindings primaryId="rendering_type_1"> <enablement> @@ -55,7 +55,7 @@ <enablement> <instanceof value="org.eclipse.debug.tests.view.memory.MemoryBlockDynamic"/> </enablement> - </renderingBindings> + </renderingBindings> </extension> <extension point="org.eclipse.debug.core.launchConfigurationTypes"> @@ -111,5 +111,27 @@ class="org.eclipse.debug.tests.stepfilters.TestStepFilter" modelIdentifier="com.example.debug.model"> </stepFilter> - </extension> + </extension> + <extension point="org.eclipse.debug.core.breakpoints"> + <breakpoint + id="org.eclipse.debug.tests.testBreakpoint" + class="org.eclipse.debug.tests.breakpoint.TestBreakpoint" + markerType="org.eclipse.debug.core.breakpointMarker"> + </breakpoint> + </extension> + <extension + id="org.eclipse.debug.tests.testBreakpointMarker" + name="%testBreakpoint.name" + point="org.eclipse.core.resources.markers"> + <super + type="org.eclipse.debug.core.breakpointMarker"> + </super> + </extension> + <extension + point="org.eclipse.debug.ui.debugModelPresentations"> + <debugModelPresentation + class="org.eclipse.debug.tests.viewer.model.DebugTestModelPresentation" + id="org.eclipse.debug.tests"> + </debugModelPresentation> + </extension> </plugin> diff --git a/org.eclipse.debug.tests/pom.xml b/org.eclipse.debug.tests/pom.xml index b1e24f437f22f0c3bc0d52eba9f0856eca7f6a09..5e20ea247b4010ab753ad6d03cebe91cef6788ca 100644 --- a/org.eclipse.debug.tests/pom.xml +++ b/org.eclipse.debug.tests/pom.xml @@ -14,11 +14,11 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.debug</groupId> <artifactId>org.eclipse.debug.tests</artifactId> - <version>3.11.700-SNAPSHOT</version> + <version>3.11.800-SNAPSHOT</version> <packaging>eclipse-test-plugin</packaging> <properties> <code.ignoredWarnings>${tests.ignoredWarnings}</code.ignoredWarnings> diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java index ed53aad4a798691a6c79e4609818268c85de750b..825625830c0c7e28097861b2887776a621757b5f 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2019 IBM Corporation and others. + * Copyright (c) 2009, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -16,11 +16,15 @@ package org.eclipse.debug.tests; import org.eclipse.debug.tests.breakpoint.BreakpointOrderingTests; +import org.eclipse.debug.tests.breakpoint.BreakpointTests; import org.eclipse.debug.tests.console.ConsoleDocumentAdapterTests; import org.eclipse.debug.tests.console.ConsoleManagerTests; import org.eclipse.debug.tests.console.ConsoleTests; +import org.eclipse.debug.tests.console.FileLinkTests; import org.eclipse.debug.tests.console.IOConsoleFixedWidthTests; import org.eclipse.debug.tests.console.IOConsoleTests; +import org.eclipse.debug.tests.console.InputStreamMonitorTests; +import org.eclipse.debug.tests.console.OutputStreamMonitorTests; import org.eclipse.debug.tests.console.ProcessConsoleManagerTests; import org.eclipse.debug.tests.console.ProcessConsoleTests; import org.eclipse.debug.tests.console.RuntimeProcessTests; @@ -59,23 +63,65 @@ import org.junit.runners.Suite; */ @RunWith(Suite.class) @Suite.SuiteClasses({ - SourceLookupFacilityTests.class, BreakpointOrderingTests.class, - VirtualViewerDeltaTests.class, VirtualViewerContentTests.class, - VirtualViewerLazyModeTests.class, VirtualViewerSelectionTests.class, - VirtualViewerStateTests.class, VirtualViewerUpdateTests.class, - VirtualViewerFilterTests.class, FilterTransformTests.class, - ChildrenUpdateTests.class, PresentationContextTests.class, - MemoryRenderingTests.class, LaunchConfigurationTests.class, - AcceleratorSubstitutionTests.class, LaunchHistoryTests.class, - LaunchFavoriteTests.class, LaunchManagerTests.class, - RefreshTabTests.class, ArgumentParsingTests.class, LaunchTests.class, + // Source lookup tests + SourceLookupFacilityTests.class, + // BP tests + BreakpointOrderingTests.class, + BreakpointTests.class, + // Note: jface viewer tests were moved out of nightly tests + // due to frequent problems on nightly build machines. + // (Bug 343308). + + // Virtual viewer tests + VirtualViewerDeltaTests.class, + VirtualViewerContentTests.class, + VirtualViewerLazyModeTests.class, + VirtualViewerSelectionTests.class, + VirtualViewerStateTests.class, + VirtualViewerUpdateTests.class, + VirtualViewerFilterTests.class, + + // Viewer neutral tests + FilterTransformTests.class, + ChildrenUpdateTests.class, + PresentationContextTests.class, + + // Memory view + MemoryRenderingTests.class, + + // Launch framework + LaunchConfigurationTests.class, + AcceleratorSubstitutionTests.class, + LaunchHistoryTests.class, + LaunchFavoriteTests.class, + LaunchManagerTests.class, + RefreshTabTests.class, + ArgumentParsingTests.class, + LaunchTests.class, + + // Status handlers StatusHandlerTests.class, + + // Step filters StepFiltersTests.class, - ConsoleDocumentAdapterTests.class, ConsoleManagerTests.class, - ConsoleTests.class, IOConsoleTests.class, - IOConsoleFixedWidthTests.class, ProcessConsoleManagerTests.class, - ProcessConsoleTests.class, StreamsProxyTests.class, - TextConsoleViewerTest.class, RuntimeProcessTests.class, - LaunchGroupTests.class }) + + // Console view + ConsoleDocumentAdapterTests.class, + ConsoleManagerTests.class, + ConsoleTests.class, + IOConsoleTests.class, + IOConsoleFixedWidthTests.class, + ProcessConsoleManagerTests.class, + ProcessConsoleTests.class, + StreamsProxyTests.class, + TextConsoleViewerTest.class, + RuntimeProcessTests.class, + OutputStreamMonitorTests.class, + InputStreamMonitorTests.class, + FileLinkTests.class, + + // Launch Groups + LaunchGroupTests.class, +}) public class AutomatedSuite { } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java index 99f2a2645ec13c6246ab254d7067c2de8c70fdbd..e7644a8c1da17833b22836f9cd8e65ba8f458d32 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/TestUtil.java @@ -24,6 +24,8 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.function.Function; +import java.util.function.Supplier; + import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; @@ -108,8 +110,8 @@ public class TestUtil { * background thread, just waits. * * @param <T> type of the context - * @param context test context * @param condition function which will be evaluated while waiting + * @param context test context * @param timeout max wait time in milliseconds to wait on given condition * @param errorMessage message which will be used to construct the failure * exception in case the condition will still return {@code true} @@ -133,6 +135,39 @@ public class TestUtil { } } + /** + * A simplified variant of + * {@link #waitWhile(Function, Object, long, Function)}. + * <p> + * Waits while given condition is {@code true} for a given amount of + * milliseconds. + * <p> + * Will process UI events while waiting in UI thread, if called from + * background thread, just waits. + * + * @param condition function which will be evaluated while waiting + * @param timeout max wait time in milliseconds to wait on given condition + * @return value of condition when method returned + */ + public static boolean waitWhile(Supplier<Boolean> condition, long timeout) throws Exception { + if (condition == null) { + condition = () -> true; + } + long start = System.currentTimeMillis(); + Display display = Display.getCurrent(); + while (System.currentTimeMillis() - start < timeout && condition.get()) { + Thread.yield(); + if (display != null && !display.isDisposed()) { + if (!display.readAndDispatch()) { + Thread.sleep(1); + } + } else { + Thread.sleep(5); + } + } + return condition.get(); + } + /** * Utility for waiting until the execution of jobs of any family has * finished or timeout is reached. If no jobs are running, the method waits diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java index c70242f7955b1c1572e6ec88a9a9a06382b7abcb..91a3d93187ef743283c07bf7e0b7378932fd177a 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointOrderingTests.java @@ -19,20 +19,12 @@ import static org.junit.Assert.fail; import java.util.List; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspaceRunnable; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.ILineBreakpoint; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsComparator; import org.eclipse.debug.tests.AbstractDebugTest; -import org.eclipse.debug.tests.TestsPlugin; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.IValueDetailListener; import org.eclipse.jface.viewers.IBaseLabelProvider; @@ -51,110 +43,6 @@ import org.junit.Test; */ public class BreakpointOrderingTests extends AbstractDebugTest { - /** - * Test only implementation of IBreakpoint. - */ - static class TestBreakpoint implements IBreakpoint { - - private final String fText; - private IMarker fMarker = null; - - TestBreakpoint(String text) { - this(text, IBreakpoint.BREAKPOINT_MARKER); - } - - TestBreakpoint(String text, final String markerType) { - fText = text; - final IResource resource = ResourcesPlugin.getWorkspace().getRoot(); - IWorkspaceRunnable wr = new IWorkspaceRunnable() { - - @Override - public void run( IProgressMonitor monitor ) throws CoreException { - // create the marker - setMarker(resource.createMarker(markerType)); - } - }; - try { - ResourcesPlugin.getWorkspace().run( wr, null ); - } - catch ( CoreException e ) { - fail("Unexpected exception: " + e); //$NON-NLS-1$ - } - - } - - void ReportFailure(String msg) throws CoreException { - throw new CoreException(new Status(IStatus.ERROR, TestsPlugin.PLUGIN_ID, msg)); - } - - - String getText() { - return fText; - } - - @Override - public void delete() throws CoreException { - fMarker.delete(); - } - - @Override - public IMarker getMarker() { - return fMarker; - } - - @Override - public String getModelIdentifier() { - return "Test"; //$NON-NLS-1$ - } - - @Override - public boolean isEnabled() throws CoreException { - fail("not implemented in test"); //$NON-NLS-1$ - return false; - } - - @Override - public boolean isPersisted() throws CoreException { - fail("not implemented in test"); //$NON-NLS-1$ - return false; - } - - @Override - public boolean isRegistered() throws CoreException { - fail("not implemented in test"); //$NON-NLS-1$ - return false; - } - - @Override - public void setEnabled(boolean enabled) throws CoreException { - fail("not implemented in test"); //$NON-NLS-1$ - } - - @Override - public void setMarker(IMarker marker) throws CoreException { - assertTrue(fMarker == null && marker != null); - fMarker = marker; - } - - @Override - public void setPersisted(boolean registered) throws CoreException { - fail("not implemented in test"); //$NON-NLS-1$ - } - - @Override - public void setRegistered(boolean registered) throws CoreException { - fail("not implemented in test"); //$NON-NLS-1$ - - } - - @Override - public <T> T getAdapter(Class<T> adapter) { - fail("not implemented in test"); //$NON-NLS-1$ - return null; - } - - } - /** * Test only implementation of ILineBreakpoint. */ diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointTests.java new file mode 100644 index 0000000000000000000000000000000000000000..39c127bfb880874b0c1f2cd4bd08b336680c4479 --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/BreakpointTests.java @@ -0,0 +1,134 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.tests.breakpoint; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.commands.operations.IOperationHistory; +import org.eclipse.core.commands.operations.IUndoContext; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.IBreakpointManager; +import org.eclipse.debug.core.model.IBreakpoint; +import org.eclipse.debug.internal.core.BreakpointManager; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView; +import org.eclipse.debug.tests.AbstractDebugTest; +import org.eclipse.debug.tests.TestUtil; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.IDebugUIConstants; +import org.eclipse.swt.widgets.TreeItem; +import org.eclipse.ui.PlatformUI; +import org.junit.Test; + +public class BreakpointTests extends AbstractDebugTest { + + private final IBreakpointManager bpm = DebugPlugin.getDefault().getBreakpointManager(); + + @Override + public void tearDown() throws Exception { + super.tearDown(); + + for (IBreakpoint bp : getTestBreakpoints()) { + bp.delete(); + } + } + + /** + * Get all {@link TestBreakpoint}s known by the default + * {@link BreakpointManager}. + * + * @return {@link TestBreakpoint}s or empty list + */ + private List<TestBreakpoint> getTestBreakpoints() { + List<TestBreakpoint> bps = new ArrayList<>(); + for (IBreakpoint bp : bpm.getBreakpoints(TestBreakpoint.MODEL)) { + assertTrue(bp instanceof TestBreakpoint); + bps.add((TestBreakpoint) bp); + } + return bps; + } + + /** + * Test for bug 424561 where a breakpoint is deleted and the sequence undo + * (recreate breakpoint), redo (delete again), undo (recreate breakpoint) + * does not recreate the breakpoint. + */ + @Test + public void testBug424561_undoRedoUndoGone() throws Exception { + boolean viewVisible = true; + BreakpointsView view = ((BreakpointsView) DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_BREAKPOINT_VIEW)); + if (view == null) { + viewVisible = false; + view = ((BreakpointsView) DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().showView(IDebugUIConstants.ID_BREAKPOINT_VIEW)); + } + assertNotNull("Failed to obtain breakpoint view.", view); + + try { + String content = "Bug 424561"; + TestBreakpoint bp = new TestBreakpoint(content); + IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory(); + IUndoContext context = DebugUITools.getBreakpointsUndoContext(); + + bpm.addBreakpoint(bp); + TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not created"); + assertTrue("Breakpoint marker missing", bp.getMarker().exists()); + assertTrue("Breakpoint not registered", bp.isRegistered()); + + DebugUITools.deleteBreakpoints(new IBreakpoint[] { + bp }, null, null); + assertTrue(operationHistory.canUndo(context)); + TestUtil.waitWhile(c -> c.getTestBreakpoints().size() > 0, this, testTimeout, c -> "Breakpoint is not deleted"); + assertFalse("Breakpoint marker not removed", bp.getMarker().exists()); + assertFalse("Breakpoint still registered", bp.isRegistered()); + + operationHistory.undo(context, null, null); + assertTrue(operationHistory.canRedo(context)); + TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not recreated"); + bp = getTestBreakpoints().get(0); + assertEquals("Breakpoint attributes not correctly restored", content, bp.getText()); + assertTrue("Breakpoint marker missing", bp.getMarker().exists()); + assertTrue("Breakpoint not registered", bp.isRegistered()); + + operationHistory.redo(context, null, null); + assertTrue(operationHistory.canUndo(context)); + TestUtil.waitWhile(c -> c.getTestBreakpoints().size() > 0, this, testTimeout, c -> "Breakpoint is not deleted"); + assertFalse("Breakpoint marker not removed", bp.getMarker().exists()); + assertFalse("Breakpoint still registered", bp.isRegistered()); + + operationHistory.undo(context, null, null); + assertTrue(operationHistory.canRedo(context)); + TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not recreated"); + bp = getTestBreakpoints().get(0); + assertEquals("Breakpoint attributes not correctly restored", content, bp.getText()); + assertTrue("Breakpoint marker missing", bp.getMarker().exists()); + assertTrue("Breakpoint not registered", bp.isRegistered()); + + final BreakpointsView finalView = view; + final TestBreakpoint finalBp = bp; + TestUtil.waitWhile(c -> { + TreeItem item = (TreeItem) finalView.getTreeModelViewer().testFindItem(finalBp); + return item == null || item.getText() == null || !item.getText().contains(content); + }, this, testTimeout, c -> "Breakpoint not restored in view"); + } finally { + if (!viewVisible) { + DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().hideView(view); + } + } + } +} diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/TestBreakpoint.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/TestBreakpoint.java new file mode 100644 index 0000000000000000000000000000000000000000..2a1cc32893fd23056645c2837cc422fef233ff44 --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/breakpoint/TestBreakpoint.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.tests.breakpoint; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.debug.core.model.Breakpoint; +import org.eclipse.debug.core.model.IBreakpoint; + +/** + * Test only implementation of IBreakpoint. + */ +public class TestBreakpoint extends Breakpoint { + + public static final String MODEL = "org.eclipse.debug.tests"; //$NON-NLS-1$ + public static final String TEXT_ATTRIBUTE = "org.eclipse.debug.tests.breakpoint.TestBreakpoint.text"; //$NON-NLS-1$ + + public TestBreakpoint() { + super(); + } + + TestBreakpoint(String text) { + this(text, IBreakpoint.BREAKPOINT_MARKER); + } + + TestBreakpoint(String text, final String markerType) { + final IResource resource = ResourcesPlugin.getWorkspace().getRoot(); + IWorkspaceRunnable wr = new IWorkspaceRunnable() { + @Override + public void run(IProgressMonitor monitor) throws CoreException { + // create the marker + setMarker(resource.createMarker(markerType)); + ensureMarker().setAttribute(ID, getModelIdentifier()); + ensureMarker().setAttribute(TEXT_ATTRIBUTE, text); + } + }; + try { + ResourcesPlugin.getWorkspace().run(wr, null); + } catch (CoreException e) { + fail("Unexpected exception: " + e); //$NON-NLS-1$ + } + + } + + public String getText() { + return getMarker().getAttribute(TEXT_ATTRIBUTE, null); + } + + @Override + public String getModelIdentifier() { + return MODEL; + } + + @Override + public void setMarker(IMarker marker) throws CoreException { + assertTrue(getMarker() == null && marker != null); + super.setMarker(marker); + } + +} \ No newline at end of file diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/FileLinkTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/FileLinkTests.java new file mode 100644 index 0000000000000000000000000000000000000000..9042f27b34bc9f9fb4e920a1daaa28d50abf7bcc --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/FileLinkTests.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.tests.console; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.ByteArrayInputStream; +import java.io.UnsupportedEncodingException; +import java.util.UUID; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.tests.AbstractDebugTest; +import org.eclipse.debug.ui.console.FileLink; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.junit.Test; + +/** + * Tests for {@link FileLink}. + */ +public class FileLinkTests extends AbstractDebugTest { + + private IProject testProject; + private IFile testFile; + + @Override + public void setUp() throws Exception { + super.setUp(); + + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + testProject = workspace.getRoot().getProject("FileLinkTest-" + UUID.randomUUID()); + testProject.create(null); + testProject.open(null); + testFile = testProject.getFile("filelinktest.txt"); + setTestContent("Test file\nSecond line"); + } + + @Override + public void tearDown() throws Exception { + if (testProject.exists()) { + testProject.delete(true, true, null); + } + + super.tearDown(); + } + + private void setTestContent(String fileContent) throws UnsupportedEncodingException, CoreException { + ByteArrayInputStream data = new ByteArrayInputStream(fileContent.getBytes(testFile.getCharset())); + if (testFile.exists()) { + testFile.setContents(data, IResource.FORCE, null); + } else { + testFile.create(data, IResource.FORCE, null); + } + } + + @Test + public void testFileLink() throws Exception { + FileLink link = new FileLink(testFile, null, -1, -1, -1); + link.linkActivated(); + assertEquals(testFile.getName(), getActiveEditorFilename()); + } + + @Test + public void testFileLinkWithOffset() throws Exception { + FileLink link = new FileLink(testFile, null, 4, 0, -1); + link.linkActivated(); + assertEquals(testFile.getName(), getActiveEditorFilename()); + ITextSelection selection = getCurrentTextSelection(); + assertNotNull("No selection.", selection); + assertEquals(4, selection.getOffset()); + assertEquals(0, selection.getLength()); + assertEquals(0, selection.getStartLine()); + assertEquals(0, selection.getEndLine()); + } + + @Test + public void testFileLinkWithSelection() throws Exception { + FileLink link = new FileLink(testFile, null, 7, 5, -1); + link.linkActivated(); + assertEquals(testFile.getName(), getActiveEditorFilename()); + ITextSelection selection = getCurrentTextSelection(); + assertNotNull("No selection.", selection); + assertEquals(7, selection.getOffset()); + assertEquals(5, selection.getLength()); + assertEquals(0, selection.getStartLine()); + assertEquals(1, selection.getEndLine()); + + // if offset + length and line is specified the line should be ignored + link = new FileLink(testFile, null, 7, 5, 1); + link.linkActivated(); + assertEquals(testFile.getName(), getActiveEditorFilename()); + selection = getCurrentTextSelection(); + assertNotNull("No selection.", selection); + assertEquals(7, selection.getOffset()); + assertEquals(5, selection.getLength()); + assertEquals(0, selection.getStartLine()); + assertEquals(1, selection.getEndLine()); + } + + @Test + public void testFileLinkWithLine() throws Exception { + FileLink link = new FileLink(testFile, null, -1, -1, 2); + link.linkActivated(); + assertEquals(testFile.getName(), getActiveEditorFilename()); + ITextSelection selection = getCurrentTextSelection(); + assertNotNull("No selection.", selection); + assertEquals(10, selection.getOffset()); + assertEquals(11, selection.getLength()); + assertEquals(1, selection.getStartLine()); + assertEquals(1, selection.getEndLine()); + } + + private String getActiveEditorFilename() { + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + IEditorPart editor = window.getActivePage().getActiveEditor(); + return editor != null ? editor.getEditorInput().getName() : null; + } + + private ITextSelection getCurrentTextSelection() { + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + ISelection selection = window.getSelectionService().getSelection(); + if (selection instanceof ITextSelection) { + return (ITextSelection) selection; + } + return null; + } +} diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java index a90cad29ac77ceb4c1dacdc7bce9b008e81f3ebb..ae51f9f7f14d672069f515adf793f3b3ba0ba0eb 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/IOConsoleTests.java @@ -611,6 +611,26 @@ public class IOConsoleTests extends AbstractDebugTest { closeConsole(c); } + /** + * Test handling of <code>\0</code>. + */ + @Test + public void testNullByte() throws Exception { + final IOConsoleTestUtil c = getTestUtil("Test \\0"); + c.getConsole().setHandleControlCharacters(true); + try (IOConsoleOutputStream err = c.getConsole().newOutputStream()) { + c.write("\u0000").verifyContent(""); + c.write("abc\u0000123").verifyContent("abc123"); + c.writeFast("\u0000", err).writeAndVerify("output"); + c.write("\n\u0000x\u0000y\u0000z\u0000\u0000\u0000987", err).verifyContentByLine("xyz987", 1).verifyPartitions(); + assertFalse(c.getDocument().get().contains("\u0000")); + + c.clear(); + c.writeFast("123").writeFast("\b\b\b").write("+\u0000+").verifyContent("++3").verifyPartitions(); + } + closeConsole(c); + } + /** * Test larger number of partitions with pseudo random console content. */ diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/InputStreamMonitorTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/InputStreamMonitorTests.java new file mode 100644 index 0000000000000000000000000000000000000000..361995c89a2c3555080a9c64c6e179c612827e5e --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/InputStreamMonitorTests.java @@ -0,0 +1,157 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.tests.console; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.nio.charset.Charset; +import java.util.Set; +import java.util.function.Supplier; + +import org.eclipse.core.runtime.Platform; +import org.eclipse.debug.internal.core.DebugCoreMessages; +import org.eclipse.debug.internal.core.InputStreamMonitor; +import org.eclipse.debug.tests.AbstractDebugTest; +import org.eclipse.debug.tests.TestUtil; +import org.eclipse.debug.tests.TestsPlugin; +import org.junit.Test; + +/** + * Tests the {@link InputStreamMonitor}. + */ +public class InputStreamMonitorTests extends AbstractDebugTest { + + /** + * Simple test for input stream monitor. Write some bytes before starting + * the monitor, some after and check if they are correctly transfered. + */ + @Test + @SuppressWarnings("resource") + public void testInputStreamMonitor() throws Exception { + PipedInputStream sysin = new PipedInputStream(); + InputStreamMonitor monitor = new InputStreamMonitor(new PipedOutputStream(sysin)); + + byte[] content = new byte[100]; + for (int i = 0; i < content.length; i++) { + content[i] = (byte) (i % 255); + } + try { + int half = content.length / 2; + monitor.write(content, 0, half); + monitor.startMonitoring(); + monitor.write(content, half, content.length - half); + Thread.sleep(30); + + byte[] readBack = new byte[content.length]; + int read = sysin.read(readBack); + assertEquals("Monitor wrote to few bytes.", read, content.length); + assertEquals("Monitor wrote to much bytes.", 0, sysin.available()); + assertArrayEquals("Monitor wrote wrong content.", content, readBack); + } finally { + monitor.close(); + } + } + + /** + * Test that passing <code>null</code> as charset does not raise exceptions. + */ + @Test + @SuppressWarnings("resource") + public void testNullCharset() throws Exception { + PipedInputStream sysin = new PipedInputStream(); + InputStreamMonitor monitor = new InputStreamMonitor(new PipedOutputStream(sysin), (Charset) null); + String text = "o\u00F6O\u00EFiI\u00D6\u00D8\u00F8"; + try { + monitor.startMonitoring(); + monitor.write(text); + Thread.sleep(30); + + byte[] readBack = new byte[1000]; + int len = sysin.read(readBack); + assertEquals("Monitor wrote wrong content.", text, new String(readBack, 0, len)); + } finally { + monitor.close(); + } + } + + /** + * Test different combinations of stream closing. + */ + @Test + @SuppressWarnings("resource") + public void testClose() throws Exception { + Supplier<Long> getInputStreamMonitorThreads = () -> { + Set<Thread> allThreads = Thread.getAllStackTraces().keySet(); + long numMonitorThreads = allThreads.stream().filter(t -> DebugCoreMessages.InputStreamMonitor_label.equals(t.getName())).count(); + return numMonitorThreads; + }; + long alreadyLeakedThreads = getInputStreamMonitorThreads.get(); + if (alreadyLeakedThreads > 0) { + Platform.getLog(TestsPlugin.class).warn("Test started with " + alreadyLeakedThreads + " leaked monitor threads."); + } + + { + ClosableTestOutputStream testStream = new ClosableTestOutputStream(); + InputStreamMonitor monitor = new InputStreamMonitor(testStream); + assertEquals("Stream closed to early.", 0, testStream.numClosed); + monitor.closeInputStream(); + TestUtil.waitWhile(() -> testStream.numClosed == 0, 100); + assertEquals("Stream not closed.", 1, testStream.numClosed); + } + { + ClosableTestOutputStream testStream = new ClosableTestOutputStream(); + InputStreamMonitor monitor = new InputStreamMonitor(testStream); + monitor.startMonitoring(); + assertEquals("Stream closed to early.", 0, testStream.numClosed); + monitor.close(); + TestUtil.waitWhile(() -> testStream.numClosed == 0, 200); + assertEquals("Stream not closed.", 1, testStream.numClosed); + } + { + ClosableTestOutputStream testStream = new ClosableTestOutputStream(); + InputStreamMonitor monitor = new InputStreamMonitor(testStream); + monitor.startMonitoring(); + assertEquals("Stream closed to early.", 0, testStream.numClosed); + monitor.closeInputStream(); + monitor.close(); + monitor.close(); + TestUtil.waitWhile(() -> testStream.numClosed == 0, 100); + assertEquals("Stream not closed or to often.", 1, testStream.numClosed); + } + + TestUtil.waitWhile(() -> getInputStreamMonitorThreads.get() > 0, 500); + assertEquals("Leaked monitor threads.", 0, (long) getInputStreamMonitorThreads.get()); + } + + /** + * Extension of output stream to log calls to {@link #close()}. + */ + public static class ClosableTestOutputStream extends OutputStream { + public volatile int numClosed = 0; + + @Override + public void close() throws IOException { + numClosed++; + } + + @Override + public void write(int b) throws IOException { + } + } +} diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/OutputStreamMonitorTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/OutputStreamMonitorTests.java new file mode 100644 index 0000000000000000000000000000000000000000..0d361021f94bd4ac317ac02bac9adc5a6c29ad31 --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/OutputStreamMonitorTests.java @@ -0,0 +1,208 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.tests.console; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.io.PrintStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import org.eclipse.debug.core.IBinaryStreamListener; +import org.eclipse.debug.core.IStreamListener; +import org.eclipse.debug.core.model.IBinaryStreamMonitor; +import org.eclipse.debug.core.model.IStreamMonitor; +import org.eclipse.debug.internal.core.OutputStreamMonitor; +import org.eclipse.debug.tests.AbstractDebugTest; +import org.eclipse.debug.tests.TestUtil; +import org.junit.Before; +import org.junit.Test; + +/** + * Tests the {@link OutputStreamMonitor}. + */ +public class OutputStreamMonitorTests extends AbstractDebugTest { + + /** Stream to simulate an application writing to system out. */ + PipedOutputStream sysout = new PipedOutputStream(); + /** The {@link OutputStreamMonitor} used for the test runs. */ + TestOutputStreamMonitor monitor; + /** The bytes received through listener. */ + ByteArrayOutputStream notifiedBytes = new ByteArrayOutputStream(); + /** The strings received through listener. */ + StringBuilder notifiedChars = new StringBuilder(); + + IBinaryStreamListener fBinaryListener = new IBinaryStreamListener() { + @Override + public void streamAppended(byte[] data, IBinaryStreamMonitor mon) { + if (monitor == mon) { + try { + notifiedBytes.write(data); + } catch (IOException e) { + } + } + } + }; + IStreamListener fStreamListener = new IStreamListener() { + @Override + public void streamAppended(String text, IStreamMonitor mon) { + if (monitor == mon) { + notifiedChars.append(text); + } + } + }; + + @Override + @Before + @SuppressWarnings("resource") + public void setUp() throws IOException { + monitor = new TestOutputStreamMonitor(new PipedInputStream(sysout), StandardCharsets.UTF_8); + } + + /** + * Simple test for output stream monitor. Test buffering and listeners. + */ + @Test + public void testBufferedOutputStreamMonitor() throws Exception { + String input = "o\u00F6O"; + byte[] byteInput = input.getBytes(StandardCharsets.UTF_8); + try { + monitor.addBinaryListener(fBinaryListener); + monitor.addListener(fStreamListener); + + sysout.write(byteInput, 0, 2); + sysout.flush(); + monitor.startMonitoring(); + TestUtil.waitWhile(() -> notifiedBytes.size() < 2, 1000); + String contents = monitor.getContents(); + assertEquals("Monitor read wrong content.", input.substring(0, 1), contents); + assertEquals("Notified and buffered content differ.", contents, notifiedChars.toString()); + assertEquals("Failed to access buffered content twice.", contents, monitor.getContents()); + byte[] data = monitor.getData(); + byte[] expected = new byte[2]; + System.arraycopy(byteInput, 0, expected, 0, 2); + assertArrayEquals("Monitor read wrong binary content.", expected, data); + assertArrayEquals("Notified and buffered binary content differ.", data, notifiedBytes.toByteArray()); + assertArrayEquals("Failed to access buffered binary content twice.", data, monitor.getData()); + + monitor.flushContents(); + sysout.write(byteInput, 2, byteInput.length - 2); + sysout.flush(); + TestUtil.waitWhile(() -> notifiedBytes.size() < byteInput.length, 1000); + contents = monitor.getContents(); + assertEquals("Monitor buffered wrong content.", input.substring(1), contents); + assertEquals("Failed to access buffered content twice.", contents, monitor.getContents()); + assertEquals("Wrong content through listener.", input, notifiedChars.toString()); + data = monitor.getData(); + expected = new byte[byteInput.length - 2]; + System.arraycopy(byteInput, 2, expected, 0, expected.length); + assertArrayEquals("Monitor read wrong binary content.", expected, data); + assertArrayEquals("Failed to access buffered binary content twice.", data, monitor.getData()); + assertArrayEquals("Wrong binary content through listener.", byteInput, notifiedBytes.toByteArray()); + } finally { + sysout.close(); + monitor.close(); + } + } + + /** + * Simple test for output stream monitor. Test listeners without buffering. + */ + @Test + public void testUnbufferedOutputStreamMonitor() throws Exception { + String input = "o\u00F6O"; + byte[] byteInput = input.getBytes(StandardCharsets.UTF_8); + try { + monitor.addBinaryListener(fBinaryListener); + monitor.addListener(fStreamListener); + + sysout.write(byteInput, 0, 2); + sysout.flush(); + monitor.setBuffered(false); + monitor.startMonitoring(); + TestUtil.waitWhile(() -> notifiedBytes.size() < 2, 1000); + assertEquals("Monitor read wrong content.", input.substring(0, 1), notifiedChars.toString()); + byte[] expected = new byte[2]; + System.arraycopy(byteInput, 0, expected, 0, 2); + assertArrayEquals("Monitor read wrong binary content.", expected, notifiedBytes.toByteArray()); + + monitor.flushContents(); + sysout.write(byteInput, 2, byteInput.length - 2); + sysout.flush(); + TestUtil.waitWhile(() -> notifiedBytes.size() < byteInput.length, 1000); + assertEquals("Wrong content through listener.", input, notifiedChars.toString()); + expected = new byte[byteInput.length - 2]; + System.arraycopy(byteInput, 2, expected, 0, expected.length); + assertArrayEquals("Wrong binary content through listener.", byteInput, notifiedBytes.toByteArray()); + } finally { + sysout.close(); + monitor.close(); + } + } + + /** + * Test that passing <code>null</code> as charset does not raise exceptions. + */ + @Test + @SuppressWarnings("resource") + public void testNullCharset() throws Exception { + String input = "o\u00F6O\u00EFiI\u00D6\u00D8\u00F8"; + + sysout.close(); + sysout = new PipedOutputStream(); + monitor.close(); + monitor = new TestOutputStreamMonitor(new PipedInputStream(sysout), null); + try { + monitor.addListener(fStreamListener); + monitor.startMonitoring(); + try (PrintStream out = new PrintStream(sysout)) { + out.print(input); + } + sysout.flush(); + + TestUtil.waitWhile(() -> notifiedChars.length() < input.length(), 500); + assertEquals("Monitor read wrong content.", input, notifiedChars.toString()); + } finally { + sysout.close(); + monitor.close(); + } + } + + /** + * {@link OutputStreamMonitor} with public {@link #startMonitoring()} for + * testing. + */ + private static class TestOutputStreamMonitor extends OutputStreamMonitor { + + public TestOutputStreamMonitor(InputStream stream, Charset charset) { + super(stream, charset); + } + + @Override + public void startMonitoring() { + super.startMonitoring(); + } + + @Override + public void close() { + super.close(); + } + } +} diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java index 7b274bcc2585e09c6d22c4e58482a9ed134c8b53..e6eb8b195a7b4858fae436f0c628b21356d682de 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ProcessConsoleTests.java @@ -14,13 +14,15 @@ package org.eclipse.debug.tests.console; import static org.junit.Assert.assertArrayEquals; - -import java.io.ByteArrayInputStream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.io.PrintStream; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.text.MessageFormat; @@ -51,6 +53,7 @@ import org.eclipse.debug.tests.launching.LaunchConfigurationTests; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.console.ConsoleColorProvider; import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsole; @@ -405,4 +408,121 @@ public class ProcessConsoleTests extends AbstractDebugTest { TestUtil.waitForJobs(name.getMethodName(), 0, 1000); } } + + /** + * Simulate the common case of a process which constantly produce output. + * This should cover the situation that a process produce output before + * ProcessConsole is initialized and more output after console is ready. + */ + @Test + public void testOutput() throws Exception { + String[] lines = new String[] { + "'Native' process started.", + "'Eclipse' process started. Stream proxying started.", + "Console created.", "Console initialized.", + "Stopping mock process.", }; + String consoleEncoding = StandardCharsets.UTF_8.name(); + try (PipedOutputStream procOut = new PipedOutputStream(); PrintStream sysout = new PrintStream(procOut, true, consoleEncoding)) { + @SuppressWarnings("resource") + final MockProcess mockProcess = new MockProcess(new PipedInputStream(procOut), null, MockProcess.RUN_FOREVER); + sysout.println(lines[0]); + try { + Map<String, Object> launchConfigAttributes = new HashMap<>(); + launchConfigAttributes.put(DebugPlugin.ATTR_CONSOLE_ENCODING, consoleEncoding); + final IProcess process = mockProcess.toRuntimeProcess("simpleOutput", launchConfigAttributes); + sysout.println(lines[1]); + @SuppressWarnings("restriction") + final org.eclipse.debug.internal.ui.views.console.ProcessConsole console = new org.eclipse.debug.internal.ui.views.console.ProcessConsole(process, new ConsoleColorProvider(), consoleEncoding); + sysout.println(lines[2]); + try { + console.initialize(); + sysout.println(lines[3]); + sysout.println(lines[4]); + mockProcess.destroy(); + sysout.close(); + TestUtil.processUIEvents(200); + + for (int i = 0; i < lines.length; i++) { + IRegion lineInfo = console.getDocument().getLineInformation(i); + String line = console.getDocument().get(lineInfo.getOffset(), lineInfo.getLength()); + assertEquals("Wrong content in line " + i, lines[i], line); + } + } finally { + console.destroy(); + } + } finally { + mockProcess.destroy(); + } + } + } + + /** + * Test a process which produces binary output and a launch which redirects + * output to file. The process output must not be changed in any way due to + * the redirection. See bug 558463. + */ + @Test + public void testBinaryOutputToFile() throws Exception { + byte[] output = new byte[] { (byte) 0xac }; + String consoleEncoding = StandardCharsets.UTF_8.name(); + + final File outFile = createTmpFile("testoutput.bin"); + final MockProcess mockProcess = new MockProcess(new ByteArrayInputStream(output), null, MockProcess.RUN_FOREVER); + try { + Map<String, Object> launchConfigAttributes = new HashMap<>(); + launchConfigAttributes.put(DebugPlugin.ATTR_CONSOLE_ENCODING, consoleEncoding); + launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_IN_FILE, outFile.getCanonicalPath()); + launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, false); + final IProcess process = mockProcess.toRuntimeProcess("redirectBinaryOutput", launchConfigAttributes); + @SuppressWarnings("restriction") + final org.eclipse.debug.internal.ui.views.console.ProcessConsole console = new org.eclipse.debug.internal.ui.views.console.ProcessConsole(process, new ConsoleColorProvider(), consoleEncoding); + try { + console.initialize(); + mockProcess.waitFor(100, TimeUnit.MILLISECONDS); + mockProcess.destroy(); + } finally { + console.destroy(); + } + } finally { + mockProcess.destroy(); + } + + byte[] receivedOutput = Files.readAllBytes(outFile.toPath()); + assertArrayEquals(output, receivedOutput); + } + + /** + * Test a process which reads binary input from a file through Eclipse + * console. The input must not be changed in any way due to the redirection. + * See bug 558463. + */ + @Test + public void testBinaryInputFromFile() throws Exception { + byte[] input = new byte[] { (byte) 0xac }; + String consoleEncoding = StandardCharsets.UTF_8.name(); + + final File inFile = createTmpFile("testinput.bin"); + Files.write(inFile.toPath(), input); + final MockProcess mockProcess = new MockProcess(input.length, testTimeout); + try { + Map<String, Object> launchConfigAttributes = new HashMap<>(); + launchConfigAttributes.put(DebugPlugin.ATTR_CONSOLE_ENCODING, consoleEncoding); + launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_STDIN_FILE, inFile.getCanonicalPath()); + launchConfigAttributes.put(IDebugUIConstants.ATTR_CAPTURE_IN_CONSOLE, false); + final IProcess process = mockProcess.toRuntimeProcess("redirectBinaryInput", launchConfigAttributes); + @SuppressWarnings("restriction") + final org.eclipse.debug.internal.ui.views.console.ProcessConsole console = new org.eclipse.debug.internal.ui.views.console.ProcessConsole(process, new ConsoleColorProvider(), consoleEncoding); + try { + console.initialize(); + mockProcess.waitFor(testTimeout, TimeUnit.MILLISECONDS); + } finally { + console.destroy(); + } + } finally { + mockProcess.destroy(); + } + + byte[] receivedInput = mockProcess.getReceivedInput(); + assertArrayEquals(input, receivedInput); + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java index 2f775f33a0be9e1a0d7f676c9255c7629de9d969..696bc6357e01c24eb76dd6b16b653133252be2ed 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/TextConsoleViewerTest.java @@ -224,23 +224,6 @@ public class TextConsoleViewerTest extends AbstractDebugTest { // if this happened the method may have be renamed or moved throw e; } - finally { - if (colorR != null) { - colorR.dispose(); - } - if (colorG != null) { - colorG.dispose(); - } - if (colorB != null) { - colorB.dispose(); - } - if (colorK != null) { - colorK.dispose(); - } - if (colorW != null) { - colorW.dispose(); - } - } } /** diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DebugTestModelPresentation.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DebugTestModelPresentation.java new file mode 100644 index 0000000000000000000000000000000000000000..110af5f13d634f6effa930ed045510dca5859d99 --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DebugTestModelPresentation.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.tests.viewer.model; + +import org.eclipse.debug.core.model.IValue; +import org.eclipse.debug.tests.breakpoint.TestBreakpoint; +import org.eclipse.debug.ui.IDebugModelPresentation; +import org.eclipse.debug.ui.IValueDetailListener; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.ui.IEditorInput; + +/** + * Model presentation to show the text attribute of {@link TestBreakpoint}s in + * Breakpoint View. + */ +public class DebugTestModelPresentation extends LabelProvider implements IDebugModelPresentation { + + @Override + public String getText(Object element) { + if (element instanceof TestBreakpoint) { + return "TestBreakpoint: " + ((TestBreakpoint) element).getText(); + } + return super.getText(element); + } + + @Override + public IEditorInput getEditorInput(Object element) { + return null; + } + + @Override + public String getEditorId(IEditorInput input, Object element) { + return null; + } + + @Override + public void setAttribute(String attribute, Object value) { + } + + @Override + public void computeDetail(IValue value, IValueDetailListener listener) { + listener.detailComputed(value, null); + } + +} \ No newline at end of file diff --git a/org.eclipse.debug.ui/META-INF/MANIFEST.MF b/org.eclipse.debug.ui/META-INF/MANIFEST.MF index c5d38b2783a1702f716f6d7467889f71a9ec9c11..4a6347647d6b53ffda9b04e6d154101029bcd305 100644 --- a/org.eclipse.debug.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.debug.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.debug.ui; singleton:=true -Bundle-Version: 3.14.500.qualifier +Bundle-Version: 3.14.600.qualifier Bundle-Activator: org.eclipse.debug.internal.ui.DebugUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/org.eclipse.debug.ui/forceQualifierUpdate.txt b/org.eclipse.debug.ui/forceQualifierUpdate.txt index bdcfb9f5f93bc64b777ee9922ff1152b35667db5..0ba44bccc130e68a2eabed1e46d0e96692e4c3b8 100644 --- a/org.eclipse.debug.ui/forceQualifierUpdate.txt +++ b/org.eclipse.debug.ui/forceQualifierUpdate.txt @@ -1,3 +1,4 @@ # To force a version qualifier update add the bug here Bug 509973 - Comparator errors in I20170105-0320 -Bug 534597 - Unanticipated comparator errors in I20180511-2000 \ No newline at end of file +Bug 534597 - Unanticipated comparator errors in I20180511-2000 +Bug 566471 - I20200828-0150 - Comparator Errors Found \ No newline at end of file diff --git a/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif b/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif deleted file mode 100644 index f529c5a4225f47f76e0fc6a19ef9160c3eee6f0d..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/breakpoint_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif deleted file mode 100644 index ac5431fa311bc030ee3ed411a1d9db9915fe6397..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/debug_persp.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif b/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif deleted file mode 100644 index ac5431fa311bc030ee3ed411a1d9db9915fe6397..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/debug_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/details_view.gif b/org.eclipse.debug.ui/icons/full/eview16/details_view.gif deleted file mode 100644 index c81630a08081ef028834e42594bfd40bb98f88c1..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/details_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif b/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif deleted file mode 100644 index 7ce1112834c586412a98acd9d1d42258cfd7b4f8..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/memory_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/module_view.gif b/org.eclipse.debug.ui/icons/full/eview16/module_view.gif deleted file mode 100644 index cb55e33b5ebaed988a88b859aaf3be8b600201cb..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/module_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/register_view.gif b/org.eclipse.debug.ui/icons/full/eview16/register_view.gif deleted file mode 100644 index 7134210d0a6153361dc40ae589fd73f20059d819..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/register_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif b/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif deleted file mode 100644 index e35f594d88c44de815d13639ab5f9b1cbaab70a1..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/variable_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif b/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif deleted file mode 100644 index c55cb5842e2a23ecbbcc093e63e726b0fb71da19..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/eview16/watchlist_view.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif b/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif deleted file mode 100644 index f1e585bdf727a4a0c6b99516d0eacb6dff499214..0000000000000000000000000000000000000000 Binary files a/org.eclipse.debug.ui/icons/full/obj16/stckframe_obj.gif and /dev/null differ diff --git a/org.eclipse.debug.ui/plugin.properties b/org.eclipse.debug.ui/plugin.properties index d8b1dc8f5fe409de03a04e7d3e46c9ab2d762f1b..618f41d4f9b5e73d0ba1487d887bed1ea99ee9f5 100644 --- a/org.eclipse.debug.ui/plugin.properties +++ b/org.eclipse.debug.ui/plugin.properties @@ -200,6 +200,9 @@ ActionContext.breakpointsview.description=The breakpoints view context ActionDefinition.eof.name= EOF ActionDefinition.eof.description= Send end of file +ActionDefinition.clear.name=Clear Console +ActionDefinition.clear.description=Clear Console + ActionDefinition.addMemoryBlock.name= Add Memory Block ActionDefinition.addMemoryBlock.description=Add memory block diff --git a/org.eclipse.debug.ui/plugin.xml b/org.eclipse.debug.ui/plugin.xml index c06fdbfeb0e6301edc6cd9b02557fbbc8acd8494..184ad060857218b501a92c1311b4e0dfbe3c55ac 100644 --- a/org.eclipse.debug.ui/plugin.xml +++ b/org.eclipse.debug.ui/plugin.xml @@ -1989,21 +1989,27 @@ M4 = Platform-specific fourth key categoryId="org.eclipse.debug.ui.category.run" id="org.eclipse.debug.ui.commands.ToggleMethodBreakpoint"> </command> -<!-- console --> +<!-- console --> <command name="%ActionDefinition.eof.name" categoryId="org.eclipse.debug.ui.category.run" description="%ActionDefinition.eof.description" id="org.eclipse.debug.ui.commands.eof"> </command> + <command + name="%ActionDefinition.clear.name" + categoryId="org.eclipse.debug.ui.category.run" + description="%ActionDefinition.clear.description" + id="org.eclipse.debug.ui.commands.console.clear"> + </command> <!-- Memory View --> <command categoryId="org.eclipse.debug.ui.category.run" description="%ActionDefinition.addMemoryBlock.description" id="org.eclipse.debug.ui.commands.addMemoryMonitor" - name="%ActionDefinition.addMemoryBlock.name"/> + name="%ActionDefinition.addMemoryBlock.name"/> <!-- views --> -<!-- Perspective --> +<!-- Perspective --> <command name="%DebugPerspective.name" description="%command.openDebugPerspective.description" diff --git a/org.eclipse.debug.ui/pom.xml b/org.eclipse.debug.ui/pom.xml index f17774ebfd08b1cdf9c84e64b4dfbf587f986d8b..22d6fbf2174e1bc2060c597fdcb42733b0c5affb 100644 --- a/org.eclipse.debug.ui/pom.xml +++ b/org.eclipse.debug.ui/pom.xml @@ -15,11 +15,11 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.debug</groupId> <artifactId>org.eclipse.debug.ui</artifactId> - <version>3.14.500-SNAPSHOT</version> + <version>3.14.600-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> <properties> <code.ignoredWarnings>-warn:+resource,-deprecation,unavoidableGenericProblems</code.ignoredWarnings> diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java index 7f234f4e62bfa98b0b5cbb2bb983e081473a8580..084aa4863d48542c1b1dbedb8a12c7ece0055432 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugListSelectionDialog.java @@ -14,12 +14,8 @@ package org.eclipse.debug.internal.ui; import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; @@ -57,18 +53,10 @@ public abstract class AbstractDebugListSelectionDialog extends AbstractDebugSele @Override protected void addViewerListeners(StructuredViewer viewer) { - viewer.addSelectionChangedListener(new ISelectionChangedListener(){ - @Override - public void selectionChanged(SelectionChangedEvent event) { - getButton(IDialogConstants.OK_ID).setEnabled(isValid()); - } - }); - viewer.addDoubleClickListener(new IDoubleClickListener(){ - @Override - public void doubleClick(DoubleClickEvent event) { - if (isValid()){ - okPressed(); - } + viewer.addSelectionChangedListener(event -> getButton(IDialogConstants.OK_ID).setEnabled(isValid())); + viewer.addDoubleClickListener(event -> { + if (isValid()){ + okPressed(); } }); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java index 14af785268f177e1bb1c1840fb0b7fa5686b2a2d..d31bf634c066d5f19942851789bc18698713ab75 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/AbstractDebugSelectionDialog.java @@ -88,7 +88,7 @@ public abstract class AbstractDebugSelectionDialog extends SelectionDialog { */ protected IContentProvider getContentProvider() { //by default return a simple array content provider - return new ArrayContentProvider(); + return ArrayContentProvider.getInstance(); } /** diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java index 4095e260acbe6d0b462d35b888909dde59d46b93..9dc8f62f3b4ca90c6b05b59d0350d0ac5136513e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/DebugUIPlugin.java @@ -263,7 +263,7 @@ public class DebugUIPlugin extends AbstractUIPlugin implements ILaunchListener, /** * Prints the given message to System.out or to the OSGi tracing (if started) - * + * * @param option the option or <code>null</code> * @param message the message to print or <code>null</code> * @param throwable the {@link Throwable} or <code>null</code> diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java index c9e2932f4b4e76185922aee801f043ba09c4dd14..5e3092622c0044079658ab0223484bb501893b52 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/MultipleInputDialog.java @@ -25,12 +25,8 @@ import org.eclipse.debug.ui.StringVariableSelectionDialog; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -151,12 +147,7 @@ public class MultipleInputDialog extends Dialog { return !text.getText().equals(IInternalDebugCoreConstants.EMPTY_STRING); } }); - text.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validateFields(); - } - }); + text.addModifyListener(e -> validateFields()); } controlList.add(text); @@ -195,12 +186,7 @@ public class MultipleInputDialog extends Dialog { } }); - text.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validateFields(); - } - }); + text.addModifyListener(e -> validateFields()); } Button button = createButton(comp, IDialogConstants.IGNORE_ID, DebugUIMessages.MultipleInputDialog_6, false); @@ -262,12 +248,7 @@ public class MultipleInputDialog extends Dialog { } }); - text.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validateFields(); - } - }); + text.addModifyListener(e -> validateFields()); } Button button = createButton(comp, IDialogConstants.IGNORE_ID, DebugUIMessages.MultipleInputDialog_8, false); @@ -304,12 +285,9 @@ public class MultipleInputDialog extends Dialog { text.setLayoutData(gd); text.setData(FIELD_NAME, labelText); - text.addTraverseListener(new TraverseListener () { - @Override - public void keyTraversed(TraverseEvent e) { - if(e.detail == SWT.TRAVERSE_RETURN && e.stateMask == SWT.SHIFT) { - e.doit = true; - } + text.addTraverseListener(e -> { + if(e.detail == SWT.TRAVERSE_RETURN && e.stateMask == SWT.SHIFT) { + e.doit = true; } }); @@ -328,12 +306,7 @@ public class MultipleInputDialog extends Dialog { } }); - text.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validateFields(); - } - }); + text.addModifyListener(e -> validateFields()); } Composite comp = SWTFactory.createComposite(panel, panel.getFont(), 1, 2, GridData.HORIZONTAL_ALIGN_END); GridLayout ld = (GridLayout)comp.getLayout(); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java index 26a3730e93112e6ef6b003cf6fce243fabf5dd83..49df424dcd125ac288e3df70ee57b574187be43e 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/GroupBreakpointsByDialog.java @@ -27,15 +27,11 @@ import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; @@ -186,18 +182,8 @@ public class GroupBreakpointsByDialog extends TrayDialog { Table table = fAvailableViewer.getTable(); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setFont(parent.getFont()); - fAvailableViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - handleAddPressed(); - } - }); - fAvailableViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - updateAddButton(); - } - }); + fAvailableViewer.addDoubleClickListener(event -> handleAddPressed()); + fAvailableViewer.addSelectionChangedListener(event -> updateAddButton()); } /** @@ -229,18 +215,8 @@ public class GroupBreakpointsByDialog extends TrayDialog { Tree tree = fSelectedViewer.getTree(); tree.setLayoutData(new GridData(GridData.FILL_BOTH)); tree.setFont(parent.getFont()); - fSelectedViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - handleRemovePressed(); - } - }); - fSelectedViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - updateSelectedButtons(); - } - }); + fSelectedViewer.addDoubleClickListener(event -> handleRemovePressed()); + fSelectedViewer.addSelectionChangedListener(event -> updateSelectedButtons()); } public void createButtons(Composite parent) { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java index 41505f3ff6a0a33dbfad7242e58b30ab8ba5b2a3..a573edaf4d74377b9a32838ab7e3a01016768ba0 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpointGroups/SelectBreakpointWorkingsetDialog.java @@ -20,9 +20,7 @@ import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.IDebugHelpContextIds; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; -import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkingSet; @@ -52,12 +50,9 @@ public class SelectBreakpointWorkingsetDialog extends AbstractDebugCheckboxSelec protected void addViewerListeners(StructuredViewer viewer) { CheckboxTableViewer checkViewer = getCheckBoxTableViewer(); if (checkViewer != null){ - checkViewer.addCheckStateListener(new ICheckStateListener(){ - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - getCheckBoxTableViewer().setCheckedElements(new Object[] {event.getElement()}); - getButton(IDialogConstants.OK_ID).setEnabled(true); - } + checkViewer.addCheckStateListener(event -> { + getCheckBoxTableViewer().setCheckedElements(new Object[] {event.getElement()}); + getButton(IDialogConstants.OK_ID).setEnabled(true); }); } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java index e2aeb3b70911059e532a67714910de6593d3c1fa..f75ee9379e2ad5255df76e1b1c5943a07e9cc37d 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/breakpoints/RemoveBreakpointAction.java @@ -60,92 +60,89 @@ public class RemoveBreakpointAction extends AbstractSelectionActionDelegate { } final Iterator<?> itr = selection.iterator(); final CoreException[] exception= new CoreException[1]; - IWorkspaceRunnable runnable= new IWorkspaceRunnable() { - @Override - public void run(IProgressMonitor monitor) { - Set<IBreakpoint> breakpointsToDelete = new LinkedHashSet<>(); - ArrayList<IWorkingSet> groupsToDelete = new ArrayList<>(); - boolean deleteAll = false; - boolean deleteContainer = false; - boolean prompted = false; - while (itr.hasNext()) { - Object next= itr.next(); - IBreakpoint breakpoint = (IBreakpoint)DebugPlugin.getAdapter(next, IBreakpoint.class); - if (breakpoint != null) { - breakpointsToDelete.add(breakpoint); - } else if (next instanceof IBreakpointContainer) { - //the the container is a workingset, ask if they want to delete it as well - IBreakpointContainer bpc = (IBreakpointContainer) next; - if(bpc.getCategory() instanceof WorkingSetCategory) { - IWorkingSet set = ((WorkingSetCategory)bpc.getCategory()).getWorkingSet(); - if(!prompted) { - prompted = true; - DeleteWorkingsetsMessageDialog dialog = new DeleteWorkingsetsMessageDialog(getView().getSite().getShell(), - ActionMessages.RemoveBreakpointAction_3, - null, - ActionMessages.RemoveBreakpointAction_4, - MessageDialog.QUESTION, - new String[] {ActionMessages.RemoveBreakpointAction_5, ActionMessages.RemoveBreakpointAction_6}, - 0); - if (dialog.open() == Window.CANCEL) { - return; - } - deleteAll = dialog.deleteAllBreakpoints(); - deleteContainer = dialog.deleteWorkingset(); - } - if(deleteContainer) { - groupsToDelete.add(set); + IWorkspaceRunnable runnable= monitor -> { + Set<IBreakpoint> breakpointsToDelete = new LinkedHashSet<>(); + ArrayList<IWorkingSet> groupsToDelete = new ArrayList<>(); + boolean deleteAll = false; + boolean deleteContainer = false; + boolean prompted = false; + while (itr.hasNext()) { + Object next= itr.next(); + IBreakpoint breakpoint = (IBreakpoint)DebugPlugin.getAdapter(next, IBreakpoint.class); + if (breakpoint != null) { + breakpointsToDelete.add(breakpoint); + } else if (next instanceof IBreakpointContainer) { + //the the container is a workingset, ask if they want to delete it as well + IBreakpointContainer bpc = (IBreakpointContainer) next; + if(bpc.getCategory() instanceof WorkingSetCategory) { + IWorkingSet set = ((WorkingSetCategory)bpc.getCategory()).getWorkingSet(); + if(!prompted) { + prompted = true; + DeleteWorkingsetsMessageDialog dialog = new DeleteWorkingsetsMessageDialog(getView().getSite().getShell(), + ActionMessages.RemoveBreakpointAction_3, + null, + ActionMessages.RemoveBreakpointAction_4, + MessageDialog.QUESTION, + new String[] {ActionMessages.RemoveBreakpointAction_5, ActionMessages.RemoveBreakpointAction_6}, + 0); + if (dialog.open() == Window.CANCEL) { + return; } + deleteAll = dialog.deleteAllBreakpoints(); + deleteContainer = dialog.deleteWorkingset(); } - else { - if(!prompted) { - IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore(); - prompted = store.getBoolean(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER); - if(prompted) { - MessageDialogWithToggle mdwt = MessageDialogWithToggle.openYesNoQuestion(getView().getSite().getShell(), ActionMessages.RemoveBreakpointAction_0, - ActionMessages.RemoveBreakpointAction_1, ActionMessages.RemoveAllBreakpointsAction_3, !prompted, null, null); - if(mdwt.getReturnCode() == IDialogConstants.NO_ID) { - deleteAll = false; - } - else { - store.setValue(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER, !mdwt.getToggleState()); - deleteAll = true; - } + if(deleteContainer) { + groupsToDelete.add(set); + } + } + else { + if(!prompted) { + IPreferenceStore store = DebugUIPlugin.getDefault().getPreferenceStore(); + prompted = store.getBoolean(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER); + if(prompted) { + MessageDialogWithToggle mdwt = MessageDialogWithToggle.openYesNoQuestion(getView().getSite().getShell(), ActionMessages.RemoveBreakpointAction_0, + ActionMessages.RemoveBreakpointAction_1, ActionMessages.RemoveAllBreakpointsAction_3, !prompted, null, null); + if(mdwt.getReturnCode() == IDialogConstants.NO_ID) { + deleteAll = false; } else { - deleteAll = !prompted; + store.setValue(IDebugPreferenceConstants.PREF_PROMPT_REMOVE_BREAKPOINTS_FROM_CONTAINER, !mdwt.getToggleState()); + deleteAll = true; } } - } - if(deleteAll) { - IBreakpoint[] breakpoints = bpc.getBreakpoints(); - Collections.addAll(breakpointsToDelete, breakpoints); + else { + deleteAll = !prompted; + } } } + if(deleteAll) { + IBreakpoint[] breakpoints1 = bpc.getBreakpoints(); + Collections.addAll(breakpointsToDelete, breakpoints1); + } } - final IBreakpoint[] breakpoints = breakpointsToDelete.toArray(new IBreakpoint[0]); - final IWorkingSet[] sets = groupsToDelete.toArray(new IWorkingSet[groupsToDelete.size()]); - if(breakpoints.length > 0) { - ((BreakpointsView)getView()).preserveSelection(getSelection()); - } - new Job(ActionMessages.RemoveBreakpointAction_2) { - @Override - protected IStatus run(IProgressMonitor pmonitor) { - try { - Shell shell= getView() != null ? getView().getSite().getShell() : null; - DebugUITools.deleteBreakpoints(breakpoints, shell, pmonitor); + } + final IBreakpoint[] breakpoints2 = breakpointsToDelete.toArray(new IBreakpoint[0]); + final IWorkingSet[] sets = groupsToDelete.toArray(new IWorkingSet[groupsToDelete.size()]); + if(breakpoints2.length > 0) { + ((BreakpointsView)getView()).preserveSelection(getSelection()); + } + new Job(ActionMessages.RemoveBreakpointAction_2) { + @Override + protected IStatus run(IProgressMonitor pmonitor) { + try { + Shell shell= getView() != null ? getView().getSite().getShell() : null; + DebugUITools.deleteBreakpoints(breakpoints2, shell, pmonitor); - for (IWorkingSet set : sets) { - PlatformUI.getWorkbench().getWorkingSetManager().removeWorkingSet(set); - } - return Status.OK_STATUS; - } catch (CoreException e) { - DebugUIPlugin.log(e); + for (IWorkingSet set : sets) { + PlatformUI.getWorkbench().getWorkingSetManager().removeWorkingSet(set); } - return Status.CANCEL_STATUS; + return Status.OK_STATUS; + } catch (CoreException e) { + DebugUIPlugin.log(e); } - }.schedule(); - } + return Status.CANCEL_STATUS; + } + }.schedule(); }; try { ResourcesPlugin.getWorkspace().run(runnable, null, 0, null); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java index a23e15e3ccc75e195521cfe3d8fdf37ebb569cd3..548245b87b18ef797fcd1742bd31712d37e1613b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchExpressionDialog.java @@ -21,8 +21,6 @@ import org.eclipse.debug.core.model.IWatchExpression; import org.eclipse.debug.internal.ui.IDebugHelpContextIds; import org.eclipse.debug.internal.ui.actions.ActionMessages; import org.eclipse.debug.internal.ui.actions.StatusInfo; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.bindings.keys.IKeyLookup; import org.eclipse.jface.bindings.keys.KeyLookupFactory; @@ -149,13 +147,10 @@ public class WatchExpressionDialog extends StatusDialog { menuManager.add(cutAction); menuManager.add(copyAction); menuManager.add(pasteAction); - menuManager.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) { - cutAction.update(); - copyAction.update(); - pasteAction.update(); - } + menuManager.addMenuListener(manager -> { + cutAction.update(); + copyAction.update(); + pasteAction.update(); }); Menu menu = menuManager.createContextMenu(fSnippetViewer.getTextWidget()); fSnippetViewer.getTextWidget().setMenu(menu); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java index 89c697c28fbd4f497e62226b6c6ac9df2973a6a5..4aa3b7e61dbdfca2126fb144d3666657dc2b1663 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueAction.java @@ -31,7 +31,6 @@ import org.eclipse.debug.internal.ui.actions.ActionMessages; import org.eclipse.debug.internal.ui.views.variables.VariablesView; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.debug.ui.actions.IVariableValueEditor; -import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Shell; @@ -126,21 +125,15 @@ public class ChangeVariableValueAction extends SelectionProviderAction { DebugUIPlugin.errorDialog(shell, ActionMessages.ChangeVariableValue_errorDialogTitle,ActionMessages.ChangeVariableValue_errorDialogMessage, exception); // return; } - ChangeVariableValueInputDialog inputDialog = new ChangeVariableValueInputDialog(shell, ActionMessages.ChangeVariableValue_1, MessageFormat.format(ActionMessages.ChangeVariableValue_2, new Object[] { name }), value, new IInputValidator() { // - /** - * Returns an error string if the input is invalid - */ - @Override - public String isValid(String input) { - try { - if (fVariable.verifyValue(input)) { - return null; // null means valid - } - } catch (DebugException exception) { - return ActionMessages.ChangeVariableValue_3; + ChangeVariableValueInputDialog inputDialog = new ChangeVariableValueInputDialog(shell, ActionMessages.ChangeVariableValue_1, MessageFormat.format(ActionMessages.ChangeVariableValue_2, new Object[] { name }), value, input -> { + try { + if (fVariable.verifyValue(input)) { + return null; // null means valid } - return ActionMessages.ChangeVariableValue_4; + } catch (DebugException exception) { + return ActionMessages.ChangeVariableValue_3; } + return ActionMessages.ChangeVariableValue_4; }); inputDialog.open(); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java index 081a4a43a8e51528d7473931381ce8395ede1f02..fdd3f2feaf0a789eda56e2d67f990174525e0d11 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/ChangeVariableValueInputDialog.java @@ -21,8 +21,6 @@ import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; @@ -161,16 +159,13 @@ public class ChangeVariableValueInputDialog extends TrayDialog { text.setLayoutData(gridData); text.setFont(font); text.addModifyListener( - new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - if (okButton.isEnabled()) { - return; - } - errorMessageLabel.setText(IInternalDebugCoreConstants.EMPTY_STRING); - errorMessageLabel.getParent().update(); - okButton.setEnabled(true); + e -> { + if (okButton.isEnabled()) { + return; } + errorMessageLabel.setText(IInternalDebugCoreConstants.EMPTY_STRING); + errorMessageLabel.getParent().update(); + okButton.setEnabled(true); } ); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java index 7778425fed507a8d1b7a7291a33de27ea654bea9..bcf843595f90f11c03c454acce7baee4d4092883 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/variables/details/DetailPaneMaxLengthDialog.java @@ -23,8 +23,6 @@ import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; @@ -57,21 +55,17 @@ public class DetailPaneMaxLengthDialog extends TrayDialog { super(parent); setShellStyle(getShellStyle() | SWT.RESIZE); fValue = Integer.toString(DebugUIPlugin.getDefault().getPreferenceStore().getInt(IDebugUIConstants.PREF_MAX_DETAIL_LENGTH)); - fValidator = new IInputValidator() { - @Override - public String isValid(String newText) { - try { - int num = Integer.parseInt(newText); - if (num < 0) { - return VariablesViewMessages.DetailPaneMaxLengthDialog_2; - } - } catch (NumberFormatException e) { - return VariablesViewMessages.DetailPaneMaxLengthDialog_3; - } - return null; - } - - }; + fValidator = newText -> { + try { + int num = Integer.parseInt(newText); + if (num < 0) { + return VariablesViewMessages.DetailPaneMaxLengthDialog_2; + } + } catch (NumberFormatException e) { + return VariablesViewMessages.DetailPaneMaxLengthDialog_3; + } + return null; + }; } @Override @@ -104,12 +98,9 @@ public class DetailPaneMaxLengthDialog extends TrayDialog { fTextWidget = new Text(composite, SWT.SINGLE | SWT.BORDER); fTextWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); fTextWidget.setText(fValue); - fTextWidget.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - validateInput(); - fValue = fTextWidget.getText(); - } + fTextWidget.addModifyListener(e -> { + validateInput(); + fValue = fTextWidget.getText(); }); fErrorTextWidget = new Text(composite, SWT.READ_ONLY); fErrorTextWidget.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java index 8a4d9b69871300d3154e68ce9220b77bae6dd7e5..730c7f8fd86f413146048e32339e6ec13d100899 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/CommonTabLite.java @@ -48,9 +48,7 @@ import org.eclipse.debug.ui.ILaunchGroup; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; -import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; @@ -58,7 +56,6 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.AccessibleAdapter; import org.eclipse.swt.accessibility.AccessibleEvent; -import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -111,12 +108,7 @@ class CommonTabLite extends AbstractLaunchConfigurationTab { /** * Modify listener that simply updates the owning launch configuration dialog. */ - private ModifyListener fBasicModifyListener = new ModifyListener() { - @Override - public void modifyText(ModifyEvent evt) { - updateLaunchConfigurationDialog(); - } - }; + private ModifyListener fBasicModifyListener = evt -> updateLaunchConfigurationDialog(); @Override public void createControl(Composite parent) { @@ -144,12 +136,7 @@ class CommonTabLite extends AbstractLaunchConfigurationTab { table.setFont(parent.getFont()); fFavoritesTable.setContentProvider(new FavoritesContentProvider()); fFavoritesTable.setLabelProvider(new FavoritesLabelProvider()); - fFavoritesTable.addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - updateLaunchConfigurationDialog(); - } - }); + fFavoritesTable.addCheckStateListener(event -> updateLaunchConfigurationDialog()); } /** diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java index 4a55978f0d1a98c02410287d130fe98d0cc3e1b6..0ff1d19cf49ebc95c6c6fc1ed71a895b308f5c8a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/groups/GroupLaunchConfigurationSelectionDialog.java @@ -50,8 +50,6 @@ import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; @@ -257,21 +255,18 @@ class GroupLaunchConfigurationSelectionDialog extends TitleAreaDialog implements fActionParamLabel = new Label(comp, SWT.NONE); fActionParamWidget = new Text(comp, SWT.SINGLE | SWT.BORDER); GridDataFactory.fillDefaults().applyTo(fActionParamWidget); - fActionParamWidget.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - String text = ((Text) e.widget).getText(); - if (action == GroupElementPostLaunchAction.DELAY) { - try { - actionParam = Integer.valueOf(text); - } catch (NumberFormatException exc) { - actionParam = null; - } - } else if (action == GroupElementPostLaunchAction.OUTPUT_REGEXP) { - actionParam = text; + fActionParamWidget.addModifyListener(e -> { + String text = ((Text) e.widget).getText(); + if (action == GroupElementPostLaunchAction.DELAY) { + try { + actionParam = Integer.valueOf(text); + } catch (NumberFormatException exc) { + actionParam = null; } - validate(); + } else if (action == GroupElementPostLaunchAction.OUTPUT_REGEXP) { + actionParam = text; } + validate(); }); if (actionParam instanceof Integer) { fActionParamWidget.setText(((Integer) actionParam).toString()); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java index a0086d77dbde08ad6093ad7c112e04ea1bc0f610..8d9940f0bc2c5a27f6e4ec3b5f88449c8300a48a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/hover/ExpressionInformationControlCreator.java @@ -195,7 +195,7 @@ public class ExpressionInformationControlCreator implements IInformationControlC private IDialogSettings getDialogSettings(boolean create) { IDialogSettings settings = DebugUIPlugin.getDefault().getDialogSettings(); IDialogSettings section = settings.getSection(this.getClass().getName()); - if (section == null & create) { + if (section == null && create) { section = settings.addNewSection(this.getClass().getName()); } return section; diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java index 4e21e81157d4ab8b513e198fb8397c751b0cb231..137c02397d8439f8acdce80dc487e023510331ba 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java @@ -35,7 +35,6 @@ import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView; import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.debug.ui.IDebugUIConstants; -import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; @@ -62,12 +61,7 @@ public class EmbeddedBreakpointsViewer { private BreakpointsContentProvider fProvider = null; private Tree fTree = null; private BreakpointsViewer fViewer = null; - private ICheckStateListener fCheckListener = new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - updateCheckedState(event.getElement(), event.getChecked()); - } - }; + private ICheckStateListener fCheckListener = event -> updateCheckedState(event.getElement(), event.getChecked()); /** * This constructor allows a specific selection to be used in stead of the default diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java index 57e7c6a7d6564454fce621bc095115db11471779..2b9d737ad2d0d9e75da031717fc107e93b8c8c33 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardExportBreakpointsPage.java @@ -34,8 +34,6 @@ import org.eclipse.debug.ui.actions.ExportBreakpointsOperation; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.CheckStateChangedEvent; -import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; @@ -173,12 +171,7 @@ public class WizardExportBreakpointsPage extends WizardPage implements Listener Composite composite = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH); SWTFactory.createLabel(composite, ImportExportMessages.WizardExportBreakpointsPage_2, 1); fTView = new EmbeddedBreakpointsViewer(composite, DebugPlugin.getDefault().getBreakpointManager(), fSelection); - fTView.getViewer().addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - setPageComplete(detectPageComplete()); - } - }); + fTView.getViewer().addCheckStateListener(event -> setPageComplete(detectPageComplete())); fTView.getViewer().setSelection(fSelection); //ensure we can see the beginning check-boxes etc. (bug 180971) //this will not work in Windows Vista as there is no way to over-ride the default viewer item showing policy diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java index fba1257bb9354c06ffeeb272cb807ff5f1313412..b63dd42482bec9281c150fcff3614db0f5695adb 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/WizardImportBreakpointsSelectionPage.java @@ -29,7 +29,6 @@ import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointContainer; import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.actions.ImportBreakpointsOperation; -import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProvider; @@ -54,12 +53,7 @@ public class WizardImportBreakpointsSelectionPage extends WizardPage implements private Button fSelectAll = null; private Button fDeselectAll = null; - private ICheckStateListener fImportCheckListener = new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - updateCheckedState(event.getChecked()); - } - }; + private ICheckStateListener fImportCheckListener = event -> updateCheckedState(event.getChecked()); protected WizardImportBreakpointsSelectionPage(String pageName) { super(pageName, ImportExportMessages.WizardImportBreakpointsSelectionPage_2, null); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java index 378ab54a8edff63c679672b8bfd3b5fc6e086ad8..7465864eeb1b5737af97603c3f43060ac5e4fb9a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ExportLaunchConfigurationsWizardPage.java @@ -254,8 +254,8 @@ public class ExportLaunchConfigurationsWizardPage extends WizardPage { onechecked = true; } } - fViewer.setGrayed(parent, onechecked & !checked); - fViewer.setChecked(parent, checked | onechecked); + fViewer.setGrayed(parent, onechecked && !checked); + fViewer.setChecked(parent, checked || onechecked); } } @@ -366,7 +366,7 @@ public class ExportLaunchConfigurationsWizardPage extends WizardPage { errors.add(new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), MessageFormat.format(WizardMessages.ExportLaunchConfigurationsWizardPage_19, new Object[] { launchConfig.getName() }), null)); } else { newfile = new File(destpath.append(file.getName()).toOSString()); - if(newfile.exists() & !overwrite) { + if(newfile.exists() && !overwrite) { if(nowall) { continue; } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java index bd62dc8ea33b766301764b29206052aaf49c9387..aa77749bfda9dc77cb4951267dfe83ff204d7a44 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/launchconfigurations/ImportLaunchConfigurationsWizardPage.java @@ -174,7 +174,7 @@ public class ImportLaunchConfigurationsWizardPage extends WizardResourceImportPa for (Object resource : getSelectedResources()) { config = (File) ((DebugFileSystemElement) resource).getFileSystemObject(); newconfig = new File(new Path(LaunchManager.LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH.toOSString()).append(config.getName()).toOSString()); - if(newconfig.exists() & !overwrite) { + if(newconfig.exists() && !overwrite) { if(nowall) { continue; } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java index a4ca54ce5eee8162733d80d1a1884b37dbb8c328..5f66d2719ec5fc4291a01809f0133e9a50340daf 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/FavoritesDialog.java @@ -37,7 +37,6 @@ import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; @@ -99,12 +98,7 @@ public class FavoritesDialog extends TrayDialog { /** * Listener that delegates when the selection changes in a table */ - private ISelectionChangedListener fSelectionChangedListener= new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - handleFavoriteSelectionChanged(); - } - }; + private ISelectionChangedListener fSelectionChangedListener= event -> handleFavoriteSelectionChanged(); /** * Listener that delegates when a key is pressed in a table diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java index 3a80b7724ac8746c7d278e03400c0c59313a2eb1..f064ec2af7b3ab67a9cb610a97857bea71c5b1ca 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationComparator.java @@ -15,7 +15,6 @@ package org.eclipse.debug.internal.ui.launchConfigurations; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -66,14 +65,10 @@ public class LaunchConfigurationComparator extends WorkbenchViewerComparator { if (fgCategories == null) { fgCategories = new HashMap<>(); List<ILaunchConfigurationType> types = Arrays.asList(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationTypes()); - Collections.sort(types, new Comparator<ILaunchConfigurationType>() { - @Override - public int compare(ILaunchConfigurationType o1, ILaunchConfigurationType o2) { - ILaunchConfigurationType t1 = o1; - ILaunchConfigurationType t2 = o2; - return t1.getName().compareTo(t2.getName()); - } - + Collections.sort(types, (o1, o2) -> { + ILaunchConfigurationType t1 = o1; + ILaunchConfigurationType t2 = o2; + return t1.getName().compareTo(t2.getName()); }); Iterator<ILaunchConfigurationType> iterator = types.iterator(); int i = 0; diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java index f916fef0d84672c40c2093f40134700e7b444fe3..be47357952f6ae3858f1b7213d57aa82f9f297e2 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationFilteredTree.java @@ -32,7 +32,6 @@ import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.HelpEvent; -import org.eclipse.swt.events.HelpListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.FilteredTree; @@ -87,12 +86,7 @@ public final class LaunchConfigurationFilteredTree extends FilteredTree { treeViewer.addFilter(filter); } } - treeViewer.getControl().addHelpListener(new HelpListener() { - @Override - public void helpRequested(HelpEvent evt) { - handleHelpRequest(evt); - } - }); + treeViewer.getControl().addHelpListener(this::handleHelpRequest); return treeViewer; } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java index c056a43dd97a8a786f7260b5f0ea79ef2c12fc30..f7e750bf8158116b86e0e5d52f76a6c4a6f14e4b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationTabGroupViewer.java @@ -586,7 +586,8 @@ public class LaunchConfigurationTabGroupViewer { } else { fOptionsErrorLabel.setImage(null); } - fViewform.layout(true, true); + fOptionsLink.requestLayout(); + fOptionsErrorLabel.requestLayout(); } /** @@ -805,13 +806,14 @@ public class LaunchConfigurationTabGroupViewer { fApplyButton.setVisible(visible); fRevertButton.setVisible(visible); fOptionsLink.setVisible(visible); + StackLayout layout = (StackLayout)fTabPlaceHolder.getLayout(); if(visible) { - ((StackLayout)fTabPlaceHolder.getLayout()).topControl = fGroupComposite; + layout.topControl = fGroupComposite; } else { - ((StackLayout)fTabPlaceHolder.getLayout()).topControl = fGettingStarted; + layout.topControl = fGettingStarted; } - fTabPlaceHolder.layout(true, true); + layout.topControl.requestLayout(); } private void updateShowCommandLineVisibility(boolean visible) { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java index a9b491ca19ca7617f3790a0b93a5faabd7ef8286..58a92a2a49c377455bd5c617f97c749d4c98a686 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsDialog.java @@ -61,7 +61,6 @@ import org.eclipse.jface.operation.ModalContext; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; @@ -588,20 +587,17 @@ public class LaunchConfigurationsDialog extends TitleAreaDialog implements ILaun GridData gd = new GridData(GridData.FILL_BOTH); control.setLayoutData(gd); viewForm.setContent(viewFormContents); - AbstractLaunchConfigurationAction.IConfirmationRequestor requestor = new AbstractLaunchConfigurationAction.IConfirmationRequestor() { - @Override - public boolean getConfirmation() { - int status = shouldSaveCurrentConfig(); - if(status == IDialogConstants.YES_ID) { - fTabViewer.handleApplyPressed(); - return true; - } - else if(status == IDialogConstants.NO_ID) { - fTabViewer.handleRevertPressed(); - return true; - } - return false; + AbstractLaunchConfigurationAction.IConfirmationRequestor requestor = () -> { + int status = shouldSaveCurrentConfig(); + if(status == IDialogConstants.YES_ID) { + fTabViewer.handleApplyPressed(); + return true; } + else if(status == IDialogConstants.NO_ID) { + fTabViewer.handleRevertPressed(); + return true; + } + return false; }; getDuplicateAction().setConfirmationRequestor(requestor); getExportAction().setConfirmationRequestor(requestor); @@ -610,19 +606,16 @@ public class LaunchConfigurationsDialog extends TitleAreaDialog implements ILaun getLinkPrototypeAction().setConfirmationRequestor(requestor); getUnlinkPrototypeAction().setConfirmationRequestor(requestor); getResetWithPrototypeValuesAction().setConfirmationRequestor(requestor); - ((StructuredViewer) viewer).addPostSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - handleLaunchConfigurationSelectionChanged(event); - getNewAction().setEnabled(getNewAction().isEnabled()); - getNewPrototypeAction().setEnabled(getNewPrototypeAction().isEnabled()); - getDeleteAction().setEnabled(getDeleteAction().isEnabled()); - getExportAction().setEnabled(getExportAction().isEnabled()); - getDuplicateAction().setEnabled(getDuplicateAction().isEnabled()); - getLinkPrototypeAction().setEnabled(getLinkPrototypeAction().isEnabled()); - getUnlinkPrototypeAction().setEnabled(getUnlinkPrototypeAction().isEnabled()); - getResetWithPrototypeValuesAction().setEnabled(getResetWithPrototypeValuesAction().isEnabled()); - } + ((StructuredViewer) viewer).addPostSelectionChangedListener(event -> { + handleLaunchConfigurationSelectionChanged(event); + getNewAction().setEnabled(getNewAction().isEnabled()); + getNewPrototypeAction().setEnabled(getNewPrototypeAction().isEnabled()); + getDeleteAction().setEnabled(getDeleteAction().isEnabled()); + getExportAction().setEnabled(getExportAction().isEnabled()); + getDuplicateAction().setEnabled(getDuplicateAction().isEnabled()); + getLinkPrototypeAction().setEnabled(getLinkPrototypeAction().isEnabled()); + getUnlinkPrototypeAction().setEnabled(getUnlinkPrototypeAction().isEnabled()); + getResetWithPrototypeValuesAction().setEnabled(getResetWithPrototypeValuesAction().isEnabled()); }); return comp; } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties index dbabd94cf43ab9affd68217da5bf032acdc94d48..9361e7b52501923a67f3d533709322f9c17afbcb 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationsMessages.properties @@ -253,7 +253,7 @@ OrganizeFavoritesAction_0=Organize Fa&vorites... PerspectiveManager_12=Confirm Perspective Switch PerspectiveManager_13=This kind of launch is configured to open the {0} perspective when it suspends. Do you want to switch to this perspective now? PerspectiveManager_15=This kind of launch is associated with the {0} perspective. Do you want to switch to this perspective now? -PerspectiveManager_suspend_description=This kind of launch is configured to open the {0} perspective when it suspends.\n\n{1}\n\nDo you want to switch to this perspective now? +PerspectiveManager_suspend_description=This kind of launch is configured to open the {0} perspective when it suspends.\n\n{1}\n\nSwitch to this perspective? PerspectiveManager_launch_description=This kind of launch is associated with the {0} perspective.\n\n{1}\n\nDo you want to switch to this perspective now? PerspectiveManager_switch=&Switch diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java index bce24bd6a4ff15a54fe8d1f236875242e5d8ee0f..8b4e3705e963eb2cf821a769bd1d44d6e6c3dd10 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchShortcutSelectionDialog.java @@ -25,9 +25,7 @@ import org.eclipse.debug.internal.ui.IDebugHelpContextIds; import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; @@ -89,15 +87,12 @@ public class LaunchShortcutSelectionDialog extends AbstractDebugListSelectionDia @Override protected void addViewerListeners(StructuredViewer viewer) { super.addViewerListeners(viewer); - viewer.addSelectionChangedListener(new ISelectionChangedListener(){ - @Override - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection selection = event.getStructuredSelection(); - if (!selection.isEmpty()) { - LaunchShortcutExtension shortcutSource = (LaunchShortcutExtension) selection.getFirstElement(); - String description = shortcutSource.getShortcutDescription(fMode); - fDescriptionText.setText((description == null ? LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_3 : description)); - } + viewer.addSelectionChangedListener(event -> { + IStructuredSelection selection = event.getStructuredSelection(); + if (!selection.isEmpty()) { + LaunchShortcutExtension shortcutSource = (LaunchShortcutExtension) selection.getFirstElement(); + String description = shortcutSource.getShortcutDescription(fMode); + fDescriptionText.setText((description == null ? LaunchConfigurationsMessages.LaunchShortcutSelectionDialog_3 : description)); } }); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java index 38350c96ae43768db26f2eda813c60cab87669bd..4cf54a11e1cfe8859891a22d2790e8e38ae2bd10 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SaveScopeResourcesHandler.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2017 IBM Corporation and others. + * Copyright (c) 2006, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -35,6 +35,7 @@ import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; @@ -49,7 +50,6 @@ import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.model.AdaptableList; import org.eclipse.ui.model.WorkbenchContentProvider; -import org.eclipse.ui.model.WorkbenchLabelProvider; /** * Status handler to prompt for saving of resources prior to launching. @@ -244,7 +244,7 @@ public class SaveScopeResourcesHandler implements IStatusHandler { ScopedResourcesSelectionDialog lsd = new ScopedResourcesSelectionDialog(DebugUIPlugin.getShell(), new AdaptableList(resources), new WorkbenchContentProvider(), - new WorkbenchLabelProvider()); + new SaveResourceDialogWorkbenchLabelProvider()); lsd.setInitialSelections((Object[]) resources); lsd.setTitle(LaunchConfigurationsMessages.SaveScopeResourcesHandler_3); if(lsd.open() == IDialogConstants.CANCEL_ID) { @@ -262,4 +262,17 @@ public class SaveScopeResourcesHandler implements IStatusHandler { } return IDialogConstants.OK_ID; } + } + + +class SaveResourceDialogWorkbenchLabelProvider extends LabelProvider { + @Override + public final String getText(Object element) { + if (element instanceof IResource) { + return ((IResource)element).getFullPath().toString(); + } + return super.getText(element); + } + +} \ No newline at end of file diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java index eb21df1801dab4389ca72e5a51d6ac20dd061944..66749e8c1364810b6957b9a8d5221aaccc6f11ee 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/SelectLaunchersDialog.java @@ -31,9 +31,7 @@ import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; @@ -108,7 +106,7 @@ public class SelectLaunchersDialog extends AbstractDebugListSelectionDialog { try { int width = settings.getInt("DIALOG_WIDTH"); //$NON-NLS-1$ int height = settings.getInt("DIALOG_HEIGHT"); //$NON-NLS-1$ - if(width > 0 & height > 0) { + if(width > 0 && height > 0) { return new Point(width, height); } } @@ -245,16 +243,13 @@ public class SelectLaunchersDialog extends AbstractDebugListSelectionDialog { @Override protected void addViewerListeners(StructuredViewer viewer) { // Override super to use custom listeners - viewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection ss = event.getStructuredSelection(); - if(ss != null && !ss.isEmpty()) { - SelectLaunchersDialog.this.description.setText(((ILaunchDelegate)ss.getFirstElement()).getDescription()); - } - else { - SelectLaunchersDialog.this.description.setText(IInternalDebugCoreConstants.EMPTY_STRING); - } + viewer.addSelectionChangedListener(event -> { + IStructuredSelection ss = event.getStructuredSelection(); + if(ss != null && !ss.isEmpty()) { + SelectLaunchersDialog.this.description.setText(((ILaunchDelegate)ss.getFirstElement()).getDescription()); + } + else { + SelectLaunchersDialog.this.description.setText(IInternalDebugCoreConstants.EMPTY_STRING); } }); super.addViewerListeners(viewer); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java index e64b805dbe31826f42bb33449e4df27fde154e80..89e241016e1a3c721404ed83c3cb4750a8fe80e9 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/BreakpointManagerContentProvider.java @@ -112,20 +112,9 @@ public class BreakpointManagerContentProvider extends ElementContentProvider private IStructuredSelection fDebugContext = StructuredSelection.EMPTY; - private IPropertyChangeListener fOrganizersListener = new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - // For any property changes in breakpoint organizers, refresh the containers. - updateContainers(); - } - }; + private IPropertyChangeListener fOrganizersListener = event -> updateContainers(); - private IPropertyChangeListener fPresentationContextListener = new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - presentationPropertyChanged(event); - } - }; + private IPropertyChangeListener fPresentationContextListener = this::presentationPropertyChanged; private IDebugContextListener fDebugContextListener = InputData.this::debugContextChanged; diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java index ab8f4dca0c06bab69fffacc5c89a8953fda41e57..fbdf847e630b4aeb6cc70d7c7f0e7fccea272ed9 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/model/elements/VariableContentProvider.java @@ -20,7 +20,6 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; -import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.ILogicalStructureType; import org.eclipse.debug.core.model.IDebugElement; import org.eclipse.debug.core.model.IIndexedValue; @@ -233,23 +232,20 @@ public class VariableContentProvider extends ElementContentProvider { if (fgLogicalCache == null){ fgLogicalCache = new LogicalStructureCache(); // Add a listener to clear the cache when resuming, terminating, or suspending - DebugPlugin.getDefault().addDebugEventListener(new IDebugEventSetListener(){ - @Override - public void handleDebugEvents(DebugEvent[] events) { - for (DebugEvent event : events) { - if (event.getKind() == DebugEvent.TERMINATE) { - fgLogicalCache.clear(); - break; - } else if (event.getKind() == DebugEvent.RESUME && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) { - fgLogicalCache.clear(); - break; - } else if (event.getKind() == DebugEvent.SUSPEND && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) { - fgLogicalCache.clear(); - break; - } else if (event.getKind() == DebugEvent.CHANGE && event.getDetail() == DebugEvent.CONTENT) { - fgLogicalCache.clear(); - break; - } + DebugPlugin.getDefault().addDebugEventListener(events -> { + for (DebugEvent event : events) { + if (event.getKind() == DebugEvent.TERMINATE) { + fgLogicalCache.clear(); + break; + } else if (event.getKind() == DebugEvent.RESUME && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) { + fgLogicalCache.clear(); + break; + } else if (event.getKind() == DebugEvent.SUSPEND && event.getDetail() != DebugEvent.EVALUATION_IMPLICIT) { + fgLogicalCache.clear(); + break; + } else if (event.getKind() == DebugEvent.CHANGE && event.getDetail() == DebugEvent.CONTENT) { + fgLogicalCache.clear(); + break; } } }); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java index bed606c1b053fd8ba5028de407df88fa35c7917f..d51ed864c1cf3a7c4233eaba5a9e3140839f011b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchConfigurationsPreferencePage.java @@ -37,8 +37,6 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.PreferencePage; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IContentProvider; @@ -228,22 +226,19 @@ public class LaunchConfigurationsPreferencePage extends PreferencePage implement private Composite createTypeFiltering(Composite parent) { Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_HORIZONTAL); BooleanFieldEditor2 editor = new BooleanFieldEditor2(IInternalDebugUIConstants.PREF_FILTER_LAUNCH_TYPES, DebugPreferencesMessages.LaunchConfigurationsPreferencePage_0, SWT.NONE, comp); - editor.setPropertyChangeListener(new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - boolean newvalue = false; - if(event.getNewValue() instanceof Boolean) { - newvalue = ((Boolean)event.getNewValue()).booleanValue(); - } - else { - newvalue = Boolean.valueOf(event.getNewValue().toString()).booleanValue(); - } - if(newvalue) { - fTable.setEnabled(true); - } - else { - fTable.setEnabled(false); - } + editor.setPropertyChangeListener(event -> { + boolean newvalue = false; + if(event.getNewValue() instanceof Boolean) { + newvalue = ((Boolean)event.getNewValue()).booleanValue(); + } + else { + newvalue = Boolean.valueOf(event.getNewValue().toString()).booleanValue(); + } + if(newvalue) { + fTable.setEnabled(true); + } + else { + fTable.setEnabled(false); } }); fFieldEditors.add(editor); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java index 750ba5e748462c221aebfbb9b75dcc16a0578817..c6055fad0131d5828c9017998b5d99ad5ffcd7f6 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchPerspectivePreferencePage.java @@ -42,12 +42,8 @@ import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.preference.RadioGroupFieldEditor; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; @@ -328,20 +324,12 @@ public class LaunchPerspectivePreferencePage extends PreferencePage implements I gd.heightHint = 250; fTree.setLayoutData(gd); fTreeViewer = new PerspectivesTreeViewer(fTree); - fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - fPerspectivesPanel.refreshPanel(event.getStructuredSelection()); - } - }); - fTreeViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - IStructuredSelection ss = (IStructuredSelection) event.getSelection(); - if(!ss.isEmpty()) { - Object obj = ss.getFirstElement(); - fTreeViewer.setExpandedState(obj, !fTreeViewer.getExpandedState(obj)); - } + fTreeViewer.addSelectionChangedListener(event -> fPerspectivesPanel.refreshPanel(event.getStructuredSelection())); + fTreeViewer.addDoubleClickListener(event -> { + IStructuredSelection ss = (IStructuredSelection) event.getSelection(); + if(!ss.isEmpty()) { + Object obj = ss.getFirstElement(); + fTreeViewer.setExpandedState(obj, !fTreeViewer.getExpandedState(obj)); } }); fTreeViewer.setLabelProvider(DebugUITools.newDebugModelPresentation()); @@ -468,27 +456,22 @@ public class LaunchPerspectivePreferencePage extends PreferencePage implements I //prep selection context, remove types from the equation HashSet<ILaunchDelegate> delegates = new HashSet<>(); - Object o = null; - for(int i = 0; i < selection.length; i++) { - o = selection[i]; + for (Object o : selection) { if(o instanceof ILaunchDelegate) { delegates.add((ILaunchDelegate) o); } else if(o instanceof ILaunchConfigurationType) { fgCurrentWorkingContext.add(o); - Object[] kids = fTreeViewer.getFilteredChildren(o); - for (int j = 0; j < kids.length; j++) { - delegates.add((ILaunchDelegate) kids[i]); + for (Object kid : fTreeViewer.getFilteredChildren(o)) { + delegates.add((ILaunchDelegate) kid); } } } //compare the listing of delegates to find common mode sets HashSet<Set<String>> common = new HashSet<>(); - List<Set<String>> modes = null; HashSet<Set<String>> pruned = new HashSet<>(); for (ILaunchDelegate delegate : delegates) { - modes = delegate.getModes(); - for (Set<String> fmodes : modes) { + for (Set<String> fmodes : delegate.getModes()) { if (isCommonModeset(fmodes, delegates, pruned)) { common.add(fmodes); fgCurrentWorkingContext.add(delegate); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java index cc9fbc128952fba6132872960f757cd5b48a9f40..a7691894386bef679712b90174423e9c4eb56a54 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/LaunchersPreferencePage.java @@ -33,13 +33,9 @@ import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationPresentationManager; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; -import org.eclipse.jface.viewers.ICheckStateListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; @@ -190,25 +186,22 @@ public class LaunchersPreferencePage extends PreferencePage implements IWorkbenc fTreeViewer.setLabelProvider(new LabelProvider()); fTreeViewer.setInput(fDuplicates); fTreeViewer.expandToLevel(2); - fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - Object obj = event.getStructuredSelection().getFirstElement(); - if(obj instanceof DuplicateDelegate) { - fTableViewer.setAllChecked(false); - DuplicateDelegate dd = (DuplicateDelegate) obj; - fTableViewer.setInput(dd.getDelegates()); - fTableViewer.setSelection(null); - obj = fDupeSelections.get(dd); - if(obj != null) { - fTableViewer.setChecked(obj, true); - fTableViewer.setSelection(new StructuredSelection(obj)); - } - } - else { - fTableViewer.setInput(null); + fTreeViewer.addSelectionChangedListener(event -> { + Object obj = event.getStructuredSelection().getFirstElement(); + if(obj instanceof DuplicateDelegate) { + fTableViewer.setAllChecked(false); + DuplicateDelegate dd = (DuplicateDelegate) obj; + fTableViewer.setInput(dd.getDelegates()); + fTableViewer.setSelection(null); + obj = fDupeSelections.get(dd); + if(obj != null) { + fTableViewer.setChecked(obj, true); + fTableViewer.setSelection(new StructuredSelection(obj)); } } + else { + fTableViewer.setInput(null); + } }); //table @@ -221,40 +214,34 @@ public class LaunchersPreferencePage extends PreferencePage implements IWorkbenc fTableViewer = new CheckboxTableViewer(table); fTableViewer.setComparator(new WorkbenchViewerComparator()); fTableViewer.setLabelProvider(new LabelProvider()); - fTableViewer.setContentProvider(new ArrayContentProvider()); - fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection ss = event.getStructuredSelection(); - if(ss != null && !ss.isEmpty()) { - ILaunchDelegate delegate = (ILaunchDelegate)ss.getFirstElement(); - fDescription.setText(delegate.getDescription()); - } - else { - fDescription.setText(IInternalDebugCoreConstants.EMPTY_STRING); - } + fTableViewer.setContentProvider(ArrayContentProvider.getInstance()); + fTableViewer.addSelectionChangedListener(event -> { + IStructuredSelection ss = event.getStructuredSelection(); + if(ss != null && !ss.isEmpty()) { + ILaunchDelegate delegate = (ILaunchDelegate)ss.getFirstElement(); + fDescription.setText(delegate.getDescription()); + } + else { + fDescription.setText(IInternalDebugCoreConstants.EMPTY_STRING); } }); - fTableViewer.addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - fDirty = true; - Object element = event.getElement(); - boolean checked = event.getChecked(); - //always set checked, this way users cannot 'undo' a change to selecting a preferred delegate - //The story for this is that on startup if there are dupes, the user is prompted to pick a delegate, after that they cannot - //return to a state of not being able to launch something, but can pick a different delegate - fTableViewer.setCheckedElements(new Object[] {element}); - //set the selection to be the checked element - //https://bugs.eclipse.org/bugs/show_bug.cgi?id=233233 - fTableViewer.setSelection(new StructuredSelection(element)); - //persist the selection - Object obj = fTreeViewer.getStructuredSelection().getFirstElement(); - if(obj instanceof DuplicateDelegate) { - fDupeSelections.remove(obj); - if(checked) { - fDupeSelections.put((DuplicateDelegate) obj, (ILaunchDelegate) element); - } + fTableViewer.addCheckStateListener(event -> { + fDirty = true; + Object element = event.getElement(); + boolean checked = event.getChecked(); + //always set checked, this way users cannot 'undo' a change to selecting a preferred delegate + //The story for this is that on startup if there are dupes, the user is prompted to pick a delegate, after that they cannot + //return to a state of not being able to launch something, but can pick a different delegate + fTableViewer.setCheckedElements(new Object[] {element}); + //set the selection to be the checked element + //https://bugs.eclipse.org/bugs/show_bug.cgi?id=233233 + fTableViewer.setSelection(new StructuredSelection(element)); + //persist the selection + Object obj = fTreeViewer.getStructuredSelection().getFirstElement(); + if(obj instanceof DuplicateDelegate) { + fDupeSelections.remove(obj); + if(checked) { + fDupeSelections.put((DuplicateDelegate) obj, (ILaunchDelegate) element); } } }); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java index 85c87b027321fe5506c5fce479694303da760a49..f07909873e133024a1a9e320b4042fbe02be313b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/ProcessPropertyPage.java @@ -29,8 +29,6 @@ import org.eclipse.debug.internal.ui.IDebugHelpContextIds; import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.BidiSegmentEvent; -import org.eclipse.swt.custom.BidiSegmentListener; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; @@ -112,34 +110,31 @@ public class ProcessPropertyPage extends PropertyPage { final int[] segments = new int[count - 1]; commandLineText = DebugPlugin.renderArguments(arguments, segments); - styledText.addBidiSegmentListener(new BidiSegmentListener() { - @Override - public void lineGetSegments(BidiSegmentEvent event) { - int offset = event.lineOffset; - int end = offset + event.lineText.length(); + styledText.addBidiSegmentListener(event -> { + int offset = event.lineOffset; + int end = offset + event.lineText.length(); - // extract segments for the current line: - int iStart = Arrays.binarySearch(segments, offset); - if (iStart < 0) { - iStart = -iStart - 1; - } - int i = iStart; - while (i < segments.length && segments[i] < end) { - i++; - } - int n = i - iStart; - if (n > 0) { - if (n == segments.length) { - event.segments = segments; - } else { - int[] lineSegments = new int[n]; - System.arraycopy(segments, iStart, lineSegments, 0, n); - event.segments = lineSegments; - } - final char[] chars = new char[n]; - Arrays.fill(chars, '\n'); - event.segmentsChars = chars; + // extract segments for the current line: + int iStart = Arrays.binarySearch(segments, offset); + if (iStart < 0) { + iStart = -iStart - 1; + } + int i = iStart; + while (i < segments.length && segments[i] < end) { + i++; + } + int n = i - iStart; + if (n > 0) { + if (n == segments.length) { + event.segments = segments; + } else { + int[] lineSegments = new int[n]; + System.arraycopy(segments, iStart, lineSegments, 0, n); + event.segments = lineSegments; } + final char[] chars = new char[n]; + Arrays.fill(chars, '\n'); + event.segmentsChars = chars; } }); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java index 4ccd135140eded8242481e70e44e1ed14eb55076..7c7f7aaaab800c79212d9e0c1e5751fa6567dd49 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/RunDebugPropertiesPage.java @@ -17,7 +17,6 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -42,12 +41,8 @@ import org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationsDi import org.eclipse.debug.ui.ILaunchGroup; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; @@ -177,7 +172,7 @@ public class RunDebugPropertiesPage extends PropertyPage { protected TableViewer createViewer(Composite parent){ TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER); viewer.setLabelProvider(new DefaultLabelProvider()); - viewer.setContentProvider(new ArrayContentProvider()); + viewer.setContentProvider(ArrayContentProvider.getInstance()); viewer.setComparator(new LaunchConfigurationComparator()); Table builderTable = viewer.getTable(); GridData tableGridData = new GridData(GridData.FILL_BOTH); @@ -186,27 +181,19 @@ public class RunDebugPropertiesPage extends PropertyPage { builderTable.setLayoutData(tableGridData); IResource resource = getResource(); viewer.setInput(collectConfigCandidates(resource)); - viewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - ISelection sel = event.getSelection(); - if(sel instanceof IStructuredSelection) { - IStructuredSelection ss = (IStructuredSelection) sel; - boolean empty = ss.isEmpty(); - int size = ss.size(); - fEditButton.setEnabled(!empty && size == 1); - fDuplicateButton.setEnabled(!empty && size == 1); - fDeleteButton.setEnabled(!empty); - setErrorMessage(null); - } - } - }); - viewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent arg0) { - handleEdit(); + viewer.addSelectionChangedListener(event -> { + ISelection sel = event.getSelection(); + if(sel instanceof IStructuredSelection) { + IStructuredSelection ss = (IStructuredSelection) sel; + boolean empty = ss.isEmpty(); + int size = ss.size(); + fEditButton.setEnabled(!empty && size == 1); + fDuplicateButton.setEnabled(!empty && size == 1); + fDeleteButton.setEnabled(!empty); + setErrorMessage(null); } }); + viewer.addDoubleClickListener(arg0 -> handleEdit()); return viewer; } @@ -254,13 +241,10 @@ public class RunDebugPropertiesPage extends PropertyPage { fTypeCandidates.add(DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(type)); } - Collections.sort(fTypeCandidates, new Comparator<ILaunchConfigurationType>() { - @Override - public int compare(ILaunchConfigurationType o1, ILaunchConfigurationType o2) { - ILaunchConfigurationType t1 = o1; - ILaunchConfigurationType t2 = o2; - return t1.getName().compareTo(t2.getName()); - } + Collections.sort(fTypeCandidates, (o1, o2) -> { + ILaunchConfigurationType t1 = o1; + ILaunchConfigurationType t2 = o2; + return t1.getName().compareTo(t2.getName()); }); } return fTypeCandidates.toArray(new ILaunchConfigurationType[fTypeCandidates.size()]); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java index 6b2a900851b7f3f4d29dd30245a8a1f3c0c8a77d..b03ab1e77c5b8eb83b2b2c3aa5b5fd339cc45bf7 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/preferences/StringVariablePreferencePage.java @@ -32,10 +32,7 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IColorProvider; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; @@ -178,19 +175,11 @@ public class StringVariablePreferencePage extends PreferencePage implements IWor } }); - variableTable.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - handleTableSelectionChanged(event); - } - }); + variableTable.addSelectionChangedListener(this::handleTableSelectionChanged); - variableTable.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - if (!variableTable.getSelection().isEmpty()) { - handleEditButtonPressed(); - } + variableTable.addDoubleClickListener(event -> { + if (!variableTable.getSelection().isEmpty()) { + handleEditButtonPressed(); } }); variableTable.getTable().addKeyListener(new KeyAdapter() { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java index dbfb44d1cec7b38c4b672a2b518743c15cb3adb4..59c8333b0bb3aa2099e7dffefbf41af075311a24 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/AddSourceContainerDialog.java @@ -28,11 +28,7 @@ import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerComparator; @@ -92,29 +88,21 @@ public class AddSourceContainerDialog extends TitleAreaDialog { gd = new GridData(GridData.FILL_BOTH); table.setLayoutData(gd); - fViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - okPressed(); - } - }); + fViewer.addDoubleClickListener(event -> okPressed()); fViewer.setLabelProvider(new SourceContainerLabelProvider()); - fViewer.setContentProvider(new ArrayContentProvider()); + fViewer.setContentProvider(ArrayContentProvider.getInstance()); fViewer.setComparator(new ViewerComparator()); - fViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - IStructuredSelection selection = event.getStructuredSelection(); - if (!selection.isEmpty()) { - ISourceContainerType type = (ISourceContainerType) selection.getFirstElement(); - setMessage(type.getDescription()); - getButton(IDialogConstants.OK_ID).setEnabled(true); - } - else { - getButton(IDialogConstants.OK_ID).setEnabled(false); - setMessage(SourceLookupUIMessages.AddSourceContainerDialog_select_source_container); - } + fViewer.addSelectionChangedListener(event -> { + IStructuredSelection selection = event.getStructuredSelection(); + if (!selection.isEmpty()) { + ISourceContainerType type = (ISourceContainerType) selection.getFirstElement(); + setMessage(type.getDescription()); + getButton(IDialogConstants.OK_ID).setEnabled(true); + } + else { + getButton(IDialogConstants.OK_ID).setEnabled(false); + setMessage(SourceLookupUIMessages.AddSourceContainerDialog_select_source_container); } }); if(types.length != 0) { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java index 9bf4a23f9d6d09de6498e46f00a40e11d15c7c3d..75d6421f608704ad9ae8718f5e2cd385c90def0f 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/ArchiveSourceContainerBrowser.java @@ -44,19 +44,16 @@ import org.eclipse.ui.views.navigator.ResourceComparator; */ public class ArchiveSourceContainerBrowser extends AbstractSourceContainerBrowser { - private ISelectionStatusValidator validator= new ISelectionStatusValidator() { - @Override - public IStatus validate(Object[] selection) { - if (selection.length == 0) { + private ISelectionStatusValidator validator= selection -> { + if (selection.length == 0) { + return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); + } + for (Object f : selection) { + if (!(f instanceof IFile)) { return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); } - for (Object f : selection) { - if (!(f instanceof IFile)) { - return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); - } - } - return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); } + return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); }; /** diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java index 24b6e283cdf0a873ec0a34789db1ee80dcf47e77..2c714d80bc41d5de17a98d42c4964286a959eacb 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/DirectorySourceContainerDialog.java @@ -26,8 +26,6 @@ import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; @@ -142,12 +140,7 @@ public class DirectorySourceContainerDialog extends TitleAreaDialog { data.horizontalSpan = 1; fDirText.setLayoutData(data); fDirText.setFont(font); - fDirText.addModifyListener(new ModifyListener() { - @Override - public void modifyText( ModifyEvent e ) { - validate(); - } - }); + fDirText.addModifyListener(e -> validate()); Button button = new Button(dirComposite, SWT.PUSH); button.setText(SourceLookupUIMessages.DirectorySourceContainerDialog_5); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java index f23ae3eff31a418a1b51dd5d60d33eaf396f030b..4a2b07e79526d8e5cee7303fbdf10f7ad52f3579 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/sourcelookup/browsers/FolderSourceContainerDialog.java @@ -89,16 +89,13 @@ public class FolderSourceContainerDialog extends ElementTreeSelectionDialog { setTitle(SourceLookupUIMessages.folderSelection_title); // setInput(ResourcesPlugin.getWorkspace().getRoot()); setComparator(new ResourceComparator(ResourceComparator.NAME)); - ISelectionStatusValidator validator= new ISelectionStatusValidator() { - @Override - public IStatus validate(Object[] selection) { - for (Object f : selection) { - if (!(f instanceof IFolder)) { - return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), -1, SourceLookupUIMessages.sourceSearch_folderSelectionError, null); // - } + ISelectionStatusValidator validator= selection -> { + for (Object f : selection) { + if (!(f instanceof IFolder)) { + return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), -1, SourceLookupUIMessages.sourceSearch_folderSelectionError, null); // } - return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); } + return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); }; setValidator(validator); setDoubleClickSelects(true); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java index 0a0641f9b1ceac8381e6263f73bb89379c621c8a..b7fa1d626dee8a16fe28a6ebae4dbe2ad9cb5941 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/AbstractBreadcrumb.java @@ -15,13 +15,9 @@ package org.eclipse.debug.internal.ui.viewers.breadcrumb; import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; @@ -169,48 +165,37 @@ public abstract class AbstractBreadcrumb { gridLayout.horizontalSpacing= 0; fComposite.setLayout(gridLayout); - fDisplayFocusListener= new Listener() { - @Override - public void handleEvent(Event event) { - if (fComposite.isDisposed()) return; + fDisplayFocusListener= event -> { + if (fComposite.isDisposed()) return; - if (isBreadcrumbEvent(event)) { - if (fHasFocus) - return; + if (isBreadcrumbEvent(event)) { + if (fHasFocus) + return; - focusGained(); - } else { - if (!fHasFocus) - return; + focusGained(); + } else { + if (!fHasFocus) + return; - focusLost(); - } + focusLost(); } }; Display.getCurrent().addFilter(SWT.FocusIn, fDisplayFocusListener); fBreadcrumbViewer= createViewer(fComposite); - fBreadcrumbViewer.addDoubleClickListener(new IDoubleClickListener() { - @Override - public void doubleClick(DoubleClickEvent event) { - Object element= ((IStructuredSelection) event.getSelection()).getFirstElement(); - if (element == null) - return; + fBreadcrumbViewer.addDoubleClickListener(event -> { + Object element= ((IStructuredSelection) event.getSelection()).getFirstElement(); + if (element == null) + return; - BreadcrumbItem item= (BreadcrumbItem) fBreadcrumbViewer.doFindItem(element); - if (item == null) - return; - item.openDropDownMenu(); - } + BreadcrumbItem item= (BreadcrumbItem) fBreadcrumbViewer.doFindItem(element); + if (item == null) + return; + item.openDropDownMenu(); }); - fBreadcrumbViewer.addOpenListener(new IOpenListener() { - @Override - public void open(OpenEvent event) { - doOpen(event.getSelection()); - } - }); + fBreadcrumbViewer.addOpenListener(event -> doOpen(event.getSelection())); return fComposite; } @@ -269,15 +254,12 @@ public abstract class AbstractBreadcrumb { //Sanity check deinstallDisplayListeners(); - fDisplayKeyListener= new Listener() { - @Override - public void handleEvent(Event event) { - if (event.keyCode != SWT.ESC) - return; + fDisplayKeyListener= event -> { + if (event.keyCode != SWT.ESC) + return; - if (!isBreadcrumbEvent(event)) - return; - } + if (!isBreadcrumbEvent(event)) + return; }; Display.getDefault().addFilter(SWT.KeyDown, fDisplayKeyListener); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java index aa98d175fa32043899290bc9fb8b3db67a640ea6..14effd1e5fc78e76da51867fb05412f934abb266 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDetails.java @@ -21,14 +21,8 @@ import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MenuDetectEvent; -import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -76,12 +70,9 @@ class BreadcrumbItemDetails { layout.marginHeight= 1; layout.marginWidth= 2; fImageComposite.setLayout(layout); - fImageComposite.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - if (fHasFocus && !isTextVisible()) { - e.gc.drawFocus(e.x, e.y, e.width, e.height); - } + fImageComposite.addPaintListener(e -> { + if (fHasFocus && !isTextVisible()) { + e.gc.drawFocus(e.x, e.y, e.width, e.height); } }); installFocusComposite(fImageComposite); @@ -99,12 +90,9 @@ class BreadcrumbItemDetails { layout.marginWidth= 2; fTextComposite.setLayout(layout); addElementListener(fTextComposite); - fTextComposite.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - if (fHasFocus && isTextVisible()) { - e.gc.drawFocus(e.x, e.y, e.width, e.height); - } + fTextComposite.addPaintListener(e -> { + if (fHasFocus && isTextVisible()) { + e.gc.drawFocus(e.x, e.y, e.width, e.height); } }); installFocusComposite(fTextComposite); @@ -276,23 +264,20 @@ class BreadcrumbItemDetails { * @param composite the composite which may get focus */ private void installFocusComposite(Composite composite) { - composite.addTraverseListener(new TraverseListener() { - @Override - public void keyTraversed(TraverseEvent e) { - if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { - int index= fParent.getViewer().getIndexOfItem(fParent); - if (e.detail == SWT.TRAVERSE_TAB_NEXT) { - index++; - } else { - index--; - } - - if (index > 0 && index < fParent.getViewer().getItemCount()) { - fParent.getViewer().selectItem(fParent.getViewer().getItem(index)); - } - - e.doit= true; + composite.addTraverseListener(e -> { + if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) { + int index= fParent.getViewer().getIndexOfItem(fParent); + if (e.detail == SWT.TRAVERSE_TAB_NEXT) { + index++; + } else { + index--; + } + + if (index > 0 && index < fParent.getViewer().getItemCount()) { + fParent.getViewer().selectItem(fParent.getViewer().getItem(index)); } + + e.doit= true; } }); composite.addKeyListener(new KeyListener() { @@ -400,13 +385,10 @@ class BreadcrumbItemDetails { public void mouseUp(MouseEvent e) { } }); - control.addMenuDetectListener(new MenuDetectListener() { - @Override - public void menuDetected(MenuDetectEvent e) { - BreadcrumbViewer viewer= fParent.getViewer(); - viewer.selectItem(fParent); - fParent.getViewer().fireMenuDetect(e); - } + control.addMenuDetectListener(e -> { + BreadcrumbViewer viewer= fParent.getViewer(); + viewer.selectItem(fParent); + fParent.getViewer().fireMenuDetect(e); }); } } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java index 3f75d919105098e2b1c64bb8dc72cd3608bd16de..8d29b318719b5b05137bc2e5468fc90ff1a4f6ff 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java @@ -29,8 +29,6 @@ import org.eclipse.swt.accessibility.AccessibleEvent; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.ShellEvent; @@ -48,7 +46,6 @@ import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; @@ -330,42 +327,39 @@ class BreadcrumbItemDropDown implements IBreadcrumbDropDownSite { * @param shell the shell to install the closer to */ private void installCloser(final Shell shell) { - final Listener focusListener= new Listener() { - @Override - public void handleEvent(Event event) { - Widget focusElement= event.widget; - boolean isFocusBreadcrumbTreeFocusWidget= focusElement == shell || focusElement instanceof Control && ((Control)focusElement).getShell() == shell; - boolean isFocusWidgetParentShell= focusElement instanceof Control && ((Control)focusElement).getShell().getParent() == shell; + final Listener focusListener= event -> { + Widget focusElement= event.widget; + boolean isFocusBreadcrumbTreeFocusWidget= focusElement == shell || focusElement instanceof Control && ((Control)focusElement).getShell() == shell; + boolean isFocusWidgetParentShell= focusElement instanceof Control && ((Control)focusElement).getShell().getParent() == shell; + + switch (event.type) { + case SWT.FocusIn: + if (DebugUIPlugin.DEBUG_BREADCRUMB) { + DebugUIPlugin.trace("focusIn - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$ + } - switch (event.type) { - case SWT.FocusIn: + if (!isFocusBreadcrumbTreeFocusWidget && !isFocusWidgetParentShell) { if (DebugUIPlugin.DEBUG_BREADCRUMB) { - DebugUIPlugin.trace("focusIn - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$ - } - - if (!isFocusBreadcrumbTreeFocusWidget && !isFocusWidgetParentShell) { - if (DebugUIPlugin.DEBUG_BREADCRUMB) { - DebugUIPlugin.trace("==> closing shell since focus in other widget"); //$NON-NLS-1$ - } - shell.close(); + DebugUIPlugin.trace("==> closing shell since focus in other widget"); //$NON-NLS-1$ } - break; + shell.close(); + } + break; - case SWT.FocusOut: + case SWT.FocusOut: + if (DebugUIPlugin.DEBUG_BREADCRUMB) { + DebugUIPlugin.trace("focusOut - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$ + } + if (event.display.getActiveShell() == null) { if (DebugUIPlugin.DEBUG_BREADCRUMB) { - DebugUIPlugin.trace("focusOut - is breadcrumb tree: " + isFocusBreadcrumbTreeFocusWidget); //$NON-NLS-1$ - } - if (event.display.getActiveShell() == null) { - if (DebugUIPlugin.DEBUG_BREADCRUMB) { - DebugUIPlugin.trace("==> closing shell since event.display.getActiveShell() != shell"); //$NON-NLS-1$ - } - shell.close(); + DebugUIPlugin.trace("==> closing shell since event.display.getActiveShell() != shell"); //$NON-NLS-1$ } - break; + shell.close(); + } + break; - default: - Assert.isTrue(false); - } + default: + Assert.isTrue(false); } }; @@ -390,19 +384,16 @@ class BreadcrumbItemDropDown implements IBreadcrumbDropDownSite { }; fToolBar.getShell().addControlListener(controlListener); - shell.addDisposeListener(new DisposeListener() { - @Override - public void widgetDisposed(DisposeEvent e) { - if (DebugUIPlugin.DEBUG_BREADCRUMB) { - DebugUIPlugin.trace("==> shell disposed"); //$NON-NLS-1$ - } + shell.addDisposeListener(e -> { + if (DebugUIPlugin.DEBUG_BREADCRUMB) { + DebugUIPlugin.trace("==> shell disposed"); //$NON-NLS-1$ + } - display.removeFilter(SWT.FocusIn, focusListener); - display.removeFilter(SWT.FocusOut, focusListener); + display.removeFilter(SWT.FocusIn, focusListener); + display.removeFilter(SWT.FocusOut, focusListener); - if (!fToolBar.isDisposed()) { - fToolBar.getShell().removeControlListener(controlListener); - } + if (!fToolBar.isDisposed()) { + fToolBar.getShell().removeControlListener(controlListener); } }); shell.addShellListener(new ShellListener() { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java index 3bdec56c0d1893e78c887beeaf8f333ef2703a05..83949303367ae09df0fd7bb4e2008315e5b9780d 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/breadcrumb/TreeViewerDropDown.java @@ -23,11 +23,9 @@ import org.eclipse.core.runtime.Status; import org.eclipse.debug.internal.core.IInternalDebugCoreConstants; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.jface.util.OpenStrategy; -import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.ITreeViewerListener; -import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; @@ -86,14 +84,11 @@ public abstract class TreeViewerDropDown { fDropDownSite = site; fDropDownViewer= createTreeViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL, path); - fDropDownViewer.addOpenListener(new IOpenListener() { - @Override - public void open(OpenEvent event) { - if (DebugUIPlugin.DEBUG_TREE_VIEWER_DROPDOWN) { - DebugUIPlugin.trace("BreadcrumbItemDropDown.showMenu()$treeViewer>open"); //$NON-NLS-1$ - } - openElement(event.getSelection()); + fDropDownViewer.addOpenListener(event -> { + if (DebugUIPlugin.DEBUG_TREE_VIEWER_DROPDOWN) { + DebugUIPlugin.trace("BreadcrumbItemDropDown.showMenu()$treeViewer>open"); //$NON-NLS-1$ } + openElement(event.getSelection()); }); final Tree tree = fDropDownViewer.getTree(); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java index d8b901e937b8a672125a29249e05965bcd234446..e92b4924baa5b8353f1b5d5867ac7069a836f13b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualCopyToClipboardActionDelegate.java @@ -149,8 +149,9 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel for (String label : labels) { String text = trimLabel(label); if (text != null && !text.equals(IInternalDebugCoreConstants.EMPTY_STRING)) { - buffer.append(text+TAB); + buffer.append(text); } + buffer.append(TAB); } buffer.append(System.getProperty(SEPARATOR)); } @@ -267,20 +268,17 @@ public class VirtualCopyToClipboardActionDelegate extends AbstractDebugActionDel final IProgressMonitor monitor = dialog.getProgressMonitor(); dialog.setCancelable(true); - IRunnableWithProgress runnable = new IRunnableWithProgress() { - @Override - public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException { - synchronized(listener) { - listener.fProgressMonitor = m; - listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fItemsToUpdate.size()); - } + IRunnableWithProgress runnable = m -> { + synchronized(listener) { + listener.fProgressMonitor = m; + listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getAction().getText()), listener.fItemsToUpdate.size()); + } - while (!listener.fItemsToUpdate.isEmpty() && !listener.fProgressMonitor.isCanceled()) { - Thread.sleep(1); - } - synchronized(listener) { - listener.fProgressMonitor = null; - } + while (!listener.fItemsToUpdate.isEmpty() && !listener.fProgressMonitor.isCanceled()) { + Thread.sleep(1); + } + synchronized(listener) { + listener.fProgressMonitor = null; } }; try { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java index 7a0f95ac49129f317ca976d1f2bc43f09fd4421a..f427d443a09ce57364f23806b2d0941de80c1b4b 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/VirtualFindAction.java @@ -32,7 +32,6 @@ import org.eclipse.debug.internal.ui.viewers.FindElementDialog; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; @@ -41,7 +40,6 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualItem; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; @@ -193,20 +191,17 @@ public class VirtualFindAction extends Action implements IUpdate { try { dialog.run( true, true, - new IRunnableWithProgress() { - @Override - public void run(final IProgressMonitor m) throws InvocationTargetException, InterruptedException { - synchronized(listener) { - listener.fProgressMonitor = m; - listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getText()), listener.fRemainingUpdatesCount); - } - - while ((!listener.fLabelUpdatesComplete || !listener.fViewerUpdatesComplete) && !listener.fProgressMonitor.isCanceled()) { - Thread.sleep(1); - } - synchronized(listener) { - listener.fProgressMonitor = null; - } + m -> { + synchronized(listener) { + listener.fProgressMonitor = m; + listener.fProgressMonitor.beginTask(DebugUIPlugin.removeAccelerators(getText()), listener.fRemainingUpdatesCount); + } + + while ((!listener.fLabelUpdatesComplete || !listener.fViewerUpdatesComplete) && !listener.fProgressMonitor.isCanceled()) { + Thread.sleep(1); + } + synchronized(listener) { + listener.fProgressMonitor = null; } }); } catch (InvocationTargetException e) { @@ -234,15 +229,12 @@ public class VirtualFindAction extends Action implements IUpdate { private int calcUpdatesCount(IModelDelta stateDelta) { final int[] count = new int[] {0}; - stateDelta.accept( new IModelDeltaVisitor() { - @Override - public boolean visit(IModelDelta delta, int depth) { - if ((delta.getFlags() & IModelDelta.EXPAND) != 0) { - count[0] += delta.getChildCount(); - return true; - } - return false; + stateDelta.accept( (delta, depth) -> { + if ((delta.getFlags() & IModelDelta.EXPAND) != 0) { + count[0] += delta.getChildCount(); + return true; } + return false; }); // Double it to account for separate element and label update ticks. @@ -282,14 +274,11 @@ public class VirtualFindAction extends Action implements IUpdate { ModelDelta stateDelta = new ModelDelta(virtualViewer.getInput(), IModelDelta.NO_CHANGE); virtualViewer.saveElementState(TreePath.EMPTY, stateDelta, IModelDelta.SELECT); // Set the force flag to all select delta in order to override model's selection policy. - stateDelta.accept(new IModelDeltaVisitor() { - @Override - public boolean visit(IModelDelta delta, int depth) { - if ((delta.getFlags() & IModelDelta.SELECT) != 0) { - ((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.FORCE); - } - return true; + stateDelta.accept((delta, depth) -> { + if ((delta.getFlags() & IModelDelta.SELECT) != 0) { + ((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.FORCE); } + return true; }); fClientViewer.updateViewer(stateDelta); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java index a5292887712f5e9117b4b7357d3c12edb7ab5e05..77be30fb88de663311c0915be9eac633e0a273d2 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/ViewerInputService.java @@ -33,12 +33,9 @@ public class ViewerInputService { * * @since 3.6 */ - public final static Object NULL_INPUT = new IViewerInputProvider() { - @Override - public void update(IViewerInputUpdate update) { - update.setInputElement(null); - update.done(); - } + public final static Object NULL_INPUT = (IViewerInputProvider) update -> { + update.setInputElement(null); + update.done(); }; // previous update request, cancelled when a new request comes in @@ -48,16 +45,13 @@ public class ViewerInputService { private ITreeModelViewer fViewer; - private IViewerInputRequestor fProxyRequest = new IViewerInputRequestor() { - @Override - public void viewerInputComplete(final IViewerInputUpdate update) { - synchronized (ViewerInputService.this) { - if (fPendingUpdate == update) { - fPendingUpdate = null; - } + private IViewerInputRequestor fProxyRequest = update -> { + synchronized (ViewerInputService.this) { + if (fPendingUpdate == update) { + fPendingUpdate = null; } - fRequestor.viewerInputComplete(update); } + fRequestor.viewerInputComplete(update); }; /** diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java index 2721701ccc06cd209c2f1d3d7a8a16686ee8dee5..c1eab47255e9440b7a3ecb870143f0e1cb259163 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointOrganizerManager.java @@ -16,7 +16,6 @@ package org.eclipse.debug.internal.ui.views.breakpoints; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,7 +27,6 @@ import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.breakpoints.provisional.IBreakpointOrganizer; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; /** * Manager which provides access to the breakpoint organizers @@ -78,10 +76,7 @@ public class BreakpointOrganizerManager { */ private void start(String organizerId) { IBreakpointOrganizer organizer = getOrganizer(organizerId); - IPropertyChangeListener listener = new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - } + IPropertyChangeListener listener = event -> { }; organizer.addPropertyChangeListener(listener); organizer.removePropertyChangeListener(listener); @@ -122,14 +117,7 @@ public class BreakpointOrganizerManager { Collection<IBreakpointOrganizer> collection = fOrganizers.values(); fSorted = new ArrayList<>(); fSorted.addAll(collection); - Collections.sort(fSorted, new Comparator<Object>() { - @Override - public int compare(Object o1, Object o2) { - IBreakpointOrganizer b1 = (IBreakpointOrganizer)o1; - IBreakpointOrganizer b2 = (IBreakpointOrganizer)o2; - return b1.getLabel().compareTo(b2.getLabel()); - } - }); + Collections.sort(fSorted, (o1, o2) -> o1.getLabel().compareTo(o2.getLabel())); } return fSorted.toArray(new IBreakpointOrganizer[fSorted.size()]); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java index 31ed62c81323fdac633b24062cafe7fdc4460ac6..4a4fdefd81034d85b92a9f78bbce33c845c71b70 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/BreakpointsView.java @@ -451,7 +451,6 @@ public class BreakpointsView extends VariablesView implements IBreakpointManager // update the presentation context organizer viewer.getPresentationContext().setProperty(IBreakpointUIConstants.PROP_BREAKPOINTS_ORGANIZERS, fOrganizers); } - System.out.println(); } /** diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/DeleteBreakpointMarkersOperation.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/DeleteBreakpointMarkersOperation.java new file mode 100644 index 0000000000000000000000000000000000000000..1a1b87589837a77e4f7bacbb79db2bd2238ba5ff --- /dev/null +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/breakpoints/DeleteBreakpointMarkersOperation.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2020 Paul Pazderski and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Paul Pazderski - initial API and implementation + *******************************************************************************/ +package org.eclipse.debug.internal.ui.views.breakpoints; + +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.ui.ide.undo.DeleteMarkersOperation; + +/** + * Extension of the default undoable delete marker operation to additional + * update the 'breakpointIsDeleted' attribute. + */ +public class DeleteBreakpointMarkersOperation extends DeleteMarkersOperation { + + /** + * Create an undoable operation that can delete the specified markers. + * + * @param markers the markers to be deleted + * @param name the name used to describe the operation that deletes the + * markers + */ + public DeleteBreakpointMarkersOperation(IMarker[] markers, String name) { + super(markers, name); + } + + @Override + protected void doExecute(IProgressMonitor monitor, org.eclipse.core.runtime.IAdaptable info) throws CoreException { + IMarker[] markers = getMarkers(); + if (markers != null) { + for (IMarker marker : markers) { + marker.setAttribute(DebugPlugin.ATTR_BREAKPOINT_IS_DELETED, true); + } + } + + super.doExecute(monitor, info); + } + + // Note: do not update 'breakpointIsDeleted' on doUndo (i.e. don't set + // breakpointIsDeleted=false on undo). It is important that the recreated + // breakpoint has breakpointIsDeleted=true to recognize the recreation in later + // code. +} diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java index a759e5dbc6d5cd820d87cab20ad53a45603b5768..472a894e0813157bd2d0f7fe8237de8c747ae520 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsole.java @@ -13,6 +13,7 @@ * Paul Pazderski - Bug 545769: fixed rare UTF-8 character corruption bug * Paul Pazderski - Bug 552015: console finished signaled to late if input is connected to file * Paul Pazderski - Bug 251642: add termination time in console label + * Paul Pazderski - Bug 558463: add handling of raw stream content instead of strings *******************************************************************************/ package org.eclipse.debug.internal.ui.views.console; @@ -53,10 +54,13 @@ import org.eclipse.core.variables.IStringVariableManager; import org.eclipse.core.variables.VariablesPlugin; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; +import org.eclipse.debug.core.IBinaryStreamListener; import org.eclipse.debug.core.IDebugEventSetListener; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.IStreamListener; +import org.eclipse.debug.core.model.IBinaryStreamMonitor; +import org.eclipse.debug.core.model.IBinaryStreamsProxy; import org.eclipse.debug.core.model.IFlushableStreamMonitor; import org.eclipse.debug.core.model.IProcess; import org.eclipse.debug.core.model.IStreamMonitor; @@ -711,11 +715,25 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe * Received output will be redirected to given {@link IOConsoleOutputStream} to * get it shown in console and to {@link #fFileOutputStream} if set. */ - private class StreamListener implements IStreamListener { + private class StreamListener implements IStreamListener, IBinaryStreamListener { private IOConsoleOutputStream fStream; + /** + * The monitors from which this listener class is notified about new content. + * Initial and for a long time IO handling in context of Eclipse console was + * based on strings and later extended with a variant passing the raw binary + * data. + * <p> + * As a result of this history it is expectable to have a stream monitor passing + * the content decoded as string but optional to have access to the + * raw/unchanged data. + * <p> + * Therefore the following two monitor instances either point to the same class + * implementing both interfaces or the binary variant is <code>null</code>. + */ private IStreamMonitor fStreamMonitor; + private IBinaryStreamMonitor fBinaryStreamMonitor; private String fStreamId; @@ -723,12 +741,16 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe private boolean fStreamClosed = false; public StreamListener(String streamIdentifier, IStreamMonitor monitor, IOConsoleOutputStream stream) { - this.fStreamId = streamIdentifier; - this.fStreamMonitor = monitor; - this.fStream = stream; + fStreamId = streamIdentifier; + fStreamMonitor = monitor; + fStream = stream; fStreamMonitor.addListener(this); - //fix to bug 121454. Ensure that output to fast processes is processed. - flushAndDisableBuffer(monitor); + if (fStreamMonitor instanceof IBinaryStreamMonitor && fFileOutputStream != null) { + fBinaryStreamMonitor = (IBinaryStreamMonitor) monitor; + fBinaryStreamMonitor.addBinaryListener(this); + } + // fix to bug 121454. Ensure that output to fast processes is processed. + flushAndDisableBuffer(); } /** @@ -737,17 +759,37 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe * * @param monitor the monitor which might have buffered content */ - private void flushAndDisableBuffer(IStreamMonitor monitor) { + private void flushAndDisableBuffer() { + byte[] data = null; String contents; - synchronized (monitor) { - contents = monitor.getContents(); - if (monitor instanceof IFlushableStreamMonitor) { - IFlushableStreamMonitor m = (IFlushableStreamMonitor) monitor; + synchronized (fStreamMonitor) { + if (fBinaryStreamMonitor != null) { + data = fBinaryStreamMonitor.getData(); + } + contents = fStreamMonitor.getContents(); + if (fStreamMonitor instanceof IFlushableStreamMonitor) { + IFlushableStreamMonitor m = (IFlushableStreamMonitor) fStreamMonitor; m.flushContents(); m.setBuffered(false); } } - streamAppended(contents, monitor); + if (data != null) { + streamAppended(data, fBinaryStreamMonitor); + } + streamAppended(contents, fStreamMonitor); + } + + @Override + public void streamAppended(byte[] data, IBinaryStreamMonitor monitor) { + if (fFileOutputStream != null) { + synchronized (fFileOutputStream) { + try { + fFileOutputStream.write(data); + } catch (IOException e) { + DebugUIPlugin.log(e); + } + } + } } @Override @@ -755,22 +797,20 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe if (text == null || text.length() == 0) { return; } - try { - if (fStream != null) { + if (fStream != null) { + try { fStream.write(text); + } catch (IOException e) { + DebugUIPlugin.log(e); } - if (fFileOutputStream != null) { - Charset charset = getCharset(); - synchronized (fFileOutputStream) { - if (charset == null) { - fFileOutputStream.write(text.getBytes()); - } else { - fFileOutputStream.write(text.getBytes(charset)); - } - } - } - } catch (IOException e) { - DebugUIPlugin.log(e); + } + // If the monitor does not provide the raw data API and we need to redirect to + // a file the second best (and in the past only) option is to write the encoded + // text to file. + if (fBinaryStreamMonitor == null && fFileOutputStream != null) { + Charset charset = getCharset(); + byte[] data = charset == null ? text.getBytes() : text.getBytes(charset); + streamAppended(data, null); } } @@ -780,6 +820,9 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe } synchronized (fStreamMonitor) { fStreamMonitor.removeListener(this); + if (fBinaryStreamMonitor != null) { + fBinaryStreamMonitor.removeBinaryListener(this); + } fStreamClosed = true; try { @@ -842,31 +885,56 @@ public class ProcessConsole extends IOConsole implements IConsole, IDebugEventSe if (fInput == null || fStreamsClosed) { return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS; } - Charset encoding = getCharset(); - readingStream = fInput; - InputStreamReader streamReader = (encoding == null ? new InputStreamReader(readingStream) - : new InputStreamReader(readingStream, encoding)); - try { - char[] cbuf = new char[1024]; - int charRead = 0; - while (charRead >= 0 && !monitor.isCanceled()) { - if (fInput == null || fStreamsClosed) { - break; - } - if (fInput != readingStream) { - readingStream = fInput; - streamReader = (encoding == null ? new InputStreamReader(readingStream) - : new InputStreamReader(readingStream, encoding)); + if (streamsProxy instanceof IBinaryStreamsProxy) { + // Pass data without processing. The preferred variant. There is no need for + // this job to know about encodings. + try { + byte[] buffer = new byte[1024]; + int bytesRead = 0; + while (bytesRead >= 0 && !monitor.isCanceled()) { + if (fInput == null || fStreamsClosed) { + break; + } + if (fInput != readingStream) { + readingStream = fInput; + } + bytesRead = readingStream.read(buffer); + if (bytesRead > 0) { + ((IBinaryStreamsProxy) streamsProxy).write(buffer, 0, bytesRead); + } } + } catch (IOException e) { + DebugUIPlugin.log(e); + } + } else { + // Decode data to strings. The legacy variant used if the proxy does not + // implement the binary API. + Charset encoding = getCharset(); + readingStream = fInput; + InputStreamReader streamReader = (encoding == null ? new InputStreamReader(readingStream) + : new InputStreamReader(readingStream, encoding)); + try { + char[] cbuf = new char[1024]; + int charRead = 0; + while (charRead >= 0 && !monitor.isCanceled()) { + if (fInput == null || fStreamsClosed) { + break; + } + if (fInput != readingStream) { + readingStream = fInput; + streamReader = (encoding == null ? new InputStreamReader(readingStream) + : new InputStreamReader(readingStream, encoding)); + } - charRead = streamReader.read(cbuf); - if (charRead > 0) { - String s = new String(cbuf, 0, charRead); - streamsProxy.write(s); + charRead = streamReader.read(cbuf); + if (charRead > 0) { + String s = new String(cbuf, 0, charRead); + streamsProxy.write(s); + } } + } catch (IOException e) { + DebugUIPlugin.log(e); } - } catch (IOException e) { - DebugUIPlugin.log(e); } readingStream = null; return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS; diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java index f3ca1e23b7d754f6d244a109c7f68206529775f5..968aa02712ffbbf3854cdeada19fbe0d091259a9 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/console/ProcessConsolePageParticipant.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2018 IBM Corporation and others. + * Copyright (c) 2000, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -40,6 +40,7 @@ import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IConsoleConstants; import org.eclipse.ui.console.IConsolePageParticipant; import org.eclipse.ui.console.IConsoleView; +import org.eclipse.ui.console.actions.ClearOutputAction; import org.eclipse.ui.contexts.IContextActivation; import org.eclipse.ui.contexts.IContextService; import org.eclipse.ui.handlers.IHandlerActivation; @@ -70,10 +71,13 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I private IConsoleView fView; + private static final String fContextId = "org.eclipse.debug.ui.console"; //$NON-NLS-1$; private EOFHandler fEOFHandler; - private String fContextId = "org.eclipse.debug.ui.console"; //$NON-NLS-1$; + private ClearConsoleHandler fClearConsoleHandler; + private ClearOutputAction fClearConsoleAction; private IContextActivation fActivatedContext; - private IHandlerActivation fActivatedHandler; + private IHandlerActivation fEOFActivatedHandler; + private IHandlerActivation fClearConsoleActivatedHandler; /** * Handler to send EOF */ @@ -90,7 +94,19 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I } return null; } + } + /** + * Handler to send clear console + */ + private class ClearConsoleHandler extends AbstractHandler { + @Override + public Object execute(ExecutionEvent event) throws org.eclipse.core.commands.ExecutionException { + if (fClearConsoleAction != null) { + fClearConsoleAction.run(); + } + return null; + } } @Override @@ -113,8 +129,10 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I IActionBars actionBars = fPage.getSite().getActionBars(); configureToolBar(actionBars.getToolBarManager()); - // create handler and submissions for EOF + // create handler for EOF and clear fEOFHandler = new EOFHandler(); + fClearConsoleHandler = new ClearConsoleHandler(); + fClearConsoleAction = new ClearOutputAction(fConsole); } @Override @@ -223,26 +241,31 @@ public class ProcessConsolePageParticipant implements IConsolePageParticipant, I @Override public void activated() { - // add EOF submissions + // add EOF and clear submissions IPageSite site = fPage.getSite(); - if(fActivatedContext == null && fActivatedHandler == null) { + if (fActivatedContext == null) { IHandlerService handlerService = site.getService(IHandlerService.class); IContextService contextService = site.getService(IContextService.class); fActivatedContext = contextService.activateContext(fContextId); - fActivatedHandler = handlerService.activateHandler("org.eclipse.debug.ui.commands.eof", fEOFHandler); //$NON-NLS-1$ + fEOFActivatedHandler = handlerService.activateHandler("org.eclipse.debug.ui.commands.eof", fEOFHandler); //$NON-NLS-1$ + fClearConsoleActivatedHandler = handlerService + .activateHandler("org.eclipse.debug.ui.commands.console.clear", fClearConsoleHandler); //$NON-NLS-1$ } } @Override public void deactivated() { - // remove EOF submissions + // remove EOF and clear submissions IPageSite site = fPage.getSite(); IHandlerService handlerService = site.getService(IHandlerService.class); IContextService contextService = site.getService(IContextService.class); - handlerService.deactivateHandler(fActivatedHandler); + handlerService.deactivateHandler(fClearConsoleActivatedHandler); + handlerService.deactivateHandler(fEOFActivatedHandler); contextService.deactivateContext(fActivatedContext); fActivatedContext = null; - fActivatedHandler = null; + fEOFActivatedHandler = null; + fClearConsoleActivatedHandler = null; + fClearConsoleAction = null; } @Override diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java index f17597ee6fb7a93c0815acc8d8b2c9246bde24e8..d8bae0c13aa8435d6d090fef77de81ed361ecbd7 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchView.java @@ -87,7 +87,6 @@ import org.eclipse.debug.ui.contexts.IDebugContextProvider; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; @@ -469,12 +468,7 @@ public class LaunchView extends AbstractDebugView */ private PageRec fDefaultPageRec = null; - private ISelectionChangedListener fTreeViewerSelectionChangedListener = new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - fTreeViewerDebugContextProvider.activate(event.getSelection()); - } - }; + private ISelectionChangedListener fTreeViewerSelectionChangedListener = event -> fTreeViewerDebugContextProvider.activate(event.getSelection()); private class ContextProviderProxy extends AbstractDebugContextProvider implements IDebugContextListener { private IDebugContextProvider fActiveProvider; @@ -750,15 +744,12 @@ public class LaunchView extends AbstractDebugView modeSubmenu.add(fBreadcrumbDropDownAutoExpandAction); viewMenu.add(modeSubmenu); - modeSubmenu.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) { - modeSubmenu.add(fDebugViewModeActions[0]); - modeSubmenu.add(fDebugViewModeActions[1]); - modeSubmenu.add(fDebugViewModeActions[2]); - modeSubmenu.add(new Separator()); - modeSubmenu.add(fBreadcrumbDropDownAutoExpandAction); - } + modeSubmenu.addMenuListener(manager -> { + modeSubmenu.add(fDebugViewModeActions[0]); + modeSubmenu.add(fDebugViewModeActions[1]); + modeSubmenu.add(fDebugViewModeActions[2]); + modeSubmenu.add(new Separator()); + modeSubmenu.add(fBreadcrumbDropDownAutoExpandAction); }); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java index ccb12f2c158447c36706f226ca01e50def330f7d..9df8a069e442e98899fead9a0f1e1e694600567d 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/launch/LaunchViewBreadcrumb.java @@ -35,8 +35,6 @@ import org.eclipse.debug.ui.contexts.AbstractDebugContextProvider; import org.eclipse.debug.ui.contexts.DebugContextEvent; import org.eclipse.debug.ui.contexts.IDebugContextListener; import org.eclipse.debug.ui.contexts.IDebugContextProvider; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.BaseLabelProvider; @@ -53,8 +51,6 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.ViewerLabel; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MenuDetectEvent; -import org.eclipse.swt.events.MenuDetectListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; @@ -282,12 +278,7 @@ public class LaunchViewBreadcrumb extends AbstractBreadcrumb implements IDebugCo protected void createMenuManager() { MenuManager menuMgr = new MenuManager("#PopUp"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager mgr) { - fView.fillContextMenu(mgr); - } - }); + menuMgr.addMenuListener(mgr -> fView.fillContextMenu(mgr)); final Menu menu= menuMgr.createContextMenu(fViewer.getControl()); // register the context menu such that other plug-ins may contribute to it @@ -296,15 +287,12 @@ public class LaunchViewBreadcrumb extends AbstractBreadcrumb implements IDebugCo } fView.addContextMenuManager(menuMgr); - fViewer.addMenuDetectListener(new MenuDetectListener() { - @Override - public void menuDetected(MenuDetectEvent event) { - menu.setLocation(event.x + 10, event.y + 10); - menu.setVisible(true); - while (!menu.isDisposed() && menu.isVisible()) { - if (!menu.getDisplay().readAndDispatch()) { - menu.getDisplay().sleep(); - } + fViewer.addMenuDetectListener(event -> { + menu.setLocation(event.x + 10, event.y + 10); + menu.setVisible(true); + while (!menu.isDisposed() && menu.isVisible()) { + if (!menu.getDisplay().readAndDispatch()) { + menu.getDisplay().sleep(); } } }); @@ -529,14 +517,11 @@ public class LaunchViewBreadcrumb extends AbstractBreadcrumb implements IDebugCo fDropDownViewer.saveElementState(TreePath.EMPTY, delta, IModelDelta.EXPAND | IModelDelta.SELECT); // Add the IModelDelta.FORCE flag to override the current selection in view. - rootDelta.accept(new IModelDeltaVisitor(){ - @Override - public boolean visit(IModelDelta paramDelta, int depth) { - if ((paramDelta.getFlags() & IModelDelta.SELECT) != 0) { - ((ModelDelta)paramDelta).setFlags(paramDelta.getFlags() | IModelDelta.FORCE); - } - return true; + rootDelta.accept((paramDelta, depth) -> { + if ((paramDelta.getFlags() & IModelDelta.SELECT) != 0) { + ((ModelDelta)paramDelta).setFlags(paramDelta.getFlags() | IModelDelta.FORCE); } + return true; }); // If elements in the drop-down were auto-expanded, then collapse the drop-down's sub tree in the diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java index c54bc43c30083e217bb7ff4178d71b1c09365a48..427955ba0d5bb44f51c5460ae6347461e6b5bf34 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/AddMemoryRenderingDialog.java @@ -36,8 +36,6 @@ import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener; import org.eclipse.debug.ui.memory.IMemoryRenderingSite; import org.eclipse.debug.ui.memory.IMemoryRenderingType; import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; @@ -47,7 +45,6 @@ import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; -import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; @@ -102,21 +99,17 @@ public class AddMemoryRenderingDialog extends SelectionDialog { } }; - private IMemoryRenderingBindingsListener fBindingListener = new IMemoryRenderingBindingsListener() { - @Override - public void memoryRenderingBindingsChanged() { - UIJob job = new UIJob("refresh") { //$NON-NLS-1$ - - @Override - public IStatus runInUIThread(IProgressMonitor monitor) { - fViewer.refresh(); - return Status.OK_STATUS; - } - }; - job.setSystem(true); - job.schedule(); - } + private IMemoryRenderingBindingsListener fBindingListener = () -> { + UIJob job = new UIJob("refresh") { //$NON-NLS-1$ + @Override + public IStatus runInUIThread(IProgressMonitor monitor) { + fViewer.refresh(); + return Status.OK_STATUS; + } + }; + job.setSystem(true); + job.schedule(); }; class MemoryRenderingLabelProvider implements ILabelProvider { @@ -319,13 +312,7 @@ public class AddMemoryRenderingDialog extends SelectionDialog { listLayout.heightHint = 140; fViewer.getControl().setLayoutData(listLayout); - fViewer.addDoubleClickListener(new IDoubleClickListener() { - - @Override - public void doubleClick(DoubleClickEvent event) { - okPressed(); - } - }); + fViewer.addDoubleClickListener(event -> okPressed()); IMemoryBlock currentBlock = getMemoryBlockToSelect(null); if (currentBlock == null) { @@ -334,17 +321,13 @@ public class AddMemoryRenderingDialog extends SelectionDialog { populateDialog(currentBlock); } - fSelectionChangedListener = new ISelectionChangedListener() { + fSelectionChangedListener = event -> { + ISelection selection = fViewer.getSelection(); - @Override - public void selectionChanged(SelectionChangedEvent event) { - ISelection selection = fViewer.getSelection(); - - if (selection.isEmpty()) { - getButton(IDialogConstants.OK_ID).setEnabled(false); - } else { - getButton(IDialogConstants.OK_ID).setEnabled(true); - } + if (selection.isEmpty()) { + getButton(IDialogConstants.OK_ID).setEnabled(false); + } else { + getButton(IDialogConstants.OK_ID).setEnabled(true); } }; diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java index 2ca3ac384378f2453df403abaaa683a7c299a278..18a72a1b29f85b40847b9fb48e6d1928875fcfe2 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryBlocksTreeViewPane.java @@ -45,8 +45,6 @@ import org.eclipse.debug.ui.memory.IMemoryRenderingContainer; import org.eclipse.debug.ui.memory.IMemoryRenderingSite; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; @@ -295,13 +293,9 @@ public class MemoryBlocksTreeViewPane implements ISelectionListener, ISelectionC fDebugContextListener = new TreeViewPaneContextListener(); DebugUITools.addPartDebugContextListener(fParent.getSite(), fDebugContextListener); - fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { - - @Override - public void selectionChanged(SelectionChangedEvent event) { - ISelection treeSelected = event.getSelection(); - fSelectionProvider.setSelection(treeSelected); - } + fTreeViewer.addSelectionChangedListener(event -> { + ISelection treeSelected = event.getSelection(); + fSelectionProvider.setSelection(treeSelected); }); updateRetrieval(); @@ -336,13 +330,10 @@ public class MemoryBlocksTreeViewPane implements ISelectionListener, ISelectionC protected MenuManager createContextMenuManager() { MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) { - manager.add(fAddMemoryBlockAction); - manager.add(fRemoveMemoryBlockAction); - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - } + menuMgr.addMenuListener(manager -> { + manager.add(fAddMemoryBlockAction); + manager.add(fRemoveMemoryBlockAction); + manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); }); // register a context menu manager, use its pane id as the menu id diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java index 99990459162a54c9b4ee786196d1a5db0e37f883..134deea5fdaa7b2172a80dd36d895e3de70e803a 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/MemoryViewTab.java @@ -26,7 +26,6 @@ import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.IBasicPropertyConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabItem; -import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Control; @@ -72,13 +71,9 @@ public class MemoryViewTab implements IMemoryViewTab, IPropertyChangeListener, L fTabItem.setText(getLabel()); fTabItem.setImage(getImage()); - fTabItem.addDisposeListener(fDisposeListener = new DisposeListener() { - - @Override - public void widgetDisposed(DisposeEvent e) { - fTabItem.removeDisposeListener(fDisposeListener); - dispose(); - } + fTabItem.addDisposeListener(fDisposeListener = e -> { + fTabItem.removeDisposeListener(fDisposeListener); + dispose(); }); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java index 1d99b6bfed90c7a88f5bd1944ae4c3bcac5876c0..1b741465be764bbd3e458dee54fcdcb59f56ad13 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/SwitchMemoryBlockAction.java @@ -31,7 +31,6 @@ import org.eclipse.debug.core.model.IMemoryBlockRetrieval; import org.eclipse.debug.internal.core.IInternalDebugCoreConstants; import org.eclipse.debug.internal.ui.DebugUIMessages; import org.eclipse.debug.ui.DebugUITools; -import org.eclipse.debug.ui.contexts.DebugContextEvent; import org.eclipse.debug.ui.contexts.IDebugContextListener; import org.eclipse.debug.ui.memory.IMemoryRendering; import org.eclipse.jface.action.Action; @@ -127,12 +126,9 @@ public class SwitchMemoryBlockAction extends Action implements IViewActionDelega /** * Listens for debug context changes and updates action delegate enablement */ - private IDebugContextListener fDebugContextListener = new IDebugContextListener() { - @Override - public void debugContextChanged(DebugContextEvent event) { - if (fAction != null) { - fUpdateJob.schedule(); - } + private IDebugContextListener fDebugContextListener = event -> { + if (fAction != null) { + fUpdateJob.schedule(); } }; diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java index c09a32c9820e418c2903d7d7842657fa2a50de14..5c2d85ba344a3f8666dbc633b308af79462e0eac 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/memory/renderings/CreateRendering.java @@ -36,9 +36,7 @@ import org.eclipse.debug.ui.memory.IMemoryRenderingBindingsListener; import org.eclipse.debug.ui.memory.IMemoryRenderingContainer; import org.eclipse.debug.ui.memory.IMemoryRenderingType; import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IBasicPropertyConstants; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelection; @@ -186,12 +184,7 @@ public class CreateRendering extends AbstractMemoryRendering implements IMemoryR listLayout.horizontalSpan = 1; fViewer.getControl().setLayoutData(listLayout); - fViewer.addDoubleClickListener(new IDoubleClickListener (){ - - @Override - public void doubleClick(DoubleClickEvent event) { - addRenderings(); - }}); + fViewer.addDoubleClickListener(event -> addRenderings()); // listen for enter being pressed fViewer.getList().addKeyListener(new KeyAdapter() { diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java index 8b83c4d4f294e9c5179a86bb3d588ef1ae7249f0..fc5a907ac9a28d348d6aa14d7402ce72ea3093e9 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/variables/VariablesView.java @@ -78,7 +78,6 @@ import org.eclipse.debug.ui.contexts.IDebugContextListener; import org.eclipse.debug.ui.contexts.IDebugContextService; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.action.IToolBarManager; @@ -114,7 +113,6 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.TreeItem; @@ -123,7 +121,6 @@ import org.eclipse.ui.IActionBars; import org.eclipse.ui.IMemento; import org.eclipse.ui.IPerspectiveDescriptor; import org.eclipse.ui.IPerspectiveListener; -import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.ISaveablePart2; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; @@ -156,12 +153,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis */ private static class SelectionProviderWrapper implements ISelectionProvider { private final ListenerList<ISelectionChangedListener> fListenerList = new ListenerList<>(ListenerList.IDENTITY); - private final ISelectionChangedListener fListener = new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - fireSelectionChanged(event); - } - }; + private final ISelectionChangedListener fListener = this::fireSelectionChanged; private ISelectionProvider fActiveProvider; private SelectionProviderWrapper(ISelectionProvider provider) { @@ -293,12 +285,9 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis * Viewer input requester used to update the viewer once the viewer input has been * resolved. */ - private IViewerInputRequestor fRequester = new IViewerInputRequestor() { - @Override - public void viewerInputComplete(IViewerInputUpdate update) { - if (!update.isCanceled()) { - viewerInputUpdateComplete(update); - } + private IViewerInputRequestor fRequester = update -> { + if (!update.isCanceled()) { + viewerInputUpdateComplete(update); } }; @@ -505,12 +494,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis } fDetailPane = new DetailPaneProxy(this); - fDetailPane.addProperyListener(new IPropertyListener() { - @Override - public void propertyChanged(Object source, int propId) { - firePropertyChange(propId); - } - }); + fDetailPane.addProperyListener((source, propId) -> firePropertyChange(propId)); setDetailPaneOrientation(orientation); IMemento memento = getMemento(); @@ -576,7 +560,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis sw = memento.getInteger(SASH_DETAILS_PART); if(sw != null) { int details = sw.intValue(); - if(view > -1 & details > -1) { + if(view > -1 && details > -1) { return new int[] {view, details}; } } @@ -652,14 +636,11 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis } }); variablesViewer.getPresentationContext().addPropertyChangeListener( - new IPropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent event) { - if (IPresentationContext.PROPERTY_COLUMNS.equals(event.getProperty())) { - IAction action = getAction("ShowTypeNames"); //$NON-NLS-1$ - if (action != null) { - action.setEnabled(event.getNewValue() == null); - } + event -> { + if (IPresentationContext.PROPERTY_COLUMNS.equals(event.getProperty())) { + IAction action = getAction("ShowTypeNames"); //$NON-NLS-1$ + if (action != null) { + action.setEnabled(event.getNewValue() == null); } } }); @@ -1017,23 +998,20 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis fConfigureColumnsAction = new ConfigureColumnsAction(viewer); setAction("ToggleColmns", new ToggleShowColumnsAction(viewer)); //$NON-NLS-1$ - layoutSubMenu.addMenuListener(new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) { - layoutSubMenu.add(fToggleDetailPaneActions[0]); - layoutSubMenu.add(fToggleDetailPaneActions[1]); - layoutSubMenu.add(fToggleDetailPaneActions[2]); - layoutSubMenu.add(fToggleDetailPaneActions[3]); - layoutSubMenu.add(new Separator()); - IAction action = getAction("ToggleColmns"); //$NON-NLS-1$ - ((IUpdate)action).update(); - if (action.isEnabled()) { - layoutSubMenu.add(action); - } - fConfigureColumnsAction.update(); - if (fConfigureColumnsAction.isEnabled()) { - layoutSubMenu.add(fConfigureColumnsAction); - } + layoutSubMenu.addMenuListener(manager -> { + layoutSubMenu.add(fToggleDetailPaneActions[0]); + layoutSubMenu.add(fToggleDetailPaneActions[1]); + layoutSubMenu.add(fToggleDetailPaneActions[2]); + layoutSubMenu.add(fToggleDetailPaneActions[3]); + layoutSubMenu.add(new Separator()); + IAction action = getAction("ToggleColmns"); //$NON-NLS-1$ + ((IUpdate)action).update(); + if (action.isEnabled()) { + layoutSubMenu.add(action); + } + fConfigureColumnsAction.update(); + if (fConfigureColumnsAction.isEnabled()) { + layoutSubMenu.add(fConfigureColumnsAction); } }); } @@ -1099,18 +1077,15 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis */ protected ISelectionChangedListener getTreeSelectionChangedListener() { if (fTreeSelectionChangedListener == null) { - fTreeSelectionChangedListener = new ISelectionChangedListener() { - @Override - public void selectionChanged(final SelectionChangedEvent event) { - if (event.getSelectionProvider().equals(getViewer())) { - clearStatusLine(); - // if the detail pane is not visible, don't waste time retrieving details - if (fSashForm.getMaximizedControl() == getViewer().getControl()) { - return; - } - refreshDetailPaneContents(); - treeSelectionChanged(event); + fTreeSelectionChangedListener = event -> { + if (event.getSelectionProvider().equals(getViewer())) { + clearStatusLine(); + // if the detail pane is not visible, don't waste time retrieving details + if (fSashForm.getMaximizedControl() == getViewer().getControl()) { + return; } + refreshDetailPaneContents(); + treeSelectionChanged(event); } }; } @@ -1173,12 +1148,7 @@ public class VariablesView extends AbstractDebugView implements IDebugContextLis @Override public void paneChanged(String newPaneID) { if (fDetailPaneActivatedListener == null){ - fDetailPaneActivatedListener = new Listener() { - @Override - public void handleEvent(Event event) { - fTreeHasFocus = false; - } - }; + fDetailPaneActivatedListener = event -> fTreeHasFocus = false; } fDetailPane.getCurrentControl().addListener(SWT.Activate, fDetailPaneActivatedListener); } diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java index d7b3780ec35dbb5a91a603ed0d269fea3284ef07..0356a558df67280c02067380ffc7cdd1b46786fa 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/CommonTab.java @@ -52,9 +52,7 @@ import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; -import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; @@ -64,7 +62,6 @@ import org.eclipse.swt.accessibility.AccessibleAdapter; import org.eclipse.swt.accessibility.AccessibleEvent; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -82,7 +79,6 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ContainerSelectionDialog; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; -import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.ide.IDEEncoding; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; @@ -154,12 +150,7 @@ public class CommonTab extends AbstractLaunchConfigurationTab { /** * Modify listener that simply updates the owning launch configuration dialog. */ - private ModifyListener fBasicModifyListener = new ModifyListener() { - @Override - public void modifyText(ModifyEvent evt) { - scheduleUpdateJob(); - } - }; + private ModifyListener fBasicModifyListener = evt -> scheduleUpdateJob(); /** * Constructs a new tab with default context help. @@ -214,12 +205,7 @@ public class CommonTab extends AbstractLaunchConfigurationTab { table.setFont(parent.getFont()); fFavoritesTable.setContentProvider(new FavoritesContentProvider()); fFavoritesTable.setLabelProvider(new FavoritesLabelProvider()); - fFavoritesTable.addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent event) { - updateLaunchConfigurationDialog(); - } - }); + fFavoritesTable.addCheckStateListener(event -> updateLaunchConfigurationDialog()); } /** @@ -393,20 +379,16 @@ public class CommonTab extends AbstractLaunchConfigurationTab { public void widgetSelected(SelectionEvent e) { ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setTitle(LaunchConfigurationsMessages.CommonTab_13); - dialog.setValidator(new ISelectionStatusValidator() { - - @Override - public IStatus validate(Object[] selection) { - if (selection.length == 0) { + dialog.setValidator(selection -> { + if (selection.length == 0) { + return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); + } + for (Object f : selection) { + if (!(f instanceof IFile)) { return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); } - for (Object f : selection) { - if (!(f instanceof IFile)) { - return new Status(IStatus.ERROR, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); - } - } - return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); } + return new Status(IStatus.OK, DebugUIPlugin.getUniqueIdentifier(), 0, IInternalDebugCoreConstants.EMPTY_STRING, null); }); dialog.setMessage(LaunchConfigurationsMessages.CommonTab_18); dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java index 1f5a2675fa082831f641fd24546aa2ef7d07e45f..f24c1c9f9cbee20e9b77338564db6d2494b73870 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/DebugUITools.java @@ -72,6 +72,7 @@ import org.eclipse.debug.internal.ui.memory.MemoryRenderingManager; import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupFacility; import org.eclipse.debug.internal.ui.sourcelookup.SourceLookupUIUtils; import org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager; +import org.eclipse.debug.internal.ui.views.breakpoints.DeleteBreakpointMarkersOperation; import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetManager; import org.eclipse.debug.ui.contexts.IDebugContextListener; import org.eclipse.debug.ui.contexts.IDebugContextManager; @@ -101,7 +102,6 @@ import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.handlers.HandlerUtil; -import org.eclipse.ui.ide.undo.DeleteMarkersOperation; import org.eclipse.ui.ide.undo.WorkspaceUndoUtil; @@ -301,6 +301,13 @@ public class DebugUITools { * @since 3.7 */ public static void deleteBreakpoints(IBreakpoint[] breakpoints, final Shell shell, IProgressMonitor progressMonitor) throws CoreException { + if (breakpoints.length == 0) { + // Note: this is not only a small performance optimization but also the fix for + // bug 344352. When removing no breakpoints the DeleteMarkersOperation will show + // an error dialog about missing markers. + return; + } + IMarker[] markers= new IMarker[breakpoints.length]; int markerCount; for (markerCount= 0; markerCount < breakpoints.length; markerCount++) { @@ -319,11 +326,6 @@ public class DebugUITools { DebugPlugin.getDefault().getBreakpointManager().removeBreakpoints(breakpoints, !allowUndo); if (allowUndo) { - - for (IMarker marker : markers) { - marker.setAttribute(DebugPlugin.ATTR_BREAKPOINT_IS_DELETED, true); - } - IAdaptable context= null; if (shell != null) { context= new IAdaptable() { @@ -339,7 +341,7 @@ public class DebugUITools { } String operationName= markers.length == 1 ? ActionMessages.DeleteBreakpointOperationName : ActionMessages.DeleteBreakpointsOperationName; - IUndoableOperation deleteMarkerOperation= new DeleteMarkersOperation(markers, operationName); + IUndoableOperation deleteMarkerOperation = new DeleteBreakpointMarkersOperation(markers, operationName); deleteMarkerOperation.removeContext(WorkspaceUndoUtil.getWorkspaceUndoContext()); deleteMarkerOperation.addContext(DebugUITools.getBreakpointsUndoContext()); IOperationHistory operationHistory= PlatformUI.getWorkbench().getOperationSupport().getOperationHistory(); diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java index a649bda36c15836ee55ce4019ba8e9b1d83bd651..528fe429e36f5377a94b98b160555ffd968a76c2 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/actions/DebugCommandAction.java @@ -16,7 +16,6 @@ package org.eclipse.debug.ui.actions; import org.eclipse.debug.core.IRequest; import org.eclipse.debug.internal.ui.commands.actions.DebugCommandService; -import org.eclipse.debug.internal.ui.commands.actions.ICommandParticipant; import org.eclipse.debug.internal.ui.commands.actions.IEnabledTarget; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.contexts.DebugContextEvent; @@ -117,12 +116,7 @@ public abstract class DebugCommandAction extends Action implements IDebugContext private boolean execute(final Object[] targets) { return fUpdateService.executeCommand( getCommandType(), targets, - new ICommandParticipant() { - @Override - public void requestDone(org.eclipse.debug.core.IRequest request) { - DebugCommandAction.this.postExecute(request, targets); - } - }); + request -> DebugCommandAction.this.postExecute(request, targets)); } /** diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java index 04cf4febd0465bf550216a2331a52fb00877b4cc..897526c27f85d547fcdefbfa27b832fc0e51cc92 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/ui/console/FileLink.java @@ -57,14 +57,15 @@ public class FileLink implements IConsoleHyperlink { /** * Constructs a hyperlink to the specified file. * - * @param file the file to open when activated - * @param editorId the identifier of the editor to open the file in, or - * <code>null</code> if the default editor should be used - * @param fileOffset the offset in the file to select when activated, or -1 - * @param fileLength the length of text to select in the file when activated - * or -1 - * @param fileLineNumber the line number to select in the file when - * activated, or -1 + * @param file the file to open when activated + * @param editorId the identifier of the editor to open the file in, or + * <code>null</code> if the default editor should be used + * @param fileOffset the offset in the file to select when activated, or -1 + * @param fileLength the length of text to select in the file when activated + * or -1 + * @param fileLineNumber the line number to select in the file when activated, + * or -1. First line number is 1. Only used if + * <em>fileOffset</em> is not set. */ public FileLink(IFile file, String editorId, int fileOffset, int fileLength, int fileLineNumber) { fFile = file; @@ -82,7 +83,7 @@ public class FileLink implements IConsoleHyperlink { if (page != null) { try { IEditorPart editorPart = page.openEditor(new FileEditorInput(fFile), getEditorId() , true); - if (fFileLineNumber > 0) { + if (fFileLineNumber > 0 || (fFileOffset >= 0 && fFileLength >= 0)) { ITextEditor textEditor = null; if (editorPart instanceof ITextEditor) { textEditor = (ITextEditor) editorPart; @@ -90,8 +91,8 @@ public class FileLink implements IConsoleHyperlink { textEditor = editorPart.getAdapter(ITextEditor.class); } if (textEditor != null) { - IEditorInput input = editorPart.getEditorInput(); if (fFileOffset < 0) { + IEditorInput input = editorPart.getEditorInput(); IDocumentProvider provider = textEditor.getDocumentProvider(); try { provider.connect(input); diff --git a/org.eclipse.ui.console/META-INF/MANIFEST.MF b/org.eclipse.ui.console/META-INF/MANIFEST.MF index 1d193c1734a1abcdfc51650c14694977048e5f6f..9c3bc07da5b2212f25c3d43bb68e83aee466add3 100644 --- a/org.eclipse.ui.console/META-INF/MANIFEST.MF +++ b/org.eclipse.ui.console/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.ui.console; singleton:=true -Bundle-Version: 3.9.200.qualifier +Bundle-Version: 3.9.300.qualifier Bundle-Activator: org.eclipse.ui.console.ConsolePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -14,7 +14,8 @@ Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)", org.eclipse.ui.workbench.texteditor;bundle-version="[3.5.0,4.0.0)", org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)", org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)", - org.eclipse.core.variables;bundle-version="[3.2.800,4.0.0)" + org.eclipse.core.variables;bundle-version="[3.2.800,4.0.0)", + org.eclipse.debug.core;bundle-version="[3.16.0,4.0.0)" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Automatic-Module-Name: org.eclipse.ui.console diff --git a/org.eclipse.ui.console/forceQualifierUpdate.txt b/org.eclipse.ui.console/forceQualifierUpdate.txt new file mode 100644 index 0000000000000000000000000000000000000000..e3185a3bd627646336dd678248df95de813ddb2e --- /dev/null +++ b/org.eclipse.ui.console/forceQualifierUpdate.txt @@ -0,0 +1,2 @@ +# To force a version qualifier update add the bug here +Bug 566471 - I20200828-0150 - Comparator Errors Found diff --git a/org.eclipse.ui.console/icons/full/cview16/console_view.gif b/org.eclipse.ui.console/icons/full/cview16/console_view.gif deleted file mode 100644 index a598f6082f6678d2125469b1b6ae05836796d04a..0000000000000000000000000000000000000000 Binary files a/org.eclipse.ui.console/icons/full/cview16/console_view.gif and /dev/null differ diff --git a/org.eclipse.ui.console/icons/full/eview16/console_view.gif b/org.eclipse.ui.console/icons/full/eview16/console_view.gif deleted file mode 100644 index a598f6082f6678d2125469b1b6ae05836796d04a..0000000000000000000000000000000000000000 Binary files a/org.eclipse.ui.console/icons/full/eview16/console_view.gif and /dev/null differ diff --git a/org.eclipse.ui.console/pom.xml b/org.eclipse.ui.console/pom.xml index 430b786963c834f4260b24601e3e1929d6fe9cda..1aca91b44f1ebab5b7eb98a9bc8b1680a7e37ab1 100644 --- a/org.eclipse.ui.console/pom.xml +++ b/org.eclipse.ui.console/pom.xml @@ -14,10 +14,10 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.ui</groupId> <artifactId>org.eclipse.ui.console</artifactId> - <version>3.9.200-SNAPSHOT</version> + <version>3.9.300-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java index d4442f41eb73efde85b6718588f96cd82435c3ea..56464eba5a5b688fde33371407aee0d0ed83f533 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleInputStream.java @@ -16,7 +16,7 @@ package org.eclipse.ui.console; import java.io.IOException; import java.io.InputStream; -import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; @@ -150,14 +150,10 @@ public class IOConsoleInputStream extends InputStream { * @param text the text to append to the buffer. */ public synchronized void appendData(String text) { - String encoding = console.getEncoding(); + Charset charset = console.getCharset(); byte[] newData; - if (encoding!=null) { - try { - newData = text.getBytes(encoding); - } catch (UnsupportedEncodingException e) { - newData = text.getBytes(); - } + if (charset != null) { + newData = text.getBytes(charset); } else { newData = text.getBytes(); } diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java index 2faaa369245395ddf91128dd5afcda1575cb7322..bbe638bb59022e891fc97dfeab1c6d9a83d7c9a3 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java @@ -18,10 +18,10 @@ import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; +import org.eclipse.debug.internal.core.StreamDecoder; import org.eclipse.swt.graphics.Color; import org.eclipse.ui.WorkbenchEncoding; import org.eclipse.ui.internal.console.IOConsolePartitioner; -import org.eclipse.ui.internal.console.StreamDecoder; /** * OutputStream used to write to an IOConsole. diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java index 5eea534ec440227fc79899d33c1a00bc14fde107..f23572e5adec46d1aa4d20130a4cfb6bd206bbf0 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/TextConsolePage.java @@ -151,7 +151,7 @@ public class TextConsolePage implements IPageBookViewPage, IPropertyChangeListen } fMenuManager= new MenuManager("#ContextMenu", id); //$NON-NLS-1$ fMenuManager.setRemoveAllWhenShown(true); - fMenuManager.addMenuListener(m -> contextMenuAboutToShow(m)); + fMenuManager.addMenuListener(this::contextMenuAboutToShow); Menu menu = fMenuManager.createContextMenu(getControl()); getControl().setMenu(menu); diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java index 6f593fe1bc941d9f656cb0654fb06e92586ecaff..0e448a6c1b2921d5d99d8adad2e7ef722f47e2c9 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/IOConsolePartitioner.java @@ -98,12 +98,12 @@ public class IOConsolePartitioner * Pattern used to find supported ASCII control characters <b>except</b> * carriage return. */ - private static final String CONTROL_CHARACTERS_PATTERN_STR = "(?:\b+|\u000b+|\f+)"; //$NON-NLS-1$ + private static final String CONTROL_CHARACTERS_PATTERN_STR = "(?:\b+|\u0000+|\u000b+|\f+)"; //$NON-NLS-1$ /** * Pattern used to find supported ASCII control characters <b>including</b> * carriage return. */ - private static final String CONTROL_CHARACTERS_WITH_CR_PATTERN_STR = "(?:\b+|\u000b+|\f+|\r+(?!\n))"; //$NON-NLS-1$ + private static final String CONTROL_CHARACTERS_WITH_CR_PATTERN_STR = "(?:\b+|\u0000+|\u000b+|\f+|\r+(?!\n))"; //$NON-NLS-1$ /** The connected {@link IDocument} this partitioner manages. */ private IDocument document; @@ -881,6 +881,7 @@ public class IOConsolePartitioner applyOutputToDocument(content.toString(), nextWriteOffset, replaceLength); content.setLength(0); replaceLength = 0; + nextWriteOffset = outputOffset; final String controlCharacterMatch = controlCharacterMatcher.group(); final char controlCharacter = controlCharacterMatch.charAt(0); @@ -949,6 +950,13 @@ public class IOConsolePartitioner partititonContent(pending.stream, vtab, 0, vtab.length()); break; + case 0: + // Do nothing for null bytes. The use of this is that a null byte which reach + // the IOConsoleViewer will truncate the line on some platforms and will disturb + // copying text on most platforms. + // This case should simply filter out any null bytes. + break; + default: // should never happen as long as the used regex pattern is valid log(IStatus.ERROR, "No implementation to handle control character 0x" //$NON-NLS-1$ diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java index 0bc54f2af6cc4ce8a32801a5be697c15485b85a2..e334aa22e3894dffd7cdb61eab79cb3058380c7a 100644 --- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java +++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/StreamDecoder.java @@ -14,93 +14,17 @@ package org.eclipse.ui.internal.console; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.nio.charset.CoderResult; -import java.nio.charset.CodingErrorAction; /** - * @since 3.7 + * @deprecated class was moved to + * {@link org.eclipse.debug.internal.core.StreamDecoder} */ -public class StreamDecoder { - - static private final int BUFFER_SIZE = 4096; - - private final CharsetDecoder decoder; - private final ByteBuffer inputBuffer; - private final CharBuffer outputBuffer; - private boolean finished; +@Deprecated +public class StreamDecoder extends org.eclipse.debug.internal.core.StreamDecoder { public StreamDecoder(Charset charset) { - this.decoder = charset.newDecoder(); - this.decoder.onMalformedInput(CodingErrorAction.REPLACE); - this.decoder.onUnmappableCharacter(CodingErrorAction.REPLACE); - this.inputBuffer = ByteBuffer.allocate(StreamDecoder.BUFFER_SIZE); - this.inputBuffer.flip(); - this.outputBuffer = CharBuffer.allocate(StreamDecoder.BUFFER_SIZE); - this.finished = false; - } - - private void consume(StringBuilder consumer) { - this.outputBuffer.flip(); - consumer.append(this.outputBuffer); - this.outputBuffer.clear(); - } - - private void internalDecode(StringBuilder consumer, byte[] buffer, int offset, int length) { - assert (offset >= 0); - assert (length >= 0); - int position = offset; - int end = offset + length; - assert (end <= buffer.length); - boolean finishedReading = false; - do { - CoderResult result = this.decoder.decode(this.inputBuffer, this.outputBuffer, false); - if (result.isOverflow()) { - this.consume(consumer); - } else if (result.isUnderflow()) { - this.inputBuffer.compact(); - int remaining = this.inputBuffer.remaining(); - assert (remaining > 0); - int read = Math.min(remaining, end - position); - if (read > 0) { - this.inputBuffer.put(buffer, position, read); - position += read; - } else { - finishedReading = true; - } - this.inputBuffer.flip(); - } else { - assert false; - } - } while (!finishedReading); + super(charset); } - - public void decode(StringBuilder consumer, byte[] buffer, int offset, int length) { - this.internalDecode(consumer, buffer, offset, length); - this.consume(consumer); - } - - public void finish(StringBuilder consumer) { - if (this.finished) { - return; - } - this.finished = true; - CoderResult result; - result = this.decoder.decode(this.inputBuffer, this.outputBuffer, true); - assert (result.isOverflow() || result.isUnderflow()); - do { - result = this.decoder.flush(this.outputBuffer); - if (result.isOverflow()) { - this.consume(consumer); - } else { - assert result.isUnderflow(); - } - } while (!result.isUnderflow()); - this.consume(consumer); - } - } diff --git a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java index 6f792797d346028c7e676155fd3a267756fedf44..ab548bafd9ec2cb3b87b7d91b3e1de42c044312a 100644 --- a/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java +++ b/org.eclipse.ui.externaltools/External Tools Base/org/eclipse/ui/externaltools/internal/ui/TreeAndListGroup.java @@ -177,7 +177,7 @@ public class TreeAndListGroup implements ISelectionChangedListener { listViewer.setContentProvider(listContentProvider); listViewer.setLabelProvider(listLabelProvider); listViewer.setComparator(new ResourceComparator(ResourceComparator.NAME)); - listViewer.addSelectionChangedListener(event -> notifySelectionListeners(event)); + listViewer.addSelectionChangedListener(this::notifySelectionListeners); listViewer.addDoubleClickListener(event -> { if (!event.getSelection().isEmpty()) { notifyDoubleClickListeners(event); diff --git a/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF b/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF index ffd4660ea3c6bc269001667080511c5a880f0578..1895d0ba40aadf21fbbf73563a9fa253a0c41b2f 100644 --- a/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF +++ b/org.eclipse.ui.externaltools/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Plugin.name Bundle-SymbolicName: org.eclipse.ui.externaltools; singleton:=true -Bundle-Version: 3.4.700.qualifier +Bundle-Version: 3.4.800.qualifier Bundle-Activator: org.eclipse.ui.externaltools.internal.model.ExternalToolsPlugin Bundle-Vendor: %Plugin.providerName Bundle-Localization: plugin diff --git a/org.eclipse.ui.externaltools/pom.xml b/org.eclipse.ui.externaltools/pom.xml index 3b4d2e5be7d27c542afa7810835f6869c05e991b..dbdbf3c0a4fb1be608b6107579dc5392eed7c028 100644 --- a/org.eclipse.ui.externaltools/pom.xml +++ b/org.eclipse.ui.externaltools/pom.xml @@ -14,10 +14,10 @@ <parent> <artifactId>eclipse.platform.debug</artifactId> <groupId>eclipse.platform.debug</groupId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> </parent> <groupId>org.eclipse.ui</groupId> <artifactId>org.eclipse.ui.externaltools</artifactId> - <version>3.4.700-SNAPSHOT</version> + <version>3.4.800-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project> diff --git a/pom.xml b/pom.xml index ac442f04078d54fb2b7e82703d9224269a4770cb..1ccfd0d076edfcd7d0bbe314582e502e692f9a1f 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ <parent> <groupId>org.eclipse</groupId> <artifactId>eclipse-platform-parent</artifactId> - <version>4.16.0-SNAPSHOT</version> + <version>4.17.0-SNAPSHOT</version> <relativePath>../eclipse-platform-parent</relativePath> </parent>