package org.swtchart.ext.internal.properties;

import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.swtchart.IAxis;
import org.swtchart.LineStyle;
import org.swtchart.IAxis.Direction;
import org.swtchart.ext.InteractiveChart;

/**
 * The grid page on properties dialog.
 */
public class GridPage extends AbstractSelectorPage {

    /** the key for grid foreground */
    private static final String GRID_FOREGROUND = "org.swtchart.grid.foreground";

    /** the axes */
    private IAxis[] axes;

    /** the style combo */
    protected Combo styleCombo;

    /** the foreground button */
    protected ColorSelector foregroundButton;

    /** the line styles */
    protected LineStyle[] styles;

    /** the foreground colors */
    protected RGB[] foregroundColors;

    /**
     * Constructor.
     * 
     * @param chart
     *            the chart
     * @param resources
     *            the properties resources
     * @param direction
     *            the direction
     * @param title
     *            the title
     */
    public GridPage(InteractiveChart chart,
            PropertiesResources resources, Direction direction,
            String title) {
        super(chart, resources, title, "Axes:");
        if (direction == Direction.X) {
            this.axes = chart.getAxisSet().getXAxes();
        } else if (direction == Direction.Y) {
            this.axes = chart.getAxisSet().getYAxes();
        }
        styles = new LineStyle[axes.length];
        foregroundColors = new RGB[axes.length];
    }

    /*
     * @see AbstractSelectorPage#getListItems()
     */
    @Override
    protected String[] getListItems() {
        String[] items = new String[axes.length];
        for (int i = 0; i < items.length; i++) {
            items[i] = String.valueOf(axes[i].getId());
        }
        return items;
    }

    /*
     * @see AbstractSelectorPage#selectInitialValues()
     */
    @Override
    protected void selectInitialValues() {
        for (int i = 0; i < axes.length; i++) {
            styles[i] = axes[i].getGrid().getStyle();
            foregroundColors[i] = axes[i].getGrid().getForeground().getRGB();
        }
    }

    /*
     * @see AbstractSelectorPage#updateControlSelections()
     */
    @Override
    protected void updateControlSelections() {
        styleCombo.setText(String.valueOf(styles[selectedIndex]));
        foregroundButton.setColorValue(foregroundColors[selectedIndex]);
    }

    /*
     * @see AbstractSelectorPage#addRightPanelContents(Composite)
     */
    @Override
    protected void addRightPanelContents(Composite parent) {
        addGridPanel(parent);
    }

    /**
     * Adds the grid panel.
     * 
     * @param parent
     *            the parent to add the grid panel
     */
    private void addGridPanel(Composite parent) {
        Composite group = new Composite(parent, SWT.NONE);
        GridData gridData = new GridData();
        gridData.horizontalSpan = 2;
        group.setLayoutData(gridData);
        group.setLayout(new GridLayout(2, false));

        createLabelControl(group, "Line style:");
        LineStyle[] values = LineStyle.values();
        String[] labels = new String[values.length];
        for (int i = 0; i < values.length; i++) {
            labels[i] = values[i].label;
        }
        styleCombo = createComboControl(group, labels);
        styleCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                String value = styleCombo.getText();
                LineStyle selectedStyle = LineStyle.NONE;
                for (LineStyle style : LineStyle.values()) {
                    if (style.label.equals(value)) {
                        selectedStyle = style;
                    }
                }
                styles[selectedIndex] = selectedStyle;
            }
        });

        createLabelControl(group, "Color:");
        foregroundButton = createColorButtonControl(group);
        foregroundButton.addListener(new IPropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                foregroundColors[selectedIndex] = foregroundButton
                        .getColorValue();
            }
        });
    }

    /*
     * @see AbstractPreferencePage#apply()
     */
    @Override
    public void apply() {
        for (int i = 0; i < axes.length; i++) {
            axes[i].getGrid().setStyle(styles[i]);
            Color color = new Color(Display.getDefault(), foregroundColors[i]);
            axes[i].getGrid().setForeground(color);
            resources.put(GRID_FOREGROUND + axes[i].getDirection()
                    + axes[i].getId(), color);
        }
    }

    /*
     * @see PreferencePage#performDefaults()
     */
    @Override
    protected void performDefaults() {
        styles[selectedIndex] = LineStyle.DOT;
        foregroundColors[selectedIndex] = Display.getDefault().getSystemColor(
                SWT.COLOR_GRAY).getRGB();

        updateControlSelections();

        super.performDefaults();
    }
}
