blob: 0946be663b60c4b146e4af02997b2840f33a25dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.dialogs;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.jface.action.CoolBarManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarContributionItem;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.events.ShellListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars2;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveRegistry;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.internal.AbstractActionBarConfigurer;
import org.eclipse.ui.internal.ActionSetActionBars;
import org.eclipse.ui.internal.ActionSetContributionItem;
import org.eclipse.ui.internal.ActionSetMenuManager;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import org.eclipse.ui.internal.Perspective;
import org.eclipse.ui.internal.PluginActionContributionItem;
import org.eclipse.ui.internal.PluginActionCoolBarContributionItem;
import org.eclipse.ui.internal.PluginActionSet;
import org.eclipse.ui.internal.PluginActionSetBuilder;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.WorkbenchPage;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.WorkbenchWindow;
import org.eclipse.ui.internal.intro.IIntroConstants;
import org.eclipse.ui.internal.registry.ActionSetDescriptor;
import org.eclipse.ui.internal.registry.ActionSetRegistry;
import org.eclipse.ui.internal.registry.IActionSetDescriptor;
import org.eclipse.ui.internal.util.BundleUtility;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.model.WorkbenchViewerSorter;
import org.eclipse.ui.services.IServiceLocator;
import org.eclipse.ui.views.IViewCategory;
import org.eclipse.ui.views.IViewDescriptor;
import org.eclipse.ui.views.IViewRegistry;
import org.eclipse.ui.wizards.IWizardCategory;
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
// @issue add class doc
// @issue need to break this not to show menu specific page
public class CustomizePerspectiveDialog extends TrayDialog {
private Perspective perspective;
WorkbenchWindow window;
private TabFolder tabFolder;
private CheckboxTableViewer actionSetsViewer;
private TreeViewer actionSetMenuViewer;
private TreeViewer actionSetToolbarViewer;
private Combo menusCombo;
private CheckboxTreeViewer menuCategoriesViewer;
private CheckboxTableViewer menuItemsViewer;
private static int lastSelectedTab = -1;
private static int lastSelectedMenuIndex = 0;
private static String lastSelectedActionSetId = null;
private static int cursorSize = 15;
private final static int TAB_WIDTH_IN_DLUS = 490;
private final static int TAB_HEIGHT_IN_DLUS = 230;
private final String shortcutMenuColumnHeaders[] = {
WorkbenchMessages.ActionSetSelection_menuColumnHeader,
WorkbenchMessages.ActionSetSelection_descriptionColumnHeader };
private int[] shortcutMenuColumnWidths = { 125, 300 };
private ActionSetDescriptor selectedActionSet = null;
private ShortcutMenu selectedMenuCategory = null;
ImageDescriptor menuImageDescriptor = null;
ImageDescriptor submenuImageDescriptor = null;
ImageDescriptor toolbarImageDescriptor = null;
ShortcutMenu rootMenu;
private ArrayList actionSets = new ArrayList();
private Hashtable actionSetStructures = new Hashtable();
private IWorkbenchWindowConfigurer configurer;
private List initiallyActive = new ArrayList();
class ActionSetDisplayItem extends Object {
/**
* Tree representation for action set menu and toolbar items.
*/
ArrayList children = new ArrayList();
ActionSetDisplayItem parent = null;
private String id = null;
private String text = ""; //$NON-NLS-1$
String description = ""; //$NON-NLS-1$
ImageDescriptor imageDescriptor;
int type = MENUITEM;
private final static int MENUITEM = 0;
private final static int TOOLITEM = 1;
private ActionSetDisplayItem() {
}
ActionSetDisplayItem(String id) {
this(null, id, "", MENUITEM); //$NON-NLS-1$
}
private ActionSetDisplayItem(ActionSetDisplayItem parent, String id,
String text, int type) {
if (parent != null) {
parent.children.add(this);
this.parent = parent;
}
this.id = id;
this.type = type;
this.text = removeShortcut(text);
this.text = DialogUtil.removeAccel(this.text);
}
private ActionSetDisplayItem find(String itemId) {
for (int i = 0; i < children.size(); i++) {
ActionSetDisplayItem child = (ActionSetDisplayItem) children
.get(i);
if (itemId.equals(child.id))
return child;
}
return null;
}
/**
* @param actionSetId the action to fill
* @param item the item to fill
*/
public void fillMenusFor(String actionSetId, IContributionItem item) {
if (item instanceof ContributionManager) {
ContributionManager mgr = (ContributionManager) item;
IContributionItem[] items = mgr.getItems();
for (int i = 0; i < items.length; i++) {
IContributionItem mgrItem = items[i];
if (mgrItem instanceof ActionSetContributionItem) {
ActionSetContributionItem actionSetItem = (ActionSetContributionItem) mgrItem;
if (actionSetItem.getActionSetId().equals(actionSetId)) {
IContributionItem innerItem = actionSetItem
.getInnerItem();
if (innerItem instanceof MenuManager) {
MenuManager inner = (MenuManager) actionSetItem
.getInnerItem();
ActionSetDisplayItem node = new ActionSetDisplayItem(
this, inner.getId(), inner
.getMenuText(), MENUITEM);
node.fillMenusFor(actionSetId, inner);
} else if (innerItem instanceof ActionSetMenuManager) {
ActionSetMenuManager inner = (ActionSetMenuManager) actionSetItem
.getInnerItem();
MenuManager parentMgr = (MenuManager) inner
.getParent();
ActionSetDisplayItem node = new ActionSetDisplayItem(
this, inner.getId(), parentMgr
.getMenuText(), MENUITEM);
node.fillMenusFor(actionSetId, parentMgr);
} else if (innerItem instanceof PluginActionContributionItem) {
PluginActionContributionItem inner = (PluginActionContributionItem) actionSetItem
.getInnerItem();
ActionSetDisplayItem node = new ActionSetDisplayItem(
this, inner.getId(), inner.getAction()
.getText(), MENUITEM);
IAction action = inner.getAction();
if (action != null) {
node.imageDescriptor = action
.getImageDescriptor();
node.description = action.getDescription();
}
}
}
} else if (mgrItem instanceof MenuManager) {
MenuManager menuMgr = (MenuManager) mgrItem;
boolean found = containsActionSet(menuMgr, actionSetId);
if (found) {
ActionSetDisplayItem node = new ActionSetDisplayItem(
this, menuMgr.getId(), menuMgr
.getMenuText(), MENUITEM);
node.fillMenusFor(actionSetId, menuMgr);
}
}
}
}
}
/**
* @param actionSetId the action set to fill
* @param mgr the manager to fill into
*/
public void fillToolsFor(String actionSetId, CoolBarManager mgr) {
IContributionItem[] items = mgr.getItems();
for (int i = 0; i < items.length; i++) {
if (items[i] instanceof ToolBarContributionItem) {
ToolBarContributionItem cbItem = (ToolBarContributionItem) items[i];
IContributionItem[] subItems = cbItem.getToolBarManager()
.getItems();
for (int j = 0; j < subItems.length; j++) {
IContributionItem subItem = subItems[j];
if (subItem instanceof PluginActionCoolBarContributionItem) {
PluginActionCoolBarContributionItem actionItem = (PluginActionCoolBarContributionItem) subItem;
if (actionItem.getActionSetId().equals(actionSetId)) {
String toolbarId = cbItem.getId();
ActionSetDisplayItem toolbar = find(toolbarId);
if (toolbar == null) {
String toolbarText = window
.getToolbarLabel(toolbarId);
toolbar = new ActionSetDisplayItem(this,
toolbarId, toolbarText, TOOLITEM);
}
IAction action = actionItem.getAction();
String toolItemText = action.getToolTipText();
if (toolItemText == null)
toolItemText = action.getText();
ActionSetDisplayItem toolItem = new ActionSetDisplayItem(
toolbar, action.getId(), toolItemText,
TOOLITEM);
toolItem.imageDescriptor = action
.getImageDescriptor();
toolItem.description = action.getDescription();
}
}
}
}
}
}
int getDepth() {
if (parent == null)
return 0;
return parent.getDepth() + 1;
}
String getDisplayText() {
if (type == MENUITEM) {
if (children.size() > 0) {
if (parent.id.equals("Root")) { //$NON-NLS-1$
return NLS.bind(WorkbenchMessages.ActionSetSelection_menubarLocation, text );
}
}
return text;
}
if (children.size() > 0)
return NLS.bind(WorkbenchMessages.ActionSetSelection_toolbarLocation, text );
return text;
}
protected boolean isTopLevelMenu() {
if (parent == null)
return false;
return parent.parent == null;
}
public String toString() {
StringBuffer sb = new StringBuffer();
for (int i = getDepth(); --i >= 0;) {
sb.append(" "); //$NON-NLS-1$
}
sb.append("id: "); //$NON-NLS-1$
sb.append(id);
sb.append(" text: "); //$NON-NLS-1$
sb.append(text);
sb.append('\n');
for (int i = 0; i < children.size(); ++i) {
sb.append(children.get(i));
}
return sb.toString();
}
}
/**
* The proxy IActionBarConfigurer that gets passed to the application's
* ActionBarAdvisor. This is used to construct a representation of the
* window's hardwired menus and toolbars in order to display their
* structure properly in the preview panes.
*/
public class CustomizeActionBars extends AbstractActionBarConfigurer
implements IActionBars2 {
IWorkbenchWindowConfigurer configurer;
/**
* Fake action bars to use to build the menus and toolbar contributions for the
* workbench. We cannot use the actual workbench action bars, since doing so would
* make the action set items visible.
*/
MenuManager menuManager = new MenuManager();
CoolBarManager coolBarManager = new CoolBarManager();
StatusLineManager statusLineManager = new StatusLineManager();
/**
* Create a new instance of this class.
*
* @param configurer the configurer
*/
public CustomizeActionBars(IWorkbenchWindowConfigurer configurer) {
this.configurer = configurer;
}
/* (non-Javadoc)
* @see org.eclipse.ui.application.IActionBarConfigurer#getWindowConfigurer()
*/
public IWorkbenchWindowConfigurer getWindowConfigurer() {
return configurer;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.application.IActionBarConfigurer#getMenuManager()
*/
public IMenuManager getMenuManager() {
return menuManager;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.application.IActionBarConfigurer#getStatusLineManager()
*/
public IStatusLineManager getStatusLineManager() {
return statusLineManager;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.AbstractActionBarConfigurer#getCoolBarManager()
*/
public ICoolBarManager getCoolBarManager() {
return coolBarManager;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionBars#getToolBarManager()
*/
public IToolBarManager getToolBarManager() {
return null;
}
public void setGlobalActionHandler(String actionID, IAction handler) {
}
public void updateActionBars() {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionBars#clearGlobalActionHandlers()
*/
public void clearGlobalActionHandlers() {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionBars#getGlobalActionHandler(java.lang.String)
*/
public IAction getGlobalActionHandler(String actionId) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.ui.application.IActionBarConfigurer#registerGlobalAction(org.eclipse.jface.action.IAction)
*/
public void registerGlobalAction(IAction action) {
}
public void dispose() {
coolBarManager.dispose();
menuManager.dispose();
statusLineManager.dispose();
}
public final IServiceLocator getServiceLocator() {
return configurer.getWindow();
}
}
class ShortcutMenuItemContentProvider implements IStructuredContentProvider {
ShortcutMenuItemContentProvider() {
}
public Object[] getElements(Object input) {
if (input instanceof ShortcutMenu) {
return ((ShortcutMenu) input).getItems().toArray();
}
return new Object[0];
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
}
class ShortcutMenuItemLabelProvider extends LabelProvider implements
ITableLabelProvider {
private Map imageTable = new Hashtable();
private final static int COLUMN_ID = 0;
private final static int COLUMN_DESCRIPTION = 1;
ShortcutMenuItemLabelProvider() {
}
public final void dispose() {
for (Iterator i = imageTable.values().iterator(); i.hasNext();) {
((Image) i.next()).dispose();
}
imageTable = null;
}
public Image getColumnImage(Object element, int index) {
if (index != COLUMN_ID)
return null;
ImageDescriptor descriptor = null;
if (element instanceof IPerspectiveDescriptor) {
descriptor = ((IPerspectiveDescriptor) element)
.getImageDescriptor();
} else if (element instanceof IViewDescriptor) {
descriptor = ((IViewDescriptor) element).getImageDescriptor();
} else if (element instanceof WorkbenchWizardElement) {
descriptor = ((WorkbenchWizardElement) element)
.getImageDescriptor();
}
if (descriptor == null)
return null;
//obtain the cached image corresponding to the descriptor
if (imageTable == null) {
imageTable = new Hashtable(40);
}
Image image = (Image) imageTable.get(descriptor);
if (image == null) {
image = descriptor.createImage();
imageTable.put(descriptor, image);
}
return image;
}
public String getColumnText(Object element, int columnIndex) {
String text = null;
switch (columnIndex) {
case COLUMN_ID:
text = getText(element);
break;
case COLUMN_DESCRIPTION:
if (element instanceof IPerspectiveDescriptor) {
text = ((IPerspectiveDescriptor) element).getDescription();
} else if (element instanceof IViewDescriptor) {
text = ((IViewDescriptor) element).getDescription();
} else if (element instanceof WorkbenchWizardElement) {
text = ((WorkbenchWizardElement) element).getDescription();
}
break;
}
if (text == null)
text = ""; //$NON-NLS-1$
return text;
}
public String getText(Object element) {
String text = null;
if (element instanceof IPerspectiveDescriptor) {
text = ((IPerspectiveDescriptor) element).getLabel();
} else if (element instanceof IViewDescriptor) {
text = ((IViewDescriptor) element).getLabel();
} else if (element instanceof WorkbenchWizardElement) {
text = ((WorkbenchWizardElement) element).getLabel(element);
}
if (text == null)
text = ""; //$NON-NLS-1$
return text;
}
}
class ShortcutMenu extends Object {
/**
* Tree representation for the shortcut items.
*/
private final static String ID_VIEW = "org.eclipse.ui.views"; //$NON-NLS-1$
private final static String ID_WIZARD = "org.eclipse.ui.wizards"; //$NON-NLS-1$
private final static String ID_PERSP = "org.eclipse.ui.perspectives"; //$NON-NLS-1$
String id;
String label;
private ArrayList items = new ArrayList();
private ArrayList checkedItems = new ArrayList();
ArrayList children = new ArrayList();
ShortcutMenu parent = null;
ShortcutMenu(ShortcutMenu parent, String id, String label) {
super();
this.id = id;
this.parent = parent;
this.label = removeShortcut(label);
this.label = DialogUtil.removeAccel(this.label);
if (parent != null)
parent.children.add(this);
}
void addItem(Object item) {
items.add(item);
}
void addCheckedItem(Object item) {
checkedItems.add(item);
}
public String toString() {
return label;
}
ArrayList getCheckedItems() {
return checkedItems;
}
ArrayList getCheckedItemIds() {
ArrayList ids = new ArrayList();
if (getMenuId() == ID_PERSP) {
for (int i = 0; i < checkedItems.size(); i++) {
IPerspectiveDescriptor item = (IPerspectiveDescriptor) checkedItems
.get(i);
ids.add(item.getId());
}
} else if (getMenuId() == ID_VIEW) {
for (int i = 0; i < checkedItems.size(); i++) {
IViewDescriptor item = (IViewDescriptor) checkedItems
.get(i);
ids.add(item.getId());
}
} else if (getMenuId() == ID_WIZARD) {
for (int i = 0; i < checkedItems.size(); i++) {
WorkbenchWizardElement item = (WorkbenchWizardElement) checkedItems
.get(i);
ids.add(item.getId());
}
}
for (int i = 0; i < children.size(); i++) {
ShortcutMenu menu = (ShortcutMenu) children.get(i);
ids.addAll(menu.getCheckedItemIds());
}
return ids;
}
ArrayList getChildren() {
return children;
}
ArrayList getItems() {
return items;
}
private String getMenuId() {
if (parent == rootMenu)
return id;
return parent.getMenuId();
}
ArrayList getSubtreeItems() {
ArrayList subtreeItems = new ArrayList();
subtreeItems.add(this);
for (int i = 0; i < children.size(); i++) {
ShortcutMenu child = (ShortcutMenu) children.get(i);
subtreeItems.addAll(child.getSubtreeItems());
}
return subtreeItems;
}
Object getItem(String menuItemId) {
for (int i = 0; i < items.size(); i++) {
Object item = items.get(i);
String itemId = null;
if (id == ID_PERSP) {
itemId = ((IPerspectiveDescriptor) item).getId();
} else if (id == ID_VIEW) {
itemId = ((IViewDescriptor) item).getId();
} else if (id == ID_WIZARD) {
itemId = ((WorkbenchWizardElement) item).getId();
}
if (menuItemId.equals(itemId))
return item;
}
return null;
}
boolean isFullyChecked() {
if (getItems().size() != getCheckedItems().size())
return false;
for (int i = 0; i < children.size(); i++) {
ShortcutMenu child = (ShortcutMenu) children.get(i);
if (!child.isFullyChecked())
return false;
}
return true;
}
boolean isFullyUnchecked() {
if (getCheckedItems().size() != 0)
return false;
for (int i = 0; i < children.size(); i++) {
ShortcutMenu child = (ShortcutMenu) children.get(i);
if (!child.isFullyUnchecked())
return false;
}
return true;
}
void removeCheckedItem(Object item) {
checkedItems.remove(item);
}
void checked(boolean checked) {
checkedItems = new ArrayList();
if (checked) {
checkedItems.addAll(items);
}
for (int i = 0; i < children.size(); i++) {
ShortcutMenu child = (ShortcutMenu) children.get(i);
child.checked(checked);
}
}
}
class TreeContentProvider implements ITreeContentProvider {
public void dispose() {
}
public Object[] getChildren(Object element) {
if (element instanceof ActionSetDisplayItem) {
ActionSetDisplayItem node = (ActionSetDisplayItem) element;
return node.children.toArray();
} else if (element instanceof ShortcutMenu) {
ShortcutMenu node = (ShortcutMenu) element;
return node.children.toArray();
} else if (element instanceof ArrayList) {
return ((ArrayList) element).toArray();
}
return new Object[0];
}
public Object[] getElements(Object element) {
return getChildren(element);
}
public Object getParent(Object element) {
if (element instanceof ActionSetDisplayItem) {
ActionSetDisplayItem node = (ActionSetDisplayItem) element;
return node.parent;
} else if (element instanceof ShortcutMenu) {
ShortcutMenu node = (ShortcutMenu) element;
return node.parent;
}
return null;
}
public boolean hasChildren(Object element) {
if (element instanceof ActionSetDisplayItem) {
ActionSetDisplayItem node = (ActionSetDisplayItem) element;
return node.children.size() > 0;
} else if (element instanceof ShortcutMenu) {
ShortcutMenu node = (ShortcutMenu) element;
return node.children.size() > 0;
}
return false;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
class ActionSetLabelProvider extends LabelProvider {
private Map imageTable = new Hashtable();
public void dispose() {
for (Iterator i = imageTable.values().iterator(); i.hasNext();) {
((Image) i.next()).dispose();
}
imageTable = null;
}
public Image getImage(Object element) {
ActionSetDisplayItem item = (ActionSetDisplayItem) element;
ImageDescriptor descriptor = item.imageDescriptor;
if (descriptor == null) {
if (item.type == ActionSetDisplayItem.MENUITEM) {
if (item.children.size() > 0) {
if (item.isTopLevelMenu())
descriptor = menuImageDescriptor;
else
descriptor = submenuImageDescriptor;
} else
return null;
} else if (item.type == ActionSetDisplayItem.TOOLITEM) {
if (item.children.size() > 0)
descriptor = toolbarImageDescriptor;
else
return null;
} else {
return null;
}
}
//obtain the cached image corresponding to the descriptor
if (imageTable == null) {
imageTable = new Hashtable(40);
}
Image image = (Image) imageTable.get(descriptor);
if (image == null) {
image = descriptor.createImage();
imageTable.put(descriptor, image);
}
return image;
}
public String getText(Object element) {
if (element instanceof ActionSetDisplayItem) {
ActionSetDisplayItem item = (ActionSetDisplayItem) element;
String text = item.getDisplayText();
if ((item.type == ActionSetDisplayItem.MENUITEM)
&& (item.children.size() > 0))
text = text + " >"; //$NON-NLS-1$
return text;
}
return ""; //$NON-NLS-1$
}
}
/**
* Create an instance of this Dialog.
*
* @param configurer the configurer
* @param persp the perspective
*/
public CustomizePerspectiveDialog(IWorkbenchWindowConfigurer configurer, Perspective persp) {
super(configurer.getWindow().getShell());
setShellStyle(SWT.MAX | SWT.RESIZE | getShellStyle());
this.configurer = configurer;
perspective = persp;
window = (WorkbenchWindow) configurer.getWindow();
initializeActionSetInput();
initializeShortcutMenuInput();
}
/**
* Adds listeners for the Commands tab.
*
* @since 3.0
*/
private void addActionSetsListeners() {
tabFolder.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
handleTabSelected(event);
}
});
actionSetsViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleActionSetSelected(event);
}
});
actionSetsViewer.getControl().addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
handleActionSetViewerKeyPressed(e);
}
public void keyReleased(KeyEvent e) {
}
});
actionSetMenuViewer.getControl().addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
handleActionSetMenuViewerKeyPressed(e);
}
public void keyReleased(KeyEvent e) {
}
});
actionSetToolbarViewer.getControl().addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
handleActionSetToolbarViewerKeyPressed(e);
}
public void keyReleased(KeyEvent e) {
}
});
}
/**
* Adds listeners for the Shortcuts tab.
*
* @since 3.0
*/
private void addShortcutListeners() {
menusCombo.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// do nothing
}
public void widgetSelected(SelectionEvent e) {
handleMenuSelected();
}
});
menusCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
handleMenuModified();
}
});
menuCategoriesViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleMenuCategorySelected(event);
}
});
menuCategoriesViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
handleMenuCategoryChecked(event);
}
});
menuItemsViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
handleMenuItemChecked(event);
}
});
}
private void buildMenusAndToolbarsFor(CustomizeActionBars customizeActionBars, ActionSetDescriptor actionSetDesc) {
String id = actionSetDesc.getId();
ActionSetActionBars bars = new ActionSetActionBars(
customizeActionBars, window, id);
PluginActionSetBuilder builder = new PluginActionSetBuilder();
PluginActionSet actionSet = null;
try {
actionSet = (PluginActionSet) actionSetDesc.createActionSet();
actionSet.init(null, bars);
} catch (CoreException ex) {
WorkbenchPlugin
.log("Unable to create action set " + actionSetDesc.getId(), ex); //$NON-NLS-1$
return;
}
builder.buildMenuAndToolBarStructure(actionSet, window);
}
private void checkInitialActionSetSelections() {
// Check off the action sets that are active for the perspective.
IActionSetDescriptor[] actionSetDescriptors = ((WorkbenchPage)window.getActivePage()).getActionSets();
initiallyActive = Arrays.asList(actionSetDescriptors);
if (actionSets != null) {
for (int i = 0; i < actionSetDescriptors.length; i++)
actionSetsViewer.setChecked(actionSetDescriptors[i], true);
}
}
private void checkInitialMenuCategorySelections(ShortcutMenu menu) {
// Check off the shortcut categories that are active for the perspective.
if (menu.children.size() == 0)
updateMenuCategoryCheckedState(menu);
else {
for (int i = 0; i < menu.children.size(); i++) {
ShortcutMenu child = (ShortcutMenu) menu.children.get(i);
checkInitialMenuCategorySelections(child);
}
}
}
public boolean close() {
if (showShortcutTab()) {
lastSelectedMenuIndex = menusCombo.getSelectionIndex();
}
lastSelectedTab = tabFolder.getSelectionIndex();
IStructuredSelection selection = (IStructuredSelection) actionSetsViewer
.getSelection();
if (selection.isEmpty())
lastSelectedActionSetId = null;
else
lastSelectedActionSetId = ((ActionSetDescriptor) selection
.getFirstElement()).getId();
return super.close();
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
String title=perspective.getDesc().getLabel();
title = NLS.bind(WorkbenchMessages.ActionSetSelection_customize,title);
shell.setText(title);
window.getWorkbench().getHelpSystem().setHelp(shell,
IWorkbenchHelpContextIds.ACTION_SET_SELECTION_DIALOG);
}
boolean containsActionSet(MenuManager mgr, String actionSetId) {
// Return whether or not the given menuManager contains items for the
// given actionSetId.
IContributionItem[] menuItems = mgr.getItems();
for (int j = 0; j < menuItems.length; j++) {
IContributionItem menuItem = menuItems[j];
if (menuItem instanceof ActionSetContributionItem) {
ActionSetContributionItem actionSetItem = (ActionSetContributionItem) menuItem;
if (actionSetItem.getActionSetId().equals(actionSetId)) {
return true;
}
} else if (menuItem instanceof MenuManager) {
MenuManager childMgr = (MenuManager) menuItem;
boolean found = containsActionSet(childMgr, actionSetId);
if (found)
return true;
}
}
return false;
}
private Composite createActionSetsPage(Composite parent) {
GridData data;
Composite actionSetsComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
actionSetsComposite.setLayout(layout);
// Select... label
Label label = new Label(actionSetsComposite, SWT.WRAP);
label
.setText(NLS.bind(WorkbenchMessages.ActionSetSelection_selectActionSetsLabel,perspective.getDesc().getLabel() ));
data = new GridData(SWT.FILL, SWT.CENTER, true, false);
label.setLayoutData(data);
Label sep = new Label(actionSetsComposite, SWT.HORIZONTAL
| SWT.SEPARATOR);
sep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
SashForm sashComposite = new SashForm(actionSetsComposite,
SWT.HORIZONTAL);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
sashComposite.setLayoutData(data);
// Action Set List Composite
Composite actionSetGroup = new Composite(sashComposite, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
actionSetGroup.setLayout(layout);
actionSetGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
label = new Label(actionSetGroup, SWT.WRAP);
label.setText(WorkbenchMessages.ActionSetSelection_availableActionSets);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
actionSetsViewer = CheckboxTableViewer.newCheckList(actionSetGroup,
SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
actionSetsViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
actionSetsViewer.setLabelProvider(new WorkbenchLabelProvider());
actionSetsViewer.setContentProvider(new ArrayContentProvider());
actionSetsViewer.setSorter(new ActionSetSorter());
// Menu and toolbar composite
Composite actionGroup = new Composite(sashComposite, SWT.NONE);
layout = new GridLayout();
layout.numColumns = 2;
layout.makeColumnsEqualWidth = true;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 0;
actionGroup.setLayout(layout);
actionGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Composite menubarGroup = new Composite(actionGroup, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
menubarGroup.setLayout(layout);
menubarGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
label = new Label(menubarGroup, SWT.WRAP);
label.setText(WorkbenchMessages.ActionSetSelection_menubarActions);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
actionSetMenuViewer = new TreeViewer(menubarGroup);
actionSetMenuViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
actionSetMenuViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
actionSetMenuViewer.setLabelProvider(new ActionSetLabelProvider());
actionSetMenuViewer.setContentProvider(new TreeContentProvider());
Composite toolbarGroup = new Composite(actionGroup, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
toolbarGroup.setLayout(layout);
toolbarGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
label = new Label(toolbarGroup, SWT.WRAP);
label.setText(WorkbenchMessages.ActionSetSelection_toolbarActions);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
actionSetToolbarViewer = new TreeViewer(toolbarGroup);
actionSetToolbarViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
actionSetToolbarViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
actionSetToolbarViewer
.setLabelProvider(new ActionSetLabelProvider());
actionSetToolbarViewer.setContentProvider(new TreeContentProvider());
sashComposite.setWeights(new int[] { 30, 70 });
// Use F2... label
label = new Label(actionSetsComposite, SWT.WRAP);
label.setText(WorkbenchMessages.ActionSetSelection_selectActionSetsHelp);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
return actionSetsComposite;
}
/**
* Returns whether the shortcut tab should be shown.
*
* @return <code>true</code> if the shortcut tab should be shown,
* and <code>false</code> otherwise
* @since 3.0
*/
private boolean showShortcutTab() {
return window.containsSubmenu(WorkbenchWindow.NEW_WIZARD_SUBMENU)
|| window
.containsSubmenu(WorkbenchWindow.OPEN_PERSPECTIVE_SUBMENU)
|| window.containsSubmenu(WorkbenchWindow.SHOW_VIEW_SUBMENU);
}
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
// tab folder
tabFolder = new TabFolder(composite, SWT.NONE);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = convertHorizontalDLUsToPixels(TAB_WIDTH_IN_DLUS);
gd.heightHint = convertVerticalDLUsToPixels(TAB_HEIGHT_IN_DLUS);
tabFolder.setLayoutData(gd);
// Shortcuts tab
if (showShortcutTab()) {
TabItem item1 = new TabItem(tabFolder, SWT.NONE);
item1.setText(WorkbenchMessages.ActionSetSelection_menuTab);
item1.setControl(createMenusPage(tabFolder));
addShortcutListeners();
ArrayList children = rootMenu.getChildren();
String[] itemNames = new String[children.size()];
for (int i = 0; i < children.size(); i++) {
itemNames[i] = ((ShortcutMenu) children.get(i)).label;
}
menusCombo.setItems(itemNames);
}
// Commands tab
TabItem item = new TabItem(tabFolder, SWT.NONE);
item.setText(WorkbenchMessages.ActionSetSelection_actionSetsTab);
item.setControl(createActionSetsPage(tabFolder));
applyDialogFont(tabFolder);
addActionSetsListeners();
actionSetsViewer.setInput(actionSets);
checkInitialActionSetSelections();
// now that both tabs are set up, initialize selections
setInitialSelections();
return composite;
}
private Composite createMenusPage(Composite parent) {
GridData data;
Composite menusComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
menusComposite.setLayout(layout);
// Select... label
Label label = new Label(menusComposite, SWT.WRAP);
label.setText(NLS.bind(WorkbenchMessages.ActionSetSelection_selectMenusLabel, perspective.getDesc().getLabel() ));
data = new GridData(SWT.FILL, SWT.CENTER, true, false);
label.setLayoutData(data);
Label sep = new Label(menusComposite, SWT.HORIZONTAL | SWT.SEPARATOR);
sep.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
SashForm sashComposite = new SashForm(menusComposite, SWT.HORIZONTAL);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
sashComposite.setLayoutData(data);
// Menus List
Composite menusGroup = new Composite(sashComposite, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
menusGroup.setLayout(layout);
menusGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
label = new Label(menusGroup, SWT.WRAP);
label.setText(WorkbenchMessages.ActionSetSelection_availableMenus);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
menusCombo = new Combo(menusGroup, SWT.READ_ONLY);
menusCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
// Categories Tree
label = new Label(menusGroup, SWT.WRAP);
label.setText(WorkbenchMessages.ActionSetSelection_availableCategories);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
menuCategoriesViewer = new CheckboxTreeViewer(menusGroup);
menuCategoriesViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
menuCategoriesViewer.setLabelProvider(new LabelProvider());
menuCategoriesViewer.setContentProvider(new TreeContentProvider());
menuCategoriesViewer.setSorter(new WorkbenchViewerSorter());
// Menu items list
Composite menuItemsGroup = new Composite(sashComposite, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
menuItemsGroup.setLayout(layout);
menuItemsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
label = new Label(menuItemsGroup, SWT.WRAP);
label.setText(WorkbenchMessages.ActionSetSelection_menuItems);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
menuItemsViewer = CheckboxTableViewer.newCheckList(menuItemsGroup,
SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
Table menuTable = menuItemsViewer.getTable();
menuTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
menuItemsViewer.setLabelProvider(new ShortcutMenuItemLabelProvider());
menuItemsViewer
.setContentProvider(new ShortcutMenuItemContentProvider());
menuItemsViewer.setSorter(new WorkbenchViewerSorter());
menuTable.setHeaderVisible(true);
int[] columnWidths = new int[shortcutMenuColumnWidths.length];
for (int i = 0; i < shortcutMenuColumnWidths.length; i++) {
columnWidths[i] = convertHorizontalDLUsToPixels(shortcutMenuColumnWidths[i]);
}
for (int i = 0; i < shortcutMenuColumnHeaders.length; i++) {
TableColumn tc = new TableColumn(menuTable, SWT.NONE, i);
tc.setResizable(true);
tc.setText(shortcutMenuColumnHeaders[i]);
tc.setWidth(columnWidths[i]);
}
sashComposite.setWeights(new int[] { 30, 70 });
return menusComposite;
}
void handleActionSetMenuViewerKeyPressed(KeyEvent event) {
// popup the description for the selected action set menu item
if (event.keyCode == SWT.F2 && event.stateMask == 0) {
IStructuredSelection sel = (IStructuredSelection) actionSetMenuViewer
.getSelection();
ActionSetDisplayItem element = (ActionSetDisplayItem) sel
.getFirstElement();
if (element != null) {
String desc = element.description;
if (desc == null || desc.equals("")) { //$NON-NLS-1$
desc = WorkbenchMessages.ActionSetSelection_noDesc;
}
popUp(desc);
}
}
}
void handleActionSetSelected(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
ActionSetDescriptor element = (ActionSetDescriptor) sel
.getFirstElement();
if (element == selectedActionSet)
return;
String actionSetId = element.getId();
// Hash table is used to cache previous selections
ArrayList structures = (ArrayList) actionSetStructures.get(actionSetId);
ActionSetDisplayItem menubarStructure = null;
ActionSetDisplayItem toolbarStructure = null;
// If the actionset has never been selected then we need to populate the structures
if (structures == null) {
structures = new ArrayList(2);
menubarStructure = new ActionSetDisplayItem("Menubar"); //$NON-NLS-1$
toolbarStructure = new ActionSetDisplayItem("Toolbar"); //$NON-NLS-1$
// Build the menus and toolbars for it using our fake action bars.
// Can't reuse customizeActionBars between action sets due to action set menu reuse. See bug 94827 for details.
CustomizeActionBars customizeActionBars = new CustomizeActionBars(configurer);
// Fill current actionBars in the "fake" workbench action bars
window.fillActionBars(customizeActionBars,
ActionBarAdvisor.FILL_PROXY | ActionBarAdvisor.FILL_MENU_BAR
| ActionBarAdvisor.FILL_COOL_BAR);
// Populate the action bars with the action set
buildMenusAndToolbarsFor(customizeActionBars, element);
// Build the representation to show
menubarStructure.fillMenusFor(actionSetId,
customizeActionBars.menuManager);
toolbarStructure.fillToolsFor(actionSetId,
customizeActionBars.coolBarManager);
// Be sure to dispose the custom bars or we'll leak
customizeActionBars.dispose();
// Add menubarStructure and toolbarStructure to arrayList
structures.add(menubarStructure);
structures.add(toolbarStructure);
// Add the structure to the hash table with key actionSetId
actionSetStructures.put(actionSetId, structures);
}
// retrieve the actionsets from the arraylist
if (menubarStructure == null)
menubarStructure = (ActionSetDisplayItem) structures.get(0);
if (toolbarStructure == null)
toolbarStructure = (ActionSetDisplayItem) structures.get(1);
// fill the menu structure table
actionSetMenuViewer.setInput(menubarStructure);
if (menubarStructure.children.size() > 0) {
actionSetMenuViewer
.reveal(menubarStructure.children.get(0));
}
// fill the toolbar structure table
actionSetToolbarViewer.setInput(toolbarStructure);
if (toolbarStructure.children.size() > 0) {
actionSetToolbarViewer.reveal(toolbarStructure.children
.get(0));
}
selectedActionSet = element;
}
void handleActionSetToolbarViewerKeyPressed(KeyEvent event) {
// popup the description for the selected action set toolbar item
if (event.keyCode == SWT.F2 && event.stateMask == 0) {
IStructuredSelection sel = (IStructuredSelection) actionSetToolbarViewer
.getSelection();
ActionSetDisplayItem element = (ActionSetDisplayItem) sel
.getFirstElement();
if (element != null) {
String desc = element.description;
if (desc == null || desc.equals("")) { //$NON-NLS-1$
desc = WorkbenchMessages.ActionSetSelection_noDesc;
}
popUp(desc);
}
}
}
void handleActionSetViewerKeyPressed(KeyEvent event) {
// popup the description for the selected action set
if (event.keyCode == SWT.F2 && event.stateMask == 0) {
IStructuredSelection sel = (IStructuredSelection) actionSetsViewer
.getSelection();
ActionSetDescriptor element = (ActionSetDescriptor) sel
.getFirstElement();
if (element != null) {
String desc = element.getDescription();
if (desc == null || desc.equals("")) { //$NON-NLS-1$
desc = WorkbenchMessages.ActionSetSelection_noDesc;
}
popUp(desc);
}
}
}
void handleMenuCategoryChecked(CheckStateChangedEvent event) {
ShortcutMenu checkedCategory = (ShortcutMenu) event.getElement();
boolean checked = event.getChecked();
checkedCategory.checked(checked);
// check/uncheck the element's category subtree
menuCategoriesViewer.setSubtreeChecked(checkedCategory, checked);
// set gray state of the element's category subtree, all items should
// not be grayed
ArrayList subtree = checkedCategory.getSubtreeItems();
ShortcutMenu menuItemInput = (ShortcutMenu) menuItemsViewer.getInput();
for (int i = 0; i < subtree.size(); i++) {
Object child = subtree.get(i);
menuCategoriesViewer.setGrayed(child, false);
if (child == menuItemInput)
menuItemsViewer.setAllChecked(checked);
}
menuCategoriesViewer.setGrayed(checkedCategory, false);
updateMenuCategoryCheckedState(checkedCategory.parent);
}
void handleMenuCategorySelected(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
ShortcutMenu element = (ShortcutMenu) sel.getFirstElement();
if (element == selectedMenuCategory)
return;
if (element != menuItemsViewer.getInput()) {
menuItemsViewer.setInput(element);
}
if (element != null) {
menuItemsViewer.setCheckedElements(element.getCheckedItems()
.toArray());
}
}
void handleMenuItemChecked(CheckStateChangedEvent event) {
ShortcutMenu selectedMenu = (ShortcutMenu) menuItemsViewer.getInput();
boolean itemChecked = event.getChecked();
Object item = event.getElement();
if (itemChecked) {
selectedMenu.addCheckedItem(item);
} else {
selectedMenu.removeCheckedItem(item);
}
updateMenuCategoryCheckedState(selectedMenu);
}
void handleMenuModified() {
String text = menusCombo.getText();
String[] items = menusCombo.getItems();
int itemIndex = -1;
for (int i = 0; i < items.length; i++) {
if (items[i].equals(text)) {
itemIndex = i;
break;
}
}
if (itemIndex == -1)
return;
ShortcutMenu element = (ShortcutMenu) rootMenu.children.get(itemIndex);
handleMenuSelected(element);
}
void handleMenuSelected() {
int i = menusCombo.getSelectionIndex();
ShortcutMenu element = (ShortcutMenu) rootMenu.children.get(i);
handleMenuSelected(element);
}
void handleMenuSelected(ShortcutMenu element) {
if (element != menuCategoriesViewer.getInput()) {
menuCategoriesViewer.setInput(element);
menuCategoriesViewer.expandAll();
if (element != null) {
if (element.getChildren().size() > 0) {
StructuredSelection sel = new StructuredSelection(element
.getChildren().get(0));
menuCategoriesViewer.setSelection(sel, true);
} else {
menuItemsViewer.setInput(element);
menuItemsViewer.setCheckedElements(element
.getCheckedItems().toArray());
}
} else {
menuCategoriesViewer.setInput(element);
menuItemsViewer.setInput(element);
}
checkInitialMenuCategorySelections(rootMenu);
}
}
void handleTabSelected(SelectionEvent event) {
TabItem item = (TabItem) event.item;
Control control = item.getControl();
if (control != null)
control.setFocus();
}
private void initializeActionSetInput() {
// Just get the action sets at this point. Do not load the action set until it
// is actually selected in the dialog.
ActionSetRegistry reg = WorkbenchPlugin.getDefault()
.getActionSetRegistry();
IActionSetDescriptor[] sets = reg.getActionSets();
for (int i = 0; i < sets.length; i++) {
ActionSetDescriptor actionSetDesc = (ActionSetDescriptor) sets[i];
if (WorkbenchActivityHelper.filterItem(actionSetDesc))
continue;
actionSets.add(actionSetDesc);
}
String iconPath = "$nl$/icons/full/obj16/menu.gif";//$NON-NLS-1$
URL url = BundleUtility.find(PlatformUI.PLUGIN_ID, iconPath);
menuImageDescriptor = ImageDescriptor.createFromURL(url);
iconPath = "$nl$/icons/full/obj16/submenu.gif";//$NON-NLS-1$
url = BundleUtility.find(PlatformUI.PLUGIN_ID, iconPath);
submenuImageDescriptor = ImageDescriptor.createFromURL(url);
iconPath = "$nl$/icons/full/obj16/toolbar.gif";//$NON-NLS-1$
url = BundleUtility.find(PlatformUI.PLUGIN_ID, iconPath);
toolbarImageDescriptor = ImageDescriptor.createFromURL(url);
}
private void initializeShortCutMenu(ShortcutMenu menu,
IWizardCategory element, List activeIds) {
ShortcutMenu category = new ShortcutMenu(menu, element.getId(), element
.getLabel());
Object[] wizards = element.getWizards();
for (int i = 0; i < wizards.length; i++) {
WorkbenchWizardElement wizard = (WorkbenchWizardElement) wizards[i];
category.addItem(wizard);
if (activeIds.contains(wizard.getId()))
category.addCheckedItem(wizard);
}
// @issue should not pass in null
IWizardCategory [] children = element.getCategories();
for (int i = 0; i < children.length; i++) {
initializeShortCutMenu(category, children[i], activeIds);
}
}
private void initializeShortcutMenuInput() {
rootMenu = new ShortcutMenu(null, "Root", ""); //$NON-NLS-1$ //$NON-NLS-2$
List activeIds;
if (window.containsSubmenu(WorkbenchWindow.NEW_WIZARD_SUBMENU)) {
ShortcutMenu wizardMenu = new ShortcutMenu(rootMenu,
ShortcutMenu.ID_WIZARD, WorkbenchMessages.ActionSetDialogInput_wizardCategory);
IWizardCategory wizardCollection = WorkbenchPlugin.getDefault().getNewWizardRegistry().getRootCategory();
IWizardCategory [] wizardCategories = wizardCollection.getCategories();
activeIds = Arrays.asList(perspective.getNewWizardShortcuts());
for (int i = 0; i < wizardCategories.length; i++) {
IWizardCategory element = wizardCategories[i];
if (WorkbenchActivityHelper.filterItem(element))
continue;
initializeShortCutMenu(wizardMenu, element, activeIds);
}
}
if (window.containsSubmenu(WorkbenchWindow.OPEN_PERSPECTIVE_SUBMENU)) {
ShortcutMenu perspMenu = new ShortcutMenu(
rootMenu,
ShortcutMenu.ID_PERSP,
WorkbenchMessages.ActionSetDialogInput_perspectiveCategory);
IPerspectiveRegistry perspReg = WorkbenchPlugin.getDefault()
.getPerspectiveRegistry();
IPerspectiveDescriptor[] persps = perspReg.getPerspectives();
for (int i = 0; i < persps.length; i++) {
if (WorkbenchActivityHelper.filterItem(persps[i]))
continue;
perspMenu.addItem(persps[i]);
}
activeIds = Arrays.asList(perspective.getPerspectiveShortcuts());
for (int i = 0; i < activeIds.size(); i++) {
String id = (String) activeIds.get(i);
Object item = perspMenu.getItem(id);
if (item != null)
perspMenu.addCheckedItem(item);
}
}
if (window.containsSubmenu(WorkbenchWindow.SHOW_VIEW_SUBMENU)) {
ShortcutMenu viewMenu = new ShortcutMenu(rootMenu,
ShortcutMenu.ID_VIEW, WorkbenchMessages.ActionSetDialogInput_viewCategory);
IViewRegistry viewReg = WorkbenchPlugin.getDefault()
.getViewRegistry();
IViewCategory [] categories = viewReg.getCategories();
activeIds = Arrays.asList(perspective.getShowViewShortcuts());
for (int i = 0; i < categories.length; i++) {
IViewCategory category = categories[i];
if (WorkbenchActivityHelper.filterItem(category))
continue;
ShortcutMenu viewCategory = new ShortcutMenu(viewMenu, category
.getId(), category.getLabel());
IViewDescriptor [] views = category.getViews();
if (views != null) {
for (int j = 0; j < views.length; j++) {
IViewDescriptor view = views[j];
if (view.getId().equals(IIntroConstants.INTRO_VIEW_ID))
continue;
if (WorkbenchActivityHelper.filterItem(view))
continue;
viewCategory.addItem(view);
if (activeIds.contains(view.getId()))
viewCategory.addCheckedItem(view);
}
}
}
}
}
protected void okPressed() {
if (showShortcutTab()) {
ArrayList menus = rootMenu.children;
for (int i = 0; i < menus.size(); i++) {
ShortcutMenu menu = (ShortcutMenu) menus.get(i);
if (ShortcutMenu.ID_VIEW.equals(menu.id)) {
perspective.setShowViewActionIds(menu.getCheckedItemIds());
} else if (ShortcutMenu.ID_PERSP.equals(menu.id)) {
perspective.setPerspectiveActionIds(menu
.getCheckedItemIds());
} else if (ShortcutMenu.ID_WIZARD.equals(menu.id)) {
perspective.setNewWizardActionIds(menu.getCheckedItemIds());
}
}
}
ArrayList toAdd = new ArrayList();
ArrayList toRemove = new ArrayList();
toRemove.addAll(initiallyActive);
Object[] selected = actionSetsViewer.getCheckedElements();
for (int i = 0; i < selected.length; i++) {
Object obj = selected[i];
toRemove.remove(obj);
if (!initiallyActive.contains(toRemove)) {
toAdd.add(obj);
}
}
perspective.turnOnActionSets((IActionSetDescriptor[]) toAdd.toArray(new IActionSetDescriptor[toAdd.size()]));
perspective.turnOffActionSets((IActionSetDescriptor[]) toRemove.toArray(new IActionSetDescriptor[toAdd.size()]));
super.okPressed();
}
private void popUp(String description) {
Display display = getShell().getDisplay();
final Shell descShell = new Shell(getShell(), SWT.ON_TOP | SWT.NO_TRIM);
GridLayout layout = new GridLayout();
layout.marginHeight = 1;
layout.marginWidth = 1;
descShell.setLayout(layout);
descShell.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
Composite insetComposite = new Composite(descShell, SWT.NULL);
insetComposite.setBackground(display
.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
layout = new GridLayout();
layout.marginHeight = 2;
layout.marginWidth = 2;
insetComposite.setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH);
insetComposite.setLayoutData(data);
insetComposite.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
descShell.dispose();
}
public void focusGained(FocusEvent e) {
}
});
insetComposite.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
descShell.dispose();
}
public void keyReleased(KeyEvent e) {
}
});
StyledText descText = new StyledText(insetComposite, SWT.MULTI
| SWT.READ_ONLY | SWT.WRAP);
descText.setForeground(display
.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
descText.setBackground(display
.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
data = new GridData(GridData.FILL_BOTH);
data.widthHint = 200;
descText.setLayoutData(data);
descText.setText(description);
descText.setEnabled(false);
descShell.pack();
Rectangle displayBounds = display.getClientArea();
Rectangle bounds = descShell.getBounds();
Point point = display.getCursorLocation();
Point location = new Point(point.x + cursorSize, point.y + cursorSize);
if (location.x + bounds.width > displayBounds.x + displayBounds.width) {
location.x = displayBounds.x + displayBounds.width - bounds.width;
}
if (location.y + bounds.height > displayBounds.x + displayBounds.height) {
location.y = displayBounds.y + displayBounds.height - bounds.height;
}
descShell.setLocation(location);
descShell.open();
descShell.addShellListener(new ShellListener() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
*/
public void shellActivated(ShellEvent e) {
// Do nothing
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
*/
public void shellClosed(ShellEvent e) {
// Do nothing.
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
*/
public void shellDeactivated(ShellEvent e) {
descShell.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellDeiconified(org.eclipse.swt.events.ShellEvent)
*/
public void shellDeiconified(ShellEvent e) {
// Do nothing
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ShellListener#shellIconified(org.eclipse.swt.events.ShellEvent)
*/
public void shellIconified(ShellEvent e) {
descShell.dispose();
}
});
}
String removeShortcut(String label) {
if (label == null)
return label;
int end = label.lastIndexOf('@');
if (end >= 0)
label = label.substring(0, end);
return label;
}
private void setInitialSelections() {
Object item = actionSetsViewer.getElementAt(0);
if (lastSelectedActionSetId != null) {
for (int i = 0; i < actionSets.size(); i++) {
ActionSetDescriptor actionSet = (ActionSetDescriptor) actionSets
.get(i);
if (actionSet.getId().equals(lastSelectedActionSetId)) {
item = actionSet;
break;
}
}
}
if (item != null) {
StructuredSelection sel = new StructuredSelection(item);
actionSetsViewer.setSelection(sel, true);
}
if (showShortcutTab()) {
menusCombo.select(lastSelectedMenuIndex);
}
if (lastSelectedTab != -1) {
tabFolder.setSelection(lastSelectedTab);
}
if ((tabFolder.getSelectionIndex() == 0) && showShortcutTab()) {
menusCombo.setFocus();
} else {
actionSetsViewer.getControl().setFocus();
}
}
private void updateMenuCategoryCheckedState(ShortcutMenu menu) {
if (menu == rootMenu)
return;
if (menu.isFullyChecked()) {
menuCategoriesViewer.setParentsGrayed(menu, false);
menuCategoriesViewer.setChecked(menu, true);
} else if (menu.isFullyUnchecked()) {
menuCategoriesViewer.setParentsGrayed(menu, false);
menuCategoriesViewer.setChecked(menu, false);
} else {
menuCategoriesViewer.setParentsGrayed(menu, true);
menuCategoriesViewer.setChecked(menu, true);
}
updateMenuCategoryCheckedState(menu.parent);
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#applyDialogFont()
*/
protected boolean applyDialogFont() {
return false;
}
}