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 "atkwrapper.hxx" 28 #include "atktextattributes.hxx" 29 30 #include <com/sun/star/accessibility/XAccessibleEditableText.hpp> 31 #include <com/sun/star/accessibility/TextSegment.hpp> 32 33 // #include <functional> 34 // #include <hash_map> 35 36 #include <stdio.h> 37 #include <string.h> 38 39 using namespace ::com::sun::star; 40 41 static accessibility::XAccessibleEditableText* 42 getEditableText( AtkEditableText *pEditableText ) throw (uno::RuntimeException) 43 { 44 AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pEditableText ); 45 if( pWrap ) 46 { 47 if( !pWrap->mpEditableText && pWrap->mpContext ) 48 { 49 uno::Any any = pWrap->mpContext->queryInterface( accessibility::XAccessibleEditableText::static_type(NULL) ); 50 pWrap->mpEditableText = reinterpret_cast< accessibility::XAccessibleEditableText * > (any.pReserved); 51 pWrap->mpEditableText->acquire(); 52 } 53 54 return pWrap->mpEditableText; 55 } 56 57 return NULL; 58 } 59 60 61 /*****************************************************************************/ 62 63 extern "C" { 64 65 static gboolean 66 editable_text_wrapper_set_run_attributes( AtkEditableText *text, 67 AtkAttributeSet *attribute_set, 68 gint nStartOffset, 69 gint nEndOffset) 70 { 71 try { 72 accessibility::XAccessibleEditableText* pEditableText = getEditableText( text ); 73 if( pEditableText ) 74 { 75 uno::Sequence< beans::PropertyValue > aAttributeList; 76 77 if( attribute_set_map_to_property_values( attribute_set, aAttributeList ) ) 78 return pEditableText->setAttributes(nStartOffset, nEndOffset, aAttributeList); 79 } 80 } 81 catch(const uno::Exception& e) { 82 g_warning( "Exception in setAttributes()" ); 83 } 84 85 return FALSE; 86 } 87 88 static void 89 editable_text_wrapper_set_text_contents( AtkEditableText *text, 90 const gchar *string ) 91 { 92 try { 93 accessibility::XAccessibleEditableText* pEditableText = getEditableText( text ); 94 if( pEditableText ) 95 { 96 rtl::OUString aString ( string, strlen(string), RTL_TEXTENCODING_UTF8 ); 97 pEditableText->setText( aString ); 98 } 99 } 100 catch(const uno::Exception& e) { 101 g_warning( "Exception in setText()" ); 102 } 103 } 104 105 static void 106 editable_text_wrapper_insert_text( AtkEditableText *text, 107 const gchar *string, 108 gint length, 109 gint *pos ) 110 { 111 try { 112 accessibility::XAccessibleEditableText* pEditableText = getEditableText( text ); 113 if( pEditableText ) 114 { 115 rtl::OUString aString ( string, length, RTL_TEXTENCODING_UTF8 ); 116 if( pEditableText->insertText( aString, *pos ) ) 117 *pos += length; 118 } 119 } 120 catch(const uno::Exception& e) { 121 g_warning( "Exception in insertText()" ); 122 } 123 } 124 125 static void 126 editable_text_wrapper_cut_text( AtkEditableText *text, 127 gint start, 128 gint end ) 129 { 130 try { 131 accessibility::XAccessibleEditableText* pEditableText = getEditableText( text ); 132 if( pEditableText ) 133 pEditableText->cutText( start, end ); 134 } 135 catch(const uno::Exception& e) { 136 g_warning( "Exception in cutText()" ); 137 } 138 } 139 140 static void 141 editable_text_wrapper_delete_text( AtkEditableText *text, 142 gint start, 143 gint end ) 144 { 145 try { 146 accessibility::XAccessibleEditableText* pEditableText = getEditableText( text ); 147 if( pEditableText ) 148 pEditableText->deleteText( start, end ); 149 } 150 catch(const uno::Exception& e) { 151 g_warning( "Exception in deleteText()" ); 152 } 153 } 154 155 static void 156 editable_text_wrapper_paste_text( AtkEditableText *text, 157 gint pos ) 158 { 159 try { 160 accessibility::XAccessibleEditableText* pEditableText = getEditableText( text ); 161 if( pEditableText ) 162 pEditableText->pasteText( pos ); 163 } 164 catch(const uno::Exception& e) { 165 g_warning( "Exception in pasteText()" ); 166 } 167 } 168 169 static void 170 editable_text_wrapper_copy_text( AtkEditableText *text, 171 gint start, 172 gint end ) 173 { 174 try { 175 accessibility::XAccessibleEditableText* pEditableText = getEditableText( text ); 176 if( pEditableText ) 177 pEditableText->copyText( start, end ); 178 } 179 catch(const uno::Exception& e) { 180 g_warning( "Exception in copyText()" ); 181 } 182 } 183 184 } // extern "C" 185 186 void 187 editableTextIfaceInit (AtkEditableTextIface *iface) 188 { 189 g_return_if_fail (iface != NULL); 190 191 iface->set_text_contents = editable_text_wrapper_set_text_contents; 192 iface->insert_text = editable_text_wrapper_insert_text; 193 iface->copy_text = editable_text_wrapper_copy_text; 194 iface->cut_text = editable_text_wrapper_cut_text; 195 iface->delete_text = editable_text_wrapper_delete_text; 196 iface->paste_text = editable_text_wrapper_paste_text; 197 iface->set_run_attributes = editable_text_wrapper_set_run_attributes; 198 } 199