xref: /AOO41X/main/vcl/source/control/fixbrd.cxx (revision b5a0981c18a8c7b3cbca7c3f50a55733b4b936bc)
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 #ifndef _SV_RC_H
28 #include <tools/rc.h>
29 #endif
30 #include <vcl/event.hxx>
31 #include <vcl/fixbrd.hxx>
32 
33 
34 
35 // =======================================================================
36 
ImplInit(Window * pParent,WinBits nStyle)37 void FixedBorder::ImplInit( Window* pParent, WinBits nStyle )
38 {
39     mnType          = FIXEDBORDER_TYPE_GROUP;
40     mbTransparent   = sal_True;
41 
42     nStyle = ImplInitStyle( nStyle );
43     Control::ImplInit( pParent, nStyle, NULL );
44     ImplInitSettings();
45 }
46 
47 // -----------------------------------------------------------------------
48 
ImplInitStyle(WinBits nStyle)49 WinBits FixedBorder::ImplInitStyle( WinBits nStyle )
50 {
51     if ( !(nStyle & WB_NOGROUP) )
52         nStyle |= WB_GROUP;
53     return nStyle;
54 }
55 
56 // -----------------------------------------------------------------------
57 
ImplInitSettings()58 void FixedBorder::ImplInitSettings()
59 {
60     Window* pParent = GetParent();
61     if ( (pParent->IsChildTransparentModeEnabled() ||
62         !(pParent->GetStyle() & WB_CLIPCHILDREN) ) &&
63         !IsControlBackground() && mbTransparent )
64     {
65         SetMouseTransparent( sal_True );
66         EnableChildTransparentMode( sal_True );
67         SetParentClipMode( PARENTCLIPMODE_NOCLIP );
68         SetPaintTransparent( sal_True );
69         SetBackground();
70     }
71     else
72     {
73         SetMouseTransparent( sal_False );
74         EnableChildTransparentMode( sal_False );
75         SetParentClipMode( 0 );
76         SetPaintTransparent( sal_False );
77 
78         if ( IsControlBackground() )
79             SetBackground( GetControlBackground() );
80         else
81             SetBackground( pParent->GetBackground() );
82     }
83 }
84 
85 // -----------------------------------------------------------------------
86 
FixedBorder(Window * pParent,WinBits nStyle)87 FixedBorder::FixedBorder( Window* pParent, WinBits nStyle ) :
88     Control( WINDOW_FIXEDBORDER )
89 {
90     ImplInit( pParent, nStyle );
91 }
92 
93 // -----------------------------------------------------------------------
94 
FixedBorder(Window * pParent,const ResId & rResId)95 FixedBorder::FixedBorder( Window* pParent, const ResId& rResId ) :
96     Control( WINDOW_FIXEDBORDER )
97 {
98     rResId.SetRT( RSC_CONTROL );
99     WinBits nStyle = ImplInitRes( rResId );
100     ImplInit( pParent, nStyle );
101     ImplLoadRes( rResId );
102 
103     if ( !(nStyle & WB_HIDE) )
104         Show();
105 }
106 
107 // -----------------------------------------------------------------------
108 
~FixedBorder()109 FixedBorder::~FixedBorder()
110 {
111 }
112 
113 // -----------------------------------------------------------------------
114 
ImplDraw(OutputDevice * pDev,sal_uLong nDrawFlags,const Point & rPos,const Size & rSize)115 void FixedBorder::ImplDraw( OutputDevice* pDev, sal_uLong nDrawFlags,
116                             const Point& rPos, const Size& rSize )
117 {
118     const StyleSettings&    rStyleSettings = GetSettings().GetStyleSettings();
119     Rectangle               aRect( rPos, rSize );
120     sal_uInt16                  nBorderStyle = mnType;
121 
122     if ( (nDrawFlags & WINDOW_DRAW_MONO) ||
123          (rStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
124         nBorderStyle |= FRAME_DRAW_MONO;
125 
126     /*
127     // seems only to be used in tools->options around a tabpage (i.e., no tabcontrol!)
128     // as tabpages that are not embedded in a tabcontrol should not be drawn natively
129     // the fixedborder must also not be drawn (reason was, that it looks too ugly, dialogs must be redesigned)
130     Window *pWin = pDev->GetOutDevType() == OUTDEV_WINDOW ? (Window*) pDev : NULL;
131     if( !(nBorderStyle & FRAME_DRAW_MONO) && pWin && pWin->IsNativeControlSupported( CTRL_FIXEDBORDER, PART_ENTIRE_CONTROL ) )
132     {
133         ImplControlValue aControlValue;
134         Point aPt;
135         Region aCtrlRegion( Rectangle( aPt, GetOutputSizePixel() ) );
136         ControlState nState = IsEnabled() ? CTRL_STATE_ENABLED : 0;
137         pWin->DrawNativeControl( CTRL_FIXEDBORDER, PART_ENTIRE_CONTROL, aCtrlRegion, nState,
138                                 aControlValue, rtl::OUString() );
139     }
140     else
141     */
142     {
143         DecorationView  aDecoView( pDev );
144         aDecoView.DrawFrame( aRect, nBorderStyle );
145     }
146 }
147 
148 // -----------------------------------------------------------------------
149 
Paint(const Rectangle &)150 void FixedBorder::Paint( const Rectangle& )
151 {
152     ImplDraw( this, 0, Point(), GetOutputSizePixel() );
153 }
154 
155 // -----------------------------------------------------------------------
156 
Draw(OutputDevice * pDev,const Point & rPos,const Size & rSize,sal_uLong nFlags)157 void FixedBorder::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize,
158                         sal_uLong nFlags )
159 {
160     Point   aPos  = pDev->LogicToPixel( rPos );
161     Size    aSize = pDev->LogicToPixel( rSize );
162 
163     pDev->Push();
164     pDev->SetMapMode();
165     ImplDraw( pDev, nFlags, aPos, aSize );
166     pDev->Pop();
167 }
168 
169 // -----------------------------------------------------------------------
170 
Resize()171 void FixedBorder::Resize()
172 {
173     Invalidate();
174 }
175 
176 // -----------------------------------------------------------------------
177 
StateChanged(StateChangedType nType)178 void FixedBorder::StateChanged( StateChangedType nType )
179 {
180     Control::StateChanged( nType );
181 
182     if ( (nType == STATE_CHANGE_DATA) ||
183          (nType == STATE_CHANGE_UPDATEMODE) )
184     {
185         if ( IsUpdateMode() )
186             Invalidate();
187     }
188     else if ( nType == STATE_CHANGE_STYLE )
189         SetStyle( ImplInitStyle( GetStyle() ) );
190     else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
191     {
192         ImplInitSettings();
193         Invalidate();
194     }
195 }
196 
197 // -----------------------------------------------------------------------
198 
DataChanged(const DataChangedEvent & rDCEvt)199 void FixedBorder::DataChanged( const DataChangedEvent& rDCEvt )
200 {
201     Control::DataChanged( rDCEvt );
202 
203     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
204          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
205     {
206         ImplInitSettings();
207         Invalidate();
208     }
209 }
210 
211 // -----------------------------------------------------------------------
212 
SetTransparent(sal_Bool bTransparent)213 void FixedBorder::SetTransparent( sal_Bool bTransparent )
214 {
215     if ( mbTransparent != bTransparent )
216     {
217         mbTransparent = bTransparent;
218         ImplInitSettings();
219         Invalidate();
220     }
221 }
222 
223 // -----------------------------------------------------------------------
224 
SetBorderType(sal_uInt16 nType)225 void FixedBorder::SetBorderType( sal_uInt16 nType )
226 {
227     if ( mnType != nType )
228     {
229         mnType = nType;
230         Invalidate();
231     }
232 }
233 
234