/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef __com_sun_star_awt_XMetricField_idl__ 
#define __com_sun_star_awt_XMetricField_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
#ifndef __com_sun_star_util_MeasureUnit_idl__ 
#include <com/sun/star/util/MeasureUnit.idl> 
#endif

//============================================================================= 
 
 module com {  module sun {  module star {  module awt {  
 
//============================================================================= 

/** gives access to the value and formatting of a metric field.
 */
interface XMetricField: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
		
	/** sets the value which is displayed in the metric field.
	 */
	void setValue( [in] hyper Value, [in] short FieldUnit ); 
 
	//------------------------------------------------------------------------- 
		
	/** sets the user value which is displayed in the metric field.
	 */
	void setUserValue( [in] hyper Value, [in] short FieldUnit ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the value which is currently displayed in the metric field.
	 */
	hyper getValue( [in] short FieldUnit );

	//------------------------------------------------------------------------- 
		
	/** returns the corrected value which is displayed in the metric field.
	 */
	hyper getCorrectedValue( [in] short FieldUnit ); 
 
	//------------------------------------------------------------------------- 
		
	/** sets the minimum value that can be entered by the user.
	 */
	void setMin( [in] hyper Value, [in] short FieldUnit ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the currently set minimum value that can be entered by the
        user.
	 */
	hyper getMin( [in] short FieldUnit );
 
	//------------------------------------------------------------------------- 
		
	/** sets the maximum value that can be entered by the user.
	 */
	void setMax( [in] hyper Value, [in] short FieldUnit ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the currently set maximum value that can be entered by the
        user.
	 */
	hyper getMax( [in] short FieldUnit );
 
	//------------------------------------------------------------------------- 
		
	/** sets the first value to be set on POS1 key.
	 */    
	void setFirst( [in] hyper Value, [in] short FieldUnit );
 
	//------------------------------------------------------------------------- 
	 
	/** returns the currently set first value which is set on POS1 key.
	 */    
	hyper getFirst( [in] short FieldUnit );
 
	//------------------------------------------------------------------------- 
		
	/** sets the last value to be set on END key.
	 */    
	void setLast( [in] hyper Value, [in] short FieldUnit );
 
	//------------------------------------------------------------------------- 
	 
	/** returns the currently set last value which is set on END key.
	 */    
	hyper getLast( [in] short FieldUnit );
 
	//------------------------------------------------------------------------- 
		
	/** sets the increment value for the spin button.
	 */    
	void setSpinSize( [in] hyper Value ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the currently set increment value for the spin button.
	 */    
	hyper getSpinSize(); 
 
	//------------------------------------------------------------------------- 
		
	/** sets the number of decimals.
	 */    
	void setDecimalDigits( [in] short nDigits ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the currently set number of decimals.
	 */    
	short getDecimalDigits(); 
 
	//------------------------------------------------------------------------- 
		
	/** determines if the format is checked during user input.
	 */    
	void setStrictFormat( [in] boolean bStrict ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns whether the format is currently checked during user input.
	 */    
	boolean isStrictFormat();
    
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
