From ebad0f8ad438fe4d2327aa295a2f36bb062c18e6 Mon Sep 17 00:00:00 2001 From: Jens-Heiner Rechtien Date: Tue, 13 Apr 2004 10:20:04 +0000 Subject: INTEGRATION: CWS frmcontrols02 (1.1.2); FILE ADDED 2004/02/23 07:54:34 fs 1.1.2.2: proper icon size, and high contrast icons (if necessary) 2004/01/23 17:58:54 fs 1.1.2.1: UNO control/peer for a navigation bar --- forms/source/solar/component/navbarcontrol.cxx | 595 +++++++++++++++++++++++++ 1 file changed, 595 insertions(+) create mode 100644 forms/source/solar/component/navbarcontrol.cxx (limited to 'forms/source/solar') diff --git a/forms/source/solar/component/navbarcontrol.cxx b/forms/source/solar/component/navbarcontrol.cxx new file mode 100644 index 000000000000..8b67ac37663a --- /dev/null +++ b/forms/source/solar/component/navbarcontrol.cxx @@ -0,0 +1,595 @@ +/************************************************************************* + * + * $RCSfile: navbarcontrol.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: hr $ $Date: 2004-04-13 11:20:04 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef FORMS_NAVBARCONTROL_HXX +#include "navbarcontrol.hxx" +#endif + +#ifndef FRM_STRINGS_HXX +#include "frm_strings.hxx" +#endif +#ifndef FRM_MODULE_HXX +#include "frm_module.hxx" +#endif + +#ifndef _TOOLS_DEBUG_HXX +#include +#endif + +#ifndef _COM_SUN_STAR_AWT_XVIEW_HPP_ +#include +#endif +#ifndef _COM_SUN_STAR_AWT_POSSIZE_HPP_ +#include +#endif + +#ifndef _SV_SVAPP_HXX +#include +#endif +#ifndef FORMS_SOLAR_CONTROL_NAVTOOLBAR_HXX +#include "navtoolbar.hxx" +#endif +#ifndef _SVX_SVXIDS_HRC +#include +#endif + +//-------------------------------------------------------------------------- +extern "C" void SAL_CALL createRegistryInfo_ONavigationBarControl() +{ + static ::frm::OMultiInstanceAutoRegistration< ::frm::ONavigationBarControl > aAutoRegistration; +} + +//......................................................................... +namespace frm +{ +//......................................................................... + + using namespace ::com::sun::star::uno; + using namespace ::com::sun::star::beans; + using namespace ::com::sun::star::awt; + using namespace ::com::sun::star::lang; + using namespace ::com::sun::star::util; + using namespace ::com::sun::star::frame; + +#define FORWARD_TO_PEER_1( unoInterface, method, param1 ) \ + Reference< unoInterface > xTypedPeer( getPeer(), UNO_QUERY ); \ + if ( xTypedPeer.is() ) \ + { \ + xTypedPeer->method( param1 ); \ + } + +#define FORWARD_TO_PEER_1_RET( returnType, unoInterface, method, param1 ) \ + returnType aReturn; \ + Reference< unoInterface > xTypedPeer( getPeer(), UNO_QUERY ); \ + if ( xTypedPeer.is() ) \ + { \ + aReturn = xTypedPeer->method( param1 ); \ + } \ + return aReturn; + +#define FORWARD_TO_PEER_3( unoInterface, method, param1, param2, param3 ) \ + Reference< unoInterface > xTypedPeer( getPeer(), UNO_QUERY ); \ + if ( xTypedPeer.is() ) \ + { \ + xTypedPeer->method( param1, param2, param3 ); \ + } + +#define FORWARD_TO_PEER_3_RET( returnType, unoInterface, method, param1, param2, param3 ) \ + returnType aReturn; \ + Reference< unoInterface > xTypedPeer( getPeer(), UNO_QUERY ); \ + if ( xTypedPeer.is() ) \ + { \ + aReturn = xTypedPeer->method( param1, param2, param3 ); \ + } \ + return aReturn; + + //================================================================== + // ONavigationBarControl + //================================================================== + DBG_NAME( ONavigationBarControl ) + //------------------------------------------------------------------ + ONavigationBarControl::ONavigationBarControl( const Reference< XMultiServiceFactory >& _rxORB ) + :m_xORB( _rxORB ) + { + DBG_CTOR( ONavigationBarControl, NULL ); + } + + //------------------------------------------------------------------ + ONavigationBarControl::~ONavigationBarControl() + { + DBG_DTOR( ONavigationBarControl, NULL ); + } + + //------------------------------------------------------------------ + IMPLEMENT_FORWARD_XTYPEPROVIDER2( ONavigationBarControl, UnoControl, ONavigationBarControl_Base ) + + //------------------------------------------------------------------ + Any SAL_CALL ONavigationBarControl::queryAggregation( const Type& _rType ) throw ( RuntimeException ) + { + Any aReturn = UnoControl::queryAggregation( _rType ); + + if ( !aReturn.hasValue() ) + aReturn = ONavigationBarControl_Base::queryInterface( _rType ); + + return aReturn; + } + + //------------------------------------------------------------------ + namespace + { + static WinBits getWinBits( const Reference< XControlModel >& _rxModel ) + { + WinBits nBits = 0; + try + { + Reference< XPropertySet > xProps( _rxModel, UNO_QUERY ); + if ( xProps.is() ) + { + sal_Int16 nBorder = 0; + xProps->getPropertyValue( PROPERTY_BORDER ) >>= nBorder; + if ( nBorder ) + nBits |= WB_BORDER; + + sal_Bool bTabStop = sal_False; + if ( xProps->getPropertyValue( PROPERTY_TABSTOP ) >>= bTabStop ) + nBits |= ( bTabStop ? WB_TABSTOP : WB_NOTABSTOP ); + } + } + catch( const Exception& ) + { + DBG_ERROR( "::getWinBits: caught an exception!" ); + } + return nBits; + } + } + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarControl::createPeer( const Reference< XToolkit >& _rToolkit, const Reference< XWindowPeer >& _rParentPeer ) throw( RuntimeException ) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + if (!getPeer().is()) + { + mbCreatingPeer = sal_True; + + // determine the VLC window for the parent + Window* pParentWin = NULL; + if ( _rParentPeer.is() ) + { + VCLXWindow* pParentXWin = VCLXWindow::GetImplementation( _rParentPeer ); + if ( pParentXWin ) + pParentWin = pParentXWin->GetWindow(); + DBG_ASSERT( pParentWin, "ONavigationBarControl::createPeer: could not obtain the VCL-level parent window!" ); + } + + // create the peer + ONavigationBarPeer* pPeer = ONavigationBarPeer::Create( m_xORB, pParentWin, getWinBits( getModel() ) ); + DBG_ASSERT( pPeer, "ONavigationBarControl::createPeer: invalid peer returned!" ); + if ( pPeer ) + // by definition, the returned component is aquired once + pPeer->release(); + + // announce the peer to the base class + setPeer( pPeer ); + + // initialize ourself (and thus the peer) with the model properties + updateFromModel(); + + Reference< XView > xPeerView( getPeer(), UNO_QUERY ); + if ( xPeerView.is() ) + { + xPeerView->setZoom( maComponentInfos.nZoomX, maComponentInfos.nZoomY ); + xPeerView->setGraphics( mxGraphics ); + } + + // a lot of initial settings from our component infos + setPosSize( maComponentInfos.nX, maComponentInfos.nY, maComponentInfos.nWidth, maComponentInfos.nHeight, PosSize::POSSIZE ); + + pPeer->setVisible ( maComponentInfos.bVisible && !mbDesignMode ); + pPeer->setEnable ( maComponentInfos.bEnable ); + pPeer->setDesignMode( mbDesignMode ); + + peerCreated(); + + mbCreatingPeer = sal_False; + } + } + + //------------------------------------------------------------------ + ::rtl::OUString SAL_CALL ONavigationBarControl::getImplementationName() throw( RuntimeException ) + { + return getImplementationName_Static(); + } + + //------------------------------------------------------------------ + Sequence< ::rtl::OUString > SAL_CALL ONavigationBarControl::getSupportedServiceNames() throw( RuntimeException ) + { + return getSupportedServiceNames_Static(); + } + + //------------------------------------------------------------------ + ::rtl::OUString SAL_CALL ONavigationBarControl::getImplementationName_Static() + { + return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.form.ONavigationBarControl" ) ); + } + + //------------------------------------------------------------------ + Sequence< ::rtl::OUString > SAL_CALL ONavigationBarControl::getSupportedServiceNames_Static() + { + Sequence< ::rtl::OUString > aServices( 2 ); + aServices[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControl" ) ); + aServices[ 1 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.control.NavigationToolBar" ) ); + return aServices; + } + + //------------------------------------------------------------------ + Reference< XInterface > SAL_CALL ONavigationBarControl::Create( const Reference< XMultiServiceFactory >& _rxFactory ) + { + return *( new ONavigationBarControl( _rxFactory ) ); + } + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarControl::registerDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& _rxInterceptor ) throw (RuntimeException) + { + FORWARD_TO_PEER_1( XDispatchProviderInterception, registerDispatchProviderInterceptor, _rxInterceptor ); + } + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarControl::releaseDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& _rxInterceptor ) throw (RuntimeException) + { + FORWARD_TO_PEER_1( XDispatchProviderInterception, releaseDispatchProviderInterceptor, _rxInterceptor ); + } + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarControl::setDesignMode( sal_Bool _bOn ) throw( RuntimeException ) + { + UnoControl::setDesignMode( _bOn ); + FORWARD_TO_PEER_1( XVclWindowPeer, setDesignMode, _bOn ); + } + + //================================================================== + // ONavigationBarPeer + //================================================================== + DBG_NAME( ONavigationBarPeer ) + //------------------------------------------------------------------ + ONavigationBarPeer* ONavigationBarPeer::Create( const Reference< XMultiServiceFactory >& _rxORB, + Window* _pParentWindow, WinBits _nStyle ) + { + DBG_TESTSOLARMUTEX(); + + // the peer itself + ONavigationBarPeer* pPeer = new ONavigationBarPeer( _rxORB ); + pPeer->acquire(); // by definition, the returned object is aquired once + + // the VCL control for the peer + NavigationToolBar* pNavBar = new NavigationToolBar( _pParentWindow, _nStyle ); + + // some knittings + pNavBar->setDispatcher( pPeer ); + pNavBar->SetComponentInterface( pPeer ); + + // we want a faster repeating rate for the slots in this + // toolbox + AllSettings aSettings = pNavBar->GetSettings(); + MouseSettings aMouseSettings = aSettings.GetMouseSettings(); + aMouseSettings.SetButtonRepeat( 10 ); + aSettings.SetMouseSettings( aMouseSettings ); + pNavBar->SetSettings( aSettings, TRUE ); + + // outta here + return pPeer; + } + + //------------------------------------------------------------------ + ONavigationBarPeer::ONavigationBarPeer( const Reference< XMultiServiceFactory >& _rxORB ) + :OFormNavigationHelper( _rxORB ) + { + DBG_CTOR( ONavigationBarPeer, NULL ); + } + + //------------------------------------------------------------------ + ONavigationBarPeer::~ONavigationBarPeer() + { + DBG_DTOR( ONavigationBarPeer, NULL ); + } + + //------------------------------------------------------------------ + IMPLEMENT_FORWARD_XINTERFACE2( ONavigationBarPeer, VCLXWindow, OFormNavigationHelper ) + + //------------------------------------------------------------------ + IMPLEMENT_FORWARD_XTYPEPROVIDER2( ONavigationBarPeer, VCLXWindow, OFormNavigationHelper ) + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarPeer::dispose( ) throw( RuntimeException ) + { + VCLXWindow::dispose(); + OFormNavigationHelper::dispose(); + } + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarPeer::setProperty( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw( RuntimeException ) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + NavigationToolBar* pNavBar = static_cast< NavigationToolBar* >( GetWindow() ); + if ( !pNavBar ) + { + VCLXWindow::setProperty( _rPropertyName, _rValue ); + return; + } + + bool bVoid = !_rValue.hasValue(); + + sal_Bool bBoolValue = sal_False; + sal_Int32 nColor = COL_TRANSPARENT; + + // TODO: more generic mechanisms for this (the grid control implementation, + // when used herein, will do the same stuff for lot of these) + + if ( _rPropertyName.equals( PROPERTY_BACKGROUNDCOLOR ) ) + { + Wallpaper aTest = pNavBar->GetBackground(); + if ( bVoid ) + { + pNavBar->SetBackground( pNavBar->GetSettings().GetStyleSettings().GetFaceColor() ); + pNavBar->SetControlBackground(); + } + else + { + OSL_VERIFY( _rValue >>= nColor ); + Color aColor( nColor ); + pNavBar->SetBackground( aColor ); + pNavBar->SetControlBackground( aColor ); + } + } + else if ( _rPropertyName.equals( PROPERTY_TEXTLINECOLOR ) ) + { + if ( bVoid ) + { + pNavBar->SetTextLineColor(); + } + else + { + OSL_VERIFY( _rValue >>= nColor ); + Color aColor( nColor ); + pNavBar->SetTextLineColor( nColor ); + } + } + else if ( _rPropertyName.equals( PROPERTY_ICONSIZE ) ) + { + sal_Int16 nInt16Value = 0; + OSL_VERIFY( _rValue >>= nInt16Value ); + pNavBar->SetImageSize( nInt16Value ? NavigationToolBar::eLarge : NavigationToolBar::eSmall ); + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_POSITION ) ) + { + OSL_VERIFY( _rValue >>= bBoolValue ); + pNavBar->ShowFunctionGroup( NavigationToolBar::ePosition, bBoolValue ); + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_NAVIGATION ) ) + { + OSL_VERIFY( _rValue >>= bBoolValue ); + pNavBar->ShowFunctionGroup( NavigationToolBar::eNavigation, bBoolValue ); + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_RECORDACTIONS ) ) + { + OSL_VERIFY( _rValue >>= bBoolValue ); + pNavBar->ShowFunctionGroup( NavigationToolBar::eRecordActions, bBoolValue ); + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_FILTERSORT ) ) + { + OSL_VERIFY( _rValue >>= bBoolValue ); + pNavBar->ShowFunctionGroup( NavigationToolBar::eFilterSort, bBoolValue ); + } + else + { + VCLXWindow::setProperty( _rPropertyName, _rValue ); + } + } + + //------------------------------------------------------------------ + Any SAL_CALL ONavigationBarPeer::getProperty( const ::rtl::OUString& _rPropertyName ) throw( RuntimeException ) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + Any aReturn; + NavigationToolBar* pNavBar = static_cast< NavigationToolBar* >( GetWindow() ); + + if ( _rPropertyName.equals( PROPERTY_BACKGROUNDCOLOR ) ) + { + aReturn <<= (sal_Int32)pNavBar->GetControlBackground().GetColor(); + } + else if ( _rPropertyName.equals( PROPERTY_TEXTLINECOLOR ) ) + { + aReturn <<= (sal_Int32)pNavBar->GetTextLineColor().GetColor(); + } + else if ( _rPropertyName.equals( PROPERTY_ICONSIZE ) ) + { + sal_Int16 nIconType = ( NavigationToolBar::eLarge == pNavBar->GetImageSize() ) + ? 1 : 0; + aReturn <<= nIconType; + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_POSITION ) ) + { + aReturn <<= (sal_Bool)( pNavBar->IsFunctionGroupVisible( NavigationToolBar::ePosition ) ); + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_NAVIGATION ) ) + { + aReturn <<= (sal_Bool)( pNavBar->IsFunctionGroupVisible( NavigationToolBar::eNavigation ) ); + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_RECORDACTIONS ) ) + { + aReturn <<= (sal_Bool)( pNavBar->IsFunctionGroupVisible( NavigationToolBar::eRecordActions ) ); + } + else if ( _rPropertyName.equals( PROPERTY_SHOW_FILTERSORT ) ) + { + aReturn <<= (sal_Bool)( pNavBar->IsFunctionGroupVisible( NavigationToolBar::eFilterSort ) ); + } + else + aReturn = VCLXWindow::getProperty( _rPropertyName ); + + return aReturn; + } + + //------------------------------------------------------------------ + void ONavigationBarPeer::interceptorsChanged( ) + { + if ( isDesignMode() ) + // not interested in if we're in design mode + return; + + OFormNavigationHelper::interceptorsChanged(); + } + + //------------------------------------------------------------------ + void ONavigationBarPeer::featureStateChanged( sal_Int32 _nFeatureId, sal_Bool _bEnabled ) + { + // enable this button on the toolbox + NavigationToolBar* pNavBar = static_cast< NavigationToolBar* >( GetWindow() ); + if ( pNavBar ) + { + pNavBar->enableFeature( _nFeatureId, _bEnabled ); + + // is it a feature with additional state information? + if ( _nFeatureId == SID_FM_FORM_FILTERED ) + { // additional boolean state + pNavBar->checkFeature( _nFeatureId, getBooleanState( _nFeatureId ) ); + } + else if ( _nFeatureId == SID_FM_RECORD_TOTAL ) + { + pNavBar->setFeatureText( _nFeatureId, getStringState( _nFeatureId ) ); + } + else if ( _nFeatureId == SID_FM_RECORD_ABSOLUTE ) + { + pNavBar->setFeatureText( _nFeatureId, String::CreateFromInt32( getIntegerState( _nFeatureId ) ) ); + } + } + + // base class + OFormNavigationHelper::featureStateChanged( _nFeatureId, _bEnabled ); + } + + //------------------------------------------------------------------ + void ONavigationBarPeer::allFeatureStatesChanged( ) + { + // force the control to update it's states + NavigationToolBar* pNavBar = static_cast< NavigationToolBar* >( GetWindow() ); + if ( pNavBar ) + pNavBar->setDispatcher( this ); + + // base class + OFormNavigationHelper::allFeatureStatesChanged( ); + } + + //------------------------------------------------------------------ + bool ONavigationBarPeer::isEnabled( sal_Int32 _nFeatureId ) const + { + if ( const_cast< ONavigationBarPeer* >( this )->isDesignMode() ) + return false; + + return OFormNavigationHelper::isEnabled( _nFeatureId ); + } + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarPeer::setDesignMode( sal_Bool _bOn ) throw( RuntimeException ) + { + VCLXWindow::setDesignMode( _bOn ); + + if ( _bOn ) + disconnectDispatchers(); + else + connectDispatchers(); + // this will connect if not already connected and just update else + } + + //------------------------------------------------------------------ + void SAL_CALL ONavigationBarPeer::disposing( const EventObject& _rSource ) throw (RuntimeException) + { + VCLXWindow::disposing( _rSource ); + OFormNavigationHelper::disposing( _rSource ); + } + + //------------------------------------------------------------------ + void ONavigationBarPeer::getSupportedFeatures( ::std::vector< sal_Int32 >& _rFeatureIds ) + { + _rFeatureIds.push_back( SID_FM_RECORD_ABSOLUTE ); + _rFeatureIds.push_back( SID_FM_RECORD_TOTAL ); + _rFeatureIds.push_back( SID_FM_RECORD_FIRST ); + _rFeatureIds.push_back( SID_FM_RECORD_PREV ); + _rFeatureIds.push_back( SID_FM_RECORD_NEXT ); + _rFeatureIds.push_back( SID_FM_RECORD_LAST ); + _rFeatureIds.push_back( SID_FM_RECORD_SAVE ); + _rFeatureIds.push_back( SID_FM_RECORD_UNDO ); + _rFeatureIds.push_back( SID_FM_RECORD_NEW ); + _rFeatureIds.push_back( SID_FM_RECORD_DELETE ); + _rFeatureIds.push_back( SID_FM_REFRESH ); + _rFeatureIds.push_back( SID_FM_SORTUP ); + _rFeatureIds.push_back( SID_FM_SORTDOWN ); + _rFeatureIds.push_back( SID_FM_ORDERCRIT ); + _rFeatureIds.push_back( SID_FM_AUTOFILTER ); + _rFeatureIds.push_back( SID_FM_FILTERCRIT ); + _rFeatureIds.push_back( SID_FM_FORM_FILTERED ); + _rFeatureIds.push_back( SID_FM_REMOVE_FILTER_SORT ); + } + +//......................................................................... +} // namespace frm +//......................................................................... -- cgit