diff options
Diffstat (limited to 'debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleDropDownAction.java')
-rw-r--r-- | debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleDropDownAction.java | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleDropDownAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleDropDownAction.java new file mode 100644 index 00000000000..2811a3162dd --- /dev/null +++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/views/debuggerconsole/DebuggerConsoleDropDownAction.java @@ -0,0 +1,154 @@ +/******************************************************************************* + * Copyright (c) 2016 Ericsson and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.ui.views.debuggerconsole; + +import org.eclipse.cdt.debug.internal.ui.CDebugImages; +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.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IMenuCreator; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.console.IConsole; +import org.eclipse.ui.console.IConsoleListener; +import org.eclipse.ui.progress.UIJob; +import org.eclipse.ui.texteditor.IUpdate; + +/** + * Drop down action in the DebuggerConsoleView to select which console to display. + */ +public class DebuggerConsoleDropDownAction extends Action implements IMenuCreator, IConsoleListener, IUpdate { + + private DebuggerConsoleView fView; + private Menu fMenu; + + public DebuggerConsoleDropDownAction(DebuggerConsoleView view) { + fView = view; + setText(ConsoleMessages.ConsoleDropDownAction_name); + setToolTipText(ConsoleMessages.ConsoleDropDownAction_description); + setImageDescriptor(CDebugImages.DESC_OBJS_DEBUGGER_CONSOLE_SELECT); + setMenuCreator(this); + getDebuggerConsoleManager().addConsoleListener(this); + update(); + } + + @Override + public void dispose() { + if (fMenu != null) { + fMenu.dispose(); + } + + fView = null; + getDebuggerConsoleManager().removeConsoleListener(this); + } + + private IDebuggerConsoleManager getDebuggerConsoleManager() { + return CDebugUIPlugin.getDebuggerConsoleManager(); + } + + @Override + public void update() { + IDebuggerConsole[] consoles = getDebuggerConsoleManager().getConsoles(); + // Keep the button enabled as soon as there is at least one console. + // Having it disabled for a single console can prove confusing to users, + // so we enable it even for a single console. + setEnabled(consoles.length > 0); + } + + @Override + public Menu getMenu(Menu parent) { + return null; + } + + @Override + public Menu getMenu(Control parent) { + if (fMenu != null) { + fMenu.dispose(); + } + + fMenu = new Menu(parent); + IDebuggerConsole[] consoles = getDebuggerConsoleManager().getConsoles(); + IDebuggerConsole current = fView.getCurrentConsole(); + for (int i = 0; i < consoles.length; i++) { + IDebuggerConsole console = consoles[i]; + Action action = new DebuggerShowConsoleAction(fView, console); + action.setChecked(console.equals(current)); + addActionToMenu(fMenu, action, i + 1); + } + return fMenu; + } + + private void addActionToMenu(Menu parent, Action action, int accelerator) { + if (accelerator < 10) { + StringBuffer label= new StringBuffer(); + //add the numerical accelerator + label.append('&'); + label.append(accelerator); + label.append(' '); + label.append(action.getText()); + action.setText(label.toString()); + } + ActionContributionItem item= new ActionContributionItem(action); + item.fill(parent, -1); + } + + @Override + public void run() { + IDebuggerConsole[] consoles = getDebuggerConsoleManager().getConsoles(); + IDebuggerConsole current = fView.getCurrentConsole(); + int idx = 0; + for (int i = 0; i < consoles.length; i++) { + idx = i; + if (consoles[i] == current) { + break; + } + } + int next = idx+1; + if (next >= consoles.length) { + next = 0; + } + fView.display(consoles[next]); + } + + @Override + public void consolesAdded(IConsole[] consoles) { + UIJob job = new UIJob("") { //$NON-NLS-1$ + @Override + public IStatus runInUIThread(IProgressMonitor monitor) { + update(); + return Status.OK_STATUS; + } + }; + job.setSystem(true); + job.setPriority(Job.INTERACTIVE); + job.schedule(); + } + + @Override + public void consolesRemoved(IConsole[] consoles) { + UIJob job = new UIJob("") { //$NON-NLS-1$ + @Override + public IStatus runInUIThread(IProgressMonitor monitor) { + if (fMenu != null) { + fMenu.dispose(); + } + update(); + return Status.OK_STATUS; + } + }; + job.setSystem(true); + job.setPriority(Job.INTERACTIVE); + job.schedule(); + } +}
\ No newline at end of file |