1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski #include <svx/sdr/event/eventhandler.hxx>
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski // for SOLARIS compiler include of algorithm part of _STL is necesary to
29*b1cdbd2cSJim Jagielski // get access to basic algos like ::std::find
30*b1cdbd2cSJim Jagielski #include <algorithm>
31*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski namespace sdr
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski 	namespace event
38*b1cdbd2cSJim Jagielski 	{
BaseEvent(EventHandler & rEventHandler)39*b1cdbd2cSJim Jagielski 		BaseEvent::BaseEvent(EventHandler& rEventHandler)
40*b1cdbd2cSJim Jagielski 		:	mrEventHandler(rEventHandler)
41*b1cdbd2cSJim Jagielski 		{
42*b1cdbd2cSJim Jagielski 			mrEventHandler.AddEvent(*this);
43*b1cdbd2cSJim Jagielski 		}
44*b1cdbd2cSJim Jagielski 
~BaseEvent()45*b1cdbd2cSJim Jagielski 		BaseEvent::~BaseEvent()
46*b1cdbd2cSJim Jagielski 		{
47*b1cdbd2cSJim Jagielski 			mrEventHandler.RemoveEvent(*this);
48*b1cdbd2cSJim Jagielski 		}
49*b1cdbd2cSJim Jagielski 	} // end of namespace mixer
50*b1cdbd2cSJim Jagielski } // end of namespace sdr
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski namespace sdr
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski 	namespace event
57*b1cdbd2cSJim Jagielski 	{
AddEvent(BaseEvent & rBaseEvent)58*b1cdbd2cSJim Jagielski 		void EventHandler::AddEvent(BaseEvent& rBaseEvent)
59*b1cdbd2cSJim Jagielski 		{
60*b1cdbd2cSJim Jagielski 			maVector.push_back(&rBaseEvent);
61*b1cdbd2cSJim Jagielski 		}
62*b1cdbd2cSJim Jagielski 
RemoveEvent(BaseEvent & rBaseEvent)63*b1cdbd2cSJim Jagielski 		void EventHandler::RemoveEvent(BaseEvent& rBaseEvent)
64*b1cdbd2cSJim Jagielski 		{
65*b1cdbd2cSJim Jagielski 			if(maVector.back() == &rBaseEvent)
66*b1cdbd2cSJim Jagielski 			{
67*b1cdbd2cSJim Jagielski 				// the one to remove is the last, pop
68*b1cdbd2cSJim Jagielski 				maVector.pop_back();
69*b1cdbd2cSJim Jagielski 			}
70*b1cdbd2cSJim Jagielski 			else
71*b1cdbd2cSJim Jagielski 			{
72*b1cdbd2cSJim Jagielski 				const BaseEventVector::iterator aFindResult = ::std::find(
73*b1cdbd2cSJim Jagielski 					maVector.begin(), maVector.end(), &rBaseEvent);
74*b1cdbd2cSJim Jagielski 				DBG_ASSERT(aFindResult != maVector.end(),
75*b1cdbd2cSJim Jagielski 					"EventHandler::RemoveEvent: Event to be removed not found (!)");
76*b1cdbd2cSJim Jagielski 				maVector.erase(aFindResult);
77*b1cdbd2cSJim Jagielski 			}
78*b1cdbd2cSJim Jagielski 		}
79*b1cdbd2cSJim Jagielski 
GetEvent()80*b1cdbd2cSJim Jagielski 		BaseEvent* EventHandler::GetEvent()
81*b1cdbd2cSJim Jagielski 		{
82*b1cdbd2cSJim Jagielski 			if(!maVector.empty())
83*b1cdbd2cSJim Jagielski 			{
84*b1cdbd2cSJim Jagielski 				// get the last event, that one is fastest to be removed
85*b1cdbd2cSJim Jagielski 				return maVector.back();
86*b1cdbd2cSJim Jagielski 			}
87*b1cdbd2cSJim Jagielski 			else
88*b1cdbd2cSJim Jagielski 			{
89*b1cdbd2cSJim Jagielski 				return 0L;
90*b1cdbd2cSJim Jagielski 			}
91*b1cdbd2cSJim Jagielski 		}
92*b1cdbd2cSJim Jagielski 
EventHandler()93*b1cdbd2cSJim Jagielski 		EventHandler::EventHandler()
94*b1cdbd2cSJim Jagielski 		{
95*b1cdbd2cSJim Jagielski 		}
96*b1cdbd2cSJim Jagielski 
~EventHandler()97*b1cdbd2cSJim Jagielski 		EventHandler::~EventHandler()
98*b1cdbd2cSJim Jagielski 		{
99*b1cdbd2cSJim Jagielski 			while(!maVector.empty())
100*b1cdbd2cSJim Jagielski 			{
101*b1cdbd2cSJim Jagielski 				delete GetEvent();
102*b1cdbd2cSJim Jagielski 			}
103*b1cdbd2cSJim Jagielski 		}
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski 		// Trigger and consume the events
ExecuteEvents()106*b1cdbd2cSJim Jagielski 		void EventHandler::ExecuteEvents()
107*b1cdbd2cSJim Jagielski 		{
108*b1cdbd2cSJim Jagielski             for(;;)
109*b1cdbd2cSJim Jagielski             {
110*b1cdbd2cSJim Jagielski                 BaseEvent* pEvent = GetEvent();
111*b1cdbd2cSJim Jagielski                 if(pEvent == NULL)
112*b1cdbd2cSJim Jagielski                     break;
113*b1cdbd2cSJim Jagielski 				pEvent->ExecuteEvent();
114*b1cdbd2cSJim Jagielski 				delete pEvent;
115*b1cdbd2cSJim Jagielski 			}
116*b1cdbd2cSJim Jagielski 		}
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 		// for control
IsEmpty() const119*b1cdbd2cSJim Jagielski 		sal_Bool EventHandler::IsEmpty() const
120*b1cdbd2cSJim Jagielski 		{
121*b1cdbd2cSJim Jagielski 			return (0L == maVector.size());
122*b1cdbd2cSJim Jagielski 		}
123*b1cdbd2cSJim Jagielski 	} // end of namespace mixer
124*b1cdbd2cSJim Jagielski } // end of namespace sdr
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski namespace sdr
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski 	namespace event
131*b1cdbd2cSJim Jagielski 	{
TimerEventHandler(sal_uInt32 nTimeout)132*b1cdbd2cSJim Jagielski 		TimerEventHandler::TimerEventHandler(sal_uInt32 nTimeout)
133*b1cdbd2cSJim Jagielski 		{
134*b1cdbd2cSJim Jagielski 			SetTimeout(nTimeout);
135*b1cdbd2cSJim Jagielski 			Stop();
136*b1cdbd2cSJim Jagielski 		}
137*b1cdbd2cSJim Jagielski 
~TimerEventHandler()138*b1cdbd2cSJim Jagielski 		TimerEventHandler::~TimerEventHandler()
139*b1cdbd2cSJim Jagielski 		{
140*b1cdbd2cSJim Jagielski 			Stop();
141*b1cdbd2cSJim Jagielski 		}
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 		// The timer when it is triggered; from class Timer
Timeout()144*b1cdbd2cSJim Jagielski 		void TimerEventHandler::Timeout()
145*b1cdbd2cSJim Jagielski 		{
146*b1cdbd2cSJim Jagielski 			ExecuteEvents();
147*b1cdbd2cSJim Jagielski 		}
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 		// reset the timer
Restart()150*b1cdbd2cSJim Jagielski 		void TimerEventHandler::Restart()
151*b1cdbd2cSJim Jagielski 		{
152*b1cdbd2cSJim Jagielski 			Start();
153*b1cdbd2cSJim Jagielski 		}
154*b1cdbd2cSJim Jagielski 	} // end of namespace mixer
155*b1cdbd2cSJim Jagielski } // end of namespace sdr
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
158*b1cdbd2cSJim Jagielski // eof
159