An Eclipse RCP reimplementation of bgg1tool by Nand. See http://www.nand.it/nandeck/ for the original tool.

183 lines
6.1KB

  1. package xyz.veronie.bgg.ui.parts;
  2. import java.util.List;
  3. import javax.annotation.PostConstruct;
  4. import javax.inject.Inject;
  5. import org.eclipse.e4.core.di.annotations.Optional;
  6. import org.eclipse.e4.core.services.events.IEventBroker;
  7. import org.eclipse.e4.ui.di.UIEventTopic;
  8. import org.eclipse.jface.viewers.ArrayContentProvider;
  9. import org.eclipse.jface.viewers.ColumnLabelProvider;
  10. import org.eclipse.jface.viewers.ISelectionChangedListener;
  11. import org.eclipse.jface.viewers.IStructuredSelection;
  12. import org.eclipse.jface.viewers.OwnerDrawLabelProvider;
  13. import org.eclipse.jface.viewers.SelectionChangedEvent;
  14. import org.eclipse.jface.viewers.TableViewer;
  15. import org.eclipse.jface.viewers.TableViewerColumn;
  16. import org.eclipse.swt.SWT;
  17. import org.eclipse.swt.graphics.Image;
  18. import org.eclipse.swt.graphics.Rectangle;
  19. import org.eclipse.swt.layout.GridData;
  20. import org.eclipse.swt.layout.GridLayout;
  21. import org.eclipse.swt.widgets.Composite;
  22. import org.eclipse.swt.widgets.Event;
  23. import org.eclipse.swt.widgets.Label;
  24. import org.eclipse.swt.widgets.Table;
  25. import org.eclipse.swt.widgets.TableColumn;
  26. import org.eclipse.swt.widgets.TableItem;
  27. import xyz.veronie.bgg.result.Thing;
  28. import xyz.veronie.bgg.result.ThingProvider;
  29. import xyz.veronie.bgg.types.EventConstants;
  30. public class BggResultPart {
  31. private TableViewer viewer;
  32. private Label statsLabel;
  33. @Inject
  34. private ThingProvider thingProvider;
  35. @Inject
  36. private IEventBroker eventBroker;
  37. @PostConstruct
  38. public void createContents(Composite parent) {
  39. Composite main = new Composite(parent, SWT.FILL);
  40. main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
  41. GridLayout layout = new GridLayout(2, false);
  42. main.setLayout(layout);
  43. createViewer(main);
  44. statsLabel = new Label(main, SWT.FILL);
  45. statsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
  46. statsLabel.setText("0 items");
  47. }
  48. private void createViewer(Composite parent) {
  49. viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
  50. | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER );
  51. createColumns(parent, viewer);
  52. final Table table = viewer.getTable();
  53. table.setHeaderVisible(true);
  54. table.setLinesVisible(true);
  55. viewer.setContentProvider(new ArrayContentProvider());
  56. // Get the content for the viewer, setInput will call getElements in the
  57. // contentProvider
  58. viewer.setInput(thingProvider.getThings());
  59. // make the selection available to other views
  60. // TODO: getSite().setSelectionProvider(viewer);
  61. // Set the sorter for the table
  62. // Layout the viewer
  63. GridData gridData = new GridData();
  64. gridData.verticalAlignment = GridData.FILL;
  65. gridData.grabExcessHorizontalSpace = true;
  66. gridData.grabExcessVerticalSpace = true;
  67. gridData.horizontalAlignment = GridData.FILL;
  68. gridData.horizontalSpan = 2;
  69. viewer.getControl().setLayoutData(gridData);
  70. viewer.addSelectionChangedListener(new ISelectionChangedListener() {
  71. @Override
  72. public void selectionChanged(SelectionChangedEvent event) {
  73. IStructuredSelection selection = viewer.getStructuredSelection();
  74. Thing thing = (Thing)selection.getFirstElement();
  75. eventBroker.send(EventConstants.TOPIC_THING_SELECTION, thing);
  76. }
  77. });
  78. }
  79. public TableViewer getViewer() {
  80. return viewer;
  81. }
  82. // This will create the columns for the table
  83. private void createColumns(final Composite parent, final TableViewer viewer) {
  84. // https://stackoverflow.com/questions/12641354/putting-an-image-in-to-a-jface-table-cell-is-causing-gap-for-image-to-appear-in
  85. TableViewerColumn col = createTableViewerColumn(Thing.IdHeader, 250, 0);
  86. col.setLabelProvider(new ColumnLabelProvider() {
  87. @Override
  88. public String getText(Object element) {
  89. Thing t = (Thing) element;
  90. return t.getField((int)col.getColumn().getData());
  91. }
  92. });
  93. TableViewerColumn col2 = createTableViewerColumn(Thing.ThumbHeader, 150, 1);
  94. col2.setLabelProvider(new ColumnLabelProvider() {
  95. @Override
  96. public Image getImage(Object element) {
  97. Thing t = (Thing) element;
  98. Image img = t.getThumbnail();
  99. return img;
  100. }
  101. @Override
  102. public String getText(Object element) {
  103. return "";
  104. }
  105. });
  106. TableViewerColumn col3 = createTableViewerColumn(Thing.NameHeader, 400, 2);
  107. col3.setLabelProvider(new ColumnLabelProvider() {
  108. @Override
  109. public String getText(Object element) {
  110. Thing t = (Thing) element;
  111. return t.getField((int)col3.getColumn().getData());
  112. }
  113. });
  114. }
  115. private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) {
  116. final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
  117. SWT.NONE);
  118. final TableColumn column = viewerColumn.getColumn();
  119. column.setText(title);
  120. column.setWidth(bound);
  121. column.setAlignment(SWT.LEFT);
  122. column.setResizable(true);
  123. column.setMoveable(true);
  124. column.setData(colNumber);
  125. return viewerColumn;
  126. }
  127. /**
  128. * Passing the focus request to the viewer's control.
  129. */
  130. public void setFocus() {
  131. viewer.getControl().setFocus();
  132. }
  133. @Inject
  134. @Optional
  135. private void subscribeTopicResultChanged
  136. (@UIEventTopic(EventConstants.TOPIC_RESULT_CHANGED)
  137. String empty) {
  138. System.out.println("TOPIC_RESULT_CHANGED");
  139. List<Thing> things = thingProvider.getThings();
  140. viewer.setInput(things);
  141. viewer.refresh(true);
  142. if(things != null) {
  143. statsLabel.setText(Integer.toString(things.size()) + " items");
  144. statsLabel.redraw();
  145. }
  146. }
  147. }