bump product version to 4.2.0.1
[LibreOffice.git] / sfx2 / source / appl / imestatuswindow.cxx
blob453a3d1cf5d07a2d7c8d23b38a1fcdd48ec18a1c
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
21 #include "imestatuswindow.hxx"
23 #include <sfx2/app.hxx>
24 #include <sfx2/sfxsids.hrc>
26 #include <com/sun/star/beans/PropertyState.hpp>
27 #include <com/sun/star/beans/PropertyValue.hpp>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/configuration/theDefaultProvider.hpp>
30 #include <com/sun/star/lang/DisposedException.hpp>
31 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32 #include <com/sun/star/uno/Any.hxx>
33 #include <com/sun/star/uno/Exception.hpp>
34 #include <com/sun/star/uno/Reference.hxx>
35 #include <com/sun/star/uno/RuntimeException.hpp>
36 #include <com/sun/star/uno/Sequence.hxx>
37 #include <com/sun/star/util/XChangesBatch.hpp>
38 #include <osl/diagnose.h>
39 #include <osl/mutex.hxx>
40 #include <rtl/ustring.h>
41 #include <rtl/ustring.hxx>
42 #include <sal/types.h>
43 #include <vcl/svapp.hxx>
45 //TO-Do, merge into framework/inc/helpers/mischelpers.hxx and deliver
46 class WeakPropertyChangeListener : public ::cppu::WeakImplHelper1<com::sun::star::beans::XPropertyChangeListener>
48 private:
49 com::sun::star::uno::WeakReference<com::sun::star::beans::XPropertyChangeListener> mxOwner;
51 public:
52 WeakPropertyChangeListener(com::sun::star::uno::Reference<com::sun::star::beans::XPropertyChangeListener> xOwner)
53 : mxOwner(xOwner)
57 virtual ~WeakPropertyChangeListener()
61 virtual void SAL_CALL propertyChange(const com::sun::star::beans::PropertyChangeEvent &rEvent )
62 throw(com::sun::star::uno::RuntimeException)
64 com::sun::star::uno::Reference<com::sun::star::beans::XPropertyChangeListener> xOwner(mxOwner.get(),
65 com::sun::star::uno::UNO_QUERY);
66 if (xOwner.is())
67 xOwner->propertyChange(rEvent);
71 // lang.XEventListener
72 virtual void SAL_CALL disposing(const com::sun::star::lang::EventObject& rEvent)
73 throw(com::sun::star::uno::RuntimeException)
75 com::sun::star::uno::Reference<com::sun::star::beans::XPropertyChangeListener> xOwner(mxOwner.get(),
76 com::sun::star::uno::UNO_QUERY);
77 if (xOwner.is())
78 xOwner->disposing(rEvent);
83 using sfx2::appl::ImeStatusWindow;
85 ImeStatusWindow::ImeStatusWindow(
86 css::uno::Reference< css::uno::XComponentContext > const & rxContext):
87 m_xContext(rxContext),
88 m_bDisposed(false)
91 void ImeStatusWindow::init()
93 if (Application::CanToggleImeStatusWindow())
94 try
96 sal_Bool bShow = sal_Bool();
97 if (getConfig()->getPropertyValue(
98 OUString(
99 "ShowStatusWindow"))
100 >>= bShow)
101 Application::ShowImeStatusWindow(bShow);
103 catch (css::uno::Exception &)
105 OSL_FAIL("com.sun.star.uno.Exception");
106 // Degrade gracefully and use the VCL-supplied default if no
107 // configuration is available.
111 bool ImeStatusWindow::isShowing()
115 sal_Bool bShow = sal_Bool();
116 if (getConfig()->getPropertyValue(
117 OUString("ShowStatusWindow"))
118 >>= bShow)
119 return bShow;
121 catch (css::uno::Exception &)
123 OSL_FAIL("com.sun.star.uno.Exception");
124 // Degrade gracefully and use the VCL-supplied default if no
125 // configuration is available.
127 return Application::GetShowImeStatusWindowDefault();
130 void ImeStatusWindow::show(bool bShow)
134 css::uno::Reference< css::beans::XPropertySet > xConfig(getConfig());
135 xConfig->setPropertyValue(
136 OUString("ShowStatusWindow"),
137 css::uno::makeAny(static_cast< sal_Bool >(bShow)));
138 css::uno::Reference< css::util::XChangesBatch > xCommit(
139 xConfig, css::uno::UNO_QUERY);
140 // Degrade gracefully by not saving the settings permanently:
141 if (xCommit.is())
142 xCommit->commitChanges();
143 // Alternatively, setting the VCL status could be done even if updating
144 // the configuration failed:
145 Application::ShowImeStatusWindow(bShow);
147 catch (css::uno::Exception &)
149 OSL_FAIL("com.sun.star.uno.Exception");
153 bool ImeStatusWindow::canToggle() const
155 return Application::CanToggleImeStatusWindow();
158 ImeStatusWindow::~ImeStatusWindow()
160 if (m_xConfig.is() && m_xConfigListener.is())
161 // We should never get here, but just in case...
164 m_xConfig->removePropertyChangeListener(
165 OUString("ShowStatusWindow"),
166 m_xConfigListener);
168 catch (css::uno::Exception &)
170 OSL_FAIL("com.sun.star.uno.RuntimeException");
174 void SAL_CALL ImeStatusWindow::disposing(css::lang::EventObject const & )
175 throw (css::uno::RuntimeException)
177 osl::MutexGuard aGuard(m_aMutex);
178 m_xConfig = 0;
179 m_bDisposed = true;
182 void SAL_CALL
183 ImeStatusWindow::propertyChange(css::beans::PropertyChangeEvent const & )
184 throw (css::uno::RuntimeException)
186 SolarMutexGuard aGuard;
187 SfxApplication* pApp = SfxApplication::Get();
188 if (pApp)
189 pApp->Invalidate(SID_SHOW_IME_STATUS_WINDOW);
192 css::uno::Reference< css::beans::XPropertySet > ImeStatusWindow::getConfig()
194 css::uno::Reference< css::beans::XPropertySet > xConfig;
195 bool bAdd = false;
197 osl::MutexGuard aGuard(m_aMutex);
198 if (!m_xConfig.is())
200 if (m_bDisposed)
201 throw css::lang::DisposedException();
202 if (!m_xContext.is())
203 throw css::uno::RuntimeException(
204 OUString(
205 "null comphelper::getProcessServiceFactory"),
207 css::uno::Reference< css::lang::XMultiServiceFactory > xProvider =
208 css::configuration::theDefaultProvider::get( m_xContext );
209 css::beans::PropertyValue aArg(
210 OUString("nodepath"), -1,
211 css::uno::makeAny(
212 OUString(
213 "/org.openoffice.Office.Common/I18N/InputMethod")),
214 css::beans::PropertyState_DIRECT_VALUE);
215 css::uno::Sequence< css::uno::Any > aArgs(1);
216 aArgs[0] <<= aArg;
217 m_xConfig
218 = css::uno::Reference< css::beans::XPropertySet >(
219 xProvider->createInstanceWithArguments(
220 OUString(
221 "com.sun.star.configuration.ConfigurationUpdateAccess"),
222 aArgs),
223 css::uno::UNO_QUERY);
224 if (!m_xConfig.is())
225 throw css::uno::RuntimeException(
226 OUString(
227 "null com.sun.star.configuration."
228 "ConfigurationUpdateAccess"),
230 bAdd = true;
232 xConfig = m_xConfig;
234 if (bAdd)
236 // Exceptions here could be handled individually, to support graceful
237 // degradation (no update notification mechanism in this case---but also
238 // no dispose notifications):
239 m_xConfigListener = new WeakPropertyChangeListener(this);
240 xConfig->addPropertyChangeListener(
241 OUString("ShowStatusWindow"),
242 m_xConfigListener);
244 return xConfig;
247 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */