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 #define private public
24
25 #include <tools/ref.hxx>
26 #include <vcl/msgbox.hxx>
27 #include <soldep/soldep.hxx>
28 #include <soldep/tbox.hxx>
29 #include <soldep/soldlg.hrc>
30
31
32
SoldepToolBox(Window * pParent,const ResId & aId,sal_Bool bDAble)33 SoldepToolBox::SoldepToolBox( Window* pParent, const ResId& aId, sal_Bool bDAble ) :
34 ToolBox( pParent, aId ),
35 bDockable( bDAble ),
36 bCloseMode( sal_False ),
37 bBoxIsVisible( sal_True ),
38 bPinable( sal_True ),
39 aPinedBitmap( DtSodResId( TID_SMALL_PIN_PINED )), // BMP_SMALL_PIN_PINED
40 aUnpinedBitmap( DtSodResId( TID_SMALL_PIN_UNPINED )) // BMP_SMALL_PIN_UNPINED
41 {
42 bPinable = sal_True;
43
44 SetAlign( WINDOWALIGN_TOP );
45 HideItem(TID_SOLDEP_BACK); //Inital hide this item, activated in project view.
46 HideItem(TID_SOLDEP_SAVE); // Hide this item now, not used yet
47 HideItem(TID_SOLDEP_OPEN); // Hide this item now, not used yet
48
49 //SetMouseDownHdl(LINK(this,SoldepToolBox,MouseDownHdl));
50 //SetFloatingLines( nFloatingLines );
51 //SetFloatingMode( bFloatingMode );
52 sal_Bool bFloatingMode = sal_False;
53 if ( bFloatingMode )
54 {
55 //Point aPos( sToolBoxInfo.GetToken( 4, ',' ).ToInt64(), sToolBoxInfo.GetToken( 5, ',' ).ToInt64());
56 //SetPosPixel( aPos );
57 }
58
59 if ( bDockable ) InsertSeparator( 0 ); // Freiraum f�r Abrei�d�del schaffen
60 // (ein Separator an 1er Pos wird
61 // nicht gezeichnet,
62 // schafft aber Platz.)
63 bBoxIsVisible = sal_False;
64 // if ( sToolBoxInfo.GetToken( 3, ',' ) == "Visible" ) {
65 for ( sal_uInt16 i = 0; i < GetItemCount() && !bBoxIsVisible; i++ )
66 {
67 // sal_uInt16 nItemId = GetItemId( i );
68
69 switch ( GetItemType( i ))
70 {
71 case TOOLBOXITEM_SPACE:
72 break;
73 case TOOLBOXITEM_SEPARATOR :
74 break;
75 default:
76 bBoxIsVisible = sal_True;
77 break;
78 }
79 }
80 // }
81
82 if ( bBoxIsVisible ) {
83 if (!bDockable)
84 Show();
85 else
86 Hide();
87 }
88 else
89 Hide();
90
91 bOldFloatMode = IsFloatingMode();
92 }
93
94 /*************************************************************************
95 |* SoldepToolBox::~SoldepToolBox()
96 |************************************************************************/
97
~SoldepToolBox()98 SoldepToolBox::~SoldepToolBox()
99 {
100 }
101
102 /*************************************************************************
103 |* SoldepToolBox::Paint()
104 |************************************************************************/
105
Paint(const Rectangle & rRect)106 void SoldepToolBox::Paint( const Rectangle& rRect )
107 {
108 SetOutStyle( TOOLBOX_STYLE_FLAT );
109
110 // Wenn wir eine Dockable ToolBox haben, ...
111
112 if ( bDockable )
113 {
114 sal_uInt16 nItemId = GetItemId( 0 );
115
116 // ... zeichnen wir den wunderbaren Abrei�d�del �ber das erste Item (Seperator)
117
118 if ( !IsFloatingMode() && ( mnCurLine == 1 )) {
119 sal_Bool bIsCloseable = (( mnWinStyle & WB_CLOSEABLE ) != 0 );
120
121 ShowItem( nItemId );
122 Rectangle aRect = GetItemRect( nItemId );
123
124 ToolBox::Paint( rRect );
125
126 if ( bIsCloseable )
127 {
128 // Paint small cross button left/top of toolbar
129 SetLineColor( Color( COL_WHITE ));
130
131 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Left()+6, aRect.Top()));
132 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Left(), aRect.Top()+6));
133
134 SetLineColor( Color( COL_GRAY ));
135
136 DrawLine( Point( aRect.Left(), aRect.Top()+6), Point( aRect.Left()+6, aRect.Top()+6));
137 DrawLine( Point( aRect.Left()+6, aRect.Top()), Point( aRect.Left()+6, aRect.Top()+6));
138
139 SetLineColor( Color( COL_BLACK ));
140
141 DrawLine( Point( aRect.Left()+2, aRect.Top()+2), Point( aRect.Left()+4, aRect.Top()+4));
142 DrawLine( Point( aRect.Left()+2, aRect.Top()+4), Point( aRect.Left()+4, aRect.Top()+2));
143 }
144 else if ( bPinable )
145 {
146 if ( GetPin())
147 DrawBitmap( Point( aRect.Left(), aRect.Top()), aPinedBitmap );
148 else
149 DrawBitmap( Point( aRect.Left(), aRect.Top()), aUnpinedBitmap );
150 }
151
152 SetLineColor( Color( COL_WHITE ));
153
154 if ( IsHorizontal())
155 {
156 if ( bIsCloseable || bPinable ) aRect = Rectangle( Point( aRect.Left(), aRect.Top()+8), Point( aRect.Right(), aRect.Bottom()));
157
158 DrawLine( Point(aRect.Left(), aRect.Top()), Point(aRect.Left(), aRect.Bottom()));
159 DrawLine( Point(aRect.Left(), aRect.Top()), Point(aRect.Left()+2, aRect.Top()));
160
161 SetLineColor( Color( COL_WHITE ));
162
163 DrawLine( Point(aRect.Left()+4, aRect.Top()), Point(aRect.Left()+4, aRect.Bottom()));
164 DrawLine( Point(aRect.Left()+4, aRect.Top()), Point(aRect.Left()+6, aRect.Top()));
165
166 SetLineColor( Color( COL_GRAY ));//GRAY
167
168 DrawLine( Point(aRect.Left()+2, aRect.Top()), Point(aRect.Left()+2, aRect.Bottom()));
169 DrawLine( Point(aRect.Left(), aRect.Bottom()), Point(aRect.Left()+2, aRect.Bottom()));
170
171 SetLineColor( Color( COL_BLACK ));
172
173 DrawLine( Point(aRect.Left()+6, aRect.Top()), Point(aRect.Left()+6, aRect.Bottom()));
174 DrawLine( Point(aRect.Left()+4, aRect.Bottom()), Point(aRect.Left()+6, aRect.Bottom()));
175
176 }
177 else
178 {
179 if ( bIsCloseable || bPinable ) aRect = Rectangle( Point( aRect.Left()+8, aRect.Top()), Point( aRect.Right(), aRect.Bottom()));
180
181 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Left(), aRect.Top()+2));
182 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Right(), aRect.Top()));
183
184 DrawLine( Point( aRect.Left(), aRect.Top()+4), Point( aRect.Left(), aRect.Top()+6));
185 DrawLine( Point( aRect.Left(), aRect.Top()+4), Point( aRect.Right(), aRect.Top()+4));
186
187 SetLineColor( Color( COL_GRAY ));
188
189 DrawLine( Point( aRect.Left(), aRect.Top()+2), Point( aRect.Right(),aRect.Top()+2));
190 DrawLine( Point( aRect.Right(), aRect.Top()), Point( aRect.Right(), aRect.Top()+2));
191
192 DrawLine( Point( aRect.Left(), aRect.Top()+6), Point( aRect.Right(),aRect.Top()+6));
193 DrawLine( Point( aRect.Right(), aRect.Top()+4), Point( aRect.Right(), aRect.Top()+6));
194
195 }
196 }
197 else
198 {
199 // Sind wir im FloatingMode, dann wollen wir keinen Abrei�d�del haben
200 // und hiden somit das erste Item.
201
202 //Hiden l�scht leider das erste Object der n�chsten Zeile, daher nicht
203 //l�schen
204 HideItem( nItemId );
205 ToolBox::Paint( rRect );
206 }
207 }
208 else
209 {
210 ToolBox::Paint( rRect );
211 }
212 }
213
214 /*************************************************************************
215 |* SoldepToolBox::MouseButtonDown()
216 |************************************************************************/
217
MouseButtonDown(const MouseEvent & rEvent)218 void SoldepToolBox::MouseButtonDown(const MouseEvent& rEvent)
219 {
220 // Sind wir im DockingMode, ...
221
222 if ( !IsFloatingMode() && ((( mnWinStyle & WB_CLOSEABLE ) != 0 ) || bPinable ))
223 {
224 // ... dann testen wir, ob am Abrei�d�del der Close-Button gedr�ckt wurde ...
225
226 Rectangle aRect = GetItemRect( GetItemId( 0 ));
227 aRect = Rectangle( aRect.TopLeft(), Point( aRect.Left()+6, aRect.Top()+6 ));
228 if ( rEvent.IsLeft() && aRect.IsInside( rEvent.GetPosPixel()))
229 {
230 if ( bPinable ) {
231 TogglePin();
232 Invalidate();
233 }
234 else {
235 bCloseMode = sal_True;
236
237 // ... und zeichnen ggf. den Button gedr�ckt.
238
239 SetLineColor( Color( COL_WHITE ));
240
241 DrawLine( Point( aRect.Left(), aRect.Bottom()), Point( aRect.Right(), aRect.Bottom()));
242 DrawLine( Point( aRect.Right(), aRect.Bottom()), Point( aRect.Right(), aRect.Top()));
243
244 SetLineColor( Color( COL_GRAY ));
245
246 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Right(), aRect.Top()));
247 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Left(), aRect.Bottom()));
248 }
249 }
250 else
251 {
252 ToolBox::MouseButtonDown( rEvent );
253 }
254 }
255 else
256 {
257 ToolBox::MouseButtonDown( rEvent );
258 }
259
260 aMouseDownHdl.Call(this);
261 }
262
263 /*************************************************************************
264 |* SoldepToolBox::MouseButtonUp()
265 |************************************************************************/
266
MouseButtonUp(const MouseEvent & rEvent)267 void SoldepToolBox::MouseButtonUp(const MouseEvent& rEvent)
268 {
269 // Wenn der Close-Button am Abrei�d�del zuvor gedr�ckt wurde, ...
270
271 if ( bCloseMode )
272 {
273 bCloseMode = sal_False;
274
275 // ... so zeichen wir diesen wieder normal ...
276
277 Rectangle aRect = GetItemRect( GetItemId( 0 ));
278 aRect = Rectangle( aRect.TopLeft(), Point( aRect.Left()+6, aRect.Top()+6 ));
279
280 SetLineColor( Color( COL_WHITE ));
281
282 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Right(), aRect.Top()));
283 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Left(), aRect.Bottom()));
284
285 SetLineColor( Color( COL_GRAY ));
286
287 DrawLine( Point( aRect.Left(), aRect.Bottom()), Point( aRect.Right(), aRect.Bottom()));
288 DrawLine( Point( aRect.Right(), aRect.Bottom()), Point( aRect.Right(), aRect.Top()));
289
290 if ( rEvent.IsLeft() && aRect.IsInside( rEvent.GetPosPixel()))
291 {
292 // ... und schlie�en die Box durch Aufruf der virtuellen Methode
293 // CloseDockingMode().
294
295 CloseDockingMode();
296 }
297 else
298 {
299 ToolBox::MouseButtonUp( rEvent );
300 }
301 }
302 else
303 {
304 ToolBox::MouseButtonUp( rEvent );
305 }
306 }
307
308 /*************************************************************************
309 |* SoldepToolBox::MouseMove()
310 |************************************************************************/
311
MouseMove(const MouseEvent & rEvent)312 void SoldepToolBox::MouseMove(const MouseEvent& rEvent)
313 {
314 // Wenn der Close-Button am Abrei�d�del zuvor gedr�ckt wurde, ...
315
316 if ( bCloseMode )
317 {
318 Rectangle aRect = GetItemRect( GetItemId( 0 ));
319 aRect = Rectangle( aRect.TopLeft(), Point( aRect.Left()+6, aRect.Top()+6 ));
320
321 // ... der Mouse-Zeiger jedoch den Close-Button verl��t, ...
322
323 if ( !aRect.IsInside( rEvent.GetPosPixel()))
324 {
325 SetLineColor( Color( COL_WHITE ));
326
327 // ... zeichnen wir diesen halt wieder normal.
328
329 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Right(), aRect.Top()));
330 DrawLine( Point( aRect.Left(), aRect.Top()), Point( aRect.Left(), aRect.Bottom()));
331
332 SetLineColor( Color( COL_GRAY ));
333
334 DrawLine( Point( aRect.Left(), aRect.Bottom()), Point( aRect.Right(), aRect.Bottom()));
335 DrawLine( Point( aRect.Right(), aRect.Bottom()), Point( aRect.Right(), aRect.Top()));
336
337 bCloseMode = sal_False;
338 }
339 else
340 {
341 ToolBox::MouseMove( rEvent );
342 }
343 }
344 else
345 {
346 ToolBox::MouseMove( rEvent );
347 }
348 }
349
350 /*****************************************************************************/
ToggleFloatingMode()351 void SoldepToolBox::ToggleFloatingMode()
352 /*****************************************************************************/
353 {
354 ToolBox::ToggleFloatingMode();
355 CallEventListeners( VCLEVENT_USER_TBOX_RESIZE_APP, this);
356 }
357
358 /*****************************************************************************/
EndDocking(const Rectangle & rRect,sal_Bool bFloatMode)359 void SoldepToolBox::EndDocking( const Rectangle& rRect, sal_Bool bFloatMode )
360 /*****************************************************************************/
361 {
362 ToolBox::EndDocking( rRect, bFloatMode );
363 if ( aResizeHdl.IsSet())
364 CallEventListeners( VCLEVENT_USER_TBOX_RESIZE_APP, this);
365 else
366 {
367 GetParent()->Resize();
368 }
369 };
370
371 /*****************************************************************************/
Close()372 sal_Bool SoldepToolBox::Close()
373 /*****************************************************************************/
374 {
375 if (!ToolBox::Close()) return sal_False;
376
377 return sal_True;
378 }
379
380 /*****************************************************************************/
Move()381 void SoldepToolBox::Move()
382 /*****************************************************************************/
383 {
384 }
385
386 /*************************************************************************
387 |* SoldepToolBox::CloseDockingMode()
388 |*
389 |* virtuelle Methode zur Reaktion auf den Close-Button im DockinMode
390 |************************************************************************/
391
CloseDockingMode()392 void SoldepToolBox::CloseDockingMode()
393 {
394 Hide();
395 bBoxIsVisible = sal_False;
396 CallEventListeners( VCLEVENT_USER_TBOX_RESIZE_APP, this);
397 }
398
399 /*************************************************************************
400 |* SoldepToolBox::Command()
401 |************************************************************************/
402
Command(const CommandEvent & rCEvt)403 void SoldepToolBox::Command( const CommandEvent& rCEvt)
404 {
405 if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
406 {
407 if( !IsFloatingMode() && bDockable
408 && ( GetItemRect(GetItemId( 0 )).IsInside(rCEvt.GetMousePosPixel())))
409 {
410 // Hier das Context-Menue fuer Abrei�d�del dynamisch erzeugen...
411
412 PopupMenu aPopupMenu;
413
414 String sText( String::CreateFromAscii( "Floating mode" ));
415 aPopupMenu.InsertItem( 5, sText );
416 aPopupMenu.InsertSeparator();
417
418 sText = String::CreateFromAscii( "Top" );
419 aPopupMenu.InsertItem( 1, sText );
420 sText = String::CreateFromAscii( "Bottom" );
421 aPopupMenu.InsertItem( 2, sText );
422 sText = String::CreateFromAscii( "Left" );
423 aPopupMenu.InsertItem( 3, sText );
424 sText = String::CreateFromAscii( "Right" );
425 aPopupMenu.InsertItem( 4, sText );
426
427 switch( GetAlign())
428 {
429 case WINDOWALIGN_TOP : aPopupMenu.EnableItem( 1, sal_False ); break;
430 case WINDOWALIGN_BOTTOM : aPopupMenu.EnableItem( 2, sal_False ); break;
431 case WINDOWALIGN_LEFT : aPopupMenu.EnableItem( 3, sal_False ); break;
432 case WINDOWALIGN_RIGHT : aPopupMenu.EnableItem( 4, sal_False ); break;
433 }
434
435 if (( mnWinStyle & WB_CLOSEABLE ) != 0 )
436 {
437 aPopupMenu.InsertSeparator();
438 sText = String::CreateFromAscii( "Hide" );
439 aPopupMenu.InsertItem( 6, sText );
440 }
441 else if ( bPinable ) {
442 aPopupMenu.InsertSeparator();
443 sText = String::CreateFromAscii( "Pin" );
444 aPopupMenu.InsertItem( 6, sText );
445 aPopupMenu.CheckItem( 6, GetPin());
446 }
447
448 // ... und rufen.
449
450 aPopupMenu.SetSelectHdl ( LINK ( this, SoldepToolBox, MenuSelectHdl ));
451 aPopupMenu.Execute( this, rCEvt.GetMousePosPixel());
452 }
453 else if ( !GetItemId(rCEvt.GetMousePosPixel()))
454 {
455 CallContextMenu( this, rCEvt.GetMousePosPixel());
456 }
457 }
458 else ToolBox::Command( rCEvt );
459 }
460
461 /*************************************************************************
462 |* SoldepToolBox::GetContextMenu()
463 |************************************************************************/
464
GetContextMenu()465 PopupMenu *SoldepToolBox::GetContextMenu()
466 {
467 InitContextMenu();
468 return &aMenu;
469 }
470
471 /*************************************************************************
472 |* SoldepToolBox::InitContextMenu()
473 |************************************************************************/
474
InitContextMenu()475 void SoldepToolBox::InitContextMenu()
476 {
477 sal_uInt16 nStart = 0;
478 if ( bDockable )
479 nStart = 1;
480
481 aMenu.Clear();
482
483 for ( sal_uInt16 i = nStart; i < GetItemCount(); i++ )
484 {
485 sal_uInt16 nItemId = GetItemId( i );
486
487 switch ( GetItemType( i ))
488 {
489 case TOOLBOXITEM_SPACE:
490 break;
491 case TOOLBOXITEM_SEPARATOR :
492 if (!(( i < GetItemCount() - 1 ) && ( GetItemType( i + 1 ) == TOOLBOXITEM_DONTKNOW )))
493 aMenu.InsertSeparator();
494 break;
495 default:
496 aMenu.InsertItem( nItemId, GetItemText( nItemId ), GetItemImage( nItemId ));
497 if (IsItemChecked( nItemId )) aMenu.CheckItem( nItemId, sal_True );
498 if (!IsItemEnabled( nItemId )) aMenu.EnableItem( nItemId, sal_False );
499 if (!IsItemVisible( nItemId )) aMenu.HideItem(nItemId);
500 break;
501 }
502 }
503 }
504
505 /*************************************************************************
506 |* SoldepToolBox::CallContextMenu()
507 |************************************************************************/
508
CallContextMenu(Window * pWin,Point aPos)509 void SoldepToolBox::CallContextMenu( Window *pWin, Point aPos )
510 {
511 if ( aMenu.IsInExecute())
512 return;
513
514 InitContextMenu();
515
516 // ... und rufen.
517
518 aMenu.SetSelectHdl ( LINK ( this, SoldepToolBox, MenuSelectHdl ));
519 aMenu.Execute( pWin, aPos );
520 }
521
SetPosSizePixel(const Point & rNewPos,const Size & rNewSize)522 void SoldepToolBox::SetPosSizePixel( const Point& rNewPos,
523 const Size& rNewSize )
524 {
525 // if(rNewPos != GetPosPixel() || rNewSize != GetSizePixel())
526 // {
527 ToolBox::SetPosSizePixel(rNewPos,rNewSize);
528 // Resize();
529 // }
530 }
531
SetDockingRects(const Rectangle & rOutRect,const Rectangle & rInRect)532 void SoldepToolBox::SetDockingRects( const Rectangle& rOutRect,
533 const Rectangle& rInRect )
534 {
535 if(rOutRect != aOutRect || rInRect != aInRect)
536 {
537 ToolBox::SetDockingRects(rOutRect,rInRect);
538 Invalidate();
539
540 aOutRect = rOutRect;
541 aInRect = rInRect;
542 }
543 }
544
545 /*****************************************************************************/
StartDocking()546 void SoldepToolBox::StartDocking()
547 /*****************************************************************************/
548 {
549 ToolBox::StartDocking();
550 CallEventListeners( VCLEVENT_USER_TBOX_RESIZE_APP, this);
551 };
552
GetPin()553 sal_Bool SoldepToolBox::GetPin()
554
555 {
556 return bPin;
557 }
558
TogglePin()559 void SoldepToolBox::TogglePin()
560 {
561 bPin = !bPin;
562 }
563
SetPin(sal_Bool bP)564 void SoldepToolBox::SetPin( sal_Bool bP )
565 {
566 bPin = bP;
567 }
568
569 /*************************************************************************
570 |* SoldepToolBox::MenuSelectHdl()
571 |*
572 |* Handler, der beim Execute der Context-Men�s gerufen wird
573 |************************************************************************/
574
IMPL_LINK(SoldepToolBox,MenuSelectHdl,Menu *,pMenu)575 IMPL_LINK ( SoldepToolBox, MenuSelectHdl, Menu*, pMenu )
576 {
577 // Wenn die CurItemId <= 6 ist, dann wurde das Abrei�d�del-Context-Men� ausgef�hrt ...
578 sal_uIntPtr itemid;
579 itemid = pMenu->GetCurItemId();
580
581 if ( pMenu == &aMenu )
582 {
583 // ... Andernfalls wurde das Default-Context-Men� ausgef�hrt ...
584 sal_uInt16 nTmpId = mnCurItemId;
585 mnCurItemId = pMenu->GetCurItemId();
586
587 // ... und der gesetzte Handler (in soldep.cxx) wird gerufen.
588 maSelectHdl.Call( this );
589 mnCurItemId = nTmpId;
590 }
591 return 0;
592 }
593