]> gerrit.simantics Code Review - simantics/interop.git/blobdiff - org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java
UpdateList object for property changes
[simantics/interop.git] / org.simantics.interop.update / src / org / simantics / interop / update / editor / ModelUpdateEditor.java
index a3b60332ce9e1552bbe68f9e14bdb182f65a86d1..18dad814361946b46442952f8172a93e79d88152 100644 (file)
@@ -40,29 +40,25 @@ import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
 import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
+import org.simantics.db.Session;
 import org.simantics.db.Statement;
 import org.simantics.db.WriteGraph;
 import org.simantics.db.common.request.WriteRequest;
 import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.exception.DoesNotContainValueException;
-import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;
-import org.simantics.db.exception.NoSingleResultException;
-import org.simantics.db.exception.ServiceException;
+import org.simantics.db.layer0.util.Layer0Utils;
 import org.simantics.db.request.Read;
 import org.simantics.interop.test.GraphChanges;
 import org.simantics.interop.test.GraphComparator;
-import org.simantics.interop.test.NameComparator;
 import org.simantics.interop.update.Activator;
+import org.simantics.interop.update.model.UpdateList;
 import org.simantics.interop.update.model.UpdateNode;
 import org.simantics.interop.update.model.UpdateNode.Status;
+import org.simantics.interop.update.model.UpdateOp;
 import org.simantics.interop.update.model.UpdateTree;
 import org.simantics.interop.utils.TableUtils;
-import org.simantics.layer0.Layer0;
-import org.simantics.ui.workbench.ResourceEditorPart2;
-import org.simantics.utils.datastructures.BijectionMap;
+import org.simantics.ui.SimanticsUI;
 import org.simantics.utils.datastructures.Callback;
 import org.simantics.utils.datastructures.Pair;
 import org.simantics.utils.ui.ExceptionUtils;
@@ -74,10 +70,8 @@ import org.simantics.utils.ui.ExceptionUtils;
  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
  *
  */
-public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
+public abstract class ModelUpdateEditor extends Composite{
 
-       
-       private Composite composite;
        private Composite errorComposite;
        
        private CheckboxTreeViewer changeBrowser;
@@ -85,6 +79,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
        
        private GraphChanges changes;
        private UpdateTree updateTree;
+       private UpdateList updateList;
        
        private Button updateAllButton;
        private Button updateSelectedButton;
@@ -105,23 +100,20 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
        
        private List<ChangeFilter> filters = new ArrayList<ChangeFilter>();
        
-       public ModelUpdateEditor() {
+       public ModelUpdateEditor(Composite parent) {
+               super(parent,SWT.NONE);
                checked = manager.createImage(Activator.imageDescriptorFromPlugin("com.famfamfam.silk", "icons/tick.png"));
                unchecked = manager.createImage(Activator.imageDescriptorFromPlugin("com.famfamfam.silk", "icons/cross.png"));
                warning = manager.createImage(Activator.imageDescriptorFromPlugin("com.famfamfam.silk", "icons/error.png"));
-       }
-       
-       @Override
-       public void createPartControl(Composite parent) {
+
                
                containsColor = new Color(parent.getDisplay(), new RGB(255,255,220));
                deletedColor = new Color(parent.getDisplay(), new RGB(255,220,220));
                addedColor = new Color(parent.getDisplay(), new RGB(220,255,220));
                
-               composite = new Composite(parent, SWT.NONE);
-               composite.setLayout(new GridLayout(1,false));
+               this.setLayout(new GridLayout(1,false));
                
-               errorComposite = new Composite(composite, SWT.BORDER);
+               errorComposite = new Composite(this, SWT.BORDER);
                GridData data = new GridData();
                data.grabExcessHorizontalSpace = true;
                data.grabExcessVerticalSpace = false;
@@ -132,14 +124,14 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                
                errorComposite.setVisible(false);
 
-               IEditorInput input = getEditorInput();
-               if (!(input instanceof UpdateEditorInput)) {
-                       Label label = new Label(composite, SWT.NONE);
-                       label.setText("Unknown input.");
-                       return;
-               }
-               
-               Composite fillComposite = new Composite(composite, SWT.NONE);
+//             IEditorInput input = getEditorInput();
+//             if (!(input instanceof UpdateEditorInput)) {
+//                     Label label = new Label(composite, SWT.NONE);
+//                     label.setText("Unknown input.");
+//                     return;
+//             }
+               
+               Composite fillComposite = new Composite(this, SWT.NONE);
                data = new GridData();
                data.grabExcessHorizontalSpace = true;
                data.grabExcessVerticalSpace = true;
@@ -160,7 +152,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                        
                        TreeViewerColumn dataColumn = TableUtils.addColumn(changeBrowser, "Data", true, 600);
 
-                       dataColumn.setLabelProvider(new UpdateNodeLabelProvicer());
+                       dataColumn.setLabelProvider(new UpdateNodeLabelProvider());
                        
                        changeBrowser.addCheckStateListener(new ICheckStateListener() {
                                
@@ -171,7 +163,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                                                node.getOp().select(Boolean.TRUE.equals(event.getChecked()));
                                                
                                        }
-                                       updateSelection();
+                                       refreshChecked();
                                        
                                }
                        });
@@ -183,7 +175,8 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                                                
                                                @Override
                                                public void run() {
-                                                       updateSelection();
+                                                       // TreeViewer uses lazy load, checked states must be updated when the tree is expanded. 
+                                                       refreshChecked();
                                                }
                                        });
                                        
@@ -224,12 +217,12 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                        selection.getColumn().addSelectionListener(new SelectionAdapter() {
                                @Override
                                public void widgetSelected(SelectionEvent e) {
-                                       if (changes.getModifications().size() > 0) {
-                                               if (selected.contains(changes.getModifications().get(0))) {
-                                                       for (Pair<Statement, Statement> nr : changes.getModifications())
+                                       if (updateList.getChanges().size() > 0) {
+                                               if (selected.contains(updateList.getChanges().iterator().next())) {
+                                                       for (Pair<Statement, Statement> nr : updateList.getChanges())
                                                                selected.remove(nr);
                                                } else {
-                                                       for (Pair<Statement, Statement> nr : changes.getModifications())
+                                                       for (Pair<Statement, Statement> nr : updateList.getChanges())
                                                                selected.add(nr);
                                                }
                                                changeViewer.refresh();
@@ -239,7 +232,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                        selection.setEditingSupport(new SelectionEditingSupport(changeViewer, selected));
                
                }
-               Composite buttonComposite = new Composite(composite, SWT.NONE);
+               Composite buttonComposite = new Composite(this, SWT.NONE);
                
                data = new GridData();
                data.grabExcessHorizontalSpace = true;
@@ -264,7 +257,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                updateAllButton.addSelectionListener(new SelectionAdapter() {
                        @Override
                        public void widgetSelected(SelectionEvent e) {
-                               updateAll();
+                               applyAll();
                        }
                });
                updateSelectedButton = new Button(buttonComposite, SWT.PUSH);
@@ -272,12 +265,13 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                updateSelectedButton.addSelectionListener(new SelectionAdapter() {
                        @Override
                        public void widgetSelected(SelectionEvent e) {
-                               updateSelected();
+                               applySelected();
                        }
                });
-
-               load();
-               
+       }
+       
+       protected Session getSession() {
+               return SimanticsUI.getSession();
        }
        
        protected String getColumntTitle(int i) {
@@ -303,6 +297,9 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
        protected abstract ColumnLabelProvider getLabelProvider(int i);
        protected abstract Pair<GraphComparator,Boolean> getChanges(Resource r1, Resource r2)  throws DatabaseException;
        protected abstract UpdateTree getUpdateTree(GraphChanges changes) throws DatabaseException;
+       protected UpdateList getUpdateList(GraphChanges changes) throws DatabaseException {
+               return new UpdateList(changes.getModifications());
+       }
        
        protected void addFilters(List<ChangeFilter> filters) {
                
@@ -312,6 +309,22 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                return changes;
        }
        
+       public UpdateTree getUpdateTree() {
+               return updateTree;
+       }
+       
+       public UpdateList getUpdateList() {
+               return updateList;
+       }
+       
+       public CheckboxTreeViewer getChangeBrowser() {
+               return changeBrowser;
+       }
+       
+       public TableViewer getChangeViewer() {
+               return changeViewer;
+       }
+       
        private void showWarning(String text) {
                errorComposite.setVisible(true);
                
@@ -320,31 +333,48 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                label = new Label(errorComposite, SWT.NONE);
                label.setText(text);
                //this.setStatusMessage("Update contains structural changes (new or deleted symbols), please create a new model.");
-               composite.layout(true);
+               this.layout(true);
+       }
+       
+       
+       private List<ICheckStateListener> checkStateListeners = new ArrayList<>();
+       
+       
+       public void addCheckStateListener(ICheckStateListener listener) {
+               checkStateListeners.add(listener);
+       }
        
+       public void removeCheckStateListener(ICheckStateListener listener) {
+               checkStateListeners.remove(listener);
        }
        
-       private void updateSelection() {
+       public void refreshChecked() {
                Stack<UpdateNode> nodeStack = new Stack<UpdateNode>();
                nodeStack.push((UpdateNode)updateTree.getRootNode());
                while (!nodeStack.isEmpty()) {
                        UpdateNode n = nodeStack.pop();
                        if (n.getOp() != null) {
-                               boolean applied = n.getOp().applied();
-                               if (applied) {
-                                       changeBrowser.setChecked(n, true);
+                               UpdateOp op = n.getOp();
+                               if (!op.isAdd() && !op.isDelete()) {
                                        changeBrowser.setGrayed(n, true);
-                                       selectedStructure.remove(n);
+                                       changeBrowser.setChecked(n, true);
                                } else {
-                                       boolean sel = n.getOp().selected();
-                                       if (sel) {
-                                               selectedStructure.add(n);
-                                               
-                                       } else {
+                                       boolean applied = op.applied();
+                                       if (applied) {
+                                               changeBrowser.setChecked(n, true);
+                                               changeBrowser.setGrayed(n, true);
                                                selectedStructure.remove(n);
+                                       } else {
+                                               boolean sel = op.selected();
+                                               if (sel) {
+                                                       selectedStructure.add(n);
+                                                       
+                                               } else {
+                                                       selectedStructure.remove(n);
+                                               }
+                                               changeBrowser.setChecked(n, sel);
+                                               changeBrowser.setGrayed(n, false);
                                        }
-                                       changeBrowser.setChecked(n, sel);
-                                       changeBrowser.setGrayed(n, false);
                                }
                        } else {
                                changeBrowser.setGrayed(n, true);
@@ -356,15 +386,17 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                }
                
                changeBrowser.refresh();
+               for (ICheckStateListener l : checkStateListeners) {
+                       l.checkStateChanged(new CheckStateChangedEvent(changeBrowser, null, false));
+               }
        }
        
        
        
-       private void load() {
+       public void load(UpdateEditorInput uei) {
                
                addFilters(filters);
 
-               UpdateEditorInput uei = (UpdateEditorInput)getEditorInput();
                Resource r1 = uei.getR1();
                Resource r2 = uei.getR2();
                
@@ -379,33 +411,37 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                        changes = comparator.getChanges();
                        changes = getSession().syncRequest(new FilterChangesRead(changes));
                        updateTree = getUpdateTree(changes);
+                       updateList = getUpdateList(changes);
                } catch (DatabaseException e) {
-                       Text text = new Text(composite, SWT.MULTI);
+                       Text text = new Text(this, SWT.MULTI);
                        text.setText(e.getMessage());
                        e.printStackTrace();
                        return;
                }
        
-
-
-               changeViewer.setInput(changes.getModifications());
-               changeBrowser.setInput(updateTree);
-               updateSelection();
+               setInputs();
+               
+               refreshChecked();
        }
        
+       protected void setInputs() {
+               changeViewer.setInput(updateList.getChanges());
+               changeBrowser.setInput(updateTree);
+       }
        
-       
-       private void updateAll() {
+       private void applyAll() {
                updateAllButton.setEnabled(false);
                updateSelectedButton.setEnabled(false);
                getSession().asyncRequest(new WriteRequest(){
                        @Override
                        public void perform(WriteGraph graph) throws DatabaseException {
-                               for (Pair<Statement, Statement> mod : changes.getModifications()) {
+                               Layer0Utils.addCommentMetadata(graph, "Apply all model updates");
+                               graph.markUndoPoint();
+                               for (Pair<Statement, Statement> mod : updateList.getChanges()) {
                                        applyLiteralChange(graph, mod);
                                }
                                selected.clear();
-                               changes.getModifications().clear();
+                               updateList.clear();
                                
                                updateTree.getUpdateOps().applyAll(graph);
                                
@@ -416,7 +452,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                                                
                                                updateAllButton.setEnabled(true);
                                                updateSelectedButton.setEnabled(true);
-                                               updateSelection();
+                                               refreshChecked();
                                                changeViewer.refresh();
                                        }
                                });
@@ -432,10 +468,13 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                });
        }
        
-       private void applyLiteralChange(WriteGraph graph, Pair<Statement, Statement> mod) throws DoesNotContainValueException, ServiceException, ManyObjectsForFunctionalRelationException {
-               
+       protected void applyLiteralChange(WriteGraph graph, Pair<Statement, Statement> mod) throws DatabaseException {
+               if (mod.second == null) {
+                       graph.deny(mod.first);
+                       return;
+               } 
                Resource s = changes.getComparable().getLeft(mod.second.getSubject());
-               Resource pred = mod.first.getPredicate();
+               Resource pred = mod.second.getPredicate();
                if (graph.hasValue(mod.second.getObject())) {
                        Object value = graph.getValue(mod.second.getObject());
                        graph.claimLiteral(s, pred, value);
@@ -446,14 +485,16 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                
        }
        
-       private void updateSelected() {
+       private void applySelected() {
                updateAllButton.setEnabled(false);
                updateSelectedButton.setEnabled(false);
                getSession().asyncRequest(new WriteRequest(){
                        @Override
                        public void perform(WriteGraph graph) throws DatabaseException {
+                               Layer0Utils.addCommentMetadata(graph, "Apply selected model updates");
+                               graph.markUndoPoint();
                                for (Pair<Statement, Statement> mod : selected) {
-                                       changes.getModifications().remove(mod);
+                                       updateList.removeChange(mod);
                                        applyLiteralChange(graph, mod);
                                }
                                selected.clear();
@@ -467,18 +508,13 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                                                changeViewer.refresh();
                                                updateAllButton.setEnabled(true);
                                                updateSelectedButton.setEnabled(true);
-                                               updateSelection();
+                                               refreshChecked();
                                        }
                                });
                        }
                });
        }
 
-       @Override
-       public void setFocus() {
-               composite.setFocus();
-
-       }
        
        /**
         * Filters changes:
@@ -657,21 +693,12 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 {
                }
        }
        
-       private class UpdateNodeLabelProvicer extends ColumnLabelProvider {
+       private class UpdateNodeLabelProvider extends ColumnLabelProvider {
                
                @Override
                public String getText(Object element) {
                        final UpdateNode node = (UpdateNode)element;
-                       try  {
-                               return getSession().syncRequest(new Read<String>() {
-                                       @Override
-                                       public String perform(ReadGraph graph) throws DatabaseException {
-                                               return node.getLabel(graph);
-                                       }
-                               });
-                       } catch (Exception e) {
-                               return e.getMessage();
-                       }
+                       return node.getLabel();
                }
                
                @Override