package org.nightlabs.jfire.entityuserset.ui; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.nightlabs.base.ui.notification.IDirtyStateManager; import org.nightlabs.base.ui.table.AbstractTableComposite; import org.nightlabs.base.ui.table.TableLabelProvider; import org.nightlabs.jfire.entityuserset.ui.resource.Messages; /** * @author Daniel Mazurek - Daniel.Mazurek [dot] nightlabs [dot] de * */ public abstract class AbstractEntityTable<Entity> extends AbstractTableComposite<Map.Entry<Entity, Boolean>> { class ContentProvider extends ArrayContentProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ArrayContentProvider#getElements(java.lang.Object) */ @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Map) { Map<Entity, Boolean> entities = (Map<Entity, Boolean>) inputElement; return entities.entrySet().toArray(); } return super.getElements(inputElement); } } public abstract class AbstractEntityTableLabelProvider // extends EmulatedNativeCheckBoxTableLabelProvider extends TableLabelProvider { /** * @param viewer */ public AbstractEntityTableLabelProvider(TableViewer viewer) { // super(viewer); super(); } // /* (non-Javadoc) // * @see org.nightlabs.base.ui.table.TableLabelProvider#getColumnImage(java.lang.Object, int) // */ // @Override // public Image getColumnImage(Object element, int columnIndex) // { // if (columnIndex == 0) { // Boolean b = ((Map.Entry<Entity, Boolean>) element).getValue(); // if (b != null) { // if (logger.isDebugEnabled()) { // logger.debug("getColumnImage() for element "+element+" and columnIndex "+columnIndex); // } // return getCheckBoxImage(b); // } // } // return super.getColumnImage(element, columnIndex); // } } private static final Logger logger = Logger.getLogger(AbstractEntityTable.class); private IDirtyStateManager dirtyStateManager; /** * @param parent * @param style * @param dirtyStateManager */ public AbstractEntityTable(Composite parent, int style, IDirtyStateManager dirtyStateManager) { // super(parent, style); super(parent, style, true, AbstractTableComposite.DEFAULT_STYLE_SINGLE_BORDER | SWT.CHECK); this.dirtyStateManager = dirtyStateManager; } /** * The first checkbox column for selecting which entites should be included is already created by this class, * implementations can add here additional columns for the table. * * @param tableViewer the {@link TableViewer} which manages the given {@link Table}. * @param table the {@link Table} which is managed by the {@link TableViewer}. */ protected abstract void createAdditionalTableColumns(TableViewer tableViewer, Table table); /** * Creates a subclass of {@link AbstractEntityTableLabelProvider} for the tbaleViwer to show the labels * for the displayed entities. * {@link AbstractEntityTableLabelProvider} already shows the check box image in the first column, subclasses * must therefore only care about returning values for the additional created columns, * by the method {@link #createAdditionalTableColumns(TableViewer, Table)}. * * @param tableViewer the {@link TableViewer} which manages the {@link Table}. * @return an implementation of {@link AbstractEntityTableLabelProvider} which will be used as labelProvider for * the given {@link TableViewer}. */ protected abstract AbstractEntityTableLabelProvider createEntityTableLabelProvider(TableViewer tableViewer); /* (non-Javadoc) * @see org.nightlabs.base.ui.table.AbstractTableComposite#createTableColumns(org.eclipse.jface.viewers.TableViewer, org.eclipse.swt.widgets.Table) */ @Override protected void createTableColumns(TableViewer tableViewer, Table table) { TableColumn checkBoxColumn = new TableColumn(table, SWT.NONE); checkBoxColumn.setText(""); //$NON-NLS-1$ checkBoxColumn.setToolTipText(Messages.getString("org.nightlabs.jfire.entityuserset.ui.AbstractEntityTable.checkboxColumn.tooltip")); //$NON-NLS-1$ addCheckStateChangedListener(new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent e) { TableItem tableItem = ((TableItem) e.item); boolean checked = tableItem.getChecked(); Map.Entry<Entity, Boolean> entry = (Map.Entry<Entity, Boolean>) tableItem.getData(); entry.setValue(checked); dirtyStateManager.markDirty(); if (logger.isDebugEnabled()) { logger.debug("setValue "+checked+" for entity "+entry.getKey()); //$NON-NLS-1$ //$NON-NLS-2$ } } }); // TableViewerColumn col1 = new TableViewerColumn(tableViewer, SWT.LEFT); // col1.getColumn().setResizable(false); // col1.getColumn().setText(""); //$NON-NLS-1$ // col1.setEditingSupport(new CheckboxEditingSupport<Map.Entry<Entity, Boolean>>(tableViewer) { // @Override // protected boolean doGetValue(Map.Entry<Entity, Boolean> element) { // return element.getValue().booleanValue(); // } // // @Override // protected void doSetValue(Map.Entry<Entity, Boolean> element, boolean value) { // element.setValue(value); // AbstractEntityTable.this.dirtyStateManager.markDirty(); // getTableViewer().refresh(element, true); // if (logger.isDebugEnabled()) { // logger.debug("doSetValue() for element "+element+" and value "+value); // } // } // }); createAdditionalTableColumns(tableViewer, table); } /* (non-Javadoc) * @see org.nightlabs.base.ui.table.AbstractTableComposite#setTableProvider(org.eclipse.jface.viewers.TableViewer) */ @Override protected void setTableProvider(TableViewer tableViewer) { tableViewer.setContentProvider(new ContentProvider()); tableViewer.setLabelProvider(createEntityTableLabelProvider(tableViewer)); } public void setEntityInput(Map<Entity, Boolean> entities) { setInput(entities); if (entities != null) { Collection<Map.Entry<Entity, Boolean>> checkedElements = new ArrayList<Map.Entry<Entity, Boolean>>(); for (Map.Entry<Entity, Boolean> entry : entities.entrySet()) { if (entry.getValue()) { checkedElements.add(entry); } } setCheckedElements(checkedElements); } } }