1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_vcl.hxx" 30 31 #include "atkwrapper.hxx" 32 33 #include <com/sun/star/accessibility/XAccessibleSelection.hpp> 34 35 #include <stdio.h> 36 37 using namespace ::com::sun::star; 38 39 static accessibility::XAccessibleSelection* 40 getSelection( AtkSelection *pSelection ) throw (uno::RuntimeException) 41 { 42 AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pSelection ); 43 if( pWrap ) 44 { 45 if( !pWrap->mpSelection && pWrap->mpContext ) 46 { 47 uno::Any any = pWrap->mpContext->queryInterface( accessibility::XAccessibleSelection::static_type(NULL) ); 48 pWrap->mpSelection = reinterpret_cast< accessibility::XAccessibleSelection * > (any.pReserved); 49 pWrap->mpSelection->acquire(); 50 } 51 52 return pWrap->mpSelection; 53 } 54 55 return NULL; 56 } 57 58 extern "C" { 59 60 static gboolean 61 selection_add_selection( AtkSelection *selection, 62 gint i ) 63 { 64 try { 65 accessibility::XAccessibleSelection* pSelection = getSelection( selection ); 66 if( pSelection ) 67 { 68 pSelection->selectAccessibleChild( i ); 69 return TRUE; 70 } 71 } 72 catch(const uno::Exception& e) { 73 g_warning( "Exception in selectAccessibleChild()" ); 74 } 75 76 return FALSE; 77 } 78 79 static gboolean 80 selection_clear_selection( AtkSelection *selection ) 81 { 82 try { 83 accessibility::XAccessibleSelection* pSelection = getSelection( selection ); 84 if( pSelection ) 85 { 86 pSelection->clearAccessibleSelection(); 87 return TRUE; 88 } 89 } 90 catch(const uno::Exception& e) { 91 g_warning( "Exception in selectAccessibleChild()" ); 92 } 93 94 return FALSE; 95 } 96 97 static AtkObject* 98 selection_ref_selection( AtkSelection *selection, 99 gint i ) 100 { 101 try { 102 accessibility::XAccessibleSelection* pSelection = getSelection( selection ); 103 if( pSelection ) 104 return atk_object_wrapper_ref( pSelection->getSelectedAccessibleChild( i ) ); 105 } 106 catch(const uno::Exception& e) { 107 g_warning( "Exception in getSelectedAccessibleChild()" ); 108 } 109 110 return NULL; 111 } 112 113 static gint 114 selection_get_selection_count( AtkSelection *selection) 115 { 116 try { 117 accessibility::XAccessibleSelection* pSelection = getSelection( selection ); 118 if( pSelection ) 119 return pSelection->getSelectedAccessibleChildCount(); 120 } 121 catch(const uno::Exception& e) { 122 g_warning( "Exception in getSelectedAccessibleChildCount()" ); 123 } 124 125 return -1; 126 } 127 128 static gboolean 129 selection_is_child_selected( AtkSelection *selection, 130 gint i) 131 { 132 try { 133 accessibility::XAccessibleSelection* pSelection = getSelection( selection ); 134 if( pSelection ) 135 return pSelection->isAccessibleChildSelected( i ); 136 } 137 catch(const uno::Exception& e) { 138 g_warning( "Exception in getSelectedAccessibleChildCount()" ); 139 } 140 141 return FALSE; 142 } 143 144 static gboolean 145 selection_remove_selection( AtkSelection *selection, 146 gint i ) 147 { 148 try { 149 accessibility::XAccessibleSelection* pSelection = getSelection( selection ); 150 if( pSelection ) 151 { 152 pSelection->deselectAccessibleChild( i ); 153 return TRUE; 154 } 155 } 156 catch(const uno::Exception& e) { 157 g_warning( "Exception in getSelectedAccessibleChildCount()" ); 158 } 159 160 return FALSE; 161 } 162 163 static gboolean 164 selection_select_all_selection( AtkSelection *selection) 165 { 166 try { 167 accessibility::XAccessibleSelection* pSelection = getSelection( selection ); 168 if( pSelection ) 169 { 170 pSelection->selectAllAccessibleChildren(); 171 return TRUE; 172 } 173 } 174 catch(const uno::Exception& e) { 175 g_warning( "Exception in getSelectedAccessibleChildCount()" ); 176 } 177 178 return FALSE; 179 } 180 181 } // extern "C" 182 183 void 184 selectionIfaceInit( AtkSelectionIface *iface) 185 { 186 g_return_if_fail (iface != NULL); 187 188 iface->add_selection = selection_add_selection; 189 iface->clear_selection = selection_clear_selection; 190 iface->ref_selection = selection_ref_selection; 191 iface->get_selection_count = selection_get_selection_count; 192 iface->is_child_selected = selection_is_child_selected; 193 iface->remove_selection = selection_remove_selection; 194 iface->select_all_selection = selection_select_all_selection; 195 } 196