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 <tools/ref.hxx> 28 #include <tools/rc.h> 29 30 #include <vcl/svapp.hxx> 31 #include <vcl/event.hxx> 32 #include <vcl/tabpage.hxx> 33 #include <vcl/tabctrl.hxx> 34 #include <vcl/bitmapex.hxx> 35 36 #include <svdata.hxx> 37 38 #include <com/sun/star/accessibility/XAccessible.hpp> 39 40 // ======================================================================= 41 42 void TabPage::ImplInit( Window* pParent, WinBits nStyle ) 43 { 44 if ( !(nStyle & WB_NODIALOGCONTROL) ) 45 nStyle |= WB_DIALOGCONTROL; 46 47 Window::ImplInit( pParent, nStyle, NULL ); 48 49 ImplInitSettings(); 50 51 // if the tabpage is drawn (ie filled) by a native widget, make sure all contols will have transparent background 52 // otherwise they will paint with a wrong background 53 if( IsNativeControlSupported(CTRL_TAB_BODY, PART_ENTIRE_CONTROL) && GetParent() && (GetParent()->GetType() == WINDOW_TABCONTROL) ) 54 EnableChildTransparentMode( sal_True ); 55 } 56 57 // ----------------------------------------------------------------------- 58 59 void TabPage::ImplInitSettings() 60 { 61 Window* pParent = GetParent(); 62 if ( pParent->IsChildTransparentModeEnabled() && !IsControlBackground() ) 63 { 64 EnableChildTransparentMode( sal_True ); 65 SetParentClipMode( PARENTCLIPMODE_NOCLIP ); 66 SetPaintTransparent( sal_True ); 67 SetBackground(); 68 } 69 else 70 { 71 EnableChildTransparentMode( sal_False ); 72 SetParentClipMode( 0 ); 73 SetPaintTransparent( sal_False ); 74 75 if ( IsControlBackground() ) 76 SetBackground( GetControlBackground() ); 77 else 78 SetBackground( pParent->GetBackground() ); 79 } 80 } 81 82 // ----------------------------------------------------------------------- 83 84 TabPage::TabPage( Window* pParent, WinBits nStyle ) : 85 Window( WINDOW_TABPAGE ) 86 { 87 ImplInit( pParent, nStyle ); 88 } 89 90 // ----------------------------------------------------------------------- 91 92 TabPage::TabPage( Window* pParent, const ResId& rResId ) : 93 Window( WINDOW_TABPAGE ) 94 { 95 rResId.SetRT( RSC_TABPAGE ); 96 WinBits nStyle = ImplInitRes( rResId ); 97 ImplInit( pParent, nStyle ); 98 ImplLoadRes( rResId ); 99 100 if ( !(nStyle & WB_HIDE) ) 101 Show(); 102 } 103 104 // ----------------------------------------------------------------------- 105 106 void TabPage::StateChanged( StateChangedType nType ) 107 { 108 Window::StateChanged( nType ); 109 110 if ( nType == STATE_CHANGE_INITSHOW ) 111 { 112 if ( GetSettings().GetStyleSettings().GetAutoMnemonic() ) 113 ImplWindowAutoMnemonic( this ); 114 // FIXME: no layouting, workaround some clipping issues 115 ImplAdjustNWFSizes(); 116 } 117 else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) 118 { 119 ImplInitSettings(); 120 Invalidate(); 121 } 122 } 123 124 // ----------------------------------------------------------------------- 125 126 void TabPage::DataChanged( const DataChangedEvent& rDCEvt ) 127 { 128 Window::DataChanged( rDCEvt ); 129 130 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 131 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 132 { 133 ImplInitSettings(); 134 Invalidate(); 135 } 136 } 137 138 // ----------------------------------------------------------------------- 139 140 void TabPage::Paint( const Rectangle& ) 141 { 142 // draw native tabpage only inside tabcontrols, standalone tabpages look ugly (due to bad dialog design) 143 if( IsNativeControlSupported(CTRL_TAB_BODY, PART_ENTIRE_CONTROL) && GetParent() && (GetParent()->GetType() == WINDOW_TABCONTROL) ) 144 { 145 const ImplControlValue aControlValue; 146 147 ControlState nState = CTRL_STATE_ENABLED; 148 int part = PART_ENTIRE_CONTROL; 149 if ( !IsEnabled() ) 150 nState &= ~CTRL_STATE_ENABLED; 151 if ( HasFocus() ) 152 nState |= CTRL_STATE_FOCUSED; 153 Point aPoint; 154 // pass the whole window region to NWF as the tab body might be a gradient or bitmap 155 // that has to be scaled properly, clipping makes sure that we do not paint too much 156 Rectangle aCtrlRegion( aPoint, GetOutputSizePixel() ); 157 DrawNativeControl( CTRL_TAB_BODY, part, aCtrlRegion, nState, 158 aControlValue, rtl::OUString() ); 159 } 160 } 161 162 // ----------------------------------------------------------------------- 163 void TabPage::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong ) 164 { 165 Point aPos = pDev->LogicToPixel( rPos ); 166 Size aSize = pDev->LogicToPixel( rSize ); 167 168 Wallpaper aWallpaper = GetBackground(); 169 if ( !aWallpaper.IsBitmap() ) 170 ImplInitSettings(); 171 172 pDev->Push(); 173 pDev->SetMapMode(); 174 pDev->SetLineColor(); 175 176 if ( aWallpaper.IsBitmap() ) 177 pDev->DrawBitmapEx( aPos, aSize, aWallpaper.GetBitmap() ); 178 else 179 { 180 if( aWallpaper.GetColor() == COL_AUTO ) 181 pDev->SetFillColor( GetSettings().GetStyleSettings().GetDialogColor() ); 182 else 183 pDev->SetFillColor( aWallpaper.GetColor() ); 184 pDev->DrawRect( Rectangle( aPos, aSize ) ); 185 } 186 187 pDev->Pop(); 188 } 189 190 // ----------------------------------------------------------------------- 191 192 void TabPage::ActivatePage() 193 { 194 } 195 196 // ----------------------------------------------------------------------- 197 198 void TabPage::DeactivatePage() 199 { 200 } 201 202 // ----------------------------------------------------------------------- 203 204 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > TabPage::CreateAccessible() 205 { 206 // TODO: remove this method (incompatible) 207 208 return Window::CreateAccessible(); 209 } 210