1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // used interfaces
25*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext;
26*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiComponentFactory;
27*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XLinguServiceManager;
28*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XSpellChecker;
29*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XHyphenator;
30*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XThesaurus;
31*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XSpellAlternatives;
32*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XHyphenatedWord;
33*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XPossibleHyphens;
34*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XMeaning;
35*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XSearchableDictionaryList;
36*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.XLinguServiceEventListener;
37*b1cdbd2cSJim Jagielski import com.sun.star.linguistic2.LinguServiceEvent;
38*b1cdbd2cSJim Jagielski import com.sun.star.beans.XPropertySet;
39*b1cdbd2cSJim Jagielski import com.sun.star.beans.PropertyValue;
40*b1cdbd2cSJim Jagielski import com.sun.star.uno.XComponentContext;
41*b1cdbd2cSJim Jagielski import com.sun.star.uno.XNamingService;
42*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiComponentFactory;
43*b1cdbd2cSJim Jagielski import com.sun.star.lang.EventObject;
44*b1cdbd2cSJim Jagielski import com.sun.star.lang.Locale;
45*b1cdbd2cSJim Jagielski import com.sun.star.bridge.XUnoUrlResolver;
46*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
47*b1cdbd2cSJim Jagielski import com.sun.star.uno.Any;
48*b1cdbd2cSJim Jagielski import com.sun.star.lang.XComponent;
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski public class LinguisticExamples
51*b1cdbd2cSJim Jagielski {
52*b1cdbd2cSJim Jagielski     // The remote office ocntext
53*b1cdbd2cSJim Jagielski     protected XComponentContext mxRemoteContext = null;
54*b1cdbd2cSJim Jagielski     // The MultiServiceFactory interface of the Office
55*b1cdbd2cSJim Jagielski     protected XMultiComponentFactory mxRemoteServiceManager = null;
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski     // The LinguServiceManager interface
58*b1cdbd2cSJim Jagielski     protected XLinguServiceManager mxLinguSvcMgr = null;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski     // The SpellChecker interface
61*b1cdbd2cSJim Jagielski     protected XSpellChecker mxSpell = null;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski     // The Hyphenator interface
64*b1cdbd2cSJim Jagielski     protected XHyphenator mxHyph = null;
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski     // The Thesaurus interface
67*b1cdbd2cSJim Jagielski     protected XThesaurus  mxThes = null;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     // The DictionaryList interface
70*b1cdbd2cSJim Jagielski     protected XSearchableDictionaryList  mxDicList = null;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski     // The LinguProperties interface
73*b1cdbd2cSJim Jagielski     protected XPropertySet  mxLinguProps = null;
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski 
main(String args[])76*b1cdbd2cSJim Jagielski     public static void main(String args[])
77*b1cdbd2cSJim Jagielski 	{
78*b1cdbd2cSJim Jagielski 		// Create an instance of the class and call it's begin method
79*b1cdbd2cSJim Jagielski         try {
80*b1cdbd2cSJim Jagielski             LinguisticExamples aExample = new LinguisticExamples();
81*b1cdbd2cSJim Jagielski             aExample.Connect();
82*b1cdbd2cSJim Jagielski             aExample.Run();
83*b1cdbd2cSJim Jagielski         } catch (Exception e) {
84*b1cdbd2cSJim Jagielski             System.err.println("failed to run examples");
85*b1cdbd2cSJim Jagielski             e.printStackTrace();
86*b1cdbd2cSJim Jagielski         }
87*b1cdbd2cSJim Jagielski 	}
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski 
Connect()90*b1cdbd2cSJim Jagielski     public void Connect()
91*b1cdbd2cSJim Jagielski         throws java.lang.Exception
92*b1cdbd2cSJim Jagielski     {
93*b1cdbd2cSJim Jagielski         // get the remote office context. If necessary a new office
94*b1cdbd2cSJim Jagielski         // process is started
95*b1cdbd2cSJim Jagielski         mxRemoteContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
96*b1cdbd2cSJim Jagielski         System.out.println("Connected to a running office ...");
97*b1cdbd2cSJim Jagielski         mxRemoteServiceManager = mxRemoteContext.getServiceManager();
98*b1cdbd2cSJim Jagielski     }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski     /** Get the LinguServiceManager to be used. For example to access spell
102*b1cdbd2cSJim Jagielski         checker, thesaurus and hyphenator, also the component may choose to
103*b1cdbd2cSJim Jagielski         register itself as listener to it in order to get notified of relevant
104*b1cdbd2cSJim Jagielski         events. */
GetLinguSvcMgr()105*b1cdbd2cSJim Jagielski     public boolean GetLinguSvcMgr()
106*b1cdbd2cSJim Jagielski         throws com.sun.star.uno.Exception
107*b1cdbd2cSJim Jagielski     {
108*b1cdbd2cSJim Jagielski         if (mxRemoteContext != null && mxRemoteServiceManager != null) {
109*b1cdbd2cSJim Jagielski             Object aObj = mxRemoteServiceManager.createInstanceWithContext(
110*b1cdbd2cSJim Jagielski                 "com.sun.star.linguistic2.LinguServiceManager", mxRemoteContext );
111*b1cdbd2cSJim Jagielski             mxLinguSvcMgr = (XLinguServiceManager)
112*b1cdbd2cSJim Jagielski                     UnoRuntime.queryInterface(XLinguServiceManager.class, aObj);
113*b1cdbd2cSJim Jagielski         }
114*b1cdbd2cSJim Jagielski         return mxLinguSvcMgr != null;
115*b1cdbd2cSJim Jagielski     }
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     /** Get the SpellChecker to be used.
119*b1cdbd2cSJim Jagielski     */
GetSpell()120*b1cdbd2cSJim Jagielski     public boolean GetSpell()
121*b1cdbd2cSJim Jagielski         throws com.sun.star.uno.Exception,
122*b1cdbd2cSJim Jagielski         com.sun.star.uno.RuntimeException
123*b1cdbd2cSJim Jagielski     {
124*b1cdbd2cSJim Jagielski         if (mxLinguSvcMgr != null)
125*b1cdbd2cSJim Jagielski             mxSpell = mxLinguSvcMgr.getSpellChecker();
126*b1cdbd2cSJim Jagielski         return mxSpell != null;
127*b1cdbd2cSJim Jagielski     }
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski     /** Get the Hyphenator to be used.
130*b1cdbd2cSJim Jagielski     */
GetHyph()131*b1cdbd2cSJim Jagielski     public boolean GetHyph()
132*b1cdbd2cSJim Jagielski         throws com.sun.star.uno.Exception,
133*b1cdbd2cSJim Jagielski         com.sun.star.uno.RuntimeException
134*b1cdbd2cSJim Jagielski     {
135*b1cdbd2cSJim Jagielski         if (mxLinguSvcMgr != null)
136*b1cdbd2cSJim Jagielski             mxHyph = mxLinguSvcMgr.getHyphenator();
137*b1cdbd2cSJim Jagielski         return mxHyph != null;
138*b1cdbd2cSJim Jagielski     }
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski     /** Get the Thesaurus to be used.
141*b1cdbd2cSJim Jagielski     */
GetThes()142*b1cdbd2cSJim Jagielski     public boolean GetThes()
143*b1cdbd2cSJim Jagielski         throws com.sun.star.uno.Exception,
144*b1cdbd2cSJim Jagielski         com.sun.star.uno.RuntimeException
145*b1cdbd2cSJim Jagielski     {
146*b1cdbd2cSJim Jagielski         if (mxLinguSvcMgr != null)
147*b1cdbd2cSJim Jagielski             mxThes = mxLinguSvcMgr.getThesaurus();
148*b1cdbd2cSJim Jagielski         return mxThes != null;
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 
Run()152*b1cdbd2cSJim Jagielski     public void Run()
153*b1cdbd2cSJim Jagielski         throws Exception
154*b1cdbd2cSJim Jagielski     {
155*b1cdbd2cSJim Jagielski         GetLinguSvcMgr();
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski         // list of property values to used in function calls below.
159*b1cdbd2cSJim Jagielski         // Only properties with values different from the (default) values
160*b1cdbd2cSJim Jagielski         // in the LinguProperties property set need to be supllied.
161*b1cdbd2cSJim Jagielski         // Thus we may stay with an empty list in order to use the ones
162*b1cdbd2cSJim Jagielski         // form the property set.
163*b1cdbd2cSJim Jagielski         PropertyValue[] aEmptyProps = new PropertyValue[0];
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski         // use american english as language
166*b1cdbd2cSJim Jagielski         Locale aLocale = new Locale("en","US","");
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski         // another list of property values to used in function calls below.
171*b1cdbd2cSJim Jagielski         // Only properties with values different from the (default) values
172*b1cdbd2cSJim Jagielski         // in the LinguProperties property set need to be supllied.
173*b1cdbd2cSJim Jagielski         PropertyValue[] aProps = new PropertyValue[1];
174*b1cdbd2cSJim Jagielski         aProps[0] = new PropertyValue();
175*b1cdbd2cSJim Jagielski         aProps[0].Name  = "IsGermanPreReform";
176*b1cdbd2cSJim Jagielski         aProps[0].Value = new Boolean( true );
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski         GetSpell();
180*b1cdbd2cSJim Jagielski         if (mxSpell !=  null)
181*b1cdbd2cSJim Jagielski         {
182*b1cdbd2cSJim Jagielski             // test with correct word
183*b1cdbd2cSJim Jagielski             String aWord = "horseback";
184*b1cdbd2cSJim Jagielski             boolean bIsCorrect = mxSpell.isValid( aWord, aLocale, aEmptyProps );
185*b1cdbd2cSJim Jagielski             System.out.println( aWord + ": " +  bIsCorrect );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski             // test with incorrect word
188*b1cdbd2cSJim Jagielski             aWord = "course";
189*b1cdbd2cSJim Jagielski             bIsCorrect = mxSpell.isValid( aWord, aLocale , aEmptyProps );
190*b1cdbd2cSJim Jagielski             System.out.println( aWord + ": " +  bIsCorrect );
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski             aWord = "house";
194*b1cdbd2cSJim Jagielski             XSpellAlternatives xAlt = mxSpell.spell( aWord, aLocale, aEmptyProps );
195*b1cdbd2cSJim Jagielski             if (xAlt == null)
196*b1cdbd2cSJim Jagielski                 System.out.println( aWord + " is correct." );
197*b1cdbd2cSJim Jagielski             else
198*b1cdbd2cSJim Jagielski             {
199*b1cdbd2cSJim Jagielski                 System.out.println( aWord + " is not correct. A list of proposals follows." );
200*b1cdbd2cSJim Jagielski                 String[] aAlternatives = xAlt.getAlternatives();
201*b1cdbd2cSJim Jagielski                 if (aAlternatives.length == 0)
202*b1cdbd2cSJim Jagielski                     System.out.println( "no proposal found." );
203*b1cdbd2cSJim Jagielski                 else
204*b1cdbd2cSJim Jagielski                 {
205*b1cdbd2cSJim Jagielski                     for (int i = 0; i < aAlternatives.length; ++i)
206*b1cdbd2cSJim Jagielski                         System.out.println( aAlternatives[i] );
207*b1cdbd2cSJim Jagielski                 }
208*b1cdbd2cSJim Jagielski             }
209*b1cdbd2cSJim Jagielski         }
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski         GetHyph();
213*b1cdbd2cSJim Jagielski         if (mxHyph != null)
214*b1cdbd2cSJim Jagielski         {
215*b1cdbd2cSJim Jagielski             // maximum number of characters to remain before the hyphen
216*b1cdbd2cSJim Jagielski             // character in the resulting word of the hyphenation
217*b1cdbd2cSJim Jagielski             short nMaxLeading = 6;
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski             XHyphenatedWord xHyphWord = mxHyph.hyphenate( "waterfall",
220*b1cdbd2cSJim Jagielski                                                           aLocale, nMaxLeading ,
221*b1cdbd2cSJim Jagielski                                                           aEmptyProps );
222*b1cdbd2cSJim Jagielski             if (xHyphWord == null)
223*b1cdbd2cSJim Jagielski                 System.out.println( "no valid hyphenation position found" );
224*b1cdbd2cSJim Jagielski             else
225*b1cdbd2cSJim Jagielski             {
226*b1cdbd2cSJim Jagielski                 System.out.println( "valid hyphenation pos found at "
227*b1cdbd2cSJim Jagielski                                     + xHyphWord.getHyphenationPos()
228*b1cdbd2cSJim Jagielski                         + " in " + xHyphWord.getWord() );
229*b1cdbd2cSJim Jagielski                 System.out.println( "hyphenation char will be after char "
230*b1cdbd2cSJim Jagielski                                     + xHyphWord.getHyphenPos()
231*b1cdbd2cSJim Jagielski                         + " in " + xHyphWord.getHyphenatedWord() );
232*b1cdbd2cSJim Jagielski             }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski             //! Note: 'aProps' needs to have set 'IsGermanPreReform' to true!
236*b1cdbd2cSJim Jagielski             xHyphWord = mxHyph.queryAlternativeSpelling( "Schiffahrt",
237*b1cdbd2cSJim Jagielski                                 new Locale("de","DE",""), (short)4, aProps );
238*b1cdbd2cSJim Jagielski             if (xHyphWord == null)
239*b1cdbd2cSJim Jagielski                 System.out.println( "no alternative spelling found at specified position." );
240*b1cdbd2cSJim Jagielski             else
241*b1cdbd2cSJim Jagielski             {
242*b1cdbd2cSJim Jagielski                 if (xHyphWord.isAlternativeSpelling())
243*b1cdbd2cSJim Jagielski                     System.out.println( "alternative spelling detectetd!" );
244*b1cdbd2cSJim Jagielski                 System.out.println( "valid hyphenation pos found at "
245*b1cdbd2cSJim Jagielski                                     + xHyphWord.getHyphenationPos()
246*b1cdbd2cSJim Jagielski                         + " in " + xHyphWord.getWord() );
247*b1cdbd2cSJim Jagielski                 System.out.println( "hyphenation char will be after char "
248*b1cdbd2cSJim Jagielski                                     + xHyphWord.getHyphenPos()
249*b1cdbd2cSJim Jagielski                         + " in " + xHyphWord.getHyphenatedWord() );
250*b1cdbd2cSJim Jagielski             }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski             XPossibleHyphens xPossHyph = mxHyph.createPossibleHyphens("waterfall",
254*b1cdbd2cSJim Jagielski                                                                       aLocale,
255*b1cdbd2cSJim Jagielski                                                                       aEmptyProps );
256*b1cdbd2cSJim Jagielski             if (xPossHyph == null)
257*b1cdbd2cSJim Jagielski                 System.out.println( "no hyphenation positions found." );
258*b1cdbd2cSJim Jagielski             else
259*b1cdbd2cSJim Jagielski                 System.out.println( xPossHyph.getPossibleHyphens() );
260*b1cdbd2cSJim Jagielski         }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski         GetThes();
264*b1cdbd2cSJim Jagielski         if (mxThes != null)
265*b1cdbd2cSJim Jagielski         {
266*b1cdbd2cSJim Jagielski             XMeaning[] xMeanings = mxThes.queryMeanings("house", aLocale,
267*b1cdbd2cSJim Jagielski                                                         aEmptyProps );
268*b1cdbd2cSJim Jagielski             if (xMeanings == null)
269*b1cdbd2cSJim Jagielski                 System.out.println( "nothing found." );
270*b1cdbd2cSJim Jagielski             else
271*b1cdbd2cSJim Jagielski             {
272*b1cdbd2cSJim Jagielski                 for (int i = 0; i < xMeanings.length; ++i)
273*b1cdbd2cSJim Jagielski                 {
274*b1cdbd2cSJim Jagielski                     System.out.println( "Meaning: " + xMeanings[i].getMeaning() );
275*b1cdbd2cSJim Jagielski                     String[] aSynonyms = xMeanings[i].querySynonyms();
276*b1cdbd2cSJim Jagielski                     for (int k = 0; k < aSynonyms.length; ++k)
277*b1cdbd2cSJim Jagielski                         System.out.println( "    Synonym: " + aSynonyms[k] );
278*b1cdbd2cSJim Jagielski                 }
279*b1cdbd2cSJim Jagielski             }
280*b1cdbd2cSJim Jagielski         }
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski         XLinguServiceEventListener aClient = new Client();
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski         // get access to LinguProperties property set
287*b1cdbd2cSJim Jagielski         Object aObj = mxRemoteServiceManager.createInstanceWithContext(
288*b1cdbd2cSJim Jagielski             "com.sun.star.linguistic2.LinguProperties", mxRemoteContext);
289*b1cdbd2cSJim Jagielski         XPropertySet aLinguProps = (XPropertySet) UnoRuntime.queryInterface(
290*b1cdbd2cSJim Jagielski             XPropertySet.class,aObj);
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski         // set a spellchecker and hyphenator property value to a defined state
293*b1cdbd2cSJim Jagielski         try {
294*b1cdbd2cSJim Jagielski             aLinguProps.setPropertyValue("IsGermanPreReform", new Boolean(true));
295*b1cdbd2cSJim Jagielski         } catch (Exception e) {
296*b1cdbd2cSJim Jagielski         }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski         // now add the client as listener to the service manager to
299*b1cdbd2cSJim Jagielski         // get informed when spellchecking or hyphenation may produce
300*b1cdbd2cSJim Jagielski         // different results then before.
301*b1cdbd2cSJim Jagielski         mxLinguSvcMgr.addLinguServiceManagerListener(aClient);
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski         // change that property value in order to trigger a property change
304*b1cdbd2cSJim Jagielski         // event that eventually results in the listeners
305*b1cdbd2cSJim Jagielski         // 'processLinguServiceEvent' function being called
306*b1cdbd2cSJim Jagielski         try {
307*b1cdbd2cSJim Jagielski             aLinguProps.setPropertyValue("IsGermanPreReform", new Boolean(false));
308*b1cdbd2cSJim Jagielski         } catch (Exception e) {
309*b1cdbd2cSJim Jagielski         }
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski         //! keep the listener and the program alive until the event will
312*b1cdbd2cSJim Jagielski         //! be launched.
313*b1cdbd2cSJim Jagielski         //! There is a voluntary delay before launching the event!
314*b1cdbd2cSJim Jagielski         // Of course this code would usually not be in a *real* client
315*b1cdbd2cSJim Jagielski         // its
316*b1cdbd2cSJim Jagielski         synchronized(this) {
317*b1cdbd2cSJim Jagielski             try {
318*b1cdbd2cSJim Jagielski                 this.wait(4000);
319*b1cdbd2cSJim Jagielski             } catch(Exception e) {
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski             }
322*b1cdbd2cSJim Jagielski         }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski         //! remove listener before programm termination.
325*b1cdbd2cSJim Jagielski         //! should not be omitted.
326*b1cdbd2cSJim Jagielski         mxLinguSvcMgr.removeLinguServiceManagerListener(aClient);
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski         System.exit(0);
330*b1cdbd2cSJim Jagielski     }
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski     /** simple sample implementation of a clients XLinguServiceEventListener
333*b1cdbd2cSJim Jagielski      *  interface implementation
334*b1cdbd2cSJim Jagielski      */
335*b1cdbd2cSJim Jagielski     public class Client
336*b1cdbd2cSJim Jagielski             implements XLinguServiceEventListener
337*b1cdbd2cSJim Jagielski     {
disposing( EventObject aEventObj )338*b1cdbd2cSJim Jagielski         public void disposing ( EventObject aEventObj )
339*b1cdbd2cSJim Jagielski         {
340*b1cdbd2cSJim Jagielski             //! any references to the EventObjects source have to be
341*b1cdbd2cSJim Jagielski             //! released here now!
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski             System.out.println("object listened to will be disposed");
344*b1cdbd2cSJim Jagielski         }
345*b1cdbd2cSJim Jagielski 
processLinguServiceEvent( LinguServiceEvent aServiceEvent )346*b1cdbd2cSJim Jagielski         public void processLinguServiceEvent( LinguServiceEvent aServiceEvent )
347*b1cdbd2cSJim Jagielski         {
348*b1cdbd2cSJim Jagielski             //! do here whatever you think needs to be done depending
349*b1cdbd2cSJim Jagielski             //! on the event recieved (e.g. trigger background spellchecking
350*b1cdbd2cSJim Jagielski             //! or hyphenation again.)
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski             System.out.println("Listener called");
353*b1cdbd2cSJim Jagielski         }
354*b1cdbd2cSJim Jagielski     };
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
358