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 "vcl/outdev.hxx" 28 #include "vcl/window.hxx" 29 #include "vcl/salnativewidgets.hxx" 30 #include "vcl/pdfextoutdevdata.hxx" 31 32 #include "salgdi.hxx" 33 34 // ----------------------------------------------------------------------- 35 36 static bool lcl_enableNativeWidget( const OutputDevice& i_rDevice ) 37 { 38 const OutDevType eType( i_rDevice.GetOutDevType() ); 39 switch ( eType ) 40 { 41 42 case OUTDEV_WINDOW: 43 return dynamic_cast< const Window* >( &i_rDevice )->IsNativeWidgetEnabled(); 44 45 case OUTDEV_VIRDEV: 46 { 47 const ::vcl::ExtOutDevData* pOutDevData( i_rDevice.GetExtOutDevData() ); 48 const ::vcl::PDFExtOutDevData* pPDFData( dynamic_cast< const ::vcl::PDFExtOutDevData* >( pOutDevData ) ); 49 if ( pPDFData != NULL ) 50 return false; 51 return true; 52 } 53 54 default: 55 return false; 56 } 57 } 58 59 ImplControlValue::~ImplControlValue() 60 { 61 } 62 63 ScrollbarValue::~ScrollbarValue() 64 { 65 } 66 67 SliderValue::~SliderValue() 68 { 69 } 70 71 TabitemValue::~TabitemValue() 72 { 73 } 74 75 SpinbuttonValue::~SpinbuttonValue() 76 { 77 } 78 79 ToolbarValue::~ToolbarValue() 80 { 81 } 82 83 MenubarValue::~MenubarValue() 84 { 85 } 86 87 MenupopupValue::~MenupopupValue() 88 { 89 } 90 91 PushButtonValue::~PushButtonValue() 92 { 93 } 94 95 // ----------------------------------------------------------------------- 96 // These functions are mainly passthrough functions that allow access to 97 // the SalFrame behind a Window object for native widget rendering purposes. 98 // ----------------------------------------------------------------------- 99 100 // ----------------------------------------------------------------------- 101 102 sal_Bool OutputDevice::IsNativeControlSupported( ControlType nType, ControlPart nPart ) 103 { 104 if( !lcl_enableNativeWidget( *this ) ) 105 return sal_False; 106 107 if ( !mpGraphics ) 108 if ( !ImplGetGraphics() ) 109 return sal_False; 110 111 return( mpGraphics->IsNativeControlSupported(nType, nPart) ); 112 } 113 114 115 // ----------------------------------------------------------------------- 116 117 sal_Bool OutputDevice::HitTestNativeControl( ControlType nType, 118 ControlPart nPart, 119 const Rectangle& rControlRegion, 120 const Point& aPos, 121 sal_Bool& rIsInside ) 122 { 123 if( !lcl_enableNativeWidget( *this ) ) 124 return sal_False; 125 126 if ( !mpGraphics ) 127 if ( !ImplGetGraphics() ) 128 return sal_False; 129 130 Point aWinOffs( mnOutOffX, mnOutOffY ); 131 Rectangle screenRegion( rControlRegion ); 132 screenRegion.Move( aWinOffs.X(), aWinOffs.Y()); 133 134 return( mpGraphics->HitTestNativeControl(nType, nPart, screenRegion, Point( aPos.X() + mnOutOffX, aPos.Y() + mnOutOffY ), 135 rIsInside, this ) ); 136 } 137 138 // ----------------------------------------------------------------------- 139 140 static boost::shared_ptr< ImplControlValue > lcl_transformControlValue( const ImplControlValue& rVal, OutputDevice& rDev ) 141 { 142 boost::shared_ptr< ImplControlValue > aResult; 143 switch( rVal.getType() ) 144 { 145 case CTRL_SLIDER: 146 { 147 const SliderValue* pSlVal = static_cast<const SliderValue*>(&rVal); 148 SliderValue* pNew = new SliderValue( *pSlVal ); 149 aResult.reset( pNew ); 150 pNew->maThumbRect = rDev.ImplLogicToDevicePixel( pSlVal->maThumbRect ); 151 } 152 break; 153 case CTRL_SCROLLBAR: 154 { 155 const ScrollbarValue* pScVal = static_cast<const ScrollbarValue*>(&rVal); 156 ScrollbarValue* pNew = new ScrollbarValue( *pScVal ); 157 aResult.reset( pNew ); 158 pNew->maThumbRect = rDev.ImplLogicToDevicePixel( pScVal->maThumbRect ); 159 pNew->maButton1Rect = rDev.ImplLogicToDevicePixel( pScVal->maButton1Rect ); 160 pNew->maButton2Rect = rDev.ImplLogicToDevicePixel( pScVal->maButton2Rect ); 161 } 162 break; 163 case CTRL_SPINBUTTONS: 164 { 165 const SpinbuttonValue* pSpVal = static_cast<const SpinbuttonValue*>(&rVal); 166 SpinbuttonValue* pNew = new SpinbuttonValue( *pSpVal ); 167 aResult.reset( pNew ); 168 pNew->maUpperRect = rDev.ImplLogicToDevicePixel( pSpVal->maUpperRect ); 169 pNew->maLowerRect = rDev.ImplLogicToDevicePixel( pSpVal->maLowerRect ); 170 } 171 break; 172 case CTRL_TOOLBAR: 173 { 174 const ToolbarValue* pTVal = static_cast<const ToolbarValue*>(&rVal); 175 ToolbarValue* pNew = new ToolbarValue( *pTVal ); 176 aResult.reset( pNew ); 177 pNew->maGripRect = rDev.ImplLogicToDevicePixel( pTVal->maGripRect ); 178 } 179 break; 180 case CTRL_TAB_ITEM: 181 { 182 const TabitemValue* pTIVal = static_cast<const TabitemValue*>(&rVal); 183 TabitemValue* pNew = new TabitemValue( *pTIVal ); 184 aResult.reset( pNew ); 185 } 186 break; 187 case CTRL_MENUBAR: 188 { 189 const MenubarValue* pMVal = static_cast<const MenubarValue*>(&rVal); 190 MenubarValue* pNew = new MenubarValue( *pMVal ); 191 aResult.reset( pNew ); 192 } 193 break; 194 case CTRL_PUSHBUTTON: 195 { 196 const PushButtonValue* pBVal = static_cast<const PushButtonValue*>(&rVal); 197 PushButtonValue* pNew = new PushButtonValue( *pBVal ); 198 aResult.reset( pNew ); 199 } 200 break; 201 case CTRL_GENERIC: 202 aResult.reset( new ImplControlValue( rVal ) ); 203 break; 204 case CTRL_MENU_POPUP: 205 { 206 const MenupopupValue* pMVal = static_cast<const MenupopupValue*>(&rVal); 207 MenupopupValue* pNew = new MenupopupValue( *pMVal ); 208 pNew->maItemRect = rDev.ImplLogicToDevicePixel( pMVal->maItemRect ); 209 aResult.reset( pNew ); 210 } 211 break; 212 default: 213 OSL_ENSURE( 0, "unknown ImplControlValue type !" ); 214 break; 215 } 216 return aResult; 217 } 218 219 sal_Bool OutputDevice::DrawNativeControl( ControlType nType, 220 ControlPart nPart, 221 const Rectangle& rControlRegion, 222 ControlState nState, 223 const ImplControlValue& aValue, 224 ::rtl::OUString aCaption ) 225 { 226 if( !lcl_enableNativeWidget( *this ) ) 227 return sal_False; 228 229 // make sure the current clip region is initialized correctly 230 if ( !mpGraphics ) 231 if ( !ImplGetGraphics() ) 232 return sal_False; 233 234 if ( mbInitClipRegion ) 235 ImplInitClipRegion(); 236 if ( mbOutputClipped ) 237 return sal_True; 238 239 if ( mbInitLineColor ) 240 ImplInitLineColor(); 241 if ( mbInitFillColor ) 242 ImplInitFillColor(); 243 244 // Convert the coordinates from relative to Window-absolute, so we draw 245 // in the correct place in platform code 246 boost::shared_ptr< ImplControlValue > aScreenCtrlValue( lcl_transformControlValue( aValue, *this ) ); 247 Rectangle screenRegion( ImplLogicToDevicePixel( rControlRegion ) ); 248 249 Region aTestRegion( GetActiveClipRegion() ); 250 aTestRegion.Intersect( rControlRegion ); 251 if( aTestRegion == rControlRegion ) 252 nState |= CTRL_CACHING_ALLOWED; // control is not clipped, caching allowed 253 254 sal_Bool bRet = mpGraphics->DrawNativeControl(nType, nPart, screenRegion, nState, *aScreenCtrlValue, aCaption, this ); 255 256 return bRet; 257 } 258 259 260 // ----------------------------------------------------------------------- 261 262 sal_Bool OutputDevice::DrawNativeControlText(ControlType nType, 263 ControlPart nPart, 264 const Rectangle& rControlRegion, 265 ControlState nState, 266 const ImplControlValue& aValue, 267 ::rtl::OUString aCaption ) 268 { 269 if( !lcl_enableNativeWidget( *this ) ) 270 return sal_False; 271 272 // make sure the current clip region is initialized correctly 273 if ( !mpGraphics ) 274 if ( !ImplGetGraphics() ) 275 return false; 276 277 if ( mbInitClipRegion ) 278 ImplInitClipRegion(); 279 if ( mbOutputClipped ) 280 return true; 281 282 if ( mbInitLineColor ) 283 ImplInitLineColor(); 284 if ( mbInitFillColor ) 285 ImplInitFillColor(); 286 287 // Convert the coordinates from relative to Window-absolute, so we draw 288 // in the correct place in platform code 289 boost::shared_ptr< ImplControlValue > aScreenCtrlValue( lcl_transformControlValue( aValue, *this ) ); 290 Rectangle screenRegion( ImplLogicToDevicePixel( rControlRegion ) ); 291 292 sal_Bool bRet = mpGraphics->DrawNativeControlText(nType, nPart, screenRegion, nState, *aScreenCtrlValue, aCaption, this ); 293 294 return bRet; 295 } 296 297 298 // ----------------------------------------------------------------------- 299 300 sal_Bool OutputDevice::GetNativeControlRegion( ControlType nType, 301 ControlPart nPart, 302 const Rectangle& rControlRegion, 303 ControlState nState, 304 const ImplControlValue& aValue, 305 ::rtl::OUString aCaption, 306 Rectangle &rNativeBoundingRegion, 307 Rectangle &rNativeContentRegion ) 308 { 309 if( !lcl_enableNativeWidget( *this ) ) 310 return sal_False; 311 312 if ( !mpGraphics ) 313 if ( !ImplGetGraphics() ) 314 return sal_False; 315 316 // Convert the coordinates from relative to Window-absolute, so we draw 317 // in the correct place in platform code 318 boost::shared_ptr< ImplControlValue > aScreenCtrlValue( lcl_transformControlValue( aValue, *this ) ); 319 Rectangle screenRegion( ImplLogicToDevicePixel( rControlRegion ) ); 320 321 sal_Bool bRet = mpGraphics->GetNativeControlRegion(nType, nPart, screenRegion, nState, *aScreenCtrlValue, 322 aCaption, rNativeBoundingRegion, 323 rNativeContentRegion, this ); 324 if( bRet ) 325 { 326 // transform back native regions 327 rNativeBoundingRegion = ImplDevicePixelToLogic( rNativeBoundingRegion ); 328 rNativeContentRegion = ImplDevicePixelToLogic( rNativeContentRegion ); 329 } 330 331 return bRet; 332 } 333 334 335