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