modules/controls/src/main/java/javafx/scene/control/skin/VirtualContainerBase.java
Print this page
rev 9240 : 8076423: JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization
*** 1,7 ****
/*
! * Copyright (c) 2010, 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) 2010, 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,96 ****
* 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 javafx.scene.control.Control;
import javafx.scene.control.IndexedCell;
import javafx.scene.control.ScrollToEvent;
!
! import com.sun.javafx.scene.control.behavior.BehaviorBase;
/**
* Parent class to control skins whose contents are virtualized and scrollable.
* This class handles the interaction with the VirtualFlow class, which is the
* main class handling the virtualization of the contents of this container.
- *
- * @profile common
*/
! public abstract class VirtualContainerBase<C extends Control, B extends BehaviorBase<C>, I extends IndexedCell> extends BehaviorSkinBase<C, B> {
! protected boolean rowCountDirty;
! public VirtualContainerBase(final C control, B behavior) {
! super(control, behavior);
flow = createVirtualFlow();
control.addEventHandler(ScrollToEvent.scrollToTopIndex(), event -> {
// Fix for RT-24630: The row count in VirtualFlow was incorrect
// (normally zero), so the scrollTo call was misbehaving.
if (rowCountDirty) {
// update row count before we do a scroll
updateRowCount();
rowCountDirty = false;
}
! flow.scrollTo(event.getScrollTarget());
});
}
! /**
! * The virtualized container which handles the layout and scrolling of
! * all the cells.
! */
! protected final VirtualFlow<I> flow;
/**
! * Returns a Cell available to be used in the virtual flow. This means you
! * may return either a previously used, but now unrequired cell, or alternatively
! * create a new Cell instance.
! *
! * Preference is obviously given to reusing cells whenever possible, to keep
! * performance costs down.
*/
! public abstract I createCell();
/**
* This enables skin subclasses to provide a custom VirtualFlow implementation,
* rather than have VirtualContainerBase instantiate the default instance.
*/
! protected VirtualFlow<I> createVirtualFlow() {
! return new VirtualFlow<I>();
}
! /**
! * Returns the total number of items in this container, including those
! * that are currently hidden because they are out of view.
! */
! public abstract int getItemCount();
!
! protected abstract void updateRowCount();
double getMaxCellWidth(int rowsToCount) {
return snappedLeftInset() + flow.getMaxCellWidth(rowsToCount) + snappedRightInset();
}
--- 21,138 ----
* 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 javafx.beans.property.ObjectProperty;
+ import javafx.beans.property.SimpleObjectProperty;
+ import javafx.scene.control.Cell;
import javafx.scene.control.Control;
import javafx.scene.control.IndexedCell;
import javafx.scene.control.ScrollToEvent;
! import javafx.scene.control.SkinBase;
! import javafx.util.Callback;
/**
* Parent class to control skins whose contents are virtualized and scrollable.
* This class handles the interaction with the VirtualFlow class, which is the
* main class handling the virtualization of the contents of this container.
*/
! public abstract class VirtualContainerBase<C extends Control, I extends IndexedCell> extends SkinBase<C> {
!
! /***************************************************************************
! * *
! * Private fields *
! * *
! **************************************************************************/
!
! boolean rowCountDirty;
!
! /**
! * The virtualized container which handles the layout and scrolling of
! * all the cells.
! */
! private final VirtualFlow<I> flow;
!
!
! /***************************************************************************
! * *
! * Constructors *
! * *
! **************************************************************************/
! /**
! *
! * @param control
! */
! public VirtualContainerBase(final C control) {
! super(control);
flow = createVirtualFlow();
control.addEventHandler(ScrollToEvent.scrollToTopIndex(), event -> {
// Fix for RT-24630: The row count in VirtualFlow was incorrect
// (normally zero), so the scrollTo call was misbehaving.
if (rowCountDirty) {
// update row count before we do a scroll
updateRowCount();
rowCountDirty = false;
}
! flow.scrollToTop(event.getScrollTarget());
});
}
!
!
! /***************************************************************************
! * *
! * Abstract API *
! * *
! **************************************************************************/
/**
! * Returns the total number of items in this container, including those
! * that are currently hidden because they are out of view.
*/
! abstract int getItemCount();
!
! abstract void updateRowCount();
!
!
!
! /***************************************************************************
! * *
! * Public API *
! * *
! **************************************************************************/
!
! /** {@inheritDoc} */
! @Override protected void layoutChildren(double x, double y, double w, double h) {
! checkState();
! }
!
!
!
! /***************************************************************************
! * *
! * Private methods *
! * *
! **************************************************************************/
/**
* This enables skin subclasses to provide a custom VirtualFlow implementation,
* rather than have VirtualContainerBase instantiate the default instance.
*/
! VirtualFlow<I> createVirtualFlow() {
! return new VirtualFlow<>();
}
! final VirtualFlow<I> getVirtualFlow() {
! return flow;
! }
double getMaxCellWidth(int rowsToCount) {
return snappedLeftInset() + flow.getMaxCellWidth(rowsToCount) + snappedRightInset();
}
*** 102,116 ****
}
return height + snappedTopInset() + snappedBottomInset();
}
! @Override protected void layoutChildren(double x, double y, double w, double h) {
! checkState();
! }
!
! protected void checkState() {
if (rowCountDirty) {
updateRowCount();
rowCountDirty = false;
}
}
--- 144,154 ----
}
return height + snappedTopInset() + snappedBottomInset();
}
! void checkState() {
if (rowCountDirty) {
updateRowCount();
rowCountDirty = false;
}
}