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