xref: /AOO41X/main/svx/source/sdr/event/eventhandler.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <svx/sdr/event/eventhandler.hxx>
27 
28 // for SOLARIS compiler include of algorithm part of _STL is necesary to
29 // get access to basic algos like ::std::find
30 #include <algorithm>
31 #include <tools/debug.hxx>
32 
33 //////////////////////////////////////////////////////////////////////////////
34 
35 namespace sdr
36 {
37     namespace event
38     {
BaseEvent(EventHandler & rEventHandler)39         BaseEvent::BaseEvent(EventHandler& rEventHandler)
40         :   mrEventHandler(rEventHandler)
41         {
42             mrEventHandler.AddEvent(*this);
43         }
44 
~BaseEvent()45         BaseEvent::~BaseEvent()
46         {
47             mrEventHandler.RemoveEvent(*this);
48         }
49     } // end of namespace mixer
50 } // end of namespace sdr
51 
52 //////////////////////////////////////////////////////////////////////////////
53 
54 namespace sdr
55 {
56     namespace event
57     {
AddEvent(BaseEvent & rBaseEvent)58         void EventHandler::AddEvent(BaseEvent& rBaseEvent)
59         {
60             maVector.push_back(&rBaseEvent);
61         }
62 
RemoveEvent(BaseEvent & rBaseEvent)63         void EventHandler::RemoveEvent(BaseEvent& rBaseEvent)
64         {
65             if(maVector.back() == &rBaseEvent)
66             {
67                 // the one to remove is the last, pop
68                 maVector.pop_back();
69             }
70             else
71             {
72                 const BaseEventVector::iterator aFindResult = ::std::find(
73                     maVector.begin(), maVector.end(), &rBaseEvent);
74                 DBG_ASSERT(aFindResult != maVector.end(),
75                     "EventHandler::RemoveEvent: Event to be removed not found (!)");
76                 maVector.erase(aFindResult);
77             }
78         }
79 
GetEvent()80         BaseEvent* EventHandler::GetEvent()
81         {
82             if(!maVector.empty())
83             {
84                 // get the last event, that one is fastest to be removed
85                 return maVector.back();
86             }
87             else
88             {
89                 return 0L;
90             }
91         }
92 
EventHandler()93         EventHandler::EventHandler()
94         {
95         }
96 
~EventHandler()97         EventHandler::~EventHandler()
98         {
99             while(!maVector.empty())
100             {
101                 delete GetEvent();
102             }
103         }
104 
105         // Trigger and consume the events
ExecuteEvents()106         void EventHandler::ExecuteEvents()
107         {
108             for(;;)
109             {
110                 BaseEvent* pEvent = GetEvent();
111                 if(pEvent == NULL)
112                     break;
113                 pEvent->ExecuteEvent();
114                 delete pEvent;
115             }
116         }
117 
118         // for control
IsEmpty() const119         sal_Bool EventHandler::IsEmpty() const
120         {
121             return (0L == maVector.size());
122         }
123     } // end of namespace mixer
124 } // end of namespace sdr
125 
126 //////////////////////////////////////////////////////////////////////////////
127 
128 namespace sdr
129 {
130     namespace event
131     {
TimerEventHandler(sal_uInt32 nTimeout)132         TimerEventHandler::TimerEventHandler(sal_uInt32 nTimeout)
133         {
134             SetTimeout(nTimeout);
135             Stop();
136         }
137 
~TimerEventHandler()138         TimerEventHandler::~TimerEventHandler()
139         {
140             Stop();
141         }
142 
143         // The timer when it is triggered; from class Timer
Timeout()144         void TimerEventHandler::Timeout()
145         {
146             ExecuteEvents();
147         }
148 
149         // reset the timer
Restart()150         void TimerEventHandler::Restart()
151         {
152             Start();
153         }
154     } // end of namespace mixer
155 } // end of namespace sdr
156 
157 //////////////////////////////////////////////////////////////////////////////
158 // eof
159