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_accessibility.hxx" 26 #include <accessibility/standard/vclxaccessiblemenubar.hxx> 27 28 #include <com/sun/star/accessibility/AccessibleRole.hpp> 29 #include <vcl/svapp.hxx> 30 #include <vcl/window.hxx> 31 #include <vcl/menu.hxx> 32 33 34 using namespace ::com::sun::star::accessibility; 35 using namespace ::com::sun::star::uno; 36 using namespace ::com::sun::star; 37 using namespace ::comphelper; 38 39 40 // ----------------------------------------------------------------------------- 41 // class VCLXAccessibleMenuBar 42 // ----------------------------------------------------------------------------- 43 44 VCLXAccessibleMenuBar::VCLXAccessibleMenuBar( Menu* pMenu ) 45 :OAccessibleMenuComponent( pMenu ) 46 { 47 if ( pMenu ) 48 { 49 m_pWindow = pMenu->GetWindow(); 50 51 if ( m_pWindow ) 52 m_pWindow->AddEventListener( LINK( this, VCLXAccessibleMenuBar, WindowEventListener ) ); 53 } 54 } 55 56 // ----------------------------------------------------------------------------- 57 58 VCLXAccessibleMenuBar::~VCLXAccessibleMenuBar() 59 { 60 if ( m_pWindow ) 61 m_pWindow->RemoveEventListener( LINK( this, VCLXAccessibleMenuBar, WindowEventListener ) ); 62 } 63 64 // ----------------------------------------------------------------------------- 65 66 sal_Bool VCLXAccessibleMenuBar::IsFocused() 67 { 68 sal_Bool bFocused = sal_False; 69 70 if ( m_pWindow && m_pWindow->HasFocus() && !IsChildHighlighted() ) 71 bFocused = sal_True; 72 73 return bFocused; 74 } 75 76 // ----------------------------------------------------------------------------- 77 78 IMPL_LINK( VCLXAccessibleMenuBar, WindowEventListener, VclSimpleEvent*, pEvent ) 79 { 80 DBG_ASSERT( pEvent && pEvent->ISA( VclWindowEvent ), "VCLXAccessibleMenuBar::WindowEventListener: unknown window event!" ); 81 if ( pEvent && pEvent->ISA( VclWindowEvent ) ) 82 { 83 DBG_ASSERT( ((VclWindowEvent*)pEvent)->GetWindow(), "VCLXAccessibleMenuBar::WindowEventListener: no window!" ); 84 if ( !((VclWindowEvent*)pEvent)->GetWindow()->IsAccessibilityEventsSuppressed() || ( pEvent->GetId() == VCLEVENT_OBJECT_DYING ) ) 85 { 86 ProcessWindowEvent( *(VclWindowEvent*)pEvent ); 87 } 88 } 89 return 0; 90 } 91 92 // ----------------------------------------------------------------------------- 93 94 void VCLXAccessibleMenuBar::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) 95 { 96 switch ( rVclWindowEvent.GetId() ) 97 { 98 case VCLEVENT_WINDOW_GETFOCUS: 99 case VCLEVENT_WINDOW_LOSEFOCUS: 100 { 101 SetFocused( rVclWindowEvent.GetId() == VCLEVENT_WINDOW_GETFOCUS ); 102 } 103 break; 104 case VCLEVENT_OBJECT_DYING: 105 { 106 if ( m_pWindow ) 107 { 108 m_pWindow->RemoveEventListener( LINK( this, VCLXAccessibleMenuBar, WindowEventListener ) ); 109 m_pWindow = NULL; 110 } 111 } 112 break; 113 default: 114 { 115 } 116 break; 117 } 118 } 119 120 // ----------------------------------------------------------------------------- 121 // XComponent 122 // ----------------------------------------------------------------------------- 123 124 void VCLXAccessibleMenuBar::disposing() 125 { 126 OAccessibleMenuComponent::disposing(); 127 128 if ( m_pWindow ) 129 { 130 m_pWindow->RemoveEventListener( LINK( this, VCLXAccessibleMenuBar, WindowEventListener ) ); 131 m_pWindow = NULL; 132 } 133 } 134 135 // ----------------------------------------------------------------------------- 136 // XServiceInfo 137 // ----------------------------------------------------------------------------- 138 139 ::rtl::OUString VCLXAccessibleMenuBar::getImplementationName() throw (RuntimeException) 140 { 141 return ::rtl::OUString::createFromAscii( "com.sun.star.comp.toolkit.AccessibleMenuBar" ); 142 } 143 144 // ----------------------------------------------------------------------------- 145 146 Sequence< ::rtl::OUString > VCLXAccessibleMenuBar::getSupportedServiceNames() throw (RuntimeException) 147 { 148 Sequence< ::rtl::OUString > aNames(1); 149 aNames[0] = ::rtl::OUString::createFromAscii( "com.sun.star.awt.AccessibleMenuBar" ); 150 return aNames; 151 } 152 153 // ----------------------------------------------------------------------------- 154 // XAccessibleContext 155 // ----------------------------------------------------------------------------- 156 157 sal_Int32 VCLXAccessibleMenuBar::getAccessibleIndexInParent( ) throw (RuntimeException) 158 { 159 OExternalLockGuard aGuard( this ); 160 161 sal_Int32 nIndexInParent = -1; 162 163 if ( m_pMenu ) 164 { 165 Window* pWindow = m_pMenu->GetWindow(); 166 if ( pWindow ) 167 { 168 Window* pParent = pWindow->GetAccessibleParentWindow(); 169 if ( pParent ) 170 { 171 for ( sal_uInt16 n = pParent->GetAccessibleChildWindowCount(); n; ) 172 { 173 Window* pChild = pParent->GetAccessibleChildWindow( --n ); 174 if ( pChild == pWindow ) 175 { 176 nIndexInParent = n; 177 break; 178 } 179 } 180 } 181 } 182 } 183 184 return nIndexInParent; 185 } 186 187 // ----------------------------------------------------------------------------- 188 189 sal_Int16 VCLXAccessibleMenuBar::getAccessibleRole( ) throw (RuntimeException) 190 { 191 OExternalLockGuard aGuard( this ); 192 193 return AccessibleRole::MENU_BAR; 194 } 195 196 // ----------------------------------------------------------------------------- 197 // XAccessibleExtendedComponent 198 // ----------------------------------------------------------------------------- 199 200 sal_Int32 VCLXAccessibleMenuBar::getBackground( ) throw (RuntimeException) 201 { 202 OExternalLockGuard aGuard( this ); 203 204 return Application::GetSettings().GetStyleSettings().GetMenuBarColor().GetColor(); 205 } 206 207 // ----------------------------------------------------------------------------- 208