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