Class SpreadsheetCellBase

  • All Implemented Interfaces:
    EventTarget, SpreadsheetCell

    public class SpreadsheetCellBase
    extends Object
    implements SpreadsheetCell, EventTarget
    The SpreadsheetCells serve as model for the SpreadsheetView.
    You will provide them when constructing a Grid.

    SpreadsheetCell Types

    Each SpreadsheetCell has its own SpreadsheetCellType which has its own SpreadsheetCellEditor in order to control very closely the possible modifications.

    Different SpreadsheetCellTypes are available depending on the data you want to represent in your SpreadsheetView. You can use the different static method provided in SpreadsheetCellType in order to create the specialized SpreadsheetCell that suits your need.

    If you want to create a SpreadsheetCell of your own, you simply have to use one of the provided constructor. Usually you will let your SpreadsheetCellType create the cells. For example SpreadsheetCellType.StringType.createCell(int, int, int, int, java.lang.String). You will also have to provide a custom SpreadsheetCellEditor.

    Configuration

    You will have to indicate the coordinates of the cell together with the row and column span. You can specify if you want the cell to be editable or not using setEditable(boolean). Be advised that a cell with a rowSpan means that the cell will replace all the cells situated in the rowSpan range. Same with the column span.
    So the best way to handle spanning is to fill your grid with unique cells, and then call at the end GridBase.spanColumn(int, int, int) or GridBase.spanRow(int, int, int). These methods will handle the span for you.

    Format

    Your cell can have its very own format. If you want to display some dates with different format, you just have to create a unique SpreadsheetCellType and then specify for each cell their format with setFormat(String). You will then have the guaranty that all your cells will have a LocalDate as a value, but the value will be displayed differently for each cell. This will also guaranty that copy/paste and other operation will be compatible since every cell will share the same SpreadsheetCellType.
    Here an example :
     SpreadsheetCell cell = SpreadsheetCellType.DATE.createCell(row, column, rowSpan, colSpan,
             LocalDate.now().plusDays((int) (Math.random() * 10))); // Random value
     // given here
     final double random = Math.random();
     if (random < 0.25) {
         cell.setFormat("EEEE d");
     } else if (random < 0.5) {
         cell.setFormat("dd/MM :YY");
     } else {
         cell.setFormat("dd/MM/YYYY");
     }
     
    SpreadsheetCellBase with custom format

    Popup

    Each cell can display a Popup when clicked. This is useful when some non editable cell wants to display several actions to take on the grid. This feature is completely different from the Filter. Filters are shown on one particular row whereas popup can be added to every cell.

    Graphic

    Each cell can have a graphic to display next to the text in the cells. Just use the setGraphic(Node) in order to specify the graphic you want. If you specify an ImageView, the SpreadsheetView will try to resize it in order to fit the space available in the cell. For example :
     cell.setGraphic(new ImageView(new Image(getClass().getResourceAsStream("icons/exclamation.png"))));
     
    SpreadsheetCellBase with graphic

    In addition to that, you can also specify another graphic property to your cell with activateCorner(org.controlsfx.control.spreadsheet.SpreadsheetCell.CornerPosition). This allow you to activate or deactivate some graphics on the cell in every corner. Right now it's a little red triangle but you can modify this in your CSS by using the "cell-corner" style class.
     .cell-corner.top-left{
         -fx-background-color: red;
         -fx-shape : "M 0 0 L 1 0 L 0 1 z";
     }
     
    SpreadsheetCellBase with a styled cell-corner

    You can also customize the tooltip of your SpreadsheetCell by specifying one with setTooltip(java.lang.String).

    Style with CSS

    You can style your cell by specifying some styleClass with getStyleClass(). You just have to create and custom that class in your CSS stylesheet associated with your SpreadsheetView. Also note that all SpreadsheetCell have a "spreadsheet-cell" styleClass added by default. Here is a example :
     cell.getStyleClass().add("row_header");
     
    And in the CSS:
      .spreadsheet-cell.row_header{
         -fx-background-color: #b4d4ad ;
         -fx-background-insets: 0, 0 1 1 0;
         -fx-alignment: center;
     }
     

    Examples

    Here is an example that uses all the pre-built SpreadsheetCellType types. The generation is random here so you will want to replace the logic to suit your needs.
     private SpreadsheetCell<?> generateCell(int row, int column, int rowSpan, int colSpan) {
         List<String> stringListTextCell = Arrays.asList("Shanghai","Paris","New York City","Bangkok","Singapore","Johannesburg","Berlin","Wellington","London","Montreal");
         final double random = Math.random();
         if (random < 0.10) {
             List<String> stringList = Arrays.asList("China","France","New Zealand","United States","Germany","Canada");
             cell = SpreadsheetCellType.LIST(stringList).createCell(row, column, rowSpan, colSpan, stringList.get((int) (Math.random() * 6)));
         } else if (random >= 0.10 && random < 0.25) {
             cell = SpreadsheetCellType.STRING.createCell(row, column, rowSpan, colSpan,stringListTextCell.get((int)(Math.random()*10)));
         } else if (random >= 0.25 && random < 0.75) {
             cell = SpreadsheetCellType.DOUBLE.createCell(row, column, rowSpan, colSpan,(double)Math.round((Math.random()*100)*100)/100);
         } else {
             cell = SpreadsheetCellType.DATE.createCell(row, column, rowSpan, colSpan, LocalDate.now().plusDays((int)(Math.random()*10)));
         }
         return cell;
     }
     
    See Also:
    SpreadsheetView, SpreadsheetCellEditor, SpreadsheetCellType
    • Constructor Detail

      • SpreadsheetCellBase

        public SpreadsheetCellBase​(int row,
                                   int column,
                                   int rowSpan,
                                   int columnSpan)
        Constructs a SpreadsheetCell with the given configuration. Use the SpreadsheetCellType.OBJECT type.
        Parameters:
        row -
        column -
        rowSpan -
        columnSpan -
      • SpreadsheetCellBase

        public SpreadsheetCellBase​(int row,
                                   int column,
                                   int rowSpan,
                                   int columnSpan,
                                   SpreadsheetCellType<?> type)
        Constructs a SpreadsheetCell with the given configuration.
        Parameters:
        row -
        column -
        rowSpan -
        columnSpan -
        type -
    • Method Detail

      • match

        public boolean match​(Object value)
        Verifies that the upcoming cell value can be set to the current cell. This is currently used by the Copy/Paste.
        Specified by:
        match in interface SpreadsheetCell
        Parameters:
        value - the value that needs to be tested
        Returns:
        true if the upcoming cell value can be set to the current cell
      • getItem

        public final Object getItem()
        Returns the value contained in this cell.
        Specified by:
        getItem in interface SpreadsheetCell
        Returns:
        the value contained in this cell
      • isEditable

        public final boolean isEditable()
        Returns true if this cell can be edited.
        Specified by:
        isEditable in interface SpreadsheetCell
        Returns:
        true if this cell is editable
      • setEditable

        public final void setEditable​(boolean editable)
        Change the editable state of this cell
        Specified by:
        setEditable in interface SpreadsheetCell
        Parameters:
        editable - true if this cell should be editable
      • isWrapText

        public boolean isWrapText()
        If a run of text exceeds the width of the Labeled, then this variable indicates whether the text should wrap onto another line.
        Specified by:
        isWrapText in interface SpreadsheetCell
        Returns:
        true if the text should wrap onto another line if it exceeds the width of the Labeled
      • isCellGraphic

        public boolean isCellGraphic()
        Description copied from interface: SpreadsheetCell
        Returns true if this cell contains something particular in its item and a Node given by the CellGraphicFactory will be used to display it.
        Specified by:
        isCellGraphic in interface SpreadsheetCell
        Returns:
        true if this cell item needs to be given to a particular Node
      • setCellGraphic

        public void setCellGraphic​(boolean isBrowser)
        Description copied from interface: SpreadsheetCell
        If isCellGraphic is true, this cell item contains something particular and should be display by using CellGraphicFactory object in the CellView.
        Specified by:
        setCellGraphic in interface SpreadsheetCell
        Parameters:
        isBrowser - if true, a Node will be used to display something particular for the cell
      • setWrapText

        public void setWrapText​(boolean wrapText)
        If a run of text exceeds the width of the Labeled, then this variable indicates whether the text should wrap onto another line.
        Specified by:
        setWrapText in interface SpreadsheetCell
        Parameters:
        wrapText - true if the text should wrap onto another line if it exceeds the width of the Labeled
      • setHasPopup

        public void setHasPopup​(boolean value)
        Sets to true if this cell needs to display a popup when clicked in order to show some MenuItem like a MenuButton.
        Specified by:
        setHasPopup in interface SpreadsheetCell
        Parameters:
        value - true to display a Popup when clicked
      • getFormat

        public final String getFormat()
        Returns the format of this cell or an empty string if no format has been specified.
        Specified by:
        getFormat in interface SpreadsheetCell
        Returns:
        the format of this cell or an empty string if no format has been specified
      • getText

        public final String getText()
        Returns the String representation currently used for display in the SpreadsheetView.
        Specified by:
        getText in interface SpreadsheetCell
        Returns:
        the text representation of the value
      • getRow

        public final int getRow()
        Returns the row index of this cell.
        Specified by:
        getRow in interface SpreadsheetCell
        Returns:
        the row index of this cell
      • getColumn

        public final int getColumn()
        Returns the column index of this cell.
        Specified by:
        getColumn in interface SpreadsheetCell
        Returns:
        the column index of this cell
      • getRowSpan

        public final int getRowSpan()
        Returns how much this cell is spanning in row, 1 means the cell is not spanning.
        Specified by:
        getRowSpan in interface SpreadsheetCell
        Returns:
        how much this cell is spanning in row, 1 is normal
      • setRowSpan

        public final void setRowSpan​(int rowSpan)
        Sets how much this cell is spanning in row. See SpreadsheetCell description for information. You should use Grid.spanRow(int, int, int) instead of using this method directly. 1 means the cell is not spanning. Thus, the rowSpan should not be inferior to 1.
        Specified by:
        setRowSpan in interface SpreadsheetCell
        Parameters:
        rowSpan - the rowSpan for this cell
      • getColumnSpan

        public final int getColumnSpan()
        Returns how much this cell is spanning in column, 1 means the cell is not spanning.
        Specified by:
        getColumnSpan in interface SpreadsheetCell
        Returns:
        how much this cell is spanning in column, 1 is normal.
      • setColumnSpan

        public final void setColumnSpan​(int columnSpan)
        Sets how much this cell is spanning in column. See SpreadsheetCell description for information. You should use Grid.spanColumn(int, int, int) instead of using this method directly. 1 means the cell is not spanning. Thus, the rowSpan should not be inferior to 1.
        Specified by:
        setColumnSpan in interface SpreadsheetCell
        Parameters:
        columnSpan - the columnSpan for this cell
      • getStyleClass

        public final ObservableSet<String> getStyleClass()
        Returns an ObservableList of String of all the style class associated with this cell. You can easily modify its appearance by adding a style class (previously set in CSS).
        Specified by:
        getStyleClass in interface SpreadsheetCell
        Returns:
        an ObservableList of String of all the style class of this cell
      • setStyle

        public void setStyle​(String style)
        A string representation of the CSS style associated with this specific Node. This is analogous to the "style" attribute of an HTML element. Note that, like the HTML style attribute, this variable contains style properties and values and not the selector portion of a style rule.
        Specified by:
        setStyle in interface SpreadsheetCell
        Parameters:
        style - a string representation of the CSS style associated with this specific Node
      • getStyle

        public String getStyle()
        A string representation of the CSS style associated with this specific Node. This is analogous to the "style" attribute of an HTML element. Note that, like the HTML style attribute, this variable contains style properties and values and not the selector portion of a style rule.
        Specified by:
        getStyle in interface SpreadsheetCell
        Returns:
        The inline CSS style associated with this Node. If this Node does not have an inline style, an empty String is returned.
      • styleProperty

        public StringProperty styleProperty()
        A string representation of the CSS style associated with this specific Node. This is analogous to the "style" attribute of an HTML element. Note that, like the HTML style attribute, this variable contains style properties and values and not the selector portion of a style rule.
        Specified by:
        styleProperty in interface SpreadsheetCell
        See Also:
        getStyle(), setStyle(String)
      • setGraphic

        public void setGraphic​(Node graphic)
        Sets a graphic for this cell. It is displayed aside with the text if any is specified. Otherwise it's fully displayed in the cell.
        Specified by:
        setGraphic in interface SpreadsheetCell
        Parameters:
        graphic - a graphic to display for this cell
      • getGraphic

        public Node getGraphic()
        Returns the graphic node associated with this cell. Returns null if nothing has been associated.
        Specified by:
        getGraphic in interface SpreadsheetCell
        Returns:
        the graphic node associated with this cell
      • getTooltip

        public Optional<String> getTooltip()
        Returns the tooltip for this cell.
        Specified by:
        getTooltip in interface SpreadsheetCell
        Returns:
        the tooltip associated with this SpreadsheetCell
      • setTooltip

        public void setTooltip​(String tooltip)
        Set a new tooltip for this cell.
        Parameters:
        tooltip -
      • activateCorner

        public void activateCorner​(SpreadsheetCell.CornerPosition position)
        Activates the given CornerPosition in order to display a little triangle in the cell.
        Specified by:
        activateCorner in interface SpreadsheetCell
        Parameters:
        position - the position where the triangle should be displayed
      • deactivateCorner

        public void deactivateCorner​(SpreadsheetCell.CornerPosition position)
        This deactivates the given CornerPosition so that no triangle will be shown for this cell.
        Specified by:
        deactivateCorner in interface SpreadsheetCell
        Parameters:
        position - the position where the triangle should be removed if displayed
      • isCornerActivated

        public boolean isCornerActivated​(SpreadsheetCell.CornerPosition position)
        Returns true if a triangle is displayed in the cell for the given CornerPosition.
        Specified by:
        isCornerActivated in interface SpreadsheetCell
        Returns:
        true if a triangle is displayed in the cell for the given CornerPosition
      • equals

        public final boolean equals​(Object obj)
        Overrides:
        equals in class Object
      • hashCode

        public final int hashCode()
        Overrides:
        hashCode in class Object
      • addEventHandler

        public void addEventHandler​(EventType<Event> eventType,
                                    EventHandler<Event> eventHandler)
        Registers an event handler to this SpreadsheetCell. The SpreadsheetCell class allows registration of listeners which will be notified when a corner state of the editable state of this SpreadsheetCell have changed.
        Specified by:
        addEventHandler in interface SpreadsheetCell
        Parameters:
        eventType - the type of the events to receive by the handler
        eventHandler - the handler to register
        Throws:
        NullPointerException - if the event type or handler is null
      • removeEventHandler

        public void removeEventHandler​(EventType<Event> eventType,
                                       EventHandler<Event> eventHandler)
        Unregisters a previously registered event handler from this SpreadsheetCell. One handler might have been registered for different event types, so the caller needs to specify the particular event type from which to unregister the handler.
        Specified by:
        removeEventHandler in interface SpreadsheetCell
        Parameters:
        eventType - the event type from which to unregister
        eventHandler - the handler to unregister
        Throws:
        NullPointerException - if the event type or handler is null
      • updateText

        protected void updateText()
        Update the text for the SpreadsheetView. This method is automatically called whenever the item property or the filter property has changed. In addition it can be called manually whenever an update of the text is necessary, e.g. in a case where the item itself has changed to such an amount that the text representation has changed aswell. In this case the item property itself has not changed, so no automatic text update will be triggered.