package org.swtchart.ext.internal.properties;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.swtchart.ext.InteractiveChart;

/**
 * Abstract class for properties page with selector.
 */
abstract public class AbstractSelectorPage extends AbstractPage {

    /** the list */
    protected List list;

    /** the selector name */
    private String selector;

    /** the state indicating if selector is enabled */
    private boolean selectorEnabled;

    /** the selected index */
    protected int selectedIndex;

    /**
     * Constructor.
     * 
     * @param chart
     *            the chart
     * @param resources
     *            the properties resources
     * @param title
     *            the title
     * @param selector
     *            the selector name
     */
    public AbstractSelectorPage(InteractiveChart chart,
            PropertiesResources resources, String title, String selector) {
        super(chart, resources, title);
        this.selector = selector;
        selectedIndex = 0;
        selectorEnabled = true;
    }

    /*
     * @see PreferencePage#createContents(Composite)
     */
    @Override
    protected Control createContents(Composite parent) {
        String[] items = getListItems();
        if (items.length < 2) {
            selectorEnabled = false;
        }

        Composite composite = new Composite(parent, SWT.NONE);
        if (selectorEnabled) {
            GridLayout layout = new GridLayout(3, true);
            layout.marginHeight = 0;
            layout.marginWidth = 0;
            composite.setLayout(layout);

            Label label = new Label(composite, SWT.NULL);
            label.setText(selector);
            GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
            gridData.horizontalSpan = 3;
            label.setLayoutData(gridData);

            addLeftPanel(composite, items);
            addRightPanel(composite);
        } else {
            GridLayout layout = new GridLayout(1, true);
            layout.marginHeight = 0;
            layout.marginWidth = 0;
            composite.setLayout(layout);
            addRightPanelContents(composite);
        }

        selectInitialValues();
        updateControlSelections();

        return composite;
    }

    /**
     * Gets the list items.
     * 
     * @return the list items
     */
    abstract protected String[] getListItems();

    /**
     * Selects value for each control.
     */
    abstract protected void selectInitialValues();

    /**
     * Adds the left panel.
     * 
     * @param parent
     *            the parent to add the left panel
     * @param items
     *            the items to be added to list
     */
    private void addLeftPanel(Composite parent, String[] items) {
        Composite leftPanel = new Composite(parent, SWT.NULL);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.horizontalSpan = 1;
        leftPanel.setLayoutData(gridData);

        GridLayout layout = new GridLayout(1, false);
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        leftPanel.setLayout(layout);

        list = new List(leftPanel, SWT.BORDER);
        GridData gridData2 = new GridData(GridData.FILL_BOTH);
        gridData2.horizontalSpan = 1;
        list.setLayoutData(gridData2);
        for (String item : items) {
            list.add(item);
        }

        list.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                selectedIndex = list.getSelectionIndex();
                updateControlSelections();
            }
        });
        list.select(0);
    }

    /**
     * Adds the right panel.
     * 
     * @param parent
     *            the parent to add the right panel
     */
    private void addRightPanel(Composite parent) {
        Composite rightPanel = new Composite(parent, SWT.NULL);
        GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.horizontalSpan = 2;
        rightPanel.setLayoutData(gridData);
        rightPanel.setLayout(new GridLayout(1, false));

        addRightPanelContents(rightPanel);
    }

    /**
     * Adds the contents on right panel.
     * 
     * @param parent
     *            the parent to add the contents
     */
    abstract protected void addRightPanelContents(Composite parent);

    /**
     * Updates the selection on controls.
     */
    abstract protected void updateControlSelections();
}
