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