changeset 7954:bef2f999b920

[SCENEBUILDER] ReferencesUpdate class now treats ToggleGroup reference with some special logic (DTL-6774).
author eric.le.ponner@oracle.com
date Wed, 03 Sep 2014 10:07:56 +0200
parents 043cd5a12fd9
children d89f3f7fd22b
files apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemovePropertyJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/FixToggleGroupExpressionReferenceJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/FixToggleGroupIntrinsicReferenceJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/FixToggleGroupReferenceJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/ReferencesUpdater.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMNodes.java
diffstat 6 files changed, 445 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemovePropertyJob.java	Tue Sep 02 20:05:13 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemovePropertyJob.java	Wed Sep 03 10:07:56 2014 +0200
@@ -57,6 +57,10 @@
         return targetProperty;
     }
 
+    public Job makeMirrorJob(FXOMProperty anotherProperty) {
+        return new AddPropertyJob(anotherProperty, parentInstance, 
+                indexInParentInstance, getEditorController());
+    }
 
     /*
      * Job
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/FixToggleGroupExpressionReferenceJob.java	Wed Sep 03 10:07:56 2014 +0200
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.editor.job.reference;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.InlineDocumentJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemoveObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ReplacePropertyValueJobT;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNodes;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyT;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PrefixedValue;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ *
+ */
+public class FixToggleGroupExpressionReferenceJob extends InlineDocumentJob {
+    
+    private final FXOMPropertyT reference;
+
+    public FixToggleGroupExpressionReferenceJob(
+            FXOMPropertyT reference, 
+            EditorController editorController) {
+        super(editorController);
+        
+        assert reference != null;
+        assert reference.getFxomDocument() == editorController.getFxomDocument();
+        
+        this.reference = reference;
+    }
+    
+    /*
+     * InlineDocumentJob
+     */
+    @Override
+    protected List<Job> makeAndExecuteSubJobs() {
+        final List<Job> result = new LinkedList<>();
+        
+        // 1) Locates the referee
+        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
+        final String fxId = FXOMNodes.extractReferenceSource(reference);
+        final FXOMObject referee = fxomDocument.searchWithFxId(fxId);
+        
+        /*
+         *    <RadioButton toggleGroup="$oxebo" />          // reference    //NOI18N
+         *    ...
+         *    <RadioButton>
+         *       <toggleGroup>
+         *           <ToggleGroup fx:id="oxebo" />          // referee      //NOI18N
+         *       </toggleGroup>
+         *    </RadioButton>
+         */
+            
+        // 2) Finds or create the matching toggle group
+        if (referee != null) {
+            assert referee.getParentProperty() != null;
+            assert referee.getParentProperty().getParentInstance() != null;
+            
+            // 2a.1) Toggle group is available : disconnect it and re-use it
+            final FXOMInstance parentInstance 
+                    = referee.getParentProperty().getParentInstance();
+            final RemoveObjectJob removeJob 
+                    = new RemoveObjectJob(referee, getEditorController());
+            removeJob.execute();
+            result.add(removeJob);
+            
+            // 2a.2) Replace the reference by the toggleGroup
+            final Job replaceJob = new ReplacePropertyValueJobT(reference, 
+                    referee, getEditorController());
+            replaceJob.execute();
+            result.add(replaceJob);
+
+            // 2a.3) Put reference at referee previous place
+            final Job addJob = new AddPropertyJob(reference, parentInstance, 
+                    -1, getEditorController());
+            addJob.execute();
+            result.add(addJob);
+            
+        } else {
+            
+            // 2b.1) Removes the reference
+            final FXOMInstance targetInstance = reference.getParentInstance();
+            final Job removeJob = new RemovePropertyJob(reference, getEditorController());
+            removeJob.execute();
+            result.add(removeJob);
+            
+            // 2b.2) Creates and adds toggle group
+            final FXOMPropertyC newToggleGroup = FXOMNodes.makeToggleGroup(fxomDocument, fxId);
+            final Job addJob = new AddPropertyJob(newToggleGroup, 
+                    targetInstance, -1, getEditorController());
+            addJob.execute();
+            result.add(addJob);
+        }
+        
+        return result;
+    }
+
+    @Override
+    protected String makeDescription() {
+        return getClass().getSimpleName(); // Not expected to reach the user
+    }
+
+    @Override
+    public boolean isExecutable() {
+        final PrefixedValue pv = new PrefixedValue(reference.getValue());
+        return pv.isExpression();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/FixToggleGroupIntrinsicReferenceJob.java	Wed Sep 03 10:07:56 2014 +0200
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.editor.job.reference;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.InlineDocumentJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMIntrinsic;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNodes;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ *
+ */
+public class FixToggleGroupIntrinsicReferenceJob extends InlineDocumentJob {
+    
+    private final FXOMIntrinsic reference;
+
+    public FixToggleGroupIntrinsicReferenceJob(
+            FXOMIntrinsic reference, 
+            EditorController editorController) {
+        super(editorController);
+        
+        assert reference != null;
+        assert reference.getFxomDocument() == editorController.getFxomDocument();
+        
+        this.reference = reference;
+    }
+    
+    /*
+     * InlineDocumentJob
+     */
+    @Override
+    protected List<Job> makeAndExecuteSubJobs() {
+        final List<Job> result = new LinkedList<>();
+        
+        // 1) Locates the referee
+        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
+        final String fxId = FXOMNodes.extractReferenceSource(reference);
+        final FXOMObject referee = fxomDocument.searchWithFxId(fxId);
+        
+        /*
+         *    <RadioButton>
+         *       <toggleGroup>
+         *           <fx:reference source="oxebo" />        // reference        //NOI18N
+         *       </toggleGroup>
+         *    </RadioButton>
+         *    ...
+         *    <RadioButton>
+         *       <toggleGroup>
+         *           <ToggleGroup fx:id="oxebo" />          // referee          //NOI18N
+         *       </toggleGroup>
+         *    </RadioButton>
+         */
+        
+        if (referee != null) {
+            assert referee.getParentProperty() != null;
+            
+            final FXOMPropertyC referenceProperty = reference.getParentProperty();
+            final FXOMPropertyC refereeProperty = referee.getParentProperty();
+            
+            // 2a.1) Removes referenceProperty
+            final RemovePropertyJob removeReferenceJob 
+                    = new RemovePropertyJob(referenceProperty, getEditorController());
+            removeReferenceJob.execute();
+            result.add(removeReferenceJob);
+            
+            // 2a.2) Removes refereeProperty
+            final RemovePropertyJob removeRefereeJob 
+                    = new RemovePropertyJob(refereeProperty, getEditorController());
+            removeRefereeJob.execute();
+            result.add(removeRefereeJob);
+            
+            // 2a.3) Adds referenceProperty where refereeProperty was
+            final Job addReferenceJob 
+                    = removeRefereeJob.makeMirrorJob(referenceProperty);
+            addReferenceJob.execute();
+            result.add(addReferenceJob);
+            
+            // 2a.4) Adds refereeProperty where referenceProperty was
+            final Job addRefereeJob 
+                    = removeRefereeJob.makeMirrorJob(refereeProperty);
+            addRefereeJob.execute();
+            result.add(addReferenceJob);
+            
+        } else {
+            
+            // 2b.1) Removes reference
+            final FXOMInstance targetInstance = reference.getParentProperty().getParentInstance();
+            final FXOMPropertyC referenceProperty = reference.getParentProperty();
+            final RemovePropertyJob removeReferenceJob 
+                    = new RemovePropertyJob(referenceProperty, getEditorController());
+            removeReferenceJob.execute();
+            result.add(removeReferenceJob);
+            
+            // 2b.2) Creates and adds toggle group
+            final FXOMPropertyC newToggleGroup = FXOMNodes.makeToggleGroup(fxomDocument, fxId);
+            final Job addJob = removeReferenceJob.makeMirrorJob(newToggleGroup);
+            addJob.execute();
+            result.add(addJob);
+        }
+                
+        return result;
+    }
+
+    @Override
+    protected String makeDescription() {
+        return getClass().getSimpleName(); // Not expected to reach the user
+    }
+
+    @Override
+    public boolean isExecutable() {
+        return ((reference.getType() == FXOMIntrinsic.Type.FX_REFERENCE) &&
+                (reference.getParentProperty() != null));
+    }
+    
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/FixToggleGroupReferenceJob.java	Wed Sep 03 10:07:56 2014 +0200
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.editor.job.reference;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMIntrinsic;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNode;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyT;
+
+/**
+ *
+ */
+public class FixToggleGroupReferenceJob  extends Job {
+    
+    private final Job subJob;
+    
+    public FixToggleGroupReferenceJob(FXOMNode reference, EditorController editorController) {
+        super(editorController);
+        if (reference instanceof FXOMIntrinsic) {
+            final FXOMIntrinsic fxomIntrinsic = (FXOMIntrinsic) reference;
+            subJob = new FixToggleGroupIntrinsicReferenceJob(fxomIntrinsic, getEditorController());
+        } else if (reference instanceof FXOMPropertyT) {
+            final FXOMPropertyT fxomProperty = (FXOMPropertyT) reference;
+            subJob = new FixToggleGroupExpressionReferenceJob(fxomProperty, getEditorController());
+        } else {
+            throw new RuntimeException("Bug"); //NOI18N
+        }
+    }
+    
+    /*
+     * Job
+     */
+    @Override
+    public boolean isExecutable() {
+        return subJob.isExecutable();
+    }
+
+    @Override
+    public void execute() {
+        subJob.execute();
+    }
+
+    @Override
+    public void undo() {
+        subJob.undo();
+    }
+
+    @Override
+    public void redo() {
+        subJob.redo();
+    }
+
+    @Override
+    public String getDescription() {
+        return subJob.getDescription();
+    }
+
+
+    
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/ReferencesUpdater.java	Tue Sep 02 20:05:13 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/reference/ReferencesUpdater.java	Wed Sep 03 10:07:56 2014 +0200
@@ -168,15 +168,27 @@
         if (declaredFxIds.contains(fxId) == false) {
             // r is a forward reference
             //
+            // 0) r is a toggleGroup reference
+            //    => if toggle group exists, we swap it with the reference
+            //    => if not, replace the reference by a new toggle group
             // 1) r is a weak reference (like labelFor)
             //    => we remove the reference
             // 2) else r is a strong reference
             //    => we expand the reference
             
+            
+            final FXOMObject declarer = fxomDocument.searchWithFxId(fxId);
 
-            // 1)
-            final FXOMObject declarer = fxomDocument.searchWithFxId(fxId);
-            if (FXOMNodes.isWeakReference(r) || (declarer == null)) {
+            // 0)
+            if (FXOMNodes.isToggleGroupReference(r)) {
+                final Job fixJob = new FixToggleGroupReferenceJob(r, editorController);
+                fixJob.execute();
+                executedJobs.add(fixJob);
+                declaredFxIds.add(fxId);
+            }
+            
+            // 1
+            else if (FXOMNodes.isWeakReference(r) || (declarer == null)) {
                 final Job removeJob = new RemoveNodeJob(r, editorController);
                 removeJob.execute();
                 executedJobs.add(removeJob);
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMNodes.java	Tue Sep 02 20:05:13 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMNodes.java	Wed Sep 03 10:07:56 2014 +0200
@@ -582,6 +582,41 @@
     }
     
     
+    private static final PropertyName toggleGroupName = new PropertyName("toggleGroup");
+    
+    public static boolean isToggleGroupReference(FXOMNode node) {
+        final boolean result;
+        
+        if (extractReferenceSource(node) == null) {
+            result = false;
+        } else {
+            if (node instanceof FXOMIntrinsic) {
+                final FXOMIntrinsic intrinsic = (FXOMIntrinsic) node;
+                final FXOMProperty parentProperty = intrinsic.getParentProperty();
+                if (parentProperty == null) {
+                    result = false;
+                } else {
+                    result = parentProperty.getName().equals(toggleGroupName);
+                }
+            } else if (node instanceof FXOMPropertyT) {
+                final FXOMPropertyT property = (FXOMPropertyT) node;
+                result = property.getName().equals(toggleGroupName);
+            } else {
+                result = false;
+            }
+        }
+        
+        return result;
+    }
+    
+    
+    public static FXOMPropertyC makeToggleGroup(FXOMDocument fxomDocument, String fxId) {
+        final FXOMInstance toggleGroup = new FXOMInstance(fxomDocument, ToggleGroup.class);
+        toggleGroup.setFxId(fxId);
+        return new FXOMPropertyC(fxomDocument, toggleGroupName, toggleGroup);
+    }
+    
+    
     public static boolean isWeakReference(FXOMNode node) {
         final boolean result;