Branch libreoffice-5-0-4
[LibreOffice.git] / sfx2 / source / appl / imestatuswindow.cxx
blob2d4416d93b45ea0d645a01ff435a15a3386da892
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, std::exception) SAL_OVERRIDE
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, std::exception) SAL_OVERRIDE
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 bool bShow;
97 if (getConfig()->getPropertyValue(OUString("ShowStatusWindow")) >>= bShow)
98 Application::ShowImeStatusWindow(bShow);
100 catch (css::uno::Exception &)
102 OSL_FAIL("com.sun.star.uno.Exception");
103 // Degrade gracefully and use the VCL-supplied default if no
104 // configuration is available.
108 bool ImeStatusWindow::isShowing()
112 bool bShow(false);
113 if (getConfig()->getPropertyValue(OUString("ShowStatusWindow")) >>= bShow)
114 return bShow;
116 catch (css::uno::Exception &)
118 OSL_FAIL("com.sun.star.uno.Exception");
119 // Degrade gracefully and use the VCL-supplied default if no
120 // configuration is available.
122 return Application::GetShowImeStatusWindowDefault();
125 void ImeStatusWindow::show(bool bShow)
129 css::uno::Reference< css::beans::XPropertySet > xConfig(getConfig());
130 xConfig->setPropertyValue(
131 OUString("ShowStatusWindow"),
132 css::uno::makeAny(bShow));
133 css::uno::Reference< css::util::XChangesBatch > xCommit(
134 xConfig, css::uno::UNO_QUERY);
135 // Degrade gracefully by not saving the settings permanently:
136 if (xCommit.is())
137 xCommit->commitChanges();
138 // Alternatively, setting the VCL status could be done even if updating
139 // the configuration failed:
140 Application::ShowImeStatusWindow(bShow);
142 catch (css::uno::Exception &)
144 OSL_FAIL("com.sun.star.uno.Exception");
148 bool ImeStatusWindow::canToggle()
150 return Application::CanToggleImeStatusWindow();
153 ImeStatusWindow::~ImeStatusWindow()
155 if (m_xConfig.is() && m_xConfigListener.is())
156 // We should never get here, but just in case...
159 m_xConfig->removePropertyChangeListener(
160 OUString("ShowStatusWindow"),
161 m_xConfigListener);
163 catch (css::uno::Exception &)
165 OSL_FAIL("com.sun.star.uno.RuntimeException");
169 void SAL_CALL ImeStatusWindow::disposing(css::lang::EventObject const & )
170 throw (css::uno::RuntimeException, std::exception)
172 osl::MutexGuard aGuard(m_aMutex);
173 m_xConfig = 0;
174 m_bDisposed = true;
177 void SAL_CALL
178 ImeStatusWindow::propertyChange(css::beans::PropertyChangeEvent const & )
179 throw (css::uno::RuntimeException, std::exception)
181 SolarMutexGuard aGuard;
182 SfxApplication* pApp = SfxApplication::Get();
183 if (pApp)
184 pApp->Invalidate(SID_SHOW_IME_STATUS_WINDOW);
187 css::uno::Reference< css::beans::XPropertySet > ImeStatusWindow::getConfig()
189 css::uno::Reference< css::beans::XPropertySet > xConfig;
190 bool bAdd = false;
192 osl::MutexGuard aGuard(m_aMutex);
193 if (!m_xConfig.is())
195 if (m_bDisposed)
196 throw css::lang::DisposedException();
197 if (!m_xContext.is())
198 throw css::uno::RuntimeException(
199 OUString(
200 "null comphelper::getProcessServiceFactory"),
202 css::uno::Reference< css::lang::XMultiServiceFactory > xProvider =
203 css::configuration::theDefaultProvider::get( m_xContext );
204 css::beans::PropertyValue aArg(
205 OUString("nodepath"), -1,
206 css::uno::makeAny(
207 OUString(
208 "/org.openoffice.Office.Common/I18N/InputMethod")),
209 css::beans::PropertyState_DIRECT_VALUE);
210 css::uno::Sequence< css::uno::Any > aArgs(1);
211 aArgs[0] <<= aArg;
212 m_xConfig
213 = css::uno::Reference< css::beans::XPropertySet >(
214 xProvider->createInstanceWithArguments(
215 OUString(
216 "com.sun.star.configuration.ConfigurationUpdateAccess"),
217 aArgs),
218 css::uno::UNO_QUERY);
219 if (!m_xConfig.is())
220 throw css::uno::RuntimeException(
221 OUString(
222 "null com.sun.star.configuration."
223 "ConfigurationUpdateAccess"),
225 bAdd = true;
227 xConfig = m_xConfig;
229 if (bAdd)
231 // Exceptions here could be handled individually, to support graceful
232 // degradation (no update notification mechanism in this case---but also
233 // no dispose notifications):
234 m_xConfigListener = new WeakPropertyChangeListener(this);
235 xConfig->addPropertyChangeListener(
236 OUString("ShowStatusWindow"),
237 m_xConfigListener);
239 return xConfig;
242 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */