/**
 *                                                                            
 * 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.ui.api.datamart;

import java.util.Locale;

import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.ui.AbstractField;

public interface IDatamartBetweenInput {

	String getFrom();

	void setFrom(String from);

	String getUntil();

	void setUntil(String until);
	
	<T> AbstractField<T> getFromInput();

	<T> AbstractField<T> getUntilInput();
	
	void setLocale(Locale locale);
	
	/**
	 * Sets the caption.
	 *
	 * @param caption the new caption
	 */
	void setCaption(String caption);

	/**
	 * Sets the description.
	 *
	 * @param description the new description
	 */
	void setDescription(String description);
	
   /**
	 * Adds the value change listener.
	 *
	 * @param listener the listener
	 */
	void addValueChangeListener(ValueChangeListener listener);
	
	/**
	 * Removes the value change listener.
	 *
	 * @param listener the listener
	 */
	void removeValueChangeListener(ValueChangeListener listener);

	
	
}