/**************************************************************
 * 
 * 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_util_XNumberFormatter_idl__ 
#define __com_sun_star_util_XNumberFormatter_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_util_Color_idl__
#include <com/sun/star/util/Color.idl>
#endif

#ifndef __com_sun_star_util_XNumberFormatsSupplier_idl__ 
#include <com/sun/star/util/XNumberFormatsSupplier.idl> 
#endif 
 
#ifndef __com_sun_star_util_NotNumericException_idl__ 
#include <com/sun/star/util/NotNumericException.idl> 
#endif 
 
#ifndef __com_sun_star_util_Color_idl__ 
#include <com/sun/star/util/Color.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module util {  
 
//============================================================================= 
 
/** represents a number formatter.
 */
published interface XNumberFormatter: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** attaches an <type>XNumberFormatsSupplier</type> to this 
		<type>NumberFormatter</type>.

		<p>This <type>NumberFormatter</type> will only use the <type>NumberFormats</type>
		specified in the attached <type>XNumberFormatsSupplier</type>. Without an attached 
		<type>XNumberFormatsSupplier</type>, no formatting is possible.</p>
	 */
	void attachNumberFormatsSupplier( [in] com::sun::star::util::XNumberFormatsSupplier xSupplier ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
				the attached <type>XNumberFormatsSupplier</type>.
	 */
	com::sun::star::util::XNumberFormatsSupplier getNumberFormatsSupplier(); 
 
	//------------------------------------------------------------------------- 
	 
	/** detects the number format in a string which contains a formatted number.
	 */
	long detectNumberFormat( [in] long nKey, 
			 [in] string aString ) 
			raises( com::sun::star::util::NotNumericException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** converts a string which contains a formatted number into a number.
		
		<p>If this is a text format, the string will not be converted.</p>
	 */
	double convertStringToNumber( [in] long nKey, 
			 [in] string aString ) 
			raises( com::sun::star::util::NotNumericException ); 
 
	//------------------------------------------------------------------------- 
	 
	/** converts a number into a string.
	 */
	string convertNumberToString( [in] long nKey, 
			 [in] double fValue ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
				the color which is specified for the given value in the number format,  
				which is otherwise the value of <var>aDefaultColor</var>.
	 */
	com::sun::star::util::Color queryColorForNumber( [in] long nKey, 
			 [in] double fValue, 
			 [in] com::sun::star::util::Color aDefaultColor ); 
 
	//------------------------------------------------------------------------- 
	 
	/** converts a string into another string.
	 */
	string formatString( [in] long nKey, 
			 [in] string aString ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
				the color which is specified for the given string in the number format,  
				which is otherwise the value of <var>aDefaultColor</var>.
	 */
	com::sun::star::util::Color queryColorForString( [in] long nKey, 
			 [in] string aString, 
			 [in] com::sun::star::util::Color aDefaultColor ); 
 
	//------------------------------------------------------------------------- 
	 
	/** converts a number into a string with the specified format.
		
		<p>This string can always be converted back to a number using the same
		format.
		</p>
	 */
	string getInputString( [in] long nKey, 
			 [in] double fValue ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif

