blob: e4501df1062f4ed37cc8b3a271d7771799bc3606 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2014 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.ide.dialogs;
import java.util.Collections;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.Util;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ContributionItemFactory;
import org.eclipse.ui.actions.OpenFileAction;
import org.eclipse.ui.actions.OpenWithMenu;
import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
import org.eclipse.ui.internal.ShowInMenu;
import org.eclipse.ui.internal.WorkbenchImages;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.ui.views.IViewDescriptor;
/**
* Shows a list of resources to the user with a text entry field for a string
* pattern used to filter the list of resources.
*
* @since 2.1
*/
public class OpenResourceDialog extends FilteredResourcesSelectionDialog {
private final class ResourceOpenWithMenu extends OpenWithMenu {
private ResourceOpenWithMenu(IWorkbenchPage page, IAdaptable file) {
super(page, file);
}
@Override
protected void openEditor(IEditorDescriptor editorDescriptor, boolean openUsingDescriptor) {
computeResult();
setResult(Collections.EMPTY_LIST);
close();
super.openEditor(editorDescriptor, openUsingDescriptor);
}
}
private final class ResourceShowInMenu extends ShowInMenu {
private final IStructuredSelection selectedItems;
private ResourceShowInMenu(IStructuredSelection selectedItems, IWorkbenchWindow workbenchWindow) {
this.selectedItems = selectedItems;
setId(ContributionItemFactory.VIEWS_SHOW_IN.getId());
initialize(workbenchWindow);
}
@Override
protected ShowInContext getContext(IWorkbenchPart sourcePart) {
return new ShowInContext(null, selectedItems);
}
@Override
protected IWorkbenchPart getSourcePart() {
return null;
}
@Override
protected IContributionItem getContributionItem(IViewDescriptor viewDescriptor) {
final String targetId= viewDescriptor.getId();
String label = '&' + viewDescriptor.getLabel();
ImageDescriptor icon = viewDescriptor.getImageDescriptor();
Action action = new Action(label, icon) {
@Override
public void run() {
computeResult();
setResult(Collections.EMPTY_LIST);
close();
IWorkbenchPage page = getActivePage();
IViewPart view;
try {
view = page.showView(targetId);
IShowInTarget target = getShowInTarget(view);
if (!(target != null && target.show(getContext(null)))) {
page.getWorkbenchWindow().getShell().getDisplay().beep();
}
} catch (PartInitException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH,
IStatus.ERROR, "", e)); //$NON-NLS-1$
}
}
private IShowInTarget getShowInTarget(IWorkbenchPart targetPart) {
return (IShowInTarget) org.eclipse.ui.internal.util.Util.getAdapter(targetPart, IShowInTarget.class);
}
};
action.setId(targetId);
return new ActionContributionItem(action);
}
}
private static final int OPEN_WITH_ID = IDialogConstants.CLIENT_ID + 1;
private static final int SHOW_IN_ID = IDialogConstants.CLIENT_ID + 2;
private Button showInButton;
private Button openWithButton;
/**
* Creates a new instance of the class.
*
* @param parentShell
* the parent shell
* @param container
* the container
* @param typesMask
* the types mask
*/
public OpenResourceDialog(Shell parentShell, IContainer container,
int typesMask) {
super(parentShell, true, container, typesMask);
setTitle(IDEWorkbenchMessages.OpenResourceDialog_title);
}
@Override
protected void fillContextMenu(IMenuManager menuManager) {
super.fillContextMenu(menuManager);
final IStructuredSelection selectedItems = getSelectedItems();
if (selectedItems.isEmpty()) {
return;
}
IWorkbenchPage activePage = getActivePage();
if (activePage == null) {
return;
}
menuManager.add(new Separator());
// Add 'Open' menu item
OpenFileAction openFileAction = new OpenFileAction(activePage) {
@Override
public void run() {
okPressed();
}
};
openFileAction.selectionChanged(selectedItems);
if (openFileAction.isEnabled()) {
menuManager.add(openFileAction);
IAdaptable selectedAdaptable = getSelectedAdaptable();
if (selectedAdaptable != null) {
// Add 'Open With' sub-menu
MenuManager subMenu = new MenuManager(IDEWorkbenchMessages.OpenResourceDialog_openWithMenu_label);
OpenWithMenu openWithMenu = new ResourceOpenWithMenu(activePage, selectedAdaptable);
subMenu.add(openWithMenu);
menuManager.add(subMenu);
}
}
// Add 'Show In' sub-menu
MenuManager showInMenuManager = new MenuManager(IDEWorkbenchMessages.OpenResourceDialog_showInMenu_label);
ShowInMenu showInMenu = new ResourceShowInMenu(selectedItems, activePage.getWorkbenchWindow());
showInMenuManager.add(showInMenu);
menuManager.add(showInMenuManager);
}
@Override
protected void createButtonsForButtonBar(final Composite parent) {
GridLayout parentLayout = (GridLayout)parent.getLayout();
parentLayout.makeColumnsEqualWidth = false;
showInButton = createDropdownButton(parent, SHOW_IN_ID, IDEWorkbenchMessages.OpenResourceDialog_showInButton_text,
new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
showShowInMenu();
}
});
setButtonLayoutData(showInButton);
openWithButton = createDropdownButton(parent, OPEN_WITH_ID, IDEWorkbenchMessages.OpenResourceDialog_openWithButton_text,
new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
showOpenWithMenu();
}
});
setButtonLayoutData(openWithButton);
GridData showInLayoutData = (GridData) showInButton.getLayoutData();
GridData openWithLayoutData = (GridData) openWithButton.getLayoutData();
int buttonWidth = Math.max(showInLayoutData.widthHint, openWithLayoutData.widthHint);
showInLayoutData.widthHint = buttonWidth;
openWithLayoutData.widthHint = buttonWidth;
new Label(parent, SWT.NONE).setLayoutData(new GridData(5, 0));
parentLayout.numColumns++;
Button okButton = createButton(parent, IDialogConstants.OK_ID, IDEWorkbenchMessages.OpenResourceDialog_openButton_text, true);
Button cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
GridData cancelLayoutData = (GridData) cancelButton.getLayoutData();
GridData okLayoutData = (GridData) okButton.getLayoutData();
buttonWidth = Math.max(cancelLayoutData.widthHint, okLayoutData.widthHint);
cancelLayoutData.widthHint = buttonWidth;
okLayoutData.widthHint = buttonWidth;
}
private Button createDropdownButton(final Composite parent, int id, String label, MouseListener mouseListener) {
char textEmbedding = parent.getOrientation() == SWT.LEFT_TO_RIGHT ? '\u202a' : '\u202b';
Button button = createButton(parent, id, textEmbedding + label + '\u202c', false);
if (Util.isMac()) {
// Button#setOrientation(int) is a no-op on the Mac. Use a Unicode BLACK DOWN-POINTING SMALL TRIANGLE.
button.setText(button.getText() + " \u25BE"); //$NON-NLS-1$
} else {
int dropDownOrientation = parent.getOrientation() == SWT.LEFT_TO_RIGHT ? SWT.RIGHT_TO_LEFT : SWT.LEFT_TO_RIGHT;
button.setOrientation(dropDownOrientation);
button.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_BUTTON_MENU));
button.addMouseListener(mouseListener);
}
return button;
}
@Override
protected void buttonPressed(int buttonId) {
switch (buttonId) {
case OPEN_WITH_ID:
showOpenWithMenu();
break;
case SHOW_IN_ID:
showShowInMenu();
break;
default:
super.buttonPressed(buttonId);
}
}
@Override
protected void updateButtonsEnableState(IStatus status) {
super.updateButtonsEnableState(status);
if (showInButton != null && !showInButton.isDisposed()
&& openWithButton != null && !openWithButton.isDisposed()) {
openWithButton.setEnabled(!status.matches(IStatus.ERROR) && getSelectedItems().size() == 1);
showInButton.setEnabled(!status.matches(IStatus.ERROR) && getSelectedItems().size() > 0);
}
}
private IAdaptable getSelectedAdaptable() {
IStructuredSelection s = getSelectedItems();
if (s.size() != 1) {
return null;
}
Object selectedElement = s.getFirstElement();
if (selectedElement instanceof IAdaptable) {
return (IAdaptable) selectedElement;
}
return null;
}
private IWorkbenchPage getActivePage() {
IWorkbenchWindow activeWorkbenchWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (activeWorkbenchWindow == null) {
return null;
}
return activeWorkbenchWindow.getActivePage();
}
private void showOpenWithMenu() {
IWorkbenchPage activePage = getActivePage();
if (activePage == null) {
return;
}
IAdaptable selectedAdaptable = getSelectedAdaptable();
if (selectedAdaptable == null) {
return;
}
ResourceOpenWithMenu openWithMenu = new ResourceOpenWithMenu(activePage, selectedAdaptable);
showMenu(openWithButton, openWithMenu);
}
private void showShowInMenu() {
IWorkbenchPage activePage = getActivePage();
if (activePage == null) {
return;
}
IStructuredSelection selectedItems = getSelectedItems();
if (selectedItems.isEmpty()) {
return;
}
ShowInMenu showInMenu = new ResourceShowInMenu(selectedItems, activePage.getWorkbenchWindow());
showMenu(showInButton, showInMenu);
}
private void showMenu(Button button, IContributionItem menuContribution) {
Menu menu = new Menu(button);
Point p = button.getLocation();
p.y = p.y + button.getSize().y;
p = button.getParent().toDisplay(p);
menu.setLocation(p);
menuContribution.fill(menu, 0);
menu.setVisible(true);
}
}