1b557fc96SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3b557fc96SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4b557fc96SAndrew Rist * or more contributor license agreements. See the NOTICE file 5b557fc96SAndrew Rist * distributed with this work for additional information 6b557fc96SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7b557fc96SAndrew Rist * to you under the Apache License, Version 2.0 (the 8b557fc96SAndrew Rist * "License"); you may not use this file except in compliance 9b557fc96SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11b557fc96SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13b557fc96SAndrew Rist * Unless required by applicable law or agreed to in writing, 14b557fc96SAndrew Rist * software distributed under the License is distributed on an 15b557fc96SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16b557fc96SAndrew Rist * KIND, either express or implied. See the License for the 17b557fc96SAndrew Rist * specific language governing permissions and limitations 18b557fc96SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20b557fc96SAndrew Rist *************************************************************/ 21b557fc96SAndrew Rist 22b557fc96SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_fpicker.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir //------------------------------------------------------------------------ 28cdf0e10cSrcweir // includes 29cdf0e10cSrcweir //------------------------------------------------------------------------ 30cdf0e10cSrcweir #include <osl/diagnose.h> 31cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 32cdf0e10cSrcweir #include "AutoBuffer.hxx" 33cdf0e10cSrcweir #include "WinImplHelper.hxx" 34cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 35cdf0e10cSrcweir 36cdf0e10cSrcweir //------------------------------------------------------------ 37cdf0e10cSrcweir // namespace directives 38cdf0e10cSrcweir //------------------------------------------------------------ 39cdf0e10cSrcweir 40cdf0e10cSrcweir using rtl::OUString; 41cdf0e10cSrcweir using rtl::OUStringBuffer; 42cdf0e10cSrcweir using ::com::sun::star::lang::IllegalArgumentException; 43cdf0e10cSrcweir using ::com::sun::star::uno::Reference; 44cdf0e10cSrcweir using ::com::sun::star::uno::XInterface; 45cdf0e10cSrcweir using ::com::sun::star::uno::Any; 46cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 47cdf0e10cSrcweir 48cdf0e10cSrcweir //------------------------------------------------------------ 49cdf0e10cSrcweir // 50cdf0e10cSrcweir //------------------------------------------------------------ 51cdf0e10cSrcweir 52cdf0e10cSrcweir const rtl::OUString TILDE = OUString::createFromAscii( "~" ); 53cdf0e10cSrcweir const sal_Unicode TILDE_SIGN = L'~'; 54cdf0e10cSrcweir const rtl::OUString AMPERSAND = OUString::createFromAscii( "&" ); 55cdf0e10cSrcweir const sal_Unicode AMPERSAND_SIGN = L'&'; 56cdf0e10cSrcweir 57cdf0e10cSrcweir //------------------------------------------------------------ 58cdf0e10cSrcweir // OS NAME Platform Major Minor 59cdf0e10cSrcweir // 60cdf0e10cSrcweir // Windows NT 3.51 VER_PLATFORM_WIN32_NT 3 51 61cdf0e10cSrcweir // Windows NT 4.0 VER_PLATFORM_WIN32_NT 4 0 62cdf0e10cSrcweir // Windows 2000 VER_PLATFORM_WIN32_NT 5 0 63cdf0e10cSrcweir // Windows XP VER_PLATFORM_WIN32_NT 5 1 64cdf0e10cSrcweir // Windows Vista VER_PLATFORM_WIN32_NT 6 0 65cdf0e10cSrcweir // Windows 7 VER_PLATFORM_WIN32_NT 6 1 66cdf0e10cSrcweir // Windows 95 VER_PLATFORM_WIN32_WINDOWS 4 0 67cdf0e10cSrcweir // Windows 98 VER_PLATFORM_WIN32_WINDOWS 4 10 68cdf0e10cSrcweir // Windows ME VER_PLATFORM_WIN32_WINDOWS 4 90 69cdf0e10cSrcweir //------------------------------------------------------------ 70cdf0e10cSrcweir 71cdf0e10cSrcweir bool SAL_CALL IsWindowsVersion(unsigned int PlatformId, unsigned int MajorVersion, int MinorVersion = -1) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir OSVERSIONINFO osvi; 74cdf0e10cSrcweir osvi.dwOSVersionInfoSize = sizeof(osvi); 75cdf0e10cSrcweir 76cdf0e10cSrcweir if(!GetVersionEx(&osvi)) 77cdf0e10cSrcweir return false; 78cdf0e10cSrcweir 79cdf0e10cSrcweir bool bRet = (PlatformId == osvi.dwPlatformId) && 80cdf0e10cSrcweir (MajorVersion == osvi.dwMajorVersion); 81cdf0e10cSrcweir 82cdf0e10cSrcweir if (MinorVersion > -1) 83cdf0e10cSrcweir bRet = bRet && 84cdf0e10cSrcweir (sal::static_int_cast< unsigned int >(MinorVersion) == 85cdf0e10cSrcweir osvi.dwMinorVersion); 86cdf0e10cSrcweir 87cdf0e10cSrcweir return bRet; 88cdf0e10cSrcweir } 89cdf0e10cSrcweir 90cdf0e10cSrcweir //------------------------------------------------------------ 91cdf0e10cSrcweir // determine if we are running under Vista or newer OS 92cdf0e10cSrcweir //------------------------------------------------------------ 93cdf0e10cSrcweir 94cdf0e10cSrcweir bool SAL_CALL IsWindowsVistaOrNewer() 95cdf0e10cSrcweir { 96cdf0e10cSrcweir OSVERSIONINFO osvi; 97cdf0e10cSrcweir osvi.dwOSVersionInfoSize = sizeof(osvi); 98cdf0e10cSrcweir 99cdf0e10cSrcweir if(!GetVersionEx(&osvi)) 100cdf0e10cSrcweir return false; 101cdf0e10cSrcweir 102cdf0e10cSrcweir bool bRet = (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId) && 103cdf0e10cSrcweir (osvi.dwMajorVersion >= 6); 104cdf0e10cSrcweir 105cdf0e10cSrcweir bRet = bRet && 106cdf0e10cSrcweir (osvi.dwMinorVersion >= 107cdf0e10cSrcweir sal::static_int_cast< unsigned int >(0)); 108cdf0e10cSrcweir 109cdf0e10cSrcweir return bRet; 110cdf0e10cSrcweir } 111cdf0e10cSrcweir 112cdf0e10cSrcweir //------------------------------------------------------------ 113cdf0e10cSrcweir // determine if we are running under Windows 7 114cdf0e10cSrcweir //------------------------------------------------------------ 115cdf0e10cSrcweir 116cdf0e10cSrcweir bool SAL_CALL IsWindows7() 117cdf0e10cSrcweir { 118cdf0e10cSrcweir return IsWindowsVersion(VER_PLATFORM_WIN32_NT, 6, 1); 119cdf0e10cSrcweir } 120cdf0e10cSrcweir 121cdf0e10cSrcweir //------------------------------------------------------------ 122cdf0e10cSrcweir // determine if we are running under Windows Vista 123cdf0e10cSrcweir //------------------------------------------------------------ 124cdf0e10cSrcweir 125cdf0e10cSrcweir bool SAL_CALL IsWindowsVista() 126cdf0e10cSrcweir { 127cdf0e10cSrcweir return IsWindowsVersion(VER_PLATFORM_WIN32_NT, 6, 0); 128cdf0e10cSrcweir } 129cdf0e10cSrcweir 130cdf0e10cSrcweir //------------------------------------------------------------ 131cdf0e10cSrcweir // determine if we are running under Windows XP 132cdf0e10cSrcweir //------------------------------------------------------------ 133cdf0e10cSrcweir 134cdf0e10cSrcweir bool SAL_CALL IsWindowsXP() 135cdf0e10cSrcweir { 136cdf0e10cSrcweir return IsWindowsVersion(VER_PLATFORM_WIN32_NT, 5, 1); 137cdf0e10cSrcweir } 138cdf0e10cSrcweir 139cdf0e10cSrcweir //------------------------------------------------------------ 140cdf0e10cSrcweir // determine if we are running under Windows 2000 141cdf0e10cSrcweir //------------------------------------------------------------ 142cdf0e10cSrcweir 143cdf0e10cSrcweir bool SAL_CALL IsWindows2000() 144cdf0e10cSrcweir { 145cdf0e10cSrcweir return IsWindowsVersion(VER_PLATFORM_WIN32_NT, 5, 0); 146cdf0e10cSrcweir } 147cdf0e10cSrcweir 148cdf0e10cSrcweir //------------------------------------------------------------ 149cdf0e10cSrcweir // 150cdf0e10cSrcweir //------------------------------------------------------------ 151cdf0e10cSrcweir 152cdf0e10cSrcweir bool SAL_CALL IsWindows98() 153cdf0e10cSrcweir { 154cdf0e10cSrcweir return IsWindowsVersion(VER_PLATFORM_WIN32_WINDOWS, 4, 10); 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir //------------------------------------------------------------ 158cdf0e10cSrcweir // 159cdf0e10cSrcweir //------------------------------------------------------------ 160cdf0e10cSrcweir 161cdf0e10cSrcweir bool SAL_CALL IsWindowsME() 162cdf0e10cSrcweir { 163cdf0e10cSrcweir return IsWindowsVersion(VER_PLATFORM_WIN32_WINDOWS, 4, 90); 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir //------------------------------------------------------------ 167cdf0e10cSrcweir // 168cdf0e10cSrcweir //------------------------------------------------------------ 169cdf0e10cSrcweir 170cdf0e10cSrcweir bool SAL_CALL IsWindows2000Platform() 171cdf0e10cSrcweir { 172cdf0e10cSrcweir // POST: return true if we are at least on Windows 2000 173cdf0e10cSrcweir 174cdf0e10cSrcweir // WRONG!: return IsWindowsVersion(VER_PLATFORM_WIN32_NT, 5); 175cdf0e10cSrcweir 176cdf0e10cSrcweir OSVERSIONINFO osvi; 177cdf0e10cSrcweir ZeroMemory(&osvi, sizeof(osvi)); 178cdf0e10cSrcweir osvi.dwOSVersionInfoSize = sizeof(osvi); 179cdf0e10cSrcweir GetVersionEx(&osvi); 180cdf0e10cSrcweir if ( osvi.dwMajorVersion >= 5 ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir return true; 183cdf0e10cSrcweir } 184cdf0e10cSrcweir return false; 185cdf0e10cSrcweir } 186cdf0e10cSrcweir 187cdf0e10cSrcweir //------------------------------------------------------------ 188cdf0e10cSrcweir // 189cdf0e10cSrcweir //------------------------------------------------------------ 190cdf0e10cSrcweir 191cdf0e10cSrcweir void SAL_CALL ListboxAddString( HWND hwnd, const OUString& aString ) 192cdf0e10cSrcweir { 193cdf0e10cSrcweir LRESULT rc = SendMessageW( 194cdf0e10cSrcweir hwnd, CB_ADDSTRING, 0, reinterpret_cast< LPARAM >(aString.getStr( )) ); 195cdf0e10cSrcweir (void) rc; // avoid warning 196cdf0e10cSrcweir OSL_ASSERT( (CB_ERR != rc) && (CB_ERRSPACE != rc) ); 197cdf0e10cSrcweir } 198cdf0e10cSrcweir 199cdf0e10cSrcweir //------------------------------------------------------------ 200cdf0e10cSrcweir // 201cdf0e10cSrcweir //------------------------------------------------------------ 202cdf0e10cSrcweir 203cdf0e10cSrcweir OUString SAL_CALL ListboxGetString( HWND hwnd, sal_Int32 aPosition ) 204cdf0e10cSrcweir { 205cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 206cdf0e10cSrcweir 207cdf0e10cSrcweir OUString aString; 208cdf0e10cSrcweir 209cdf0e10cSrcweir LRESULT lItem = 210cdf0e10cSrcweir SendMessageW( hwnd, CB_GETLBTEXTLEN, aPosition, 0 ); 211cdf0e10cSrcweir 212cdf0e10cSrcweir if ( (CB_ERR != lItem) && (lItem > 0) ) 213cdf0e10cSrcweir { 214cdf0e10cSrcweir // message returns the len of a combobox item 215cdf0e10cSrcweir // without trailing '\0' that's why += 1 216cdf0e10cSrcweir lItem++; 217cdf0e10cSrcweir 218cdf0e10cSrcweir CAutoUnicodeBuffer aBuff( lItem ); 219cdf0e10cSrcweir 220cdf0e10cSrcweir LRESULT lRet = 221cdf0e10cSrcweir SendMessageW( 222cdf0e10cSrcweir hwnd, CB_GETLBTEXT, aPosition, 223cdf0e10cSrcweir reinterpret_cast<LPARAM>(&aBuff) ); 224cdf0e10cSrcweir 225cdf0e10cSrcweir OSL_ASSERT( lRet != CB_ERR ); 226cdf0e10cSrcweir 227cdf0e10cSrcweir if ( CB_ERR != lRet ) 228cdf0e10cSrcweir aString = OUString( aBuff, lRet ); 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir return aString; 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir //------------------------------------------------------------ 235cdf0e10cSrcweir // 236cdf0e10cSrcweir //------------------------------------------------------------ 237cdf0e10cSrcweir 238cdf0e10cSrcweir void SAL_CALL ListboxAddItem( HWND hwnd, const Any& aItem, const Reference< XInterface >& rXInterface, sal_Int16 aArgPos ) 239cdf0e10cSrcweir throw( IllegalArgumentException ) 240cdf0e10cSrcweir { 241cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 242cdf0e10cSrcweir 243cdf0e10cSrcweir if ( !aItem.hasValue( ) || 244cdf0e10cSrcweir aItem.getValueType( ) != getCppuType((OUString*)0) ) 245cdf0e10cSrcweir throw IllegalArgumentException( 246cdf0e10cSrcweir OUString::createFromAscii( "invalid value type or any has no value" ), 247cdf0e10cSrcweir rXInterface, 248cdf0e10cSrcweir aArgPos ); 249cdf0e10cSrcweir 250cdf0e10cSrcweir OUString cbItem; 251cdf0e10cSrcweir aItem >>= cbItem; 252cdf0e10cSrcweir 253cdf0e10cSrcweir ListboxAddString( hwnd, cbItem ); 254cdf0e10cSrcweir } 255cdf0e10cSrcweir 256cdf0e10cSrcweir //------------------------------------------------------------ 257cdf0e10cSrcweir // 258cdf0e10cSrcweir //------------------------------------------------------------ 259cdf0e10cSrcweir 260cdf0e10cSrcweir void SAL_CALL ListboxAddItems( HWND hwnd, const Any& aItemList, const Reference< XInterface >& rXInterface, sal_Int16 aArgPos ) 261cdf0e10cSrcweir throw( IllegalArgumentException ) 262cdf0e10cSrcweir { 263cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 264cdf0e10cSrcweir 265cdf0e10cSrcweir if ( !aItemList.hasValue( ) || 266cdf0e10cSrcweir aItemList.getValueType( ) != getCppuType((Sequence<OUString>*)0) ) 267cdf0e10cSrcweir throw IllegalArgumentException( 268cdf0e10cSrcweir OUString::createFromAscii( "invalid value type or any has no value" ), 269cdf0e10cSrcweir rXInterface, 270cdf0e10cSrcweir aArgPos ); 271cdf0e10cSrcweir 272cdf0e10cSrcweir Sequence< OUString > aStringList; 273cdf0e10cSrcweir aItemList >>= aStringList; 274cdf0e10cSrcweir 275cdf0e10cSrcweir sal_Int32 nItemCount = aStringList.getLength( ); 276cdf0e10cSrcweir for( sal_Int32 i = 0; i < nItemCount; i++ ) 277cdf0e10cSrcweir { 278cdf0e10cSrcweir ListboxAddString( hwnd, aStringList[i] ); 279cdf0e10cSrcweir } 280cdf0e10cSrcweir } 281cdf0e10cSrcweir 282cdf0e10cSrcweir //------------------------------------------------------------ 283cdf0e10cSrcweir // 284cdf0e10cSrcweir //------------------------------------------------------------ 285cdf0e10cSrcweir 286cdf0e10cSrcweir void SAL_CALL ListboxDeleteItem( HWND hwnd, const Any& aPosition, const Reference< XInterface >& rXInterface, sal_Int16 aArgPos ) 287cdf0e10cSrcweir throw( IllegalArgumentException ) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 290cdf0e10cSrcweir 291cdf0e10cSrcweir if ( !aPosition.hasValue( ) || 292cdf0e10cSrcweir ( (aPosition.getValueType( ) != getCppuType((sal_Int32*)0)) && 293cdf0e10cSrcweir (aPosition.getValueType( ) != getCppuType((sal_Int16*)0)) && 294cdf0e10cSrcweir (aPosition.getValueType( ) != getCppuType((sal_Int8*)0)) ) ) 295cdf0e10cSrcweir throw IllegalArgumentException( 296cdf0e10cSrcweir OUString::createFromAscii( "invalid value type or any has no value" ), 297cdf0e10cSrcweir rXInterface, 298cdf0e10cSrcweir aArgPos ); 299cdf0e10cSrcweir 300cdf0e10cSrcweir sal_Int32 nPos; 301cdf0e10cSrcweir aPosition >>= nPos; 302cdf0e10cSrcweir 303cdf0e10cSrcweir LRESULT lRet = SendMessage( hwnd, CB_DELETESTRING, nPos, 0 ); 304cdf0e10cSrcweir 305cdf0e10cSrcweir // if the return value is CB_ERR the given 306cdf0e10cSrcweir // index was not correct 307cdf0e10cSrcweir if ( CB_ERR == lRet ) 308cdf0e10cSrcweir throw IllegalArgumentException( 309cdf0e10cSrcweir OUString::createFromAscii( "inavlid item position" ), 310cdf0e10cSrcweir rXInterface, 311cdf0e10cSrcweir aArgPos ); 312cdf0e10cSrcweir } 313cdf0e10cSrcweir 314cdf0e10cSrcweir //------------------------------------------------------------ 315cdf0e10cSrcweir // 316cdf0e10cSrcweir //------------------------------------------------------------ 317cdf0e10cSrcweir 318cdf0e10cSrcweir void SAL_CALL ListboxDeleteItems( HWND hwnd, const Any&, const Reference< XInterface >&, sal_Int16 ) 319cdf0e10cSrcweir throw( IllegalArgumentException ) 320cdf0e10cSrcweir { 321cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 322cdf0e10cSrcweir 323cdf0e10cSrcweir LRESULT lRet = 0; 324cdf0e10cSrcweir 325cdf0e10cSrcweir do 326cdf0e10cSrcweir { 327cdf0e10cSrcweir // the return value on success is the number 328cdf0e10cSrcweir // of remaining elements in the listbox 329cdf0e10cSrcweir lRet = SendMessageW( hwnd, CB_DELETESTRING, 0, 0 ); 330cdf0e10cSrcweir } 331cdf0e10cSrcweir while ( (lRet != CB_ERR) && (lRet > 0) ); 332cdf0e10cSrcweir } 333cdf0e10cSrcweir 334cdf0e10cSrcweir //------------------------------------------------------------ 335cdf0e10cSrcweir // 336cdf0e10cSrcweir //------------------------------------------------------------ 337cdf0e10cSrcweir 338cdf0e10cSrcweir void SAL_CALL ListboxSetSelectedItem( HWND hwnd, const Any& aPosition, const Reference< XInterface >& rXInterface, sal_Int16 aArgPos ) 339cdf0e10cSrcweir throw( IllegalArgumentException ) 340cdf0e10cSrcweir { 341cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 342cdf0e10cSrcweir 343cdf0e10cSrcweir if ( !aPosition.hasValue( ) || 344cdf0e10cSrcweir ( (aPosition.getValueType( ) != getCppuType((sal_Int32*)0)) && 345cdf0e10cSrcweir (aPosition.getValueType( ) != getCppuType((sal_Int16*)0)) && 346cdf0e10cSrcweir (aPosition.getValueType( ) != getCppuType((sal_Int8*)0)) ) ) 347cdf0e10cSrcweir throw IllegalArgumentException( 348cdf0e10cSrcweir OUString::createFromAscii( "invalid value type or any has no value" ), 349cdf0e10cSrcweir rXInterface, 350cdf0e10cSrcweir aArgPos ); 351cdf0e10cSrcweir 352cdf0e10cSrcweir sal_Int32 nPos; 353cdf0e10cSrcweir aPosition >>= nPos; 354cdf0e10cSrcweir 355cdf0e10cSrcweir if ( nPos < -1 ) 356cdf0e10cSrcweir throw IllegalArgumentException( 357cdf0e10cSrcweir OUString::createFromAscii("invalid index"), 358cdf0e10cSrcweir rXInterface, 359cdf0e10cSrcweir aArgPos ); 360cdf0e10cSrcweir 361cdf0e10cSrcweir LRESULT lRet = SendMessageW( hwnd, CB_SETCURSEL, nPos, 0 ); 362cdf0e10cSrcweir 363cdf0e10cSrcweir if ( (CB_ERR == lRet) && (-1 != nPos) ) 364cdf0e10cSrcweir throw IllegalArgumentException( 365cdf0e10cSrcweir OUString::createFromAscii("invalid index"), 366cdf0e10cSrcweir rXInterface, 367cdf0e10cSrcweir aArgPos ); 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir //------------------------------------------------------------ 371cdf0e10cSrcweir // 372cdf0e10cSrcweir //------------------------------------------------------------ 373cdf0e10cSrcweir 374cdf0e10cSrcweir Any SAL_CALL ListboxGetItems( HWND hwnd ) 375cdf0e10cSrcweir { 376cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 377cdf0e10cSrcweir 378cdf0e10cSrcweir LRESULT nItemCount = SendMessageW( hwnd, CB_GETCOUNT, 0, 0 ); 379cdf0e10cSrcweir 380cdf0e10cSrcweir Sequence< OUString > aItemList; 381cdf0e10cSrcweir 382cdf0e10cSrcweir if ( CB_ERR != nItemCount ) 383cdf0e10cSrcweir { 384cdf0e10cSrcweir aItemList.realloc( nItemCount ); 385cdf0e10cSrcweir 386cdf0e10cSrcweir for ( sal_Int32 i = 0; i < nItemCount; i++ ) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir aItemList[i] = ListboxGetString( hwnd, i ); 389cdf0e10cSrcweir } 390cdf0e10cSrcweir } 391cdf0e10cSrcweir 392cdf0e10cSrcweir Any aAny; 393cdf0e10cSrcweir aAny <<= aItemList; 394cdf0e10cSrcweir 395cdf0e10cSrcweir return aAny; 396cdf0e10cSrcweir } 397cdf0e10cSrcweir 398cdf0e10cSrcweir //------------------------------------------------------------ 399cdf0e10cSrcweir // 400cdf0e10cSrcweir //------------------------------------------------------------ 401cdf0e10cSrcweir 402cdf0e10cSrcweir Any SAL_CALL ListboxGetSelectedItem( HWND hwnd ) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 405cdf0e10cSrcweir 406cdf0e10cSrcweir LRESULT idxItem = SendMessageW( hwnd, CB_GETCURSEL, 0, 0 ); 407cdf0e10cSrcweir 408cdf0e10cSrcweir Any aAny; 409cdf0e10cSrcweir aAny <<= ListboxGetString( hwnd, idxItem ); 410cdf0e10cSrcweir 411cdf0e10cSrcweir return aAny; 412cdf0e10cSrcweir } 413cdf0e10cSrcweir 414cdf0e10cSrcweir //------------------------------------------------------------ 415cdf0e10cSrcweir // 416cdf0e10cSrcweir //------------------------------------------------------------ 417cdf0e10cSrcweir 418cdf0e10cSrcweir Any SAL_CALL ListboxGetSelectedItemIndex( HWND hwnd ) 419cdf0e10cSrcweir { 420cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 421cdf0e10cSrcweir 422cdf0e10cSrcweir LRESULT idxItem = SendMessageW( hwnd, CB_GETCURSEL, 0, 0 ); 423cdf0e10cSrcweir 424cdf0e10cSrcweir Any aAny; 425cdf0e10cSrcweir aAny <<= static_cast< sal_Int32 >( idxItem ); 426cdf0e10cSrcweir 427cdf0e10cSrcweir return aAny; 428cdf0e10cSrcweir } 429cdf0e10cSrcweir 430cdf0e10cSrcweir //------------------------------------------------------------ 431cdf0e10cSrcweir // 432cdf0e10cSrcweir //------------------------------------------------------------ 433cdf0e10cSrcweir 434cdf0e10cSrcweir Any SAL_CALL CheckboxGetState( HWND hwnd ) 435cdf0e10cSrcweir { 436cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 437cdf0e10cSrcweir 438cdf0e10cSrcweir LRESULT lChkState = SendMessageW( hwnd, BM_GETCHECK, 0, 0 ); 439cdf0e10cSrcweir sal_Bool bChkState = (lChkState == BST_CHECKED) ? sal_True : sal_False; 440cdf0e10cSrcweir Any aAny; 441cdf0e10cSrcweir aAny.setValue( &bChkState, getCppuType((sal_Bool*)0) ); 442cdf0e10cSrcweir return aAny; 443cdf0e10cSrcweir } 444cdf0e10cSrcweir 445cdf0e10cSrcweir //------------------------------------------------------------ 446cdf0e10cSrcweir // 447cdf0e10cSrcweir //------------------------------------------------------------ 448cdf0e10cSrcweir 449cdf0e10cSrcweir void SAL_CALL CheckboxSetState( 450cdf0e10cSrcweir HWND hwnd, const ::com::sun::star::uno::Any& aState, const Reference< XInterface >& rXInterface, sal_Int16 aArgPos ) 451cdf0e10cSrcweir throw( IllegalArgumentException ) 452cdf0e10cSrcweir { 453cdf0e10cSrcweir OSL_ASSERT( IsWindow( hwnd ) ); 454cdf0e10cSrcweir 455cdf0e10cSrcweir if ( !aState.hasValue( ) || 456cdf0e10cSrcweir aState.getValueType( ) != getCppuType((sal_Bool*)0) ) 457cdf0e10cSrcweir throw IllegalArgumentException( 458cdf0e10cSrcweir OUString::createFromAscii( "invalid value type or any has no value" ), 459cdf0e10cSrcweir rXInterface, 460cdf0e10cSrcweir aArgPos ); 461cdf0e10cSrcweir 462cdf0e10cSrcweir sal_Bool bCheckState = *reinterpret_cast< const sal_Bool* >( aState.getValue( ) ); 463cdf0e10cSrcweir WPARAM wParam = bCheckState ? BST_CHECKED : BST_UNCHECKED; 464cdf0e10cSrcweir SendMessageW( hwnd, BM_SETCHECK, wParam, 0 ); 465cdf0e10cSrcweir } 466cdf0e10cSrcweir 467cdf0e10cSrcweir //------------------------------------------------------------ 468cdf0e10cSrcweir // 469cdf0e10cSrcweir //------------------------------------------------------------ 470cdf0e10cSrcweir 471cdf0e10cSrcweir sal_uInt32 SAL_CALL _wcslenex( const sal_Unicode* pStr ) 472cdf0e10cSrcweir { 473cdf0e10cSrcweir if ( !pStr ) 474cdf0e10cSrcweir return 0; 475cdf0e10cSrcweir 476cdf0e10cSrcweir const sal_Unicode* pTemp = pStr; 477cdf0e10cSrcweir sal_uInt32 strLen = 0; 478cdf0e10cSrcweir while( *pTemp || *(pTemp + 1) ) 479cdf0e10cSrcweir { 480cdf0e10cSrcweir pTemp++; 481cdf0e10cSrcweir strLen++; 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir return strLen; 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir //------------------------------------------------------------ 488cdf0e10cSrcweir // 489cdf0e10cSrcweir //------------------------------------------------------------ 490cdf0e10cSrcweir 491cdf0e10cSrcweir void Replace( const OUString& aLabel, sal_Unicode OldChar, sal_Unicode NewChar, OUStringBuffer& aBuffer ) 492cdf0e10cSrcweir { 493cdf0e10cSrcweir OSL_ASSERT( aLabel.getLength( ) ); 494cdf0e10cSrcweir OSL_ASSERT( aBuffer.getCapacity( ) >= (aLabel.getLength( )) ); 495cdf0e10cSrcweir 496cdf0e10cSrcweir sal_Int32 i = 0; 497cdf0e10cSrcweir const sal_Unicode* pCurrent = aLabel.getStr( ); 498cdf0e10cSrcweir const sal_Unicode* pNext = aLabel.getStr( ) + 1; 499cdf0e10cSrcweir const sal_Unicode* pEnd = aLabel.getStr( ) + aLabel.getLength( ); 500cdf0e10cSrcweir 501cdf0e10cSrcweir while( pCurrent < pEnd ) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir OSL_ASSERT( pNext <= pEnd ); 504cdf0e10cSrcweir OSL_ASSERT( (i >= 0) && (i < aBuffer.getCapacity( )) ); 505cdf0e10cSrcweir 506cdf0e10cSrcweir if ( OldChar == *pCurrent ) 507cdf0e10cSrcweir { 508cdf0e10cSrcweir if ( OldChar == *pNext ) 509cdf0e10cSrcweir { 510cdf0e10cSrcweir // two OldChars in line will 511cdf0e10cSrcweir // be replaced by one 512cdf0e10cSrcweir // e.g. ~~ -> ~ 513cdf0e10cSrcweir aBuffer.insert( i, *pCurrent ); 514cdf0e10cSrcweir 515cdf0e10cSrcweir // skip the next one 516cdf0e10cSrcweir pCurrent++; 517cdf0e10cSrcweir pNext++; 518cdf0e10cSrcweir } 519cdf0e10cSrcweir else 520cdf0e10cSrcweir { 521cdf0e10cSrcweir // one OldChar will be replace 522cdf0e10cSrcweir // by NexChar 523cdf0e10cSrcweir aBuffer.insert( i, NewChar ); 524cdf0e10cSrcweir } 525cdf0e10cSrcweir } 526cdf0e10cSrcweir else if ( *pCurrent == NewChar ) 527cdf0e10cSrcweir { 528cdf0e10cSrcweir // a NewChar will be replaced by 529cdf0e10cSrcweir // two NewChars 530cdf0e10cSrcweir // e.g. & -> && 531cdf0e10cSrcweir aBuffer.insert( i++, *pCurrent ); 532cdf0e10cSrcweir aBuffer.insert( i, *pCurrent ); 533cdf0e10cSrcweir } 534cdf0e10cSrcweir else 535cdf0e10cSrcweir { 536cdf0e10cSrcweir aBuffer.insert( i, *pCurrent ); 537cdf0e10cSrcweir } 538cdf0e10cSrcweir 539cdf0e10cSrcweir pCurrent++; 540cdf0e10cSrcweir pNext++; 541cdf0e10cSrcweir i++; 542cdf0e10cSrcweir } 543cdf0e10cSrcweir } 544cdf0e10cSrcweir 545cdf0e10cSrcweir //------------------------------------------------------------ 546cdf0e10cSrcweir // converts a soffice label to a windows label 547cdf0e10cSrcweir // the following rules for character replacements 548cdf0e10cSrcweir // will be done: 549cdf0e10cSrcweir // '~' -> '&' 550cdf0e10cSrcweir // '~~' -> '~' 551cdf0e10cSrcweir // '&' -> '&&' 552cdf0e10cSrcweir //------------------------------------------------------------ 553cdf0e10cSrcweir 554cdf0e10cSrcweir OUString SOfficeToWindowsLabel( const rtl::OUString& aSOLabel ) 555cdf0e10cSrcweir { 556cdf0e10cSrcweir OUString aWinLabel = aSOLabel; 557cdf0e10cSrcweir 558cdf0e10cSrcweir if ( (aWinLabel.indexOf( TILDE ) > -1) || (aWinLabel.indexOf( AMPERSAND ) > -1) ) 559cdf0e10cSrcweir { 560cdf0e10cSrcweir sal_Int32 nStrLen = aWinLabel.getLength( ); 561cdf0e10cSrcweir 562cdf0e10cSrcweir // in the worst case the new string is 563cdf0e10cSrcweir // doubled in length, maybe some waste 564cdf0e10cSrcweir // of memory but how long is a label 565*2e3a1b6eSmseidel // normally(?) 566cdf0e10cSrcweir rtl::OUStringBuffer aBuffer( nStrLen * 2 ); 567cdf0e10cSrcweir 568cdf0e10cSrcweir Replace( aWinLabel, TILDE_SIGN, AMPERSAND_SIGN, aBuffer ); 569cdf0e10cSrcweir 570cdf0e10cSrcweir aWinLabel = aBuffer.makeStringAndClear( ); 571cdf0e10cSrcweir } 572cdf0e10cSrcweir 573cdf0e10cSrcweir return aWinLabel; 574cdf0e10cSrcweir } 575cdf0e10cSrcweir 576cdf0e10cSrcweir //------------------------------------------------------------ 577cdf0e10cSrcweir // converts a windows label to a soffice label 578cdf0e10cSrcweir // the following rules for character replacements 579cdf0e10cSrcweir // will be done: 580cdf0e10cSrcweir // '&' -> '~' 581cdf0e10cSrcweir // '&&' -> '&' 582cdf0e10cSrcweir // '~' -> '~~' 583cdf0e10cSrcweir //------------------------------------------------------------ 584cdf0e10cSrcweir 585cdf0e10cSrcweir OUString WindowsToSOfficeLabel( const rtl::OUString& aWinLabel ) 586cdf0e10cSrcweir { 587cdf0e10cSrcweir OUString aSOLabel = aWinLabel; 588cdf0e10cSrcweir 589cdf0e10cSrcweir if ( (aSOLabel.indexOf( TILDE ) > -1) || (aSOLabel.indexOf( AMPERSAND ) > -1) ) 590cdf0e10cSrcweir { 591cdf0e10cSrcweir sal_Int32 nStrLen = aSOLabel.getLength( ); 592cdf0e10cSrcweir 593cdf0e10cSrcweir // in the worst case the new string is 594cdf0e10cSrcweir // doubled in length, maybe some waste 595cdf0e10cSrcweir // of memory but how long is a label 596*2e3a1b6eSmseidel // normally(?) 597cdf0e10cSrcweir rtl::OUStringBuffer aBuffer( nStrLen * 2 ); 598cdf0e10cSrcweir 599cdf0e10cSrcweir Replace( aSOLabel, AMPERSAND_SIGN, TILDE_SIGN, aBuffer ); 600cdf0e10cSrcweir 601cdf0e10cSrcweir aSOLabel = aBuffer.makeStringAndClear( ); 602cdf0e10cSrcweir } 603cdf0e10cSrcweir 604cdf0e10cSrcweir return aSOLabel; 605cdf0e10cSrcweir } 606cdf0e10cSrcweir 607