/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpdt.internal.core; //import java.util.HashMap; //import java.util.Map; import net.sourceforge.phpdt.core.ICompilationUnit; import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaModelStatus; import net.sourceforge.phpdt.core.IJavaModelStatusConstants; //import net.sourceforge.phpdt.core.IMember; import net.sourceforge.phpdt.core.IParent; import net.sourceforge.phpdt.core.JavaModelException; //import net.sourceforge.phpdt.core.jdom.DOMFactory; //import net.sourceforge.phpdt.core.jdom.IDOMCompilationUnit; //import net.sourceforge.phpdt.core.jdom.IDOMNode; import net.sourceforge.phpdt.internal.core.util.Util; /** * This operation copies/moves a collection of elements from their current * container to a new container, optionally renaming the elements. *
* Notes: *
String
to use as the main task name for
* progress monitoring.
*/
protected String getMainTaskName() {
return Util.bind("operation.copyElementProgress"); //$NON-NLS-1$
}
/**
* Returns the nested operation to use for processing this element
*/
protected JavaModelOperation getNestedOperation(IJavaElement element) {
return null;
// try {
// IJavaElement dest = getDestinationParent(element);
// switch (element.getElementType()) {
// case IJavaElement.PACKAGE_DECLARATION :
// return new
// CreatePackageDeclarationOperation(element.getElementName(),
// (ICompilationUnit) dest);
// case IJavaElement.IMPORT_DECLARATION :
// return new CreateImportOperation(element.getElementName(),
// (ICompilationUnit) dest);
// case IJavaElement.TYPE :
// if (isRenamingMainType(element, dest)) {
// return new RenameResourceElementsOperation(new IJavaElement[] {dest},
// new IJavaElement[] {dest.getParent()}, new
// String[]{getNewNameFor(element) + ".php"}, fForce); //$NON-NLS-1$
// } else {
// return new CreateTypeOperation(dest, getSourceFor(element) +
// ProjectPrefUtil.LINE_SEPARATOR, fForce);
// }
// case IJavaElement.METHOD :
// return new CreateMethodOperation((IType) dest, getSourceFor(element)
// + ProjectPrefUtil.LINE_SEPARATOR, fForce);
// case IJavaElement.FIELD :
// return new CreateFieldOperation((IType) dest, getSourceFor(element) +
// ProjectPrefUtil.LINE_SEPARATOR, fForce);
// case IJavaElement.INITIALIZER :
// return new CreateInitializerOperation((IType) dest,
// getSourceFor(element) + ProjectPrefUtil.LINE_SEPARATOR);
// default :
// return null;
// }
// } catch (JavaModelException npe) {
// return null;
// }
}
/**
* Returns the cached source for this element or compute it if not already
* cached.
*/
// private String getSourceFor(IJavaElement element) throws JavaModelException {
// String source = (String) fSources.get(element);
// if (source == null && element instanceof IMember) {
// IMember member = (IMember) element;
// ICompilationUnit cu = member.getCompilationUnit();
// String cuSource = cu.getSource();
// IDOMCompilationUnit domCU = new DOMFactory().createCompilationUnit(
// cuSource, cu.getElementName());
// IDOMNode node = ((JavaElement) element).findNode(domCU);
// source = new String(node.getCharacters());
// fSources.put(element, source);
// }
// return source;
// }
/**
* Returns true
if this element is the main type of its
* compilation unit.
*/
protected boolean isRenamingMainType(IJavaElement element, IJavaElement dest) {
if ((isRename() || getNewNameFor(element) != null)
&& dest.getElementType() == IJavaElement.COMPILATION_UNIT) {
String typeName = dest.getElementName();
typeName = typeName.substring(0, typeName.length() - 5);
return element.getElementName().equals(typeName)
&& element.getParent().equals(dest);
}
return false;
}
/**
* Copy/move the element from the source to destination, renaming the
* elements as specified, honoring the collision policy.
*
* @exception JavaModelException
* if the operation is unable to be completed
*/
protected void processElement(IJavaElement element)
throws JavaModelException {
JavaModelOperation op = getNestedOperation(element);
boolean createElementInCUOperation = op instanceof CreateElementInCUOperation;
if (op == null) {
return;
}
if (createElementInCUOperation) {
IJavaElement sibling = (IJavaElement) fInsertBeforeElements
.get(element);
if (sibling != null) {
((CreateElementInCUOperation) op).setRelativePosition(sibling,
CreateElementInCUOperation.INSERT_BEFORE);
} else if (isRename()) {
IJavaElement anchor = resolveRenameAnchor(element);
if (anchor != null) {
((CreateElementInCUOperation) op).setRelativePosition(
anchor, CreateElementInCUOperation.INSERT_AFTER); // insert
// after
// so
// that
// the
// anchor
// is
// found
// before
// when
// deleted
// below
}
}
String newName = getNewNameFor(element);
if (newName != null) {
((CreateElementInCUOperation) op).setAlteredName(newName);
}
}
executeNestedOperation(op, 1);
JavaElement destination = (JavaElement) getDestinationParent(element);
ICompilationUnit unit = destination.getCompilationUnit();
if (!unit.isWorkingCopy()) {
unit.close();
}
if (createElementInCUOperation && isMove()
&& !isRenamingMainType(element, destination)) {
DeleteElementsOperation deleteOp = new DeleteElementsOperation(
new IJavaElement[] { element }, force);
executeNestedOperation(deleteOp, 1);
}
}
/**
* Returns the anchor used for positioning in the destination for the
* element being renamed. For renaming, if no anchor has explicitly been
* provided, the element is anchored in the same position.
*/
private IJavaElement resolveRenameAnchor(IJavaElement element)
throws JavaModelException {
IParent parent = (IParent) element.getParent();
IJavaElement[] children = parent.getChildren();
for (int i = 0; i < children.length; i++) {
IJavaElement child = children[i];
if (child.equals(element)) {
return child;
}
}
return null;
}
/**
* Possible failures:
* element
or its specified
* destination is is null
or does not exist. If a
* null
element is supplied, no element is provided in the
* status, otherwise, the non-existant element is supplied in the status.
* element
is not contained
* within a compilation unit. This operation only operates on elements
* contained within compilation units.
* element
is read only.
* element
is of an incompatible type. The destination for a
* package declaration or import declaration must be a compilation unit; the
* destination for a type must be a type or compilation unit; the destinaion
* for any type member (other than a type) must be a type. When this error
* occurs, the element provided in the operation status is the
* element
.
* element
does not have
* valid syntax. In this case the element and name are provided in the
* status.
*
*