All Downloads are FREE. Search and download functionalities are using the official Maven repository.

javafx.css.FontCssMetaData Maven / Gradle / Ivy

/*
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package javafx.css;

import com.sun.javafx.css.converters.FontConverter;
import com.sun.javafx.css.converters.SizeConverter;
import com.sun.javafx.css.converters.StringConverter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.scene.Node;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;

/**
 * An partial implementation of CssMetaData for Font properties which
 * includes the font sub-properties: weight, style, family and size.
 * @param N The type of Node
 * @since JavaFX 8.0
 */
public abstract class FontCssMetaData extends CssMetaData {

    /**
     * The property name is concatenated with "-weight",
     * "-style", "-family" and "-size" to
     * create the sub-properties. For example,
     * {@code new FontCssMetaData("-fx-font", Font.getDefault());}
     * will create a CssMetaData for "-fx-font" with
     * sub-properties: "-fx-font-weight",
     * "-fx-font-style", "-fx-font-family"
     * and "-fx-font-size"
     * @param property
     * @param initial
     */
    /**
     * The property name is concatenated with "-weight",
     * "-style", "-family" and "-size" to
     * create the sub-properties. For example,
     * {@code new FontCssMetaData("-fx-font", Font.getDefault());}
     * will create a CssMetaData for "-fx-font" with
     * sub-properties: "-fx-font-weight",
     * "-fx-font-style", "-fx-font-family"
     * and "-fx-font-size"
     * @param property
     * @param initial
     */
    public FontCssMetaData(String property, Font initial) {
        super(property, FontConverter.getInstance(), initial, true, createSubProperties(property, initial));
    }

    private static  List> createSubProperties(String property, Font initial) {
        
        final List> subProperties = 
                new ArrayList>();
        
        final Font defaultFont = initial != null ? initial : Font.getDefault();
        
        final CssMetaData FAMILY = 
                new CssMetaData(property.concat("-family"), 
                StringConverter.getInstance(), defaultFont.getFamily(), true) {
            @Override
            public boolean isSettable(S styleable) {
                return false;
            }

            @Override
            public StyleableProperty getStyleableProperty(S styleable) {
                return null;
            }
        };
        subProperties.add(FAMILY);
        
        final CssMetaData SIZE = 
                new CssMetaData(property.concat("-size"), 
                SizeConverter.getInstance(), defaultFont.getSize(), true) {
            @Override
            public boolean isSettable(S styleable) {
                return false;
            }

            @Override
            public StyleableProperty getStyleableProperty(S styleable) {
                return null;
            }
        };
        subProperties.add(SIZE);
        
        final CssMetaData STYLE = 
                new CssMetaData(property.concat("-style"), 
                FontConverter.FontStyleConverter.getInstance(), FontPosture.REGULAR, true) {
            @Override
            public boolean isSettable(S styleable) {
                return false;
            }

            @Override
            public StyleableProperty getStyleableProperty(S styleable) {
                return null;
            }
        };
        subProperties.add(STYLE);
        
        final CssMetaData WEIGHT = 
                new CssMetaData(property.concat("-weight"), 
                FontConverter.FontWeightConverter.getInstance(), FontWeight.NORMAL, true) {
            @Override
            public boolean isSettable(S styleable) {
                return false;
            }

            @Override
            public StyleableProperty getStyleableProperty(S styleable) {
                return null;
            }
        };
        subProperties.add(WEIGHT);
        
        return Collections.>unmodifiableList(subProperties);
    }
    
}