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