package org.nightlabs.jfire.trade.ui.modeofdelivery;
import java.io.ByteArrayInputStream;
import java.util.Collection;
import java.util.HashSet;
import javax.jdo.FetchPlan;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.internal.forms.widgets.SWTUtil;
import org.nightlabs.base.ui.layout.WeightedTableLayout;
import org.nightlabs.base.ui.table.AbstractTableComposite;
import org.nightlabs.jdo.NLJDOHelper;
import org.nightlabs.jfire.store.deliver.ModeOfDeliveryFlavour;
import org.nightlabs.jfire.store.deliver.dao.ModeOfDeliveryFlavourDAO;
import org.nightlabs.jfire.store.deliver.id.ModeOfDeliveryFlavourID;
import org.nightlabs.progress.ProgressMonitor;
import org.nightlabs.util.NLLocale;
public class ModeOfDeliveryFlavourTable
extends AbstractTableComposite<ModeOfDeliveryFlavour>
{
/**
* The minimal fetch-groups needed for a {@link ModeOfDeliveryFlavour}
* to be displayed in this table.
*/
public static final String[] FETCH_GROUPS_MODE_OF_DELIVERY_FLAVOUR = new String[] {
FetchPlan.DEFAULT, ModeOfDeliveryFlavour.FETCH_GROUP_NAME,
ModeOfDeliveryFlavour.FETCH_GROUP_ICON_16X16_DATA
};
private static class ContentProvider implements IStructuredContentProvider {
@SuppressWarnings("unchecked")
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Collection) {
return ((Collection)inputElement).toArray();
}
else
throw new IllegalArgumentException("ModeOfDeliveryFlavourTable.ContentProvider expects a Collection as inputElement. Recieved "+inputElement.getClass().getName()); //$NON-NLS-1$
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private static class LabelProvider extends org.eclipse.jface.viewers.LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
byte[] iconData = ((ModeOfDeliveryFlavour)element).getIcon16x16Data();
if (iconData == null)
return null;
ByteArrayInputStream in = new ByteArrayInputStream(iconData);
Image image = new Image(SWTUtil.getStandardDisplay(), in);
return image;
}
public String getColumnText(Object element, int columnIndex) {
return ((ModeOfDeliveryFlavour)element).getName().getText(NLLocale.getDefault().getLanguage());
}
}
public ModeOfDeliveryFlavourTable(Composite parent)
{
this(parent, SWT.NONE, DEFAULT_STYLE_SINGLE_BORDER);
}
public ModeOfDeliveryFlavourTable(Composite parent, int style, int viewerStyle)
{
super(parent, style, true, viewerStyle);
setHeaderVisible(false); // if this is changed to true, we need to localize the tableColumns
}
@Override
protected void createTableColumns(TableViewer tableViewer, Table table)
{
// the header is not visible => no need to externalize
new TableColumn(table, SWT.LEFT).setText("ModeOfDeliveryFlavour"); //$NON-NLS-1$
table.setLayout(new WeightedTableLayout(new int[] {1}));
}
@Override
protected void setTableProvider(TableViewer tableViewer)
{
tableViewer.setContentProvider(new ContentProvider());
tableViewer.setLabelProvider(new LabelProvider());
}
/**
* @return Returns <code>null</code>, if no {@link ModeOfDeliveryFlavour} is selected,
* otherwise the one selected.
*/
public ModeOfDeliveryFlavour getSelectedModeOfDeliveryFlavour()
{
IStructuredSelection sel = (IStructuredSelection) getTableViewer().getSelection();
if (sel.isEmpty())
return null;
else
return (ModeOfDeliveryFlavour) sel.getFirstElement();
}
/**
* Obtains the referenced {@link ModeOfDeliveryFlavour}s using the {@link ModeOfDeliveryFlavourDAO}
* and sets them as input for the table.
* <p>
* This might be called from a non-UI thread.
* </p>
*
* @param ModeOfDeliveryFlavourIDs The ids of the {@link ModeOfDeliveryFlavour}s to set.
* @param monitor The monitor to report progress to.
*/
public void setModeOfDeliveryFlavourIDs(Collection<ModeOfDeliveryFlavourID> modeOfDeliveryFlavourIDs, ProgressMonitor monitor) {
final Collection<ModeOfDeliveryFlavour> flavours = ModeOfDeliveryFlavourDAO.sharedInstance().getModeOfDeliveryFlavours(
new HashSet<ModeOfDeliveryFlavourID>(modeOfDeliveryFlavourIDs),
FETCH_GROUPS_MODE_OF_DELIVERY_FLAVOUR,
NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor);
if (!getTable().isDisposed()) {
getTable().getDisplay().asyncExec(new Runnable() {
public void run() {
setInput(flavours);
}
});
}
}
}