/**************************************************************
 * 
 * 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_frame_XStatusbarController_idl__
#define __com_sun_star_frame_XStatusbarController_idl__

#ifndef __com_sun_star_awt_Point_idl__
#include <com/sun/star/awt/Point.idl>
#endif

#ifndef __com_sun_star_awt_MouseEvent_idl__
#include <com/sun/star/awt/MouseEvent.idl>
#endif

#ifndef __com_sun_star_awt_Rectangle_idl__
#include <com/sun/star/awt/Rectangle.idl>
#endif

#ifndef __com_sun_star_awt_XGraphics_idl__
#include <com/sun/star/awt/XGraphics.idl>
#endif

//=============================================================================

module com {  module sun {  module star {  module frame {

//=============================================================================
/** is an abstract service for a component which offers a more complex user interface
    to users within a status bar.

    <p>
    A generic status bar field is represented as a simple text field. A status 
    bar controller can be added to a Statusbar and provide information or 
    functions with a more sophisticated user interface.<br/>
    A typical example for status bar controller is a zoom chooser. It shows 
    the current zoom and provides general zoom levels on a popup menu 
    that can be activated by a mouse action for context menus.
    <p>

    @see com::sun::star::frame::XDispatchProvider
    
    @since OOo 2.0
 */
interface XStatusbarController : ::com::sun::star::uno::XInterface
{
    //=============================================================================
    /** is called by a status bar if the mouse position is within the controller 
        and a mouse button has been pressed. If the controller has captured the 
        mouse input this function is also called when the mouse position is not 
        within the controller.
    
        @param aMouseEvent
            current information about the mouse pointer.

        @return
            return <TRUE/> if the event should not be processed and <FALSE/> 
            if the event should be processed by the status bar.
    */
    boolean mouseButtonDown( [in] ::com::sun::star::awt::MouseEvent aMouseEvent );

    //=============================================================================
    /** is called by a status bar if the mouse position is within the controller 
        and a mouse has been moved. If the controller has captured the 
        mouse input this function is also called when the mouse position is not 
        within the controller.
    
        @param aMouseEvent
            current information about the mouse pointer.

        @return
            return <TRUE/> if the event should not be processed and <FALSE/> 
            if the event should be processed by the status bar.
    */
    boolean mouseMove( [in] ::com::sun::star::awt::MouseEvent aMouseEvent );

    //=============================================================================
    /** is called by a status bar if the mouse position is within the controller 
        and a mouse button has been released. If the controller has captured the 
        mouse input this function is also called when the mouse position is not 
        within the controller.
    
        @param aMouseEvent
            current information about the mouse pointer.

        @return
            return <TRUE/> if the event should not be processed and <FALSE/> 
            if the event should be processed by the status bar.
    */
    boolean mouseButtonUp( [in] ::com::sun::star::awt::MouseEvent aMouseEvent );

    //=============================================================================
    /** is called by a status bar if a command event is available for a controller.
    
        @param aPos
            the current mouse position in pixel.

        @param nCommand
            describes which command has been invoked.

        @param bMouseEvent
            <TRUE/> if the command is based on a mouse event, otherwise <FALSE/>.

        @param aData
            for future use only.
    */
    void command( [in] ::com::sun::star::awt::Point aPos,
                  [in] long nCommand,
                  [in] boolean bMouseEvent,
                  [in] any aData );
    
    //=============================================================================
    /** is called by a status bar if the controller has to update the visual
        representation.
    
        @param xGraphics
            a reference to a <type scope="com::sun::star::awt">XGraphics</type>
            which has to be used to update the visual representation.

        @param nCommand
            a <type scope="com::sun::star::awt">Rectangle</type> which
            determine the output rectangle for all drawing operations

        @param nItemID
            the unique ID of the control within the status bar.

        @param nStyle
            reserved for future use.
    */
    void paint( [in] ::com::sun::star::awt::XGraphics xGraphics,
                [in] ::com::sun::star::awt::Rectangle rOutputRectangle,
                [in] long nItemId,
                [in] long nStyle );
    
    //=============================================================================
    /** is called by a status bar if the user clicked with mouse into the 
        field of the corresponding control.
    */
    void click();

    //=============================================================================
    /** is called by a status bar if the user double-clicked with mouse 
        into the field of the corresponding control.
    */
    void doubleClick();
};          

}; }; }; };

#endif
