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; } }