Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java154
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

Back to the top