package org.nightlabs.jfire.issuetracking.ui.issue.editor.issueMarker;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.TableLabelProvider;
import org.nightlabs.jfire.issue.issuemarker.IssueMarker;
import org.nightlabs.jfire.issuetracking.ui.resource.Messages;
/**
* A table, filtered, showing only contents that are available to be used as an IssueMarker.
*
* @author Khaireel Mohamed - khaireel at nightlabs dot de
*/
public class IssueMarkerWizardTable extends AbstractTableComposite<IssueMarker> {
private Collection<IssueMarker> currentContentsOnSectionTable;
/**
* Creates a new instance of an IssueMarkerWizardTable.
*/
public IssueMarkerWizardTable(Composite parent, Collection<IssueMarker> currentContentsOnSectionTable) {
this(parent, SWT.NONE, DEFAULT_STYLE_SINGLE_BORDER);
this.currentContentsOnSectionTable = currentContentsOnSectionTable;
}
/**
* Creates a new instance of an IssueMarkerWizardTable.
*/
public IssueMarkerWizardTable(Composite parent, int style, int viewerStyle) {
super(parent, style, true, viewerStyle);
setHeaderVisible(false);
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent event) { disposeAllImages(); }
});
}
@Override
public void setInput(Object input) {
// Performs the filter. Very naively.
// --> I think I remember Marco mentioning another way to do this, but not really sure where to look for it. Kai
Collection<?> issueMarkers = (Collection<?>)input;
Collection<IssueMarker> filteredInputs = new ArrayList<IssueMarker>();
for (Object issueMarker : issueMarkers)
if ( !currentContentsOnSectionTable.contains(issueMarker) ) {
filteredInputs.add( (IssueMarker)issueMarker );
}
super.setInput(filteredInputs);
if ( !filteredInputs.isEmpty() ) select(0);
}
/* (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 tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setMoveable(true);
tableColumn.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.editor.issueMarker.IssueMarkerWizardTable.column.markerName.text")); //$NON-NLS-1$
tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setMoveable(true);
tableColumn.setText(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issue.editor.issueMarker.IssueMarkerWizardTable.column.description.text")); //$NON-NLS-1$
WeightedTableLayout layout = new WeightedTableLayout(new int[]{20, 70});
table.setLayout(layout);
}
/* (non-Javadoc)
* @see org.nightlabs.base.ui.table.AbstractTableComposite#setTableProvider(org.eclipse.jface.viewers.TableViewer)
*/
@Override
protected void setTableProvider(TableViewer tableViewer) {
tableViewer.setLabelProvider(new IssMrkrWizLabelProvider());
tableViewer.setContentProvider(new ArrayContentProvider());
}
// ------------------------------------------------------------------------------------------------------
// Cleanly control the images, so that we dont have to keep creating new ones, even after it was
// removed from the table entry, and the re-added again later.
private Collection<Image> iconImages = new ArrayList<Image>();
/**
* Disposes all images.
*/
private void disposeAllImages() {
for (Image image : iconImages)
image.dispose();
iconImages.clear();
}
// ------------------------------------------------------------------------------------------------------
/**
* Provides the contents for the IssueMarkerWizardTable.
*/
private class IssMrkrWizLabelProvider extends TableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
if (element != null && element instanceof IssueMarker && columnIndex == 0) {
IssueMarker issueMarker = (IssueMarker)element;
ByteArrayInputStream in = new ByteArrayInputStream( issueMarker.getIcon16x16Data() );
Image icon = new Image(getDisplay(), in);
iconImages.add(icon);
return icon;
}
return super.getColumnImage(element, columnIndex);
}
@Override
public String getColumnText(Object element, int columnIndex) {
// Note: @colunmIndex 0 -- Name of the IssueMarker, and its related icon.
// @colunmIndex 1 -- Description of the IssueMarker.
if (element != null && element instanceof IssueMarker) {
IssueMarker issueMarker = (IssueMarker)element;
if (columnIndex == 0) return issueMarker.getName().getText();
if (columnIndex == 1) return issueMarker.getDescription().getText();
}
return ""; //$NON-NLS-1$
}
}
}