X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.selection.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fselection%2Fui%2FElementSelectorTableUI.java;h=79602077b0bf96698a413f4a2d64091991e36f79;hb=5618901b005fe275d5218e6c5e8243941f9a1e2f;hp=09f34609497f5e0b792597932848edf541355e5c;hpb=2801a636fc48e9636283a85276130594c27979a7;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java b/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java index 09f34609..79602077 100644 --- a/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java +++ b/org.simantics.district.selection.ui/src/org/simantics/district/selection/ui/ElementSelectorTableUI.java @@ -1,50 +1,36 @@ package org.simantics.district.selection.ui; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.List; -import org.eclipse.e4.ui.workbench.modeling.ESelectionService; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.resource.LocalResourceManager; +import org.eclipse.jface.resource.ResourceManager; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.DoubleClickEvent; +import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IDoubleClickListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.TreeViewerColumn; -import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.PaletteData; +import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Table; import org.simantics.Simantics; -import org.simantics.browsing.ui.common.AdaptableHintContext; import org.simantics.db.ReadGraph; -import org.simantics.db.Resource; import org.simantics.db.common.procedure.adapter.SyncListenerAdapter; -import org.simantics.db.common.request.ResourceRead; import org.simantics.db.exception.DatabaseException; -import org.simantics.db.layer0.QueryIndexUtils; -import org.simantics.db.layer0.SelectionHints; -import org.simantics.db.layer0.request.ActiveModels; -import org.simantics.db.layer0.variable.Variable; -import org.simantics.db.request.Read; -import org.simantics.district.network.ui.DistrictNetworkUIUtil; -import org.simantics.district.selection.ElementSelectionResource; import org.simantics.district.selection.ElementSelector; -import org.simantics.district.selection.ElementSelector.DiagramGenerator; -import org.simantics.district.selection.ElementSelector.ExplicitGenerator; -import org.simantics.layer0.Layer0; -import org.simantics.scl.runtime.Lists; -import org.simantics.scl.runtime.function.FunctionImpl1; -import org.simantics.ui.selection.AnyResource; -import org.simantics.ui.selection.AnyVariable; -import org.simantics.ui.selection.WorkbenchSelectionContentType; +import org.simantics.district.selection.ui.parts.ElementSelectionView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,216 +38,187 @@ public class ElementSelectorTableUI extends Composite { private static final Logger LOGGER = LoggerFactory.getLogger(ElementSelectorTableUI.class); - private TreeViewer viewer; - private TreeViewerColumn column1; - private TreeViewerColumn column2; + private CheckboxTableViewer viewer; - public ElementSelectorTableUI(ESelectionService selectionService, Composite parent, int style) { + private ElementSelectionView view; + + private ResourceManager resourceManager; + + public ElementSelectorTableUI(Composite parent, int style, ElementSelectionView view) { super(parent, style); + + resourceManager = new LocalResourceManager(JFaceResources.getResources(), this); + + this.view = view; + parent.setLayout(new FillLayout()); - // GridDataFactory.fillDefaults().grab(true, true).applyTo(this); - // GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this); + // GridDataFactory.fillDefaults().grab(true, true).applyTo(this); + // GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this); this.setLayout(new FillLayout()); - viewer = new TreeViewer(this, SWT.FULL_SELECTION); - viewer.addDoubleClickListener(new DoubleClickListener(selectionService)); - - viewer.setContentProvider(new ITreeContentProvider() { - @Override - public boolean hasChildren(Object element) { - return false; - } + viewer = createViewer(); + addSelectionListener(); + addCheckStateListener(); + setContentProvider(); + createSelectorListener(parent); + enableToolTips(); + configureTable(); + } + private void addCheckStateListener() { + viewer.addCheckStateListener(new ICheckStateListener() { + @Override - public Object getParent(Object element) { - return null; + public void checkStateChanged(CheckStateChangedEvent event) { + boolean checked = event.getChecked(); + if (checked) { + view.performSelection(getDisplay(), (ElementSelector) event.getElement()); + } else { + view.clearResultVisualisation((ElementSelector) event.getElement()); + } } + }); + } + + public Table getTable() { + return viewer.getTable(); + } + + public ElementSelector getSelectedItem() { + IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); + return selection != null ? (ElementSelector) selection.getFirstElement() : null; + } + + private CheckboxTableViewer createViewer() { + return CheckboxTableViewer.newCheckList(this, SWT.FULL_SELECTION | SWT.SINGLE); + } + + private void configureTable() { + Table table = getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + createNameColumn(); + createQueryColumn(); + //createQueryActiveColumn(); + } + + private void enableToolTips() { + ColumnViewerToolTipSupport.enableFor(viewer); + } + private void setContentProvider() { + viewer.setContentProvider(new IStructuredContentProvider() { @Override public Object[] getElements(Object inputElement) { if (inputElement == null || !(inputElement instanceof Collection)) return new Object[0]; - - return ((Collection)inputElement).toArray(); - } - @Override - public Object[] getChildren(Object parentElement) { - return null; - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - ITreeContentProvider.super.inputChanged(viewer, oldInput, newInput); + return ((Collection) inputElement).toArray(); } }); - - Simantics.getSession().asyncRequest(new SelectionsRequest(), new SyncListenerAdapter>() { - public void execute(ReadGraph graph, Collection result) { - parent.getDisplay().asyncExec(() -> { - viewer.setInput(result); - }); - } + } + private TableViewerColumn createNameColumn() { + TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setText("Name"); + column.getColumn().setWidth(200); + column.getColumn().setResizable(true); + column.setLabelProvider(new ColumnLabelProvider() { @Override - public void exception(ReadGraph graph, Throwable t) throws DatabaseException { - LOGGER.error("Error getting element selector list", t); + public String getText(Object element) { + ElementSelector selector = (ElementSelector) element; + return " " + selector.getName(); } @Override - public boolean isDisposed() { - return ElementSelectorTableUI.this.isDisposed(); - } - }); + public Image getImage(Object element) { + ElementSelector selector = (ElementSelector) element; + float[] color = selector.getColor(); + if (color == null) + return null; - ColumnViewerToolTipSupport.enableFor(viewer); + RGB rgb = ElementSelectionTools.literalToColor(color).getRgb(); - Tree table = viewer.getTree(); - table.setHeaderVisible(true); - table.setLinesVisible(true); + PaletteData paletteData = new PaletteData(new RGB[] { new RGB(255, 255, 255), rgb }); - column1 = new TreeViewerColumn(viewer, SWT.NONE); - column1.getColumn().setText("Name"); - column1.getColumn().setWidth(200); - column1.getColumn().setResizable(true); - column1.setLabelProvider(new ColumnLabelProvider() { - @Override - public String getText(Object element) { - ElementSelector selector = (ElementSelector) element; - return selector.getName(); - } - - @Override - public Image getImage(Object element) { - return null; + // Create image with a colored horizontal bar + // TODO: Indicate line width + Image image = resourceManager.createImage(ImageDescriptor.createFromImageDataProvider(zoom -> { + int height = 8 * zoom / 100; + int width = 40 * zoom / 100; + ImageData imageData = new ImageData(width, height, 1, paletteData); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + imageData.setPixel(x, y, 1); + } + } + + return imageData; + })); + + return image; } }); + return column; + } - column2 = new TreeViewerColumn(viewer, SWT.NONE); - column2.getColumn().setText("Query"); - column2.getColumn().setWidth(600); - column2.getColumn().setResizable(true); - column2.setLabelProvider(new ColumnLabelProvider() { + private TableViewerColumn createQueryColumn() { + TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); + column.getColumn().setText("Query"); + column.getColumn().setWidth(600); + column.getColumn().setResizable(true); + column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { ElementSelector selector = (ElementSelector) element; return selector.getExpression(); } - - @Override - public Image getImage(Object element) { - return null; - } }); + return column; } - public Tree getTree() { - return viewer.getTree(); - } - - public ElementSelector getSelectedItem() { - IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); - return selection != null ? (ElementSelector) selection.getFirstElement() : null; - } + private void createSelectorListener(Composite parent) { + Simantics.getSession().asyncRequest(new ElementSelectionTools.SelectionsRequest(), + new SyncListenerAdapter>() { + public void execute(ReadGraph graph, Collection result) { + parent.getDisplay().asyncExec(() -> { + viewer.setInput(result); + }); + } - private static final class SelectionElement extends AdaptableHintContext { - private SelectionElement(Key[] keys) { - super(keys); - } + @Override + public void exception(ReadGraph graph, Throwable t) throws DatabaseException { + LOGGER.error("Error getting element selector list", t); + } - @SuppressWarnings("unchecked") - public T getContent(WorkbenchSelectionContentType contentType) { - Resource element = getHint(SelectionHints.KEY_MAIN); - if (contentType instanceof AnyResource) { - return (T)element; - } - else if (contentType instanceof AnyVariable) { - try { - return (T) Simantics.getSession().syncRequest(new ResourceRead(element) { - public Variable perform(ReadGraph graph) throws DatabaseException { - return ElementSelector.getVariableForElement(graph, resource); - } - }); - } catch (DatabaseException e) { - return null; - } - } - - return null; - } + @Override + public boolean isDisposed() { + return ElementSelectorTableUI.this.isDisposed(); + } + }); } - public static final class SelectionsRequest implements Read> { - @Override - public Collection perform(ReadGraph graph) throws DatabaseException { - Layer0 L0 = Layer0.getInstance(graph); - ElementSelectionResource ES = ElementSelectionResource.getInstance(graph); - - Resource model = ActiveModels.getPossibleActiveModel(graph, Simantics.getProjectResource()); - if (model == null) { - return Collections.emptyList(); - } - - List libs = QueryIndexUtils.searchByType(graph, model, ES.SelectionLibrary); - if (libs.isEmpty()) - return Collections.emptyList(); - - Resource lib = libs.get(0); - - List result = new ArrayList<>(); - for (Resource selection : graph.getObjects(lib, L0.ConsistsOf)) { - if (!graph.isInstanceOf(selection, ES.Selection)) - continue; - - result.add(ElementSelector.getSelector(graph, selection)); - } - - return result; - } + private void addSelectionListener() { + viewer.addDoubleClickListener(new DoubleClickListener()); } - private static final class DoubleClickListener implements IDoubleClickListener { - private final ESelectionService selectionService; - private Resource model; - - private DoubleClickListener(ESelectionService selectionService) { - this.selectionService = selectionService; - } - + private final class DoubleClickListener implements IDoubleClickListener { @Override public void doubleClick(DoubleClickEvent event) { - TreeSelection selection = (TreeSelection) event.getViewer().getSelection(); + IStructuredSelection selection = (IStructuredSelection) event.getViewer().getSelection(); + Display display = event.getViewer().getControl().getDisplay(); ElementSelector query = (ElementSelector) selection.getFirstElement(); - try { - List result = Simantics.getSession().syncRequest(new Read>() { - @Override - public List perform(ReadGraph graph) throws DatabaseException { - model = ActiveModels.getPossibleActiveModel(graph, Simantics.getProjectResource()); - if (model == null) { - LOGGER.warn("No active model"); - return Collections.emptyList(); - } - - return query.selectElementsFrom(graph, model); - } - }); - - if (query.getGenerator() instanceof DiagramGenerator || query.getGenerator() instanceof ExplicitGenerator) { - DistrictNetworkUIUtil.openDNDiagramWithSelection(event.getViewer().getControl().getDisplay(), result); - } - else { - selectionService.setPostSelection(new StructuredSelection(Lists.map(new FunctionImpl1() { - public AdaptableHintContext apply(Resource p0) { - AdaptableHintContext selectionElement = new SelectionElement(SelectionHints.STD_KEYS); - selectionElement.setHint(SelectionHints.KEY_MAIN, p0); - selectionElement.setHint(SelectionHints.KEY_MODEL, model); - return selectionElement; - } - }, result))); - } - } catch (DatabaseException e) { - LOGGER.error("Element selection query failed", e); - } + + view.performSelection(display, query); + + viewer.setChecked(selection.getFirstElement(), true); } } + + @Override + public void dispose() { + view.dispose(); + super.dispose(); + } }