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