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

javafx.scene.template.Template Maven / Gradle / Ivy

There is a newer version: 18-ea+1
Show newest version
/*
 * Copyright (c) 2020, JFXCore. 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. JFXCore designates this
 * particular file as subject to the "Classpath" exception as provided
 * 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.
 */

package javafx.scene.template;

import javafx.beans.DefaultProperty;
import javafx.scene.Node;
import java.util.Map;
import java.util.function.Predicate;

@DefaultProperty("content")
@TemplateContentProperty("content")
public class Template {

    private TemplateContent content;
    private TemplateContent editingContent;
    private Predicate selector;

    public TemplateContent getContent() {
        return content;
    }

    public void setContent(TemplateContent content) {
        this.content = content;
    }

    public TemplateContent getEditingContent() {
        return editingContent;
    }

    public void setEditingContent(TemplateContent editingContent) {
        this.editingContent = editingContent;
    }

    public Predicate getSelector() {
        return selector;
    }

    public void setSelector(Predicate selector) {
        this.selector = selector;
    }

    /**
     * Tries to find a template in the scene graph that matches the specified item.
     */
    @SuppressWarnings("unchecked")
    public static  Template find(Node node, Object item) {
        if (node.hasProperties()) {
            for (Map.Entry entry : node.getProperties().entrySet()) {
                if (entry.getValue() instanceof Template) {
                    Predicate selector = ((Template)entry.getValue()).getSelector();
                    if (selector != null) {
                        if (selector.test(item)) {
                            return (Template)entry.getValue();
                        }
                    } else if (entry.getKey() instanceof Class && ((Class)entry.getKey()).isInstance(item)) {
                        return (Template)entry.getValue();
                    }
                }
            }
        }

        Node parent = node.getParent();
        if (parent != null) {
            return find(parent, item);
        }

        return null;
    }

    /**
     * Determines whether the template matches the specified item.
     */
    public static  boolean match(Template template, Object item) {
        Predicate selector = template.getSelector();
        return selector == null || selector.test(item);
    }

    public static  TemplateContent getContent(Template template, boolean editing) {
        if (editing) {
            TemplateContent content = template.getEditingContent();
            if (content != null) {
                return content;
            }
        }

        return template.getContent();
    }

}