X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.interop.update%2Fsrc%2Forg%2Fsimantics%2Finterop%2Fupdate%2Feditor%2FModelUpdateEditor.java;h=9ea83a4c94577af32b8065087e26e4528fd0e4b3;hb=930c049303df44922114e177e174a3c94d423b7f;hp=94b24619675049ff0bf1489fd4c4fcbd4935a1eb;hpb=6af8d67b9d34bb9e8cc4b4c8bd5e95e70c16f104;p=simantics%2Finterop.git diff --git a/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java b/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java index 94b2461..9ea83a4 100644 --- a/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java +++ b/org.simantics.interop.update/src/org/simantics/interop/update/editor/ModelUpdateEditor.java @@ -40,27 +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.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.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.ui.workbench.ResourceEditorPart2; +import org.simantics.ui.SimanticsUI; import org.simantics.utils.datastructures.Callback; import org.simantics.utils.datastructures.Pair; import org.simantics.utils.ui.ExceptionUtils; @@ -72,10 +70,8 @@ import org.simantics.utils.ui.ExceptionUtils; * @author Marko Luukkainen * */ -public abstract class ModelUpdateEditor extends ResourceEditorPart2 { +public abstract class ModelUpdateEditor extends Composite{ - - private Composite composite; private Composite errorComposite; private CheckboxTreeViewer changeBrowser; @@ -83,6 +79,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { private GraphChanges changes; private UpdateTree updateTree; + private UpdateList updateList; private Button updateAllButton; private Button updateSelectedButton; @@ -96,30 +93,26 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { private Color containsColor; private Color deletedColor; private Color addedColor; - - private HashSet> selected = new HashSet>(); + private HashSet selectedStructure = new HashSet(); private List filters = new ArrayList(); - 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; @@ -130,14 +123,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; @@ -169,7 +162,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { node.getOp().select(Boolean.TRUE.equals(event.getChecked())); } - updateSelection(); + refreshChecked(); } }); @@ -181,7 +174,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(); } }); @@ -218,26 +212,26 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { oldValue.setLabelProvider(getLabelProvider(4)); newValue.setLabelProvider(getLabelProvider(5)); - selection.setLabelProvider(new SelectionLabelProvider(selected)); + selection.setLabelProvider(new SelectionLabelProvider()); 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 nr : changes.getModifications()) - selected.remove(nr); + if (updateList.getChanges().size() > 0) { + if (updateList.getSelected().contains(updateList.getChanges().iterator().next())) { + for (Pair nr : updateList.getChanges()) + updateList.removeSelected(nr); } else { - for (Pair nr : changes.getModifications()) - selected.add(nr); + for (Pair nr : updateList.getChanges()) + updateList.addSelected(nr); } changeViewer.refresh(); } } }); - selection.setEditingSupport(new SelectionEditingSupport(changeViewer, selected)); + selection.setEditingSupport(new SelectionEditingSupport(changeViewer)); } - Composite buttonComposite = new Composite(composite, SWT.NONE); + Composite buttonComposite = new Composite(this, SWT.NONE); data = new GridData(); data.grabExcessHorizontalSpace = true; @@ -262,7 +256,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); @@ -270,12 +264,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) { @@ -301,6 +296,9 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { protected abstract ColumnLabelProvider getLabelProvider(int i); protected abstract Pair 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 filters) { @@ -310,6 +308,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); @@ -318,11 +332,22 @@ 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 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 nodeStack = new Stack(); nodeStack.push((UpdateNode)updateTree.getRootNode()); while (!nodeStack.isEmpty()) { @@ -360,15 +385,18 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { } changeBrowser.refresh(); + for (ICheckStateListener l : checkStateListeners) { + l.checkStateChanged(new CheckStateChangedEvent(changeBrowser, null, false)); + } + changeViewer.refresh(); } - private void load() { + public void load(UpdateEditorInput uei) { addFilters(filters); - UpdateEditorInput uei = (UpdateEditorInput)getEditorInput(); Resource r1 = uei.getR1(); Resource r2 = uei.getR2(); @@ -383,23 +411,25 @@ 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(){ @@ -407,11 +437,10 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { public void perform(WriteGraph graph) throws DatabaseException { Layer0Utils.addCommentMetadata(graph, "Apply all model updates"); graph.markUndoPoint(); - for (Pair mod : changes.getModifications()) { + for (Pair mod : updateList.getChanges()) { applyLiteralChange(graph, mod); } - selected.clear(); - changes.getModifications().clear(); + updateList.clear(); updateTree.getUpdateOps().applyAll(graph); @@ -422,7 +451,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { updateAllButton.setEnabled(true); updateSelectedButton.setEnabled(true); - updateSelection(); + refreshChecked(); changeViewer.refresh(); } }); @@ -438,10 +467,13 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { }); } - private void applyLiteralChange(WriteGraph graph, Pair mod) throws DoesNotContainValueException, ServiceException, ManyObjectsForFunctionalRelationException { - + protected void applyLiteralChange(WriteGraph graph, Pair 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); @@ -452,7 +484,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { } - private void updateSelected() { + private void applySelected() { updateAllButton.setEnabled(false); updateSelectedButton.setEnabled(false); getSession().asyncRequest(new WriteRequest(){ @@ -460,11 +492,10 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { public void perform(WriteGraph graph) throws DatabaseException { Layer0Utils.addCommentMetadata(graph, "Apply selected model updates"); graph.markUndoPoint(); - for (Pair mod : selected) { - changes.getModifications().remove(mod); + for (Pair mod : updateList.getSelected()) { + updateList.removeChange(mod); applyLiteralChange(graph, mod); } - selected.clear(); updateTree.getUpdateOps().applySelected(graph); @@ -475,18 +506,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: @@ -647,9 +673,8 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { private class SelectionLabelProvider extends ColumnLabelProvider { - Collection selected; - public SelectionLabelProvider(Collection selected) { - this.selected = selected; + public SelectionLabelProvider() { + } @Override public String getText(Object element) { @@ -658,7 +683,9 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { @Override public Image getImage(Object element) { - if (selected.contains(element)) + if (updateList == null) + return null; + if (updateList.getSelected().contains(element)) return checked; else return unchecked; @@ -670,16 +697,7 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { @Override public String getText(Object element) { final UpdateNode node = (UpdateNode)element; - try { - return getSession().syncRequest(new Read() { - @Override - public String perform(ReadGraph graph) throws DatabaseException { - return node.getLabel(graph); - } - }); - } catch (Exception e) { - return e.getMessage(); - } + return node.getLabel(); } @Override @@ -734,14 +752,10 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { private class SelectionEditingSupport extends EditingSupport { - @SuppressWarnings("rawtypes") - Collection selected; - @SuppressWarnings("rawtypes") - public SelectionEditingSupport(ColumnViewer viewer, Collection selected) { + public SelectionEditingSupport(ColumnViewer viewer) { super(viewer); - this.selected = selected; } @@ -757,16 +771,20 @@ public abstract class ModelUpdateEditor extends ResourceEditorPart2 { @Override protected Object getValue(Object element) { - return selected.contains(element); + if (updateList == null) + return false; + return updateList.getSelected().contains(element); } @SuppressWarnings("unchecked") @Override protected void setValue(Object element, Object value) { + if (updateList == null) + return; if (Boolean.TRUE.equals(value)) - selected.add(element); + updateList.addSelected((Pair) element); else - selected.remove(element); + updateList.removeSelected((Pair) element); getViewer().refresh(element); }