| /******************************************************************************* |
| * Copyright (c) 2000, 2011 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.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.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.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| 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.Control; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.IEditorDescriptor; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PlatformUI; |
| 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.WorkbenchImages; |
| import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; |
| |
| |
| /** |
| * 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 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); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#fillContextMenu(org.eclipse.jface.action.IMenuManager) |
| * @since 3.5 |
| */ |
| protected void fillContextMenu(IMenuManager menuManager) { |
| super.fillContextMenu(menuManager); |
| |
| IStructuredSelection selectedItems = getSelectedItems(); |
| if (selectedItems.isEmpty()) { |
| return; |
| } |
| |
| IWorkbenchPage activePage = getActivePage(); |
| if (activePage == null) { |
| return; |
| } |
| |
| // Add 'Open' menu item |
| OpenFileAction openFileAction = new OpenFileAction(activePage) { |
| public void run() { |
| okPressed(); |
| } |
| }; |
| openFileAction.selectionChanged(selectedItems); |
| if (!openFileAction.isEnabled()) { |
| return; |
| } |
| menuManager.add(new Separator()); |
| menuManager.add(openFileAction); |
| |
| IAdaptable selectedAdaptable = getSelectedAdaptable(); |
| if (selectedAdaptable == null) { |
| return; |
| } |
| |
| // Add 'Open With...' sub-menu |
| MenuManager subMenu = new MenuManager(IDEWorkbenchMessages.OpenResourceDialog_openWithMenu_label); |
| OpenWithMenu openWithMenu = new OpenWithMenu(activePage, selectedAdaptable) { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.ui.actions.OpenWithMenu#openEditor(org.eclipse.ui.IEditorDescriptor, boolean) |
| */ |
| protected void openEditor(IEditorDescriptor editorDescriptor, boolean openUsingDescriptor) { |
| computeResult(); |
| setResult(Collections.EMPTY_LIST); |
| close(); |
| super.openEditor(editorDescriptor, openUsingDescriptor); |
| } |
| }; |
| subMenu.add(openWithMenu); |
| menuManager.add(subMenu); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.ui.dialogs.SelectionDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) |
| * @since 3.5 |
| */ |
| protected void createButtonsForButtonBar(final Composite parent) { |
| // increment the number of columns in the button bar |
| GridLayout parentLayout = (GridLayout)parent.getLayout(); |
| parentLayout.numColumns++; |
| parentLayout.makeColumnsEqualWidth = false; |
| |
| final Composite openComposite = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| layout.horizontalSpacing = 0; |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| openComposite.setLayout(layout); |
| |
| Button okButton = createButton(openComposite, IDialogConstants.OK_ID, IDEWorkbenchMessages.OpenResourceDialog_openButton_text, true); |
| |
| // Arrow down button for Open With menu |
| ((GridLayout)openComposite.getLayout()).numColumns++; |
| openWithButton = new Button(openComposite, SWT.PUSH); |
| openWithButton.setToolTipText(IDEWorkbenchMessages.OpenResourceDialog_openWithButton_toolTip); |
| openWithButton.setImage(WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_LCL_BUTTON_MENU)); |
| |
| GridData data = new GridData(SWT.CENTER, SWT.FILL, false, true); |
| openWithButton.setLayoutData(data); |
| |
| openWithButton.addMouseListener(new MouseAdapter() { |
| public void mouseDown(MouseEvent e) { |
| showOpenWithMenu(openComposite); |
| } |
| }); |
| openWithButton.addSelectionListener(new SelectionAdapter(){ |
| public void widgetSelected(SelectionEvent e) { |
| showOpenWithMenu(openComposite); |
| } |
| }); |
| |
| Button cancelButton = createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); |
| |
| GridData cancelLayoutData = (GridData) cancelButton.getLayoutData(); |
| GridData okLayoutData = (GridData) okButton.getLayoutData(); |
| int buttonWidth = Math.max(cancelLayoutData.widthHint, okLayoutData.widthHint); |
| cancelLayoutData.widthHint = buttonWidth; |
| okLayoutData.widthHint = buttonWidth; |
| |
| if (openComposite.getDisplay().getDismissalAlignment() == SWT.RIGHT) { |
| // Make the default button the right-most button. |
| // See also special code in org.eclipse.jface.dialogs.Dialog#initializeBounds() |
| openComposite.moveBelow(null); |
| if (Util.isCarbon()) { |
| okLayoutData.horizontalIndent = -10; |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#initializeBounds() |
| * @since 3.5 |
| */ |
| protected void initializeBounds() { |
| super.initializeBounds(); |
| if (openWithButton.getDisplay().getDismissalAlignment() == SWT.RIGHT) { |
| // Move the menu button back to the right of the default button. |
| if (!Util.isMac()) { |
| // On the Mac, the round buttons and the big padding would destroy the visual coherence of the split button. |
| openWithButton.moveBelow(null); |
| openWithButton.getParent().layout(); |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.dialogs.SelectionStatusDialog#updateButtonsEnableState(org.eclipse.core.runtime.IStatus) |
| * @since 3.5 |
| */ |
| protected void updateButtonsEnableState(IStatus status) { |
| super.updateButtonsEnableState(status); |
| if (openWithButton != null && !openWithButton.isDisposed()) { |
| openWithButton.setEnabled(!status.matches(IStatus.ERROR) && getSelectedItems().size() == 1); |
| } |
| } |
| |
| 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(final Composite openComposite) { |
| IWorkbenchPage activePage = getActivePage(); |
| if (activePage == null) { |
| return; |
| } |
| IAdaptable selectedAdaptable = getSelectedAdaptable(); |
| if (selectedAdaptable == null) { |
| return; |
| } |
| |
| OpenWithMenu openWithMenu = new OpenWithMenu(activePage, selectedAdaptable) { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.ui.actions.OpenWithMenu#openEditor(org.eclipse.ui.IEditorDescriptor, boolean) |
| */ |
| protected void openEditor(IEditorDescriptor editorDescriptor, boolean openUsingDescriptor) { |
| computeResult(); |
| setResult(Collections.EMPTY_LIST); |
| close(); |
| super.openEditor(editorDescriptor, openUsingDescriptor); |
| } |
| }; |
| |
| Menu menu = new Menu(openComposite.getParent()); |
| Control c = openComposite; |
| Point p = c.getLocation(); |
| p.y = p.y + c.getSize().y; |
| p = c.getParent().toDisplay(p); |
| |
| menu.setLocation(p); |
| openWithMenu.fill(menu, -1); |
| menu.setVisible(true); |
| } |
| |
| } |