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();