blob: 973f7cab8871037c4304169b4d16f36158a83f14 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
/**
* A dynamic menu item to switch to other opened workbench windows.
*/
public class SwitchToWindowMenu extends ContributionItem {
private static final int MAX_TEXT_LENGTH = 40;
private IWorkbenchWindow workbenchWindow;
private boolean showSeparator;
private boolean dirty = true;
private IMenuListener menuListener = new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.markDirty();
dirty = true;
}
};
/**
* Creates a new instance of this class.
*
* @param window the workbench window this action applies to
* @param showSeparator whether to add a separator in the menu
*/
public SwitchToWindowMenu(IWorkbenchWindow window, String id,
boolean showSeparator) {
super(id);
this.workbenchWindow = window;
this.showSeparator = showSeparator;
}
/**
* Returns the text for a window. This may be truncated to fit
* within the MAX_TEXT_LENGTH.
*/
private String calcText(int number, IWorkbenchWindow window) {
String suffix = window.getShell().getText();
if (suffix == null) {
return null;
}
StringBuffer sb = new StringBuffer();
if (number < 10) {
sb.append('&');
}
sb.append(number);
sb.append(' ');
if (suffix.length() <= MAX_TEXT_LENGTH) {
sb.append(suffix);
} else {
sb.append(suffix.substring(0, MAX_TEXT_LENGTH));
sb.append("..."); //$NON-NLS-1$
}
return sb.toString();
}
/**
* Fills the given menu with menu items for all
* opened workbench windows.
*/
public void fill(Menu menu, int index) {
// Get workbench windows.
IWorkbench workbench = workbenchWindow.getWorkbench();
IWorkbenchWindow[] array = workbench.getWorkbenchWindows();
// avoid showing the separator and list for 0 or 1 items
if (array.length < 2) {
return;
}
if (getParent() instanceof MenuManager) {
((MenuManager) getParent()).addMenuListener(menuListener);
}
if (!dirty) {
return;
}
// Add separator.
if (showSeparator) {
new MenuItem(menu, SWT.SEPARATOR, index);
++index;
}
// Add one item for each window.
int count = 1;
for (int i = 0; i < array.length; i++) {
final IWorkbenchWindow window = array[i];
// can encounter disposed shells if this update is in response to a shell closing
if (!window.getShell().isDisposed()) {
String name = calcText(count, window);
if (name != null) {
MenuItem mi = new MenuItem(menu, SWT.RADIO, index);
index++;
count++;
mi.setText(name);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Shell windowShell = window.getShell();
if (windowShell.getMinimized()) {
windowShell.setMinimized(false);
}
windowShell.setActive();
windowShell.moveAbove(null);
}
});
mi.setSelection(window == workbenchWindow);
}
}
}
dirty = false;
}
/**
* Overridden to always return true and force dynamic menu building.
*/
public boolean isDirty() {
return dirty;
}
/**
* Overridden to always return true and force dynamic menu building.
*/
public boolean isDynamic() {
return true;
}
}