1 package org.simantics.district.selection.ui;
3 import java.util.Collection;
5 import org.eclipse.jface.resource.ImageDescriptor;
6 import org.eclipse.jface.resource.JFaceResources;
7 import org.eclipse.jface.resource.LocalResourceManager;
8 import org.eclipse.jface.resource.ResourceManager;
9 import org.eclipse.jface.viewers.CheckStateChangedEvent;
10 import org.eclipse.jface.viewers.CheckboxTableViewer;
11 import org.eclipse.jface.viewers.ColumnLabelProvider;
12 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
13 import org.eclipse.jface.viewers.DoubleClickEvent;
14 import org.eclipse.jface.viewers.ICheckStateListener;
15 import org.eclipse.jface.viewers.IDoubleClickListener;
16 import org.eclipse.jface.viewers.IStructuredContentProvider;
17 import org.eclipse.jface.viewers.IStructuredSelection;
18 import org.eclipse.jface.viewers.TableViewerColumn;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.graphics.Image;
21 import org.eclipse.swt.graphics.ImageData;
22 import org.eclipse.swt.graphics.PaletteData;
23 import org.eclipse.swt.graphics.RGB;
24 import org.eclipse.swt.layout.FillLayout;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Display;
27 import org.eclipse.swt.widgets.Table;
28 import org.simantics.Simantics;
29 import org.simantics.db.ReadGraph;
30 import org.simantics.db.common.procedure.adapter.SyncListenerAdapter;
31 import org.simantics.db.exception.DatabaseException;
32 import org.simantics.district.selection.ElementSelector;
33 import org.simantics.district.selection.ui.parts.ElementSelectionView;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
37 public class ElementSelectorTableUI extends Composite {
39 private static final Logger LOGGER = LoggerFactory.getLogger(ElementSelectorTableUI.class);
41 private CheckboxTableViewer viewer;
43 private ElementSelectionView view;
45 private ResourceManager resourceManager;
47 public ElementSelectorTableUI(Composite parent, int style, ElementSelectionView view) {
50 resourceManager = new LocalResourceManager(JFaceResources.getResources(), this);
54 parent.setLayout(new FillLayout());
55 // GridDataFactory.fillDefaults().grab(true, true).applyTo(this);
56 // GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this);
57 this.setLayout(new FillLayout());
59 viewer = createViewer();
60 addSelectionListener();
61 addCheckStateListener();
63 createSelectorListener(parent);
68 private void addCheckStateListener() {
69 viewer.addCheckStateListener(new ICheckStateListener() {
72 public void checkStateChanged(CheckStateChangedEvent event) {
73 boolean checked = event.getChecked();
75 view.performSelection(getDisplay(), (ElementSelector) event.getElement());
77 view.clearResultVisualisation((ElementSelector) event.getElement());
83 public Table getTable() {
84 return viewer.getTable();
87 public ElementSelector getSelectedItem() {
88 IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
89 return selection != null ? (ElementSelector) selection.getFirstElement() : null;
92 private CheckboxTableViewer createViewer() {
93 return CheckboxTableViewer.newCheckList(this, SWT.FULL_SELECTION | SWT.SINGLE);
96 private void configureTable() {
97 Table table = getTable();
98 table.setHeaderVisible(true);
99 table.setLinesVisible(true);
103 //createQueryActiveColumn();
106 private void enableToolTips() {
107 ColumnViewerToolTipSupport.enableFor(viewer);
110 private void setContentProvider() {
111 viewer.setContentProvider(new IStructuredContentProvider() {
113 public Object[] getElements(Object inputElement) {
114 if (inputElement == null || !(inputElement instanceof Collection))
115 return new Object[0];
117 return ((Collection<?>) inputElement).toArray();
122 private TableViewerColumn createNameColumn() {
123 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
124 column.getColumn().setText("Name");
125 column.getColumn().setWidth(200);
126 column.getColumn().setResizable(true);
127 column.setLabelProvider(new ColumnLabelProvider() {
129 public String getText(Object element) {
130 ElementSelector selector = (ElementSelector) element;
131 return " " + selector.getName();
135 public Image getImage(Object element) {
136 ElementSelector selector = (ElementSelector) element;
137 float[] color = selector.getColor();
141 RGB rgb = ElementSelectionTools.literalToColor(color).getRgb();
143 PaletteData paletteData = new PaletteData(new RGB[] { new RGB(255, 255, 255), rgb });
145 // Create image with a colored horizontal bar
146 // TODO: Indicate line width
147 Image image = resourceManager.createImage(ImageDescriptor.createFromImageDataProvider(zoom -> {
148 int height = 8 * zoom / 100;
149 int width = 40 * zoom / 100;
150 ImageData imageData = new ImageData(width, height, 1, paletteData);
151 for (int x = 0; x < width; x++) {
152 for (int y = 0; y < height; y++) {
153 imageData.setPixel(x, y, 1);
166 private TableViewerColumn createQueryColumn() {
167 TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
168 column.getColumn().setText("Query");
169 column.getColumn().setWidth(600);
170 column.getColumn().setResizable(true);
171 column.setLabelProvider(new ColumnLabelProvider() {
173 public String getText(Object element) {
174 ElementSelector selector = (ElementSelector) element;
175 return selector.getExpression();
181 private void createSelectorListener(Composite parent) {
182 Simantics.getSession().asyncRequest(new ElementSelectionTools.SelectionsRequest(),
183 new SyncListenerAdapter<Collection<ElementSelector>>() {
184 public void execute(ReadGraph graph, Collection<ElementSelector> result) {
185 parent.getDisplay().asyncExec(() -> {
186 viewer.setInput(result);
191 public void exception(ReadGraph graph, Throwable t) throws DatabaseException {
192 LOGGER.error("Error getting element selector list", t);
196 public boolean isDisposed() {
197 return ElementSelectorTableUI.this.isDisposed();
202 private void addSelectionListener() {
203 viewer.addDoubleClickListener(new DoubleClickListener());
206 private final class DoubleClickListener implements IDoubleClickListener {
208 public void doubleClick(DoubleClickEvent event) {
209 IStructuredSelection selection = (IStructuredSelection) event.getViewer().getSelection();
210 Display display = event.getViewer().getControl().getDisplay();
211 ElementSelector query = (ElementSelector) selection.getFirstElement();
213 view.performSelection(display, query);
215 viewer.setChecked(selection.getFirstElement(), true);
220 public void dispose() {