/**
* Copyright (c) 2010 Kenn Hussey and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* Kenn Hussey - Initial API and implementation
*/
package org.eclipse.emf.oda.ecore.ui.impl;
import java.util.List;
import java.util.Properties;
import org.eclipse.emf.common.ui.dialogs.ResourceDialog;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.oda.ecore.impl.Connection;
import org.eclipse.emf.oda.ecore.ui.ODAEcoreUIPlugin;
import org.eclipse.emf.oda.ecore.util.StringUtil;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* A helper for Ecore data source property and wizard pages.
*/
public class EcoreDataSourcePageHelper
{
protected static String DEFAULT_MESSAGE = ODAEcoreUIPlugin.INSTANCE.getString("_UI_DefaultDataSource_message"); //$NON-NLS-1$
protected EcoreDataSourceWizardPage wizardPage = null;
protected EcoreDataSourcePropertyPage propertyPage = null;
protected Text resourceField = null;
protected EcoreDataSourcePageHelper(EcoreDataSourceWizardPage page)
{
super();
assert (page != null);
wizardPage = page;
}
protected EcoreDataSourcePageHelper(EcoreDataSourcePropertyPage page)
{
super();
assert (page != null);
propertyPage = page;
}
/**
* Returns the value of the resource property.
* @return the resource
*/
protected String getResource()
{
return resourceField == null ? null : resourceField.getText();
}
/**
* Creates custom page control for user-defined data sources.
*/
protected void createCustomControl(Composite parent)
{
Composite composite = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().applyTo(composite);
createResourceControl(composite);
}
/**
* Creates control for resource property.
*/
protected void createResourceControl(Composite parent)
{
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(3, false));
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(composite);
Label resourceLabel = new Label(composite, SWT.NONE);
resourceLabel.setText(ODAEcoreUIPlugin.INSTANCE.getString("_UI_Resource_label")); //$NON-NLS-1$
resourceField = new Text(composite, SWT.BORDER);
resourceField.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent me)
{
validateData();
}
});
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).applyTo(resourceField);
Button resourceButton = new Button(composite, SWT.PUSH);
resourceButton.setText(ODAEcoreUIPlugin.INSTANCE.getString("_UI_Select_label")); //$NON-NLS-1$
resourceButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent se)
{
ResourceDialog dialog = new ResourceDialog(getControl().getShell(), null, SWT.SINGLE);
if (dialog.open() == Window.OK)
{
List<URI> uris = dialog.getURIs();
if (uris.size() > 0)
{
resourceField.setText(uris.get(0).toString());
}
}
}
});
}
/**
* Initializes the custom control with the specified properties.
*/
protected void initCustomControl(Properties properties)
{
if (properties == null)
{
return; // nothing to initialize
}
String resource = properties.getProperty(Connection.RESOURCE_PROPERTY_NAME);
if (!StringUtil.isEmpty(resource))
{
// initialize context type
resourceField.setText(resource);
}
validateData();
}
/**
* Collects the values of the specified properties.
*/
protected Properties collectCustomProperties(Properties properties)
{
if (properties == null)
{
properties = new Properties();
}
String resource = getResource();
if (!StringUtil.isEmpty(resource))
{
properties.setProperty(Connection.RESOURCE_PROPERTY_NAME, resource);
}
return properties;
}
/**
* Validates that the user has specified values for the properties in the page control
* and sets page message accordingly.
*/
protected void validateData()
{
String resource = getResource();
boolean isValid = !StringUtil.isEmpty(resource);
if (isValid)
{
try
{
URI.createURI(resource);
setMessage(DEFAULT_MESSAGE, IMessageProvider.NONE);
}
catch (Exception e)
{
setMessage(e.getLocalizedMessage(), IMessageProvider.ERROR);
}
}
else
{
setMessage(ODAEcoreUIPlugin.INSTANCE.getString("_UI_ResourceCannotBeEmpty_message"), IMessageProvider.ERROR); //$NON-NLS-1$
}
setPageComplete(isValid);
}
/**
* Returns the page for this helper.
*/
protected Control getControl()
{
if (wizardPage != null)
{
return wizardPage.getControl();
}
else if (propertyPage != null)
{
return propertyPage.getControl();
}
return null;
}
/**
* Sets whether the page for this helps is complete.
*/
protected void setPageComplete(boolean complete)
{
if (wizardPage != null)
{
wizardPage.setPageComplete(complete);
}
else if (propertyPage != null)
{
propertyPage.setValid(complete);
}
}
/**
* Sets the message for this helper's page.
*/
protected void setMessage(String newMessage, int newType)
{
if (wizardPage != null)
{
wizardPage.setMessage(newMessage, newType);
}
else if (propertyPage != null)
{
propertyPage.setMessage(newMessage, newType);
}
}
}