xref: /trunk/main/forms/source/component/ImageButton.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_forms.hxx"
30 #include "ImageButton.hxx"
31 #include <tools/debug.hxx>
32 #include <tools/urlobj.hxx>
33 #include <vcl/svapp.hxx>
34 #include <vos/mutex.hxx>
35 #include <comphelper/basicio.hxx>
36 #include <com/sun/star/awt/MouseButton.hpp>
37 
38 //.........................................................................
39 namespace frm
40 {
41 //.........................................................................
42 using namespace ::com::sun::star;
43 using namespace ::com::sun::star::uno;
44 using namespace ::com::sun::star::sdb;
45 using namespace ::com::sun::star::sdbc;
46 using namespace ::com::sun::star::sdbcx;
47 using namespace ::com::sun::star::beans;
48 using namespace ::com::sun::star::container;
49 using namespace ::com::sun::star::form;
50 using namespace ::com::sun::star::io;
51 using namespace ::com::sun::star::lang;
52 using namespace ::com::sun::star::util;
53 
54 //==================================================================
55 //= OImageButtonModel
56 //==================================================================
57 DBG_NAME(OImageButtonModel)
58 //------------------------------------------------------------------
59 InterfaceRef SAL_CALL OImageButtonModel_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory)
60 {
61     return *(new OImageButtonModel(_rxFactory));
62 }
63 
64 //------------------------------------------------------------------
65 OImageButtonModel::OImageButtonModel(const Reference<XMultiServiceFactory>& _rxFactory)
66                     :OClickableImageBaseModel( _rxFactory, VCL_CONTROLMODEL_IMAGEBUTTON, FRM_SUN_CONTROL_IMAGEBUTTON )
67                                     // use the old control name for compytibility reasons
68 {
69     DBG_CTOR(OImageButtonModel, NULL);
70     m_nClassId = FormComponentType::IMAGEBUTTON;
71 }
72 
73 //------------------------------------------------------------------
74 OImageButtonModel::OImageButtonModel( const OImageButtonModel* _pOriginal, const Reference<XMultiServiceFactory>& _rxFactory)
75     :OClickableImageBaseModel( _pOriginal, _rxFactory )
76 {
77     DBG_CTOR(OImageButtonModel, NULL);
78     implInitializeImageURL();
79 }
80 
81 //------------------------------------------------------------------------------
82 IMPLEMENT_DEFAULT_CLONING( OImageButtonModel )
83 
84 //------------------------------------------------------------------------------
85 OImageButtonModel::~OImageButtonModel()
86 {
87     DBG_DTOR(OImageButtonModel, NULL);
88 }
89 
90 // XServiceInfo
91 //------------------------------------------------------------------------------
92 StringSequence  OImageButtonModel::getSupportedServiceNames() throw()
93 {
94     StringSequence aSupported = OClickableImageBaseModel::getSupportedServiceNames();
95     aSupported.realloc(aSupported.getLength() + 1);
96 
97     ::rtl::OUString*pArray = aSupported.getArray();
98     pArray[aSupported.getLength()-1] = FRM_SUN_COMPONENT_IMAGEBUTTON;
99     return aSupported;
100 }
101 
102 //------------------------------------------------------------------------------
103 void OImageButtonModel::describeFixedProperties( Sequence< Property >& _rProps ) const
104 {
105     BEGIN_DESCRIBE_PROPERTIES( 5, OClickableImageBaseModel )
106         DECL_PROP1(BUTTONTYPE,          FormButtonType,     BOUND);
107         DECL_PROP1(DISPATCHURLINTERNAL, sal_Bool,           BOUND);
108         DECL_PROP1(TARGET_URL,          ::rtl::OUString,    BOUND);
109         DECL_PROP1(TARGET_FRAME,        ::rtl::OUString,    BOUND);
110         DECL_PROP1(TABINDEX,            sal_Int16,          BOUND);
111     END_DESCRIBE_PROPERTIES();
112 }
113 
114 //------------------------------------------------------------------------------
115 ::rtl::OUString OImageButtonModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException)
116 {
117     return FRM_COMPONENT_IMAGEBUTTON;   // old (non-sun) name for compatibility !
118 }
119 
120 //------------------------------------------------------------------------------
121 void OImageButtonModel::write(const Reference<XObjectOutputStream>& _rxOutStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
122 {
123     OControlModel::write(_rxOutStream);
124 
125     // Version
126     _rxOutStream->writeShort(0x0003);
127     _rxOutStream->writeShort((sal_uInt16)m_eButtonType);
128 
129     ::rtl::OUString sTmp(INetURLObject::decode( m_sTargetURL, '%', INetURLObject::DECODE_UNAMBIGUOUS));
130     _rxOutStream << sTmp;
131     _rxOutStream << m_sTargetFrame;
132     writeHelpTextCompatibly(_rxOutStream);
133 }
134 
135 //------------------------------------------------------------------------------
136 void OImageButtonModel::read(const Reference<XObjectInputStream>& _rxInStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
137 {
138     OControlModel::read(_rxInStream);
139 
140     // Version
141     sal_uInt16 nVersion = _rxInStream->readShort();
142 
143     switch (nVersion)
144     {
145         case 0x0001:
146         {
147             m_eButtonType = (FormButtonType)_rxInStream->readShort();
148         }
149         break;
150         case 0x0002:
151         {
152             m_eButtonType = (FormButtonType)_rxInStream->readShort();
153             _rxInStream >> m_sTargetURL;
154             _rxInStream >> m_sTargetFrame;
155         }
156         break;
157         case 0x0003:
158         {
159             m_eButtonType = (FormButtonType)_rxInStream->readShort();
160             _rxInStream >> m_sTargetURL;
161             _rxInStream >> m_sTargetFrame;
162             readHelpTextCompatibly(_rxInStream);
163         }
164         break;
165 
166         default :
167             DBG_ERROR("OImageButtonModel::read : unknown version !");
168             m_eButtonType = FormButtonType_PUSH;
169             m_sTargetURL = ::rtl::OUString();
170             m_sTargetFrame = ::rtl::OUString();
171             break;
172     }
173 }
174 
175 //==================================================================
176 // OImageButtonControl
177 //==================================================================
178 //------------------------------------------------------------------
179 InterfaceRef SAL_CALL OImageButtonControl_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory)
180 {
181     return *(new OImageButtonControl(_rxFactory));
182 }
183 
184 //------------------------------------------------------------------------------
185 Sequence<Type> OImageButtonControl::_getTypes()
186 {
187     static Sequence<Type> aTypes;
188     if (!aTypes.getLength())
189         aTypes = concatSequences(OClickableImageBaseControl::_getTypes(), OImageButtonControl_BASE::getTypes());
190     return aTypes;
191 }
192 
193 //------------------------------------------------------------------------------
194 StringSequence  OImageButtonControl::getSupportedServiceNames() throw()
195 {
196     StringSequence aSupported = OClickableImageBaseControl::getSupportedServiceNames();
197     aSupported.realloc(aSupported.getLength() + 1);
198 
199     ::rtl::OUString*pArray = aSupported.getArray();
200     pArray[aSupported.getLength()-1] = FRM_SUN_CONTROL_IMAGEBUTTON;
201     return aSupported;
202 }
203 
204 //------------------------------------------------------------------------------
205 OImageButtonControl::OImageButtonControl(const Reference<XMultiServiceFactory>& _rxFactory)
206             :OClickableImageBaseControl(_rxFactory, VCL_CONTROL_IMAGEBUTTON)
207 {
208     increment(m_refCount);
209     {
210         // als MouseListener anmelden
211         Reference< awt::XWindow >  xComp;
212         query_aggregation( m_xAggregate, xComp);
213         if (xComp.is())
214             xComp->addMouseListener( static_cast< awt::XMouseListener* >( this ) );
215     }
216     decrement(m_refCount);
217 }
218 
219 // UNO Anbindung
220 //------------------------------------------------------------------------------
221 Any SAL_CALL OImageButtonControl::queryAggregation(const Type& _rType) throw (RuntimeException)
222 {
223     Any aReturn = OClickableImageBaseControl::queryAggregation(_rType);
224     if (!aReturn.hasValue())
225         aReturn = OImageButtonControl_BASE::queryInterface(_rType);
226 
227     return aReturn;
228 }
229 
230 //------------------------------------------------------------------------------
231 void OImageButtonControl::mousePressed(const awt::MouseEvent& e) throw ( ::com::sun::star::uno::RuntimeException)
232 {
233     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
234 
235     if (e.Buttons != awt::MouseButton::LEFT)
236         return;
237 
238     ::osl::ClearableMutexGuard aGuard( m_aMutex );
239     if( m_aApproveActionListeners.getLength() )
240     {
241         // if there are listeners, start the action in an own thread, to not allow
242         // them to block us here (we're in the application's main thread)
243         getImageProducerThread()->OComponentEventThread::addEvent( &e );
244     }
245     else
246     {
247         // Sonst nicht. Dann darf man aber auf keinen Fal die Listener
248         // benachrichtigen, auch dann nicht, wenn er spaeter hinzukommt.
249         aGuard.clear();
250         actionPerformed_Impl( sal_False, e );
251     }
252 }
253 
254 //------------------------------------------------------------------------------
255 void SAL_CALL OImageButtonControl::mouseReleased(const awt::MouseEvent& /*e*/) throw ( RuntimeException)
256 {
257 }
258 
259 //------------------------------------------------------------------------------
260 void SAL_CALL OImageButtonControl::mouseEntered(const awt::MouseEvent& /*e*/) throw ( RuntimeException)
261 {
262 }
263 
264 //------------------------------------------------------------------------------
265 void SAL_CALL OImageButtonControl::mouseExited(const awt::MouseEvent& /*e*/) throw ( RuntimeException)
266 {
267 }
268 
269 
270 //.........................................................................
271 }   // namespace frm
272 //.........................................................................
273 
274