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.ComparisonUtils;
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.variables.BuildProperties;
import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache;
public class RefactoringWodBinding {
public static final String BINDING_NAME = "bindingName";
public static final String BINDING_VALUE = "bindingValue";
private PropertyChangeSupport _propertyChange;
private IWodElement _wodElement;
private SimpleWodBinding _wodBinding;
private WodParserCache _cache;
public RefactoringWodBinding(IWodElement element, IWodBinding binding, WodParserCache cache) {
_cache = cache;
_wodElement = element;
_wodBinding = new SimpleWodBinding(binding);
_propertyChange = new PropertyChangeSupport(this);
}
public SimpleWodBinding getWodBinding() {
return _wodBinding;
}
public void setValue(String value) throws CoreException, InvocationTargetException, InterruptedException {
String oldValue = _wodBinding.getValue();
String newValue = _changeValue(oldValue, value);
_propertyChange.firePropertyChange(RefactoringWodBinding.BINDING_VALUE, oldValue, newValue);
}
public String _setValue(String value) throws CoreException, InvocationTargetException, InterruptedException {
return _changeValue(null, value);
}
public static String toBindingValue(boolean inline, String inlineBindingPrefix, String inlineBindingSuffix, String value) {
String newValue = value;
newValue = newValue.trim();
// Close missing quotes
if (newValue.startsWith("\"") && !newValue.endsWith("\"")) {
newValue = newValue + "\"";
}
// Make non-string literals with spaces of %'s into literals (as long as there isn't a helper)
if (!newValue.startsWith("\"") && newValue.indexOf('|') == -1 && newValue.matches(".*[ %].*")) {
newValue = "\"" + newValue + "\"";
}
// Process values for inline bindings
if (inline) {
if (newValue.startsWith("\"")) {
newValue = newValue.substring(1, newValue.length() - 1);
}
else if (!newValue.startsWith(inlineBindingPrefix)) {
newValue = inlineBindingPrefix + value + inlineBindingSuffix;
}
}
return newValue;
}
public String _changeValue(String oldValue, String value) throws CoreException, InvocationTargetException, InterruptedException {
String newValue = value;
if (!ComparisonUtils.equals(oldValue, newValue, true)) {
BuildProperties buildProperties = (BuildProperties)_cache.getProject().getAdapter(BuildProperties.class);
newValue = RefactoringWodBinding.toBindingValue(_wodElement.isInline(), buildProperties.getInlineBindingPrefix(), buildProperties.getInlineBindingSuffix(), newValue);
ChangeBindingValueRefactoring.run(newValue, _wodElement, _wodBinding, _cache, new NullProgressMonitor());
_wodBinding.setValue(newValue);
}
return newValue;
}
public String getValue() {
return _wodBinding.getValue();
}
public String getName() {
return _wodBinding.getName();
}
public void setName(String name) throws CoreException, InvocationTargetException, InterruptedException {
String oldName = _wodBinding.getName();
if (name == null || name.length() == 0) {
name = RefactoringWodElement.findUnusedBindingName(_wodElement, name);
}
if (!ComparisonUtils.equals(name, oldName)) {
ChangeBindingNameRefactoring.run(name, _wodElement, _wodBinding, _cache, new NullProgressMonitor());
_wodBinding.setName(name);
_propertyChange.firePropertyChange(RefactoringWodBinding.BINDING_NAME, oldName, name);
}
}
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);
}
}