Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Flynn2016-12-13 19:10:22 +0000
committerGerrit Code Review @ Eclipse.org2017-01-19 15:01:09 +0000
commit576d41fe694f42b59ae8a78a4f085777d45a1ed9 (patch)
treedd42f40fba4bf79bc4d6dc71fce2c86c6aea68d6 /debug/org.eclipse.cdt.debug.ui/src/org
parent2c8c7a9bcacffee832d6ba10029c3f1785dc6be9 (diff)
downloadorg.eclipse.cdt-576d41fe694f42b59ae8a78a4f085777d45a1ed9.tar.gz
org.eclipse.cdt-576d41fe694f42b59ae8a78a4f085777d45a1ed9.tar.xz
org.eclipse.cdt-576d41fe694f42b59ae8a78a4f085777d45a1ed9.zip
Bug 303808 Allow page participants for GdbFullCliConsole.
This commit borrows code from ConsoleView and ConsoleManager to allow adding page participants to GdbFullCliConsole. Change-Id: I4b99600bc4fba3bfecb9a4822f94e2be7d3aa601 Signed-off-by: Stephen Flynn <stephen.flynn@dell.com>
Diffstat (limited to 'debug/org.eclipse.cdt.debug.ui/src/org')
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleManager.java41
-rw-r--r--debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleView.java252
2 files changed, 289 insertions, 4 deletions
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleManager.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleManager.java
index d08880c0a5a..b57f641e0a0 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleManager.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleManager.java
@@ -11,13 +11,19 @@
package org.eclipse.cdt.debug.internal.ui.views.debuggerconsole;
import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.debuggerconsole.IDebuggerConsole;
import org.eclipse.cdt.debug.ui.debuggerconsole.IDebuggerConsoleManager;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ui.IViewPart;
@@ -25,8 +31,12 @@ import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleListener;
+import org.eclipse.ui.console.IConsolePageParticipant;
+import org.eclipse.ui.internal.console.ConsolePageParticipantExtension;
import org.eclipse.ui.progress.WorkbenchJob;
/**
@@ -41,6 +51,9 @@ public class DebuggerConsoleManager implements IDebuggerConsoleManager {
/** A list of listeners registered for notifications of changes to consoles */
private ListenerList<IConsoleListener> fConsoleListeners = new ListenerList<>();
+ /** A list of registered console page participants */
+ private List<ConsolePageParticipantExtension> fPageParticipants;
+
private OpenDebuggerConsoleViewJob fOpenDebuggerConsoleViewJob = new OpenDebuggerConsoleViewJob();
private ShowDebuggerConsoleViewJob fShowDebuggerConsoleViewJob = new ShowDebuggerConsoleViewJob();
@@ -91,6 +104,34 @@ public class DebuggerConsoleManager implements IDebuggerConsoleManager {
fOpenDebuggerConsoleViewJob.schedule(100);
}
+ // Code for page participants borrowed from
+ // org.eclipse.ui.internal.console.ConsoleManager
+ public IConsolePageParticipant[] getPageParticipants(IDebuggerConsole console) {
+ if (fPageParticipants == null) {
+ fPageParticipants = new ArrayList<>();
+ IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(
+ ConsolePlugin.getUniqueIdentifier(), IConsoleConstants.EXTENSION_POINT_CONSOLE_PAGE_PARTICIPANTS);
+ IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
+ for (int i = 0; i < elements.length; i++) {
+ IConfigurationElement config = elements[i];
+ ConsolePageParticipantExtension extension = new ConsolePageParticipantExtension(config);
+ fPageParticipants.add(extension);
+ }
+ }
+ ArrayList<IConsolePageParticipant> list = new ArrayList<>();
+ for (Iterator<ConsolePageParticipantExtension> i = fPageParticipants.iterator(); i.hasNext();) {
+ ConsolePageParticipantExtension extension = i.next();
+ try {
+ if (extension.isEnabledFor(console)) {
+ list.add(extension.createDelegate());
+ }
+ } catch (CoreException e) {
+ CDebugUIPlugin.log(e);
+ }
+ }
+ return list.toArray(new IConsolePageParticipant[0]);
+ }
+
private class ShowDebuggerConsoleViewJob extends WorkbenchJob {
ShowDebuggerConsoleViewJob() {
super("Show GDB Console View"); //$NON-NLS-1$
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleView.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleView.java
index 56184fb956c..802aaaa0dc0 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleView.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleView.java
@@ -7,7 +7,9 @@
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.views.debuggerconsole;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -15,15 +17,23 @@ import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.debuggerconsole.IDebuggerConsole;
import org.eclipse.cdt.debug.ui.debuggerconsole.IDebuggerConsoleManager;
import org.eclipse.cdt.debug.ui.debuggerconsole.IDebuggerConsoleView;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.ListenerList;
+import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.IBasicPropertyConstants;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleListener;
+import org.eclipse.ui.console.IConsolePageParticipant;
import org.eclipse.ui.console.IConsoleView;
import org.eclipse.ui.console.IOConsole;
import org.eclipse.ui.part.IPage;
@@ -42,11 +52,15 @@ import org.eclipse.ui.part.PageSwitcher;
* @see {@link IDebuggerConsoleManager}
*/
public class DebuggerConsoleView extends PageBookView
-implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChangeListener {
+ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChangeListener, IPartListener2 {
public static final String DEBUGGER_CONSOLE_VIEW_ID = "org.eclipse.cdt.debug.ui.debuggerConsoleView"; //$NON-NLS-1$
public static final String DROP_DOWN_ACTION_ID = DEBUGGER_CONSOLE_VIEW_ID + ".DebuggerConsoleDropDownAction"; //$NON-NLS-1$
+ /**
+ * Stack of consoles in MRU order
+ */
+ private List<IDebuggerConsole> fStack = new ArrayList<>();
/** The console being displayed, or <code>null</code> if none */
private IDebuggerConsole fActiveConsole;
@@ -59,6 +73,18 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
private DebuggerConsoleDropDownAction fDisplayConsoleAction;
+ // Code for page participants borrowed from
+ // org.eclipse.ui.internal.console.ConsoleView
+ /**
+ * Map of consoles to array of page participants
+ */
+ private Map<IDebuggerConsole, ListenerList<IConsolePageParticipant>> fConsoleToPageParticipants = new HashMap<>();
+
+ /**
+ * Whether this view is active
+ */
+ private boolean fActive = false;
+
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
@@ -71,7 +97,8 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
// add as a listener for new consoles
getConsoleManager().addConsoleListener(this);
-
+ // register for part events
+ getViewSite().getPage().addPartListener((IPartListener2) this);
getViewSite().getActionBars().updateActionBars();
initPageSwitcher();
}
@@ -85,6 +112,27 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
page.createControl(getPageBook());
console.addPropertyChangeListener(this);
+ // initialize page participants
+ IConsolePageParticipant[] consoleParticipants = ((DebuggerConsoleManager)getConsoleManager()).getPageParticipants(console);
+ final ListenerList<IConsolePageParticipant> participants = new ListenerList<>();
+ for (int i = 0; i < consoleParticipants.length; i++) {
+ participants.add(consoleParticipants[i]);
+ }
+ fConsoleToPageParticipants.put(console, participants);
+ for (IConsolePageParticipant participant : participants) {
+ SafeRunner.run(new ISafeRunnable() {
+ @Override
+ public void run() throws Exception {
+ participant.init(page, console);
+ }
+ @Override
+ public void handleException(Throwable exception) {
+ CDebugUIPlugin.log(exception);
+ participants.remove(participant);
+ }
+ });
+ }
+
return new PageRec(dummyPart, page);
}
@@ -100,7 +148,7 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
public void dispose() {
super.dispose();
getConsoleManager().removeConsoleListener(this);
-
+ getViewSite().getPage().removePartListener((IPartListener2) this);
if (fDisplayConsoleAction != null) {
fDisplayConsoleAction.dispose();
fDisplayConsoleAction = null;
@@ -141,10 +189,63 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
super.showPageRec(pageRec);
fActiveConsole = recConsole;
+ IDebuggerConsole topOfStack = null;
+ if (!fStack.isEmpty()) {
+ topOfStack = fStack.get(0);
+ }
+
+ if (topOfStack != null && !topOfStack.equals(fActiveConsole) && fActive) {
+ deactivateParticipants(topOfStack);
+ }
+ if (fActiveConsole != null && !fActiveConsole.equals(topOfStack)) {
+ fStack.remove(fActiveConsole);
+ fStack.add(0, fActiveConsole);
+ activateParticipants(fActiveConsole);
+ }
+
updateTitle();
}
/**
+ * Activates the participants for the given console, if any.
+ *
+ * @param console the console
+ */
+ private void activateParticipants(IDebuggerConsole console) {
+ // activate
+ if (console != null && fActive) {
+ final ListenerList<IConsolePageParticipant> listeners = getParticipants(console);
+ if (listeners != null) {
+ for (IConsolePageParticipant participant : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ @Override
+ public void run() throws Exception {
+ participant.activated();
+ }
+ @Override
+ public void handleException(Throwable exception) {
+ CDebugUIPlugin.log(exception);
+ listeners.remove(participant);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the page participants registered for the given console, or
+ * <code>null</code>
+ *
+ * @param console
+ * the console
+ * @return registered page participants or <code>null</code>
+ */
+ private ListenerList<IConsolePageParticipant> getParticipants(IDebuggerConsole console) {
+ return fConsoleToPageParticipants.get(console);
+ }
+
+ /**
* Returns a set of consoles known by the view.
*/
protected Set<IDebuggerConsole> getConsoles() {
@@ -169,10 +270,29 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
@Override
protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
+ IDebuggerConsole console = fPartToConsole.remove(part);
+
+ // dispose page participants
+ ListenerList<IConsolePageParticipant> listeners = fConsoleToPageParticipants.remove(console);
+ if (listeners != null) {
+ for (IConsolePageParticipant participant : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ @Override
+ public void run() throws Exception {
+ participant.dispose();
+ }
+
+ @Override
+ public void handleException(Throwable exception) {
+ CDebugUIPlugin.log(exception);
+ }
+ });
+ }
+ }
+
pageRecord.page.dispose();
pageRecord.dispose();
- IConsole console = fPartToConsole.remove(part);
fConsoleToPart.remove(console);
console.removePropertyChangeListener(this);
@@ -236,6 +356,7 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
asyncExec(() -> {
for (IConsole console : consoles) {
if (isAvailable()) {
+ fStack.remove(console);
DebuggerConsoleWorkbenchPart part = fConsoleToPart.get(console);
if (part != null) {
// partClosed() will also cleanup our maps
@@ -387,4 +508,127 @@ implements IConsoleView, IDebuggerConsoleView, IConsoleListener, IPropertyChange
public boolean getWordWrap() {
return false;
}
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> T getAdapter(Class<T> key) {
+ Object adapter = super.getAdapter(key);
+ if (adapter == null) {
+ IDebuggerConsole console = getCurrentConsole();
+ if (console != null) {
+ ListenerList<IConsolePageParticipant> participants = getParticipants(console);
+ // an adapter can be asked for before the participants are created
+ if (participants != null) {
+ for (IConsolePageParticipant participant : participants) {
+ adapter = participant.getAdapter(key);
+ if (adapter != null) {
+ return (T) adapter;
+ }
+ }
+ }
+ }
+ }
+ return (T) adapter;
+ }
+
+ @Override
+ public void partActivated(IWorkbenchPartReference partRef) {
+ if (isThisPart(partRef)) {
+ fActive = true;
+ activateParticipants(fActiveConsole);
+ }
+ }
+
+ @Override
+ public void partBroughtToTop(IWorkbenchPartReference partRef) {
+ // Do nothing
+ }
+
+ @Override
+ public void partClosed(IWorkbenchPartReference partRef) {
+ // Do nothing
+ }
+
+ @Override
+ public void partDeactivated(IWorkbenchPartReference partRef) {
+ if (isThisPart(partRef)) {
+ fActive = false;
+ deactivateParticipants(fActiveConsole);
+ }
+ }
+
+ /**
+ * Returns if the specified part reference is to this view part (if the part
+ * reference is the console view or not)
+ *
+ * @param partRef
+ * the workbench part reference
+ * @return true if the specified part reference is the console view
+ */
+ protected boolean isThisPart(IWorkbenchPartReference partRef) {
+ if (partRef instanceof IViewReference) {
+ IViewReference viewRef = (IViewReference) partRef;
+ if (getViewSite() != null && viewRef.getId().equals(getViewSite().getId())) {
+ String secId = viewRef.getSecondaryId();
+ String mySec = null;
+ if (getSite() instanceof IViewSite) {
+ mySec = ((IViewSite) getSite()).getSecondaryId();
+ }
+ if (mySec == null) {
+ return secId == null;
+ }
+ return mySec.equals(secId);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Deactivates participants for the given console, if any.
+ *
+ * @param console
+ * console to deactivate
+ */
+ private void deactivateParticipants(IDebuggerConsole console) {
+ // deactivate
+ if (console != null) {
+ final ListenerList<IConsolePageParticipant> listeners = getParticipants(console);
+ if (listeners != null) {
+ for (IConsolePageParticipant participant : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+ @Override
+ public void run() throws Exception {
+ participant.deactivated();
+ }
+
+ @Override
+ public void handleException(Throwable exception) {
+ CDebugUIPlugin.log(exception);
+ listeners.remove(participant);
+ }
+ });
+ }
+ }
+ }
+ }
+
+ @Override
+ public void partOpened(IWorkbenchPartReference partRef) {
+ // Do nothing
+ }
+
+ @Override
+ public void partHidden(IWorkbenchPartReference partRef) {
+ // Do nothing
+ }
+
+ @Override
+ public void partVisible(IWorkbenchPartReference partRef) {
+ // Do nothing
+ }
+
+ @Override
+ public void partInputChanged(IWorkbenchPartReference partRef) {
+ // Do nothing
+ }
}

Back to the top