1 /* 2 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. 3 * All rights reserved. Use is subject to license terms. 4 * 5 * This file is available and licensed under the following license: 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * - Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * - Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the distribution. 16 * - Neither the name of Oracle Corporation nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.oracle.javafx.scenebuilder.kit.editor.job.reference; 34 35 import com.oracle.javafx.scenebuilder.kit.editor.EditorController; 36 import com.oracle.javafx.scenebuilder.kit.editor.job.InlineDocumentJob; 37 import com.oracle.javafx.scenebuilder.kit.editor.job.Job; 38 import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob; 39 import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob; 40 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCloner; 41 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument; 42 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance; 43 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNodes; 44 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject; 45 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC; 46 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyT; 47 import com.oracle.javafx.scenebuilder.kit.metadata.util.PrefixedValue; 48 import java.util.LinkedList; 49 import java.util.List; 50 51 /** 52 * 53 */ 54 public class ExpandExpressionReferenceJob extends InlineDocumentJob { 55 56 private final FXOMPropertyT reference; 57 private final FXOMCloner cloner; 58 59 public ExpandExpressionReferenceJob( 60 FXOMPropertyT reference, 61 FXOMCloner cloner, 62 EditorController editorController) { 63 super(editorController); 64 65 assert reference != null; 66 assert reference.getFxomDocument() == editorController.getFxomDocument(); 67 assert (cloner == null) || (cloner.getTargetDocument() == editorController.getFxomDocument()); 68 69 this.reference = reference; 70 this.cloner = cloner; 71 } 72 73 /* 74 * InlineDocumentJob 75 */ 76 @Override 77 protected List<Job> makeAndExecuteSubJobs() { 78 final List<Job> result = new LinkedList<>(); 79 80 // 1) remove the reference 81 final FXOMInstance parentInstance = reference.getParentInstance(); 82 final Job removeReference = new RemovePropertyJob(reference, getEditorController()); 83 removeReference.execute(); 84 result.add(removeReference); 85 86 // 2.1) clone the referee 87 final FXOMDocument fxomDocument = getEditorController().getFxomDocument(); 88 final String fxId = FXOMNodes.extractReferenceSource(reference); 89 final FXOMObject referee = fxomDocument.searchWithFxId(fxId); 90 final FXOMObject refereeClone = cloner.clone(referee); 91 92 // 3) insert the clone in place of the reference 93 final FXOMPropertyC cloneProperty 94 = new FXOMPropertyC(fxomDocument, reference.getName(), refereeClone); 95 final Job addCloneJob 96 = new AddPropertyJob(cloneProperty, parentInstance, -1, getEditorController()); 97 addCloneJob.execute(); 98 result.add(addCloneJob); 99 100 return result; 101 } 102 103 @Override 104 protected String makeDescription() { 105 return getClass().getSimpleName(); // Not expected to reach the user 106 } 107 108 @Override 109 public boolean isExecutable() { 110 final PrefixedValue pv = new PrefixedValue(reference.getValue()); 111 return pv.isExpression(); 112 } 113 114 115 }