package org.nightlabs.jfire.trade.ui.overview; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.LinkedList; import java.util.List; import javax.security.auth.login.LoginException; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.TableViewer; 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.nightlabs.base.ui.layout.WeightedTableLayout; import org.nightlabs.base.ui.table.AbstractTableComposite; import org.nightlabs.base.ui.table.GenericInvertViewerSorter; import org.nightlabs.base.ui.table.TableLabelProvider; import org.nightlabs.base.ui.table.column.config.ITableColumnConfigurationAdapter; import org.nightlabs.base.ui.table.column.config.TableColumnConfigurator; import org.nightlabs.jfire.accounting.Price; import org.nightlabs.jfire.base.login.ui.Login; import org.nightlabs.jfire.jbpm.graph.def.Statable; import org.nightlabs.jfire.jbpm.graph.def.StatableLocal; import org.nightlabs.jfire.jbpm.graph.def.State; import org.nightlabs.jfire.trade.ArticleContainer; import org.nightlabs.jfire.trade.ArticleContainerUtil; import org.nightlabs.jfire.trade.ui.resource.Messages; import org.nightlabs.l10n.DateFormatter; import org.nightlabs.util.BaseComparator; /** * * @author Daniel.Mazurek [at] NightLabs [dot] de * @author Frederik Loeser <!-- frederik [AT] nightlabs [DOT] de --> */ public abstract class AbstractArticleContainerListComposite<O extends ArticleContainer> extends AbstractTableComposite<O> { public static final Comparator<ArticleContainer> ARTICLE_CONTAINER_CREATE_DT_COMPARATOR = new Comparator<ArticleContainer>(){ @Override public int compare(final ArticleContainer o1, final ArticleContainer o2) { final int result = BaseComparator.comparatorNullCheck(o1, o2); if (result == BaseComparator.COMPARE_RESULT_NOT_NULL) { final int result2 = BaseComparator.comparatorNullCheck(o1.getCreateDT(), o2.getCreateDT()); if (result2 == BaseComparator.COMPARE_RESULT_NOT_NULL) { return TableLabelProvider.DATE_COMPARATOR.compare(o1.getCreateDT(), o2.getCreateDT()); } return result2; } return result; } }; public static final Comparator<Price> PRICE_COMPARATOR = new Comparator<Price>(){ @Override public int compare(final Price o1, final Price o2) { final int result = BaseComparator.comparatorNullCheck(o1, o2); if (result == BaseComparator.COMPARE_RESULT_NOT_NULL) { return (int) (o1.getAmount() - o2.getAmount()); } return result; } }; public static final Comparator<ArticleContainer> ARTICLE_COUNT_COMPARATOR = new Comparator<ArticleContainer>(){ @Override public int compare(final ArticleContainer o1, final ArticleContainer o2) { return Integer.valueOf(o1.getArticleCount()).compareTo(o2.getArticleCount()); } }; public class LabelProvider extends TableLabelProvider { @Override public Image getColumnImage(final Object element, final int columnIndex) { return AbstractArticleContainerListComposite.this.getColumnImage(element, columnIndex); } @Override public String getColumnText(final Object element, final int columnIndex) { return AbstractArticleContainerListComposite.this.getColumnText(element, columnIndex); } @Override public Comparator<?> getColumnComparator(final Object element, final int columnIndex) { return AbstractArticleContainerListComposite.this.getColumnComparator(element, columnIndex); } } /** * @param parent * @param style */ public AbstractArticleContainerListComposite(final Composite parent, final int style) { super(parent, style); } /** * @param parent * @param style * @param initTable * @param viewerStyle */ public AbstractArticleContainerListComposite(final Composite parent, final int style, final boolean initTable, final int viewerStyle) { super(parent, style, initTable, viewerStyle); } private LinkedList<Integer> weightedColumns; private LinkedList<Integer> fixedColumns; protected void addFixedColumn(final int columnWidth) { if (weightedColumns == null) { weightedColumns = new LinkedList<Integer>(); fixedColumns = new LinkedList<Integer>(); } weightedColumns.add(Integer.valueOf(-1)); fixedColumns.add(Integer.valueOf(columnWidth)); } protected void addWeightedColumn(final int columnWeight) { if (weightedColumns == null) { weightedColumns = new LinkedList<Integer>(); fixedColumns = new LinkedList<Integer>(); } weightedColumns.add(Integer.valueOf(columnWeight)); fixedColumns.add(Integer.valueOf(-1)); } protected String getIDColumnText() { return Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.column.id.text"); //$NON-NLS-1$ } @Override protected void createTableColumns(final TableViewer tableViewer, final Table table) { // This layout is simply to buggy (columns may be resized to size = 0 => they disappear! // And not like the other layouts where you can make them visible again by pulling the divider in the reverse direction.) // TableColumnLayout tableLayout = new TableColumnLayout(); TableColumn c; // c = new TableColumn(table, SWT.LEFT); // c.setText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.organisationIDTableColumn.text")); //$NON-NLS-1$ // c.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.organisationIDTableColumn.text")); //$NON-NLS-1$ //// tableLayout.setColumnData(c, new ColumnWeightData(10, 50)); // addWeightedColumn(15); // createArticleContainerIDPrefixTableColumn(tableViewer, table); // createArticleContainerIDTableColumn(tableViewer, table); c = new TableColumn(table, SWT.LEFT); c.setText(getIDColumnText()); c.setToolTipText(getIDColumnText()); addWeightedColumn(10); c = new TableColumn(table, SWT.LEFT); c.setText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.customerTableColumn.text")); //$NON-NLS-1$ c.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.customerTableColumn.text")); //$NON-NLS-1$ // tableLayout.setColumnData(c, new ColumnWeightData(8, 50)); addWeightedColumn(15); c = new TableColumn(table, SWT.LEFT); c.setText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.vendorTableColumn.text")); //$NON-NLS-1$ c.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.vendorTableColumn.text")); //$NON-NLS-1$ // tableLayout.setColumnData(c, new ColumnWeightData(9, 50)); addWeightedColumn(15); c = new TableColumn(table, SWT.LEFT); c.setText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.createDateTableColumn.text")); //$NON-NLS-1$ c.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.createDateTableColumn.text")); //$NON-NLS-1$ // tableLayout.setColumnData(c, new ColumnWeightData(10)); addWeightedColumn(12); c = new TableColumn(table, SWT.LEFT); c.setText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.createUserTableColumn.text")); //$NON-NLS-1$ c.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.createUserTableColumn.text")); //$NON-NLS-1$ // tableLayout.setColumnData(c, new ColumnWeightData(10)); addWeightedColumn(10); c = new TableColumn(table, SWT.LEFT); c.setText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.amountTableColumn.text")); //$NON-NLS-1$ c.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.amountTableColumn.text")); //$NON-NLS-1$ // tableLayout.setColumnData(c, new ColumnWeightData(10)); addWeightedColumn(5); if (Statable.class.isAssignableFrom(getArticleContainerClass())) { c = new TableColumn(table, SWT.LEFT); c.setText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.currentStateTableColumn.text")); //$NON-NLS-1$ c.setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.overview.AbstractArticleContainerListComposite.currentStateTableColumn.text")); //$NON-NLS-1$ // tableLayout.setColumnData(c, new ColumnWeightData(10)); addWeightedColumn(10); } // table.setLayout(new WeightedTableLayout(new int[] {10, 10, 10, 10, 10, 10, 10, 10})); createAdditionalTableColumns(tableViewer, table); getTable().setLayout( new WeightedTableLayout(getPrimitiveArray(weightedColumns), getPrimitiveArray(fixedColumns)) ); new TableColumnConfigurator(new ITableColumnConfigurationAdapter() { @Override public String getTableID() { final StringBuilder sb = new StringBuilder(); try { sb.append(AbstractArticleContainerListComposite.this.getClass().getSimpleName()).append("_") .append(Login.getLogin().getUserID()); } catch (final LoginException e) { throw new RuntimeException(e); } return sb.toString(); } @Override public Table getTable() { return tableViewer.getTable(); } @Override public List<String> getColumnIDs() { final List<String> columnIDs = new ArrayList<String>(); for (int i = 0; i < tableViewer.getTable().getColumnCount(); i++) columnIDs.add(String.valueOf(i)); return columnIDs; } }); } private int[] getPrimitiveArray(final List<Integer> list) { final int[] primitiveArray = new int[list.size()]; int i = 0; for (final Integer value : list) { primitiveArray[i] = (value == null || value < 0) ? -1 : value; i++; } return primitiveArray; } protected abstract Class<? extends ArticleContainer> getArticleContainerClass(); protected abstract void createAdditionalTableColumns(TableViewer tableViewer, Table table); // protected abstract void createArticleContainerIDPrefixTableColumn(TableViewer tableViewer, Table table); // protected abstract void createArticleContainerIDTableColumn(TableViewer tableViewer, Table table); @Override protected void setTableProvider(final TableViewer tableViewer) { tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setLabelProvider(new LabelProvider()); tableViewer.setSorter(new GenericInvertViewerSorter(3).getInverseSorter()); } protected String getCreateUserName(final ArticleContainer articleContainer) { if (articleContainer.getCreateUser() != null) { return articleContainer.getCreateUser().getName(); } return ""; //$NON-NLS-1$ } protected String getStateName(final Statable statable) { // I think we need to look for the newest State in both, statableLocal and statable! Marco. final StatableLocal statableLocal = statable.getStatableLocal(); State state = statable.getState(); final State state2 = statableLocal.getState(); if (state2 != null) { if (state == null) state = state2; else if (state.getCreateDT().compareTo(state2.getCreateDT()) < 0) state = state2; } if (state != null) return state.getStateDefinition().getName().getText(); return ""; //$NON-NLS-1$ } protected Comparator<?> getColumnComparator(final Object element, final int columnIndex) { final int firstAdditionalColumnIndex = getFirstAdditionalColumnIndex(); if (columnIndex >= firstAdditionalColumnIndex) { return getAdditionalColumnComparator(element, columnIndex - firstAdditionalColumnIndex, firstAdditionalColumnIndex, columnIndex); } switch (columnIndex) { case 0: return ArticleContainerUtil.ARTICLE_CONTAINER_COMPARATOR; case 3: return ARTICLE_CONTAINER_CREATE_DT_COMPARATOR; case 5: return ARTICLE_COUNT_COMPARATOR; default: return null; } } protected Image getColumnImage(final Object element, final int columnIndex) { int firstAdditionalColumnIndex = 6; if (Statable.class.isAssignableFrom(getArticleContainerClass())) firstAdditionalColumnIndex = 7; final int additionalColumnIndex = columnIndex - firstAdditionalColumnIndex; if (additionalColumnIndex < 0) return null; return getAdditionalColumnImage(element, additionalColumnIndex, firstAdditionalColumnIndex, columnIndex); } protected String formatDate(final Date date) { return DateFormatter.formatDateShortTimeHM(date, true); } // protected String getColumnText(Object element, int columnIndex) // { // if (element instanceof ArticleContainer) { // ArticleContainer articleContainer = (ArticleContainer) element; // switch (columnIndex) { // case 0: // return articleContainer.getOrganisationID(); // case 1: // return ArticleContainerUtil.getArticleContainerID(articleContainer); // case 2: // return articleContainer.getCustomer().getPerson().getDisplayName(); // case 3: // return articleContainer.getVendor().getPerson().getDisplayName(); // case 4: // return formatDate(articleContainer.getCreateDT()); // case 5: // return getCreateUserName(articleContainer); // case 6: // return String.valueOf(articleContainer.getArticleCount()); // } // } // int firstAdditionalColumnIndex = 7; // if (Statable.class.isAssignableFrom(getArticleContainerClass())) // firstAdditionalColumnIndex = 8; // // if (element instanceof Statable && columnIndex == 7) { // Statable statable = (Statable) element; // return getStateName(statable); // } // if (columnIndex == 0) // return String.valueOf(element); // // int additionalColumnIndex = columnIndex - firstAdditionalColumnIndex; // if (additionalColumnIndex < 0) // return ""; //$NON-NLS-1$ // // return getAdditionalColumnText(element, additionalColumnIndex, firstAdditionalColumnIndex, columnIndex); // } protected int getFirstAdditionalColumnIndex() { int firstAdditionalColumnIndex = 6; if (Statable.class.isAssignableFrom(getArticleContainerClass())) firstAdditionalColumnIndex = 7; return firstAdditionalColumnIndex; } protected String getColumnText(final Object element, final int columnIndex) { if (element instanceof ArticleContainer) { final ArticleContainer articleContainer = (ArticleContainer) element; switch (columnIndex) { case 0: return ArticleContainerUtil.getArticleContainerID(articleContainer); case 1: return articleContainer.getCustomer().getPerson().getDisplayName(); case 2: return articleContainer.getVendor().getPerson().getDisplayName(); case 3: return formatDate(articleContainer.getCreateDT()); case 4: return getCreateUserName(articleContainer); case 5: return String.valueOf(articleContainer.getArticleCount()); } } final int firstAdditionalColumnIndex = getFirstAdditionalColumnIndex(); if (element instanceof Statable && columnIndex == 6) { final Statable statable = (Statable) element; return getStateName(statable); } if (columnIndex == 0) return String.valueOf(element); final int additionalColumnIndex = columnIndex - firstAdditionalColumnIndex; if (additionalColumnIndex < 0) return ""; //$NON-NLS-1$ return getAdditionalColumnText(element, additionalColumnIndex, firstAdditionalColumnIndex, columnIndex); } /** * @param element The element for which to obtain a column's text value * @param additionalColumnIndex The 0-based index for additional columns. It is the result of: <code>columnIndex - firstAdditionalColumnIndex</code> * @param firstAdditionalColumnIndex The absolute column index of the first additional column. * @param columnIndex The absolute column index (0-based). * @return the String to display in the given column for the given element. Must not be <code>null</code>! */ protected abstract String getAdditionalColumnText(Object element, int additionalColumnIndex, int firstAdditionalColumnIndex, int columnIndex); /** * @param element The element for which to obtain a column's image * @param additionalColumnIndex The 0-based index for additional columns. It is the result of: <code>columnIndex - firstAdditionalColumnIndex</code> * @param firstAdditionalColumnIndex The absolute column index of the first additional column. * @param columnIndex The absolute column index (0-based). * @return the <code>Comparator</code> to use for the given column, or null to use the default comparator. */ protected Comparator<?> getAdditionalColumnComparator(final Object element, final int additionalColumnIndex, final int firstAdditionalColumnIndex, final int columnIndex) { return null; } /** * @param element The element for which to obtain a column's image * @param additionalColumnIndex The 0-based index for additional columns. It is the result of: <code>columnIndex - firstAdditionalColumnIndex</code> * @param firstAdditionalColumnIndex The absolute column index of the first additional column. * @param columnIndex The absolute column index (0-based). * @return the <code>Image</code> to display in the given column for the given element or <code>null</code> if no image should be shown. */ protected Image getAdditionalColumnImage(final Object element, final int additionalColumnIndex, final int firstAdditionalColumnIndex, final int columnIndex) { return null; } }