/**************************************************************
 * 
 * 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_XComboBox_idl__ 
#define __com_sun_star_awt_XComboBox_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
#ifndef __com_sun_star_awt_XItemListener_idl__ 
#include <com/sun/star/awt/XItemListener.idl> 
#endif 
 
#ifndef __com_sun_star_awt_XActionListener_idl__ 
#include <com/sun/star/awt/XActionListener.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module awt {  
 
//============================================================================= 
 
/** gives access to the items of a combo box and makes it possible to
	register item and action event listeners.
 */
published interface XComboBox: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
		
	/** registers a listener for item events.
	 */
	[oneway] void addItemListener( [in] com::sun::star::awt::XItemListener l ); 
 
	//------------------------------------------------------------------------- 
		
	/** unregisters a listener for item events.
	 */
	[oneway] void removeItemListener( [in] com::sun::star::awt::XItemListener l ); 
 
	//------------------------------------------------------------------------- 
		
	/** registers a listener for action events.
	 */
	[oneway] void addActionListener( [in] com::sun::star::awt::XActionListener l ); 
 
	//------------------------------------------------------------------------- 
		
	/** unregisters a listener for action events.
	 */
	[oneway] void removeActionListener( [in] com::sun::star::awt::XActionListener l ); 
 
	//------------------------------------------------------------------------- 
		
	/** adds an item at the specified position.
	 */
	[oneway] void addItem( [in] string aItem, [in] short nPos ); 
 
	//------------------------------------------------------------------------- 
		
	/** adds multiple items at the specified position.
	 */
	[oneway] void addItems( [in] sequence<string> aItems, [in] short nPos ); 
 
	//------------------------------------------------------------------------- 
		
	/** removes a number of items at the specified position.
	 */
	[oneway] void removeItems( [in] short nPos, [in] short nCount ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the number of items in the combo box.
	 */
	short getItemCount(); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the item at the specified position.
	 */
	string getItem( [in] short nPos ); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns all items of the combo box.
	 */
	sequence<string> getItems(); 
 
	//------------------------------------------------------------------------- 
	 
	/** returns the number of visible lines in the drop down mode.
	 */
	short getDropDownLineCount(); 
 
	//------------------------------------------------------------------------- 
		
	/** sets the number of visible lines for drop down mode.
	 */
	[oneway] void setDropDownLineCount( [in] short nLines ); 
 
}; 
 
//============================================================================= 
 
}; }; }; };  
 
#endif 
