/*
* This software is Copyright 2005,2006,2007,2008 Langdale Consultants.
* Langdale Consultants can be contacted at: http://www.langdale.com.au
*/
package au.com.langdale.cimtoole.editors;
import static au.com.langdale.ui.builder.Templates.Array;
import static au.com.langdale.ui.builder.Templates.CheckBox;
import static au.com.langdale.ui.builder.Templates.Column;
import static au.com.langdale.ui.builder.Templates.DisplayArea;
import static au.com.langdale.ui.builder.Templates.DisplayField;
import static au.com.langdale.ui.builder.Templates.Form;
import static au.com.langdale.ui.builder.Templates.Grid;
import static au.com.langdale.ui.builder.Templates.Group;
import static au.com.langdale.ui.builder.Templates.Stack;
import static au.com.langdale.ui.builder.Templates.Image;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import au.com.langdale.cimtoole.project.Task;
import au.com.langdale.jena.JenaTreeModelBase;
import au.com.langdale.jena.JenaTreeModelBase.ModelNode;
import au.com.langdale.jena.TreeModelBase.Node;
import au.com.langdale.kena.OntResource;
import au.com.langdale.ui.builder.ArrayComposite;
import au.com.langdale.ui.builder.Assembly;
import au.com.langdale.ui.builder.FurnishedEditor;
import au.com.langdale.ui.builder.Template;
import au.com.langdale.ui.util.IconCache;
import au.com.langdale.validation.DiagnosisModel;
import au.com.langdale.validation.RepairMan;
import au.com.langdale.validation.DiagnosisModel.DetailNode;
import au.com.langdale.validation.DiagnosisModel.RepairNode;
public class RepairEditor extends ModelEditor {
private DiagnosisModel tree;
@Override
public JenaTreeModelBase getTree() {
if( tree == null ) {
tree = new DiagnosisModel(new RepairMan());
//tree.setRootResource(DiagnosisModel.DIAGNOSIS_ROOT);
tree.setSource(getFile().getFullPath().toString());
modelCached(null);
}
return tree;
}
public void modelCached(IResource key) {
tree.setOntModel(models.getOntology(getFile()));
tree.setRootResource(DiagnosisModel.DIAGNOSIS_ROOT);
tree.setRepairs(new RepairMan());
doRefresh();
}
public void modelDropped(IResource key) {
close();
}
@Override
public void doSave(IProgressMonitor monitor) {
RepairMan repairs = tree.getRepairs();
tree.setRepairs(new RepairMan());
try {
ResourcesPlugin.getWorkspace().run(Task.repairProfile(getFile(), repairs), monitor);
} catch (CoreException e) {
throw new RuntimeException(e);
}
super.doSave(monitor);
}
@Override
protected void createPages() {
addPage(main);
}
FurnishedEditor main = new FurnishedEditor("Diagnostics") {
@Override
protected Content createContent() {
return new Content(getToolkit()) {
@Override
protected Template define() {
return Form(
Stack(
Array("problems",
Column(
Grid(Group(Image("symbol", "problem"), DisplayArea("problem", 3))),
Array("corrections",
Grid(Group(
CheckBox("check", "Select this repair action.", "right"),
DisplayArea("correction",2))))
)
),
DisplayField("summary")
)
);
}
@Override
public void refresh() {
Node node = getNode();
if( node instanceof ModelNode) {
OntResource subject = node.getBase();
getForm().setImage(IconCache.getIcons().get("key", 32));
getForm().setText(DiagnosisModel.label(subject));
showStackLayer("problems");
// setTextValue("uri", subject.isAnon()? "": subject.getURI());
if( node instanceof RepairNode ) {
show((DetailNode)node.getParent(), Collections.singletonList(node));
}
else if( node instanceof DetailNode ) {
show((DetailNode)node, node.getChildren());
}
else {
show(node.getChildren());
}
getForm().layout(true, true);
}
else {
getForm().setImage(IconCache.getIcons().get("general", 32));
getForm().setText(getFile().getName());
showStackLayer("summary");
// setTextValue("uri", "");
setTextValue("summary", "There are " + node.getChildren().size() +
" problems found. Select an item in the outline for more information.");
}
}
private void show(List problems) {
ArrayComposite probArray = getArrayComposite("problems");
probArray.setSize(problems.size());
int ix = 0;
for( Iterator it = problems.iterator(); it.hasNext(); ) {
DetailNode problem = (DetailNode) it.next();
show(problem, problem.getChildren(), probArray.getAssembly(ix));
ix++;
}
}
private void show(DetailNode problem, List repairs) {
ArrayComposite probArray = getArrayComposite("problems");
probArray.setSize(1);
show(problem, repairs, probArray.getAssembly(0));
}
private void show(DetailNode problem, List repairs, Assembly assembly) {
assembly.setTextValue("problem", problem.getDescription());
assembly.setIconForObject("symbol", problem);
ArrayComposite repArray = assembly.getArrayComposite("corrections");
repArray.setSize(repairs.size());
int ix = 0;
for( Iterator it = repairs.iterator(); it.hasNext(); ) {
RepairNode repair = (RepairNode) it.next();
show(repair, repArray.getAssembly(ix));
repArray.set(ix, repair);
ix++;
}
}
private void show(RepairNode repair, Assembly assembly) {
assembly.setTextValue("correction", repair.getDescription());
assembly.getButton("check").setSelection(repair.isSelected());
assembly.setIconForObject("check", repair);
}
public void update() {
ArrayComposite probArray = getArrayComposite("problems");
for(int ix = 0; ix < probArray.size(); ix++) {
collect(probArray.getAssembly(ix).getArrayComposite("corrections"));
}
}
private void collect(ArrayComposite repArray) {
for(int ix = 0; ix < repArray.size(); ix++) {
Assembly assembly = repArray.getAssembly(ix);
boolean selected = assembly.getButton("check").getSelection();
RepairNode repair = (RepairNode) repArray.get(ix);
if(selected && ! repair.isSelected()) {
repair.setSelected(true);
return;
}
if( ! selected && repair.isSelected()) {
repair.setSelected(false);
}
}
}
};
}
};
}