/*
* This software is Copyright 2005,2006,2007,2008 Langdale Consultants.
* Langdale Consultants can be contacted at: http://www.langdale.com.au
*/
package com.cimphony.cimtoole.wizards;
import static au.com.langdale.ui.builder.Templates.CheckBox;
import static au.com.langdale.ui.builder.Templates.CheckboxTableViewer;
import static au.com.langdale.ui.builder.Templates.Field;
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.Label;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
import au.com.langdale.cimtoole.project.Info;
import au.com.langdale.ui.binding.TextBinding;
import au.com.langdale.ui.binding.Validator;
import au.com.langdale.ui.builder.Assembly;
import au.com.langdale.ui.builder.FurnishedWizardPage;
import au.com.langdale.ui.builder.Template;
import au.com.langdale.workspace.ResourceUI.ProjectBinding;
public class RegistrySchemaWizardPage extends FurnishedWizardPage {
public static final Validator RegistryEPackage(final boolean required) {
return new Validator() {
@Override
public String validate(String schemaUri) {
if( schemaUri.length() == 0)
if(required)
return "A URI is required";
else
return null;
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(schemaUri);
if(ePackage == null)
return "The URI is not in the registry";
return null;
}
};
}
public class DialogTemplate implements Template{
protected int style;
protected String text;
protected String name;
protected String target;
DialogTemplate(int style, String name, String text, String target) {
this.name = name;
this.style = style;
this.text = text;
this.target = target;
}
protected void listen(Button widget, final Assembly assembly){
widget.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {}
public void widgetSelected(SelectionEvent e) {
Text entry = assembly.getText(target);
EPackageSelectionDialog dialog = new EPackageSelectionDialog(RegistrySchemaWizardPage.this.getShell());
dialog.setBlockOnOpen(true);
dialog.setInitialPattern("?", FilteredItemsSelectionDialog.FULL_SELECTION);
int result = dialog.open();
if (result == Dialog.OK){
Object[] schemas = dialog.getResult();
for (Object o :schemas){
if (o instanceof String){
String fullName = (String)o;
String uri = fullName.substring(fullName.indexOf("('")+2, fullName.indexOf("')"));
entry.setText(uri);
}
}
}
}
});
}
public Control realise(Composite parent, Assembly assembly) {
Button widget = assembly.getToolkit().createButton(parent, text, style);
register(widget, assembly);
listen(widget, assembly);
return widget;
}
protected void register(Control widget, Assembly assembly) {
if(name != null)
assembly.putControl(name, widget);
}
}
private final boolean expectNewProject;
public RegistrySchemaWizardPage(boolean expectNewProject) {
super("schema");
this.expectNewProject = expectNewProject;
}
public RegistrySchemaWizardPage() {
this(false);
}
private IFile file;
boolean importing;
private TextBinding source = new TextBinding(RegistryEPackage(true));
private ProjectBinding projects = new ProjectBinding();
private IProject newProject;
public void setSelected(IStructuredSelection selection) {
projects.setSelected(selection);
}
public void setNewProject(IProject newProject) {
this.newProject = newProject;
}
public EPackage getEPackage() {
return EPackage.Registry.INSTANCE.getEPackage(source.getText());
}
public IFile getFile(){
return file;
}
@Override
protected Content createContent() {
return new Content() {
@Override
protected Template define() {
return Grid(
Group(Label("Namespace URI:"), Field("source"), new DialogTemplate(SWT.PUSH, "registryButton", "Browse Registered", "source")),
Group(Label("Project")),
expectNewProject? null :Group(CheckboxTableViewer("projects")),
Group(CheckBox("replace", "Replace existing schema.")),
Group(Label("* Set this under Windows > Preferences > CIMTool"))
);
}
@Override
protected void addBindings() {
if( ! expectNewProject )
projects.bind("projects", this);
source.bind("source", this);
}
@Override
public String validate() {
if( source.getText().length() == 0)
if(expectNewProject)
return null;
else
return "A schema is required";
if (getEPackage() == null)
return "A valid schema is required";
IProject project = expectNewProject? newProject: projects.getProject();
file = Info.getSchemaFolder(project).getFile(getEPackage().getName()+".ecore-registry");
if( file == null )
return "A project resource name is required";
boolean exists = file.exists();
getButton("replace").setEnabled(exists);
if( exists && ! getButton("replace").getSelection())
return "A schema named " + getEPackage().getName() + " already exists. " +
"Check option to replace.";
return null;
}
};
}
}