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 package com.oracle.javafx.scenebuilder.kit.editor.job;
  33 
  34 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
  35 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
  36 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
  37 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
  38 import com.oracle.javafx.scenebuilder.kit.metadata.Metadata;
  39 import com.oracle.javafx.scenebuilder.kit.metadata.klass.ComponentClassMetadata;
  40 import com.oracle.javafx.scenebuilder.kit.metadata.property.PropertyMetadata;
  41 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.BooleanPropertyMetadata;
  42 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
  43 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.EnumerationPropertyMetadata;
  44 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
  45 
  46 /**
  47  * This class defines getter and setter on FXOM objects without using the modify job.
  48  * Theses methods are used by jobs that creates new FXOM objects and sets some of their properties.
  49  * No need to use a job in this case as the undo action will remove the new added FXOM object.
  50  */
  51 public class JobUtils {
  52 
  53     public static void addColumnConstraints(
  54             final FXOMDocument fxomDocument,
  55             final FXOMInstance gridPane,
  56             final FXOMInstance constraints, int index) {
  57         final PropertyName propertyName = new PropertyName("columnConstraints"); //NOI18N
  58         FXOMProperty property = gridPane.getProperties().get(propertyName);
  59         if (property == null) {
  60             property = new FXOMPropertyC(fxomDocument, propertyName);
  61         }
  62         if (property.getParentInstance() == null) {
  63             property.addToParentInstance(-1, gridPane);
  64         }
  65         assert property instanceof FXOMPropertyC;
  66         constraints.addToParentProperty(index, (FXOMPropertyC) property);
  67     }
  68 
  69     public static void addRowConstraints(
  70             final FXOMDocument fxomDocument,
  71             final FXOMInstance gridPane,
  72             final FXOMInstance constraints, int index) {
  73         final PropertyName propertyName = new PropertyName("rowConstraints"); //NOI18N
  74         FXOMProperty property = gridPane.getProperties().get(propertyName);
  75         if (property == null) {
  76             property = new FXOMPropertyC(fxomDocument, propertyName);
  77         }
  78         if (property.getParentInstance() == null) {
  79             property.addToParentInstance(-1, gridPane);
  80         }
  81         assert property instanceof FXOMPropertyC;
  82         constraints.addToParentProperty(index, (FXOMPropertyC) property);
  83     }
  84 
  85     public static boolean getFillHeight(
  86             final FXOMInstance instance, final Class<?> clazz) {
  87         assert instance != null && clazz != null;
  88         assert clazz.isAssignableFrom(instance.getDeclaredClass());
  89         final PropertyMetadata propertyMeta
  90                 = getPropertyMetadata(clazz, "fillHeight"); //NOI18N
  91         assert propertyMeta instanceof BooleanPropertyMetadata;
  92         return ((BooleanPropertyMetadata) propertyMeta).getValue(instance);
  93     }
  94 
  95     public static void setFillHeight(
  96             final FXOMInstance instance, final Class<?> clazz, final boolean value) {
  97         assert instance != null && clazz != null;
  98         assert clazz.isAssignableFrom(instance.getDeclaredClass());
  99         final PropertyMetadata propertyMeta
 100                 = getPropertyMetadata(clazz, "fillHeight"); //NOI18N
 101         assert propertyMeta instanceof BooleanPropertyMetadata;
 102         ((BooleanPropertyMetadata) propertyMeta).setValue(instance, value);
 103     }
 104 
 105     public static boolean getFillWidth(
 106             final FXOMInstance instance, final Class<?> clazz) {
 107         assert instance != null && clazz != null;
 108         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 109         final PropertyMetadata propertyMeta
 110                 = getPropertyMetadata(clazz, "fillWidth"); //NOI18N
 111         assert propertyMeta instanceof BooleanPropertyMetadata;
 112         return ((BooleanPropertyMetadata) propertyMeta).getValue(instance);
 113     }
 114 
 115     public static void setFillWidth(
 116             final FXOMInstance instance, final Class<?> clazz, final boolean value) {
 117         assert instance != null && clazz != null;
 118         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 119         final PropertyMetadata propertyMeta
 120                 = getPropertyMetadata(clazz, "fillWidth"); //NOI18N
 121         assert propertyMeta instanceof BooleanPropertyMetadata;
 122         ((BooleanPropertyMetadata) propertyMeta).setValue(instance, value);
 123     }
 124 
 125     public static String getHAlignment(
 126             final FXOMInstance instance, final Class<?> clazz) {
 127         assert instance != null && clazz != null;
 128         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 129         final PropertyName propertyName = new PropertyName("halignment"); //NOI18N
 130         final FXOMProperty property = instance.getProperties().get(propertyName);
 131         if (property == null) {
 132             return null;
 133         } else {
 134             final PropertyMetadata propertyMeta
 135                     = getPropertyMetadata(clazz, "halignment"); //NOI18N
 136             assert propertyMeta instanceof EnumerationPropertyMetadata;
 137             return ((EnumerationPropertyMetadata) propertyMeta).getValue(instance);
 138         }
 139     }
 140 
 141     public static void setHAlignment(
 142             final FXOMInstance instance, final Class<?> clazz, final String value) {
 143         assert instance != null && clazz != null;
 144         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 145         final PropertyMetadata propertyMeta
 146                 = getPropertyMetadata(clazz, "halignment"); //NOI18N
 147         assert propertyMeta instanceof EnumerationPropertyMetadata;
 148         if (value != null) {
 149             ((EnumerationPropertyMetadata) propertyMeta).setValue(instance, value);
 150         }
 151     }
 152 
 153     public static String getHGrow(
 154             final FXOMInstance instance, final Class<?> clazz) {
 155         assert instance != null && clazz != null;
 156         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 157         final PropertyName propertyName = new PropertyName("hgrow"); //NOI18N
 158         final FXOMProperty property = instance.getProperties().get(propertyName);
 159         if (property == null) {
 160             return null;
 161         } else {
 162             final PropertyMetadata propertyMeta
 163                     = getPropertyMetadata(clazz, "hgrow"); //NOI18N
 164             assert propertyMeta instanceof EnumerationPropertyMetadata;
 165             return ((EnumerationPropertyMetadata) propertyMeta).getValue(instance);
 166         }
 167     }
 168 
 169     public static void setHGrow(
 170             final FXOMInstance instance, final Class<?> clazz, final String value) {
 171         assert instance != null && clazz != null;
 172         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 173         final PropertyMetadata propertyMeta
 174                 = getPropertyMetadata(clazz, "hgrow"); //NOI18N
 175         assert propertyMeta instanceof EnumerationPropertyMetadata;
 176         if (value != null) {
 177             ((EnumerationPropertyMetadata) propertyMeta).setValue(instance, value);
 178         }
 179     }
 180 
 181     public static void setLayoutX(
 182             final FXOMInstance instance, final Class<?> clazz, final double value) {
 183         assert instance != null && clazz != null;
 184         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 185         final PropertyMetadata propertyMeta
 186                 = getPropertyMetadata(clazz, "layoutX"); //NOI18N
 187         assert propertyMeta instanceof DoublePropertyMetadata;
 188         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 189     }
 190 
 191     public static void setLayoutY(
 192             final FXOMInstance instance, final Class<?> clazz, final double value) {
 193         assert instance != null && clazz != null;
 194         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 195         final PropertyMetadata propertyMeta
 196                 = getPropertyMetadata(clazz, "layoutY"); //NOI18N
 197         assert propertyMeta instanceof DoublePropertyMetadata;
 198         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 199     }
 200 
 201     public static double getMaxHeight(
 202             final FXOMInstance instance, final Class<?> clazz) {
 203         assert instance != null && clazz != null;
 204         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 205         final PropertyMetadata propertyMeta
 206                 = getPropertyMetadata(clazz, "maxHeight"); //NOI18N
 207         assert propertyMeta instanceof DoublePropertyMetadata;
 208         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 209     }
 210 
 211     public static void setMaxHeight(
 212             final FXOMInstance instance, final Class<?> clazz, final double value) {
 213         assert instance != null && clazz != null;
 214         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 215         final PropertyMetadata propertyMeta
 216                 = getPropertyMetadata(clazz, "maxHeight"); //NOI18N
 217         assert propertyMeta instanceof DoublePropertyMetadata;
 218         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 219     }
 220 
 221     public static double getMaxWidth(
 222             final FXOMInstance instance, final Class<?> clazz) {
 223         assert instance != null && clazz != null;
 224         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 225         final PropertyMetadata propertyMeta
 226                 = getPropertyMetadata(clazz, "maxWidth"); //NOI18N
 227         assert propertyMeta instanceof DoublePropertyMetadata;
 228         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 229     }
 230 
 231     public static void setMaxWidth(
 232             final FXOMInstance instance, final Class<?> clazz, final double value) {
 233         assert instance != null && clazz != null;
 234         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 235         final PropertyMetadata propertyMeta
 236                 = getPropertyMetadata(clazz, "maxWidth"); //NOI18N
 237         assert propertyMeta instanceof DoublePropertyMetadata;
 238         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 239     }
 240 
 241     public static double getMinHeight(
 242             final FXOMInstance instance, final Class<?> clazz) {
 243         assert instance != null && clazz != null;
 244         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 245         final PropertyMetadata propertyMeta
 246                 = getPropertyMetadata(clazz, "minHeight"); //NOI18N
 247         assert propertyMeta instanceof DoublePropertyMetadata;
 248         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 249     }
 250 
 251     public static void setMinHeight(
 252             final FXOMInstance instance, final Class<?> clazz, final double value) {
 253         assert instance != null && clazz != null;
 254         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 255         final PropertyMetadata propertyMeta
 256                 = getPropertyMetadata(clazz, "minHeight"); //NOI18N
 257         assert propertyMeta instanceof DoublePropertyMetadata;
 258         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 259     }
 260 
 261     public static double getMinWidth(
 262             final FXOMInstance instance, final Class<?> clazz) {
 263         assert instance != null && clazz != null;
 264         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 265         final PropertyMetadata propertyMeta
 266                 = getPropertyMetadata(clazz, "minWidth"); //NOI18N
 267         assert propertyMeta instanceof DoublePropertyMetadata;
 268         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 269     }
 270 
 271     public static void setMinWidth(
 272             final FXOMInstance instance, final Class<?> clazz, final double value) {
 273         assert instance != null && clazz != null;
 274         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 275         final PropertyMetadata propertyMeta
 276                 = getPropertyMetadata(clazz, "minWidth"); //NOI18N
 277         assert propertyMeta instanceof DoublePropertyMetadata;
 278         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 279     }
 280 
 281     public static void setOrientation(
 282             final FXOMInstance instance, final Class<?> clazz, final String value) {
 283         assert instance != null && clazz != null;
 284         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 285         final PropertyMetadata propertyMeta
 286                 = getPropertyMetadata(clazz, "orientation"); //NOI18N
 287         assert propertyMeta instanceof EnumerationPropertyMetadata;
 288         if (value != null) {
 289             ((EnumerationPropertyMetadata) propertyMeta).setValue(instance, value);
 290         }
 291     }
 292 
 293     public static double getPercentHeight(
 294             final FXOMInstance instance, final Class<?> clazz) {
 295         assert instance != null && clazz != null;
 296         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 297         final PropertyMetadata propertyMeta
 298                 = getPropertyMetadata(clazz, "percentHeight"); //NOI18N
 299         assert propertyMeta instanceof DoublePropertyMetadata;
 300         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 301     }
 302 
 303     public static void setPercentHeight(
 304             final FXOMInstance instance, final Class<?> clazz, final double value) {
 305         assert instance != null && clazz != null;
 306         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 307         final PropertyMetadata propertyMeta
 308                 = getPropertyMetadata(clazz, "percentHeight"); //NOI18N
 309         assert propertyMeta instanceof DoublePropertyMetadata;
 310         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 311     }
 312 
 313     public static double getPercentWidth(
 314             final FXOMInstance instance, final Class<?> clazz) {
 315         assert instance != null && clazz != null;
 316         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 317         final PropertyMetadata propertyMeta
 318                 = getPropertyMetadata(clazz, "percentWidth"); //NOI18N
 319         assert propertyMeta instanceof DoublePropertyMetadata;
 320         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 321     }
 322 
 323     public static void setPercentWidth(
 324             final FXOMInstance instance, final Class<?> clazz, final double value) {
 325         assert instance != null && clazz != null;
 326         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 327         final PropertyMetadata propertyMeta
 328                 = getPropertyMetadata(clazz, "percentWidth"); //NOI18N
 329         assert propertyMeta instanceof DoublePropertyMetadata;
 330         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 331     }
 332 
 333     public static double getPrefHeight(
 334             final FXOMInstance instance, final Class<?> clazz) {
 335         assert instance != null && clazz != null;
 336         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 337         final PropertyMetadata propertyMeta
 338                 = getPropertyMetadata(clazz, "prefHeight"); //NOI18N
 339         assert propertyMeta instanceof DoublePropertyMetadata;
 340         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 341     }
 342 
 343     public static void setPrefHeight(
 344             final FXOMInstance instance, final Class<?> clazz, final double value) {
 345         assert instance != null && clazz != null;
 346         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 347         final PropertyMetadata propertyMeta
 348                 = getPropertyMetadata(clazz, "prefHeight"); //NOI18N
 349         assert propertyMeta instanceof DoublePropertyMetadata;
 350         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 351     }
 352 
 353     public static void setPrefViewportHeight(
 354             final FXOMInstance instance, final Class<?> clazz, final double value) {
 355         assert instance != null && clazz != null;
 356         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 357         final PropertyMetadata propertyMeta
 358                 = getPropertyMetadata(clazz, "prefViewportHeight"); //NOI18N
 359         assert propertyMeta instanceof DoublePropertyMetadata;
 360         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 361     }
 362 
 363     public static void setPrefViewportWidth(
 364             final FXOMInstance instance, final Class<?> clazz, final double value) {
 365         assert instance != null && clazz != null;
 366         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 367         final PropertyMetadata propertyMeta
 368                 = getPropertyMetadata(clazz, "prefViewportWidth"); //NOI18N
 369         assert propertyMeta instanceof DoublePropertyMetadata;
 370         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 371     }
 372 
 373     public static double getPrefWidth(
 374             final FXOMInstance instance, final Class<?> clazz) {
 375         assert instance != null && clazz != null;
 376         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 377         final PropertyMetadata propertyMeta
 378                 = getPropertyMetadata(clazz, "prefWidth"); //NOI18N
 379         assert propertyMeta instanceof DoublePropertyMetadata;
 380         return ((DoublePropertyMetadata) propertyMeta).getValue(instance);
 381     }
 382 
 383     public static void setPrefWidth(
 384             final FXOMInstance instance, final Class<?> clazz, final double value) {
 385         assert instance != null && clazz != null;
 386         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 387         final PropertyMetadata propertyMeta
 388                 = getPropertyMetadata(clazz, "prefWidth"); //NOI18N
 389         assert propertyMeta instanceof DoublePropertyMetadata;
 390         ((DoublePropertyMetadata) propertyMeta).setValue(instance, value);
 391     }
 392 
 393     public static String getVAlignment(
 394             final FXOMInstance instance, final Class<?> clazz) {
 395         assert instance != null && clazz != null;
 396         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 397         final PropertyName propertyName = new PropertyName("valignment");  //NOI18N
 398         final FXOMProperty property = instance.getProperties().get(propertyName);
 399         if (property == null) {
 400             return null;
 401         } else {
 402             final PropertyMetadata propertyMeta
 403                     = getPropertyMetadata(clazz, "valignment"); //NOI18N
 404             assert propertyMeta instanceof EnumerationPropertyMetadata;
 405             return ((EnumerationPropertyMetadata) propertyMeta).getValue(instance);
 406         }
 407     }
 408 
 409     public static void setVAlignment(
 410             final FXOMInstance instance, final Class<?> clazz, final String value) {
 411         assert instance != null && clazz != null;
 412         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 413         final PropertyMetadata propertyMeta
 414                 = getPropertyMetadata(clazz, "valignment"); //NOI18N
 415         assert propertyMeta instanceof EnumerationPropertyMetadata;
 416         if (value != null) {
 417             ((EnumerationPropertyMetadata) propertyMeta).setValue(instance, value);
 418         }
 419     }
 420 
 421     public static String getVGrow(
 422             final FXOMInstance instance, final Class<?> clazz) {
 423         assert instance != null && clazz != null;
 424         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 425         final PropertyName propertyName = new PropertyName("vgrow");  //NOI18N
 426         final FXOMProperty property = instance.getProperties().get(propertyName);
 427         if (property == null) {
 428             return null;
 429         } else {
 430             final PropertyMetadata propertyMeta
 431                     = getPropertyMetadata(clazz, "vgrow"); //NOI18N
 432             assert propertyMeta instanceof EnumerationPropertyMetadata;
 433             return ((EnumerationPropertyMetadata) propertyMeta).getValue(instance);
 434         }
 435     }
 436 
 437     public static void setVGrow(
 438             final FXOMInstance instance, final Class<?> clazz, final String value) {
 439         assert instance != null && clazz != null;
 440         assert clazz.isAssignableFrom(instance.getDeclaredClass());
 441         final PropertyMetadata propertyMeta
 442                 = getPropertyMetadata(clazz, "vgrow"); //NOI18N
 443         assert propertyMeta instanceof EnumerationPropertyMetadata;
 444         if (value != null) {
 445             ((EnumerationPropertyMetadata) propertyMeta).setValue(instance, value);
 446         }
 447     }
 448 
 449     // Returns a String with no trailing zero; if decimal part is non zero then
 450     // it is kept.
 451     public static String getStringFromDouble(double value) {
 452         String res = Double.toString(value);
 453         if(res.endsWith(".0")) { //NOI18N
 454             res = Integer.toString((int)value);
 455         }
 456         return res;
 457     }
 458 
 459     /*
 460      * Private
 461      */
 462     private static PropertyMetadata getPropertyMetadata(
 463             final Class<?> componentClass, final String name) {
 464 
 465         final ComponentClassMetadata componentClassMetadata
 466                 = Metadata.getMetadata().queryComponentMetadata(componentClass);
 467         final PropertyName propertyName = new PropertyName(name);
 468         return componentClassMetadata.lookupProperty(propertyName);
 469     }
 470 }