package org.objectstyle.wolips.wodclipse.core.refactoring;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.objectstyle.wolips.baseforplugins.util.StringUtils;
import org.objectstyle.wolips.bindings.wod.IWodBinding;
import org.objectstyle.wolips.bindings.wod.IWodElement;
import org.objectstyle.wolips.bindings.wod.SimpleWodBinding;
import org.objectstyle.wolips.bindings.wod.SimpleWodElement;
import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache;
public class RefactoringWodElement {
public static final String ELEMENT_NAME = "elementName";
public static final String ELEMENT_TYPE = "elementType";
private PropertyChangeSupport _propertyChange;
private SimpleWodElement _wodElement;
private WodParserCache _cache;
public RefactoringWodElement(IWodElement element, WodParserCache cache) {
_cache = cache;
_wodElement = new SimpleWodElement(element);
_propertyChange = new PropertyChangeSupport(this);
}
public SimpleWodElement getWodElement() {
return _wodElement;
}
public RefactoringWodBinding setValueForBinding(String value, String name) throws CoreException, InvocationTargetException, InterruptedException {
RefactoringWodBinding wodBinding = null;
if (value == null || value.trim().length() == 0) {
removeBindingNamed(name);
} else {
wodBinding = getBindingNamed(name);
if (wodBinding != null) {
wodBinding.setValue(value);
} else {
wodBinding = addBindingValueNamed(value, null, name);
}
}
return wodBinding;
}
public void removeBindingNamed(String name) throws CoreException, InvocationTargetException, InterruptedException {
IWodBinding existingBinding = _wodElement.getBindingNamed(name);
if (existingBinding == null) {
// IGNORE
} else {
RemoveBindingRefactoring.run(_wodElement, existingBinding, _cache, new NullProgressMonitor());
_wodElement.removeBinding(existingBinding);
}
}
public RefactoringWodBinding addBindingValueNamed(String value, String namespace, String name) throws CoreException, InvocationTargetException, InterruptedException {
SimpleWodBinding binding = new SimpleWodBinding(namespace, name, value);
_wodElement.addBinding(binding);
RefactoringWodBinding refactoringBinding = new RefactoringWodBinding(_wodElement, binding, _cache);
refactoringBinding._setValue(value);
return refactoringBinding;
}
public RefactoringWodBinding getBindingNamed(String name) {
IWodBinding binding = _wodElement.getBindingNamed(name);
RefactoringWodBinding refactoringBinding = null;
if (binding != null) {
refactoringBinding = new RefactoringWodBinding(_wodElement, binding, _cache);
}
return refactoringBinding;
}
public void setElementName(String elementName) throws CoreException, InvocationTargetException, InterruptedException {
String oldElementName = _wodElement.getElementName();
if (!_wodElement.isInline()) {
RenameElementsRefactoring.run(oldElementName, elementName, _cache, new NullProgressMonitor());
}
_wodElement.setElementName(elementName);
_propertyChange.firePropertyChange(RefactoringWodElement.ELEMENT_NAME, oldElementName, elementName);
}
public String getElementName() {
return _wodElement.getElementName();
}
public void setElementType(String elementType) throws CoreException, InvocationTargetException, InterruptedException {
String oldElementType = _wodElement.getElementType();
ChangeElementTypeRefactoring.run(elementType, _wodElement, _cache, new NullProgressMonitor());
_wodElement.setElementType(elementType);
_propertyChange.firePropertyChange(RefactoringWodElement.ELEMENT_TYPE, oldElementType, elementType);
}
public String getElementType() {
return _wodElement.getElementType();
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
_propertyChange.addPropertyChangeListener(listener);
}
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
_propertyChange.addPropertyChangeListener(propertyName, listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
_propertyChange.removePropertyChangeListener(listener);
}
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
_propertyChange.removePropertyChangeListener(propertyName, listener);
}
public static String findUnusedBindingName(IWodElement element, String baseName) {
return StringUtils.findUnusedName("newBinding", element, "getBindingNamed");
}
}