xref: /trunk/main/vcl/source/window/brdwin.cxx (revision 805551cc)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 
27 #include <svids.hrc>
28 #include <svdata.hxx>
29 #include <brdwin.hxx>
30 #include <window.h>
31 
32 #include <vcl/event.hxx>
33 #include <vcl/decoview.hxx>
34 #include <vcl/syswin.hxx>
35 #include <vcl/dockwin.hxx>
36 #include <vcl/floatwin.hxx>
37 #include <vcl/bitmap.hxx>
38 #include <vcl/gradient.hxx>
39 #include <vcl/image.hxx>
40 #include <vcl/virdev.hxx>
41 #include <vcl/help.hxx>
42 #include <vcl/edit.hxx>
43 #include <vcl/metric.hxx>
44 
45 #include <tools/debug.hxx>
46 
47 using namespace ::com::sun::star::uno;
48 
49 // useful caption height for title bar buttons
50 #define MIN_CAPTION_HEIGHT 18
51 
52 // =======================================================================
53 
ImplGetPinImage(sal_uInt16 nStyle,sal_Bool bPinIn,Image & rImage)54 static void ImplGetPinImage( sal_uInt16 nStyle, sal_Bool bPinIn, Image& rImage )
55 {
56 	// ImageListe laden, wenn noch nicht vorhanden
57 	ImplSVData* pSVData = ImplGetSVData();
58 	if ( !pSVData->maCtrlData.mpPinImgList )
59 	{
60 		ResMgr* pResMgr = ImplGetResMgr();
61 		pSVData->maCtrlData.mpPinImgList = new ImageList();
62 		if( pResMgr )
63 		{
64 			Color aMaskColor( 0x00, 0x00, 0xFF );
65 			pSVData->maCtrlData.mpPinImgList->InsertFromHorizontalBitmap
66 				( ResId( SV_RESID_BITMAP_PIN, *pResMgr ), 4,
67 				  &aMaskColor, NULL, NULL, 0);
68 		}
69 	}
70 
71 	// Image ermitteln und zurueckgeben
72 	sal_uInt16 nId;
73 	if ( nStyle & BUTTON_DRAW_PRESSED )
74 	{
75 		if ( bPinIn )
76 			nId = 4;
77 		else
78 			nId = 3;
79 	}
80 	else
81 	{
82 		if ( bPinIn )
83 			nId = 2;
84 		else
85 			nId = 1;
86 	}
87 	rImage = pSVData->maCtrlData.mpPinImgList->GetImage( nId );
88 }
89 
90 // -----------------------------------------------------------------------
91 
ImplCalcSymbolRect(Rectangle & rRect)92 void Window::ImplCalcSymbolRect( Rectangle& rRect )
93 {
94 	// Den Rand den der Button in der nicht Default-Darstellung freilaesst,
95 	// dazuaddieren, da wir diesen bei kleinen Buttons mit ausnutzen wollen
96 	rRect.Left()--;
97 	rRect.Top()--;
98 	rRect.Right()++;
99 	rRect.Bottom()++;
100 
101 	// Zwischen dem Symbol und dem Button-Rand lassen wir 5% Platz
102 	long nExtraWidth = ((rRect.GetWidth()*50)+500)/1000;
103 	long nExtraHeight = ((rRect.GetHeight()*50)+500)/1000;
104 	rRect.Left()	+= nExtraWidth;
105 	rRect.Right()	-= nExtraWidth;
106 	rRect.Top() 	+= nExtraHeight;
107 	rRect.Bottom()	-= nExtraHeight;
108 }
109 
110 // -----------------------------------------------------------------------
111 
ImplDrawBrdWinSymbol(OutputDevice * pDev,const Rectangle & rRect,SymbolType eSymbol)112 static void ImplDrawBrdWinSymbol( OutputDevice* pDev,
113 								  const Rectangle& rRect, SymbolType eSymbol )
114 {
115 	// Zwischen dem Symbol und dem Button lassen wir 5% Platz
116 	DecorationView	aDecoView( pDev );
117 	Rectangle		aTempRect = rRect;
118 	Window::ImplCalcSymbolRect( aTempRect );
119 	aDecoView.DrawSymbol( aTempRect, eSymbol,
120 						  pDev->GetSettings().GetStyleSettings().GetButtonTextColor(), 0 );
121 }
122 
123 // -----------------------------------------------------------------------
124 
ImplDrawBrdWinSymbolButton(OutputDevice * pDev,const Rectangle & rRect,SymbolType eSymbol,sal_uInt16 nState)125 static void ImplDrawBrdWinSymbolButton( OutputDevice* pDev,
126 										const Rectangle& rRect,
127 										SymbolType eSymbol, sal_uInt16 nState )
128 {
129 	sal_Bool bMouseOver = (nState & BUTTON_DRAW_HIGHLIGHT) != 0;
130 	nState &= ~BUTTON_DRAW_HIGHLIGHT;
131 
132 	Rectangle aTempRect;
133 	Window *pWin = dynamic_cast< Window* >(pDev);
134 	if( pWin )
135 	{
136         if( bMouseOver )
137         {
138             // provide a bright background for selection effect
139             pWin->SetFillColor( pDev->GetSettings().GetStyleSettings().GetWindowColor() );
140             pWin->SetLineColor();
141             pWin->DrawRect( rRect );
142             pWin->DrawSelectionBackground( rRect, 2, (nState & BUTTON_DRAW_PRESSED) ? sal_True : sal_False,
143                                             sal_True, sal_False );
144         }
145         aTempRect = rRect;
146         aTempRect.nLeft+=3;
147         aTempRect.nRight-=4;
148         aTempRect.nTop+=3;
149         aTempRect.nBottom-=4;
150 	}
151 	else
152 	{
153 		DecorationView aDecoView( pDev );
154 		aTempRect = aDecoView.DrawButton( rRect, nState|BUTTON_DRAW_FLAT );
155 	}
156 	ImplDrawBrdWinSymbol( pDev, aTempRect, eSymbol );
157 }
158 
159 
160 // =======================================================================
161 
162 // ------------------------
163 // - ImplBorderWindowView -
164 // ------------------------
165 
~ImplBorderWindowView()166 ImplBorderWindowView::~ImplBorderWindowView()
167 {
168 }
169 
170 // -----------------------------------------------------------------------
171 
MouseMove(const MouseEvent &)172 sal_Bool ImplBorderWindowView::MouseMove( const MouseEvent& )
173 {
174 	return sal_False;
175 }
176 
177 // -----------------------------------------------------------------------
178 
MouseButtonDown(const MouseEvent &)179 sal_Bool ImplBorderWindowView::MouseButtonDown( const MouseEvent& )
180 {
181 	return sal_False;
182 }
183 
184 // -----------------------------------------------------------------------
185 
Tracking(const TrackingEvent &)186 sal_Bool ImplBorderWindowView::Tracking( const TrackingEvent& )
187 {
188 	return sal_False;
189 }
190 
191 // -----------------------------------------------------------------------
192 
RequestHelp(const Point &,Rectangle &)193 String ImplBorderWindowView::RequestHelp( const Point&, Rectangle& )
194 {
195 	return String();
196 }
197 
198 // -----------------------------------------------------------------------
199 
GetMenuRect() const200 Rectangle ImplBorderWindowView::GetMenuRect() const
201 {
202 	return Rectangle();
203 }
204 
205 // -----------------------------------------------------------------------
206 
ImplInitTitle(ImplBorderFrameData * pData)207 void ImplBorderWindowView::ImplInitTitle( ImplBorderFrameData* pData )
208 {
209 	ImplBorderWindow* pBorderWindow = pData->mpBorderWindow;
210 
211 	if ( !(pBorderWindow->GetStyle() & WB_MOVEABLE) ||
212 		  (pData->mnTitleType == BORDERWINDOW_TITLE_NONE) )
213 	{
214 		pData->mnTitleType	 = BORDERWINDOW_TITLE_NONE;
215 		pData->mnTitleHeight = 0;
216 	}
217 	else
218 	{
219 		const StyleSettings& rStyleSettings = pData->mpOutDev->GetSettings().GetStyleSettings();
220 		if ( pData->mnTitleType == BORDERWINDOW_TITLE_TEAROFF )
221 			pData->mnTitleHeight = rStyleSettings.GetTearOffTitleHeight();
222 		else
223 		{
224 			if ( pData->mnTitleType == BORDERWINDOW_TITLE_SMALL )
225 			{
226 				pBorderWindow->SetPointFont( rStyleSettings.GetFloatTitleFont() );
227 				pData->mnTitleHeight = rStyleSettings.GetFloatTitleHeight();
228 			}
229 			else // pData->mnTitleType == BORDERWINDOW_TITLE_NORMAL
230 			{
231 				pBorderWindow->SetPointFont( rStyleSettings.GetTitleFont() );
232 				pData->mnTitleHeight = rStyleSettings.GetTitleHeight();
233 			}
234 			long nTextHeight = pBorderWindow->GetTextHeight();
235 			if ( nTextHeight > pData->mnTitleHeight )
236 				pData->mnTitleHeight = nTextHeight;
237 		}
238 	}
239 }
240 
241 // -----------------------------------------------------------------------
242 
ImplHitTest(ImplBorderFrameData * pData,const Point & rPos)243 sal_uInt16 ImplBorderWindowView::ImplHitTest( ImplBorderFrameData* pData, const Point& rPos )
244 {
245 	ImplBorderWindow* pBorderWindow = pData->mpBorderWindow;
246 
247 	if ( pData->maTitleRect.IsInside( rPos ) )
248 	{
249 		if ( pData->maCloseRect.IsInside( rPos ) )
250 			return BORDERWINDOW_HITTEST_CLOSE;
251 		else if ( pData->maRollRect.IsInside( rPos ) )
252 			return BORDERWINDOW_HITTEST_ROLL;
253 		else if ( pData->maMenuRect.IsInside( rPos ) )
254 			return BORDERWINDOW_HITTEST_MENU;
255 		else if ( pData->maDockRect.IsInside( rPos ) )
256 			return BORDERWINDOW_HITTEST_DOCK;
257 		else if ( pData->maHideRect.IsInside( rPos ) )
258 			return BORDERWINDOW_HITTEST_HIDE;
259 		else if ( pData->maHelpRect.IsInside( rPos ) )
260 			return BORDERWINDOW_HITTEST_HELP;
261 		else if ( pData->maPinRect.IsInside( rPos ) )
262 			return BORDERWINDOW_HITTEST_PIN;
263 		else
264 			return BORDERWINDOW_HITTEST_TITLE;
265 	}
266 
267 	if ( (pBorderWindow->GetStyle() & WB_SIZEABLE) &&
268 		 !pBorderWindow->mbRollUp )
269 	{
270 		long nSizeWidth = pData->mnNoTitleTop+pData->mnTitleHeight;
271 		if ( nSizeWidth < 16 )
272 			nSizeWidth = 16;
273 
274 		// no corner resize for floating toolbars, which would lead to jumps while formatting
275 		// setting nSizeWidth = 0 will only return pure left,top,right,bottom
276 		if( pBorderWindow->GetStyle() & WB_OWNERDRAWDECORATION )
277 			nSizeWidth = 0;
278 
279 		if ( rPos.X() < pData->mnLeftBorder )
280 		{
281 			if ( rPos.Y() < nSizeWidth )
282 				return BORDERWINDOW_HITTEST_TOPLEFT;
283 			else if ( rPos.Y() >= pData->mnHeight-nSizeWidth )
284 				return BORDERWINDOW_HITTEST_BOTTOMLEFT;
285 			else
286 				return BORDERWINDOW_HITTEST_LEFT;
287 		}
288 		else if ( rPos.X() >= pData->mnWidth-pData->mnRightBorder )
289 		{
290 			if ( rPos.Y() < nSizeWidth )
291 				return BORDERWINDOW_HITTEST_TOPRIGHT;
292 			else if ( rPos.Y() >= pData->mnHeight-nSizeWidth )
293 				return BORDERWINDOW_HITTEST_BOTTOMRIGHT;
294 			else
295 				return BORDERWINDOW_HITTEST_RIGHT;
296 		}
297 		else if ( rPos.Y() < pData->mnNoTitleTop )
298 		{
299 			if ( rPos.X() < nSizeWidth )
300 				return BORDERWINDOW_HITTEST_TOPLEFT;
301 			else if ( rPos.X() >= pData->mnWidth-nSizeWidth )
302 				return BORDERWINDOW_HITTEST_TOPRIGHT;
303 			else
304 				return BORDERWINDOW_HITTEST_TOP;
305 		}
306 		else if ( rPos.Y() >= pData->mnHeight-pData->mnBottomBorder )
307 		{
308 			if ( rPos.X() < nSizeWidth )
309 				return BORDERWINDOW_HITTEST_BOTTOMLEFT;
310 			else if ( rPos.X() >= pData->mnWidth-nSizeWidth )
311 				return BORDERWINDOW_HITTEST_BOTTOMRIGHT;
312 			else
313 				return BORDERWINDOW_HITTEST_BOTTOM;
314 		}
315 	}
316 
317 	return 0;
318 }
319 
320 // -----------------------------------------------------------------------
321 
ImplMouseMove(ImplBorderFrameData * pData,const MouseEvent & rMEvt)322 sal_Bool ImplBorderWindowView::ImplMouseMove( ImplBorderFrameData* pData, const MouseEvent& rMEvt )
323 {
324 	sal_uInt16 oldCloseState = pData->mnCloseState;
325 	sal_uInt16 oldMenuState = pData->mnMenuState;
326 	pData->mnCloseState &= ~BUTTON_DRAW_HIGHLIGHT;
327 	pData->mnMenuState &= ~BUTTON_DRAW_HIGHLIGHT;
328 
329 	Point aMousePos = rMEvt.GetPosPixel();
330 	sal_uInt16 nHitTest = ImplHitTest( pData, aMousePos );
331 	PointerStyle ePtrStyle = POINTER_ARROW;
332 	if ( nHitTest & BORDERWINDOW_HITTEST_LEFT )
333 		ePtrStyle = POINTER_WINDOW_WSIZE;
334 	else if ( nHitTest & BORDERWINDOW_HITTEST_RIGHT )
335 		ePtrStyle = POINTER_WINDOW_ESIZE;
336 	else if ( nHitTest & BORDERWINDOW_HITTEST_TOP )
337 		ePtrStyle = POINTER_WINDOW_NSIZE;
338 	else if ( nHitTest & BORDERWINDOW_HITTEST_BOTTOM )
339 		ePtrStyle = POINTER_WINDOW_SSIZE;
340 	else if ( nHitTest & BORDERWINDOW_HITTEST_TOPLEFT )
341 		ePtrStyle = POINTER_WINDOW_NWSIZE;
342 	else if ( nHitTest & BORDERWINDOW_HITTEST_BOTTOMRIGHT )
343 		ePtrStyle = POINTER_WINDOW_SESIZE;
344 	else if ( nHitTest & BORDERWINDOW_HITTEST_TOPRIGHT )
345 		ePtrStyle = POINTER_WINDOW_NESIZE;
346 	else if ( nHitTest & BORDERWINDOW_HITTEST_BOTTOMLEFT )
347 		ePtrStyle = POINTER_WINDOW_SWSIZE;
348 	else if ( nHitTest & BORDERWINDOW_HITTEST_CLOSE )
349 		pData->mnCloseState |= BUTTON_DRAW_HIGHLIGHT;
350 	else if ( nHitTest & BORDERWINDOW_HITTEST_MENU )
351 		pData->mnMenuState |= BUTTON_DRAW_HIGHLIGHT;
352 	pData->mpBorderWindow->SetPointer( Pointer( ePtrStyle ) );
353 
354 	if( pData->mnCloseState != oldCloseState )
355 		pData->mpBorderWindow->Invalidate( pData->maCloseRect );
356 	if( pData->mnMenuState != oldMenuState )
357 		pData->mpBorderWindow->Invalidate( pData->maMenuRect );
358 
359 	return sal_True;
360 }
361 
362 // -----------------------------------------------------------------------
363 
ImplMouseButtonDown(ImplBorderFrameData * pData,const MouseEvent & rMEvt)364 sal_Bool ImplBorderWindowView::ImplMouseButtonDown( ImplBorderFrameData* pData, const MouseEvent& rMEvt )
365 {
366 	ImplBorderWindow* pBorderWindow = pData->mpBorderWindow;
367 
368 	if ( rMEvt.IsLeft() || rMEvt.IsRight() )
369 	{
370 		pData->maMouseOff = rMEvt.GetPosPixel();
371 		pData->mnHitTest = ImplHitTest( pData, pData->maMouseOff );
372 		sal_uInt16 nDragFullTest = 0;
373 		if ( pData->mnHitTest )
374 		{
375 			sal_Bool bTracking = sal_True;
376 			sal_Bool bHitTest = sal_True;
377 
378 			if ( pData->mnHitTest & BORDERWINDOW_HITTEST_CLOSE )
379 			{
380 				pData->mnCloseState |= BUTTON_DRAW_PRESSED;
381 				DrawWindow( BORDERWINDOW_DRAW_CLOSE );
382 			}
383 			else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_ROLL )
384 			{
385 				pData->mnRollState |= BUTTON_DRAW_PRESSED;
386 				DrawWindow( BORDERWINDOW_DRAW_ROLL );
387 			}
388 			else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_DOCK )
389 			{
390 				pData->mnDockState |= BUTTON_DRAW_PRESSED;
391 				DrawWindow( BORDERWINDOW_DRAW_DOCK );
392 			}
393 			else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_MENU )
394 			{
395 				pData->mnMenuState |= BUTTON_DRAW_PRESSED;
396 				DrawWindow( BORDERWINDOW_DRAW_MENU );
397 
398 				// call handler already on mouse down
399 				if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
400 				{
401 					SystemWindow* pClientWindow = (SystemWindow*)(pBorderWindow->ImplGetClientWindow());
402 					pClientWindow->TitleButtonClick( TITLE_BUTTON_MENU );
403 				}
404 			}
405 			else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_HIDE )
406 			{
407 				pData->mnHideState |= BUTTON_DRAW_PRESSED;
408 				DrawWindow( BORDERWINDOW_DRAW_HIDE );
409 			}
410 			else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_HELP )
411 			{
412 				pData->mnHelpState |= BUTTON_DRAW_PRESSED;
413 				DrawWindow( BORDERWINDOW_DRAW_HELP );
414 			}
415 			else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_PIN )
416 			{
417 				pData->mnPinState |= BUTTON_DRAW_PRESSED;
418 				DrawWindow( BORDERWINDOW_DRAW_PIN );
419 			}
420 			else
421 			{
422 				if ( rMEvt.GetClicks() == 1 )
423 				{
424 					if ( bTracking )
425 					{
426 						Point	aPos		 = pBorderWindow->GetPosPixel();
427 						Size	aSize		 = pBorderWindow->GetOutputSizePixel();
428 						pData->mnTrackX 	 = aPos.X();
429 						pData->mnTrackY 	 = aPos.Y();
430 						pData->mnTrackWidth  = aSize.Width();
431 						pData->mnTrackHeight = aSize.Height();
432 
433 						if ( pData->mnHitTest & BORDERWINDOW_HITTEST_TITLE )
434 							nDragFullTest = DRAGFULL_OPTION_WINDOWMOVE;
435 						else
436 							nDragFullTest = DRAGFULL_OPTION_WINDOWSIZE;
437 					}
438 				}
439 				else
440 				{
441 					bTracking = sal_False;
442 
443 					if ( (pData->mnHitTest & BORDERWINDOW_DRAW_TITLE) &&
444 						 ((rMEvt.GetClicks() % 2) == 0) )
445 					{
446 						pData->mnHitTest = 0;
447 						bHitTest = sal_False;
448 
449 						if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
450 						{
451 							SystemWindow* pClientWindow = (SystemWindow*)(pBorderWindow->ImplGetClientWindow());
452 							if ( sal_True /*pBorderWindow->mbDockBtn*/ ) // always perform docking on double click, no button required
453 								pClientWindow->TitleButtonClick( TITLE_BUTTON_DOCKING );
454 							else if ( pBorderWindow->GetStyle() & WB_ROLLABLE )
455 							{
456 								if ( pClientWindow->IsRollUp() )
457 									pClientWindow->RollDown();
458 								else
459 									pClientWindow->RollUp();
460 								pClientWindow->Roll();
461 							}
462 						}
463 					}
464 				}
465 			}
466 
467 			if ( bTracking )
468 			{
469 				pData->mbDragFull = sal_False;
470 				if ( nDragFullTest )
471 					pData->mbDragFull = sal_True; // always fulldrag for proper docking, ignore system settings
472 				pBorderWindow->StartTracking();
473 			}
474 			else if ( bHitTest )
475 				pData->mnHitTest = 0;
476 		}
477 	}
478 
479 	return sal_True;
480 }
481 
482 // -----------------------------------------------------------------------
483 
ImplTracking(ImplBorderFrameData * pData,const TrackingEvent & rTEvt)484 sal_Bool ImplBorderWindowView::ImplTracking( ImplBorderFrameData* pData, const TrackingEvent& rTEvt )
485 {
486 	ImplBorderWindow* pBorderWindow = pData->mpBorderWindow;
487 
488 	if ( rTEvt.IsTrackingEnded() )
489 	{
490 		sal_uInt16 nHitTest = pData->mnHitTest;
491 		pData->mnHitTest = 0;
492 
493 		if ( nHitTest & BORDERWINDOW_HITTEST_CLOSE )
494 		{
495 			if ( pData->mnCloseState & BUTTON_DRAW_PRESSED )
496 			{
497 				pData->mnCloseState &= ~BUTTON_DRAW_PRESSED;
498 				DrawWindow( BORDERWINDOW_DRAW_CLOSE );
499 
500 				// Bei Abbruch kein Click-Handler rufen
501 				if ( !rTEvt.IsTrackingCanceled() )
502 				{
503                     // dispatch to correct window type (why is Close() not virtual ??? )
504                     // TODO: make Close() virtual
505                     Window *pWin = pBorderWindow->ImplGetClientWindow()->ImplGetWindow();
506                     SystemWindow  *pSysWin  = dynamic_cast<SystemWindow* >(pWin);
507                     DockingWindow *pDockWin = dynamic_cast<DockingWindow*>(pWin);
508 					if ( pSysWin )
509                         pSysWin->Close();
510 					else if ( pDockWin )
511                         pDockWin->Close();
512 				}
513 			}
514 		}
515 		else if ( nHitTest & BORDERWINDOW_HITTEST_ROLL )
516 		{
517 			if ( pData->mnRollState & BUTTON_DRAW_PRESSED )
518 			{
519 				pData->mnRollState &= ~BUTTON_DRAW_PRESSED;
520 				DrawWindow( BORDERWINDOW_DRAW_ROLL );
521 
522 				// Bei Abbruch kein Click-Handler rufen
523 				if ( !rTEvt.IsTrackingCanceled() )
524 				{
525 					if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
526 					{
527 						SystemWindow* pClientWindow = (SystemWindow*)(pBorderWindow->ImplGetClientWindow());
528 						if ( pClientWindow->IsRollUp() )
529 							pClientWindow->RollDown();
530 						else
531 							pClientWindow->RollUp();
532 						pClientWindow->Roll();
533 					}
534 				}
535 			}
536 		}
537 		else if ( nHitTest & BORDERWINDOW_HITTEST_DOCK )
538 		{
539 			if ( pData->mnDockState & BUTTON_DRAW_PRESSED )
540 			{
541 				pData->mnDockState &= ~BUTTON_DRAW_PRESSED;
542 				DrawWindow( BORDERWINDOW_DRAW_DOCK );
543 
544 				// Bei Abbruch kein Click-Handler rufen
545 				if ( !rTEvt.IsTrackingCanceled() )
546 				{
547 					if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
548 					{
549 						SystemWindow* pClientWindow = (SystemWindow*)(pBorderWindow->ImplGetClientWindow());
550 						pClientWindow->TitleButtonClick( TITLE_BUTTON_DOCKING );
551 					}
552 				}
553 			}
554 		}
555 		else if ( nHitTest & BORDERWINDOW_HITTEST_MENU )
556 		{
557 			if ( pData->mnMenuState & BUTTON_DRAW_PRESSED )
558 			{
559 				pData->mnMenuState &= ~BUTTON_DRAW_PRESSED;
560 				DrawWindow( BORDERWINDOW_DRAW_MENU );
561 
562 				// handler already called on mouse down
563 			}
564 		}
565 		else if ( nHitTest & BORDERWINDOW_HITTEST_HIDE )
566 		{
567 			if ( pData->mnHideState & BUTTON_DRAW_PRESSED )
568 			{
569 				pData->mnHideState &= ~BUTTON_DRAW_PRESSED;
570 				DrawWindow( BORDERWINDOW_DRAW_HIDE );
571 
572 				// Bei Abbruch kein Click-Handler rufen
573 				if ( !rTEvt.IsTrackingCanceled() )
574 				{
575 					if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
576 					{
577 						SystemWindow* pClientWindow = (SystemWindow*)(pBorderWindow->ImplGetClientWindow());
578 						pClientWindow->TitleButtonClick( TITLE_BUTTON_HIDE );
579 					}
580 				}
581 			}
582 		}
583 		else if ( nHitTest & BORDERWINDOW_HITTEST_HELP )
584 		{
585 			if ( pData->mnHelpState & BUTTON_DRAW_PRESSED )
586 			{
587 				pData->mnHelpState &= ~BUTTON_DRAW_PRESSED;
588 				DrawWindow( BORDERWINDOW_DRAW_HELP );
589 
590 				// Bei Abbruch kein Click-Handler rufen
591 				if ( !rTEvt.IsTrackingCanceled() )
592 				{
593 				}
594 			}
595 		}
596 		else if ( nHitTest & BORDERWINDOW_HITTEST_PIN )
597 		{
598 			if ( pData->mnPinState & BUTTON_DRAW_PRESSED )
599 			{
600 				pData->mnPinState &= ~BUTTON_DRAW_PRESSED;
601 				DrawWindow( BORDERWINDOW_DRAW_PIN );
602 
603 				// Bei Abbruch kein Click-Handler rufen
604 				if ( !rTEvt.IsTrackingCanceled() )
605 				{
606 					if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
607 					{
608 						SystemWindow* pClientWindow = (SystemWindow*)(pBorderWindow->ImplGetClientWindow());
609 						pClientWindow->SetPin( !pClientWindow->IsPined() );
610 						pClientWindow->Pin();
611 					}
612 				}
613 			}
614 		}
615 		else
616 		{
617 			if ( pData->mbDragFull )
618 			{
619 				// Bei Abbruch alten Zustand wieder herstellen
620 				if ( rTEvt.IsTrackingCanceled() )
621 					pBorderWindow->SetPosSizePixel( Point( pData->mnTrackX, pData->mnTrackY ), Size( pData->mnTrackWidth, pData->mnTrackHeight ) );
622 			}
623 			else
624 			{
625 				pBorderWindow->HideTracking();
626 				if ( !rTEvt.IsTrackingCanceled() )
627 					pBorderWindow->SetPosSizePixel( Point( pData->mnTrackX, pData->mnTrackY ), Size( pData->mnTrackWidth, pData->mnTrackHeight ) );
628 			}
629 
630 			if ( !rTEvt.IsTrackingCanceled() )
631 			{
632 				if ( pBorderWindow->ImplGetClientWindow()->ImplIsFloatingWindow() )
633 				{
634 					if ( ((FloatingWindow*)pBorderWindow->ImplGetClientWindow())->IsInPopupMode() )
635 						((FloatingWindow*)pBorderWindow->ImplGetClientWindow())->EndPopupMode( FLOATWIN_POPUPMODEEND_TEAROFF );
636 				}
637 			}
638 		}
639 	}
640 	else if ( !rTEvt.GetMouseEvent().IsSynthetic() )
641 	{
642 		Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
643 
644 		if ( pData->mnHitTest & BORDERWINDOW_HITTEST_CLOSE )
645 		{
646 			if ( pData->maCloseRect.IsInside( aMousePos ) )
647 			{
648 				if ( !(pData->mnCloseState & BUTTON_DRAW_PRESSED) )
649 				{
650 					pData->mnCloseState |= BUTTON_DRAW_PRESSED;
651 					DrawWindow( BORDERWINDOW_DRAW_CLOSE );
652 				}
653 			}
654 			else
655 			{
656 				if ( pData->mnCloseState & BUTTON_DRAW_PRESSED )
657 				{
658 					pData->mnCloseState &= ~BUTTON_DRAW_PRESSED;
659 					DrawWindow( BORDERWINDOW_DRAW_CLOSE );
660 				}
661 			}
662 		}
663 		else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_ROLL )
664 		{
665 			if ( pData->maRollRect.IsInside( aMousePos ) )
666 			{
667 				if ( !(pData->mnRollState & BUTTON_DRAW_PRESSED) )
668 				{
669 					pData->mnRollState |= BUTTON_DRAW_PRESSED;
670 					DrawWindow( BORDERWINDOW_DRAW_ROLL );
671 				}
672 			}
673 			else
674 			{
675 				if ( pData->mnRollState & BUTTON_DRAW_PRESSED )
676 				{
677 					pData->mnRollState &= ~BUTTON_DRAW_PRESSED;
678 					DrawWindow( BORDERWINDOW_DRAW_ROLL );
679 				}
680 			}
681 		}
682 		else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_DOCK )
683 		{
684 			if ( pData->maDockRect.IsInside( aMousePos ) )
685 			{
686 				if ( !(pData->mnDockState & BUTTON_DRAW_PRESSED) )
687 				{
688 					pData->mnDockState |= BUTTON_DRAW_PRESSED;
689 					DrawWindow( BORDERWINDOW_DRAW_DOCK );
690 				}
691 			}
692 			else
693 			{
694 				if ( pData->mnDockState & BUTTON_DRAW_PRESSED )
695 				{
696 					pData->mnDockState &= ~BUTTON_DRAW_PRESSED;
697 					DrawWindow( BORDERWINDOW_DRAW_DOCK );
698 				}
699 			}
700 		}
701 		else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_MENU )
702 		{
703 			if ( pData->maMenuRect.IsInside( aMousePos ) )
704 			{
705 				if ( !(pData->mnMenuState & BUTTON_DRAW_PRESSED) )
706 				{
707 					pData->mnMenuState |= BUTTON_DRAW_PRESSED;
708 					DrawWindow( BORDERWINDOW_DRAW_MENU );
709 
710 				}
711 			}
712 			else
713 			{
714 				if ( pData->mnMenuState & BUTTON_DRAW_PRESSED )
715 				{
716 					pData->mnMenuState &= ~BUTTON_DRAW_PRESSED;
717 					DrawWindow( BORDERWINDOW_DRAW_MENU );
718 				}
719 			}
720 		}
721 		else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_HIDE )
722 		{
723 			if ( pData->maHideRect.IsInside( aMousePos ) )
724 			{
725 				if ( !(pData->mnHideState & BUTTON_DRAW_PRESSED) )
726 				{
727 					pData->mnHideState |= BUTTON_DRAW_PRESSED;
728 					DrawWindow( BORDERWINDOW_DRAW_HIDE );
729 				}
730 			}
731 			else
732 			{
733 				if ( pData->mnHideState & BUTTON_DRAW_PRESSED )
734 				{
735 					pData->mnHideState &= ~BUTTON_DRAW_PRESSED;
736 					DrawWindow( BORDERWINDOW_DRAW_HIDE );
737 				}
738 			}
739 		}
740 		else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_HELP )
741 		{
742 			if ( pData->maHelpRect.IsInside( aMousePos ) )
743 			{
744 				if ( !(pData->mnHelpState & BUTTON_DRAW_PRESSED) )
745 				{
746 					pData->mnHelpState |= BUTTON_DRAW_PRESSED;
747 					DrawWindow( BORDERWINDOW_DRAW_HELP );
748 				}
749 			}
750 			else
751 			{
752 				if ( pData->mnHelpState & BUTTON_DRAW_PRESSED )
753 				{
754 					pData->mnHelpState &= ~BUTTON_DRAW_PRESSED;
755 					DrawWindow( BORDERWINDOW_DRAW_HELP );
756 				}
757 			}
758 		}
759 		else if ( pData->mnHitTest & BORDERWINDOW_HITTEST_PIN )
760 		{
761 			if ( pData->maPinRect.IsInside( aMousePos ) )
762 			{
763 				if ( !(pData->mnPinState & BUTTON_DRAW_PRESSED) )
764 				{
765 					pData->mnPinState |= BUTTON_DRAW_PRESSED;
766 					DrawWindow( BORDERWINDOW_DRAW_PIN );
767 				}
768 			}
769 			else
770 			{
771 				if ( pData->mnPinState & BUTTON_DRAW_PRESSED )
772 				{
773 					pData->mnPinState &= ~BUTTON_DRAW_PRESSED;
774 					DrawWindow( BORDERWINDOW_DRAW_PIN );
775 				}
776 			}
777 		}
778 		else
779 		{
780 			/*
781 			// adjusting mousepos not required, we allow the whole screen (no desktop anymore...)
782 			Point	aFrameMousePos = pBorderWindow->ImplOutputToFrame( aMousePos );
783 			Size	aFrameSize = pBorderWindow->ImplGetFrameWindow()->GetOutputSizePixel();
784 			if ( aFrameMousePos.X() < 0 )
785 				aFrameMousePos.X() = 0;
786 			if ( aFrameMousePos.Y() < 0 )
787 				aFrameMousePos.Y() = 0;
788 			if ( aFrameMousePos.X() > aFrameSize.Width()-1 )
789 				aFrameMousePos.X() = aFrameSize.Width()-1;
790 			if ( aFrameMousePos.Y() > aFrameSize.Height()-1 )
791 				aFrameMousePos.Y() = aFrameSize.Height()-1;
792 			aMousePos = pBorderWindow->ImplFrameToOutput( aFrameMousePos );
793 			*/
794 
795 			aMousePos.X()	 -= pData->maMouseOff.X();
796 			aMousePos.Y()	 -= pData->maMouseOff.Y();
797 
798 			if ( pData->mnHitTest & BORDERWINDOW_HITTEST_TITLE )
799 			{
800 	            pData->mpBorderWindow->SetPointer( Pointer( POINTER_MOVE ) );
801 
802 				Point aPos = pBorderWindow->GetPosPixel();
803 				aPos.X() += aMousePos.X();
804 				aPos.Y() += aMousePos.Y();
805 				if ( pData->mbDragFull )
806 				{
807 					pBorderWindow->SetPosPixel( aPos );
808 					pBorderWindow->ImplUpdateAll();
809 					pBorderWindow->ImplGetFrameWindow()->ImplUpdateAll();
810 				}
811 				else
812 				{
813 					pData->mnTrackX = aPos.X();
814 					pData->mnTrackY = aPos.Y();
815 					pBorderWindow->ShowTracking( Rectangle( pBorderWindow->ScreenToOutputPixel( aPos ), pBorderWindow->GetOutputSizePixel() ), SHOWTRACK_BIG );
816 				}
817 			}
818 			else
819 			{
820 				Point		aOldPos			= pBorderWindow->GetPosPixel();
821 				Size		aSize			= pBorderWindow->GetSizePixel();
822 				Rectangle	aNewRect( aOldPos, aSize );
823 				long		nOldWidth		= aSize.Width();
824 				long		nOldHeight		= aSize.Height();
825 				long		nBorderWidth	= pData->mnLeftBorder+pData->mnRightBorder;
826 				long		nBorderHeight	= pData->mnTopBorder+pData->mnBottomBorder;
827 				long		nMinWidth		= pBorderWindow->mnMinWidth+nBorderWidth;
828 				long		nMinHeight		= pBorderWindow->mnMinHeight+nBorderHeight;
829 				long		nMinWidth2		= nBorderWidth;
830 				long		nMaxWidth		= pBorderWindow->mnMaxWidth+nBorderWidth;
831 				long		nMaxHeight		= pBorderWindow->mnMaxHeight+nBorderHeight;
832 
833 				if ( pData->mnTitleHeight )
834 				{
835 					nMinWidth2 += 4;
836 
837 					if ( pBorderWindow->GetStyle() & WB_CLOSEABLE )
838 						nMinWidth2 += pData->maCloseRect.GetWidth();
839 				}
840 				if ( nMinWidth2 > nMinWidth )
841 					nMinWidth = nMinWidth2;
842 				if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_LEFT | BORDERWINDOW_HITTEST_TOPLEFT | BORDERWINDOW_HITTEST_BOTTOMLEFT) )
843 				{
844 					aNewRect.Left() += aMousePos.X();
845 					if ( aNewRect.GetWidth() < nMinWidth )
846 						aNewRect.Left() = aNewRect.Right()-nMinWidth+1;
847 					else if ( aNewRect.GetWidth() > nMaxWidth )
848 						aNewRect.Left() = aNewRect.Right()-nMaxWidth+1;
849 				}
850 				else if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_RIGHT | BORDERWINDOW_HITTEST_TOPRIGHT | BORDERWINDOW_HITTEST_BOTTOMRIGHT) )
851 				{
852 					aNewRect.Right() += aMousePos.X();
853 					if ( aNewRect.GetWidth() < nMinWidth )
854 						aNewRect.Right() = aNewRect.Left()+nMinWidth+1;
855 					else if ( aNewRect.GetWidth() > nMaxWidth )
856 						aNewRect.Right() = aNewRect.Left()+nMaxWidth+1;
857 				}
858 				if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_TOP | BORDERWINDOW_HITTEST_TOPLEFT | BORDERWINDOW_HITTEST_TOPRIGHT) )
859 				{
860 					aNewRect.Top() += aMousePos.Y();
861 					if ( aNewRect.GetHeight() < nMinHeight )
862 						aNewRect.Top() = aNewRect.Bottom()-nMinHeight+1;
863 					else if ( aNewRect.GetHeight() > nMaxHeight )
864 						aNewRect.Top() = aNewRect.Bottom()-nMaxHeight+1;
865 				}
866 				else if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_BOTTOM | BORDERWINDOW_HITTEST_BOTTOMLEFT | BORDERWINDOW_HITTEST_BOTTOMRIGHT) )
867 				{
868 					aNewRect.Bottom() += aMousePos.Y();
869 					if ( aNewRect.GetHeight() < nMinHeight )
870 						aNewRect.Bottom() = aNewRect.Top()+nMinHeight+1;
871 					else if ( aNewRect.GetHeight() > nMaxHeight )
872 						aNewRect.Bottom() = aNewRect.Top()+nMaxHeight+1;
873 				}
874 
875 				// call Resizing-Handler for SystemWindows
876 				if ( pBorderWindow->ImplGetClientWindow()->IsSystemWindow() )
877 				{
878 					// adjust size for Resizing-call
879 					aSize = aNewRect.GetSize();
880 					aSize.Width()	-= nBorderWidth;
881 					aSize.Height()	-= nBorderHeight;
882 					((SystemWindow*)pBorderWindow->ImplGetClientWindow())->Resizing( aSize );
883 					aSize.Width()	+= nBorderWidth;
884 					aSize.Height()	+= nBorderHeight;
885 					if ( aSize.Width() < nMinWidth )
886 						aSize.Width() = nMinWidth;
887 					if ( aSize.Height() < nMinHeight )
888 						aSize.Height() = nMinHeight;
889 					if ( aSize.Width() > nMaxWidth )
890 						aSize.Width() = nMaxWidth;
891 					if ( aSize.Height() > nMaxHeight )
892 						aSize.Height() = nMaxHeight;
893 					if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_LEFT | BORDERWINDOW_HITTEST_TOPLEFT | BORDERWINDOW_HITTEST_BOTTOMLEFT) )
894 						aNewRect.Left() = aNewRect.Right()-aSize.Width()+1;
895 					else
896 						aNewRect.Right() = aNewRect.Left()+aSize.Width()-1;
897 					if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_TOP | BORDERWINDOW_HITTEST_TOPLEFT | BORDERWINDOW_HITTEST_TOPRIGHT) )
898 						aNewRect.Top() = aNewRect.Bottom()-aSize.Height()+1;
899 					else
900 						aNewRect.Bottom() = aNewRect.Top()+aSize.Height()-1;
901 				}
902 
903 				if ( pData->mbDragFull )
904 				{
905                     // no move (only resize) if position did not change
906                     if( aOldPos != aNewRect.TopLeft() )
907 					    pBorderWindow->SetPosSizePixel( aNewRect.Left(), aNewRect.Top(),
908 													aNewRect.GetWidth(), aNewRect.GetHeight(), WINDOW_POSSIZE_POSSIZE );
909                     else
910 					    pBorderWindow->SetPosSizePixel( aNewRect.Left(), aNewRect.Top(),
911 													aNewRect.GetWidth(), aNewRect.GetHeight(), WINDOW_POSSIZE_SIZE );
912 
913 					pBorderWindow->ImplUpdateAll();
914 					pBorderWindow->ImplGetFrameWindow()->ImplUpdateAll();
915 					if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_RIGHT | BORDERWINDOW_HITTEST_TOPRIGHT | BORDERWINDOW_HITTEST_BOTTOMRIGHT) )
916 						pData->maMouseOff.X() += aNewRect.GetWidth()-nOldWidth;
917 					if ( pData->mnHitTest & (BORDERWINDOW_HITTEST_BOTTOM | BORDERWINDOW_HITTEST_BOTTOMLEFT | BORDERWINDOW_HITTEST_BOTTOMRIGHT) )
918 						pData->maMouseOff.Y() += aNewRect.GetHeight()-nOldHeight;
919 				}
920 				else
921 				{
922 					pData->mnTrackX 	   = aNewRect.Left();
923 					pData->mnTrackY 	   = aNewRect.Top();
924 					pData->mnTrackWidth    = aNewRect.GetWidth();
925 					pData->mnTrackHeight   = aNewRect.GetHeight();
926 					pBorderWindow->ShowTracking( Rectangle( pBorderWindow->ScreenToOutputPixel( aNewRect.TopLeft() ), aNewRect.GetSize() ), SHOWTRACK_BIG );
927 				}
928 			}
929 		}
930 	}
931 
932 	return sal_True;
933 }
934 
935 // -----------------------------------------------------------------------
936 
ImplRequestHelp(ImplBorderFrameData * pData,const Point & rPos,Rectangle & rHelpRect)937 String ImplBorderWindowView::ImplRequestHelp( ImplBorderFrameData* pData,
938 											  const Point& rPos,
939 											  Rectangle& rHelpRect )
940 {
941 	sal_uInt16 nHelpId = 0;
942 	String aHelpStr;
943 	sal_uInt16 nHitTest = ImplHitTest( pData, rPos );
944 	if ( nHitTest )
945 	{
946 		if ( nHitTest & BORDERWINDOW_HITTEST_CLOSE )
947 		{
948 			nHelpId 	= SV_HELPTEXT_CLOSE;
949 			rHelpRect	= pData->maCloseRect;
950 		}
951 		else if ( nHitTest & BORDERWINDOW_HITTEST_ROLL )
952 		{
953 			if ( pData->mpBorderWindow->mbRollUp )
954 				nHelpId = SV_HELPTEXT_ROLLDOWN;
955 			else
956 				nHelpId = SV_HELPTEXT_ROLLUP;
957 			rHelpRect	= pData->maRollRect;
958 		}
959 		else if ( nHitTest & BORDERWINDOW_HITTEST_DOCK )
960 		{
961 			nHelpId 	= SV_HELPTEXT_MAXIMIZE;
962 			rHelpRect	= pData->maDockRect;
963 		}
964 		/* no help string available
965 		else if ( nHitTest & BORDERWINDOW_HITTEST_MENU )
966 		{
967 			nHelpId 	= SV_HELPTEXT_MENU;
968 			rHelpRect	= pData->maMenuRect;
969 		}*/
970 		else if ( nHitTest & BORDERWINDOW_HITTEST_HIDE )
971 		{
972 			nHelpId 	= SV_HELPTEXT_MINIMIZE;
973 			rHelpRect	= pData->maHideRect;
974 		}
975 		else if ( nHitTest & BORDERWINDOW_HITTEST_HELP )
976 		{
977 			nHelpId 	= SV_HELPTEXT_HELP;
978 			rHelpRect	= pData->maHelpRect;
979 		}
980 		else if ( nHitTest & BORDERWINDOW_HITTEST_PIN )
981 		{
982 			nHelpId 	= SV_HELPTEXT_ALWAYSVISIBLE;
983 			rHelpRect	= pData->maPinRect;
984 		}
985 		else if ( nHitTest & BORDERWINDOW_HITTEST_TITLE )
986 		{
987             if( !pData->maTitleRect.IsEmpty() )
988             {
989                 // tooltip only if title truncated
990                 if( pData->mbTitleClipped )
991                 {
992 			        rHelpRect	= pData->maTitleRect;
993                     // no help id, use window title as help string
994                     aHelpStr    = pData->mpBorderWindow->GetText();
995                 }
996             }
997 		}
998 	}
999 
1000 	if( nHelpId && ImplGetResMgr() )
1001 		aHelpStr = String( ResId( nHelpId, *ImplGetResMgr() ) );
1002 
1003 	return aHelpStr;
1004 }
1005 
1006 // -----------------------------------------------------------------------
1007 
ImplCalcTitleWidth(const ImplBorderFrameData * pData) const1008 long ImplBorderWindowView::ImplCalcTitleWidth( const ImplBorderFrameData* pData ) const
1009 {
1010 	// kein sichtbarer Title, dann auch keine Breite
1011 	if ( !pData->mnTitleHeight )
1012 		return 0;
1013 
1014 	ImplBorderWindow* pBorderWindow = pData->mpBorderWindow;
1015 	long nTitleWidth = pBorderWindow->GetTextWidth( pBorderWindow->GetText() )+6;
1016 	nTitleWidth += pData->maPinRect.GetWidth();
1017 	nTitleWidth += pData->maCloseRect.GetWidth();
1018 	nTitleWidth += pData->maRollRect.GetWidth();
1019 	nTitleWidth += pData->maDockRect.GetWidth();
1020 	nTitleWidth += pData->maMenuRect.GetWidth();
1021 	nTitleWidth += pData->maHideRect.GetWidth();
1022 	nTitleWidth += pData->maHelpRect.GetWidth();
1023 	nTitleWidth += pData->mnLeftBorder+pData->mnRightBorder;
1024 	return nTitleWidth;
1025 }
1026 
1027 // =======================================================================
1028 
1029 // --------------------------
1030 // - ImplNoBorderWindowView -
1031 // --------------------------
1032 
ImplNoBorderWindowView(ImplBorderWindow *)1033 ImplNoBorderWindowView::ImplNoBorderWindowView( ImplBorderWindow* )
1034 {
1035 }
1036 
1037 // -----------------------------------------------------------------------
1038 
Init(OutputDevice *,long,long)1039 void ImplNoBorderWindowView::Init( OutputDevice*, long, long )
1040 {
1041 }
1042 
1043 // -----------------------------------------------------------------------
1044 
GetBorder(sal_Int32 & rLeftBorder,sal_Int32 & rTopBorder,sal_Int32 & rRightBorder,sal_Int32 & rBottomBorder) const1045 void ImplNoBorderWindowView::GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
1046 										sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const
1047 {
1048 	rLeftBorder 	= 0;
1049 	rTopBorder		= 0;
1050 	rRightBorder	= 0;
1051 	rBottomBorder	= 0;
1052 }
1053 
1054 // -----------------------------------------------------------------------
1055 
CalcTitleWidth() const1056 long ImplNoBorderWindowView::CalcTitleWidth() const
1057 {
1058 	return 0;
1059 }
1060 
1061 // -----------------------------------------------------------------------
1062 
DrawWindow(sal_uInt16,OutputDevice *,const Point *)1063 void ImplNoBorderWindowView::DrawWindow( sal_uInt16, OutputDevice*, const Point* )
1064 {
1065 }
1066 
1067 // =======================================================================
1068 
1069 // -----------------------------
1070 // - ImplSmallBorderWindowView -
1071 // -----------------------------
1072 
1073 // =======================================================================
1074 
ImplSmallBorderWindowView(ImplBorderWindow * pBorderWindow)1075 ImplSmallBorderWindowView::ImplSmallBorderWindowView( ImplBorderWindow* pBorderWindow )
1076 {
1077 	mpBorderWindow = pBorderWindow;
1078 }
1079 
1080 // -----------------------------------------------------------------------
1081 
Init(OutputDevice * pDev,long nWidth,long nHeight)1082 void ImplSmallBorderWindowView::Init( OutputDevice* pDev, long nWidth, long nHeight )
1083 {
1084 	mpOutDev	= pDev;
1085 	mnWidth 	= nWidth;
1086 	mnHeight	= nHeight;
1087 	mbNWFBorder = false;
1088 
1089 	sal_uInt16 nBorderStyle = mpBorderWindow->GetBorderStyle();
1090 	if ( nBorderStyle & WINDOW_BORDER_NOBORDER )
1091 	{
1092 		mnLeftBorder	= 0;
1093 		mnTopBorder 	= 0;
1094 		mnRightBorder	= 0;
1095 		mnBottomBorder	= 0;
1096 	}
1097 	else
1098 	{
1099         // FIXME: this is currently only on aqua, check with other
1100         // platforms
1101         if( ImplGetSVData()->maNWFData.mbNoFocusRects )
1102         {
1103             // for native widget drawing we must find out what
1104             // control this border belongs to
1105             Window *pWin = NULL, *pCtrl = NULL;
1106             if( mpOutDev->GetOutDevType() == OUTDEV_WINDOW )
1107                 pWin = (Window*) mpOutDev;
1108 
1109             ControlType aCtrlType = 0;
1110             if( pWin && (pCtrl = mpBorderWindow->GetWindow( WINDOW_CLIENT )) != NULL )
1111             {
1112                 switch( pCtrl->GetType() )
1113                 {
1114                     case WINDOW_LISTBOX:
1115                         if( pCtrl->GetStyle() & WB_DROPDOWN )
1116                         {
1117                             aCtrlType = CTRL_LISTBOX;
1118                             mbNWFBorder = true;
1119                         }
1120                         break;
1121                     case WINDOW_COMBOBOX:
1122                         if( pCtrl->GetStyle() & WB_DROPDOWN )
1123                         {
1124                             aCtrlType = CTRL_COMBOBOX;
1125                             mbNWFBorder = true;
1126                         }
1127                         break;
1128                     case WINDOW_MULTILINEEDIT:
1129                         aCtrlType = CTRL_MULTILINE_EDITBOX;
1130                         mbNWFBorder = true;
1131                         break;
1132                     case WINDOW_EDIT:
1133                     case WINDOW_PATTERNFIELD:
1134                     case WINDOW_METRICFIELD:
1135                     case WINDOW_CURRENCYFIELD:
1136                     case WINDOW_DATEFIELD:
1137                     case WINDOW_TIMEFIELD:
1138                     case WINDOW_LONGCURRENCYFIELD:
1139                     case WINDOW_NUMERICFIELD:
1140                     case WINDOW_SPINFIELD:
1141                         mbNWFBorder = true;
1142                         aCtrlType = (pCtrl->GetStyle() & WB_SPIN) ? CTRL_SPINBOX : CTRL_EDITBOX;
1143                         break;
1144                     default:
1145                         break;
1146                 }
1147             }
1148             if( mbNWFBorder )
1149             {
1150                 ImplControlValue aControlValue;
1151                 Rectangle aCtrlRegion( (const Point&)Point(), Size( mnWidth < 10 ? 10 : mnWidth, mnHeight < 10 ? 10 : mnHeight ) );
1152                 Rectangle aBounds( aCtrlRegion );
1153                 Rectangle aContent( aCtrlRegion );
1154                 if( pWin->GetNativeControlRegion( aCtrlType, PART_ENTIRE_CONTROL, aCtrlRegion,
1155                                                   CTRL_STATE_ENABLED, aControlValue, rtl::OUString(),
1156                                                   aBounds, aContent ) )
1157                 {
1158                     mnLeftBorder    = aContent.Left() - aBounds.Left();
1159                     mnRightBorder   = aBounds.Right() - aContent.Right();
1160                     mnTopBorder     = aContent.Top() - aBounds.Top();
1161                     mnBottomBorder  = aBounds.Bottom() - aContent.Bottom();
1162                     if( mnWidth && mnHeight )
1163                     {
1164 
1165                         mpBorderWindow->SetPaintTransparent( sal_True );
1166                         mpBorderWindow->SetBackground();
1167                         pCtrl->SetPaintTransparent( sal_True );
1168 
1169                         Window* pCompoundParent = NULL;
1170                         if( pWin->GetParent() && pWin->GetParent()->IsCompoundControl() )
1171                             pCompoundParent = pWin->GetParent();
1172 
1173                         if( pCompoundParent )
1174                             pCompoundParent->SetPaintTransparent( sal_True );
1175 
1176                         if( mnWidth < aBounds.GetWidth() || mnHeight < aBounds.GetHeight() )
1177                         {
1178                             if( ! pCompoundParent ) // compound controls have to fix themselves
1179                             {
1180                                 Point aPos( mpBorderWindow->GetPosPixel() );
1181                                 if( mnWidth < aBounds.GetWidth() )
1182                                     aPos.X() -= (aBounds.GetWidth() - mnWidth) / 2;
1183                                 if( mnHeight < aBounds.GetHeight() )
1184                                     aPos.Y() -= (aBounds.GetHeight() - mnHeight) / 2;
1185                                 mpBorderWindow->SetPosSizePixel( aPos, aBounds.GetSize() );
1186                             }
1187                         }
1188                     }
1189                 }
1190                 else
1191                     mbNWFBorder = false;
1192             }
1193         }
1194 
1195         if( ! mbNWFBorder )
1196         {
1197             sal_uInt16 nStyle = FRAME_DRAW_NODRAW;
1198             // Wenn Border umgesetzt wurde oder BorderWindow ein Frame-Fenster
1199             // ist, dann Border nach aussen
1200             if ( (nBorderStyle & WINDOW_BORDER_DOUBLEOUT) || mpBorderWindow->mbSmallOutBorder )
1201                 nStyle |= FRAME_DRAW_DOUBLEOUT;
1202             else
1203                 nStyle |= FRAME_DRAW_DOUBLEIN;
1204             if ( nBorderStyle & WINDOW_BORDER_MONO )
1205                 nStyle |= FRAME_DRAW_MONO;
1206 
1207             DecorationView	aDecoView( mpOutDev );
1208             Rectangle		aRect( 0, 0, 10, 10 );
1209             Rectangle		aCalcRect = aDecoView.DrawFrame( aRect, nStyle );
1210             mnLeftBorder	= aCalcRect.Left();
1211             mnTopBorder 	= aCalcRect.Top();
1212             mnRightBorder	= aRect.Right()-aCalcRect.Right();
1213             mnBottomBorder	= aRect.Bottom()-aCalcRect.Bottom();
1214         }
1215 	}
1216 }
1217 
1218 // -----------------------------------------------------------------------
1219 
GetBorder(sal_Int32 & rLeftBorder,sal_Int32 & rTopBorder,sal_Int32 & rRightBorder,sal_Int32 & rBottomBorder) const1220 void ImplSmallBorderWindowView::GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
1221 										   sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const
1222 {
1223 	rLeftBorder 	= mnLeftBorder;
1224 	rTopBorder		= mnTopBorder;
1225 	rRightBorder	= mnRightBorder;
1226 	rBottomBorder	= mnBottomBorder;
1227 }
1228 
1229 // -----------------------------------------------------------------------
1230 
CalcTitleWidth() const1231 long ImplSmallBorderWindowView::CalcTitleWidth() const
1232 {
1233 	return 0;
1234 }
1235 
1236 // -----------------------------------------------------------------------
1237 
DrawWindow(sal_uInt16 nDrawFlags,OutputDevice *,const Point *)1238 void ImplSmallBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice*, const Point* )
1239 {
1240 	sal_uInt16 nBorderStyle = mpBorderWindow->GetBorderStyle();
1241 	if ( nBorderStyle & WINDOW_BORDER_NOBORDER )
1242 		return;
1243 
1244 	sal_Bool bNativeOK = sal_False;
1245 	// for native widget drawing we must find out what
1246 	// control this border belongs to
1247 	Window *pWin = NULL, *pCtrl = NULL;
1248 	if( mpOutDev->GetOutDevType() == OUTDEV_WINDOW )
1249 		pWin = (Window*) mpOutDev;
1250 
1251 	ControlType aCtrlType = 0;
1252 	ControlPart aCtrlPart = PART_ENTIRE_CONTROL;
1253 
1254     if( pWin && (pCtrl = mpBorderWindow->GetWindow( WINDOW_CLIENT )) != NULL )
1255     {
1256         switch( pCtrl->GetType() )
1257         {
1258             case WINDOW_MULTILINEEDIT:
1259                 aCtrlType = CTRL_MULTILINE_EDITBOX;
1260                 break;
1261             case WINDOW_EDIT:
1262             case WINDOW_PATTERNFIELD:
1263             case WINDOW_METRICFIELD:
1264             case WINDOW_CURRENCYFIELD:
1265             case WINDOW_DATEFIELD:
1266             case WINDOW_TIMEFIELD:
1267             case WINDOW_LONGCURRENCYFIELD:
1268             case WINDOW_NUMERICFIELD:
1269             case WINDOW_SPINFIELD:
1270                 if( pCtrl->GetStyle() & WB_SPIN )
1271                     aCtrlType = CTRL_SPINBOX;
1272                 else
1273                     aCtrlType = CTRL_EDITBOX;
1274                 break;
1275 
1276             case WINDOW_LISTBOX:
1277             case WINDOW_MULTILISTBOX:
1278             case WINDOW_TREELISTBOX:
1279                 aCtrlType = CTRL_LISTBOX;
1280                 if( pCtrl->GetStyle() & WB_DROPDOWN )
1281                     aCtrlPart = PART_ENTIRE_CONTROL;
1282                 else
1283                     aCtrlPart = PART_WINDOW;
1284                 break;
1285 
1286             case WINDOW_LISTBOXWINDOW:
1287                 aCtrlType = CTRL_LISTBOX;
1288                 aCtrlPart = PART_WINDOW;
1289                 break;
1290 
1291             case WINDOW_COMBOBOX:
1292             case WINDOW_PATTERNBOX:
1293             case WINDOW_NUMERICBOX:
1294             case WINDOW_METRICBOX:
1295             case WINDOW_CURRENCYBOX:
1296             case WINDOW_DATEBOX:
1297             case WINDOW_TIMEBOX:
1298             case WINDOW_LONGCURRENCYBOX:
1299                 if( pCtrl->GetStyle() & WB_DROPDOWN )
1300                 {
1301                     aCtrlType = CTRL_COMBOBOX;
1302                     aCtrlPart = PART_ENTIRE_CONTROL;
1303                 }
1304                 else
1305                 {
1306                     aCtrlType = CTRL_LISTBOX;
1307                     aCtrlPart = PART_WINDOW;
1308                 }
1309                 break;
1310 
1311             default:
1312                 break;
1313         }
1314     }
1315 
1316     if ( aCtrlType && pCtrl->IsNativeControlSupported(aCtrlType, aCtrlPart) )
1317     {
1318         ImplControlValue aControlValue;
1319         ControlState     nState = CTRL_STATE_ENABLED;
1320 
1321         if ( !pWin->IsEnabled() )
1322             nState &= ~CTRL_STATE_ENABLED;
1323         if ( pWin->HasFocus() )
1324             nState |= CTRL_STATE_FOCUSED;
1325         else if( mbNWFBorder )
1326         {
1327             // FIXME: this is currently only on aqua, see if other platforms can profit
1328 
1329             // FIXME: for aqua focus rings all controls need to support GetNativeControlRegion
1330             // for the dropdown style
1331             if( pCtrl->HasFocus() || pCtrl->HasChildPathFocus() )
1332                 nState |= CTRL_STATE_FOCUSED;
1333         }
1334 
1335         sal_Bool bMouseOver = sal_False;
1336         Window *pCtrlChild = pCtrl->GetWindow( WINDOW_FIRSTCHILD );
1337         while( pCtrlChild && (bMouseOver = pCtrlChild->IsMouseOver()) == sal_False )
1338             pCtrlChild = pCtrlChild->GetWindow( WINDOW_NEXT );
1339 
1340         if( bMouseOver )
1341             nState |= CTRL_STATE_ROLLOVER;
1342 
1343         Point aPoint;
1344         Rectangle aCtrlRegion( aPoint, Size( mnWidth, mnHeight ) );
1345 
1346         Rectangle aBoundingRgn( aPoint, Size( mnWidth, mnHeight ) );
1347         Rectangle aContentRgn( aCtrlRegion );
1348         if( ! ImplGetSVData()->maNWFData.mbCanDrawWidgetAnySize &&
1349             pWin->GetNativeControlRegion( aCtrlType, aCtrlPart, aCtrlRegion,
1350                                           nState, aControlValue, rtl::OUString(),
1351                                           aBoundingRgn, aContentRgn ))
1352         {
1353             aCtrlRegion=aContentRgn;
1354         }
1355 
1356         bNativeOK = pWin->DrawNativeControl( aCtrlType, aCtrlPart, aCtrlRegion, nState,
1357                 aControlValue, rtl::OUString() );
1358 
1359         // if the native theme draws the spinbuttons in one call, make sure the proper settings
1360         // are passed, this might force a redraw though.... (TODO: improve)
1361         if ( (aCtrlType == CTRL_SPINBOX) && !pCtrl->IsNativeControlSupported( CTRL_SPINBOX, PART_BUTTON_UP ) )
1362         {
1363             Edit *pEdit = ((Edit*) pCtrl)->GetSubEdit();
1364             if ( pEdit )
1365                 pCtrl->Paint( Rectangle() ); // make sure the buttons are also drawn as they might overwrite the border
1366         }
1367     }
1368 
1369 	if( bNativeOK )
1370 		return;
1371 
1372 	if ( nDrawFlags & BORDERWINDOW_DRAW_FRAME )
1373 	{
1374 		if ( nBorderStyle & WINDOW_BORDER_ACTIVE )
1375 		{
1376 			Color aColor = mpOutDev->GetSettings().GetStyleSettings().GetHighlightColor();
1377 			mpOutDev->SetLineColor();
1378 			mpOutDev->SetFillColor( aColor );
1379 			mpOutDev->DrawRect( Rectangle( 0, 0, mnWidth-1, mnTopBorder ) );
1380 			mpOutDev->DrawRect( Rectangle( 0, mnHeight-mnBottomBorder, mnWidth-1, mnHeight-1 ) );
1381 			mpOutDev->DrawRect( Rectangle( 0, 0, mnLeftBorder, mnHeight-1 ) );
1382 			mpOutDev->DrawRect( Rectangle( mnWidth-mnRightBorder, 0, mnWidth-1, mnHeight-1 ) );
1383 		}
1384 		else
1385 		{
1386 			sal_uInt16 nStyle = 0;
1387 			// Wenn Border umgesetzt wurde oder BorderWindow ein Frame-Fenster
1388 			// ist, dann Border nach aussen
1389 			if ( (nBorderStyle & WINDOW_BORDER_DOUBLEOUT) || mpBorderWindow->mbSmallOutBorder )
1390 				nStyle |= FRAME_DRAW_DOUBLEOUT;
1391 			else
1392 				nStyle |= FRAME_DRAW_DOUBLEIN;
1393 			if ( nBorderStyle & WINDOW_BORDER_MONO )
1394 				nStyle |= FRAME_DRAW_MONO;
1395 			if ( nBorderStyle & WINDOW_BORDER_MENU )
1396 				nStyle |= FRAME_DRAW_MENU;
1397 			// tell DrawFrame that we're drawing a window border of a frame window to avoid round corners
1398 			if( pWin && pWin == pWin->ImplGetFrameWindow() )
1399 				nStyle |= FRAME_DRAW_WINDOWBORDER;
1400 
1401 			DecorationView	aDecoView( mpOutDev );
1402 			Point			aTmpPoint;
1403 			Rectangle		aInRect( aTmpPoint, Size( mnWidth, mnHeight ) );
1404 			aDecoView.DrawFrame( aInRect, nStyle );
1405 		}
1406 	}
1407 }
1408 
1409 // =======================================================================
1410 
1411 // ---------------------------
1412 // - ImplStdBorderWindowView -
1413 // ---------------------------
1414 
ImplStdBorderWindowView(ImplBorderWindow * pBorderWindow)1415 ImplStdBorderWindowView::ImplStdBorderWindowView( ImplBorderWindow* pBorderWindow )
1416 {
1417 	maFrameData.mpBorderWindow	= pBorderWindow;
1418 	maFrameData.mbDragFull		= sal_False;
1419 	maFrameData.mnHitTest		= 0;
1420 	maFrameData.mnPinState		= 0;
1421 	maFrameData.mnCloseState	= 0;
1422 	maFrameData.mnRollState 	= 0;
1423 	maFrameData.mnDockState 	= 0;
1424 	maFrameData.mnMenuState 	= 0;
1425 	maFrameData.mnHideState 	= 0;
1426 	maFrameData.mnHelpState 	= 0;
1427 	maFrameData.mbTitleClipped 	= 0;
1428 
1429 	mpATitleVirDev				= NULL;
1430 	mpDTitleVirDev				= NULL;
1431 }
1432 
1433 // -----------------------------------------------------------------------
1434 
~ImplStdBorderWindowView()1435 ImplStdBorderWindowView::~ImplStdBorderWindowView()
1436 {
1437 	if ( mpATitleVirDev )
1438 		delete mpATitleVirDev;
1439 	if ( mpDTitleVirDev )
1440 		delete mpDTitleVirDev;
1441 }
1442 
1443 // -----------------------------------------------------------------------
1444 
MouseMove(const MouseEvent & rMEvt)1445 sal_Bool ImplStdBorderWindowView::MouseMove( const MouseEvent& rMEvt )
1446 {
1447 	return ImplMouseMove( &maFrameData, rMEvt );
1448 }
1449 
1450 // -----------------------------------------------------------------------
1451 
MouseButtonDown(const MouseEvent & rMEvt)1452 sal_Bool ImplStdBorderWindowView::MouseButtonDown( const MouseEvent& rMEvt )
1453 {
1454 	return ImplMouseButtonDown( &maFrameData, rMEvt );
1455 }
1456 
1457 // -----------------------------------------------------------------------
1458 
Tracking(const TrackingEvent & rTEvt)1459 sal_Bool ImplStdBorderWindowView::Tracking( const TrackingEvent& rTEvt )
1460 {
1461 	return ImplTracking( &maFrameData, rTEvt );
1462 }
1463 
1464 // -----------------------------------------------------------------------
1465 
RequestHelp(const Point & rPos,Rectangle & rHelpRect)1466 String ImplStdBorderWindowView::RequestHelp( const Point& rPos, Rectangle& rHelpRect )
1467 {
1468 	return ImplRequestHelp( &maFrameData, rPos, rHelpRect );
1469 }
1470 
1471 // -----------------------------------------------------------------------
1472 
GetMenuRect() const1473 Rectangle ImplStdBorderWindowView::GetMenuRect() const
1474 {
1475 	return maFrameData.maMenuRect;
1476 }
1477 
1478 // -----------------------------------------------------------------------
1479 
Init(OutputDevice * pDev,long nWidth,long nHeight)1480 void ImplStdBorderWindowView::Init( OutputDevice* pDev, long nWidth, long nHeight )
1481 {
1482 	ImplBorderFrameData*	pData = &maFrameData;
1483 	ImplBorderWindow*		pBorderWindow = maFrameData.mpBorderWindow;
1484 	const StyleSettings&	rStyleSettings = pDev->GetSettings().GetStyleSettings();
1485 	DecorationView			aDecoView( pDev );
1486 	Rectangle				aRect( 0, 0, 10, 10 );
1487 	Rectangle				aCalcRect = aDecoView.DrawFrame( aRect, FRAME_DRAW_DOUBLEOUT | FRAME_DRAW_NODRAW );
1488 
1489 	pData->mpOutDev 		= pDev;
1490 	pData->mnWidth			= nWidth;
1491 	pData->mnHeight 		= nHeight;
1492 
1493 	pData->mnTitleType		= pBorderWindow->mnTitleType;
1494 	pData->mbFloatWindow	= pBorderWindow->mbFloatWindow;
1495 
1496 	if ( !(pBorderWindow->GetStyle() & WB_MOVEABLE) || (pData->mnTitleType == BORDERWINDOW_TITLE_NONE) )
1497 		pData->mnBorderSize = 0;
1498 	else if ( pData->mnTitleType == BORDERWINDOW_TITLE_TEAROFF )
1499 		pData->mnBorderSize = 0;
1500 	else
1501 		pData->mnBorderSize = rStyleSettings.GetBorderSize();
1502 	pData->mnLeftBorder 	= aCalcRect.Left();
1503 	pData->mnTopBorder		= aCalcRect.Top();
1504 	pData->mnRightBorder	= aRect.Right()-aCalcRect.Right();
1505 	pData->mnBottomBorder	= aRect.Bottom()-aCalcRect.Bottom();
1506 	pData->mnLeftBorder    += pData->mnBorderSize;
1507 	pData->mnTopBorder	   += pData->mnBorderSize;
1508 	pData->mnRightBorder   += pData->mnBorderSize;
1509 	pData->mnBottomBorder  += pData->mnBorderSize;
1510 	pData->mnNoTitleTop 	= pData->mnTopBorder;
1511 
1512 	ImplInitTitle( &maFrameData );
1513 	if ( pData->mnTitleHeight )
1514 	{
1515 		// to improve symbol display force a minimum title height
1516 		if( pData->mnTitleHeight < MIN_CAPTION_HEIGHT )
1517 			pData->mnTitleHeight = MIN_CAPTION_HEIGHT;
1518 
1519 		// set a proper background for drawing
1520 		// highlighted buttons in the title
1521 		pBorderWindow->SetBackground( rStyleSettings.GetWindowColor() );
1522 
1523 		pData->maTitleRect.Left()	 = pData->mnLeftBorder;
1524 		pData->maTitleRect.Right()	 = nWidth-pData->mnRightBorder-1;
1525 		pData->maTitleRect.Top()	 = pData->mnTopBorder;
1526 		pData->maTitleRect.Bottom()  = pData->maTitleRect.Top()+pData->mnTitleHeight-1;
1527 
1528 		if ( pData->mnTitleType & (BORDERWINDOW_TITLE_NORMAL | BORDERWINDOW_TITLE_SMALL) )
1529 		{
1530 			long nLeft			= pData->maTitleRect.Left();
1531 			long nRight 		= pData->maTitleRect.Right();
1532 			long nItemTop		= pData->maTitleRect.Top();
1533 			long nItemBottom	= pData->maTitleRect.Bottom();
1534 			nLeft			   += 1;
1535 			nRight			   -= 3;
1536 			nItemTop		   += 2;
1537 			nItemBottom 	   -= 2;
1538 
1539 			if ( pBorderWindow->GetStyle() & WB_PINABLE )
1540 			{
1541 				Image aImage;
1542 				ImplGetPinImage( 0, 0, aImage );
1543 				pData->maPinRect.Top()	  = nItemTop;
1544 				pData->maPinRect.Bottom() = nItemBottom;
1545 				pData->maPinRect.Left()   = nLeft;
1546 				pData->maPinRect.Right()  = pData->maPinRect.Left()+aImage.GetSizePixel().Width();
1547 				nLeft += pData->maPinRect.GetWidth()+3;
1548 			}
1549 
1550 			if ( pBorderWindow->GetStyle() & WB_CLOSEABLE )
1551 			{
1552 				pData->maCloseRect.Top()	= nItemTop;
1553 				pData->maCloseRect.Bottom() = nItemBottom;
1554 				pData->maCloseRect.Right()	= nRight;
1555 				pData->maCloseRect.Left()	= pData->maCloseRect.Right()-pData->maCloseRect.GetHeight()+1;
1556 				nRight -= pData->maCloseRect.GetWidth()+3;
1557 			}
1558 
1559 			if ( pBorderWindow->mbMenuBtn )
1560 			{
1561 				pData->maMenuRect.Top()    = nItemTop;
1562 				pData->maMenuRect.Bottom() = nItemBottom;
1563 				pData->maMenuRect.Right()  = nRight;
1564 				pData->maMenuRect.Left()   = pData->maMenuRect.Right()-pData->maMenuRect.GetHeight()+1;
1565 				nRight -= pData->maMenuRect.GetWidth();
1566 			}
1567 
1568 			if ( pBorderWindow->mbDockBtn )
1569 			{
1570 				pData->maDockRect.Top()    = nItemTop;
1571 				pData->maDockRect.Bottom() = nItemBottom;
1572 				pData->maDockRect.Right()  = nRight;
1573 				pData->maDockRect.Left()   = pData->maDockRect.Right()-pData->maDockRect.GetHeight()+1;
1574 				nRight -= pData->maDockRect.GetWidth();
1575 				if ( !pBorderWindow->mbHideBtn &&
1576 					 !(pBorderWindow->GetStyle() & WB_ROLLABLE) )
1577 					nRight -= 3;
1578 			}
1579 
1580 			if ( pBorderWindow->mbHideBtn )
1581 			{
1582 				pData->maHideRect.Top()    = nItemTop;
1583 				pData->maHideRect.Bottom() = nItemBottom;
1584 				pData->maHideRect.Right()  = nRight;
1585 				pData->maHideRect.Left()   = pData->maHideRect.Right()-pData->maHideRect.GetHeight()+1;
1586 				nRight -= pData->maHideRect.GetWidth();
1587 				if ( !(pBorderWindow->GetStyle() & WB_ROLLABLE) )
1588 					nRight -= 3;
1589 			}
1590 
1591 			if ( pBorderWindow->GetStyle() & WB_ROLLABLE )
1592 			{
1593 				pData->maRollRect.Top()    = nItemTop;
1594 				pData->maRollRect.Bottom() = nItemBottom;
1595 				pData->maRollRect.Right()  = nRight;
1596 				pData->maRollRect.Left()   = pData->maRollRect.Right()-pData->maRollRect.GetHeight()+1;
1597 				nRight -= pData->maRollRect.GetWidth();
1598 			}
1599 
1600 			if ( pBorderWindow->mbHelpBtn )
1601 			{
1602 				pData->maHelpRect.Top()    = nItemTop;
1603 				pData->maHelpRect.Bottom() = nItemBottom;
1604 				pData->maHelpRect.Right()  = nRight;
1605 				pData->maHelpRect.Left()   = pData->maHelpRect.Right()-pData->maHelpRect.GetHeight()+1;
1606 				nRight -= pData->maHelpRect.GetWidth()+3;
1607 			}
1608 		}
1609 		else
1610 		{
1611 			pData->maPinRect.SetEmpty();
1612 			pData->maCloseRect.SetEmpty();
1613 			pData->maDockRect.SetEmpty();
1614 			pData->maMenuRect.SetEmpty();
1615 			pData->maHideRect.SetEmpty();
1616 			pData->maRollRect.SetEmpty();
1617 			pData->maHelpRect.SetEmpty();
1618 		}
1619 
1620 		pData->mnTopBorder	+= pData->mnTitleHeight;
1621 	}
1622 	else
1623 	{
1624 		pData->maTitleRect.SetEmpty();
1625 		pData->maPinRect.SetEmpty();
1626 		pData->maCloseRect.SetEmpty();
1627 		pData->maDockRect.SetEmpty();
1628 		pData->maMenuRect.SetEmpty();
1629 		pData->maHideRect.SetEmpty();
1630 		pData->maRollRect.SetEmpty();
1631 		pData->maHelpRect.SetEmpty();
1632 	}
1633 }
1634 
1635 // -----------------------------------------------------------------------
1636 
GetBorder(sal_Int32 & rLeftBorder,sal_Int32 & rTopBorder,sal_Int32 & rRightBorder,sal_Int32 & rBottomBorder) const1637 void ImplStdBorderWindowView::GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
1638 										 sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const
1639 {
1640 	rLeftBorder 	= maFrameData.mnLeftBorder;
1641 	rTopBorder		= maFrameData.mnTopBorder;
1642 	rRightBorder	= maFrameData.mnRightBorder;
1643 	rBottomBorder	= maFrameData.mnBottomBorder;
1644 }
1645 
1646 // -----------------------------------------------------------------------
1647 
CalcTitleWidth() const1648 long ImplStdBorderWindowView::CalcTitleWidth() const
1649 {
1650 	return ImplCalcTitleWidth( &maFrameData );
1651 }
1652 
1653 // -----------------------------------------------------------------------
1654 
DrawWindow(sal_uInt16 nDrawFlags,OutputDevice * pOutDev,const Point * pOffset)1655 void ImplStdBorderWindowView::DrawWindow( sal_uInt16 nDrawFlags, OutputDevice* pOutDev, const Point* pOffset )
1656 {
1657 	ImplBorderFrameData*	pData = &maFrameData;
1658 	OutputDevice*			pDev = pOutDev ? pOutDev : pData->mpOutDev;
1659 	ImplBorderWindow*		pBorderWindow = pData->mpBorderWindow;
1660 	Point					aTmpPoint = pOffset ? Point(*pOffset) : Point();
1661 	Rectangle				aInRect( aTmpPoint, Size( pData->mnWidth, pData->mnHeight ) );
1662 	const StyleSettings&	rStyleSettings = pData->mpOutDev->GetSettings().GetStyleSettings();
1663 	DecorationView			aDecoView( pDev );
1664 	Color					aFrameColor( rStyleSettings.GetFaceColor() );
1665 
1666 	aFrameColor.DecreaseContrast( (sal_uInt8) (0.50 * 255));
1667 
1668 	// Draw Frame
1669 	if ( nDrawFlags & BORDERWINDOW_DRAW_FRAME )
1670 	{
1671 		// single line frame
1672 		pDev->SetLineColor( aFrameColor );
1673 		pDev->SetFillColor();
1674 		pDev->DrawRect( aInRect );
1675 		aInRect.nLeft++; aInRect.nRight--;
1676 		aInRect.nTop++; aInRect.nBottom--;
1677 	}
1678 	else
1679 		aInRect = aDecoView.DrawFrame( aInRect, FRAME_DRAW_DOUBLEOUT | FRAME_DRAW_NODRAW);
1680 
1681 	// Draw Border
1682 	pDev->SetLineColor();
1683 	long nBorderSize = pData->mnBorderSize;
1684 	if ( (nDrawFlags & BORDERWINDOW_DRAW_BORDER) && nBorderSize )
1685 	{
1686 		pDev->SetFillColor( rStyleSettings.GetFaceColor() );
1687 		pDev->DrawRect( Rectangle( Point( aInRect.Left(), aInRect.Top() ),
1688 								   Size( aInRect.GetWidth(), nBorderSize ) ) );
1689 		pDev->DrawRect( Rectangle( Point( aInRect.Left(), aInRect.Top()+nBorderSize ),
1690 								   Size( nBorderSize, aInRect.GetHeight()-nBorderSize ) ) );
1691 		pDev->DrawRect( Rectangle( Point( aInRect.Left(), aInRect.Bottom()-nBorderSize+1 ),
1692 								   Size( aInRect.GetWidth(), nBorderSize ) ) );
1693 		pDev->DrawRect( Rectangle( Point( aInRect.Right()-nBorderSize+1, aInRect.Top()+nBorderSize ),
1694 								   Size( nBorderSize, aInRect.GetHeight()-nBorderSize ) ) );
1695 	}
1696 
1697 	// Draw Title
1698 	if ( (nDrawFlags & BORDERWINDOW_DRAW_TITLE) && !pData->maTitleRect.IsEmpty() )
1699 	{
1700 		aInRect = pData->maTitleRect;
1701 
1702 		// use no gradient anymore, just a static titlecolor
1703 		pDev->SetFillColor( aFrameColor );
1704 		pDev->SetTextColor( rStyleSettings.GetButtonTextColor() );
1705 		Rectangle aTitleRect( pData->maTitleRect );
1706 		if( pOffset )
1707 			aTitleRect.Move( pOffset->X(), pOffset->Y() );
1708 		pDev->DrawRect( aTitleRect );
1709 
1710 
1711 		if ( pData->mnTitleType != BORDERWINDOW_TITLE_TEAROFF )
1712 		{
1713 			aInRect.Left()	+= 2;
1714 			aInRect.Right() -= 2;
1715 
1716 			if ( !pData->maPinRect.IsEmpty() )
1717 				aInRect.Left() = pData->maPinRect.Right()+2;
1718 
1719 			if ( !pData->maHelpRect.IsEmpty() )
1720 				aInRect.Right() = pData->maHelpRect.Left()-2;
1721 			else if ( !pData->maRollRect.IsEmpty() )
1722 				aInRect.Right() = pData->maRollRect.Left()-2;
1723 			else if ( !pData->maHideRect.IsEmpty() )
1724 				aInRect.Right() = pData->maHideRect.Left()-2;
1725 			else if ( !pData->maDockRect.IsEmpty() )
1726 				aInRect.Right() = pData->maDockRect.Left()-2;
1727 			else if ( !pData->maMenuRect.IsEmpty() )
1728 				aInRect.Right() = pData->maMenuRect.Left()-2;
1729 			else if ( !pData->maCloseRect.IsEmpty() )
1730 				aInRect.Right() = pData->maCloseRect.Left()-2;
1731 
1732 			if ( pOffset )
1733 				aInRect.Move( pOffset->X(), pOffset->Y() );
1734 
1735 			sal_uInt16 nTextStyle = TEXT_DRAW_LEFT | TEXT_DRAW_VCENTER | TEXT_DRAW_ENDELLIPSIS | TEXT_DRAW_CLIP;
1736 
1737 			// must show tooltip ?
1738 			TextRectInfo aInfo;
1739 			pDev->GetTextRect( aInRect, pBorderWindow->GetText(), nTextStyle, &aInfo );
1740 			pData->mbTitleClipped = aInfo.IsEllipses();
1741 
1742 			pDev->DrawText( aInRect, pBorderWindow->GetText(), nTextStyle );
1743 		}
1744 	}
1745 
1746 	if ( ((nDrawFlags & BORDERWINDOW_DRAW_CLOSE) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE)) &&
1747 		 !pData->maCloseRect.IsEmpty() )
1748 	{
1749 		Rectangle aSymbolRect( pData->maCloseRect );
1750 		if ( pOffset )
1751 			aSymbolRect.Move( pOffset->X(), pOffset->Y() );
1752 		ImplDrawBrdWinSymbolButton( pDev, aSymbolRect, SYMBOL_CLOSE, pData->mnCloseState );
1753 	}
1754 	if ( ((nDrawFlags & BORDERWINDOW_DRAW_DOCK) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE)) &&
1755 		 !pData->maDockRect.IsEmpty() )
1756 	{
1757 		Rectangle aSymbolRect( pData->maDockRect );
1758 		if ( pOffset )
1759 			aSymbolRect.Move( pOffset->X(), pOffset->Y() );
1760 		ImplDrawBrdWinSymbolButton( pDev, aSymbolRect, SYMBOL_DOCK, pData->mnDockState );
1761 	}
1762 	if ( ((nDrawFlags & BORDERWINDOW_DRAW_MENU) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE)) &&
1763 		 !pData->maMenuRect.IsEmpty() )
1764 	{
1765 		Rectangle aSymbolRect( pData->maMenuRect );
1766 		if ( pOffset )
1767 			aSymbolRect.Move( pOffset->X(), pOffset->Y() );
1768 		ImplDrawBrdWinSymbolButton( pDev, aSymbolRect, SYMBOL_MENU, pData->mnMenuState );
1769 	}
1770 	if ( ((nDrawFlags & BORDERWINDOW_DRAW_HIDE) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE)) &&
1771 		 !pData->maHideRect.IsEmpty() )
1772 	{
1773 		Rectangle aSymbolRect( pData->maHideRect );
1774 		if ( pOffset )
1775 			aSymbolRect.Move( pOffset->X(), pOffset->Y() );
1776 		ImplDrawBrdWinSymbolButton( pDev, aSymbolRect, SYMBOL_HIDE, pData->mnHideState );
1777 	}
1778 	if ( ((nDrawFlags & BORDERWINDOW_DRAW_ROLL) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE)) &&
1779 		 !pData->maRollRect.IsEmpty() )
1780 	{
1781 		SymbolType eType;
1782 		if ( pBorderWindow->mbRollUp )
1783 			eType = SYMBOL_ROLLDOWN;
1784 		else
1785 			eType = SYMBOL_ROLLUP;
1786 		Rectangle aSymbolRect( pData->maRollRect );
1787 		if ( pOffset )
1788 			aSymbolRect.Move( pOffset->X(), pOffset->Y() );
1789 		ImplDrawBrdWinSymbolButton( pDev, aSymbolRect, eType, pData->mnRollState );
1790 	}
1791 
1792 	if ( ((nDrawFlags & BORDERWINDOW_DRAW_HELP) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE)) &&
1793 		 !pData->maHelpRect.IsEmpty() )
1794 	{
1795 		Rectangle aSymbolRect( pData->maHelpRect );
1796 		if ( pOffset )
1797 			aSymbolRect.Move( pOffset->X(), pOffset->Y() );
1798 		ImplDrawBrdWinSymbolButton( pDev, aSymbolRect, SYMBOL_HELP, pData->mnHelpState );
1799 	}
1800 	if ( ((nDrawFlags & BORDERWINDOW_DRAW_PIN) || (nDrawFlags & BORDERWINDOW_DRAW_TITLE)) &&
1801 		 !pData->maPinRect.IsEmpty() )
1802 	{
1803 		Image aImage;
1804 		ImplGetPinImage( pData->mnPinState, pBorderWindow->mbPined, aImage );
1805 		Size  aImageSize = aImage.GetSizePixel();
1806 		long  nRectHeight = pData->maPinRect.GetHeight();
1807 		Point aPos( pData->maPinRect.TopLeft() );
1808 		if ( pOffset )
1809 			aPos.Move( pOffset->X(), pOffset->Y() );
1810 		if ( nRectHeight < aImageSize.Height() )
1811 		{
1812 			pDev->DrawImage( aPos, Size( aImageSize.Width(), nRectHeight ), aImage );
1813 		}
1814 		else
1815 		{
1816 			aPos.Y() += (nRectHeight-aImageSize.Height())/2;
1817 			pDev->DrawImage( aPos, aImage );
1818 		}
1819 	}
1820 }
1821 
1822 
1823 // =======================================================================
ImplInit(Window * pParent,WinBits nStyle,sal_uInt16 nTypeStyle,const::com::sun::star::uno::Any &)1824 void ImplBorderWindow::ImplInit( Window* pParent,
1825 								 WinBits nStyle, sal_uInt16 nTypeStyle,
1826 								 const ::com::sun::star::uno::Any& )
1827 {
1828 	ImplInit( pParent, nStyle, nTypeStyle, NULL );
1829 }
1830 
ImplInit(Window * pParent,WinBits nStyle,sal_uInt16 nTypeStyle,SystemParentData * pSystemParentData)1831 void ImplBorderWindow::ImplInit( Window* pParent,
1832 								 WinBits nStyle, sal_uInt16 nTypeStyle,
1833 								 SystemParentData* pSystemParentData
1834 								 )
1835 {
1836 	// Alle WindowBits entfernen, die wir nicht haben wollen
1837 	WinBits nOrgStyle = nStyle;
1838 	WinBits nTestStyle = (WB_MOVEABLE | WB_SIZEABLE | WB_ROLLABLE | WB_PINABLE | WB_CLOSEABLE | WB_STANDALONE | WB_DIALOGCONTROL | WB_NODIALOGCONTROL | WB_SYSTEMFLOATWIN | WB_INTROWIN | WB_DEFAULTWIN | WB_TOOLTIPWIN | WB_NOSHADOW | WB_OWNERDRAWDECORATION | WB_SYSTEMCHILDWINDOW  | WB_NEEDSFOCUS);
1839 	if ( nTypeStyle & BORDERWINDOW_STYLE_APP )
1840 		nTestStyle |= WB_APP;
1841 	nStyle &= nTestStyle;
1842 
1843 	mpWindowImpl->mbBorderWin 		= sal_True;
1844 	mbSmallOutBorder	= sal_False;
1845 	if ( nTypeStyle & BORDERWINDOW_STYLE_FRAME )
1846 	{
1847         if( (nStyle & WB_SYSTEMCHILDWINDOW) )
1848         {
1849             mpWindowImpl->mbOverlapWin  = sal_True;
1850             mpWindowImpl->mbFrame       = sal_True;
1851             mbFrameBorder               = sal_False;
1852         }
1853         else if( (nStyle & WB_OWNERDRAWDECORATION) )
1854         {
1855 		    mpWindowImpl->mbOverlapWin	= sal_True;
1856 		    mpWindowImpl->mbFrame 		= sal_True;
1857 		    mbFrameBorder	= (nOrgStyle & WB_NOBORDER) ? sal_False : sal_True;
1858 		}
1859 		else
1860 		{
1861 		    mpWindowImpl->mbOverlapWin	= sal_True;
1862 		    mpWindowImpl->mbFrame 		= sal_True;
1863 		    mbFrameBorder	= sal_False;
1864             // closeable windows may have a border as well, e.g. system floating windows without caption
1865 		    if ( (nOrgStyle & (WB_BORDER | WB_NOBORDER | WB_MOVEABLE | WB_SIZEABLE/* | WB_CLOSEABLE*/)) == WB_BORDER )
1866 			    mbSmallOutBorder = sal_True;
1867 		}
1868 	}
1869 	else if ( nTypeStyle & BORDERWINDOW_STYLE_OVERLAP )
1870 	{
1871 		mpWindowImpl->mbOverlapWin	= sal_True;
1872 		mbFrameBorder	= sal_True;
1873 	}
1874 	else
1875 		mbFrameBorder	= sal_False;
1876 
1877 	if ( nTypeStyle & BORDERWINDOW_STYLE_FLOAT )
1878 		mbFloatWindow = sal_True;
1879 	else
1880 		mbFloatWindow = sal_False;
1881 
1882 	Window::ImplInit( pParent, nStyle, pSystemParentData );
1883 	SetBackground();
1884 	SetTextFillColor();
1885 
1886 	mpMenuBarWindow = NULL;
1887 	mnMinWidth		= 0;
1888 	mnMinHeight 	= 0;
1889 	mnMaxWidth		= SHRT_MAX;
1890 	mnMaxHeight 	= SHRT_MAX;
1891 	mnRollHeight	= 0;
1892 	mnOrgMenuHeight = 0;
1893 	mbPined 		= sal_False;
1894 	mbRollUp		= sal_False;
1895 	mbMenuHide		= sal_False;
1896 	mbDockBtn		= sal_False;
1897 	mbMenuBtn		= sal_False;
1898 	mbHideBtn		= sal_False;
1899 	mbHelpBtn		= sal_False;
1900 	mbDisplayActive = IsActive();
1901 
1902 	if ( nTypeStyle & BORDERWINDOW_STYLE_FLOAT )
1903 		mnTitleType = BORDERWINDOW_TITLE_SMALL;
1904 	else
1905 		mnTitleType = BORDERWINDOW_TITLE_NORMAL;
1906 	mnBorderStyle	= WINDOW_BORDER_NORMAL;
1907 	InitView();
1908 }
1909 
1910 // =======================================================================
1911 
ImplBorderWindow(Window * pParent,SystemParentData * pSystemParentData,WinBits nStyle,sal_uInt16 nTypeStyle)1912 ImplBorderWindow::ImplBorderWindow( Window* pParent,
1913 									SystemParentData* pSystemParentData,
1914 									WinBits nStyle, sal_uInt16 nTypeStyle
1915 									) :	Window( WINDOW_BORDERWINDOW )
1916 {
1917 	ImplInit( pParent, nStyle, nTypeStyle, pSystemParentData );
1918 }
1919 
1920 // -----------------------------------------------------------------------
1921 
ImplBorderWindow(Window * pParent,WinBits nStyle,sal_uInt16 nTypeStyle)1922 ImplBorderWindow::ImplBorderWindow( Window* pParent, WinBits nStyle ,
1923 									sal_uInt16 nTypeStyle ) :
1924 	Window( WINDOW_BORDERWINDOW )
1925 {
1926 	ImplInit( pParent, nStyle, nTypeStyle, ::com::sun::star::uno::Any() );
1927 }
1928 
ImplBorderWindow(Window * pParent,WinBits nStyle,sal_uInt16 nTypeStyle,const::com::sun::star::uno::Any & aSystemToken)1929 ImplBorderWindow::ImplBorderWindow( Window* pParent,
1930 									WinBits nStyle, sal_uInt16 nTypeStyle,
1931 									const ::com::sun::star::uno::Any& aSystemToken ) :
1932 	Window( WINDOW_BORDERWINDOW )
1933 {
1934 	ImplInit( pParent, nStyle, nTypeStyle, aSystemToken );
1935 }
1936 
1937 // -----------------------------------------------------------------------
1938 
~ImplBorderWindow()1939 ImplBorderWindow::~ImplBorderWindow()
1940 {
1941 	delete mpBorderView;
1942 }
1943 
1944 // -----------------------------------------------------------------------
1945 
MouseMove(const MouseEvent & rMEvt)1946 void ImplBorderWindow::MouseMove( const MouseEvent& rMEvt )
1947 {
1948 	mpBorderView->MouseMove( rMEvt );
1949 }
1950 
1951 // -----------------------------------------------------------------------
1952 
MouseButtonDown(const MouseEvent & rMEvt)1953 void ImplBorderWindow::MouseButtonDown( const MouseEvent& rMEvt )
1954 {
1955 	mpBorderView->MouseButtonDown( rMEvt );
1956 }
1957 
1958 // -----------------------------------------------------------------------
1959 
Tracking(const TrackingEvent & rTEvt)1960 void ImplBorderWindow::Tracking( const TrackingEvent& rTEvt )
1961 {
1962 	mpBorderView->Tracking( rTEvt );
1963 }
1964 
1965 // -----------------------------------------------------------------------
1966 
Paint(const Rectangle &)1967 void ImplBorderWindow::Paint( const Rectangle& )
1968 {
1969 	mpBorderView->DrawWindow( BORDERWINDOW_DRAW_ALL );
1970 }
1971 
Draw(const Rectangle &,OutputDevice * pOutDev,const Point & rPos)1972 void ImplBorderWindow::Draw( const Rectangle&, OutputDevice* pOutDev, const Point& rPos )
1973 {
1974 	mpBorderView->DrawWindow( BORDERWINDOW_DRAW_ALL, pOutDev, &rPos );
1975 }
1976 
1977 // -----------------------------------------------------------------------
1978 
Activate()1979 void ImplBorderWindow::Activate()
1980 {
1981 	SetDisplayActive( sal_True );
1982 	Window::Activate();
1983 }
1984 
1985 // -----------------------------------------------------------------------
1986 
Deactivate()1987 void ImplBorderWindow::Deactivate()
1988 {
1989 	// Fenster die immer Active sind, nehmen wir von dieser Regel aus,
1990 	// genauso, wenn ein Menu aktiv wird, ignorieren wir das Deactivate
1991 	if ( GetActivateMode() && !ImplGetSVData()->maWinData.mbNoDeactivate )
1992 		SetDisplayActive( sal_False );
1993 	Window::Deactivate();
1994 }
1995 
1996 // -----------------------------------------------------------------------
1997 
RequestHelp(const HelpEvent & rHEvt)1998 void ImplBorderWindow::RequestHelp( const HelpEvent& rHEvt )
1999 {
2000 	// no keyboard help for border win
2001 	if ( rHEvt.GetMode() & (HELPMODE_BALLOON | HELPMODE_QUICK) && !rHEvt.KeyboardActivated() )
2002 	{
2003 		Point		aMousePosPixel = ScreenToOutputPixel( rHEvt.GetMousePosPixel() );
2004 		Rectangle	aHelpRect;
2005 		String		aHelpStr( mpBorderView->RequestHelp( aMousePosPixel, aHelpRect ) );
2006 
2007 		// Rechteck ermitteln
2008 		if ( aHelpStr.Len() )
2009 		{
2010 			aHelpRect.SetPos( OutputToScreenPixel( aHelpRect.TopLeft() ) );
2011 			if ( rHEvt.GetMode() & HELPMODE_BALLOON )
2012 				Help::ShowBalloon( this, aHelpRect.Center(), aHelpRect, aHelpStr );
2013 			else
2014 				Help::ShowQuickHelp( this, aHelpRect, aHelpStr );
2015 			return;
2016 		}
2017 	}
2018 
2019 	Window::RequestHelp( rHEvt );
2020 }
2021 
2022 // -----------------------------------------------------------------------
2023 
Resize()2024 void ImplBorderWindow::Resize()
2025 {
2026 	Size aSize = GetOutputSizePixel();
2027 
2028 	if ( !mbRollUp )
2029 	{
2030 		Window* pClientWindow = ImplGetClientWindow();
2031 
2032 		if ( mpMenuBarWindow )
2033 		{
2034 			sal_Int32 nLeftBorder;
2035 			sal_Int32 nTopBorder;
2036 			sal_Int32 nRightBorder;
2037 			sal_Int32 nBottomBorder;
2038 			long nMenuHeight = mpMenuBarWindow->GetSizePixel().Height();
2039 			if ( mbMenuHide )
2040 			{
2041 				if ( nMenuHeight )
2042 					mnOrgMenuHeight = nMenuHeight;
2043 				nMenuHeight = 0;
2044 			}
2045 			else
2046 			{
2047 				if ( !nMenuHeight )
2048 					nMenuHeight = mnOrgMenuHeight;
2049 			}
2050 			mpBorderView->GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder );
2051 			mpMenuBarWindow->SetPosSizePixel( nLeftBorder,
2052 											  nTopBorder,
2053 											  aSize.Width()-nLeftBorder-nRightBorder,
2054 											  nMenuHeight,
2055 											  WINDOW_POSSIZE_POS |
2056 											  WINDOW_POSSIZE_WIDTH | WINDOW_POSSIZE_HEIGHT );
2057 		}
2058 
2059 		GetBorder( pClientWindow->mpWindowImpl->mnLeftBorder, pClientWindow->mpWindowImpl->mnTopBorder,
2060 				   pClientWindow->mpWindowImpl->mnRightBorder, pClientWindow->mpWindowImpl->mnBottomBorder );
2061 		pClientWindow->ImplPosSizeWindow( pClientWindow->mpWindowImpl->mnLeftBorder,
2062 										  pClientWindow->mpWindowImpl->mnTopBorder,
2063 										  aSize.Width()-pClientWindow->mpWindowImpl->mnLeftBorder-pClientWindow->mpWindowImpl->mnRightBorder,
2064 										  aSize.Height()-pClientWindow->mpWindowImpl->mnTopBorder-pClientWindow->mpWindowImpl->mnBottomBorder,
2065 										  WINDOW_POSSIZE_X | WINDOW_POSSIZE_Y |
2066 										  WINDOW_POSSIZE_WIDTH | WINDOW_POSSIZE_HEIGHT );
2067 	}
2068 
2069 	// UpdateView
2070 	mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2071 	InvalidateBorder();
2072 
2073 	Window::Resize();
2074 }
2075 
2076 // -----------------------------------------------------------------------
2077 
StateChanged(StateChangedType nType)2078 void ImplBorderWindow::StateChanged( StateChangedType nType )
2079 {
2080 	if ( (nType == STATE_CHANGE_TEXT) ||
2081 		 (nType == STATE_CHANGE_IMAGE) ||
2082 		 (nType == STATE_CHANGE_DATA) )
2083 	{
2084 		if ( IsReallyVisible() && mbFrameBorder )
2085 		{
2086 			if ( HasPaintEvent() )
2087 				InvalidateBorder();
2088 			else
2089 				mpBorderView->DrawWindow( BORDERWINDOW_DRAW_TITLE );
2090 		}
2091 	}
2092 
2093 	Window::StateChanged( nType );
2094 }
2095 
2096 // -----------------------------------------------------------------------
2097 
DataChanged(const DataChangedEvent & rDCEvt)2098 void ImplBorderWindow::DataChanged( const DataChangedEvent& rDCEvt )
2099 {
2100 	if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
2101 		 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
2102 		 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
2103 		  (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
2104 	{
2105 		if ( !mpWindowImpl->mbFrame || (GetStyle() & WB_OWNERDRAWDECORATION) )
2106 			UpdateView( sal_True, ImplGetWindow()->GetOutputSizePixel() );
2107 	}
2108 
2109 	Window::DataChanged( rDCEvt );
2110 }
2111 
2112 // -----------------------------------------------------------------------
2113 
InitView()2114 void ImplBorderWindow::InitView()
2115 {
2116 	if ( mbSmallOutBorder )
2117 		mpBorderView = new ImplSmallBorderWindowView( this );
2118 	else if ( mpWindowImpl->mbFrame )
2119 	{
2120 		if( mbFrameBorder )
2121 			mpBorderView = new ImplStdBorderWindowView( this );
2122 		else
2123 			mpBorderView = new ImplNoBorderWindowView( this );
2124 	}
2125 	else if ( !mbFrameBorder )
2126 		mpBorderView = new ImplSmallBorderWindowView( this );
2127 	else
2128 		mpBorderView = new ImplStdBorderWindowView( this );
2129 	Size aSize = GetOutputSizePixel();
2130 	mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2131 }
2132 
2133 // -----------------------------------------------------------------------
2134 
UpdateView(sal_Bool bNewView,const Size & rNewOutSize)2135 void ImplBorderWindow::UpdateView( sal_Bool bNewView, const Size& rNewOutSize )
2136 {
2137 	sal_Int32 nLeftBorder;
2138 	sal_Int32 nTopBorder;
2139 	sal_Int32 nRightBorder;
2140 	sal_Int32 nBottomBorder;
2141 	Size aOldSize = GetSizePixel();
2142 	Size aOutputSize = rNewOutSize;
2143 
2144 	if ( bNewView )
2145 	{
2146 		delete mpBorderView;
2147 		InitView();
2148 	}
2149 	else
2150 	{
2151 		Size aSize = aOutputSize;
2152 		mpBorderView->GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder );
2153 		aSize.Width()  += nLeftBorder+nRightBorder;
2154 		aSize.Height() += nTopBorder+nBottomBorder;
2155 		mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2156 	}
2157 
2158 	Window* pClientWindow = ImplGetClientWindow();
2159 	if ( pClientWindow )
2160 	{
2161 		GetBorder( pClientWindow->mpWindowImpl->mnLeftBorder, pClientWindow->mpWindowImpl->mnTopBorder,
2162 				   pClientWindow->mpWindowImpl->mnRightBorder, pClientWindow->mpWindowImpl->mnBottomBorder );
2163 	}
2164 	GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder );
2165 	if ( aOldSize.Width() || aOldSize.Height() )
2166 	{
2167 		aOutputSize.Width() 	+= nLeftBorder+nRightBorder;
2168 		aOutputSize.Height()	+= nTopBorder+nBottomBorder;
2169 		if ( aOutputSize == GetSizePixel() )
2170 			InvalidateBorder();
2171 		else
2172 			SetSizePixel( aOutputSize );
2173 	}
2174 }
2175 
2176 // -----------------------------------------------------------------------
2177 
InvalidateBorder()2178 void ImplBorderWindow::InvalidateBorder()
2179 {
2180 	if ( IsReallyVisible() )
2181 	{
2182 		// Nur wenn wir einen Border haben, muessen wir auch invalidieren
2183 		sal_Int32 nLeftBorder;
2184 		sal_Int32 nTopBorder;
2185 		sal_Int32 nRightBorder;
2186 		sal_Int32 nBottomBorder;
2187 		mpBorderView->GetBorder( nLeftBorder, nTopBorder, nRightBorder, nBottomBorder );
2188 		if ( nLeftBorder || nTopBorder || nRightBorder || nBottomBorder )
2189 		{
2190 			Rectangle	aWinRect( Point( 0, 0 ), GetOutputSizePixel() );
2191 			Region		aRegion( aWinRect );
2192 			aWinRect.Left()   += nLeftBorder;
2193 			aWinRect.Top()	  += nTopBorder;
2194 			aWinRect.Right()  -= nRightBorder;
2195 			aWinRect.Bottom() -= nBottomBorder;
2196 			// kein Output-Bereich mehr, dann alles invalidieren
2197 			if ( (aWinRect.Right() < aWinRect.Left()) ||
2198 				 (aWinRect.Bottom() < aWinRect.Top()) )
2199 				Invalidate( INVALIDATE_NOCHILDREN );
2200 			else
2201 			{
2202 				aRegion.Exclude( aWinRect );
2203 				Invalidate( aRegion, INVALIDATE_NOCHILDREN );
2204 			}
2205 		}
2206 	}
2207 }
2208 
2209 // -----------------------------------------------------------------------
2210 
SetDisplayActive(sal_Bool bActive)2211 void ImplBorderWindow::SetDisplayActive( sal_Bool bActive )
2212 {
2213 	if ( mbDisplayActive != bActive )
2214 	{
2215 		mbDisplayActive = bActive;
2216 		if ( mbFrameBorder )
2217 			InvalidateBorder();
2218 	}
2219 }
2220 
2221 // -----------------------------------------------------------------------
2222 
SetTitleType(sal_uInt16 nTitleType,const Size & rSize)2223 void ImplBorderWindow::SetTitleType( sal_uInt16 nTitleType, const Size& rSize )
2224 {
2225 	mnTitleType = nTitleType;
2226 	UpdateView( sal_False, rSize );
2227 }
2228 
2229 // -----------------------------------------------------------------------
2230 
SetBorderStyle(sal_uInt16 nStyle)2231 void ImplBorderWindow::SetBorderStyle( sal_uInt16 nStyle )
2232 {
2233 	if ( !mbFrameBorder && (mnBorderStyle != nStyle) )
2234 	{
2235 		mnBorderStyle = nStyle;
2236 		UpdateView( sal_False, ImplGetWindow()->GetOutputSizePixel() );
2237 	}
2238 }
2239 
2240 // -----------------------------------------------------------------------
2241 
SetPin(sal_Bool bPin)2242 void ImplBorderWindow::SetPin( sal_Bool bPin )
2243 {
2244 	mbPined = bPin;
2245 	InvalidateBorder();
2246 }
2247 
2248 // -----------------------------------------------------------------------
2249 
SetRollUp(sal_Bool bRollUp,const Size & rSize)2250 void ImplBorderWindow::SetRollUp( sal_Bool bRollUp, const Size& rSize )
2251 {
2252 	mbRollUp = bRollUp;
2253 	mnRollHeight = rSize.Height();
2254 	UpdateView( sal_False, rSize );
2255 }
2256 
2257 // -----------------------------------------------------------------------
2258 
SetCloser()2259 void ImplBorderWindow::SetCloser()
2260 {
2261 	SetStyle( GetStyle() | WB_CLOSEABLE );
2262 	Size aSize = GetOutputSizePixel();
2263 	mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2264 	InvalidateBorder();
2265 }
2266 
2267 // -----------------------------------------------------------------------
2268 
SetDockButton(sal_Bool bDockButton)2269 void ImplBorderWindow::SetDockButton( sal_Bool bDockButton )
2270 {
2271 	mbDockBtn = bDockButton;
2272 	Size aSize = GetOutputSizePixel();
2273 	mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2274 	InvalidateBorder();
2275 }
2276 
2277 // -----------------------------------------------------------------------
2278 
SetHideButton(sal_Bool bHideButton)2279 void ImplBorderWindow::SetHideButton( sal_Bool bHideButton )
2280 {
2281 	mbHideBtn = bHideButton;
2282 	Size aSize = GetOutputSizePixel();
2283 	mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2284 	InvalidateBorder();
2285 }
2286 
2287 // -----------------------------------------------------------------------
2288 
SetHelpButton(sal_Bool bHelpButton)2289 void ImplBorderWindow::SetHelpButton( sal_Bool bHelpButton )
2290 {
2291 	mbHelpBtn = bHelpButton;
2292 	Size aSize = GetOutputSizePixel();
2293 	mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2294 	InvalidateBorder();
2295 }
2296 
2297 // -----------------------------------------------------------------------
2298 
SetMenuButton(sal_Bool bMenuButton)2299 void ImplBorderWindow::SetMenuButton( sal_Bool bMenuButton )
2300 {
2301 	mbMenuBtn = bMenuButton;
2302 	Size aSize = GetOutputSizePixel();
2303 	mpBorderView->Init( this, aSize.Width(), aSize.Height() );
2304 	InvalidateBorder();
2305 }
2306 
2307 // -----------------------------------------------------------------------
2308 
UpdateMenuHeight()2309 void ImplBorderWindow::UpdateMenuHeight()
2310 {
2311 	Resize();
2312 }
2313 
2314 // -----------------------------------------------------------------------
2315 
SetMenuBarWindow(Window * pWindow)2316 void ImplBorderWindow::SetMenuBarWindow( Window* pWindow )
2317 {
2318 	mpMenuBarWindow = pWindow;
2319 	UpdateMenuHeight();
2320 	if ( pWindow )
2321 		pWindow->Show();
2322 }
2323 
2324 // -----------------------------------------------------------------------
2325 
SetMenuBarMode(sal_Bool bHide)2326 void ImplBorderWindow::SetMenuBarMode( sal_Bool bHide )
2327 {
2328 	mbMenuHide = bHide;
2329 	UpdateMenuHeight();
2330 }
2331 
2332 // -----------------------------------------------------------------------
2333 
GetBorder(sal_Int32 & rLeftBorder,sal_Int32 & rTopBorder,sal_Int32 & rRightBorder,sal_Int32 & rBottomBorder) const2334 void ImplBorderWindow::GetBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
2335 								  sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const
2336 {
2337 	mpBorderView->GetBorder( rLeftBorder, rTopBorder, rRightBorder, rBottomBorder );
2338 	if ( mpMenuBarWindow && !mbMenuHide )
2339 		rTopBorder += mpMenuBarWindow->GetSizePixel().Height();
2340 }
2341 
2342 // -----------------------------------------------------------------------
2343 
CalcTitleWidth() const2344 long ImplBorderWindow::CalcTitleWidth() const
2345 {
2346 	return mpBorderView->CalcTitleWidth();
2347 }
2348 
GetMenuRect() const2349 Rectangle ImplBorderWindow::GetMenuRect() const
2350 {
2351 	return mpBorderView->GetMenuRect();
2352 }
2353