Package com.aquafx_project.controls.skin

Source Code of com.aquafx_project.controls.skin.AquaTabPaneSkin

package com.aquafx_project.controls.skin;

import java.util.List;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TabPane.TabClosingPolicy;

import com.sun.javafx.scene.control.skin.TabPaneSkin;

public class AquaTabPaneSkin extends TabPaneSkin implements AquaSkin{
//public class AquaTabPaneSkin extends TabPaneSkinHack {

    public AquaTabPaneSkin(TabPane tabPane) {
        super(tabPane);

        definePillPosition();
        adjustBorders();

        /**
         * Tabs are not closeable in Aqua
         */
        tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
       
        addInactiveState();
    }

    @Override protected void handleControlPropertyChanged(String property) {
        super.handleControlPropertyChanged(property);
        if ("SIDE".equals(property)) {
            definePillPosition();
        }
        if ("SELECTED_TAB".equals(property)) {
            adjustBorders();
        }
    }

    private void definePillPosition() {
        ObservableList<Tab> list = getSkinnable().getTabs();
        for (Tab tab : list) {
            tab.getStyleClass().removeAll("first-tab", "last-tab", "single-tab");
        }
        if (list.size() > 1) {
            if (getSkinnable().getSide() == Side.TOP || getSkinnable().getSide() == Side.RIGHT) {
                list.get(0).getStyleClass().add("first-tab");
                list.get(list.size() - 1).getStyleClass().add("last-tab");
            } else if (getSkinnable().getSide() == Side.BOTTOM || getSkinnable().getSide() == Side.LEFT) {
                list.get(0).getStyleClass().add("last-tab");
                list.get(list.size() - 1).getStyleClass().add("first-tab");
            }
        } else if(list.size() == 1){
            list.get(0).getStyleClass().add("single-tab");
        }
    }

    private void adjustBorders() {
        boolean foundSelected = false;
        List<Tab> tabs = getSkinnable().getTabs();
        Tab selectedTab = getSkinnable().getSelectionModel().getSelectedItem();
        for (Tab tab : tabs) {
            tab.getStyleClass().remove("neighbor");
            if (foundSelected) {
                tab.getStyleClass().add("neighbor");
                foundSelected = false;
            }
            if (tab.equals(selectedTab)) {
                foundSelected = true;
            }
        }
    }
   
    private void addInactiveState() {

        final ChangeListener<Boolean> windowFocusChangedListener = new ChangeListener<Boolean>() {

            @Override public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldValue, Boolean newValue) {
                if (newValue != null) {
                    if (newValue.booleanValue()) {
                        getSkinnable().getStyleClass().remove("inactive");
                    } else {
                        getSkinnable().getStyleClass().add("inactive");
                    }
                }
            }
        };

        getSkinnable().sceneProperty().addListener(new ChangeListener<Scene>() {

            @Override public void changed(ObservableValue<? extends Scene> observableValue, Scene oldScene, Scene newScene) {
                if (oldScene != null && oldScene.getWindow() != null) {
                    oldScene.getWindow().focusedProperty().removeListener(windowFocusChangedListener);
                }
                if (newScene != null && newScene.getWindow() != null) {
                    newScene.getWindow().focusedProperty().addListener(windowFocusChangedListener);
                }
            }
        });

        if (getSkinnable().getScene() != null && getSkinnable().getScene().getWindow() != null) {
            getSkinnable().getScene().getWindow().focusedProperty().addListener(windowFocusChangedListener);
        }
    }
}
TOP

Related Classes of com.aquafx_project.controls.skin.AquaTabPaneSkin

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.