summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2006-03-14 10:19:23 +0000
committerVladimir Glazounov <vg@openoffice.org>2006-03-14 10:19:23 +0000
commite3755e3e11440ec2ee21a51fbd42a3fd6c45438e (patch)
treead7adb195602de9de7f077619f6b3242137f066c
parent523e9376846d683363527d63305c1b64773ba3e5 (diff)
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
-rw-r--r--extensions/source/propctrlr/commoncontrol.cxx191
1 files 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 <tools/debug.hxx>
#endif
-#ifndef _EXTENSIONS_PROPCTRLR_BRWCONTROLLISTENER_HXX_
-#include "brwcontrollistener.hxx"
-#endif
#ifndef _SV_COMBOBOX_HXX
#include <vcl/combobox.hxx>
#endif
+#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
+#include <toolkit/helper/vclunohelper.hxx>
+#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;
}