blob: 961caaea1cd584a951c16957c6fc4cd14f2a0e20 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Nigel Westbury
* 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:
* Nigel Westbury - initial implementation
******************************************************************************/
package org.eclipse.babel.editor.refactoring;
import java.text.MessageFormat;
import java.util.Collection;
import org.eclipse.babel.core.message.MessagesBundleGroup;
import org.eclipse.babel.core.message.tree.KeyTreeNode;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.ChangeDescriptor;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
/**
* {@link Change} that renames a resource bundle key.
*/
public class RenameKeyChange extends Change {
private final MessagesBundleGroup fMessagesBundleGroup;
private final String fNewName;
private final boolean fRenameChildKeys;
private final KeyTreeNode fKeyTreeNode;
private ChangeDescriptor fDescriptor;
/**
* Creates the change.
*
* @param keyTreeNode the node in the model to rename
* @param newName the new name. Must not be empty
* @param renameChildKeys true if child keys are also to be renamed, false if just this one key is to be renamed
*/
protected RenameKeyChange(MessagesBundleGroup messageBundleGroup, KeyTreeNode keyTreeNode, String newName, boolean renameChildKeys) {
if (keyTreeNode == null || newName == null || newName.length() == 0) {
throw new IllegalArgumentException();
}
fMessagesBundleGroup = messageBundleGroup;
fKeyTreeNode= keyTreeNode;
fNewName= newName;
fRenameChildKeys = renameChildKeys;
fDescriptor= null;
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#getDescriptor()
*/
public ChangeDescriptor getDescriptor() {
return fDescriptor;
}
/**
* Sets the change descriptor to be returned by {@link Change#getDescriptor()}.
*
* @param descriptor the change descriptor
*/
public void setDescriptor(ChangeDescriptor descriptor) {
fDescriptor= descriptor;
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#getName()
*/
public String getName() {
return MessageFormat.format("Rename {0} to {1}", new Object [] { fKeyTreeNode.getMessageKey(), fNewName});
}
/**
* Returns the new name.
*
* @return return the new name
*/
public String getNewName() {
return fNewName;
}
/**
* This implementation of {@link Change#isValid(IProgressMonitor)} tests the modified resource using the validation method
* specified by {@link #setValidationMethod(int)}.
*/
public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException, OperationCanceledException {
pm.beginTask("", 2); //$NON-NLS-1$
try {
RefactoringStatus result = new RefactoringStatus();
return result;
} finally {
pm.done();
}
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#initializeValidationData(org.eclipse.core.runtime.IProgressMonitor)
*/
public void initializeValidationData(IProgressMonitor pm) {
}
public Object getModifiedElement() {
return "what is this for?";
}
/* (non-Javadoc)
* @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
*/
public Change perform(IProgressMonitor pm) throws CoreException {
try {
pm.beginTask("Rename resource bundle key", 1);
// Find the root - we will need this later
KeyTreeNode root = fKeyTreeNode.getParent();
while (root.getName() != null) {
root = root.getParent();
}
if (fRenameChildKeys) {
String key = fKeyTreeNode.getMessageKey();
String keyPrefix = fKeyTreeNode.getMessageKey() + ".";
Collection<KeyTreeNode> branchNodes = fKeyTreeNode.getBranch();
for (KeyTreeNode branchNode : branchNodes) {
String oldKey = branchNode.getMessageKey();
if (oldKey.equals(key) || oldKey.startsWith(keyPrefix)) {
String newKey = fNewName + oldKey.substring(key.length());
fMessagesBundleGroup.renameMessageKeys(oldKey, newKey);
}
}
} else {
fMessagesBundleGroup.renameMessageKeys(fKeyTreeNode.getMessageKey(), fNewName);
}
String oldName= fKeyTreeNode.getMessageKey();
// Find the node that was created with the new name
String segments [] = fNewName.split("\\.");
KeyTreeNode renamedKey = root;
for (String segment : segments) {
renamedKey = renamedKey.getChild(segment);
}
assert(renamedKey != null);
return new RenameKeyChange(fMessagesBundleGroup, renamedKey, oldName, fRenameChildKeys);
} finally {
pm.done();
}
}
}