xref: /AOO41X/main/sc/inc/refreshtimer.hxx (revision 38d50f7b14e1cf975d8c6468d9633894cd59b523)
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 SC_REFRESHTIMER_HXX
25 #define SC_REFRESHTIMER_HXX
26 
27 #include <tools/list.hxx>
28 #include <vcl/timer.hxx>
29 #include <vos/mutex.hxx>
30 #include <scdllapi.h>
31 
32 #define SC_REFRESHTIMER_CONTROL_LIST 0
33 #if SC_REFRESHTIMER_CONTROL_LIST
34 class ScRefreshTimer;
35 DECLARE_LIST( ScRefreshTimerList, ScRefreshTimer* )
36 #endif
37 
38 class ScRefreshTimerControl
39 {
40 private:
41             ::vos::OMutex       aMutex;
42             sal_uInt16              nBlockRefresh;
43 
44 public:
45 #if SC_REFRESHTIMER_CONTROL_LIST
46             ScRefreshTimerList  aList;
47 #endif
48 
ScRefreshTimerControl()49                                 ScRefreshTimerControl() : nBlockRefresh(0) {}
50 
SetAllowRefresh(sal_Bool b)51             void                SetAllowRefresh( sal_Bool b )
52                                     {
53                                         if ( b && nBlockRefresh )
54                                             --nBlockRefresh;
55                                         else if ( !b && nBlockRefresh < (sal_uInt16)(~0) )
56                                             ++nBlockRefresh;
57                                     }
IsRefreshAllowed() const58             sal_Bool                IsRefreshAllowed() const    { return !nBlockRefresh; }
GetMutex()59             ::vos::OMutex&      GetMutex()                  { return aMutex; }
60 };
61 
62 
63 class ScRefreshTimerProtector
64 {
65 private:
66     ScRefreshTimerControl * const * ppControl;
67 public:
68                                 ScRefreshTimerProtector( ScRefreshTimerControl * const *     pp );
~ScRefreshTimerProtector()69                                 ~ScRefreshTimerProtector()
70                                     {
71                                         if ( ppControl && *ppControl )
72                                             (*ppControl)->SetAllowRefresh( sal_True );
73                                     }
74 };
75 
76 
77 class ScRefreshTimer : public AutoTimer
78 {
79 private:
80     ScRefreshTimerControl * const * ppControl;
81 
AppendToControl()82             void                AppendToControl()
83                                     {
84 #if SC_REFRESHTIMER_CONTROL_LIST
85                                         if ( ppControl && *ppControl )
86                                             (*ppControl)->aList.Insert( this, LIST_APPEND );
87 #endif
88                                     }
RemoveFromControl()89             void                RemoveFromControl()
90                                     {
91 #if SC_REFRESHTIMER_CONTROL_LIST
92                                         if ( ppControl && *ppControl )
93                                             (*ppControl)->aList.Remove( this );
94 #endif
95                                     }
96 
Start()97             void                Start()
98                                     {
99                                         if ( GetTimeout() )
100                                             AutoTimer::Start();
101                                     }
102 
103 public:
ScRefreshTimer()104                                 ScRefreshTimer() : ppControl(0)
105                                     { SetTimeout( 0 ); }
ScRefreshTimer(sal_uLong nSeconds)106                                 ScRefreshTimer( sal_uLong nSeconds ) : ppControl(0)
107                                     {
108                                         SetTimeout( nSeconds * 1000 );
109                                         Start();
110                                     }
ScRefreshTimer(const ScRefreshTimer & r)111                                 ScRefreshTimer( const ScRefreshTimer& r )
112                                     : AutoTimer( r ), ppControl(0)
113                                     {}
114     virtual                     ~ScRefreshTimer();
115 
operator =(const ScRefreshTimer & r)116             ScRefreshTimer&     operator=( const ScRefreshTimer& r )
117                                     {
118                                         SetRefreshControl(0);
119                                         AutoTimer::operator=( r );
120                                         return *this;
121                                     }
122 
operator ==(const ScRefreshTimer & r) const123             sal_Bool                operator==( const ScRefreshTimer& r ) const
124                                     { return GetTimeout() == r.GetTimeout(); }
125 
operator !=(const ScRefreshTimer & r) const126             sal_Bool                operator!=( const ScRefreshTimer& r ) const
127                                     { return !ScRefreshTimer::operator==( r ); }
128 
StartRefreshTimer()129             void                StartRefreshTimer()
130                                     { Start(); }
131 
SetRefreshControl(ScRefreshTimerControl * const * pp)132             void                SetRefreshControl( ScRefreshTimerControl * const * pp )
133                                     {
134                                         RemoveFromControl();
135                                         ppControl = pp;
136                                         AppendToControl();
137                                     }
138 
SetRefreshHandler(const Link & rLink)139             void                SetRefreshHandler( const Link& rLink )
140                                     { SetTimeoutHdl( rLink ); }
141 
GetRefreshDelay() const142             sal_uLong               GetRefreshDelay() const
143                                     { return GetTimeout() / 1000; }
144 
StopRefreshTimer()145             void                StopRefreshTimer()
146                                     { Stop(); }
147 
148     SC_DLLPUBLIC virtual    void                SetRefreshDelay( sal_uLong nSeconds );
149     SC_DLLPUBLIC virtual    void                Timeout();
150 };
151 
152 
153 #endif // SC_REFRESHTIMER_HXX
154 
155