package org.simantics.district.region.ui; import java.awt.geom.Rectangle2D; import java.text.DecimalFormat; import java.util.Collection; import java.util.Set; import org.eclipse.e4.ui.workbench.modeling.ESelectionService; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; 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.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.common.procedure.adapter.SyncListenerAdapter; import org.simantics.db.exception.DatabaseException; import org.simantics.district.region.DiagramRegions; import org.simantics.district.region.DiagramRegions.DiagramRegion; import org.simantics.district.region.ui.handlers.ZoomToRegionHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DiagramRegionsTableUI extends Composite { private static final Logger LOGGER = LoggerFactory.getLogger(DiagramRegionsTableUI.class); private TreeViewer viewer; private TreeViewerColumn column1; private TreeViewerColumn column2; private ESelectionService selectionService; public DiagramRegionsTableUI(ESelectionService selectionService, Composite parent, int style) { super(parent, style); this.selectionService = selectionService; parent.setLayout(new FillLayout()); // GridDataFactory.fillDefaults().grab(true, true).applyTo(this); // GridLayoutFactory.fillDefaults().numColumns(1).applyTo(this); this.setLayout(new FillLayout()); Simantics.getSession().asyncRequest(new DiagramRegions.DiagramRegionsRequest(), new SyncListenerAdapter>() { public void execute(ReadGraph graph, Collection result) { parent.getDisplay().asyncExec(() -> { viewer.setInput(result); }); } @Override public void exception(ReadGraph graph, Throwable t) throws DatabaseException { LOGGER.error("Could not listen", t); } @Override public boolean isDisposed() { return DiagramRegionsTableUI.this.isDisposed(); } }); viewer = new TreeViewer(this, SWT.FULL_SELECTION); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { DiagramRegionsTableUI.this.selectionService.setSelection(event.getSelection()); } }); viewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { LOGGER.info("event " + event); TreeSelection selection = (TreeSelection) viewer.getSelection(); DiagramRegion region = (DiagramRegion) selection.getFirstElement(); ZoomToRegionHandler.zoomTo(viewer.getControl(), getDisplay(), region.getResource()); } }); viewer.setContentProvider(new ITreeContentProvider() { @Override public boolean hasChildren(Object element) { return false; } @Override public Object getParent(Object element) { return null; } @Override public Object[] getElements(Object inputElement) { if (inputElement == null && (!(inputElement instanceof Collection))) return new Object[0]; Set set = (Set) inputElement; return set.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); } }); ColumnViewerToolTipSupport.enableFor(viewer); Tree table = viewer.getTree(); table.setHeaderVisible(true); table.setLinesVisible(true); column1 = new TreeViewerColumn(viewer, SWT.NONE); column1.getColumn().setText("Region"); column1.getColumn().setWidth(200); column1.getColumn().setResizable(true); column1.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { DiagramRegion region = (DiagramRegion) element; return region.getLabel(); } @Override public Image getImage(Object element) { return null; } }); column2 = new TreeViewerColumn(viewer, SWT.NONE); column2.getColumn().setText("Coordinates"); column2.getColumn().setWidth(200); column2.getColumn().setResizable(true); column2.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { DiagramRegion region = (DiagramRegion) element; Rectangle2D rect = region.getShape().getBounds2D(); DecimalFormat df = new DecimalFormat("0.00"); String x = df.format(rect.getX()); String y = df.format(rect.getY()); String width = df.format(rect.getWidth()); String height = df.format(rect.getHeight()); return "[x=" + x + ", y=" + y + ", width=" + width + ", height=" + height + "]"; } @Override public Image getImage(Object element) { return null; } }); } public Tree getTree() { return viewer.getTree(); } }