1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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
>
49 com::sun::star::uno::WeakReference
<com::sun::star::beans::XPropertyChangeListener
> mxOwner
;
52 WeakPropertyChangeListener(com::sun::star::uno::Reference
<com::sun::star::beans::XPropertyChangeListener
> 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
);
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
);
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
),
91 void ImeStatusWindow::init()
93 if (Application::CanToggleImeStatusWindow())
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()
113 if (getConfig()->getPropertyValue(OUString("ShowStatusWindow")) >>= 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:
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"),
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
);
178 ImeStatusWindow::propertyChange(css::beans::PropertyChangeEvent
const & )
179 throw (css::uno::RuntimeException
, std::exception
)
181 SolarMutexGuard aGuard
;
182 SfxApplication
* pApp
= SfxApplication::Get();
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
;
192 osl::MutexGuard
aGuard(m_aMutex
);
196 throw css::lang::DisposedException();
197 if (!m_xContext
.is())
198 throw css::uno::RuntimeException(
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,
208 "/org.openoffice.Office.Common/I18N/InputMethod")),
209 css::beans::PropertyState_DIRECT_VALUE
);
210 css::uno::Sequence
< css::uno::Any
> aArgs(1);
213 = css::uno::Reference
< css::beans::XPropertySet
>(
214 xProvider
->createInstanceWithArguments(
216 "com.sun.star.configuration.ConfigurationUpdateAccess"),
218 css::uno::UNO_QUERY
);
220 throw css::uno::RuntimeException(
222 "null com.sun.star.configuration."
223 "ConfigurationUpdateAccess"),
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"),
242 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */