1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_extensions.hxx" 26*b1cdbd2cSJim Jagielski #include "commoncontrol.hxx" 27*b1cdbd2cSJim Jagielski #include "pcrcommon.hxx" 28*b1cdbd2cSJim Jagielski #include <tools/debug.hxx> 29*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 30*b1cdbd2cSJim Jagielski #include <vcl/combobox.hxx> 31*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx> 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski //............................................................................ 34*b1cdbd2cSJim Jagielski namespace pcr 35*b1cdbd2cSJim Jagielski { 36*b1cdbd2cSJim Jagielski //............................................................................ 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski /** === begin UNO using === **/ 39*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::RuntimeException; 40*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 41*b1cdbd2cSJim Jagielski using ::com::sun::star::inspection::XPropertyControlContext; 42*b1cdbd2cSJim Jagielski using ::com::sun::star::awt::XWindow; 43*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Exception; 44*b1cdbd2cSJim Jagielski using ::com::sun::star::inspection::XPropertyControl; 45*b1cdbd2cSJim Jagielski /** === end UNO using === **/ 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski //================================================================== 48*b1cdbd2cSJim Jagielski //= ControlHelper 49*b1cdbd2cSJim Jagielski //================================================================== 50*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ ControlHelper(Window * _pControlWindow,sal_Int16 _nControlType,XPropertyControl & _rAntiImpl,IModifyListener * _pModifyListener)51*b1cdbd2cSJim Jagielski ControlHelper::ControlHelper( Window* _pControlWindow, sal_Int16 _nControlType, XPropertyControl& _rAntiImpl, IModifyListener* _pModifyListener ) 52*b1cdbd2cSJim Jagielski :m_pControlWindow( _pControlWindow ) 53*b1cdbd2cSJim Jagielski ,m_nControlType( _nControlType ) 54*b1cdbd2cSJim Jagielski ,m_rAntiImpl( _rAntiImpl ) 55*b1cdbd2cSJim Jagielski ,m_pModifyListener( _pModifyListener ) 56*b1cdbd2cSJim Jagielski ,m_bModified( sal_False ) 57*b1cdbd2cSJim Jagielski { 58*b1cdbd2cSJim Jagielski DBG_ASSERT( m_pControlWindow != NULL, "ControlHelper::ControlHelper: invalid window!" ); 59*b1cdbd2cSJim Jagielski } 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ ~ControlHelper()62*b1cdbd2cSJim Jagielski ControlHelper::~ControlHelper() 63*b1cdbd2cSJim Jagielski { 64*b1cdbd2cSJim Jagielski } 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getControlType()67*b1cdbd2cSJim Jagielski ::sal_Int16 SAL_CALL ControlHelper::getControlType() throw (RuntimeException) 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski return m_nControlType; 70*b1cdbd2cSJim Jagielski } 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getControlContext()73*b1cdbd2cSJim Jagielski Reference< XPropertyControlContext > SAL_CALL ControlHelper::getControlContext() throw (RuntimeException) 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski return m_xContext; 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- setControlContext(const Reference<XPropertyControlContext> & _controlcontext)79*b1cdbd2cSJim Jagielski void SAL_CALL ControlHelper::setControlContext( const Reference< XPropertyControlContext >& _controlcontext ) throw (RuntimeException) 80*b1cdbd2cSJim Jagielski { 81*b1cdbd2cSJim Jagielski m_xContext = _controlcontext; 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getControlWindow()85*b1cdbd2cSJim Jagielski Reference< XWindow > SAL_CALL ControlHelper::getControlWindow() throw (RuntimeException) 86*b1cdbd2cSJim Jagielski { 87*b1cdbd2cSJim Jagielski return VCLUnoHelper::GetInterface( m_pControlWindow ); 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- isModified()91*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL ControlHelper::isModified( ) throw (RuntimeException) 92*b1cdbd2cSJim Jagielski { 93*b1cdbd2cSJim Jagielski return m_bModified; 94*b1cdbd2cSJim Jagielski } 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- notifyModifiedValue()97*b1cdbd2cSJim Jagielski void SAL_CALL ControlHelper::notifyModifiedValue( ) throw (RuntimeException) 98*b1cdbd2cSJim Jagielski { 99*b1cdbd2cSJim Jagielski if ( isModified() && m_xContext.is() ) 100*b1cdbd2cSJim Jagielski { 101*b1cdbd2cSJim Jagielski try 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski m_xContext->valueChanged( &m_rAntiImpl ); 104*b1cdbd2cSJim Jagielski m_bModified = sal_False; 105*b1cdbd2cSJim Jagielski } 106*b1cdbd2cSJim Jagielski catch( const Exception& ) 107*b1cdbd2cSJim Jagielski { 108*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 109*b1cdbd2cSJim Jagielski } 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski } 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ dispose()114*b1cdbd2cSJim Jagielski void SAL_CALL ControlHelper::dispose() 115*b1cdbd2cSJim Jagielski { 116*b1cdbd2cSJim Jagielski DELETEZ( m_pControlWindow ); 117*b1cdbd2cSJim Jagielski } 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ autoSizeWindow()120*b1cdbd2cSJim Jagielski void ControlHelper::autoSizeWindow() 121*b1cdbd2cSJim Jagielski { 122*b1cdbd2cSJim Jagielski OSL_PRECOND( m_pControlWindow, "ControlHelper::autoSizeWindow: no window!" ); 123*b1cdbd2cSJim Jagielski if ( !m_pControlWindow ) 124*b1cdbd2cSJim Jagielski return; 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski ComboBox aComboBox(m_pControlWindow, WB_DROPDOWN); 127*b1cdbd2cSJim Jagielski aComboBox.SetPosSizePixel(Point(0,0), Size(100,100)); 128*b1cdbd2cSJim Jagielski m_pControlWindow->SetSizePixel(aComboBox.GetSizePixel()); 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski // TODO/UNOize: why do the controls this themselves? Shouldn't this be the task 131*b1cdbd2cSJim Jagielski // of the the browser listbox/line? 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ impl_activateNextControl_nothrow() const135*b1cdbd2cSJim Jagielski void ControlHelper::impl_activateNextControl_nothrow() const 136*b1cdbd2cSJim Jagielski { 137*b1cdbd2cSJim Jagielski try 138*b1cdbd2cSJim Jagielski { 139*b1cdbd2cSJim Jagielski if ( m_xContext.is() ) 140*b1cdbd2cSJim Jagielski m_xContext->activateNextControl( const_cast< XPropertyControl* >( &m_rAntiImpl ) ); 141*b1cdbd2cSJim Jagielski } 142*b1cdbd2cSJim Jagielski catch( const Exception& ) 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski } 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ handlePreNotify(NotifyEvent & rNEvt)149*b1cdbd2cSJim Jagielski bool ControlHelper::handlePreNotify(NotifyEvent& rNEvt) 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski if (EVENT_KEYINPUT == rNEvt.GetType()) 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski const KeyCode& aKeyCode = rNEvt.GetKeyEvent()->GetKeyCode(); 154*b1cdbd2cSJim Jagielski sal_uInt16 nKey = aKeyCode.GetCode(); 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski if (nKey == KEY_RETURN && !aKeyCode.IsShift()) 157*b1cdbd2cSJim Jagielski { 158*b1cdbd2cSJim Jagielski LoseFocusHdl(m_pControlWindow); 159*b1cdbd2cSJim Jagielski impl_activateNextControl_nothrow(); 160*b1cdbd2cSJim Jagielski return true; 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski } 163*b1cdbd2cSJim Jagielski return false; 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ 167*b1cdbd2cSJim Jagielski IMPL_LINK( ControlHelper, ModifiedHdl, Window*, /*_pWin*/ ) 168*b1cdbd2cSJim Jagielski { 169*b1cdbd2cSJim Jagielski if ( m_pModifyListener ) 170*b1cdbd2cSJim Jagielski m_pModifyListener->modified(); 171*b1cdbd2cSJim Jagielski return 0; 172*b1cdbd2cSJim Jagielski } 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ 175*b1cdbd2cSJim Jagielski IMPL_LINK( ControlHelper, GetFocusHdl, Window*, /*_pWin*/ ) 176*b1cdbd2cSJim Jagielski { 177*b1cdbd2cSJim Jagielski try 178*b1cdbd2cSJim Jagielski { 179*b1cdbd2cSJim Jagielski if ( m_xContext.is() ) 180*b1cdbd2cSJim Jagielski m_xContext->focusGained( &m_rAntiImpl ); 181*b1cdbd2cSJim Jagielski } 182*b1cdbd2cSJim Jagielski catch( const Exception& ) 183*b1cdbd2cSJim Jagielski { 184*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION(); 185*b1cdbd2cSJim Jagielski } 186*b1cdbd2cSJim Jagielski return 0; 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski //------------------------------------------------------------------ 190*b1cdbd2cSJim Jagielski IMPL_LINK( ControlHelper, LoseFocusHdl, Window*, /*_pWin*/ ) 191*b1cdbd2cSJim Jagielski { 192*b1cdbd2cSJim Jagielski // TODO/UNOize: should this be outside the default control's implementations? If somebody 193*b1cdbd2cSJim Jagielski // has an own control implementation, which does *not* do this - would this be allowed? 194*b1cdbd2cSJim Jagielski // If not, then we must move this logic out of here. 195*b1cdbd2cSJim Jagielski notifyModifiedValue(); 196*b1cdbd2cSJim Jagielski return 0; 197*b1cdbd2cSJim Jagielski } 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski //............................................................................ 200*b1cdbd2cSJim Jagielski } // namespace pcr 201*b1cdbd2cSJim Jagielski //............................................................................ 202*b1cdbd2cSJim Jagielski 203