From e3755e3e11440ec2ee21a51fbd42a3fd6c45438e Mon Sep 17 00:00:00 2001 From: Vladimir Glazounov Date: Tue, 14 Mar 2006 10:19:23 +0000 Subject: INTEGRATION: CWS pbrwuno (1.3.158); FILE MERGED 2005/10/14 12:43:44 fs 1.3.158.5: #i53095# properly care for MAYBEVOID properties and AMBIGUOUS property values 2005/10/05 06:52:13 fs 1.3.158.4: RESYNC: (1.3-1.4); FILE MERGED 2005/09/05 07:41:47 fs 1.3.158.3: #i53095# phase 3, part 1: introduced XPropertyControl and relatives, describing one control in the ObjectInspector, responsible for one property known issues: - rebuildPropertyUI can cause problems now: If the user clicks into the control for property A, which causes property B to be committed, which causes the UI for property A to be rebuilt, then this will crash currently. Reason: rebuildPropertyUI now synchronously replaces the VCL-Window of the rebuilt control, which is exactly the one which is still in some MouseButtonDown-handler. possible solutions: - see if rebuiltPropertyUI can be obsoleted - handlers should be able to just obtain the XPropertyControl from the PropertyUI, and re-initialize the control. Shouldn't they?` - make one of the steps in the chain (mouse-click, handler-call, rebuildPropertyUI-callback) asynchronous. 2005/08/10 15:41:43 fs 1.3.158.2: #i53095# get rid of nearly all [1] the implementations in OPropertyBrowserController::Clicked, and move them to a FormComponentHandler [1] still to migrate: - browsing for events (needs a dedicated event property handler) - handling for clicking the button of the Command property - this is kind of asynchronous, and IPropertyHandler is not yet prepared for this 2005/08/09 13:59:56 fs 1.3.158.1: #i53095# phase 1: - don't use strings to transver values between controls and introspectee, but Anys - first version of a dedicated property handler for form-component-related properties (not yet completed) known regressions over previous phase: - handlers for events not yet implemented, thus some assertions - click handlers for form-component-related properties do not yet work, thus the browse buttons mostly do not work --- extensions/source/propctrlr/commoncontrol.cxx | 191 +++++++++++++++++++------- 1 file changed, 141 insertions(+), 50 deletions(-) diff --git a/extensions/source/propctrlr/commoncontrol.cxx b/extensions/source/propctrlr/commoncontrol.cxx index e5d894a94..039c73c6d 100644 --- a/extensions/source/propctrlr/commoncontrol.cxx +++ b/extensions/source/propctrlr/commoncontrol.cxx @@ -4,9 +4,9 @@ * * $RCSfile: commoncontrol.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: rt $ $Date: 2005-09-08 20:06:56 $ + * last change: $Author: vg $ $Date: 2006-03-14 11:19:23 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -36,108 +36,199 @@ #ifndef _EXTENSIONS_PROPCTRLR_COMMONCONTROL_HXX_ #include "commoncontrol.hxx" #endif +#ifndef _EXTENSIONS_PROPCTRLR_PCRCOMMON_HXX_ +#include "pcrcommon.hxx" +#endif + #ifndef _TOOLS_DEBUG_HXX #include #endif -#ifndef _EXTENSIONS_PROPCTRLR_BRWCONTROLLISTENER_HXX_ -#include "brwcontrollistener.hxx" -#endif #ifndef _SV_COMBOBOX_HXX #include #endif +#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ +#include +#endif //............................................................................ namespace pcr { //............................................................................ + + /** === begin UNO using === **/ + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Reference; + using ::com::sun::star::inspection::XPropertyControlContext; + using ::com::sun::star::awt::XWindow; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::inspection::XPropertyControl; + /** === end UNO using === **/ + //================================================================== - //= OCommonBehaviourControl + //= ControlHelper //================================================================== //------------------------------------------------------------------ - OCommonBehaviourControl::OCommonBehaviourControl(Window* _pMeAsWin) - :m_pListener(NULL) - ,m_bModified(sal_False) - ,m_nLine(0) - ,m_sStandardString(getStandardString()) - ,m_pMeAsWindow(_pMeAsWin) + ControlHelper::ControlHelper( Window* _pControlWindow, sal_Int16 _nControlType, XPropertyControl& _rAntiImpl, IModifyListener* _pModifyListener ) + :m_pControlWindow( _pControlWindow ) + ,m_nControlType( _nControlType ) + ,m_rAntiImpl( _rAntiImpl ) + ,m_pModifyListener( _pModifyListener ) + ,m_bModified( sal_False ) { - DBG_ASSERT(m_pMeAsWindow != NULL, "OCommonBehaviourControl::OCommonBehaviourControl: invalid window!"); + DBG_ASSERT( m_pControlWindow != NULL, "ControlHelper::ControlHelper: invalid window!" ); } - //------------------------------------------------------------------ - void OCommonBehaviourControl::autoSizeWindow() + //-------------------------------------------------------------------- + ::sal_Int16 SAL_CALL ControlHelper::getControlType() throw (RuntimeException) { - ComboBox aComboBox(m_pMeAsWindow, WB_DROPDOWN); - aComboBox.SetPosSizePixel(Point(0,0), Size(100,100)); - m_pMeAsWindow->SetSizePixel(aComboBox.GetSizePixel()); + return m_nControlType; } - - //------------------------------------------------------------------ - sal_Bool OCommonBehaviourControl::handlePreNotify(NotifyEvent& rNEvt) + + //-------------------------------------------------------------------- + Reference< XPropertyControlContext > SAL_CALL ControlHelper::getControlContext() throw (RuntimeException) { - if (EVENT_KEYINPUT == rNEvt.GetType()) + return m_xContext; + } + + //-------------------------------------------------------------------- + void SAL_CALL ControlHelper::setControlContext( const Reference< XPropertyControlContext >& _controlcontext ) throw (RuntimeException) + { + m_xContext = _controlcontext; + } + + //-------------------------------------------------------------------- + Reference< XWindow > SAL_CALL ControlHelper::getControlWindow() throw (RuntimeException) + { + return VCLUnoHelper::GetInterface( m_pControlWindow ); + } + + //-------------------------------------------------------------------- + ::sal_Bool SAL_CALL ControlHelper::isModified( ) throw (RuntimeException) + { + return m_bModified; + } + + //-------------------------------------------------------------------- + void SAL_CALL ControlHelper::notifyModifiedValue( ) throw (RuntimeException) + { + if ( isModified() && m_xContext.is() ) { - const KeyCode& aKeyCode = rNEvt.GetKeyEvent()->GetKeyCode(); - sal_uInt16 nKey = aKeyCode.GetCode(); - - if (nKey == KEY_RETURN && !aKeyCode.IsShift()) + try { - LoseFocusHdl(m_pMeAsWindow); - if (m_pListener != NULL) - m_pListener->TravelLine(this); - return sal_True; + m_xContext->controlValueChanged( &m_rAntiImpl ); + m_bModified = sal_False; + } + catch( const Exception& e ) + { + #if OSL_DEBUG_LEVEL > 0 + ::rtl::OString sMessage( "ControlHelper::notifyModifiedValue: caught an exception!\n" ); + sMessage += "message:\n"; + sMessage += ::rtl::OString( e.Message.getStr(), e.Message.getLength(), osl_getThreadTextEncoding() ); + OSL_ENSURE( false, sMessage ); + #else + e; // make compiler happy + #endif } } - return sal_False; } //------------------------------------------------------------------ - void OCommonBehaviourControl::CommitModified() + void SAL_CALL ControlHelper::dispose() { - if (IsModified() && getListener()) - getListener()->Commit(this); - m_bModified = sal_False; + DELETEZ( m_pControlWindow ); } //------------------------------------------------------------------ - void OCommonBehaviourControl::modified(Window* _pSource) + void ControlHelper::autoSizeWindow() { - m_bModified = sal_True; - if (m_pListener != NULL) - m_pListener->Modified(this); + OSL_PRECOND( m_pControlWindow, "ControlHelper::autoSizeWindow: no window!" ); + if ( !m_pControlWindow ) + return; + + ComboBox aComboBox(m_pControlWindow, WB_DROPDOWN); + aComboBox.SetPosSizePixel(Point(0,0), Size(100,100)); + m_pControlWindow->SetSizePixel(aComboBox.GetSizePixel()); + + // TODO/UNOize: why do the controls this themselves? Shouldn't this be the task + // of the the browser listbox/line? } //------------------------------------------------------------------ - void OCommonBehaviourControl::getFocus(Window* _pSource) + void ControlHelper::impl_activateNextControl_nothrow() const { - if (m_pListener != NULL) - m_pListener->GetFocus(this); + try + { + if ( m_xContext.is() ) + m_xContext->activateNextControl( const_cast< XPropertyControl* >( &m_rAntiImpl ) ); + } + catch( const Exception& e ) + { + #if OSL_DEBUG_LEVEL > 0 + ::rtl::OString sMessage( "ControlHelper::impl_activateNextControl_nothrow: caught an exception!\n" ); + sMessage += "message:\n"; + sMessage += ::rtl::OString( e.Message.getStr(), e.Message.getLength(), osl_getThreadTextEncoding() ); + OSL_ENSURE( false, sMessage ); + #else + e; // make compiler happy + #endif + } } //------------------------------------------------------------------ - void OCommonBehaviourControl::commitModified(Window* _pSource) + bool ControlHelper::handlePreNotify(NotifyEvent& rNEvt) { - CommitModified(); + if (EVENT_KEYINPUT == rNEvt.GetType()) + { + const KeyCode& aKeyCode = rNEvt.GetKeyEvent()->GetKeyCode(); + sal_uInt16 nKey = aKeyCode.GetCode(); + + if (nKey == KEY_RETURN && !aKeyCode.IsShift()) + { + LoseFocusHdl(m_pControlWindow); + impl_activateNextControl_nothrow(); + return true; + } + } + return false; } //------------------------------------------------------------------ - IMPL_LINK( OCommonBehaviourControl, ModifiedHdl, Window*, _pWin ) + IMPL_LINK( ControlHelper, ModifiedHdl, Window*, _pWin ) { - modified(_pWin); + if ( m_pModifyListener ) + m_pModifyListener->modified(); return 0; } //------------------------------------------------------------------ - IMPL_LINK( OCommonBehaviourControl, GetFocusHdl, Window*, _pWin ) + IMPL_LINK( ControlHelper, GetFocusHdl, Window*, _pWin ) { - getFocus(_pWin); + try + { + if ( m_xContext.is() ) + m_xContext->focusGained( &m_rAntiImpl ); + } + catch( const Exception& e ) + { + #if OSL_DEBUG_LEVEL > 0 + ::rtl::OString sMessage( "ControlHelper, GetFocusHdl: caught an exception!\n" ); + sMessage += "message:\n"; + sMessage += ::rtl::OString( e.Message.getStr(), e.Message.getLength(), osl_getThreadTextEncoding() ); + OSL_ENSURE( false, sMessage ); + #else + e; // make compiler happy + #endif + } return 0; } //------------------------------------------------------------------ - IMPL_LINK( OCommonBehaviourControl, LoseFocusHdl, Window*, _pWin ) + IMPL_LINK( ControlHelper, LoseFocusHdl, Window*, _pWin ) { - commitModified(_pWin); + // TODO/UNOize: should this be outside the default control's implementations? If somebody + // has an own control implementation, which does *not* do this - would this be allowed? + // If not, then we must move this logic out of here. + notifyModifiedValue(); return 0; } -- cgit v1.2.3