001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal.console;
011:
012: import java.util.List;
013:
014: import org.eclipse.jface.action.Action;
015: import org.eclipse.jface.action.ActionContributionItem;
016: import org.eclipse.jface.action.IMenuCreator;
017: import org.eclipse.swt.widgets.Control;
018: import org.eclipse.swt.widgets.Display;
019: import org.eclipse.swt.widgets.Menu;
020: import org.eclipse.ui.PlatformUI;
021: import org.eclipse.ui.console.ConsolePlugin;
022: import org.eclipse.ui.console.IConsole;
023: import org.eclipse.ui.console.IConsoleConstants;
024: import org.eclipse.ui.console.IConsoleListener;
025: import org.eclipse.ui.console.IConsoleView;
026: import org.eclipse.ui.texteditor.IUpdate;
027:
028: /**
029: * Drop down action in the console to select the console to display.
030: */
031: class ConsoleDropDownAction extends Action implements IMenuCreator,
032: IConsoleListener, IUpdate {
033:
034: private IConsoleView fView;
035: private Menu fMenu;
036:
037: /* (non-Javadoc)
038: * @see org.eclipse.ui.texteditor.IUpdate#update()
039: */
040: public void update() {
041: IConsole[] consoles = ConsolePlugin.getDefault()
042: .getConsoleManager().getConsoles();
043: setEnabled(consoles.length > 1);
044: }
045:
046: public ConsoleDropDownAction(IConsoleView view) {
047: fView = view;
048: setText(ConsoleMessages.ConsoleDropDownAction_0);
049: setToolTipText(ConsoleMessages.ConsoleDropDownAction_1);
050: setImageDescriptor(ConsolePluginImages
051: .getImageDescriptor(IConsoleConstants.IMG_VIEW_CONSOLE));
052: PlatformUI.getWorkbench().getHelpSystem().setHelp(this ,
053: IConsoleHelpContextIds.CONSOLE_DISPLAY_CONSOLE_ACTION);
054: setMenuCreator(this );
055: ConsolePlugin.getDefault().getConsoleManager()
056: .addConsoleListener(this );
057: update();
058: }
059:
060: /* (non-Javadoc)
061: * @see org.eclipse.jface.action.IMenuCreator#dispose()
062: */
063: public void dispose() {
064: if (fMenu != null) {
065: fMenu.dispose();
066: }
067:
068: fView = null;
069: ConsolePlugin.getDefault().getConsoleManager()
070: .removeConsoleListener(this );
071: }
072:
073: /* (non-Javadoc)
074: * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
075: */
076: public Menu getMenu(Menu parent) {
077: return null;
078: }
079:
080: /* (non-Javadoc)
081: * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
082: */
083: public Menu getMenu(Control parent) {
084: if (fMenu != null) {
085: fMenu.dispose();
086: }
087:
088: fMenu = new Menu(parent);
089: IConsole[] consoles = ConsolePlugin.getDefault()
090: .getConsoleManager().getConsoles();
091: IConsole current = fView.getConsole();
092: for (int i = 0; i < consoles.length; i++) {
093: IConsole console = consoles[i];
094: Action action = new ShowConsoleAction(fView, console);
095: action.setChecked(console.equals(current));
096: addActionToMenu(fMenu, action, i + 1);
097: }
098: return fMenu;
099: }
100:
101: private void addActionToMenu(Menu parent, Action action,
102: int accelerator) {
103: if (accelerator < 10) {
104: StringBuffer label = new StringBuffer();
105: //add the numerical accelerator
106: label.append('&');
107: label.append(accelerator);
108: label.append(' ');
109: label.append(action.getText());
110: action.setText(label.toString());
111: }
112: ActionContributionItem item = new ActionContributionItem(action);
113: item.fill(parent, -1);
114: }
115:
116: /* (non-Javadoc)
117: * @see org.eclipse.jface.action.IAction#run()
118: */
119: public void run() {
120: ConsoleView consoleView = (ConsoleView) fView;
121: boolean pinned = consoleView.isPinned();
122: if (pinned) {
123: consoleView.setPinned(false);
124: }
125: List stack = consoleView.getConsoleStack();
126: if (stack.size() > 1) {
127: IConsole console = (IConsole) stack.get(1);
128: fView.display(console);
129: }
130: if (pinned) {
131: consoleView.setPinned(true);
132: }
133: }
134:
135: /* (non-Javadoc)
136: * @see org.eclipse.ui.console.IConsoleListener#consolesAdded(org.eclipse.ui.console.IConsole[])
137: */
138: public void consolesAdded(IConsole[] consoles) {
139: Display display = ConsolePlugin.getStandardDisplay();
140: display.asyncExec(new Runnable() {
141: public void run() {
142: update();
143: }
144: });
145: }
146:
147: /* (non-Javadoc)
148: *
149: * Dispose the menu when a launch is removed, such that the actions in this
150: * menu do not hang on to associated resources.
151: *
152: * @see org.eclipse.ui.console.IConsoleListener#consolesRemoved(org.eclipse.ui.console.IConsole[])
153: */
154: public void consolesRemoved(IConsole[] consoles) {
155: Display display = ConsolePlugin.getStandardDisplay();
156: display.asyncExec(new Runnable() {
157: public void run() {
158: if (fMenu != null) {
159: fMenu.dispose();
160: }
161: update();
162: }
163: });
164: }
165: }
|