/*******************************************************************************
* Copyright (c) 2009 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
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.actions;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.dltk.core.IMember;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.php.internal.core.documentModel.provisional.contenttype.ContentTypeIdForPHP;
import org.eclipse.php.internal.core.project.PHPNature;
import org.eclipse.php.internal.ui.PHPUiConstants;
import org.eclipse.php.internal.ui.editor.PHPStructuredEditor;
import org.eclipse.swt.widgets.Shell;
public class ActionUtils {
final private static IContentType contentType = Platform.getContentTypeManager()
.getContentType(ContentTypeIdForPHP.ContentTypeID_PHP);
public static boolean containsOnlyProjects(List<?> elements) {
if (elements.isEmpty())
return false;
for (Iterator<?> iter = elements.iterator(); iter.hasNext();) {
if (!isProject(iter.next()))
return false;
}
return true;
}
public static boolean containsOnly(List<?> elements, Class<?> clazz) {
if (elements.isEmpty())
return false;
for (Iterator<?> iter = elements.iterator(); iter.hasNext();) {
// if (!clazz.isAssignableFrom(iter.next().getClass()))
if (!clazz.isAssignableFrom(iter.next().getClass()))
return false;
}
return true;
}
public static boolean isProject(Object element) {
return element instanceof IScriptProject/* PHPProjectModel */
|| element instanceof IProject;
}
public static IResource[] getResources(List<?> elements) {
return getResources(elements, false);
}
public static IResource[] getResources(List<?> elements, boolean includePHPFileData) {
List<IResource> resources = new ArrayList<>(elements.size());
for (Iterator<?> iter = elements.iterator(); iter.hasNext();) {
Object element = iter.next();
if (element instanceof IResource) {
resources.add((IResource) element);
} else if (includePHPFileData && element instanceof ISourceModule) {
resources.add(((ISourceModule) element).getResource());
}
}
return resources.toArray(new IResource[resources.size()]);
}
public static IResource[] getResources(final Object[] elements) {
List<IResource> result = new ArrayList<>();
for (Object element : elements) {
if (element instanceof IResource) {
result.add((IResource) element);
}
}
return result.toArray(new IResource[result.size()]);
}
public static IResource[] getPHPResources(final Object[] elements) {
List<IResource> result = new ArrayList<>();
for (Object element : elements) {
if (element instanceof IFile) {
if (contentType.isAssociatedWith(((IResource) element).getName())) {
result.add((IResource) element);
}
} else if (element instanceof IResource) { // other resource then
// file
result.add((IResource) element);
}
}
return result.toArray(new IResource[result.size()]);
}
public static Object[] getPHPElements(List<?> elements) {
return getPHPElements(elements, false);
}
public static Object[] getPHPElements(List<?> elements, boolean phpFileDataIsResource) {
List<Object> phpElements = new ArrayList<>(elements.size());
for (Object element : elements) {
if (element instanceof IModelElement || element instanceof IScriptProject)/* PHPProjectModel */// ||
// element
// instanceof
// PHPWorkspaceModelManager)
if (!phpFileDataIsResource || !(element instanceof ISourceModule)) {
phpElements.add(element);
}
}
return phpElements.toArray();
}
public static Object[] getPHPElements(final Object[] elements) {
List<Object> resources = new ArrayList<>(elements.length);
for (Object element : elements) {
if (element instanceof ISourceModule || element instanceof IScriptProject)/* PHPProjectModel */// ||
// element
// instanceof
// PHPWorkspaceModelManager)
resources.add(element);
}
return resources.toArray();
}
public static boolean isPHPSource(ISourceModule element) {
IScriptProject scriptProject = element.getScriptProject();
if (scriptProject != null) {
IProject project = scriptProject.getProject();
if (project != null) {
try {
IProjectNature nature = project.getNature(PHPNature.ID);
if (nature != null)
return true;
} catch (CoreException e) {
}
}
}
return false;
}
public static boolean isProcessable(Shell shell, Object element) {
if (!(element instanceof ISourceModule))
return true;
if (isPHPSource((ISourceModule) element))
return true;
return false;
}
public static boolean isProcessable(Shell shell, PHPStructuredEditor editor) {
if (editor == null)
return true;
ISourceModule input = SelectionConverter.getInput(editor);
// if a PHP editor doesn't have an input of type PHP element
// then it is for sure not on the build path
if (input == null) {
return false;
}
return isProcessable(shell, input);
}
public static boolean isRenameAvailable(final IResource resource) {
if (resource == null)
return false;
if (!resource.exists())
return false;
if (!resource.isAccessible())
return false;
return true;
}
public static boolean isDeleteAvailable(final IResource resource) {
if (!resource.exists() || resource.isPhantom())
return false;
if (resource.getType() == IResource.ROOT || resource.getType() == IResource.PROJECT)
return false;
return true;
}
public static boolean isDeleteAvailable(final Object element) {
if (/* element instanceof PHPWorkspaceModelManager || */element instanceof IScriptProject /* PHPProjectModel */)
return false;
if (PHPUiConstants.DISABLE_ELEMENT_REFACTORING && !(element instanceof ISourceModule))
return false;
return true;
}
public static boolean isDeleteAvailable(final Object[] objects) {
if (objects.length != 0) {
final IResource[] resources = getResources(objects);
final Object[] elements = getPHPElements(objects);
if (objects.length != resources.length + elements.length)
return false;
for (int index = 0; index < resources.length; index++) {
if (!isDeleteAvailable(resources[index]))
return false;
}
for (int index = 0; index < elements.length; index++) {
if (!isDeleteAvailable(elements[index]))
return false;
}
return true;
}
return false;
}
public static boolean arePHPElements(final Object[] elements) {
if (elements != null) {
for (int index = 0; index < elements.length; index++) {
if (elements[index] instanceof IMember && !(elements[index] instanceof ISourceModule))
return true;
}
}
return false;
}
public static boolean isInsidePHPFile(Object object) {
return object instanceof ISourceModule;
}
}