xref: /trunk/main/svtools/inc/svtools/taskbar.hxx (revision 01aa44aa)
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 _TASKBAR_HXX
25 #define _TASKBAR_HXX
26 
27 #include "svtools/svtdllapi.h"
28 #include <tools/time.hxx>
29 #ifndef _TOOLS_LIST_HXX
30 #include <tools/list.hxx>
31 #endif
32 #include <vcl/timer.hxx>
33 #include <vcl/toolbox.hxx>
34 #include <vcl/status.hxx>
35 
36 class TaskBar;
37 class TaskStatusFieldItem;
38 class ImplTaskItemList;
39 class ImplTaskSBItemList;
40 class ImplTaskBarFloat;
41 struct ImplTaskSBFldItem;
42 
43 // -----------------
44 // - Dokumentation -
45 // -----------------
46 
47 /*
48 
49 TaskToolBox
50 ===========
51 
52 StartUpdateTask()/UpdateTask()/EndUpdateTask()
53 Diese muessen gerufen werden, wenn die Task upgedatet werden muessen.
54 Dann muss StartUpdateTask() gerufen werden, dann UpdateTask() fuer alle
55 Task's und danach EndUpdateTask() wo dann die TaskButtons entsprechend
56 neu angeordnet werden.
57 
58 ActivateTask()
59 Handler der gerufen wird, wenn ein Task aktiviert werden muss. Mit
60 GetTaskItem() kann abgefragt werden, welcher Task aktiviert werden muss.
61 
62 ContextMenu()
63 Dieser Handler wird gerufen, wenn ein ContextMenu angezeigt werden soll.
64 Mit GetTaskMode() kann abgefragt werden, ob fuer einen Task oder ein
65 Item.
66 
67 GetTaskItem()
68 Diese Methode liefert das Item zurueck, welches bei UpdateTask an der
69 entsprechenden Position eingefuegt wurde.
70 
71 GetContextMenuPos()
72 Liefert die Position zurueck, wo das Contextmenu angezeigt werden soll.
73 
74 
75 TaskStatusBar
76 =============
77 
78 InsertStatusField()/RemoveStatusField()
79 Fuegt ein Statusfeld ein, wo die aktuelle Uhrzeit angezeigt wird. In
80 dieses Feld koennen dann mit AddStatusFielItem(), ModifyStatusFielItem()
81 und RemoveStatusFielItem() Status-Items eingefuegt werden. Bei diesen
82 muss man ein Image angeben, welches dann angezeigt wird. Ausserdem kann
83 man bei diesen noch Hilfe-Texte angeben oder sagen, ob sie blinken
84 sollen und ein Notify-Object, worueber man informiert wird, wenn ein
85 Kontextmenu angezeigt wird oder das Item angeklickt wird. Am
86 TaskStatusBar kann auch ein Notify-Object gesetzt werden, wenn man
87 benachrichtigt werden will, wenn die Uhrzeit oder die TaskStatusBar
88 angeklickt wird. Wenn der Notify fuer die Uhrzeit kommt, ist die
89 Id TASKSTATUSBAR_CLOCKID, wenn er fuer die TaskStatusBar kommt, ist
90 die Id 0. Mit SetFieldFlags() kann am TaskStatusBar auch die Flags
91 hinterher umgesetzt werden, um zum Beispiel die Uhrzeit ein- und
92 auszuschalten.
93 
94 
95 TaskBar
96 =======
97 
98 Erlaubte StyleBits
99 ------------------
100 
101 WB_BORDER       - Border an der oberen Kante
102 WB_SIZEABLE     - Zwischen TaskToolBox und TaskStatusBar kann der Anwender
103                   die Groesse aendern.
104 
105 Wenn WB_SIZEABLE gesetzt ist, kann die Breite des StatusBars gesetzt und
106 abgefragt werden. Dazu kann man SetStatusSize()/GetStatusSize() aufrufen.
107 0 steht dabei fuer optimale Groesse, was auch der Default ist. Bei einem
108 Doppelklick auf den Trenner kann der Anwender auch wieder die optimale
109 Groesse einstellen.
110 
111 Wichtige Methoden
112 ------------------
113 
114 virtual TaskToolBox* TaskBar::CreateButtonBar();
115 virtual TaskToolBox* TaskBar::CreateTaskToolBox();
116 virtual TaskStatusBar* TaskBar::CreateTaskStatusBar();
117 
118 Diese Methoden muesste man ueberladen, wenn man eine eigene Klasse anlegen
119 will.
120 
121 void TaskBar::ShowStatusText( const String& rText );
122 void TaskBar::HideStatusText();
123 
124 Blendet den ButtonBar und die TaskBar ein bzw. aus um den Hilfetexte in der
125 gesammten Zeile anzuzeigen.
126 */
127 
128 // -----------------
129 // - TaskButtonBar -
130 // -----------------
131 
132 class TaskButtonBar : public ToolBox
133 {
134     friend class TaskBar;
135 
136 private:
137     TaskBar*            mpNotifyTaskBar;
138     void*               mpDummy1;
139     void*               mpDummy2;
140     void*               mpDummy3;
141     void*               mpDummy4;
142 
143 public:
144                         TaskButtonBar( Window* pParent, WinBits nWinStyle = 0 );
145                         ~TaskButtonBar();
146 
147     virtual void        RequestHelp( const HelpEvent& rHEvt );
148 
InsertButton(sal_uInt16 nItemId,const Image & rImage,const String & rText,sal_uInt16 nPos=TOOLBOX_APPEND)149     void                InsertButton( sal_uInt16 nItemId,
150                                       const Image& rImage, const String& rText,
151                                       sal_uInt16 nPos = TOOLBOX_APPEND )
152                             { InsertItem( nItemId, rImage, rText, TIB_LEFT | TIB_AUTOSIZE, nPos ); }
RemoveButton(sal_uInt16 nItemId)153     void                RemoveButton( sal_uInt16 nItemId )
154                             { RemoveItem( nItemId ); }
155 };
156 
157 // ---------------------
158 // - TaskToolBox-Types -
159 // ---------------------
160 
161 #define TASKTOOLBOX_TASK_NOTFOUND       ((sal_uInt16)0xFFFF)
162 
163 // ---------------
164 // - TaskToolBox -
165 // ---------------
166 
167 class SVT_DLLPUBLIC TaskToolBox : public ToolBox
168 {
169     friend class TaskBar;
170 
171 private:
172     ImplTaskItemList*   mpItemList;
173     TaskBar*            mpNotifyTaskBar;
174     Point               maContextMenuPos;
175     sal_uLong               mnOldItemCount;
176     long                mnMaxTextWidth;
177     long                mnDummy1;
178     sal_uInt16              mnUpdatePos;
179     sal_uInt16              mnUpdateNewPos;
180     sal_uInt16              mnActiveItemId;
181     sal_uInt16              mnNewActivePos;
182     sal_uInt16              mnTaskItem;
183     sal_uInt16              mnSmallItem;
184     sal_uInt16              mnDummy2;
185     sal_Bool                mbMinActivate;
186     sal_Bool                mbDummy1;
187     Link                maActivateTaskHdl;
188     Link                maContextMenuHdl;
189 
190 #ifdef _TASKBAR_CXX
191     SVT_DLLPRIVATE void                ImplFormatTaskToolBox();
192 #endif
193 
194 	// Forbidden and not implemented.
195 	TaskToolBox (const TaskToolBox &);
196 	TaskToolBox & operator= (const TaskToolBox &);
197 
198 public:
199                         TaskToolBox( Window* pParent, WinBits nWinStyle = 0 );
200                         ~TaskToolBox();
201 
202     void                ActivateTaskItem( sal_uInt16 nItemId,
203                                           sal_Bool bMinActivate = sal_False );
204     sal_uInt16              GetTaskItem( const Point& rPos ) const;
205 
206     virtual void        ActivateTask();
207     virtual void        ContextMenu();
208 
209     virtual void        Select();
210 
211     virtual void        MouseButtonDown( const MouseEvent& rMEvt );
212     virtual void        Resize();
213     virtual void        Command( const CommandEvent& rCEvt );
214     virtual void        RequestHelp( const HelpEvent& rHEvt );
215 
216     void                StartUpdateTask();
217     void                UpdateTask( const Image& rImage, const String& rText,
218                                     sal_Bool bActive = sal_False );
219     void                EndUpdateTask();
220 
GetContextMenuPos() const221     const Point&        GetContextMenuPos() const { return maContextMenuPos; }
GetTaskItem() const222     sal_uInt16              GetTaskItem() const { return mnTaskItem; }
IsMinActivate() const223     sal_Bool                IsMinActivate() const { return mbMinActivate; }
224 
SetActivateTaskHdl(const Link & rLink)225     void                SetActivateTaskHdl( const Link& rLink ) { maActivateTaskHdl = rLink; }
GetActivateTaskHdl() const226     const Link&         GetActivateTaskHdl() const { return maActivateTaskHdl; }
SetContextMenuHdl(const Link & rLink)227     void                SetContextMenuHdl( const Link& rLink ) { maContextMenuHdl = rLink; }
GetContextMenuHdl() const228     const Link&         GetContextMenuHdl() const { return maContextMenuHdl; }
229 };
230 
GetTaskItem(const Point & rPos) const231 inline sal_uInt16 TaskToolBox::GetTaskItem( const Point& rPos ) const
232 {
233     sal_uInt16 nId = GetItemId( rPos );
234     if ( nId )
235         return nId-1;
236     else
237         return TASKTOOLBOX_TASK_NOTFOUND;
238 }
239 
240 // ---------------------
241 // - ITaskStatusNotify -
242 // ---------------------
243 
244 class ITaskStatusNotify
245 {
246 public:
247     virtual sal_Bool        MouseButtonDown( sal_uInt16 nItemd, const MouseEvent& rMEvt );
248     virtual sal_Bool        MouseButtonUp( sal_uInt16 nItemd, const MouseEvent& rMEvt );
249     virtual sal_Bool        MouseMove( sal_uInt16 nItemd, const MouseEvent& rMEvt );
250     virtual sal_Bool        Command( sal_uInt16 nItemd, const CommandEvent& rCEvt );
251     virtual sal_Bool        UpdateHelp( sal_uInt16 nItemd );
252 };
253 
254 // -----------------------
255 // - TaskStatusFieldItem -
256 // -----------------------
257 
258 #define TASKSTATUSFIELDITEM_FLASH           ((sal_uInt16)0x0001)
259 
260 class TaskStatusFieldItem
261 {
262 private:
263     ITaskStatusNotify*  mpNotify;
264     Image               maImage;
265     XubString           maQuickHelpText;
266     XubString           maHelpText;
267     rtl::OString        maHelpId;
268     sal_uInt16          mnFlags;
269 
270 public:
271                         TaskStatusFieldItem();
272                         TaskStatusFieldItem( const TaskStatusFieldItem& rItem );
273                         TaskStatusFieldItem( ITaskStatusNotify* pNotify,
274                                              const Image& rImage,
275                                              const XubString& rQuickHelpText,
276                                              const XubString& rHelpText,
277                                              sal_uInt16 nFlags );
278                         ~TaskStatusFieldItem();
279 
SetNotifyObject(ITaskStatusNotify * pNotify)280     void                SetNotifyObject( ITaskStatusNotify* pNotify ) { mpNotify = pNotify; }
GetNotifyObject() const281     ITaskStatusNotify*  GetNotifyObject() const { return mpNotify; }
SetImage(const Image & rImage)282     void                SetImage( const Image& rImage ) { maImage = rImage; }
GetImage() const283     const Image&        GetImage() const { return maImage; }
SetQuickHelpText(const XubString & rStr)284     void                SetQuickHelpText( const XubString& rStr ) { maQuickHelpText = rStr; }
GetQuickHelpText() const285     const XubString&    GetQuickHelpText() const { return maQuickHelpText; }
SetHelpText(const XubString & rStr)286     void                SetHelpText( const XubString& rStr ) { maHelpText = rStr; }
GetHelpText() const287     const XubString&    GetHelpText() const { return maHelpText; }
SetHelpId(const rtl::OString & rHelpId)288     void                SetHelpId( const rtl::OString& rHelpId ) { maHelpId = rHelpId; }
GetHelpId() const289     const rtl::OString& GetHelpId() const { return maHelpId; }
SetFlags(sal_uInt16 nFlags)290     void                SetFlags( sal_uInt16 nFlags ) { mnFlags = nFlags; }
GetFlags() const291     sal_uInt16          GetFlags() const { return mnFlags; }
292 
293     const TaskStatusFieldItem& operator=( const TaskStatusFieldItem& rItem );
294 };
295 
296 // -----------------
297 // - TaskStatusBar -
298 // -----------------
299 
300 #define TASKSTATUSBAR_STATUSFIELDID         ((sal_uInt16)61000)
301 
302 #define TASKSTATUSBAR_CLOCKID               ((sal_uInt16)61000)
303 #define TASKSTATUSFIELD_CLOCK               ((sal_uInt16)0x0001)
304 
305 class SVT_DLLPUBLIC TaskStatusBar : public StatusBar
306 {
307     friend class TaskBar;
308 
309 private:
310     ImplTaskSBItemList* mpFieldItemList;
311     TaskBar*            mpNotifyTaskBar;
312     ITaskStatusNotify*  mpNotify;
313     Time                maTime;
314     XubString           maTimeText;
315     AutoTimer           maTimer;
316     long                mnClockWidth;
317     long                mnItemWidth;
318     long                mnFieldWidth;
319     sal_uInt16              mnFieldFlags;
320     sal_uInt16              mnDummy1;
321     sal_Bool                mbFlashItems;
322     sal_Bool                mbOutInterval;
323     sal_Bool                mbDummy1;
324     sal_Bool                mbDummy2;
325 
326 #ifdef _TASKBAR_CXX
327     SVT_DLLPRIVATE ImplTaskSBFldItem*  ImplGetFieldItem( sal_uInt16 nItemId ) const;
328     SVT_DLLPRIVATE ImplTaskSBFldItem*  ImplGetFieldItem( const Point& rPos, sal_Bool& rFieldRect ) const;
329     SVT_DLLPRIVATE sal_Bool                ImplUpdateClock();
330     SVT_DLLPRIVATE sal_Bool                ImplUpdateFlashItems();
331     SVT_DLLPRIVATE void                ImplUpdateField( sal_Bool bItems );
332                         DECL_DLLPRIVATE_LINK( ImplTimerHdl, Timer* );
333 #endif
334 
335 public:
336                         TaskStatusBar( Window* pParent, WinBits nWinStyle = WB_LEFT );
337                         ~TaskStatusBar();
338 
339     virtual void        MouseButtonDown( const MouseEvent& rMEvt );
340     virtual void        MouseButtonUp( const MouseEvent& rMEvt );
341     virtual void        MouseMove( const MouseEvent& rMEvt );
342     virtual void        Command( const CommandEvent& rCEvt );
343     virtual void        RequestHelp( const HelpEvent& rHEvt );
344     virtual void        UserDraw( const UserDrawEvent& rUDEvt );
345 
346     void                InsertStatusField( long nOffset = STATUSBAR_OFFSET,
347                                            sal_uInt16 nPos = STATUSBAR_APPEND,
348                                            sal_uInt16 nFlags = TASKSTATUSFIELD_CLOCK );
RemoveStatusField()349     void                RemoveStatusField()
350                             { maTimer.Stop(); RemoveItem( TASKSTATUSBAR_STATUSFIELDID ); }
351     void                SetFieldFlags( sal_uInt16 nFlags );
GetFieldFlags() const352     sal_uInt16              GetFieldFlags() const { return mnFieldFlags; }
SetNotifyObject(ITaskStatusNotify * pNotify)353     void                SetNotifyObject( ITaskStatusNotify* pNotify ) { mpNotify = pNotify; }
GetNotifyObject() const354     ITaskStatusNotify*  GetNotifyObject() const { return mpNotify; }
355 
356     void                AddStatusFieldItem( sal_uInt16 nItemId, const TaskStatusFieldItem& rItem,
357                                             sal_uInt16 nPos = 0xFFFF );
358     void                ModifyStatusFieldItem( sal_uInt16 nItemId, const TaskStatusFieldItem& rItem );
359     void                RemoveStatusFieldItem( sal_uInt16 nItemId );
360     sal_Bool                GetStatusFieldItem( sal_uInt16 nItemId, TaskStatusFieldItem& rItem ) const;
361 };
362 
363 // -----------
364 // - TaskBar -
365 // -----------
366 
367 class SVT_DLLPUBLIC TaskBar : public Window
368 {
369 private:
370     ImplTaskBarFloat*       mpAutoHideBar;
371     TaskButtonBar*          mpButtonBar;
372     TaskToolBox*            mpTaskToolBox;
373     TaskStatusBar*          mpStatusBar;
374     void*                   mpDummy1;
375     void*                   mpDummy2;
376     void*                   mpDummy3;
377     void*                   mpDummy4;
378     String                  maOldText;
379     long                    mnStatusWidth;
380     long                    mnMouseOff;
381     long                    mnOldStatusWidth;
382     long                    mnDummy1;
383     long                    mnDummy2;
384     long                    mnDummy3;
385     long                    mnDummy4;
386     WinBits                 mnWinBits;
387     sal_uInt16                  mnLines;
388     sal_Bool                    mbStatusText;
389     sal_Bool                    mbShowItems;
390     sal_Bool                    mbAutoHide;
391     sal_Bool                    mbAlignDummy1;
392     sal_Bool                    mbDummy1;
393     sal_Bool                    mbDummy2;
394     sal_Bool                    mbDummy3;
395     sal_Bool                    mbDummy4;
396     Link                    maTaskResizeHdl;
397 
398 #ifdef _TASKBAR_CXX
399     SVT_DLLPRIVATE void                    ImplInitSettings();
400     SVT_DLLPRIVATE void                    ImplNewHeight( long nNewHeight );
401 #endif
402 
403 public:
404                             TaskBar( Window* pParent, WinBits nWinStyle = WB_BORDER | WB_SIZEABLE );
405                             ~TaskBar();
406 
407     virtual void            TaskResize();
408 
409     virtual TaskButtonBar*  CreateButtonBar();
410     virtual TaskToolBox*    CreateTaskToolBox();
411     virtual TaskStatusBar*  CreateTaskStatusBar();
412 
413     virtual void            MouseMove( const MouseEvent& rMEvt );
414     virtual void            MouseButtonDown( const MouseEvent& rMEvt );
415     virtual void            Tracking( const TrackingEvent& rMEvt );
416     virtual void            Paint( const Rectangle& rRect );
417     virtual void            Resize();
418     virtual void            StateChanged( StateChangedType nType );
419     virtual void            DataChanged( const DataChangedEvent& rDCEvt );
420 
421     void                    Format();
422 
423     void                    SetLines( sal_uInt16 nLines );
GetLines() const424     sal_uInt16                  GetLines() const { return mnLines; }
425     void                    EnableAutoHide( sal_Bool bAutoHide = sal_True );
IsAutoHideEnabled() const426     sal_Bool                    IsAutoHideEnabled() const { return mbAutoHide; }
427 
428     void                    ShowStatusText( const String& rText );
429     void                    HideStatusText();
430 
SetStatusSize(long nNewSize)431     void                    SetStatusSize( long nNewSize )
432                                 { mnStatusWidth=nNewSize; Resize(); }
GetStatusSize() const433     long                    GetStatusSize() const { return mnStatusWidth; }
434 
435     Size                    CalcWindowSizePixel() const;
436 
437     TaskButtonBar*          GetButtonBar() const;
438     TaskToolBox*            GetTaskToolBox() const;
439     TaskStatusBar*          GetStatusBar() const;
440 
SetTaskResizeHdl(const Link & rLink)441     void                    SetTaskResizeHdl( const Link& rLink ) { maTaskResizeHdl = rLink; }
GetTaskResizeHdl() const442     const Link&             GetTaskResizeHdl() const { return maTaskResizeHdl; }
443 };
444 
445 // -----------------------
446 // - WindowArrange-Types -
447 // -----------------------
448 
449 #define WINDOWARRANGE_TILE      1
450 #define WINDOWARRANGE_HORZ      2
451 #define WINDOWARRANGE_VERT      3
452 #define WINDOWARRANGE_CASCADE   4
453 
454 class ImplWindowArrangeList;
455 
456 // -----------------------
457 // - class WindowArrange -
458 // -----------------------
459 
460 class SVT_DLLPUBLIC WindowArrange
461 {
462 private:
463     List*                   mpWinList;
464     void*                   mpDummy;
465     sal_uLong                   mnDummy;
466 
467 #ifdef _TASKBAR_CXX
468     SVT_DLLPRIVATE void                    ImplTile( const Rectangle& rRect );
469     SVT_DLLPRIVATE void                    ImplHorz( const Rectangle& rRect );
470     SVT_DLLPRIVATE void                    ImplVert( const Rectangle& rRect );
471     SVT_DLLPRIVATE void                    ImplCascade( const Rectangle& rRect );
472 #endif
473 
474 public:
475                             WindowArrange();
476                             ~WindowArrange();
477 
AddWindow(Window * pWindow,sal_uLong nPos=LIST_APPEND)478     void                    AddWindow( Window* pWindow, sal_uLong nPos = LIST_APPEND )
479                                 { mpWinList->Insert( (void*)pWindow, nPos ); }
RemoveAllWindows()480     void                    RemoveAllWindows()
481                                 { mpWinList->Clear(); }
482 
483     void                    Arrange( sal_uInt16 nType, const Rectangle& rRect );
484 };
485 
486 #endif  // _TASKBAR_HXX
487