Java tutorial
/* * Copyright 2016 Albert Tregnaghi * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions * and limitations under the License. * */ package de.jcup.egradle.eclipse.gradleeditor; import java.util.Collections; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IStatus; 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.dialogs.IDialogSettings; import org.eclipse.jface.util.Util; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; 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.Control; 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.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.OpenFileAction; import org.eclipse.ui.actions.OpenWithMenu; import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog; import de.jcup.egradle.eclipse.api.EGradleUtil; public class OpenGradleResourceDialog extends FilteredResourcesSelectionDialog { private static final String GRADLE_RESOURCE_DIALOG_SETTINGS = "de.jcup.egradle.eclipse.gradleeditor.OpenGradleResourceDialog"; private static final int OPEN_WITH_ID = IDialogConstants.CLIENT_ID + 1; 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 OpenGradleResourceDialog(Shell parentShell, IContainer container, int typesMask) { super(parentShell, true, container, typesMask); addListFilter(new GroovyGradleAndJavaTypeFilter()); setHelpAvailable(false); setMessage("Please select an estimated type:"); setTitle("Open potential groovy/gradle/java resource"); } @Override protected IDialogSettings getDialogSettings() { Activator activator = Activator.getDefault(); IDialogSettings dialogSettings = activator.getDialogSettings(); IDialogSettings settings = dialogSettings.getSection(GRADLE_RESOURCE_DIALOG_SETTINGS); if (settings == null) { settings = dialogSettings.addNewSection(GRADLE_RESOURCE_DIALOG_SETTINGS); } return settings; } @Override protected ItemsFilter createFilter() { return super.createFilter(); } @Override protected Control createDialogArea(Composite parent) { Control control = super.createDialogArea(parent); getPatternControl().setEnabled(false); return control; } private class GroovyGradleAndJavaTypeFilter extends ViewerFilter { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (!(element instanceof IFile)) { return false; } IFile file = (IFile) element; String extension = file.getFileExtension(); boolean supported = false; supported = supported || "gradle".equals(extension); supported = supported || "groovy".equals(extension); supported = supported || "java".equals(extension); // no class because this is not supported by resource dialog if (!supported) { return false; } String name = file.getName(); String initialPattern = getInitialPattern(); String pattern = initialPattern + "." + extension; if (name.equals(pattern)) { return true; } return false; } } @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("Open with"); OpenWithMenu openWithMenu = new ResourceOpenWithMenu(activePage, selectedAdaptable); subMenu.add(openWithMenu); menuManager.add(subMenu); } } } @Override protected void createButtonsForButtonBar(final Composite parent) { GridLayout parentLayout = (GridLayout) parent.getLayout(); parentLayout.makeColumnsEqualWidth = false; openWithButton = createDropdownButton(parent, OPEN_WITH_ID, "Open with", new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { showOpenWithMenu(); } }); setButtonLayoutData(openWithButton); new Label(parent, SWT.NONE).setLayoutData(new GridData(5, 0)); parentLayout.numColumns++; Button okButton = createButton(parent, IDialogConstants.OK_ID, "Open", true); 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; } 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.setText(button.getText() + " \u25BE"); //$NON-NLS-1$ button.addMouseListener(mouseListener); } return button; } @Override protected void buttonPressed(int buttonId) { switch (buttonId) { case OPEN_WITH_ID: showOpenWithMenu(); break; default: super.buttonPressed(buttonId); } } @Override 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 = EGradleUtil.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 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); } 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); } } }