/*******************************************************************************
 * Copyright (c) 2011, 2014 Ericsson
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Mathieu Denis <mathieu.denis@polymtl.ca> - Initial Implementation
 *   Bernd Hufmann - Added Annotations
 *******************************************************************************/

package org.eclipse.tracecompass.internal.tmf.ui.viewers.statistics.model;

import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ViewerComparator;

/**
 * Contains all the information necessary to build a column of the table.
 *
 * @author Mathieu Denis
 */
public class TmfBaseColumnData {

    /**
     * Name of the column.
     */
    private final String fHeader;

    /**
     * Width of the column.
     */
    private final int fWidth;

    /**
     * Alignment of the column.
     */
    private final int fAlignment;

    /**
     * Tooltip of the column.
     */
    private final String fTooltip;

    /**
     * Adapts a StatisticsTreeNode into the content of it's corresponding cell
     * for that column.
     */
    private final ColumnLabelProvider fLabelProvider;

    /**
     * Used to sort elements of this column. Can be null.
     */
    private final @Nullable ViewerComparator fComparator;

    /**
     * Used to draw bar charts in this column. Can be null.
     */
    private final @Nullable ITmfColumnPercentageProvider fPercentageProvider;

    /**
     * Used to draw bar charts in columns.
     */
    public interface ITmfColumnPercentageProvider {

        /**
         * Percentage provider
         *
         * @param node
         *            The statistics tree node
         * @return The value as a percentage
         */
        public double getPercentage(TmfStatisticsTreeNode node);
    }

    /**
     * Constructor with parameters
     *
     * @param h
     *            header of the column. The name will be shown at the top of the
     *            column.
     * @param w
     *            width of the column.
     * @param a
     *            alignment of the text
     * @param t
     *            text to shown as a tooltip when the cursor comes over the
     *            header
     * @param l
     *            provide all the column element
     * @param c
     *            used to compare element between them to be able to classify
     *            the content of the columns
     * @param p
     *            provide the percentage of a specific element
     */
    public TmfBaseColumnData(String h, int w, int a, String t,
            ColumnLabelProvider l, ViewerComparator c,
            ITmfColumnPercentageProvider p) {
        fHeader = h;
        fWidth = w;
        fAlignment = a;
        fTooltip = t;
        fLabelProvider = l;
        fComparator = c;
        fPercentageProvider = p;
    }

    /**
     * Return the column name.
     *
     * @return the name of the column.
     */
    public String getHeader() {
        return fHeader;
    }

    /**
     * Return the width of the column at the creation.
     *
     * @return the width of the column.
     */
    public int getWidth() {
        return fWidth;
    }

    /**
     * Return the alignment of the column.
     *
     * @see org.eclipse.swt.SWT
     * @return an integer representing the alignment inside the column.
     */
    public int getAlignment() {
        return fAlignment;
    }

    /**
     * Provide the text to show in the tooltip when the cursor comes over the
     * column header.
     *
     * @return text to show in the tooltip
     */
    public String getTooltip() {
        return fTooltip;
    }

    /**
     * Return the labelProvider which provides the information to put in column
     * cells.
     *
     * @return a ColumnLabelProvider.
     */
    public ColumnLabelProvider getLabelProvider() {
        return fLabelProvider;
    }

    /**
     * Return a ViewerComparator used to sort viewer's contents.
     *
     * @return the comparator.
     */
    public ViewerComparator getComparator() {
        return fComparator;
    }

    /**
     * Return the provider of the percentage. Used to draw bar charts in
     * columns.
     *
     * @return the percentageProvider.
     */
    public ITmfColumnPercentageProvider getPercentageProvider() {
        return fPercentageProvider;
    }
}
