Java 类javafx.scene.control.TableColumnBase 实例源码

项目:Gargoyle    文件:CNestedTableColumnHeader.java   
public CNestedTableColumnHeader(final TableViewSkinBase skin, final TableColumnBase tc) {
        super(skin, tc);
        this.skin = skin;
//      ((CTableView) skin.getSkinnable()).fixingColumnsAllowedProperty().addListener(new ChangeListener<Boolean>() {
//
//          @Override
//          public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
//              CellView.getValue(() -> {
//                  if (tc != null) {
//                      tc.setContextMenu(getColumnContextMenu());
//                  }
//
//              });
//          }
//      });
    }
项目:openjfx-8u-dev-tests    文件:ApplicationInteractionFunctions.java   
protected Collection<TableColumnBase> getTopLevelColumns() {
    return new GetAction<Collection<TableColumnBase>>() {

        @Override
        public void run(Object... parameters) throws Exception {
            Collection<TableColumnBase> cols;
            Control control = testedControl.getControl();

            if (isTableTests) {
                cols = ((TableView) control).getColumns();
            } else {
                cols = ((TreeTableView) control).getColumns();
            }
            setResult(cols);
        }
    }.dispatch(testedControl.getEnvironment());
}
项目:openjfx-8u-dev-tests    文件:ApplicationInteractionFunctions.java   
protected void sortColumnsByName(final boolean isAscending) {
    new GetAction<Object>() {
        private Comparator<TableColumnBase> comparator = new Comparator<TableColumnBase>() {
            public int compare(TableColumnBase o1, TableColumnBase o2) {
                int result = o1.getText().compareTo(o2.getText());
                return isAscending ? result : -result;
            }
        };

        @Override
        public void run(Object... os) throws Exception {
            if (isTableTests) {
                FXCollections.sort(((TableView) testedControl.getControl()).getColumns(), comparator);
            } else {
                FXCollections.sort(((TreeTableView) testedControl.getControl()).getColumns(), comparator);
            }
        }
    }.dispatch(testedControl.getEnvironment());

    try {
        TimeUnit.MILLISECONDS.sleep(1000);
    } catch (Exception e) {
    }
}
项目:Gargoyle    文件:CTableRowSkin.java   
@Override
protected TableCell<T, ?> getCell(TableColumnBase tcb) {
    TableColumn tableColumn = (TableColumn<T, ?>) tcb;
    TableCell cell = (TableCell) tableColumn.getCellFactory().call(tableColumn);

    // we set it's TableColumn, TableView and TableRow
    cell.updateTableColumn(tableColumn);
    cell.updateTableView(tableColumn.getTableView());
    cell.updateTableRow(getSkinnable());

    return cell;
}
项目:Gargoyle    文件:CTableRowSkin.java   
private void recreateCells() {
    if (cellsMap != null) {
        Collection<Reference<TableCell<T, ?>>> cells = cellsMap.values();
        Iterator<Reference<TableCell<T, ?>>> cellsIter = cells.iterator();
        while (cellsIter.hasNext()) {
            Reference<TableCell<T, ?>> cellRef = cellsIter.next();
            TableCell<T, ?> cell = cellRef.get();
            if (cell != null) {
                cell.updateIndex(-1);
                cell.getSkin().dispose();
                cell.setSkin(null);
            }
        }
        cellsMap.clear();
    }

    ObservableList<? extends TableColumnBase/* <T,?> */> columns = getVisibleLeafColumns();

    cellsMap = new WeakHashMap<TableColumnBase, Reference<TableCell<T, ?>>>(columns.size());
    fullRefreshCounter = DEFAULT_FULL_REFRESH_COUNTER;
    getChildren().clear();

    for (TableColumnBase col : columns) {
        if (cellsMap.containsKey(col)) {
            continue;
        }

        // create a TableCell for this column and store it in the cellsMap
        // for future use
        createCell(col);
    }
}
项目:Gargoyle    文件:CTableRowSkin.java   
private TableCell<T, ?> createCell(TableColumnBase col) {
    // we must create a TableCell for this table column
    TableCell<T, ?> cell = getCell(col);

    // and store this in our HashMap until needed
    cellsMap.put(col, new WeakReference<>(cell));

    return cell;
}
项目:openjfx-8u-dev-tests    文件:TableViewNewTest.java   
void setSortOrder(final List<ColumnState> newColumnStates) {
    new GetAction<Object>() {
        @Override
        public void run(Object... parameters) throws Exception {
            ObservableList<TableColumnBase> columns = observableArrayList(getTopLevelColumns());

            ObservableList<TableColumnBase> columnSortOrder
                    = isTableTests
                    ? ((TableView) testedControl.getControl()).getSortOrder()
                    : ((TreeTableView) testedControl.getControl()).getSortOrder();

            columnSortOrder.clear();

            for (ColumnState columnState : newColumnStates) {
                TableColumnBase col = columns.get(columnState.columnIndex);
                setSortType(col, columnState.sortType);
                checkSortType(col, columnState.sortType);
                col.setSortable(columnState.sortable);
                columnSortOrder.add(col);
            }
        }
    }.dispatch(testedControl.getEnvironment());

    //Animation delay
    try {
        Thread.sleep(100);
    } catch (Exception e) {
    }
}
项目:openjfx-8u-dev-tests    文件:TableViewNewTest.java   
static void checkSortType(TableColumnBase col, ColumnState.SortTypeProvider type) {
    if (isTableTests) {
        assertTrue(((TableColumn) col).getSortType().equals(type.forTableColumn()));
    } else {
        assertTrue(((TreeTableColumn) col).getSortType().equals(type.forTreeTableColumn()));
    }
}
项目:openjfx-8u-dev-tests    文件:TableViewNewTest.java   
static void setSortType(TableColumnBase col, ColumnState.SortTypeProvider type) {
    if (isTableTests) {
        ((TableColumn) col).setSortType(type.forTableColumn());
    } else {
        ((TreeTableColumn) col).setSortType(type.forTreeTableColumn());
    }
}
项目:openjfx-8u-dev-tests    文件:TableViewNewTest.java   
protected void applyStyleOnColumn(final TableColumnBase column, final String style) {
    new GetAction() {
        @Override
        public void run(Object... os) throws Exception {
            column.setStyle(style);
        }
    }.dispatch(testedControl.getEnvironment());
}
项目:openjfx-8u-dev-tests    文件:TableCellItemParent.java   
protected void doRefresh() {
    List<? extends TableColumnBase> columns = tableViewOp.getDataColumns();
    for (int r = 0; r < tableViewOp.getItems().size(); r++) {
        for (int c = 0; c < columns.size(); c++) {
            getFound().add(new Point(c, r));
            getAux().add(getType().cast(columns.get(c).getCellData(tableViewOp.getRow(r))));
        }
    }
}
项目:openjfx-8u-dev-tests    文件:TreeTableViewWrap.java   
/**
 * @return List of columns, which are on the last level (leaf columns) of
 * tree table header. In the case of nested columns, some columns are
 * parents, and some are children. This method returns the list of columns,
 * which have no children. Those columns correspond to the realy shown
 * columns of data in TreeTableView.
 */
@Property(DATA_COLUMNS_PROP_NAME)
public List<TreeTableColumn> getDataColumns() {
    return new GetAction<java.util.List<TreeTableColumn>>() {
        @Override
        public void run(Object... parameters) throws Exception {
            ArrayList fillList = new ArrayList<TableColumnBase>();
            TableViewWrap.getLastLevelColumns((java.util.List<? extends TableColumnBase>) getControl().getColumns(), fillList);
            setResult((java.util.List) fillList);
        }
    }.dispatch(getEnvironment());
}
项目:openjfx-8u-dev-tests    文件:TreeTableCellParent.java   
protected void doRefresh() {
    List<? extends TableColumnBase> columns = getColumns();
    for (int r = 0; r < getItemsSize(); r++) {
        for (int c = 0; c < columns.size(); c++) {
            getFound().add(new Point(c, r));
            getAux().add(getType().cast(columns.get(c).getCellData(getRow(r))));
        }
    }
}
项目:jfx-torrent    文件:TableUtils.java   
/**
 * Build a styled column header
 *
 * @param column Target column
 * @param style Target header style
 * @return Built header
 */
public static Node buildColumnHeader(final TableColumnBase<?, ?> column, final String style) {
    final Label columnNameLabel = new Label(column.getText());
    columnNameLabel.getStyleClass().add(style);

    final StackPane columnHeaderNode = new StackPane();
    columnHeaderNode.getChildren().add(columnNameLabel);
    columnHeaderNode.prefWidthProperty().bind(column.widthProperty().subtract(20));
    columnNameLabel.prefWidthProperty().bind(columnHeaderNode.prefWidthProperty());

    return columnHeaderNode;
}
项目:jfx-torrent    文件:TableUtils.java   
/**
 * Store any changes to column order, visibility, and size
 *
 * @param <T> Type of the view object stored in the table
 * @param columns Target columns
 * @param columnVisibilityProperty
 * @param defaultColumnVisibilities
 * @param columnSizeProperty
 * @param defaultColumnSizes
 * @param columnOrderProperty
 * @param defaultColumnOrder
 */
public static <T> void storeColumnStates(final List<? extends TableColumnBase<T, ?>> columns,
        final String columnVisibilityProperty, final String defaultColumnVisibilities,
        final String columnSizeProperty, final String defaultColumnSizes,
        final String columnOrderProperty, final String defaultColumnOrder) {
    final String visibility = columns.stream().map(c -> String.valueOf(c.isVisible())).collect(
            Collectors.joining(GuiProperties.COMPOSITE_PROPERTY_VALUE_SEPARATOR));
    final String sizes = columns.stream().map(c -> String.valueOf(c.getWidth())).collect(
            Collectors.joining(GuiProperties.COMPOSITE_PROPERTY_VALUE_SEPARATOR));
    final String order = columns.stream().map(c -> c.getId()).collect(
            Collectors.joining(GuiProperties.COMPOSITE_PROPERTY_VALUE_SEPARATOR));

    final String oldVisibleColumns = ApplicationPreferences.getProperty(
            columnVisibilityProperty, defaultColumnVisibilities);
    final String oldColumnSizes = ApplicationPreferences.getProperty(
            columnSizeProperty, defaultColumnSizes);
    final String oldColumnOrder = ApplicationPreferences.getProperty(
            columnOrderProperty, defaultColumnOrder);

    if(!visibility.equals(oldVisibleColumns)) {
        ApplicationPreferences.setProperty(columnVisibilityProperty, visibility);
    }
    if(!sizes.equals(oldColumnSizes)) {
        ApplicationPreferences.setProperty(columnSizeProperty, sizes);
    }
    if(!order.equals(oldColumnOrder)) {
        ApplicationPreferences.setProperty(columnOrderProperty, order);
    }
}
项目:jfx-torrent    文件:TableUtils.java   
private static <T> void resetTableHeader(final ObservableList<? extends TableColumnBase<T, ?>> columns,
        final List<CheckMenuItem> columnCheckItems, final TableState<T> columnState,
        final BiConsumer<String, Double> columnResizer) {

    final Map<String, Double> defaultColumnSizeMapping = columnState.getDefaultColumnSizeMapping();
    columns.clear();
    columnCheckItems.forEach(ci -> {
        final String columnId = ci.getId();
        ci.setDisable(false);
        columnResizer.accept(columnId, defaultColumnSizeMapping.get(columnId));
    });
    columnCheckItems.forEach(ci -> ci.setSelected(columnState.getDefaultVisibleColumnNames().contains(ci.getId())));
}
项目:jfx-torrent    文件:TableState.java   
public TableState(final LinkedHashMap<String, ? extends TableColumnBase<T, ?>> columnMappings,
        final Map<String, Boolean> columnVisibilityMapping,
        final Set<String> defaultVisibleColumnNames,
        final Map<String, Double> defaultColumnSizeMapping, final String defaultColumnOrder) {
    this.columnMappings = columnMappings;
    this.columnVisibilityMapping = columnVisibilityMapping;
    this.defaultVisibleColumnNames = defaultVisibleColumnNames;
    this.defaultColumnSizeMapping = defaultColumnSizeMapping;
    this.defaultColumnOrder = defaultColumnOrder;       
}
项目:honest-profiler    文件:ColumnMenuItem.java   
/**
 * Simple Constructor specifying the column along with the header text and or graphic.
 *
 * @param column the column managed by the item
 * @param headerGraphic the header graphic
 */
public ColumnMenuItem(TableColumnBase<?, ?> column, Node headerGraphic)
{
    super();

    this.setSelected(column.isVisible());
    this.setGraphic(headerGraphic);

    // Columns may have a fixed header text defined in the FXML instead of a generated graphic.
    if (headerGraphic == null)
    {
        this.setGraphic(new Text(column.getText()));
    }

    // Originally a binding was used : column.visibleProperty().bind(selectedProperty());
    // However, this apparently conflicts with the internal JavaFX ColumnMenu (or TableMenu) rebuilding, which binds
    // bidirectionally to the property.
    // So both listeners below mimic a bidirectional binding.
    // See : https://bugs.openjdk.java.net/browse/JDK-8136468

    // Toggle column visibility. Double-check visibility to avoid infinite loops with the other listener below.
    selectedProperty().addListener((property, oldValue, newValue) ->
    {
        if (column.isVisible() != newValue)
        {
            column.setVisible(newValue);
        }
    });

    // Toggle menu selection based on column visibility. This is added to keep the selection status in sync with
    // column visibility when other mechanisms toggle the column visibility.
    column.visibleProperty().addListener((property, oldValue, newValue) ->
    {
        setSelected(newValue);
    });
}
项目:honest-profiler    文件:ColumnGroupMenuItem.java   
/**
 * Simple Constructor specifying the menu item text, the visibility and the columns.
 *
 * @param title the menu item text
 * @param visible the visibility of the columns after the menu item has been selected
 * @param columns the columns managed by the item
 */
public ColumnGroupMenuItem(String title, boolean visible, TableColumnBase<?, ?>... columns)
{
    super();

    this.setGraphic(new Text(title));

    List<TableColumnBase<?, ?>> columnList = asList(columns);
    setOnAction(event -> columnList.forEach(column -> column.setVisible(visible)));
}
项目:honest-profiler    文件:ColumnGroupMenuItem.java   
/**
 * Simple Constructor specifying the menu item text, the visibility and collection of columns.
 *
 * @param title the menu item text
 * @param visible the visibility of the columns after the menu item has been selected
 * @param columns the columns managed by the item
 */
public ColumnGroupMenuItem(String title,
                           boolean visible,
                           Collection<TableColumnBase<?, ?>> columns)
{
    super();

    this.setGraphic(new Text(title));

    setOnAction(event -> columns.forEach(column -> column.setVisible(visible)));
}
项目:honest-profiler    文件:AbstractProfileDiffViewController.java   
@Override
protected HBox getColumnHeader(TableColumnBase<?, ?> column, String title,
    ProfileContext profileContext)
{
    HBox header = createColoredLabelContainer(CENTER);

    if (profileContext != null)
    {
        addProfileNr(header, profileContext);
    }

    header.getChildren().add(new Text(title));

    return header;
}
项目:honest-profiler    文件:AbstractProfileViewController.java   
/**
 * Override doing nothing. The {@link AbstractProfileViewController} implementations have fixed column headings
 * defined in the FXML.
 */
@Override
protected HBox getColumnHeader(TableColumnBase<?, ?> column, String title,
    ProfileContext context)
{
    return null;
}
项目:honest-profiler    文件:AbstractViewController.java   
/**
 * Sets the appropriate header for the column, using
 *
 * @param column
 * @param title
 * @param context
 */
private void configureHeader(TableColumnBase<?, ?> column, String title, ProfileContext context)
{
    HBox header = getColumnHeader(column, title, context);
    if (header != null)
    {
        reconfigureColumn(column, header);
    }
}
项目:honest-profiler    文件:FxUtil.java   
/**
 * Set various {@link TableColumnBase} properties. Somehow it's hard to get a TableColumn to resize properly.
 * Therefore, we calculate a fair width ourselves.
 * <p>
 *
 * @param column the {@link TreeTableColumn} to be reconfigured
 * @param graphic the graphic to be displayed in the column header
 */
public static final void reconfigureColumn(TableColumnBase<?, ?> column, HBox graphic)
{
    if (graphic == null)
    {
        return;
    }

    double width = calculateHeaderWidth(graphic);

    column.setGraphic(graphic);
    column.setMinWidth(width);
    column.setPrefWidth(width + 5);
}
项目:Gargoyle    文件:CTableRowSkin.java   
@Override
protected boolean isColumnPartiallyOrFullyVisible(TableColumnBase tc) {
    return tableViewSkin == null ? false : isColumnPartiallyOrFullyVisible((TableColumn) tc);
}
项目:Gargoyle    文件:CTableRowSkin.java   
protected void updateCells(boolean resetChildren) {
    // To avoid a potential memory leak (when the TableColumns in the
    // TableView are created/inserted/removed/deleted, we have a 'refresh
    // counter' that when we reach 0 will delete all cells in this row
    // and recreate all of them.
    if (resetChildren) {
        if (fullRefreshCounter == 0) {
            recreateCells();
        }
        fullRefreshCounter--;
    }

    // if clear isn't called first, we can run into situations where the
    // cells aren't updated properly.
    final boolean cellsEmpty = cells.isEmpty();
    cells.clear();

    TableRow<T> skinnable = getSkinnable();
    final int skinnableIndex = skinnable.getIndex();
    final List<? extends TableColumnBase/* <T,?> */> visibleLeafColumns = getVisibleLeafColumns();

    for (int i = 0, max = visibleLeafColumns.size(); i < max; i++) {
        TableColumnBase<T, ?> col = visibleLeafColumns.get(i);
        System.out.println(col.getText());
        TableCell<T, ?> cell = null;

        if (cellsMap.containsKey(col)) {
            cell = cellsMap.get(col).get();

            // the reference has been gc'd, remove key entry from map
            if (cell == null) {
                cellsMap.remove(col);
            }
        }

        if (cell == null) {
            // if the cell is null it means we don't have it in cache and
            // need to create it
            cell = createCell(col);
        }

        updateCell(cell, skinnable);
        cell.updateIndex(skinnableIndex);
        cells.add(cell);
    }

    // update children of each row
    if (!fixedCellSizeEnabled && (resetChildren || cellsEmpty)) {
        getChildren().setAll(cells);
    }
}
项目:openjfx-8u-dev-tests    文件:TreeTableCellParent.java   
protected List<? extends TableColumnBase> getColumns() {
    return treeTableViewWrap.getDataColumns();
}
项目:JFoenix    文件:JFXNestedTableColumnHeader.java   
public JFXNestedTableColumnHeader(TableViewSkinBase skin, TableColumnBase tc) {
    super(skin, tc);
}
项目:JFoenix    文件:JFXNestedTableColumnHeader.java   
protected TableColumnHeader createTableColumnHeader(TableColumnBase col) {
    return col.getColumns().isEmpty() ?
        new JFXTableColumnHeader(getTableViewSkin(), col) :
        new NestedTableColumnHeader(getTableViewSkin(), col);
}
项目:JFoenix    文件:JFXTableColumnHeader.java   
public JFXTableColumnHeader(TableViewSkinBase skin, TableColumnBase tc) {
    super(skin, tc);
}
项目:jfx-torrent    文件:TableUtils.java   
/**
 * Add context menu to table columns
 *
 * @param <T> Type of the view object stored in the table
 * @param columns Table columns
 * @param tableState Loaded column states
 * @param columnResizer Resetter of columns' widths and order
 */
public static <T> void addTableHeaderContextMenus(final ObservableList<? extends TableColumnBase<T, ?>> columns,
        final TableState<T> tableState, final BiConsumer<String, Double> columnResizer) {
    final ContextMenu headerContextMenu = new ContextMenu();
    final Map<String, CheckMenuItem> menuItemMapping = new HashMap<>();

    columns.forEach(c -> {
        final CheckMenuItem columnVisibleMenuItem = new CheckMenuItem(c.getText());
        columnVisibleMenuItem.setId(c.getId());
        columnVisibleMenuItem.setSelected(true);
        menuItemMapping.put(c.getId(), columnVisibleMenuItem);
        c.setContextMenu(headerContextMenu);

        columnVisibleMenuItem.selectedProperty().addListener((obs, oldV, selected) -> {
            c.setVisible(selected);
            final List<? extends TableColumnBase<T, ?>> visibleColumnHeaders =
                    TableUtils.getVisibleColumnHeaders(columns);

            if(!selected && visibleColumnHeaders.size() == 1) {
                final Optional<MenuItem> lastSelectedMenuItem = headerContextMenu.getItems().stream().filter(
                        mi -> ((CheckMenuItem)mi).isSelected()).findFirst();
                if(lastSelectedMenuItem.isPresent()) {
                    lastSelectedMenuItem.get().setDisable(true);
                }
            }
            else if(selected && visibleColumnHeaders.size() == 2) {
                headerContextMenu.getItems().stream().filter(mi -> mi instanceof CheckMenuItem &&
                    ((CheckMenuItem)mi).isSelected()).forEach(mi -> mi.setDisable(false));
            }
        });

        Platform.runLater(() -> {
            final Optional<? extends TableColumnBase<T, ?>> columnId = columns.stream().filter(
                    tc -> tc.getId().equals(c.getId())).findFirst();
            columnVisibleMenuItem.setSelected(columnId.isPresent()?
                    tableState.getColumnVisibilityMapping().get(columnId.get().getId()) : false);
        });
    });

    tableState.getColumnMappings().values().forEach(c ->
        headerContextMenu.getItems().add(menuItemMapping.get(c.getId())));

    final List<CheckMenuItem> checkMenuItems = headerContextMenu.getItems().stream().map(
            mi -> mi instanceof CheckMenuItem? (CheckMenuItem)mi : null).filter(Objects::nonNull).collect(Collectors.toList());

    final MenuItem resetHeadersMenuItem = new MenuItem("_Reset");
    resetHeadersMenuItem.setOnAction(e -> TableUtils.resetTableHeader(columns, checkMenuItems, tableState, columnResizer));
    headerContextMenu.getItems().addAll(new SeparatorMenuItem(), resetHeadersMenuItem);
}
项目:jfx-torrent    文件:TableUtils.java   
private static final <T> List<? extends TableColumnBase<T, ?>> getVisibleColumnHeaders(
        final ObservableList<? extends TableColumnBase<T, ?>> tableColumns) {
    return tableColumns.stream().filter(TableColumnBase::isVisible).collect(Collectors.toList());
}
项目:jfx-torrent    文件:TableState.java   
public final LinkedHashMap<String, ? extends TableColumnBase<T, ?>> getColumnMappings() {
    return columnMappings;
}
项目:honest-profiler    文件:FlameViewController.java   
@Override
protected HBox getColumnHeader(TableColumnBase<?, ?> column, String title,
    ProfileContext context)
{
    return null;
}
项目:honest-profiler    文件:FlameDiffViewController.java   
@Override
protected HBox getColumnHeader(TableColumnBase<?, ?> column, String title,
    ProfileContext context)
{
    return null;
}
项目:honest-profiler    文件:AbstractViewController.java   
/**
 * Adds an appropriate {@link ColumnMenuItem} to the column view menu item list.
 *
 * @param column the {@link TableColumnBase} for which a menu item will be added
 * @param title the display title for the column
 * @param context the {@link ProfileContext} of the profile for which the column contains data, or null for a Diff
 *            column which contains comparison data between both profiles in a Diff
 */
private void addColumnMenuItem(TableColumnBase<?, ?> column, String title,
    ProfileContext context)
{
    columnViewItems.add(new ColumnMenuItem(column, getColumnHeader(column, title, context)));
}
项目:honest-profiler    文件:AbstractViewController.java   
/**
 * Adds a menu item which controls the visibility of a group of columns.
 *
 * @param title the display title for the menu item
 * @param visible the visibility of the columns after the menu item has been selected
 * @param the columns in the group
 */
protected void addColumnGroupMenuItem(String title, boolean visible,
    TableColumnBase<?, ?>... columns)
{
    columnViewGroupItems.add(new ColumnGroupMenuItem(title, visible, columns));
}
项目:honest-profiler    文件:AbstractViewController.java   
/**
 * Adds a menu item which controls the visibility of a group of columns.
 *
 * @param title the display title for the menu item
 * @param visible the visibility of the columns after the menu item has been selected
 * @param a number of {@link Collection}s containing the columns in the group
 */
protected void addColumnGroupMenuItem(String title, boolean visible,
    Collection<TableColumnBase<?, ?>> columns)
{
    columnViewGroupItems.add(new ColumnGroupMenuItem(title, visible, columns));
}
项目:honest-profiler    文件:AbstractViewController.java   
/**
 * Get the contents of the column header. This method is abstract because different implementing controllers have
 * different requirements. E.g. the Diff views need to include indications of which of the profiles being compared
 * the column data is for.
 * <p>
 * If null is passed as {@link ProfileContext}, this indicates to the subclass that the data for the column is a
 * comparison between both profiles from a {@link DiffEntry}.
 * <p>
 * The method should return null if the column has a fixed text header defined in the FXML (or elsewhere).
 * <p>
 *
 * @param <C> the type of the column
 * @param column the column for which the header contents should be set
 * @param title the display title for the column
 * @param context the {@link ProfileContext} of the profile for which the column contains data, or null for a Diff
 *            column which contains comparison data between both profiles in a Diff
 * @return an {@link HBox} which can be used as header for the column
 */
protected abstract HBox getColumnHeader(TableColumnBase<?, ?> column, String title,
    ProfileContext context);