package org.nightlabs.jfire.trade.ui.repository.editor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.composite.XComposite.LayoutMode;
import org.nightlabs.base.ui.editor.RestorableSectionPart;
import org.nightlabs.base.ui.resource.SharedImages;
import org.nightlabs.jdo.query.QueryCollection;
import org.nightlabs.jfire.trade.ui.TradePlugin;
import org.nightlabs.jfire.trade.ui.resource.Messages;
class ProductTransferFilterSection
extends RestorableSectionPart
{
protected ProductTransferPageController controller;
private Spinner limit;
private Button refreshButton;
public ProductTransferFilterSection(FormPage page, Composite parent, ProductTransferPageController _controller)
{
super(parent, page.getEditor().getToolkit(), ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE);
this.controller = _controller;
getSection().setText(Messages.getString("org.nightlabs.jfire.trade.ui.repository.editor.ProductTransferFilterSection.filterCriteriaSection.text")); //$NON-NLS-1$
getSection().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
getSection().setLayout(new GridLayout());
this.controller.addPropertyChangeListener(ProductTransferPageController.PROPERTY_PRODUCT_TRANSFER_QUERY, new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt)
{
if (ignoreProductTransferQueryChanged)
return;
productTransferQueryChanged((QueryCollection<?>) evt.getNewValue());
}
});
XComposite client = new XComposite(getSection(), SWT.NONE, LayoutMode.TIGHT_WRAPPER);
client.getGridLayout().numColumns = 3; // TODO when adding more UI, we might want to switch to 1 and use wrapper-composites
new Label(client, SWT.NONE).setText(Messages.getString("org.nightlabs.jfire.trade.ui.repository.editor.ProductTransferFilterSection.resultLimitLabel.text")); //$NON-NLS-1$
limit = new Spinner(client, page.getEditor().getToolkit().getBorderStyle());
limit.setMinimum(0);
limit.setMaximum(Integer.MAX_VALUE);
limit.setSelection(1000000000);
refreshButton = new Button(client, SWT.NONE);
refreshButton.setImage(SharedImages.getSharedImage(TradePlugin.getDefault(), ProductTransferFilterSection.class, "refreshButton")); //$NON-NLS-1$
refreshButton.setText(Messages.getString("org.nightlabs.jfire.trade.ui.repository.editor.ProductTransferFilterSection.refreshButton.text")); //$NON-NLS-1$
refreshButton.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.repository.editor.ProductTransferFilterSection.refreshButton.toolTipText")); //$NON-NLS-1$
refreshButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
controller.setFromInclude(0);
controller.setToExclude(limit.getSelection() == 0 ? Long.MAX_VALUE : limit.getSelection());
fireProductTransferQueryChanged();
}
});
getSection().setClient(client);
productTransferQueryChanged(controller.getQueryWrapper());
}
protected boolean ignoreProductTransferQueryChanged = false;
/**
* must be called on UI thread!
*/
private void fireProductTransferQueryChanged()
{
ignoreProductTransferQueryChanged = true;
try {
controller.fireProductTransferQueryChange();
} finally {
ignoreProductTransferQueryChanged = false;
}
}
/**
* This method is called on the UI thread whenever the productTransferQuery has changed.
* It is not called, if the change originated from here (i.e. {@link #fireProductTransferQueryChanged()} in
* this object).
*/
private void productTransferQueryChanged(QueryCollection<?> queryCollection)
{
if (queryCollection.getToExclude() > Integer.MAX_VALUE)
limit.setSelection(0);
else
limit.setSelection((int) queryCollection.getToExclude());
}
}