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