/*=============================================================================#
 # Copyright (c) 2012, 2021 Original NatTable authors and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0
 # 
 # Contributors:
 #     Original NatTable authors and others - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.waltable.style.editor;

import static org.eclipse.swt.SWT.NONE;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;

import org.eclipse.statet.ecommons.waltable.Messages;
import org.eclipse.statet.ecommons.waltable.style.BorderStyle.LineStyle;


/**
 * Component to select a {@link LineStyle}.
 */
public class LineStylePicker extends Composite {
    
    private final Combo combo;
    
    public LineStylePicker(final Composite parent) {
        super(parent, NONE);
        setLayout(new RowLayout());
        
        this.combo= new Combo(this, SWT.READ_ONLY | SWT.DROP_DOWN);
        this.combo.setItems(new String[] { Messages.getString("LineStylePicker.solid"), Messages.getString("LineStylePicker.dashed"), Messages.getString("LineStylePicker.dotted"), Messages.getString("LineStylePicker.dashdot"), Messages.getString("LineStylePicker.dashdotdot") }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
        this.combo.select(0);
    }
    
    @Override
    public void setEnabled(final boolean enabled) {
        this.combo.setEnabled(enabled);
    }
    
    public void setSelectedLineStyle(final LineStyle lineStyle) {
        int index= 0;
        if (lineStyle.equals(LineStyle.SOLID)) {
			index= 0;
		} else if (lineStyle.equals(LineStyle.DASHED)) {
			index= 1;
		} else if (lineStyle.equals(LineStyle.DOTTED)) {
			index= 2;
		} else if (lineStyle.equals(LineStyle.DASHDOT)) {
			index= 3;
		} else if (lineStyle.equals(LineStyle.DASHDOTDOT)) {
			index= 4;
		}
        this.combo.select(index);
    }
    
    public LineStyle getSelectedLineStyle() {
        final int index= this.combo.getSelectionIndex();
        if (index == 0) {
			return LineStyle.SOLID;
		} else if (index == 1) {
			return LineStyle.DASHED;
		} else if (index == 2) {
			return LineStyle.DOTTED;
		} else if (index == 3) {
			return LineStyle.DASHDOT;
		} else if (index == 4) {
			return LineStyle.DASHDOTDOT;
		}
		else {
			throw new IllegalStateException("never happen"); //$NON-NLS-1$
		}
    }

}
