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_EVENT_THREAD_HXX_
29 #define _FRM_EVENT_THREAD_HXX_
30 
31 #include <com/sun/star/lang/XEventListener.hpp>
32 #include <com/sun/star/lang/EventObject.hpp>
33 #include <com/sun/star/lang/XComponent.hpp>
34 #include <com/sun/star/awt/XControl.hpp>
35 #include <vos/thread.hxx>
36 
37 
38 #include <osl/conditn.hxx>
39 #include <cppuhelper/component.hxx>
40 #include <comphelper/stl_types.hxx>
41 #include <comphelper/uno3.hxx>
42 using namespace comphelper;
43 
44 //.........................................................................
45 namespace frm
46 {
47 //.........................................................................
48 
49 // ***************************************************************************************************
50 // ***************************************************************************************************
51 
52 typedef ::vos::OThread	OComponentEventThread_TBASE;
53 class OComponentEventThread
54 			:public OComponentEventThread_TBASE
55 			,public ::com::sun::star::lang::XEventListener
56 			,public ::cppu::OWeakObject
57 {
58 	DECLARE_STL_VECTOR(::com::sun::star::lang::EventObject*, ThreadEvents);
59 	DECLARE_STL_VECTOR(::com::sun::star::uno::Reference< ::com::sun::star::uno::XAdapter> , ThreadObjects);
60 	DECLARE_STL_VECTOR(sal_Bool,	ThreadBools);
61 
62     ::osl::Mutex                    m_aMutex;
63 	::osl::Condition 				m_aCond;			// Queue gefuellt?
64 	ThreadEvents 					m_aEvents;			// Event-Queue
65 	ThreadObjects	 				m_aControls;		// Control fuer Submit
66 	ThreadBools						m_aFlags;			// Flags fuer Submit/Reset
67 
68 	::cppu::OComponentHelper*					m_pCompImpl;	// Implementierung des Controls
69 	::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent>	m_xComp;		// ::com::sun::star::lang::XComponent des Controls
70 
71 protected:
72 
73 	// XThread
74 	virtual void SAL_CALL run();
75 
76 	virtual void SAL_CALL kill();
77 	virtual void SAL_CALL onTerminated();
78 
79 	// Die folgende Methode wird gerufen um das Event unter Beruecksichtigung
80 	// seines Typs zu duplizieren.
81 	virtual ::com::sun::star::lang::EventObject* cloneEvent(const ::com::sun::star::lang::EventObject* _pEvt) const = 0;
82 
83 	// Ein Event bearbeiten. Der Mutex ist dabei nicht gelockt, pCompImpl
84 	// bleibt aber in jedem Fall gueltig. Bei pEvt kann es sich auch um
85 	// einen abgeleiteten Typ handeln, naemlich den, den cloneEvent
86 	// zurueckgibt. rControl ist nur gesetzt, wenn beim addEvent ein
87 	// Control uebergeben wurde. Da das Control nur als WeakRef gehalten
88 	// wird kann es auch zwischenzeitlich verschwinden.
89 	virtual void processEvent( ::cppu::OComponentHelper* _pCompImpl,
90 							   const ::com::sun::star::lang::EventObject* _pEvt,
91 							   const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& _rControl,
92 							   sal_Bool _bFlag) = 0;
93 
94 public:
95 
96 	// UNO Anbindung
97 	DECLARE_UNO3_DEFAULTS(OComponentEventThread, OWeakObject);
98 	virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(const ::com::sun::star::uno::Type& _rType) throw (::com::sun::star::uno::RuntimeException);
99 
100 	OComponentEventThread(::cppu::OComponentHelper* pCompImpl);
101 	virtual ~OComponentEventThread();
102 
103 	void addEvent( const ::com::sun::star::lang::EventObject* _pEvt, sal_Bool bFlag = sal_False );
104 	void addEvent( const ::com::sun::star::lang::EventObject* _pEvt, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl>& rControl,
105 				   sal_Bool bFlag = sal_False );
106 
107 	// ::com::sun::star::lang::XEventListener
108 	virtual void SAL_CALL disposing(const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException);
109 
110 /* resolve ambiguity : both OWeakObject and OObject have these memory operators */
111 	void * SAL_CALL operator new( size_t size ) throw() { return OThread::operator new(size); }
112 	void SAL_CALL operator delete( void * p ) throw() { OThread::operator delete(p); }
113 
114 private:
115 	void	implStarted( );
116 	void	implTerminated( );
117 
118     void    impl_clearEventQueue();
119 };
120 
121 //.........................................................................
122 }	// namespace frm
123 //.........................................................................
124 
125 #endif // _FRM_EVENT_THREAD_HXX_
126 
127