/*******************************************************************************
 * Copyright (c) 2008-2016 SWTChart project. All rights reserved.
 *
 * This code is distributed under the terms of the Eclipse Public License v1.0
 * which is available at http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.swtchart;

import org.eclipse.swt.graphics.Color;

/**
 * Line series.
 */
public interface ILineSeries extends ISeries {

    /**
     * A plot symbol type.
     */
    public enum PlotSymbolType {

        /** none */
        NONE("None"),

        /** circle */
        CIRCLE("Circle"),

        /** square */
        SQUARE("Square"),

        /** diamond */
        DIAMOND("Diamond"),

        /** triangle */
        TRIANGLE("Triangle"),

        /** inverted triangle */
        INVERTED_TRIANGLE("Inverted Triangle"),

        /** cross */
        CROSS("Cross"),

        /** plus */
        PLUS("Plus");

        /** the label for plot symbol */
        public final String label;

        /**
         * Constructor.
         *
         * @param label
         *            plot symbol label
         */
        private PlotSymbolType(String label) {
            this.label = label;
        }
    }

    /**
     * Gets the symbol type.
     *
     * @return the symbol type
     */
    PlotSymbolType getSymbolType();

    /**
     * Sets the symbol type. If null is given, default type
     * <tt>PlotSymbolType.CIRCLE</tt> will be set.
     *
     * @param type
     *            the symbol type
     */
    void setSymbolType(PlotSymbolType type);

    /**
     * Gets the symbol size in pixels.
     *
     * @return the symbol size
     */
    int getSymbolSize();

    /**
     * Sets the symbol size in pixels. The default size is 4.
     *
     * @param size
     *            the symbol size
     */
    void setSymbolSize(int size);

    /**
     * Gets the symbol color.
     *
     * @return the symbol color
     */
    Color getSymbolColor();

    /**
     * Sets the symbol color. If null is given, default color will be set.
     *
     * @param color
     *            the symbol color
     */
    void setSymbolColor(Color color);

    /**
     * Gets the symbol colors.
     *
     * @return the symbol colors, or empty array if no symbol colors are set.
     */
    Color[] getSymbolColors();

    /**
     * Sets the symbol colors. Typically, the number of symbol colors is the same as the
     * number of plots. If the number of symbol colors is less than the number of plots,
     * the rest of plots will have the common color which is set with
     * <tt>setSymbolColor(Color)</tt>.
     *
     * @param colors
     *            the symbol colors. If <tt>null</tt> or empty array is given, the color
     *            which is set with <tt>setSymbolColor(Color)</tt> will be commonly used
     *            for all plots.
     */
    void setSymbolColors(Color[] colors);

    /**
     * Gets line style.
     *
     * @return line style.
     */
    LineStyle getLineStyle();

    /**
     * Sets line style. If null is given, default line style will be set.
     *
     * @param style
     *            line style
     */
    void setLineStyle(LineStyle style);

    /**
     * Gets the line color.
     *
     * @return the line color
     */
    Color getLineColor();

    /**
     * Sets line color. If null is given, default color will be set.
     *
     * @param color
     *            the line color
     */
    void setLineColor(Color color);

    /**
     * Gets the line width.
     *
     * @return the line width
     */
    int getLineWidth();

    /**
     * Sets the width of line connecting data points and also line drawing
     * symbol if applicable (i.e. <tt>PlotSymbolType.CROSS</tt> or
     * <tt>PlotSymbolType.PLUS</tt>). The default width is 1.
     *
     * @param width
     *            the line width
     */
    void setLineWidth(int width);

    /**
     * Enables the area chart.
     *
     * @param enabled
     *            true if enabling area chart
     */
    void enableArea(boolean enabled);

    /**
     * Gets the state indicating if area chart is enabled.
     *
     * @return true if area chart is enabled
     */
    boolean isAreaEnabled();

    /**
     * Enables the step chart.
     *
     * @param enabled
     *            true if enabling step chart
     */
    void enableStep(boolean enabled);

    /**
     * Gets the state indicating if step chart is enabled.
     *
     * @return true if step chart is enabled
     */
    boolean isStepEnabled();

    /**
     * Gets the anti-aliasing value for drawing line. The default value is
     * <tt>SWT.DEFAULT<tt>.
     *
     * @return the anti-aliasing value which can be <tt>SWT.DEFAULT</tt>,
     *         <tt>SWT.ON</tt> or <tt>SWT.OFF</tt>.
     */
    int getAntialias();

    /**
     * Sets the anti-aliasing value for drawing line.
     * <p>
     * If number of data points is too large, the series is drawn as a
     * collection of dots rather than lines. In this case, the anti-alias
     * doesn't really make effect, and just causes performance degradation.
     * Therefore, client code may automatically enable/disable the anti-alias
     * for each series depending on the number of data points, or alternatively
     * may let end-user configure it.
     *
     * @param antialias
     *            the anti-aliasing value which can be <tt>SWT.DEFAULT</tt>,
     *            <tt>SWT.ON</tt> or <tt>SWT.OFF</tt>.
     */
    void setAntialias(int antialias);
}
