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