diff options
author | Stephen Flynn | 2016-12-13 19:10:22 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2017-01-19 15:01:09 +0000 |
commit | 576d41fe694f42b59ae8a78a4f085777d45a1ed9 (patch) | |
tree | dd42f40fba4bf79bc4d6dc71fce2c86c6aea68d6 /debug/org.eclipse.cdt.debug.ui/src/org | |
parent | 2c8c7a9bcacffee832d6ba10029c3f1785dc6be9 (diff) | |
download | org.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')
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 + } } |