/*
* 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.wizards;
import static au.com.langdale.ui.builder.Templates.Column;
import static au.com.langdale.ui.builder.Templates.Field;
import static au.com.langdale.ui.builder.Templates.Label;
import static au.com.langdale.ui.builder.Templates.TableViewer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import au.com.langdale.jena.TreeModelBase.Node;
import au.com.langdale.kena.LocalNameIndex;
import au.com.langdale.kena.ModelFactory;
import au.com.langdale.kena.OntModel;
import au.com.langdale.kena.OntResource;
import au.com.langdale.kena.Property;
import au.com.langdale.kena.PropertyIndex;
import au.com.langdale.kena.Resource;
import au.com.langdale.kena.SearchIndex;
import au.com.langdale.ui.binding.ListBinding;
import au.com.langdale.ui.binding.TextBinding;
import au.com.langdale.ui.binding.Validators;
import au.com.langdale.ui.builder.FurnishedWizardPage;
import au.com.langdale.ui.builder.Template;
import au.com.langdale.ui.util.IconCache;
import au.com.langdale.util.Jobs;
public class SearchWizard extends Wizard implements IWorkbenchWizard {
public SearchWizard(Searchable searchArea) {
this(searchArea, searchArea.getCriterion());
}
private SearchWizard(Searchable searchArea, Property prop) {
this.searchArea = searchArea;
model = searchArea.getOntModel();
indexer = prop == null? new LocalNameIndex(): new PropertyIndex(prop);
}
public interface Searchable {
OntModel getOntModel();
Property getCriterion();
void previewTarget(Node node);
Node findNode(Resource target);
String getDescription();
}
public class Matches extends ListBinding {
private static final int LIMIT = 100;
private boolean indexed;
@Override
protected void configureViewer(StructuredViewer viewer) {
// viewer.setContentProvider(new MatchProvider());
}
@Override
protected Object getInput() {
if( ! indexed) {
indexed = true;
Jobs.runInteractive(job, null, getContainer(), getShell());
}
String prefix = getParent().getValue().toString();
if( prefix.length() == 0)
return Collections.EMPTY_SET;
else {
Collection result = indexer.match(prefix, LIMIT);
if(result.size() == 1)
setValue(result.iterator().next());
return result;
}
}
}
public class SubMatches extends ListBinding {
@Override
protected void configureViewer(StructuredViewer viewer) {
viewer.setLabelProvider(new SubMatchLabel());
}
@Override
protected Object getInput() {
Object value = getParent().getValue();
if( value != null ) {
String word = value.toString();
List result = findNodes(indexer.locate(word, model));
if( result.size() == 1)
setValue(result.get(0));
else
Collections.sort(result);
return result;
}
else
return Collections.EMPTY_LIST;
}
private List findNodes(Set resources) {
ArrayList result = new ArrayList(resources.size());
Iterator it = resources.iterator();
while( it.hasNext()) {
Node node = searchArea.findNode((OntResource)it.next());
if( node != null)
result.add(node);
}
return result;
}
}
public class SubMatchLabel extends LabelProvider {
@Override
public Image getImage(Object element) {
return IconCache.getIcons().get(element);
}
@Override
public String getText(Object element) {
if( element instanceof Node ) {
Node node = (Node) element;
String text = node.toString();
Node parent = node.getParent();
if( parent != null)
text = text + " (" + parent.getName() + ")";
return text;
}
if( element == null)
return "";
return element.toString();
}
}
private Searchable searchArea;
private SearchIndex indexer;
private TextBinding search = new TextBinding(Validators.NONE);
private Matches matches = new Matches();
private SubMatches submatches = new SubMatches();
private OntModel model;
private IWorkspaceRunnable job = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
indexer.scan(model);
}
};
public void init(IWorkbench workbench, IStructuredSelection selection) {
setWindowTitle("CIMTool Search");
page.setTitle(getWindowTitle());
page.setDescription(searchArea.getDescription());
setNeedsProgressMonitor(true);
}
private static final OntModel EMPTY_MODEL = ModelFactory.createMem();
public static final Searchable EMPTY_AREA = new Searchable() {
public OntModel getOntModel() { return EMPTY_MODEL; }
public void previewTarget(Node node) {}
public Property getCriterion() { return null; }
public Node findNode(Resource target) { return null; }
public String getDescription() { return ""; }
};
@Override
public void addPages() {
addPage(page);
}
IWizardPage page = new FurnishedWizardPage("search") {
@Override
protected Content createContent() {
return new Content() {
@Override
protected Template define() {
return Column(
Label("Search string:"),
Field("search"),
Label("Select a matching term:"),
TableViewer("matches"),
Label("Select a matching item:"),
TableViewer("submatches")
);
}
@Override
protected void addBindings() {
search.bind("search", this);
matches.bind("matches", this, search);
submatches.bind("submatches", this, matches);
}
@Override
public String validate() {
return submatches.getValue() != null? null: "";
}
};
}
};
@Override
public boolean performFinish() {
Node node = (Node) submatches.getValue();
if( node != null )
searchArea.previewTarget(node);
return node != null;
}
}