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_sfx2.hxx" 26 27 #include "imestatuswindow.hxx" 28 29 #include <sfx2/app.hxx> 30 #include <sfx2/sfxsids.hrc> 31 32 #include "com/sun/star/beans/PropertyState.hpp" 33 #include "com/sun/star/beans/PropertyValue.hpp" 34 #include "com/sun/star/beans/XPropertySet.hpp" 35 #include "com/sun/star/lang/DisposedException.hpp" 36 #include "com/sun/star/lang/XMultiServiceFactory.hpp" 37 #include "com/sun/star/uno/Any.hxx" 38 #include "com/sun/star/uno/Exception.hpp" 39 #include "com/sun/star/uno/Reference.hxx" 40 #include "com/sun/star/uno/RuntimeException.hpp" 41 #include "com/sun/star/uno/Sequence.hxx" 42 #include "com/sun/star/util/XChangesBatch.hpp" 43 #include "osl/diagnose.h" 44 #include "osl/mutex.hxx" 45 #include "rtl/ustring.h" 46 #include "rtl/ustring.hxx" 47 #include "sal/types.h" 48 #include "vcl/svapp.hxx" 49 #include "vos/mutex.hxx" 50 51 namespace css = com::sun::star; 52 53 using sfx2::appl::ImeStatusWindow; 54 55 ImeStatusWindow::ImeStatusWindow( 56 css::uno::Reference< css::lang::XMultiServiceFactory > const & 57 rServiceFactory): 58 m_xServiceFactory(rServiceFactory), 59 m_bDisposed(false) 60 {} 61 62 void ImeStatusWindow::init() 63 { 64 if (Application::CanToggleImeStatusWindow()) 65 try 66 { 67 sal_Bool bShow = sal_Bool(); 68 if (getConfig()->getPropertyValue( 69 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 70 "ShowStatusWindow"))) 71 >>= bShow) 72 Application::ShowImeStatusWindow(bShow); 73 } 74 catch (css::uno::Exception &) 75 { 76 OSL_ENSURE(false, "com.sun.star.uno.Exception"); 77 // Degrade gracefully and use the VCL-supplied default if no 78 // configuration is available. 79 } 80 } 81 82 bool ImeStatusWindow::isShowing() 83 { 84 try 85 { 86 sal_Bool bShow = sal_Bool(); 87 if (getConfig()->getPropertyValue( 88 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowStatusWindow"))) 89 >>= bShow) 90 return bShow; 91 } 92 catch (css::uno::Exception &) 93 { 94 OSL_ENSURE(false, "com.sun.star.uno.Exception"); 95 // Degrade gracefully and use the VCL-supplied default if no 96 // configuration is available. 97 } 98 return Application::GetShowImeStatusWindowDefault(); 99 } 100 101 void ImeStatusWindow::show(bool bShow) 102 { 103 try 104 { 105 css::uno::Reference< css::beans::XPropertySet > xConfig(getConfig()); 106 xConfig->setPropertyValue( 107 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowStatusWindow")), 108 css::uno::makeAny(static_cast< sal_Bool >(bShow))); 109 css::uno::Reference< css::util::XChangesBatch > xCommit( 110 xConfig, css::uno::UNO_QUERY); 111 // Degrade gracefully by not saving the settings permanently: 112 if (xCommit.is()) 113 xCommit->commitChanges(); 114 // Alternatively, setting the VCL status could be done even if updating 115 // the configuration failed: 116 Application::ShowImeStatusWindow(bShow); 117 } 118 catch (css::uno::Exception &) 119 { 120 OSL_ENSURE(false, "com.sun.star.uno.Exception"); 121 } 122 } 123 124 bool ImeStatusWindow::canToggle() const 125 { 126 return Application::CanToggleImeStatusWindow(); 127 } 128 129 ImeStatusWindow::~ImeStatusWindow() 130 { 131 if (m_xConfig.is()) 132 // We should never get here, but just in case... 133 try 134 { 135 m_xConfig->removePropertyChangeListener( 136 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowStatusWindow")), 137 this); 138 } 139 catch (css::uno::Exception &) 140 { 141 OSL_ENSURE(false, "com.sun.star.uno.RuntimeException"); 142 } 143 } 144 145 void SAL_CALL ImeStatusWindow::disposing(css::lang::EventObject const & ) 146 throw (css::uno::RuntimeException) 147 { 148 osl::MutexGuard aGuard(m_aMutex); 149 m_xConfig = 0; 150 m_bDisposed = true; 151 } 152 153 void SAL_CALL 154 ImeStatusWindow::propertyChange(css::beans::PropertyChangeEvent const & ) 155 throw (css::uno::RuntimeException) 156 { 157 vos::OGuard aGuard(Application::GetSolarMutex()); 158 SfxApplication* pApp = SfxApplication::Get(); 159 if (pApp) 160 pApp->Invalidate(SID_SHOW_IME_STATUS_WINDOW); 161 } 162 163 css::uno::Reference< css::beans::XPropertySet > ImeStatusWindow::getConfig() 164 { 165 css::uno::Reference< css::beans::XPropertySet > xConfig; 166 bool bAdd = false; 167 { 168 osl::MutexGuard aGuard(m_aMutex); 169 if (!m_xConfig.is()) 170 { 171 if (m_bDisposed) 172 throw css::lang::DisposedException(); 173 if (!m_xServiceFactory.is()) 174 throw css::uno::RuntimeException( 175 rtl::OUString( 176 RTL_CONSTASCII_USTRINGPARAM( 177 "null comphelper::getProcessServiceFactory")), 178 0); 179 css::uno::Reference< css::lang::XMultiServiceFactory > xProvider( 180 m_xServiceFactory->createInstance( 181 rtl::OUString( 182 RTL_CONSTASCII_USTRINGPARAM( 183 "com.sun.star.configuration.ConfigurationProvider"))), 184 css::uno::UNO_QUERY); 185 if (!xProvider.is()) 186 throw css::uno::RuntimeException( 187 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 188 "null com.sun.star.configuration." 189 "ConfigurationProvider")), 190 0); 191 css::beans::PropertyValue aArg( 192 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")), -1, 193 css::uno::makeAny( 194 rtl::OUString( 195 RTL_CONSTASCII_USTRINGPARAM( 196 "/org.openoffice.Office.Common/I18N/InputMethod"))), 197 css::beans::PropertyState_DIRECT_VALUE); 198 css::uno::Sequence< css::uno::Any > aArgs(1); 199 aArgs[0] <<= aArg; 200 m_xConfig 201 = css::uno::Reference< css::beans::XPropertySet >( 202 xProvider->createInstanceWithArguments( 203 rtl::OUString( 204 RTL_CONSTASCII_USTRINGPARAM( 205 "com.sun.star.configuration.ConfigurationUpdateAccess")), 206 aArgs), 207 css::uno::UNO_QUERY); 208 if (!m_xConfig.is()) 209 throw css::uno::RuntimeException( 210 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 211 "null com.sun.star.configuration." 212 "ConfigurationUpdateAccess")), 213 0); 214 bAdd = true; 215 } 216 xConfig = m_xConfig; 217 } 218 if (bAdd) 219 // Exceptions here could be handled individually, to support graceful 220 // degradation (no update notification mechanism in this case---but also 221 // no dispose notifications): 222 xConfig->addPropertyChangeListener( 223 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowStatusWindow")), 224 this); 225 return xConfig; 226 } 227 228