package xyz.veronie.bgg.ui.parts; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.di.UIEventTopic; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.OwnerDrawLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import xyz.veronie.bgg.result.Thing; import xyz.veronie.bgg.result.ThingProvider; import xyz.veronie.bgg.types.EventConstants; public class BggResultPart { private TableViewer viewer; private Label statsLabel; @Inject private ThingProvider thingProvider; @Inject private IEventBroker eventBroker; @PostConstruct public void createContents(Composite parent) { Composite main = new Composite(parent, SWT.FILL); main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); GridLayout layout = new GridLayout(2, false); main.setLayout(layout); createViewer(main); statsLabel = new Label(main, SWT.FILL); statsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); statsLabel.setText("0 items"); } private void createViewer(Composite parent) { viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER ); createColumns(parent, viewer); final Table table = viewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); viewer.setContentProvider(new ArrayContentProvider()); // Get the content for the viewer, setInput will call getElements in the // contentProvider viewer.setInput(thingProvider.getThings()); // make the selection available to other views // TODO: getSite().setSelectionProvider(viewer); // Set the sorter for the table // Layout the viewer GridData gridData = new GridData(); gridData.verticalAlignment = GridData.FILL; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = true; gridData.horizontalAlignment = GridData.FILL; gridData.horizontalSpan = 2; viewer.getControl().setLayoutData(gridData); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = viewer.getStructuredSelection(); Thing thing = (Thing)selection.getFirstElement(); eventBroker.send(EventConstants.TOPIC_THING_SELECTION, thing); } }); } public TableViewer getViewer() { return viewer; } // This will create the columns for the table private void createColumns(final Composite parent, final TableViewer viewer) { // https://stackoverflow.com/questions/12641354/putting-an-image-in-to-a-jface-table-cell-is-causing-gap-for-image-to-appear-in TableViewerColumn col = createTableViewerColumn(Thing.IdHeader, 250, 0); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Thing t = (Thing) element; return t.getField((int)col.getColumn().getData()); } }); TableViewerColumn col2 = createTableViewerColumn(Thing.ThumbHeader, 150, 1); col2.setLabelProvider(new ColumnLabelProvider() { @Override public Image getImage(Object element) { Thing t = (Thing) element; Image img = t.getThumbnail(); return img; } @Override public String getText(Object element) { return ""; } }); TableViewerColumn col3 = createTableViewerColumn(Thing.NameHeader, 400, 2); col3.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Thing t = (Thing) element; return t.getField((int)col3.getColumn().getData()); } }); } private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) { final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); final TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setAlignment(SWT.LEFT); column.setResizable(true); column.setMoveable(true); column.setData(colNumber); return viewerColumn; } /** * Passing the focus request to the viewer's control. */ public void setFocus() { viewer.getControl().setFocus(); } @Inject @Optional private void subscribeTopicResultChanged (@UIEventTopic(EventConstants.TOPIC_RESULT_CHANGED) String empty) { System.out.println("TOPIC_RESULT_CHANGED"); List things = thingProvider.getThings(); viewer.setInput(things); viewer.refresh(true); if(things != null) { statsLabel.setText(Integer.toString(things.size()) + " items"); statsLabel.redraw(); } } }