modules/controls/src/main/java/javafx/scene/control/skin/TableCellSkinBase.java

Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization

*** 1,7 **** /* ! * Copyright (c) 2011, 2014, 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 --- 1,7 ---- /* ! * Copyright (c) 2011, 2015, 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
*** 21,89 **** * 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 com.sun.javafx.scene.control.skin; ! import com.sun.javafx.scene.control.behavior.CellBehaviorBase; import javafx.beans.InvalidationListener; import javafx.beans.WeakInvalidationListener; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.scene.control.IndexedCell; import javafx.scene.shape.Rectangle; ! public abstract class TableCellSkinBase<C extends IndexedCell, B extends CellBehaviorBase<C>> extends CellSkinBase<C,B> { ! ! /*************************************************************************** ! * * ! * Static Fields * ! * * ! **************************************************************************/ ! ! // This property is set on the cell when we want to know its actual ! // preferred width, not the width of the associated TableColumn. ! // This is primarily used in NestedTableColumnHeader such that user double ! // clicks result in the column being resized to fit the widest content in ! // the column ! static final String DEFER_TO_PARENT_PREF_WIDTH = "deferToParentPrefWidth"; ! ! /*************************************************************************** * * * Private Fields * * * **************************************************************************/ - // Equivalent to tableColumn.widthProperty() - protected abstract ReadOnlyDoubleProperty columnWidthProperty(); - - // Equivalent to tableColumn.visibleProperty() - protected abstract BooleanProperty columnVisibleProperty(); - boolean isDeferToParentForPrefWidth = false; /*************************************************************************** * * * Constructors * * * **************************************************************************/ ! public TableCellSkinBase(final C control, final B behavior) { ! super(control, behavior); ! ! // init(control) should not be called here - it should be called by the ! // subclass after initialising itself. This is to prevent NPEs (for ! // example, getVisibleLeafColumns() throws a NPE as the control itself ! // is not yet set in subclasses). ! } - protected void init(C control) { // RT-22038 Rectangle clip = new Rectangle(); clip.widthProperty().bind(control.widthProperty()); clip.heightProperty().bind(control.heightProperty()); getSkinnable().setClip(clip); --- 21,80 ---- * 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.scene.control.skin; ! import com.sun.javafx.scene.control.Properties; import javafx.beans.InvalidationListener; import javafx.beans.WeakInvalidationListener; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ReadOnlyDoubleProperty; + import javafx.scene.Node; + import javafx.scene.control.Accordion; + import javafx.scene.control.Control; import javafx.scene.control.IndexedCell; import javafx.scene.shape.Rectangle; ! /** ! * Base skin for table cell controls, for example: ! * {@link javafx.scene.control.TableCell} and {@link javafx.scene.control.TreeTableCell}. ! * ! * @see javafx.scene.control.TableCell ! * @see javafx.scene.control.TreeTableCell ! * @since 9 ! */ ! public abstract class TableCellSkinBase<C extends IndexedCell> extends CellSkinBase<C> { /*************************************************************************** * * * Private Fields * * * **************************************************************************/ boolean isDeferToParentForPrefWidth = false; /*************************************************************************** * * * Constructors * * * **************************************************************************/ ! /** ! * Creates a new TableCellSkinBase instance, installing the necessary child ! * nodes into the Control {@link Control#getChildren() children} list, as ! * well as the necessary {@link Node#getInputMap() input mappings} for ! * handling key, mouse, etc events. ! * ! * @param control The control that this skin should be installed onto. ! */ ! public TableCellSkinBase(final C control) { ! super(control); // RT-22038 Rectangle clip = new Rectangle(); clip.widthProperty().bind(control.widthProperty()); clip.heightProperty().bind(control.heightProperty()); getSkinnable().setClip(clip);
*** 92,104 **** ReadOnlyDoubleProperty columnWidthProperty = columnWidthProperty(); if (columnWidthProperty != null) { columnWidthProperty.addListener(weakColumnWidthListener); } ! registerChangeListener(control.visibleProperty(), "VISIBLE"); ! if (control.getProperties().containsKey(DEFER_TO_PARENT_PREF_WIDTH)) { isDeferToParentForPrefWidth = true; } } --- 83,95 ---- ReadOnlyDoubleProperty columnWidthProperty = columnWidthProperty(); if (columnWidthProperty != null) { columnWidthProperty.addListener(weakColumnWidthListener); } ! registerChangeListener(control.visibleProperty(), e -> getSkinnable().setVisible(columnVisibleProperty().get())); ! if (control.getProperties().containsKey(Properties.DEFER_TO_PARENT_PREF_WIDTH)) { isDeferToParentForPrefWidth = true; } }
*** 107,155 **** * * * Listeners * * * **************************************************************************/ ! private InvalidationListener columnWidthListener = valueModel -> { ! getSkinnable().requestLayout(); ! }; private WeakInvalidationListener weakColumnWidthListener = new WeakInvalidationListener(columnWidthListener); /*************************************************************************** * * ! * Public Methods * * * **************************************************************************/ ! @Override protected void handleControlPropertyChanged(String p) { ! super.handleControlPropertyChanged(p); ! if ("VISIBLE".equals(p)) { ! getSkinnable().setVisible(columnVisibleProperty().get()); ! } ! } @Override public void dispose() { ReadOnlyDoubleProperty columnWidthProperty = columnWidthProperty(); if (columnWidthProperty != null) { columnWidthProperty.removeListener(weakColumnWidthListener); } super.dispose(); } @Override protected void layoutChildren(final double x, final double y, final double w, final double h) { // fit the cell within this space // FIXME the subtraction of bottom padding isn't right here - but it // results in better visuals, so I'm leaving it in place for now. layoutLabelInArea(x, y, w, h - getSkinnable().getPadding().getBottom()); } @Override protected double computePrefWidth(double height, double topInset, double rightInset, double bottomInset, double leftInset) { if (isDeferToParentForPrefWidth) { return super.computePrefWidth(height, topInset, rightInset, bottomInset, leftInset); } return columnWidthProperty().get(); --- 98,154 ---- * * * Listeners * * * **************************************************************************/ ! private InvalidationListener columnWidthListener = valueModel -> getSkinnable().requestLayout(); private WeakInvalidationListener weakColumnWidthListener = new WeakInvalidationListener(columnWidthListener); /*************************************************************************** * * ! * Abstract Methods * * * **************************************************************************/ ! // Equivalent to tableColumn.widthProperty() ! abstract ReadOnlyDoubleProperty columnWidthProperty(); ! ! // Equivalent to tableColumn.visibleProperty() ! abstract BooleanProperty columnVisibleProperty(); ! ! ! ! /*************************************************************************** ! * * ! * Public Methods * ! * * ! **************************************************************************/ + /** {@inheritDoc} */ @Override public void dispose() { ReadOnlyDoubleProperty columnWidthProperty = columnWidthProperty(); if (columnWidthProperty != null) { columnWidthProperty.removeListener(weakColumnWidthListener); } super.dispose(); } + /** {@inheritDoc} */ @Override protected void layoutChildren(final double x, final double y, final double w, final double h) { // fit the cell within this space // FIXME the subtraction of bottom padding isn't right here - but it // results in better visuals, so I'm leaving it in place for now. layoutLabelInArea(x, y, w, h - getSkinnable().getPadding().getBottom()); } + /** {@inheritDoc} */ @Override protected double computePrefWidth(double height, double topInset, double rightInset, double bottomInset, double leftInset) { if (isDeferToParentForPrefWidth) { return super.computePrefWidth(height, topInset, rightInset, bottomInset, leftInset); } return columnWidthProperty().get();