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