1*5900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5900e8ecSAndrew Rist  * distributed with this work for additional information
6*5900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
9*5900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5900e8ecSAndrew Rist  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5900e8ecSAndrew Rist  *
13*5900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5900e8ecSAndrew Rist  * software distributed under the License is distributed on an
15*5900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
17*5900e8ecSAndrew Rist  * specific language governing permissions and limitations
18*5900e8ecSAndrew Rist  * under the License.
19*5900e8ecSAndrew Rist  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define _TASKBAR_CXX
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <tools/list.hxx>
30cdf0e10cSrcweir #include <tools/debug.hxx>
31cdf0e10cSrcweir #include <tools/date.hxx>
32cdf0e10cSrcweir #include <vcl/image.hxx>
33cdf0e10cSrcweir #include <vcl/help.hxx>
34cdf0e10cSrcweir #include <vcl/svapp.hxx>
35cdf0e10cSrcweir #include <unotools/calendarwrapper.hxx>
36cdf0e10cSrcweir #include <unotools/syslocale.hxx>
37cdf0e10cSrcweir #include <svtools/taskbar.hxx>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir // =======================================================================
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #define TASKSTATUSBAR_CLOCXOFFX     3
42cdf0e10cSrcweir #define TASKSTATUSBAR_IMAGEOFFX     1
43cdf0e10cSrcweir 
44cdf0e10cSrcweir // =======================================================================
45cdf0e10cSrcweir 
46cdf0e10cSrcweir struct ImplTaskSBFldItem
47cdf0e10cSrcweir {
48cdf0e10cSrcweir     TaskStatusFieldItem     maItem;
49cdf0e10cSrcweir     sal_uInt16                  mnId;
50cdf0e10cSrcweir     long                    mnOffX;
51cdf0e10cSrcweir };
52cdf0e10cSrcweir 
DECLARE_LIST(ImplTaskSBItemList,ImplTaskSBFldItem *)53cdf0e10cSrcweir DECLARE_LIST( ImplTaskSBItemList, ImplTaskSBFldItem* )
54cdf0e10cSrcweir 
55cdf0e10cSrcweir // =======================================================================
56cdf0e10cSrcweir 
57cdf0e10cSrcweir sal_Bool ITaskStatusNotify::MouseButtonDown( sal_uInt16, const MouseEvent& )
58cdf0e10cSrcweir {
59cdf0e10cSrcweir     return sal_False;
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir // -----------------------------------------------------------------------
63cdf0e10cSrcweir 
MouseButtonUp(sal_uInt16,const MouseEvent &)64cdf0e10cSrcweir sal_Bool ITaskStatusNotify::MouseButtonUp( sal_uInt16, const MouseEvent& )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir     return sal_False;
67cdf0e10cSrcweir }
68cdf0e10cSrcweir 
69cdf0e10cSrcweir // -----------------------------------------------------------------------
70cdf0e10cSrcweir 
MouseMove(sal_uInt16,const MouseEvent &)71cdf0e10cSrcweir sal_Bool ITaskStatusNotify::MouseMove( sal_uInt16, const MouseEvent& )
72cdf0e10cSrcweir {
73cdf0e10cSrcweir     return sal_False;
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
76cdf0e10cSrcweir // -----------------------------------------------------------------------
77cdf0e10cSrcweir 
Command(sal_uInt16,const CommandEvent &)78cdf0e10cSrcweir sal_Bool ITaskStatusNotify::Command( sal_uInt16, const CommandEvent& )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir     return sal_False;
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir // -----------------------------------------------------------------------
84cdf0e10cSrcweir 
UpdateHelp(sal_uInt16)85cdf0e10cSrcweir sal_Bool ITaskStatusNotify::UpdateHelp( sal_uInt16 )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir     return sal_False;
88cdf0e10cSrcweir }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir // =======================================================================
91cdf0e10cSrcweir 
TaskStatusFieldItem()92cdf0e10cSrcweir TaskStatusFieldItem::TaskStatusFieldItem()
93cdf0e10cSrcweir {
94cdf0e10cSrcweir     mpNotify        = NULL;
95cdf0e10cSrcweir     mnFlags         = 0;
96cdf0e10cSrcweir }
97cdf0e10cSrcweir 
98cdf0e10cSrcweir // -----------------------------------------------------------------------
99cdf0e10cSrcweir 
TaskStatusFieldItem(const TaskStatusFieldItem & rItem)100cdf0e10cSrcweir TaskStatusFieldItem::TaskStatusFieldItem( const TaskStatusFieldItem& rItem ) :
101cdf0e10cSrcweir     mpNotify( rItem.mpNotify ),
102cdf0e10cSrcweir     maImage( rItem.maImage ),
103cdf0e10cSrcweir     maQuickHelpText( rItem.maQuickHelpText ),
104cdf0e10cSrcweir     maHelpText( rItem.maHelpText ),
105cdf0e10cSrcweir     mnFlags( rItem.mnFlags )
106cdf0e10cSrcweir {
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir // -----------------------------------------------------------------------
110cdf0e10cSrcweir 
TaskStatusFieldItem(ITaskStatusNotify * pNotify,const Image & rImage,const XubString & rQuickHelpText,const XubString & rHelpText,sal_uInt16 nFlags)111cdf0e10cSrcweir TaskStatusFieldItem::TaskStatusFieldItem( ITaskStatusNotify* pNotify,
112cdf0e10cSrcweir                                           const Image& rImage,
113cdf0e10cSrcweir                                           const XubString& rQuickHelpText,
114cdf0e10cSrcweir                                           const XubString& rHelpText,
115cdf0e10cSrcweir                                           sal_uInt16 nFlags ) :
116cdf0e10cSrcweir     mpNotify( pNotify ),
117cdf0e10cSrcweir     maImage( rImage ),
118cdf0e10cSrcweir     maQuickHelpText( rQuickHelpText ),
119cdf0e10cSrcweir     maHelpText( rHelpText ),
120cdf0e10cSrcweir     mnFlags( nFlags )
121cdf0e10cSrcweir {
122cdf0e10cSrcweir }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir // -----------------------------------------------------------------------
125cdf0e10cSrcweir 
~TaskStatusFieldItem()126cdf0e10cSrcweir TaskStatusFieldItem::~TaskStatusFieldItem()
127cdf0e10cSrcweir {
128cdf0e10cSrcweir }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir // -----------------------------------------------------------------------
131cdf0e10cSrcweir 
operator =(const TaskStatusFieldItem & rItem)132cdf0e10cSrcweir const TaskStatusFieldItem& TaskStatusFieldItem::operator=( const TaskStatusFieldItem& rItem )
133cdf0e10cSrcweir {
134cdf0e10cSrcweir     mpNotify        = rItem.mpNotify;
135cdf0e10cSrcweir     maImage         = rItem.maImage;
136cdf0e10cSrcweir     maQuickHelpText = rItem.maQuickHelpText;
137cdf0e10cSrcweir     maHelpText      = rItem.maHelpText;
138cdf0e10cSrcweir     mnFlags         = rItem.mnFlags;
139cdf0e10cSrcweir     return *this;
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir // =======================================================================
143cdf0e10cSrcweir 
TaskStatusBar(Window * pParent,WinBits nWinStyle)144cdf0e10cSrcweir TaskStatusBar::TaskStatusBar( Window* pParent, WinBits nWinStyle ) :
145cdf0e10cSrcweir     StatusBar( pParent, nWinStyle | WB_3DLOOK ),
146cdf0e10cSrcweir     maTime( 0, 0, 0 )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir     mpFieldItemList = NULL;
149cdf0e10cSrcweir     mpNotifyTaskBar = NULL;
150cdf0e10cSrcweir     mpNotify        = NULL;
151cdf0e10cSrcweir     mnClockWidth    = 0;
152cdf0e10cSrcweir     mnItemWidth     = 0;
153cdf0e10cSrcweir     mnFieldWidth    = 0;
154cdf0e10cSrcweir     mnFieldFlags    = 0;
155cdf0e10cSrcweir     mbFlashItems    = sal_False;
156cdf0e10cSrcweir     mbOutInterval   = sal_False;
157cdf0e10cSrcweir 
158cdf0e10cSrcweir     maTimer.SetTimeoutHdl( LINK( this, TaskStatusBar, ImplTimerHdl ) );
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir // -----------------------------------------------------------------------
162cdf0e10cSrcweir 
~TaskStatusBar()163cdf0e10cSrcweir TaskStatusBar::~TaskStatusBar()
164cdf0e10cSrcweir {
165cdf0e10cSrcweir     if ( mpFieldItemList )
166cdf0e10cSrcweir     {
167cdf0e10cSrcweir         ImplTaskSBFldItem* pItem = mpFieldItemList->First();
168cdf0e10cSrcweir         while ( pItem )
169cdf0e10cSrcweir         {
170cdf0e10cSrcweir             delete pItem;
171cdf0e10cSrcweir             pItem = mpFieldItemList->Next();
172cdf0e10cSrcweir         }
173cdf0e10cSrcweir 
174cdf0e10cSrcweir         delete mpFieldItemList;
175cdf0e10cSrcweir     }
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir // -----------------------------------------------------------------------
179cdf0e10cSrcweir 
IMPL_LINK(TaskStatusBar,ImplTimerHdl,Timer *,EMPTYARG)180cdf0e10cSrcweir IMPL_LINK( TaskStatusBar, ImplTimerHdl, Timer*, EMPTYARG )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     sal_Bool bUpdate = ImplUpdateClock();
183cdf0e10cSrcweir     if ( ImplUpdateFlashItems() )
184cdf0e10cSrcweir         bUpdate = sal_True;
185cdf0e10cSrcweir     if ( bUpdate )
186cdf0e10cSrcweir         SetItemData( TASKSTATUSBAR_STATUSFIELDID, NULL );
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     return 0;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir // -----------------------------------------------------------------------
192cdf0e10cSrcweir 
ImplGetFieldItem(sal_uInt16 nItemId) const193cdf0e10cSrcweir ImplTaskSBFldItem* TaskStatusBar::ImplGetFieldItem( sal_uInt16 nItemId ) const
194cdf0e10cSrcweir {
195cdf0e10cSrcweir     if ( !mpFieldItemList )
196cdf0e10cSrcweir         return NULL;
197cdf0e10cSrcweir 
198cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = mpFieldItemList->First();
199cdf0e10cSrcweir     while ( pItem )
200cdf0e10cSrcweir     {
201cdf0e10cSrcweir         if ( pItem->mnId == nItemId )
202cdf0e10cSrcweir             return pItem;
203cdf0e10cSrcweir 
204cdf0e10cSrcweir         pItem = mpFieldItemList->Next();
205cdf0e10cSrcweir     }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     return NULL;
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir // -----------------------------------------------------------------------
211cdf0e10cSrcweir 
ImplGetFieldItem(const Point & rPos,sal_Bool & rFieldRect) const212cdf0e10cSrcweir ImplTaskSBFldItem* TaskStatusBar::ImplGetFieldItem( const Point& rPos, sal_Bool& rFieldRect ) const
213cdf0e10cSrcweir {
214cdf0e10cSrcweir     if ( GetItemId( rPos ) == TASKSTATUSBAR_STATUSFIELDID )
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         rFieldRect = sal_True;
217cdf0e10cSrcweir 
218cdf0e10cSrcweir         if ( mpFieldItemList )
219cdf0e10cSrcweir         {
220cdf0e10cSrcweir             long nX = rPos.X()-GetItemRect( TASKSTATUSBAR_STATUSFIELDID ).Left();
221cdf0e10cSrcweir             ImplTaskSBFldItem* pItem = mpFieldItemList->First();
222cdf0e10cSrcweir             while ( pItem )
223cdf0e10cSrcweir             {
224cdf0e10cSrcweir                 if ( nX < pItem->mnOffX+pItem->maItem.GetImage().GetSizePixel().Width() )
225cdf0e10cSrcweir                     return pItem;
226cdf0e10cSrcweir 
227cdf0e10cSrcweir                 pItem = mpFieldItemList->Next();
228cdf0e10cSrcweir             }
229cdf0e10cSrcweir         }
230cdf0e10cSrcweir     }
231cdf0e10cSrcweir     else
232cdf0e10cSrcweir         rFieldRect = sal_False;
233cdf0e10cSrcweir 
234cdf0e10cSrcweir     return NULL;
235cdf0e10cSrcweir }
236cdf0e10cSrcweir 
237cdf0e10cSrcweir // -----------------------------------------------------------------------
238cdf0e10cSrcweir 
ImplUpdateClock()239cdf0e10cSrcweir sal_Bool TaskStatusBar::ImplUpdateClock()
240cdf0e10cSrcweir {
241cdf0e10cSrcweir     if ( mnFieldFlags & TASKSTATUSFIELD_CLOCK )
242cdf0e10cSrcweir     {
243cdf0e10cSrcweir         Time aTime;
244cdf0e10cSrcweir         maTimer.SetTimeout( ((long)60000)-((aTime.GetSec()*1000)+(aTime.Get100Sec()*10)) );
245cdf0e10cSrcweir         if ( (aTime.GetMin()  != maTime.GetMin()) ||
246cdf0e10cSrcweir              (aTime.GetHour() != maTime.GetHour()) )
247cdf0e10cSrcweir         {
248cdf0e10cSrcweir             maTime = aTime;
249cdf0e10cSrcweir             maTimeText = SvtSysLocale().GetLocaleData().getTime( aTime, sal_False, sal_False );
250cdf0e10cSrcweir             return sal_True;
251cdf0e10cSrcweir         }
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir 
254cdf0e10cSrcweir     return sal_False;
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir // -----------------------------------------------------------------------
258cdf0e10cSrcweir 
ImplUpdateFlashItems()259cdf0e10cSrcweir sal_Bool TaskStatusBar::ImplUpdateFlashItems()
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     if ( mbFlashItems )
262cdf0e10cSrcweir     {
263cdf0e10cSrcweir         if ( mbOutInterval )
264cdf0e10cSrcweir         {
265cdf0e10cSrcweir             maTimer.SetTimeout( 900 );
266cdf0e10cSrcweir             mbOutInterval = sal_False;
267cdf0e10cSrcweir         }
268cdf0e10cSrcweir         else
269cdf0e10cSrcweir         {
270cdf0e10cSrcweir             maTimer.SetTimeout( 700 );
271cdf0e10cSrcweir             mbOutInterval = sal_True;
272cdf0e10cSrcweir         }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir         return sal_True;
275cdf0e10cSrcweir     }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     return sal_False;
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir // -----------------------------------------------------------------------
281cdf0e10cSrcweir 
ImplUpdateField(sal_Bool bItems)282cdf0e10cSrcweir void TaskStatusBar::ImplUpdateField( sal_Bool bItems )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir     maTimer.Stop();
285cdf0e10cSrcweir 
286cdf0e10cSrcweir     if ( bItems )
287cdf0e10cSrcweir     {
288cdf0e10cSrcweir         ImplTaskSBFldItem* pItem = mpFieldItemList->First();
289cdf0e10cSrcweir         mnItemWidth = 0;
290cdf0e10cSrcweir         mbFlashItems = sal_False;
291cdf0e10cSrcweir         mbOutInterval = sal_False;
292cdf0e10cSrcweir         while ( pItem )
293cdf0e10cSrcweir         {
294cdf0e10cSrcweir             mnItemWidth += TASKSTATUSBAR_IMAGEOFFX;
295cdf0e10cSrcweir             pItem->mnOffX = mnItemWidth;
296cdf0e10cSrcweir             mnItemWidth += pItem->maItem.GetImage().GetSizePixel().Width();
297cdf0e10cSrcweir             if ( pItem->maItem.GetFlags() & TASKSTATUSFIELDITEM_FLASH )
298cdf0e10cSrcweir                 mbFlashItems = sal_True;
299cdf0e10cSrcweir 
300cdf0e10cSrcweir             pItem = mpFieldItemList->Next();
301cdf0e10cSrcweir         }
302cdf0e10cSrcweir     }
303cdf0e10cSrcweir     else
304cdf0e10cSrcweir     {
305cdf0e10cSrcweir         if ( mnFieldFlags & TASKSTATUSFIELD_CLOCK )
306cdf0e10cSrcweir         {
307cdf0e10cSrcweir             XubString aStr = SvtSysLocale().GetLocaleData().getTime( Time( 23, 59, 59 ), sal_False, sal_False );
308cdf0e10cSrcweir             mnClockWidth = GetTextWidth( aStr )+(TASKSTATUSBAR_CLOCXOFFX*2);
309cdf0e10cSrcweir         }
310cdf0e10cSrcweir         else
311cdf0e10cSrcweir             mnClockWidth = 0;
312cdf0e10cSrcweir     }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir     long nNewWidth = mnItemWidth+mnClockWidth;
315cdf0e10cSrcweir     if ( mnItemWidth && !mnClockWidth )
316cdf0e10cSrcweir         nNewWidth += TASKSTATUSBAR_IMAGEOFFX;
317cdf0e10cSrcweir     if ( nNewWidth != mnFieldWidth )
318cdf0e10cSrcweir     {
319cdf0e10cSrcweir         RemoveItem( TASKSTATUSBAR_STATUSFIELDID );
320cdf0e10cSrcweir 
321cdf0e10cSrcweir         if ( mnItemWidth || mnClockWidth )
322cdf0e10cSrcweir         {
323cdf0e10cSrcweir             mnFieldWidth = nNewWidth;
324cdf0e10cSrcweir             long    nOffset = GetItemOffset( TASKSTATUSBAR_STATUSFIELDID );
325cdf0e10cSrcweir             sal_uInt16  nItemPos = GetItemPos( TASKSTATUSBAR_STATUSFIELDID );
326cdf0e10cSrcweir             InsertItem( TASKSTATUSBAR_STATUSFIELDID, nNewWidth, SIB_RIGHT | SIB_IN | SIB_USERDRAW, nOffset, nItemPos );
327cdf0e10cSrcweir         }
328cdf0e10cSrcweir         else
329cdf0e10cSrcweir             mnFieldWidth = 0;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir         if ( mpNotifyTaskBar )
332cdf0e10cSrcweir             mpNotifyTaskBar->Resize();
333cdf0e10cSrcweir     }
334cdf0e10cSrcweir     else
335cdf0e10cSrcweir         SetItemData( TASKSTATUSBAR_STATUSFIELDID, NULL );
336cdf0e10cSrcweir 
337cdf0e10cSrcweir     if ( mbFlashItems || (mnFieldFlags & TASKSTATUSFIELD_CLOCK) )
338cdf0e10cSrcweir     {
339cdf0e10cSrcweir         ImplUpdateClock();
340cdf0e10cSrcweir         mbOutInterval = sal_True;
341cdf0e10cSrcweir         ImplUpdateFlashItems();
342cdf0e10cSrcweir         maTimer.Start();
343cdf0e10cSrcweir     }
344cdf0e10cSrcweir }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir // -----------------------------------------------------------------------
347cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)348cdf0e10cSrcweir void TaskStatusBar::MouseButtonDown( const MouseEvent& rMEvt )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir     sal_Bool bFieldRect;
351cdf0e10cSrcweir     sal_Bool bBaseClass = sal_False;
352cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( rMEvt.GetPosPixel(), bFieldRect );
353cdf0e10cSrcweir 
354cdf0e10cSrcweir     ITaskStatusNotify*  pNotify = mpNotify;
355cdf0e10cSrcweir     sal_uInt16              nItemId = 0;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir     if ( bFieldRect )
358cdf0e10cSrcweir         nItemId = TASKSTATUSBAR_CLOCKID;
359cdf0e10cSrcweir 
360cdf0e10cSrcweir     if ( pItem )
361cdf0e10cSrcweir     {
362cdf0e10cSrcweir         pNotify = pItem->maItem.GetNotifyObject();
363cdf0e10cSrcweir         nItemId = pItem->mnId;
364cdf0e10cSrcweir     }
365cdf0e10cSrcweir 
366cdf0e10cSrcweir     if ( pNotify )
367cdf0e10cSrcweir         bBaseClass = pNotify->MouseButtonDown( nItemId, rMEvt );
368cdf0e10cSrcweir 
369cdf0e10cSrcweir     if ( bBaseClass )
370cdf0e10cSrcweir         StatusBar::MouseButtonDown( rMEvt );
371cdf0e10cSrcweir }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir // -----------------------------------------------------------------------
374cdf0e10cSrcweir 
MouseButtonUp(const MouseEvent & rMEvt)375cdf0e10cSrcweir void TaskStatusBar::MouseButtonUp( const MouseEvent& rMEvt )
376cdf0e10cSrcweir {
377cdf0e10cSrcweir     sal_Bool bFieldRect;
378cdf0e10cSrcweir     sal_Bool bBaseClass = sal_False;
379cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( rMEvt.GetPosPixel(), bFieldRect );
380cdf0e10cSrcweir 
381cdf0e10cSrcweir     ITaskStatusNotify*  pNotify = mpNotify;
382cdf0e10cSrcweir     sal_uInt16              nItemId = 0;
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     if ( bFieldRect )
385cdf0e10cSrcweir         nItemId = TASKSTATUSBAR_CLOCKID;
386cdf0e10cSrcweir 
387cdf0e10cSrcweir     if ( pItem )
388cdf0e10cSrcweir     {
389cdf0e10cSrcweir         pNotify = pItem->maItem.GetNotifyObject();
390cdf0e10cSrcweir         nItemId = pItem->mnId;
391cdf0e10cSrcweir     }
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     if ( pNotify )
394cdf0e10cSrcweir         bBaseClass = pNotify->MouseButtonUp( nItemId, rMEvt );
395cdf0e10cSrcweir 
396cdf0e10cSrcweir     if ( bBaseClass )
397cdf0e10cSrcweir         StatusBar::MouseButtonUp( rMEvt );
398cdf0e10cSrcweir }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir // -----------------------------------------------------------------------
401cdf0e10cSrcweir 
MouseMove(const MouseEvent & rMEvt)402cdf0e10cSrcweir void TaskStatusBar::MouseMove( const MouseEvent& rMEvt )
403cdf0e10cSrcweir {
404cdf0e10cSrcweir     sal_Bool bFieldRect;
405cdf0e10cSrcweir     sal_Bool bBaseClass = sal_False;
406cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( rMEvt.GetPosPixel(), bFieldRect );
407cdf0e10cSrcweir 
408cdf0e10cSrcweir     ITaskStatusNotify*  pNotify = mpNotify;
409cdf0e10cSrcweir     sal_uInt16              nItemId = 0;
410cdf0e10cSrcweir 
411cdf0e10cSrcweir     if ( bFieldRect )
412cdf0e10cSrcweir         nItemId = TASKSTATUSBAR_CLOCKID;
413cdf0e10cSrcweir 
414cdf0e10cSrcweir     if ( pItem )
415cdf0e10cSrcweir     {
416cdf0e10cSrcweir         pNotify = pItem->maItem.GetNotifyObject();
417cdf0e10cSrcweir         nItemId = pItem->mnId;
418cdf0e10cSrcweir     }
419cdf0e10cSrcweir 
420cdf0e10cSrcweir     if ( pNotify )
421cdf0e10cSrcweir         bBaseClass = pNotify->MouseMove( nItemId, rMEvt );
422cdf0e10cSrcweir 
423cdf0e10cSrcweir     if ( bBaseClass )
424cdf0e10cSrcweir         StatusBar::MouseMove( rMEvt );
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
427cdf0e10cSrcweir // -----------------------------------------------------------------------
428cdf0e10cSrcweir 
Command(const CommandEvent & rCEvt)429cdf0e10cSrcweir void TaskStatusBar::Command( const CommandEvent& rCEvt )
430cdf0e10cSrcweir {
431cdf0e10cSrcweir     sal_Bool bFieldRect;
432cdf0e10cSrcweir     sal_Bool bBaseClass = sal_False;
433cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( rCEvt.GetMousePosPixel(), bFieldRect );
434cdf0e10cSrcweir 
435cdf0e10cSrcweir     ITaskStatusNotify*  pNotify = mpNotify;
436cdf0e10cSrcweir     sal_uInt16              nItemId = 0;
437cdf0e10cSrcweir 
438cdf0e10cSrcweir     if ( bFieldRect )
439cdf0e10cSrcweir         nItemId = TASKSTATUSBAR_CLOCKID;
440cdf0e10cSrcweir 
441cdf0e10cSrcweir     if ( pItem )
442cdf0e10cSrcweir     {
443cdf0e10cSrcweir         pNotify = pItem->maItem.GetNotifyObject();
444cdf0e10cSrcweir         nItemId = pItem->mnId;
445cdf0e10cSrcweir     }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir     if ( pNotify )
448cdf0e10cSrcweir         bBaseClass = pNotify->Command( nItemId, rCEvt );
449cdf0e10cSrcweir 
450cdf0e10cSrcweir     if ( bBaseClass )
451cdf0e10cSrcweir         StatusBar::Command( rCEvt );
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
454cdf0e10cSrcweir // -----------------------------------------------------------------------
455cdf0e10cSrcweir 
RequestHelp(const HelpEvent & rHEvt)456cdf0e10cSrcweir void TaskStatusBar::RequestHelp( const HelpEvent& rHEvt )
457cdf0e10cSrcweir {
458cdf0e10cSrcweir     sal_Bool bFieldRect;
459cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ), bFieldRect );
460cdf0e10cSrcweir     if ( bFieldRect )
461cdf0e10cSrcweir     {
462cdf0e10cSrcweir         ITaskStatusNotify*  pNotify = mpNotify;
463cdf0e10cSrcweir         sal_uInt16              nItemId = 0;
464cdf0e10cSrcweir 
465cdf0e10cSrcweir         if ( pItem )
466cdf0e10cSrcweir         {
467cdf0e10cSrcweir             pNotify = pItem->maItem.GetNotifyObject();
468cdf0e10cSrcweir             nItemId = pItem->mnId;
469cdf0e10cSrcweir         }
470cdf0e10cSrcweir 
471cdf0e10cSrcweir         if ( pNotify )
472cdf0e10cSrcweir             pNotify->UpdateHelp( nItemId );
473cdf0e10cSrcweir 
474cdf0e10cSrcweir         if ( rHEvt.GetMode() & (HELPMODE_BALLOON | HELPMODE_QUICK) )
475cdf0e10cSrcweir         {
476cdf0e10cSrcweir             Rectangle aItemRect = GetItemRect( TASKSTATUSBAR_STATUSFIELDID );
477cdf0e10cSrcweir             Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
478cdf0e10cSrcweir             aItemRect.Left()   = aPt.X();
479cdf0e10cSrcweir             aItemRect.Top()    = aPt.Y();
480cdf0e10cSrcweir             aPt = OutputToScreenPixel( aItemRect.BottomRight() );
481cdf0e10cSrcweir             aItemRect.Right()  = aPt.X();
482cdf0e10cSrcweir             aItemRect.Bottom() = aPt.Y();
483cdf0e10cSrcweir             if ( pItem )
484cdf0e10cSrcweir             {
485cdf0e10cSrcweir                 if ( rHEvt.GetMode() & HELPMODE_BALLOON )
486cdf0e10cSrcweir                 {
487cdf0e10cSrcweir                     XubString aStr = pItem->maItem.GetHelpText();
488cdf0e10cSrcweir                     if ( !aStr.Len() )
489cdf0e10cSrcweir                         aStr = pItem->maItem.GetQuickHelpText();
490cdf0e10cSrcweir                     Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr );
491cdf0e10cSrcweir                 }
492cdf0e10cSrcweir                 else
493cdf0e10cSrcweir                     Help::ShowQuickHelp( this, aItemRect, pItem->maItem.GetQuickHelpText() );
494cdf0e10cSrcweir             }
495cdf0e10cSrcweir             else
496cdf0e10cSrcweir             {
497cdf0e10cSrcweir                 SvtSysLocale aSL;
498cdf0e10cSrcweir                 const LocaleDataWrapper& rLDW = aSL.GetLocaleData();
499cdf0e10cSrcweir                 CalendarWrapper aCal( rLDW.getServiceFactory());
500cdf0e10cSrcweir                 aCal.loadDefaultCalendar( rLDW.getLoadedLocale());
501cdf0e10cSrcweir                 XubString aStr = rLDW.getLongDate( Date(), aCal );
502cdf0e10cSrcweir                 if ( rHEvt.GetMode() & HELPMODE_BALLOON )
503cdf0e10cSrcweir                     Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr );
504cdf0e10cSrcweir                 else
505cdf0e10cSrcweir                     Help::ShowQuickHelp( this, aItemRect, aStr );
506cdf0e10cSrcweir             }
507cdf0e10cSrcweir             return;
508cdf0e10cSrcweir         }
509cdf0e10cSrcweir         else if ( rHEvt.GetMode() & HELPMODE_EXTENDED )
510cdf0e10cSrcweir         {
511cdf0e10cSrcweir             if ( pItem )
512cdf0e10cSrcweir             {
513cdf0e10cSrcweir                 rtl::OUString aHelpId( rtl::OStringToOUString( pItem->maItem.GetHelpId(), RTL_TEXTENCODING_UTF8 ) );
514cdf0e10cSrcweir                 if ( aHelpId.getLength() )
515cdf0e10cSrcweir                 {
516cdf0e10cSrcweir                     // Wenn eine Hilfe existiert, dann ausloesen
517cdf0e10cSrcweir                     Help* pHelp = Application::GetHelp();
518cdf0e10cSrcweir                     if ( pHelp )
519cdf0e10cSrcweir                         pHelp->Start( aHelpId, this );
520cdf0e10cSrcweir                     return;
521cdf0e10cSrcweir                 }
522cdf0e10cSrcweir             }
523cdf0e10cSrcweir         }
524cdf0e10cSrcweir     }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir     StatusBar::RequestHelp( rHEvt );
527cdf0e10cSrcweir }
528cdf0e10cSrcweir 
529cdf0e10cSrcweir // -----------------------------------------------------------------------
530cdf0e10cSrcweir 
UserDraw(const UserDrawEvent & rUDEvt)531cdf0e10cSrcweir void TaskStatusBar::UserDraw( const UserDrawEvent& rUDEvt )
532cdf0e10cSrcweir {
533cdf0e10cSrcweir     if ( rUDEvt.GetItemId() == TASKSTATUSBAR_STATUSFIELDID )
534cdf0e10cSrcweir     {
535cdf0e10cSrcweir         OutputDevice*   pDev = rUDEvt.GetDevice();
536cdf0e10cSrcweir         Rectangle       aRect = rUDEvt.GetRect();
537cdf0e10cSrcweir 
538cdf0e10cSrcweir         if ( mpFieldItemList )
539cdf0e10cSrcweir         {
540cdf0e10cSrcweir             ImplTaskSBFldItem* pItem = mpFieldItemList->First();
541cdf0e10cSrcweir             while ( pItem )
542cdf0e10cSrcweir             {
543cdf0e10cSrcweir                 if ( !mbOutInterval || !(pItem->maItem.GetFlags() & TASKSTATUSFIELDITEM_FLASH) )
544cdf0e10cSrcweir                 {
545cdf0e10cSrcweir                     const Image& rImage = pItem->maItem.GetImage();
546cdf0e10cSrcweir                     Size aImgSize = rImage.GetSizePixel();
547cdf0e10cSrcweir                     pDev->DrawImage( Point( aRect.Left()+pItem->mnOffX,
548cdf0e10cSrcweir                                             aRect.Top()+((aRect.GetHeight()-aImgSize.Width())/2) ),
549cdf0e10cSrcweir                                      rImage );
550cdf0e10cSrcweir                 }
551cdf0e10cSrcweir 
552cdf0e10cSrcweir                 pItem = mpFieldItemList->Next();
553cdf0e10cSrcweir             }
554cdf0e10cSrcweir         }
555cdf0e10cSrcweir 
556cdf0e10cSrcweir         if ( mnFieldFlags & TASKSTATUSFIELD_CLOCK )
557cdf0e10cSrcweir         {
558cdf0e10cSrcweir             long nX = mnItemWidth+TASKSTATUSBAR_CLOCXOFFX;
559cdf0e10cSrcweir             Point aPos = GetItemTextPos( TASKSTATUSBAR_STATUSFIELDID );
560cdf0e10cSrcweir             aPos.X() = aRect.Left()+nX;
561cdf0e10cSrcweir             pDev->DrawText( aPos, maTimeText );
562cdf0e10cSrcweir         }
563cdf0e10cSrcweir     }
564cdf0e10cSrcweir     else
565cdf0e10cSrcweir         StatusBar::UserDraw( rUDEvt );
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir // -----------------------------------------------------------------------
569cdf0e10cSrcweir 
InsertStatusField(long,sal_uInt16,sal_uInt16 nFlags)570cdf0e10cSrcweir void TaskStatusBar::InsertStatusField( long, sal_uInt16,
571cdf0e10cSrcweir                                        sal_uInt16 nFlags )
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     mnFieldFlags = nFlags;
574cdf0e10cSrcweir     ImplUpdateField( sal_False );
575cdf0e10cSrcweir }
576cdf0e10cSrcweir 
577cdf0e10cSrcweir // -----------------------------------------------------------------------
578cdf0e10cSrcweir 
SetFieldFlags(sal_uInt16 nFlags)579cdf0e10cSrcweir void TaskStatusBar::SetFieldFlags( sal_uInt16 nFlags )
580cdf0e10cSrcweir {
581cdf0e10cSrcweir     if ( mnFieldFlags != nFlags )
582cdf0e10cSrcweir     {
583cdf0e10cSrcweir         mnFieldFlags = nFlags;
584cdf0e10cSrcweir         ImplUpdateField( sal_False );
585cdf0e10cSrcweir     }
586cdf0e10cSrcweir }
587cdf0e10cSrcweir 
588cdf0e10cSrcweir // -----------------------------------------------------------------------
589cdf0e10cSrcweir 
AddStatusFieldItem(sal_uInt16 nItemId,const TaskStatusFieldItem & rItem,sal_uInt16 nPos)590cdf0e10cSrcweir void TaskStatusBar::AddStatusFieldItem( sal_uInt16 nItemId, const TaskStatusFieldItem& rItem,
591cdf0e10cSrcweir                                         sal_uInt16 nPos )
592cdf0e10cSrcweir {
593cdf0e10cSrcweir     DBG_ASSERT( nItemId, "TaskStatusBar::AddStatusFieldItem() - Item is 0" );
594cdf0e10cSrcweir     DBG_ASSERT( !ImplGetFieldItem( nItemId ), "TaskStatusBar::AddStatusFieldItem() - Item-Id already exist" );
595cdf0e10cSrcweir 
596cdf0e10cSrcweir     if ( !mpFieldItemList )
597cdf0e10cSrcweir         mpFieldItemList = new ImplTaskSBItemList;
598cdf0e10cSrcweir 
599cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = new ImplTaskSBFldItem;
600cdf0e10cSrcweir     pItem->maItem   = rItem;
601cdf0e10cSrcweir     pItem->mnId     = nItemId;
602cdf0e10cSrcweir     pItem->mnOffX   = 0;
603cdf0e10cSrcweir     mpFieldItemList->Insert( pItem, (sal_uLong)nPos );
604cdf0e10cSrcweir 
605cdf0e10cSrcweir     ImplUpdateField( sal_True );
606cdf0e10cSrcweir }
607cdf0e10cSrcweir 
608cdf0e10cSrcweir // -----------------------------------------------------------------------
609cdf0e10cSrcweir 
ModifyStatusFieldItem(sal_uInt16 nItemId,const TaskStatusFieldItem & rItem)610cdf0e10cSrcweir void TaskStatusBar::ModifyStatusFieldItem( sal_uInt16 nItemId, const TaskStatusFieldItem& rItem )
611cdf0e10cSrcweir {
612cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( nItemId );
613cdf0e10cSrcweir     if ( pItem )
614cdf0e10cSrcweir     {
615cdf0e10cSrcweir         sal_Bool bUpdate = (pItem->maItem.GetImage() != rItem.GetImage()) ||
616cdf0e10cSrcweir                        (pItem->maItem.GetFlags() != rItem.GetFlags());
617cdf0e10cSrcweir         pItem->maItem = rItem;
618cdf0e10cSrcweir         if ( bUpdate )
619cdf0e10cSrcweir             ImplUpdateField( sal_True );
620cdf0e10cSrcweir     }
621cdf0e10cSrcweir }
622cdf0e10cSrcweir 
623cdf0e10cSrcweir // -----------------------------------------------------------------------
624cdf0e10cSrcweir 
RemoveStatusFieldItem(sal_uInt16 nItemId)625cdf0e10cSrcweir void TaskStatusBar::RemoveStatusFieldItem( sal_uInt16 nItemId )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( nItemId );
628cdf0e10cSrcweir     if ( pItem )
629cdf0e10cSrcweir     {
630cdf0e10cSrcweir         mpFieldItemList->Remove( pItem );
631cdf0e10cSrcweir         delete pItem;
632cdf0e10cSrcweir         ImplUpdateField( sal_True );
633cdf0e10cSrcweir     }
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
636cdf0e10cSrcweir // -----------------------------------------------------------------------
637cdf0e10cSrcweir 
GetStatusFieldItem(sal_uInt16 nItemId,TaskStatusFieldItem & rItem) const638cdf0e10cSrcweir sal_Bool TaskStatusBar::GetStatusFieldItem( sal_uInt16 nItemId, TaskStatusFieldItem& rItem ) const
639cdf0e10cSrcweir {
640cdf0e10cSrcweir     ImplTaskSBFldItem* pItem = ImplGetFieldItem( nItemId );
641cdf0e10cSrcweir     if ( pItem )
642cdf0e10cSrcweir     {
643cdf0e10cSrcweir         rItem = pItem->maItem;
644cdf0e10cSrcweir         return sal_True;
645cdf0e10cSrcweir     }
646cdf0e10cSrcweir 
647cdf0e10cSrcweir     return sal_False;
648cdf0e10cSrcweir }
649cdf0e10cSrcweir 
650