]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.interop/src/org/simantics/interop/test/GraphComparatorViewer.java
ComparisonViewer allows customizing comparator
[simantics/interop.git] / org.simantics.interop / src / org / simantics / interop / test / GraphComparatorViewer.java
index 73981180e901bba0291d2d6736ee298b93857cc7..5cbe6528cadbad754c848bf44ec53c89934cc303 100644 (file)
 package org.simantics.interop.test;\r
 \r
 import java.io.IOException;\r
+import java.util.ArrayList;\r
 import java.util.HashMap;\r
+import java.util.List;\r
 import java.util.Map;\r
 \r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.jface.action.IAction;\r
+import org.eclipse.jface.action.IMenuCreator;\r
+import org.eclipse.jface.action.IMenuListener;\r
+import org.eclipse.jface.action.IMenuManager;\r
+import org.eclipse.jface.action.MenuManager;\r
+import org.eclipse.jface.dialogs.Dialog;\r
+import org.eclipse.jface.dialogs.IDialogConstants;\r
+import org.eclipse.jface.dialogs.MessageDialog;\r
 import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.util.IPropertyChangeListener;\r
+import org.eclipse.jface.viewers.ILabelProvider;\r
+import org.eclipse.jface.viewers.IStructuredContentProvider;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.LabelProvider;\r
+import org.eclipse.jface.viewers.ListViewer;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.jface.window.IShellProvider;\r
 import org.eclipse.swt.SWT;\r
 import org.eclipse.swt.dnd.DND;\r
 import org.eclipse.swt.dnd.DropTarget;\r
@@ -23,14 +43,23 @@ import org.eclipse.swt.dnd.DropTargetAdapter;
 import org.eclipse.swt.dnd.DropTargetEvent;\r
 import org.eclipse.swt.dnd.TextTransfer;\r
 import org.eclipse.swt.dnd.Transfer;\r
+import org.eclipse.swt.events.HelpListener;\r
+import org.eclipse.swt.events.MenuDetectEvent;\r
+import org.eclipse.swt.events.MenuDetectListener;\r
 import org.eclipse.swt.events.SelectionAdapter;\r
 import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.layout.FillLayout;\r
 import org.eclipse.swt.layout.GridData;\r
 import org.eclipse.swt.layout.GridLayout;\r
 import org.eclipse.swt.widgets.Button;\r
 import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
 import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Group;\r
 import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.swt.widgets.Shell;\r
 import org.eclipse.swt.widgets.Text;\r
 import org.eclipse.ui.part.ViewPart;\r
 import org.simantics.db.ReadGraph;\r
@@ -54,9 +83,10 @@ import org.simantics.ui.dnd.ResourceTransferUtils;
 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
 import org.simantics.utils.datastructures.BijectionMap;\r
 import org.simantics.utils.datastructures.Pair;\r
+import org.simantics.utils.ui.ExceptionUtils;\r
 \r
 /**\r
- * Simple multi line text viewer for seeing differences in two subgraphs. \r
+ * Simple multiline text viewer for seeing differences in two subgraphs. \r
  * \r
  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
  *\r
@@ -73,6 +103,12 @@ public class GraphComparatorViewer extends ViewPart{
        private Text text1;\r
        private Text text2;\r
        \r
+       \r
+       private List<Resource> traversed = new ArrayList<Resource>();\r
+       private List<Resource> tested = new ArrayList<Resource>();\r
+       private List<Resource> strong = new ArrayList<Resource>();\r
+       private List<Resource> nonTraversed = new ArrayList<Resource>();\r
+       private List<Resource> nonTested = new ArrayList<Resource>();\r
 \r
        \r
        @Override\r
@@ -103,9 +139,37 @@ public class GraphComparatorViewer extends ViewPart{
                        }\r
                });\r
                \r
+               defaultConf();\r
+               \r
+               getViewSite().getActionBars().getToolBarManager().add(new Action("Config") {\r
+                       @Override\r
+                       public void run() {\r
+                               ConfigurationDialog dialog = new ConfigurationDialog(getSite().getShell());\r
+                               dialog.open();\r
+                       }\r
+               });\r
+               \r
        }\r
        \r
-       \r
+       private void defaultConf() {\r
+               traversed.clear();\r
+               tested.clear();\r
+               strong.clear();\r
+               nonTested.clear();\r
+               nonTraversed.clear();\r
+               try {\r
+               session.syncRequest(new ReadRequest() {\r
+                       @Override\r
+                       public void run(ReadGraph graph) throws DatabaseException {\r
+                               Layer0 l0 = Layer0.getInstance(graph);\r
+                               traversed.add(l0.ConsistsOf);\r
+                               tested.add(l0.IsWeaklyRelatedTo);\r
+                       }\r
+               });\r
+               } catch (Exception e) {\r
+                       ExceptionUtils.logAndShowError(e);\r
+               }\r
+       }\r
        \r
        private void compare() {\r
                text1.setText("");\r
@@ -125,11 +189,13 @@ public class GraphComparatorViewer extends ViewPart{
                        @Override\r
                        public void run(final ReadGraph graph) throws DatabaseException {\r
                                GraphComparator comparator = new GraphComparator(r1,r2);\r
-                               comparator.clearRels();\r
-                               Layer0 l0 = Layer0.getInstance(graph);\r
-                               comparator.addTraversed(l0.ConsistsOf);\r
-                               comparator.addTraversed(l0.HasNext);\r
-                               comparator.addTested(l0.IsWeaklyRelatedTo);\r
+                               \r
+                               comparator.addTested(tested);\r
+                               comparator.addTraversed(traversed);\r
+                               comparator.addNonTested(nonTested);\r
+                               comparator.addNonTraversed(nonTraversed);\r
+                               comparator.addStrong(strong);\r
+                               \r
                                comparator.test(graph);\r
                                BijectionMap<Statement, Statement> map = comparator.getComparableStatements();\r
                                Map<Statement, Integer> indices = new HashMap<Statement, Integer>();\r
@@ -325,7 +391,253 @@ public class GraphComparatorViewer extends ViewPart{
        \r
        \r
        \r
+       private class ConfigurationDialog extends Dialog {\r
+\r
+               protected ConfigurationDialog(Shell parentShell) {\r
+                       super(parentShell);\r
+               }\r
+               \r
+               @Override\r
+               protected void createButtonsForButtonBar(Composite parent) {\r
+                       createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,\r
+                                       true);\r
+               }\r
+               \r
+               @Override\r
+               protected Control createDialogArea(Composite parent) {\r
+                        Composite composite = (Composite) super.createDialogArea(parent);\r
+                        composite.setLayout(new FillLayout(SWT.VERTICAL));\r
+                        \r
+                        Group group = new Group(composite, SWT.NONE);\r
+                        group.setText("Traversed");\r
+                        group.setLayout(new FillLayout());\r
+                        ListViewer traversedViewer = new ListViewer(group);\r
+                        \r
+                        group = new Group(composite, SWT.NONE);\r
+                        group.setText("Tested");\r
+                        group.setLayout(new FillLayout());\r
+                        ListViewer testedViewer = new ListViewer(group);\r
+                        \r
+                        group = new Group(composite, SWT.NONE);\r
+                        group.setText("Strong");\r
+                        group.setLayout(new FillLayout());\r
+                        ListViewer strongViewer = new ListViewer(group);\r
+                        \r
+                        group = new Group(composite, SWT.NONE);\r
+                        group.setText("NonTraversed");\r
+                        group.setLayout(new FillLayout());\r
+                        ListViewer nonTraversedViewer = new ListViewer(group);\r
+                        \r
+                        group = new Group(composite, SWT.NONE);\r
+                        group.setText("NonTested");\r
+                        group.setLayout(new FillLayout());\r
+                        ListViewer nonTestedViewer = new ListViewer(group);\r
+                        \r
+                        traversedViewer.setContentProvider(new ResourceListContentProvider());\r
+                        traversedViewer.setLabelProvider(new ResourceLabelProvider());\r
+                        \r
+                        testedViewer.setContentProvider(new ResourceListContentProvider());\r
+                        testedViewer.setLabelProvider(new ResourceLabelProvider());\r
+                        \r
+                        strongViewer.setContentProvider(new ResourceListContentProvider());\r
+                        strongViewer.setLabelProvider(new ResourceLabelProvider());\r
+                        \r
+                        nonTraversedViewer.setContentProvider(new ResourceListContentProvider());\r
+                        nonTraversedViewer.setLabelProvider(new ResourceLabelProvider());\r
+                        \r
+                        nonTestedViewer.setContentProvider(new ResourceListContentProvider());\r
+                        nonTestedViewer.setLabelProvider(new ResourceLabelProvider());\r
+                        \r
+                        MenuManager strongManager = new MenuManager();\r
+                        strongManager.setRemoveAllWhenShown(true);\r
+                        strongManager.addMenuListener(new ListPopupListener(strongViewer));\r
+                        strongViewer.getControl().setMenu(strongManager.createContextMenu(strongViewer.getControl()));\r
+                        \r
+                        MenuManager nonTestedManager = new MenuManager();\r
+                        nonTestedManager.setRemoveAllWhenShown(true);\r
+                        nonTestedManager.addMenuListener(new ListPopupListener(nonTestedViewer));\r
+                        nonTestedViewer.getControl().setMenu(nonTestedManager.createContextMenu(nonTestedViewer.getControl()));\r
+                        \r
+                        MenuManager nonTraversedManager = new MenuManager();\r
+                        nonTraversedManager.setRemoveAllWhenShown(true);\r
+                        nonTraversedManager.addMenuListener(new ListPopupListener(nonTraversedViewer));\r
+                        nonTraversedViewer.getControl().setMenu(nonTraversedManager.createContextMenu(nonTraversedViewer.getControl()));\r
+                        \r
+                        MenuManager testedManager = new MenuManager();\r
+                        testedManager.setRemoveAllWhenShown(true);\r
+                        testedManager.addMenuListener(new ListPopupListener(testedViewer));\r
+                        testedViewer.getControl().setMenu(testedManager.createContextMenu(testedViewer.getControl()));\r
+                        \r
+                        MenuManager traversedManager = new MenuManager();\r
+                        traversedManager.setRemoveAllWhenShown(true);\r
+                        traversedManager.addMenuListener(new ListPopupListener(traversedViewer));\r
+                        traversedViewer.getControl().setMenu(traversedManager.createContextMenu(traversedViewer.getControl()));\r
+                        \r
+                        traversedViewer.setInput(traversed);\r
+                        testedViewer.setInput(tested);\r
+                        strongViewer.setInput(strong);\r
+                        nonTestedViewer.setInput(nonTested);\r
+                        nonTraversedViewer.setInput(nonTraversed);\r
+                        \r
+                        return composite;\r
+               }\r
+               \r
+       }\r
+       \r
+       private class ListPopupListener implements IMenuListener {\r
+               private ListViewer viewer;\r
+               \r
+               public ListPopupListener(ListViewer viewer) {\r
+                       this.viewer = viewer;\r
+               }\r
+               \r
+               @Override\r
+               public void menuAboutToShow(IMenuManager manager) {\r
+                       IStructuredSelection s = (IStructuredSelection)viewer.getSelection();\r
+                       List<Object> list = (List<Object>)viewer.getInput();\r
+                       manager.add(new AddAction(viewer, list));\r
+                       if (!s.isEmpty()) {\r
+                               Object element = s.getFirstElement();\r
+                               manager.add(new DeleteAction(viewer, list, element));\r
+                       }\r
+                       \r
+               }\r
+       }\r
+       \r
+       private class DeleteAction extends Action {\r
+               private Viewer viewer;\r
+               private List<?> list;\r
+               private Object obj;\r
+               public DeleteAction(Viewer viewer, List<?> list, Object obj) {\r
+                       super("Delete");\r
+                       this.list = list;\r
+                       this.obj = obj;\r
+                       this.viewer = viewer;\r
+               }\r
+               \r
+               @Override\r
+               public void run() {\r
+                       list.remove(obj);\r
+                       viewer.refresh();\r
+               }\r
+       }\r
+       \r
+       private class AddAction extends Action {\r
+               private Viewer viewer;\r
+               private List<Object> list;\r
+               public AddAction(Viewer viewer, List<Object> list) {\r
+                       super("Add");\r
+                       this.list = list;\r
+                       this.viewer = viewer;\r
+               }\r
+               \r
+               @Override\r
+               public void run() {\r
+                       RelationChooseDialog dialog = new RelationChooseDialog(getSite().getShell());\r
+                       if (dialog.open() == RelationChooseDialog.OK) {\r
+                               final String uri = dialog.getUri();\r
+                               try {\r
+                                       Resource res = session.syncRequest(new Read<Resource>() {\r
+                                               @Override\r
+                                               public Resource perform(ReadGraph graph)\r
+                                                               throws DatabaseException {\r
+                                                       try {\r
+                                                               return graph.getResource(uri);\r
+                                                       } catch (Exception e) {\r
+                                                               return null;\r
+                                                       }\r
+                                               }\r
+                                       });\r
+                                       if (res != null) {\r
+                                               list.add(res);\r
+                                               viewer.refresh();\r
+                                       } else {\r
+                                               MessageDialog.openError(getSite().getShell(), "Error", "Relation '" + uri + "' not found.");\r
+                                       }\r
+                               } catch (Exception e) {\r
+                                       \r
+                               }\r
+                               \r
+                               \r
+                       }\r
+                       \r
+               }\r
+       }\r
+       \r
+       private class RelationChooseDialog extends Dialog {\r
+\r
+               private String uri = null;\r
+               private Text text;\r
+               public RelationChooseDialog(IShellProvider parentShell) {\r
+                       super(parentShell);\r
+               }\r
+\r
+               public RelationChooseDialog(Shell parentShell) {\r
+                       super(parentShell);\r
+               }\r
+               \r
+               @Override\r
+               protected Control createDialogArea(Composite parent) {\r
+                       Composite composite = (Composite) super.createDialogArea(parent);\r
+                       composite.setLayout(new GridLayout(2, false));\r
+                       Label label = new Label(composite, SWT.NONE);\r
+                       label.setText("URI:");\r
+                       \r
+                       text = new Text(composite, SWT.SINGLE | SWT.BORDER);\r
+                       text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));\r
+                       \r
+                       return composite;\r
+               }\r
+               \r
+               @Override\r
+               protected void okPressed() {\r
+                       uri = text.getText();\r
+                       super.okPressed();\r
+               }\r
+               \r
+               public String getUri() {\r
+                       return uri;\r
+               }\r
+               \r
+       }\r
        \r
+       private class ResourceListContentProvider implements IStructuredContentProvider {\r
+               \r
+               @SuppressWarnings("unchecked")\r
+               @Override\r
+               public Object[] getElements(Object inputElement) {\r
+                       List<Resource> list = (List<Resource>)inputElement;\r
+                       return list.toArray();\r
+               }\r
+               \r
+               @Override\r
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+                       \r
+               }\r
+               \r
+               @Override\r
+               public void dispose() {\r
+                       \r
+               }\r
+       }\r
        \r
+       private class ResourceLabelProvider extends LabelProvider {\r
+               \r
+               @Override\r
+               public String getText(Object element) {\r
+                       final Resource res = (Resource) element; \r
+                       try {\r
+                               return session.syncRequest(new Read<String>() {\r
+                                       @Override\r
+                                       public String perform(ReadGraph graph) throws DatabaseException {\r
+                                               return NameUtils.getSafeName(graph, res);\r
+                                       }\r
+                               });\r
+                       } catch (DatabaseException e) {\r
+                               return "Error: " + e.getMessage();\r
+                       }\r
+               }\r
+               \r
+       }\r
        \r
 }\r