/******************************************************************************* * Copyright (c) 2003, 2005 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.jst.j2ee.internal.actions; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.ecore.EObject; import org.eclipse.jem.util.emf.workbench.ProjectUtilities; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages; import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; public abstract class AbstractActionDelegate implements org.eclipse.ui.IActionDelegate { protected ISelection selection; protected boolean allowsMultiSelect = false; public static final Class IPROJECT_CLASS = IProject.class; private final static String ERROR_OCCURRED_TITLE = J2EEUIMessages.getResourceString("ERROR_OCCURRED_TITLE"); //$NON-NLS-1$ private final static String ERROR_OCCURRED_MESSAGE = J2EEUIMessages.getResourceString("ERROR_OCCURRED_MESSAGE"); //$NON-NLS-1$ /** * EditModuleDependencyAction constructor comment. */ public AbstractActionDelegate() { super(); } /** * Applicable only when this action does not allow multi select */ protected IProject getProject() { return getProject(getSelectedElement()); } protected List getProjects() { if ((selection == null) || !(selection instanceof IStructuredSelection)) return Collections.EMPTY_LIST; List result = new ArrayList(); IStructuredSelection struct = (IStructuredSelection) selection; Iterator it = struct.iterator(); while (it.hasNext()) { IProject p = getProject(it.next()); if (p != null) result.add(p); } return result; } protected IProject getProject(Object element) { if (isSupportedAction(element)) return ProjectUtilities.getProject((EObject) element); else if (element instanceof IAdaptable) return (IProject) ((IAdaptable) element).getAdapter(IPROJECT_CLASS); else return null; } protected IStructuredSelection getStructuredSelection() { if ((selection == null) || !(selection instanceof IStructuredSelection)) return null; else if (selection.isEmpty()) { selection = J2EEUIPlugin.getCurrentSelection(); } return (IStructuredSelection) selection; } /* * Only return if there is exactly one item selected */ protected Object getSelectedElement() { IStructuredSelection sel = getStructuredSelection(); return sel == null ? null : sel.getFirstElement(); } protected IWorkbenchWindow getWorkbenchWindow() { return J2EEUIPlugin.getActiveWorkbenchWindow(); } /** * Can the receiver be executed for * * @element */ protected abstract boolean isSupportedAction(Object element); /** * @deprecated use {@link #primRun(Shell)} */ protected void primRun(IProject project, Shell shell) { //Deprecated } /** * Subclasses should override this instead of {@link #run(org.eclipse.jface.action.IAction)} */ protected void primRun(Shell shell) { primRun(getProject(), shell); } /** * Performs this action. * <p> * This method is called when the delegating action has been triggered. Implement this method to * do the actual work. * </p> * * @param action * the action proxy that handles the presentation portion of the action */ public void run(org.eclipse.jface.action.IAction action) { Shell shell = getWorkbenchWindow().getShell(); setActionStateFromProjects(action); if (!action.isEnabled()) MessageDialog.openInformation(shell, J2EEUIMessages.getResourceString("INFORMATION_UI_"), J2EEUIMessages.getResourceString("CHOSEN_OP_NOT_AVAILABLE")); //$NON-NLS-2$ = "The chosen operation is not currently available." //$NON-NLS-1$ = "Information" else { try { primRun(shell); } catch (Throwable t) { org.eclipse.jst.j2ee.internal.plugin.ErrorDialog.openError(shell, ERROR_OCCURRED_TITLE, ERROR_OCCURRED_MESSAGE, t, 0, false); } } } /** * Notifies this action delegate that the selection in the workbench has changed. * <p> * Implementers can use this opportunity to change the availability of the action or to modify * other presentation properties. * </p> * * @param action * the action proxy that handles presentation portion of the action * @param aSelection * the current selection in the workbench */ public void selectionChanged(org.eclipse.jface.action.IAction action, org.eclipse.jface.viewers.ISelection aSelection) { this.selection = aSelection; setActionState(action); } protected void setActionState(IAction action) { if (allowsMultiSelect) setActionStateForMultiSelect(action); else setActionStateForSingleSelect(action); } protected void setActionStateForSingleSelect(IAction action) { IStructuredSelection sel = getStructuredSelection(); if (sel == null || sel.size() != 1) { action.setEnabled(false); return; } setActionStateFromProjects(action); } protected void setActionStateForMultiSelect(IAction action) { setActionStateFromProjects(action); } protected void setActionStateFromProjects(IAction action) { IStructuredSelection sel = getStructuredSelection(); boolean allOk = false; if (sel != null && !sel.isEmpty()) { allOk = true; Iterator it = sel.iterator(); while (it.hasNext()) { Object o = it.next(); IProject project = getProject(o); if (project == null || !project.isOpen()) { allOk = false; break; } } } action.setEnabled(allOk); } /** * Returns the allowsMultiSelect. * * @return boolean */ public boolean allowsMultiSelect() { return allowsMultiSelect; } /** * Sets the allowsMultiSelect. * * @param allowsMultiSelect * The allowsMultiSelect to set */ public void setAllowsMultiSelect(boolean allowsMultiSelect) { this.allowsMultiSelect = allowsMultiSelect; } }