package org.nightlabs.jfire.trade.ui.modeofpayment; import java.io.ByteArrayInputStream; import java.util.Collection; import java.util.HashSet; import javax.jdo.FetchPlan; import org.eclipse.jface.viewers.ArrayContentProvider; 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.jface.viewers.ViewerComparator; 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.accounting.dao.ModeOfPaymentFlavourDAO; import org.nightlabs.jfire.accounting.pay.ModeOfPaymentFlavour; import org.nightlabs.jfire.accounting.pay.id.ModeOfPaymentFlavourID; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.util.NLLocale; public class ModeOfPaymentFlavourTable extends AbstractTableComposite<ModeOfPaymentFlavour> { /** * The minimal fetch-groups needed for a {@link ModeOfPaymentFlavour} * to be displayed in this table. */ public static final String[] FETCH_GROUPS_MODE_OF_PAYMENT_FLAVOUR = new String[] { FetchPlan.DEFAULT, ModeOfPaymentFlavour.FETCH_GROUP_ICON_16X16_DATA, ModeOfPaymentFlavour.FETCH_GROUP_NAME }; private class LabelProvider extends org.eclipse.jface.viewers.LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { byte[] iconData = ((ModeOfPaymentFlavour)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 ((ModeOfPaymentFlavour)element).getName().getText(NLLocale.getDefault().getLanguage()); } } public ModeOfPaymentFlavourTable(Composite parent, int style, int viewerStyle) { super(parent, style, true, viewerStyle); setHeaderVisible(false); // if this is set to true, then table-columns need to be externalised } public ModeOfPaymentFlavourTable(Composite parent) { this(parent, SWT.NONE, DEFAULT_STYLE_SINGLE_BORDER); } @Override protected void createTableColumns(TableViewer tableViewer, Table table) { // header is not visible => no externalisation needed new TableColumn(table, SWT.LEFT).setText("ModeOfPaymentFlavour"); //$NON-NLS-1$ table.setLayout(new WeightedTableLayout(new int[] {1})); tableViewer.setComparator(new ViewerComparator() { @Override public int compare(Viewer viewer, Object e1, Object e2) { if (!(e1 instanceof ModeOfPaymentFlavour && e2 instanceof ModeOfPaymentFlavour)) return super.compare(viewer, e1, e2); String name1 = ((ModeOfPaymentFlavour) e1).getName().getText(NLLocale.getDefault().getLanguage());; String name2 = ((ModeOfPaymentFlavour) e2).getName().getText(NLLocale.getDefault().getLanguage());; return name1.compareTo(name2); } }); } @Override protected void setTableProvider(TableViewer tableViewer) { tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setLabelProvider(new LabelProvider()); } /** * @return Returns <code>null</code>, if no {@link ModeOfPaymentFlavour} is selected, * otherwise the one selected. */ public ModeOfPaymentFlavour getSelectedModeOfPaymentFlavour() { IStructuredSelection sel = (IStructuredSelection) getTableViewer().getSelection(); if (sel.isEmpty()) return null; else return (ModeOfPaymentFlavour) sel.getFirstElement(); } /** * Obtains the referenced {@link ModeOfPaymentFlavour}s using the {@link ModeOfPaymentFlavourDAO} * and sets them as input for the table. * <p> * This might be called from a non-UI thread. * </p> * * @param modeOfPaymentFlavourIDs The ids of the {@link ModeOfPaymentFlavour}s to set. * @param monitor The monitor to report progress to. */ public void setModeOfPaymentFlavourIDs(Collection<ModeOfPaymentFlavourID> modeOfPaymentFlavourIDs, ProgressMonitor monitor) { final Collection<ModeOfPaymentFlavour> flavours = ModeOfPaymentFlavourDAO.sharedInstance().getModeOfPaymentFlavours( new HashSet<ModeOfPaymentFlavourID>(modeOfPaymentFlavourIDs), FETCH_GROUPS_MODE_OF_PAYMENT_FLAVOUR, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, monitor); getTable().getDisplay().asyncExec(new Runnable() { public void run() { setInput(flavours); } }); } }