xref: /trunk/main/sw/source/ui/uno/dlelstnr.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 
32 
33 
34 #include <com/sun/star/linguistic2/DictionaryListEventFlags.hpp>
35 #include <com/sun/star/linguistic2/XDictionaryList.hpp>
36 #include <com/sun/star/linguistic2/XLinguServiceManager.hpp>
37 #include <com/sun/star/linguistic2/XLinguServiceEventBroadcaster.hpp>
38 #include <com/sun/star/linguistic2/XProofreadingIterator.hpp>
39 #include <com/sun/star/linguistic2/LinguServiceEventFlags.hpp>
40 
41 #include <unotools/lingucfg.hxx>
42 
43 #include <com/sun/star/uno/Reference.h>
44 #include <comphelper/processfactory.hxx>
45 #include <vos/mutex.hxx>
46 #include <vcl/svapp.hxx>
47 #include <tools/shl.hxx>
48 #include "dlelstnr.hxx"
49 #include <swmodule.hxx>
50 #include <wrtsh.hxx>
51 #include <view.hxx>
52 
53 
54 using ::rtl::OUString;
55 using namespace ::com::sun::star;
56 using namespace ::com::sun::star::lang;
57 using namespace ::com::sun::star::frame;
58 using namespace ::com::sun::star::uno;
59 using namespace ::com::sun::star::linguistic2;
60 using namespace ::com::sun::star::linguistic2::LinguServiceEventFlags;
61 
62 #define A2OU(x)	OUString::createFromAscii(x)
63 
64 /* -----------------------------17.03.00 09:07--------------------------------
65 
66  ---------------------------------------------------------------------------*/
67 SwLinguServiceEventListener::SwLinguServiceEventListener()
68 {
69 	Reference< XMultiServiceFactory > xMgr( comphelper::getProcessServiceFactory() );
70 	if (xMgr.is())
71 	{
72         try
73         {
74             OUString aSvcName( A2OU( "com.sun.star.frame.Desktop" ) );
75             xDesktop = Reference< frame::XDesktop >(
76                     xMgr->createInstance( aSvcName ), UNO_QUERY );
77             if (xDesktop.is())
78                 xDesktop->addTerminateListener( this );
79 
80             aSvcName = A2OU( "com.sun.star.linguistic2.LinguServiceManager" );
81             xLngSvcMgr = Reference< XLinguServiceManager >( xMgr->createInstance( aSvcName ), UNO_QUERY );
82             if (xLngSvcMgr.is())
83                 xLngSvcMgr->addLinguServiceManagerListener( (XLinguServiceEventListener *) this );
84 
85             if (SvtLinguConfig().HasGrammarChecker())
86             {
87                 aSvcName = A2OU( "com.sun.star.linguistic2.ProofreadingIterator" );
88                 xGCIterator = Reference< XProofreadingIterator >( xMgr->createInstance( aSvcName ), UNO_QUERY );
89                 Reference< XLinguServiceEventBroadcaster > xBC( xGCIterator, UNO_QUERY );
90                 if (xBC.is())
91                     xBC->addLinguServiceEventListener( (XLinguServiceEventListener *) this );
92             }
93         }
94         catch (uno::Exception &)
95         {
96             DBG_ASSERT(0, "exception caught in SwLinguServiceEventListener c-tor" );
97         }
98 	}
99 }
100 /* -----------------------------17.03.00 09:07--------------------------------
101 
102  ---------------------------------------------------------------------------*/
103 SwLinguServiceEventListener::~SwLinguServiceEventListener()
104 {
105 }
106 
107 /* -----------------------------17.03.00 09:06--------------------------------
108 
109  ---------------------------------------------------------------------------*/
110 
111 void SwLinguServiceEventListener::processDictionaryListEvent(
112 			const DictionaryListEvent& rDicListEvent)
113 		throw( RuntimeException )
114 {
115 	vos::OGuard aGuard(Application::GetSolarMutex());
116 
117 	sal_Int16 nEvt = rDicListEvent.nCondensedEvent;
118 
119 	sal_Int16 nSpellWrongFlags =
120 			DictionaryListEventFlags::ADD_POS_ENTRY 	|
121 			DictionaryListEventFlags::DEL_NEG_ENTRY		|
122 			DictionaryListEventFlags::ACTIVATE_POS_DIC	|
123 			DictionaryListEventFlags::DEACTIVATE_NEG_DIC;
124 	sal_Bool bIsSpellWrong	=  0 != (nEvt & nSpellWrongFlags);
125 	sal_Int16 nSpellAllFlags =
126 			DictionaryListEventFlags::ADD_NEG_ENTRY		|
127 			DictionaryListEventFlags::DEL_POS_ENTRY		|
128 			DictionaryListEventFlags::ACTIVATE_NEG_DIC	|
129 			DictionaryListEventFlags::DEACTIVATE_POS_DIC;
130 	sal_Bool bIsSpellAll	=  0 != (nEvt & nSpellAllFlags);
131 
132 	if (bIsSpellWrong || bIsSpellAll)
133 		SW_MOD()->CheckSpellChanges( sal_False, bIsSpellWrong, bIsSpellAll, sal_False );
134 }
135 
136 
137 void SAL_CALL SwLinguServiceEventListener::processLinguServiceEvent(
138 			const LinguServiceEvent& rLngSvcEvent )
139 		throw(RuntimeException)
140 {
141 	vos::OGuard aGuard(Application::GetSolarMutex());
142 
143 	sal_Bool bIsSpellWrong = 0 != (rLngSvcEvent.nEvent & SPELL_WRONG_WORDS_AGAIN);
144 	sal_Bool bIsSpellAll   = 0 != (rLngSvcEvent.nEvent & SPELL_CORRECT_WORDS_AGAIN);
145     if (0 != (rLngSvcEvent.nEvent & PROOFREAD_AGAIN))
146         bIsSpellWrong = bIsSpellAll = sal_True;     // have all spelling and grammar checked...
147 	if (bIsSpellWrong || bIsSpellAll)
148 	{
149 		SW_MOD()->CheckSpellChanges( sal_False, bIsSpellWrong, bIsSpellAll, sal_False );
150 	}
151 	if (rLngSvcEvent.nEvent & HYPHENATE_AGAIN)
152 	{
153 		SwView *pSwView = SW_MOD()->GetFirstView();
154 
155         //!! since this function may be called within the ctor of
156         //!! SwView (during formatting) where the WrtShell is not yet
157         //!! created, we have to check for the WrtShellPtr to see
158         //!! if it is already availbale
159         while (pSwView && pSwView->GetWrtShellPtr())
160 		{
161 			pSwView->GetWrtShell().ChgHyphenation();
162 			pSwView = SW_MOD()->GetNextView( pSwView );
163 		}
164 	}
165 }
166 
167 
168 void SAL_CALL SwLinguServiceEventListener::disposing(
169 			const EventObject& rEventObj )
170 		throw(RuntimeException)
171 {
172 	vos::OGuard aGuard(Application::GetSolarMutex());
173 
174 	if (xLngSvcMgr.is()  &&  rEventObj.Source == xLngSvcMgr)
175 		xLngSvcMgr = 0;
176     if (xLngSvcMgr.is()  &&  rEventObj.Source == xGCIterator)
177         xGCIterator = 0;
178 }
179 
180 
181 void SAL_CALL SwLinguServiceEventListener::queryTermination(
182 			const EventObject& /*rEventObj*/ )
183 		throw(TerminationVetoException, RuntimeException)
184 {
185 	//vos::OGuard aGuard(Application::GetSolarMutex());
186 }
187 
188 
189 void SAL_CALL SwLinguServiceEventListener::notifyTermination(
190 			const EventObject& rEventObj )
191 		throw(RuntimeException)
192 {
193 	vos::OGuard aGuard(Application::GetSolarMutex());
194 
195 	if (xDesktop.is()  &&  rEventObj.Source == xDesktop)
196 	{
197 		if (xLngSvcMgr.is())
198 			xLngSvcMgr = 0;
199         if (xGCIterator.is())
200             xGCIterator = 0;
201 		xDesktop = NULL;
202 	}
203 }
204 
205