]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java
79602077b0bf96698a413f4a2d64091991e36f79
[simantics/district.git] / org.simantics.district.selection.ui / src / org / simantics / district / selection / ui / ElementSelectorTableUI.java
1 package org.simantics.district.selection.ui;
2
3 import java.util.Collection;
4
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;
36
37 public class ElementSelectorTableUI extends Composite {
38
39         private static final Logger LOGGER = LoggerFactory.getLogger(ElementSelectorTableUI.class);
40
41         private CheckboxTableViewer viewer;
42
43         private ElementSelectionView view;
44
45         private ResourceManager resourceManager;
46
47         public ElementSelectorTableUI(Composite parent, int style, ElementSelectionView view) {
48                 super(parent, style);
49
50                 resourceManager = new LocalResourceManager(JFaceResources.getResources(), this);
51
52                 this.view = view;
53
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());
58
59                 viewer = createViewer();
60                 addSelectionListener();
61                 addCheckStateListener();
62                 setContentProvider();
63                 createSelectorListener(parent);
64                 enableToolTips();
65                 configureTable();
66         }
67
68         private void addCheckStateListener() {
69                 viewer.addCheckStateListener(new ICheckStateListener() {
70                         
71                         @Override
72                         public void checkStateChanged(CheckStateChangedEvent event) {
73                                 boolean checked = event.getChecked();
74                                 if (checked) {
75                                         view.performSelection(getDisplay(), (ElementSelector) event.getElement());
76                                 } else {
77                                         view.clearResultVisualisation((ElementSelector) event.getElement());
78                                 }
79                         }
80                 });
81         }
82
83         public Table getTable() {
84                 return viewer.getTable();
85         }
86
87         public ElementSelector getSelectedItem() {
88                 IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
89                 return selection != null ? (ElementSelector) selection.getFirstElement() : null;
90         }
91
92         private CheckboxTableViewer createViewer() {
93                 return CheckboxTableViewer.newCheckList(this, SWT.FULL_SELECTION | SWT.SINGLE);
94         }
95
96         private void configureTable() {
97                 Table table = getTable();
98                 table.setHeaderVisible(true);
99                 table.setLinesVisible(true);
100
101                 createNameColumn();
102                 createQueryColumn();
103                 //createQueryActiveColumn();
104         }
105
106         private void enableToolTips() {
107                 ColumnViewerToolTipSupport.enableFor(viewer);
108         }
109
110         private void setContentProvider() {
111                 viewer.setContentProvider(new IStructuredContentProvider() {
112                         @Override
113                         public Object[] getElements(Object inputElement) {
114                                 if (inputElement == null || !(inputElement instanceof Collection))
115                                         return new Object[0];
116
117                                 return ((Collection<?>) inputElement).toArray();
118                         }
119                 });
120         }
121
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() {
128                         @Override
129                         public String getText(Object element) {
130                                 ElementSelector selector = (ElementSelector) element;
131                                 return " " + selector.getName();
132                         }
133
134                         @Override
135                         public Image getImage(Object element) {
136                                 ElementSelector selector = (ElementSelector) element;
137                                 float[] color = selector.getColor();
138                                 if (color == null)
139                                         return null;
140
141                                 RGB rgb = ElementSelectionTools.literalToColor(color).getRgb();
142
143                                 PaletteData paletteData = new PaletteData(new RGB[] { new RGB(255, 255, 255), rgb });
144
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);
154                                                 }
155                                         }
156
157                                         return imageData;
158                                 }));
159
160                                 return image;
161                         }
162                 });
163                 return column;
164         }
165
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() {
172                         @Override
173                         public String getText(Object element) {
174                                 ElementSelector selector = (ElementSelector) element;
175                                 return selector.getExpression();
176                         }
177                 });
178                 return column;
179         }
180
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);
187                                                 });
188                                         }
189
190                                         @Override
191                                         public void exception(ReadGraph graph, Throwable t) throws DatabaseException {
192                                                 LOGGER.error("Error getting element selector list", t);
193                                         }
194
195                                         @Override
196                                         public boolean isDisposed() {
197                                                 return ElementSelectorTableUI.this.isDisposed();
198                                         }
199                                 });
200         }
201
202         private void addSelectionListener() {
203                 viewer.addDoubleClickListener(new DoubleClickListener());
204         }
205
206         private final class DoubleClickListener implements IDoubleClickListener {
207                 @Override
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();
212
213                         view.performSelection(display, query);
214                         
215                         viewer.setChecked(selection.getFirstElement(), true);
216                 }
217         }
218         
219         @Override
220         public void dispose() {
221                 view.dispose();
222                 super.dispose();
223         }
224 }