package org.jbpm.ui.editor.ltk;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.jface.text.Document;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.ltk.ui.refactoring.TextEditChangeNode;
import org.eclipse.text.edits.MultiTextEdit;
import org.eclipse.text.edits.ReplaceEdit;
import org.jbpm.ui.common.model.FormNode;
import org.jbpm.ui.resource.Messages;
import org.jbpm.ui.util.IOUtils;
public class FormNodePresentation extends Presentation {
private final FormNode formNode;
private final IFolder folder;
public FormNodePresentation(IFolder folder, FormNode formNode, String variableName, String replacement) {
super(variableName, replacement);
this.folder = folder;
this.formNode = formNode;
}
@Override
public List<Change> getChanges() throws Exception {
CompositeChange result = new CompositeChange(formNode.getName());
if (formNode.hasForm()) {
IFile file = folder.getFile(formNode.getFormFileName());
result.addAll(processFile(file, Messages.getString("Search.formNode.form")));
}
if (formNode.hasFormValidation()) {
IFile file = folder.getFile(formNode.getValidationFileName());
result.addAll(processFile(file, Messages.getString("Search.formNode.validation")));
}
if (result.getChildren().length > 0)
return Arrays.asList((Change) result);
return new ArrayList<Change>();
}
private Change[] processFile(IFile file, final String label) throws Exception {
Document document = new Document();
String text = IOUtils.readStream(file.getContents());
document.set(text);
List<Change> changes = new ArrayList<Change>();
int offset = 0; // TODO in forms use "\" + varName + "\"
MultiTextEdit multiEdit = new MultiTextEdit();
int len = variableName.length();
while (offset > -1) {
offset = document.search(offset, variableName, true, true, true);
if (offset == -1) {
break;
}
ReplaceEdit replaceEdit = new ReplaceEdit(offset, len, replacement);
multiEdit.addChild(replaceEdit);
offset += len; // to avoid overlapping
}
if (multiEdit.getChildrenSize() > 0) {
TextFileChange fileChange = new TextFileChange(file.getName(), file) {
@Override
public Object getAdapter(Class adapter) {
if (adapter == TextEditChangeNode.class) {
return new GPDChangeNode(this, null, label);
}
return super.getAdapter(adapter);
}
};
fileChange.setEdit(multiEdit);
changes.add(fileChange);
}
return changes.toArray(new Change[changes.size()]);
}
}