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 #ifndef _FRM_IMAGE_CONTROL_HXX_
29 #define _FRM_IMAGE_CONTROL_HXX_
30 
31 #include "FormComponent.hxx"
32 #include "imgprod.hxx"
33 #include <com/sun/star/form/XImageProducerSupplier.hpp>
34 #include <com/sun/star/awt/XMouseListener.hpp>
35 #include <com/sun/star/util/XModifyBroadcaster.hpp>
36 #include <com/sun/star/graphic/XGraphicObject.hpp>
37 #include <comphelper/propmultiplex.hxx>
38 #include <comphelper/implementationreference.hxx>
39 #include <cppuhelper/implbase2.hxx>
40 
41 using namespace comphelper;
42 
43 //.........................................................................
44 namespace frm
45 {
46 //.........................................................................
47 
48 //==================================================================
49 // OImageControlModel
50 //==================================================================
51 typedef ::cppu::ImplHelper2 <   ::com::sun::star::form::XImageProducerSupplier
52                             ,   ::com::sun::star::awt::XImageProducer
53                             >   OImageControlModel_Base;
54 
55 class OImageControlModel
56 				:public OImageControlModel_Base
57 				,public OBoundControlModel
58 {
59 	::com::sun::star::uno::Reference< ::com::sun::star::awt::XImageProducer> 	m_xImageProducer;
60 	ImageProducer*									m_pImageProducer;
61     bool                                            m_bExternalGraphic;
62 	sal_Bool										m_bReadOnly;
63     ::rtl::OUString                                 m_sImageURL;
64     ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphicObject >
65                                                     m_xGraphicObject;
66     ::rtl::OUString                                 m_sDocumentURL;
67 
68 protected:
69 	// UNO Anbindung
70 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> _getTypes();
71 
72 	inline ImageProducer* GetImageProducer() { return m_pImageProducer; }
73 
74 public:
75 	DECLARE_DEFAULT_LEAF_XTOR( OImageControlModel );
76 
77 	virtual void SAL_CALL getFastPropertyValue(::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const;
78 	virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue) throw ( ::com::sun::star::uno::Exception);
79 
80 	virtual sal_Bool SAL_CALL convertFastPropertyValue(::com::sun::star::uno::Any& rConvertedValue, ::com::sun::star::uno::Any& rOldValue, sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue )
81 		throw(::com::sun::star::lang::IllegalArgumentException);
82 
83 	// UNO Anbindung
84 	DECLARE_UNO3_AGG_DEFAULTS(OImageControlModel, OBoundControlModel);
85 	virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation(const ::com::sun::star::uno::Type& _rType) throw(::com::sun::star::uno::RuntimeException);
86 
87     // XServiceInfo
88 	IMPLEMENTATION_NAME(OImageControlModel);
89 	virtual StringSequence SAL_CALL getSupportedServiceNames() throw();
90 
91     // OComponentHelper
92 	virtual void SAL_CALL disposing();
93 
94     // XPersistObject
95 	virtual ::rtl::OUString SAL_CALL getServiceName() throw ( ::com::sun::star::uno::RuntimeException);
96 	virtual void SAL_CALL write(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream>& _rxOutStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
97 	virtual void SAL_CALL read(const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream>& _rxInStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
98 
99     // XImageProducerSupplier
100 	virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XImageProducer> SAL_CALL getImageProducer() throw ( ::com::sun::star::uno::RuntimeException);
101 
102     // XImageProducer
103     virtual void SAL_CALL addConsumer( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XImageConsumer >& xConsumer ) throw (::com::sun::star::uno::RuntimeException);
104     virtual void SAL_CALL removeConsumer( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XImageConsumer >& xConsumer ) throw (::com::sun::star::uno::RuntimeException);
105     virtual void SAL_CALL startProduction(  ) throw (::com::sun::star::uno::RuntimeException);
106 
107     // OControlModel's property handling
108     virtual void describeAggregateProperties(
109 		::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rAggregateProps
110     ) const;
111 	virtual void describeFixedProperties(
112 		::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property >& /* [out] */ _rProps
113     ) const;
114 
115     // prevent method hiding
116     using OBoundControlModel::disposing;
117     using OBoundControlModel::getFastPropertyValue;
118 
119 protected:
120     // OBoundControlModel overridables
121 	virtual void            onConnectedDbColumn( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxForm );
122 	virtual void            onDisconnectedDbColumn();
123     virtual ::com::sun::star::uno::Any
124                             translateDbColumnToControlValue( );
125     virtual sal_Bool        commitControlValueToDbColumn( bool _bPostReset );
126 
127     virtual ::com::sun::star::uno::Any
128                             getControlValue( ) const;
129     virtual void            doSetControlValue( const ::com::sun::star::uno::Any& _rValue );
130 
131     virtual sal_Bool		approveDbColumnType(sal_Int32 _nColumnType);
132 
133 	virtual void            resetNoBroadcast();
134 
135 protected:
136 	DECLARE_XCLONEABLE();
137 
138 	void implConstruct();
139 
140     /** displays the image described by the given URL
141         @precond
142             our own mutex is locked
143     */
144     sal_Bool    impl_handleNewImageURL_lck( ValueChangeInstigator _eInstigator );
145 
146     /** updates the binary stream, created from loading the file which the given URL points to, into our
147         bound field, or the control itself if there is no bound field
148     */
149     sal_Bool    impl_updateStreamForURL_lck( const ::rtl::OUString& _rURL, ValueChangeInstigator _eInstigator );
150 
151     DECL_LINK( OnImageImportDone, ::Graphic* );
152 };
153 
154 //==================================================================
155 //= OImageControlControl
156 //==================================================================
157 typedef ::cppu::ImplHelper2 <   ::com::sun::star::awt::XMouseListener
158                             ,   ::com::sun::star::util::XModifyBroadcaster
159                             >   OImageControlControl_Base;
160 class OImageControlControl  : public OBoundControl
161                             , public OImageControlControl_Base
162 {
163 private:
164     ::cppu::OInterfaceContainerHelper   m_aModifyListeners;
165 
166     // XTypeProvider
167 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type> _getTypes();
168 
169 public:
170 	OImageControlControl(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _rxFactory);
171 
172     // UNO
173 	DECLARE_UNO3_AGG_DEFAULTS( OImageControlControl, OBoundControl );
174 	virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
175 
176     // XEventListener
177 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& _rSource) throw(::com::sun::star::uno::RuntimeException);
178 
179     // XServiceInfo
180 	IMPLEMENTATION_NAME(OImageControlControl);
181 	virtual StringSequence SAL_CALL getSupportedServiceNames() throw();
182 
183     // XMouseListener
184 	virtual void SAL_CALL mousePressed(const ::com::sun::star::awt::MouseEvent& e) throw ( ::com::sun::star::uno::RuntimeException);
185 	virtual void SAL_CALL mouseReleased(const ::com::sun::star::awt::MouseEvent& e) throw ( ::com::sun::star::uno::RuntimeException);
186 	virtual void SAL_CALL mouseEntered(const ::com::sun::star::awt::MouseEvent& e) throw ( ::com::sun::star::uno::RuntimeException);
187 	virtual void SAL_CALL mouseExited(const ::com::sun::star::awt::MouseEvent& e) throw ( ::com::sun::star::uno::RuntimeException);
188 
189     // XModifyBroadcaster
190     virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
191     virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
192 
193     // OComponentHelper
194     virtual void SAL_CALL disposing();
195 
196 private:
197 	void	implClearGraphics( sal_Bool _bForce );
198 	bool    implInsertGraphics();
199 
200     /** determines whether the control does currently have an empty grahic set
201     */
202     bool    impl_isEmptyGraphics_nothrow() const;
203 };
204 
205 //.........................................................................
206 }	// namespace frm
207 //.........................................................................
208 
209 #endif // _FRM_IMAGE_CONTROL_HXX_
210 
211