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