/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.filter;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import eu.esdihumboldt.hale.common.instance.model.Filter;
/**
* Dialog for configuring a type filter.
*
* @author Simon Templer
* @partner 01 / Fraunhofer Institute for Computer Graphics Research
*/
public abstract class AbstractTypeFilterDialog extends TitleAreaDialog {
private TypeFilterField filterField;
private Filter filter;
private final String title;
private final String message;
/**
* Constructor.
*
* @param parentShell the parent shell
* @param title the dialog title, <code>null</code> for a default title
* @param message the dialog message, <code>null</code> for a default
* message
*/
public AbstractTypeFilterDialog(Shell parentShell, String title, String message) {
super(parentShell);
this.title = (title == null) ? ("Type filter") : (title);
this.message = (message == null) ? ("Define the filter to apply") : (message);
setHelpAvailable(true);
}
/**
* @see Dialog#isResizable()
*/
@Override
protected boolean isResizable() {
// resizable to allow the HelpTray to appear
return true;
}
/**
* @see TitleAreaDialog#createContents(Composite)
*/
@Override
protected Control createContents(Composite parent) {
Control control = super.createContents(parent);
setTitle(title);
setMessage(message);
return control;
}
/**
* @see Window#configureShell(Shell)
*/
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(title);
}
/**
* @see TitleAreaDialog#createDialogArea(Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite page = new Composite(parent, SWT.NONE);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
page.setLayoutData(data);
page.setLayout(new GridLayout(1, false));
Label filterLabel = new Label(page, SWT.NONE);
filterLabel.setText("Filter");
filterField = createFilterField(page);
filterField.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.BEGINNING)
.grab(true, false).create());
filterField.addListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(TypeFilterField.PROPERTY_VALID)) {
getButton(OK).setEnabled((Boolean) evt.getNewValue());
}
}
});
return page;
}
/**
* Creates the filter field to use for the filter creation.
*
* @param parent the parent composite
* @return the filter field to use
*/
protected abstract TypeFilterField createFilterField(Composite parent);
/**
* @see Dialog#createButtonsForButtonBar(Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
getButton(OK).setEnabled(filterField.isValid());
}
/**
* Get the filter expression
*
* @return the filter expression
*/
public Filter getFilter() {
return filter;
}
/**
* @see Dialog#okPressed()
*/
@Override
protected void okPressed() {
filter = filterField.getFilter();
if (filter != null) {
super.okPressed();
}
}
/**
* @see Dialog#cancelPressed()
*/
@Override
protected void cancelPressed() {
filter = null;
super.cancelPressed();
}
}