/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * 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:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.xtext.datamart.common;

import java.util.Locale;

import org.eclipse.osbp.ui.api.datamart.IDatamartBetweenInput;
import org.eclipse.osbp.ui.api.themes.EnumCssClass;

import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.TextField;

public class DatamartBetweenText extends HorizontalLayout implements IDatamartBetweenInput {
	
	private TextField fromInput;
	
	private TextField untilInput; 
	
	private static final long serialVersionUID = -5673052113801450589L;

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public DatamartBetweenText() {
		fromInput = new TextField();
		untilInput = new TextField();
		fromInput.setSizeFull();
		untilInput.setSizeFull();
		addComponent(fromInput);
		addComponent(untilInput);
		addStyleName(EnumCssClass.RANGE_SELECTION.styleName());
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#getFrom()
	 */
	@Override
	public String getFrom() {
		return fromInput.getValue();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#setFrom(java.lang.String)
	 */
	@Override
	public void setFrom(String from) {
		fromInput.setValue((String) from);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#getUntil()
	 */
	@Override
	public String getUntil() {
		return untilInput.getValue();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.xtext.datamart.common.IDatamartBetweenInput#setUntil(java.lang.String)
	 */
	@Override
	public void setUntil(String until) {
		untilInput.setValue((String) until);
	}
	
	@SuppressWarnings("unchecked")
	public TextField getFromInput() {
		return fromInput;
	}

	@SuppressWarnings("unchecked")
	public TextField getUntilInput() {
		return untilInput;
	}

	@Override
	public void addValueChangeListener(ValueChangeListener listener) {
		fromInput.addValueChangeListener(listener);
		untilInput.addValueChangeListener(listener);
	}

	@Override
	public void removeValueChangeListener(ValueChangeListener listener) {
		fromInput.removeValueChangeListener(listener);
		untilInput.removeValueChangeListener(listener);
	}

	
	@Override
	public void setDescription(String description) {
		fromInput.setDescription("[" + description);
		untilInput.setDescription(description + "]");
	}
	
	public void setLocale(Locale locale){
		// Do nothing
	}
	
}
