134dd1e25SAndrew Rist /**************************************************************
2*5f946091Smseidel  *
334dd1e25SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
434dd1e25SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
534dd1e25SAndrew Rist  * distributed with this work for additional information
634dd1e25SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
734dd1e25SAndrew Rist  * to you under the Apache License, Version 2.0 (the
834dd1e25SAndrew Rist  * "License"); you may not use this file except in compliance
934dd1e25SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5f946091Smseidel  *
1134dd1e25SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5f946091Smseidel  *
1334dd1e25SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1434dd1e25SAndrew Rist  * software distributed under the License is distributed on an
1534dd1e25SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1634dd1e25SAndrew Rist  * KIND, either express or implied.  See the License for the
1734dd1e25SAndrew Rist  * specific language governing permissions and limitations
1834dd1e25SAndrew Rist  * under the License.
19*5f946091Smseidel  *
2034dd1e25SAndrew Rist  *************************************************************/
2134dd1e25SAndrew Rist 
2234dd1e25SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // uno
25cdf0e10cSrcweir import com.sun.star.lib.uno.helper.ComponentBase;
26cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
27cdf0e10cSrcweir 
28cdf0e10cSrcweir // factories
29cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
30cdf0e10cSrcweir import com.sun.star.lang.XSingleServiceFactory;
31cdf0e10cSrcweir 
32cdf0e10cSrcweir // supported Interfaces
33cdf0e10cSrcweir import com.sun.star.linguistic2.XSpellChecker;
34cdf0e10cSrcweir import com.sun.star.linguistic2.XLinguServiceEventBroadcaster;
35*5f946091Smseidel import com.sun.star.lang.XInitialization;
36cdf0e10cSrcweir import com.sun.star.lang.XComponent;
37*5f946091Smseidel import com.sun.star.lang.XServiceInfo;
38*5f946091Smseidel import com.sun.star.lang.XServiceDisplayName;
39cdf0e10cSrcweir 
40cdf0e10cSrcweir // Exceptions
41cdf0e10cSrcweir import com.sun.star.uno.Exception;
42cdf0e10cSrcweir import com.sun.star.uno.RuntimeException;
43cdf0e10cSrcweir import com.sun.star.lang.IllegalArgumentException;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir //used Interfaces
46cdf0e10cSrcweir import com.sun.star.linguistic2.XLinguServiceEventListener;
47cdf0e10cSrcweir import com.sun.star.linguistic2.XSpellAlternatives;
48cdf0e10cSrcweir import com.sun.star.linguistic2.SpellFailure;
49cdf0e10cSrcweir import com.sun.star.lang.Locale;
50cdf0e10cSrcweir import com.sun.star.lang.XEventListener;
51cdf0e10cSrcweir import com.sun.star.lang.EventObject;
52cdf0e10cSrcweir import com.sun.star.beans.XPropertySet;
53cdf0e10cSrcweir import com.sun.star.beans.PropertyValue;
54cdf0e10cSrcweir import com.sun.star.uno.AnyConverter;
55cdf0e10cSrcweir import com.sun.star.lang.XTypeProvider;
56cdf0e10cSrcweir import com.sun.star.uno.XInterface;
57cdf0e10cSrcweir import com.sun.star.uno.Type;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir import java.util.ArrayList;
60cdf0e10cSrcweir 
61cdf0e10cSrcweir public class SampleSpellChecker extends ComponentBase implements
62cdf0e10cSrcweir         XSpellChecker,
63cdf0e10cSrcweir         XLinguServiceEventBroadcaster,
64cdf0e10cSrcweir         XInitialization,
65cdf0e10cSrcweir         XServiceDisplayName,
66cdf0e10cSrcweir         XServiceInfo
67cdf0e10cSrcweir {
68cdf0e10cSrcweir     PropChgHelper_Spell         aPropChgHelper;
69cdf0e10cSrcweir     ArrayList                   aEvtListeners;
70cdf0e10cSrcweir     boolean                     bDisposing;
71cdf0e10cSrcweir 
SampleSpellChecker()72cdf0e10cSrcweir     public SampleSpellChecker()
73cdf0e10cSrcweir     {
74cdf0e10cSrcweir         // names of relevant properties to be used
75cdf0e10cSrcweir         String[] aProps = new String[]
76cdf0e10cSrcweir             {
77cdf0e10cSrcweir                 "IsIgnoreControlCharacters",
78cdf0e10cSrcweir                 "IsUseDictionaryList",
79cdf0e10cSrcweir                 "IsGermanPreReform",
80cdf0e10cSrcweir                 "IsSpellUpperCase",
81cdf0e10cSrcweir                 "IsSpellWithDigits",
82cdf0e10cSrcweir                 "IsSpellCapitalization"
83cdf0e10cSrcweir             };
84*5f946091Smseidel         aPropChgHelper = new PropChgHelper_Spell( (XSpellChecker) this, aProps );
85*5f946091Smseidel         aEvtListeners  = new ArrayList();
86*5f946091Smseidel         bDisposing     = false;
87cdf0e10cSrcweir     }
88cdf0e10cSrcweir 
IsEqual( Locale aLoc1, Locale aLoc2 )89cdf0e10cSrcweir     private boolean IsEqual( Locale aLoc1, Locale aLoc2 )
90cdf0e10cSrcweir     {
91cdf0e10cSrcweir         return aLoc1.Language.equals( aLoc2.Language ) &&
92*5f946091Smseidel                aLoc1.Country .equals( aLoc2.Country ) &&
93*5f946091Smseidel                aLoc1.Variant .equals( aLoc2.Variant );
94cdf0e10cSrcweir     }
95cdf0e10cSrcweir 
GetValueToUse( String aPropName, boolean bDefaultVal, PropertyValue[] aProps )96*5f946091Smseidel     private boolean GetValueToUse(
97cdf0e10cSrcweir             String          aPropName,
98cdf0e10cSrcweir             boolean         bDefaultVal,
99cdf0e10cSrcweir             PropertyValue[] aProps )
100cdf0e10cSrcweir     {
101cdf0e10cSrcweir         boolean bRes = bDefaultVal;
102cdf0e10cSrcweir 
103cdf0e10cSrcweir         try
104cdf0e10cSrcweir         {
105cdf0e10cSrcweir             // use temporary value if supplied
106*5f946091Smseidel             for (int i = 0; i < aProps.length; ++i)
107cdf0e10cSrcweir             {
108cdf0e10cSrcweir                 if (aPropName.equals( aProps[i].Name ))
109cdf0e10cSrcweir                 {
110cdf0e10cSrcweir                     Object aObj = aProps[i].Value;
111cdf0e10cSrcweir                     if (AnyConverter.isBoolean( aObj ))
112cdf0e10cSrcweir                     {
113cdf0e10cSrcweir                         bRes = AnyConverter.toBoolean( aObj );
114cdf0e10cSrcweir                         return bRes;
115cdf0e10cSrcweir                     }
116cdf0e10cSrcweir                 }
117cdf0e10cSrcweir             }
118cdf0e10cSrcweir 
119cdf0e10cSrcweir             // otherwise use value from property set (if available)
120cdf0e10cSrcweir             XPropertySet xPropSet = aPropChgHelper.GetPropSet();
121*5f946091Smseidel             if (xPropSet != null) // should always be the case
122cdf0e10cSrcweir             {
123cdf0e10cSrcweir                 Object aObj = xPropSet.getPropertyValue( aPropName );
124cdf0e10cSrcweir                 if (AnyConverter.isBoolean( aObj ))
125cdf0e10cSrcweir                     bRes = AnyConverter.toBoolean( aObj );
126cdf0e10cSrcweir             }
127cdf0e10cSrcweir         }
128cdf0e10cSrcweir         catch (Exception e) {
129cdf0e10cSrcweir             bRes = bDefaultVal;
130cdf0e10cSrcweir         }
131*5f946091Smseidel 
132cdf0e10cSrcweir         return bRes;
133cdf0e10cSrcweir     }
134cdf0e10cSrcweir 
IsUpper( String aWord, Locale aLocale )135cdf0e10cSrcweir     private boolean IsUpper( String aWord, Locale aLocale )
136cdf0e10cSrcweir     {
137*5f946091Smseidel         java.util.Locale aLang = new java.util.Locale(
138cdf0e10cSrcweir                 aLocale.Language, aLocale.Country, aLocale.Variant );
139cdf0e10cSrcweir         return aWord.equals( aWord.toUpperCase( aLang ) );
140cdf0e10cSrcweir     }
141cdf0e10cSrcweir 
HasDigits( String aWord )142cdf0e10cSrcweir     private boolean HasDigits( String aWord )
143cdf0e10cSrcweir     {
144cdf0e10cSrcweir         int nLen = aWord.length();
145*5f946091Smseidel         for (int i = 0; i < nLen; ++i)
146cdf0e10cSrcweir         {
147cdf0e10cSrcweir             if (Character.isDigit( aWord.charAt(i) ))
148cdf0e10cSrcweir                 return true;
149cdf0e10cSrcweir         }
150cdf0e10cSrcweir         return false;
151cdf0e10cSrcweir     }
152cdf0e10cSrcweir 
GetSpellFailure( String aWord, Locale aLocale, PropertyValue[] aProperties )153*5f946091Smseidel     private short GetSpellFailure(
154*5f946091Smseidel             String aWord,
155cdf0e10cSrcweir             Locale aLocale,
156*5f946091Smseidel             PropertyValue[] aProperties )
157cdf0e10cSrcweir     {
158cdf0e10cSrcweir         short nRes = -1;
159cdf0e10cSrcweir 
160*5f946091Smseidel         //!! This code needs to be replaced by code calling the actual
161cdf0e10cSrcweir         //!! implementation of your spellchecker
162*5f946091Smseidel         boolean bIsGermanPreReform = GetValueToUse( "IsGermanPreReform", false, aProperties );
163cdf0e10cSrcweir         if (IsEqual( aLocale, new Locale( "de", "DE", "" ) ))
164cdf0e10cSrcweir         {
165cdf0e10cSrcweir             if (bIsGermanPreReform && aWord.equals( "Schifffahrt" ))
166cdf0e10cSrcweir                 nRes = SpellFailure.SPELLING_ERROR;
167cdf0e10cSrcweir             else if (!bIsGermanPreReform && aWord.equals( "Schiffahrt" ))
168cdf0e10cSrcweir                 nRes = SpellFailure.SPELLING_ERROR;
169cdf0e10cSrcweir         }
170cdf0e10cSrcweir         else if (IsEqual( aLocale, new Locale( "en", "US", "" ) ))
171cdf0e10cSrcweir         {
172cdf0e10cSrcweir             // words with 'u', 'U' and 'arizona' are defined to be incorrect
173cdf0e10cSrcweir             boolean bIsValid = !(aWord.indexOf( "u" ) != -1 || aWord.indexOf( "U" ) != -1)
174cdf0e10cSrcweir                                  && !aWord.equals( "arizona" );
175cdf0e10cSrcweir 
176cdf0e10cSrcweir             if (!bIsValid)
177cdf0e10cSrcweir             {
178cdf0e10cSrcweir                 // default value (no other SpellFailure type is applicable)
179cdf0e10cSrcweir                 nRes = SpellFailure.SPELLING_ERROR;
180*5f946091Smseidel 
181cdf0e10cSrcweir                 if (aWord.equals( "arizona" ))
182cdf0e10cSrcweir                     nRes = SpellFailure.CAPTION_ERROR;
183cdf0e10cSrcweir                 else if (aWord.equals( "house" ))
184cdf0e10cSrcweir                     nRes = SpellFailure.SPELLING_ERROR;
185cdf0e10cSrcweir                 else if (aWord.equals( "course" ))
186cdf0e10cSrcweir                     nRes = SpellFailure.IS_NEGATIVE_WORD;
187*5f946091Smseidel             }
188cdf0e10cSrcweir         }
189*5f946091Smseidel 
190cdf0e10cSrcweir         return nRes;
191cdf0e10cSrcweir     }
192cdf0e10cSrcweir 
GetProposals( String aWord, Locale aLocale, PropertyValue[] aProperties )193*5f946091Smseidel     private XSpellAlternatives GetProposals(
194*5f946091Smseidel             String aWord,
195*5f946091Smseidel             Locale aLocale,
196*5f946091Smseidel             PropertyValue[] aProperties )
197cdf0e10cSrcweir     {
198*5f946091Smseidel         short nType = SpellFailure.SPELLING_ERROR;
199cdf0e10cSrcweir         String[] aProposals = null;
200cdf0e10cSrcweir 
201cdf0e10cSrcweir         // get values of relevant properties that may be used.
202cdf0e10cSrcweir         //! The values for 'IsIgnoreControlCharacters' and 'IsUseDictionaryList'
203cdf0e10cSrcweir         //! are handled by the dispatcher! Thus there is no need to access
204cdf0e10cSrcweir         //! them here.
205cdf0e10cSrcweir         boolean bIsGermanPreReform      = GetValueToUse( "IsGermanPreReform", false, aProperties );
206cdf0e10cSrcweir         boolean bIsSpellWithDigits      = GetValueToUse( "IsSpellWithDigits", false, aProperties );
207cdf0e10cSrcweir         boolean bIsSpellUpperCase       = GetValueToUse( "IsSpellUpperCase", false, aProperties );
208cdf0e10cSrcweir         boolean bIsSpellCapitalization  = GetValueToUse( "IsSpellCapitalization", true, aProperties );
209cdf0e10cSrcweir 
210*5f946091Smseidel         //!! This code needs to be replaced by code calling the actual
211cdf0e10cSrcweir         //!! implementation of your spellchecker
212cdf0e10cSrcweir         if (IsEqual( aLocale, new Locale( "de", "DE", "" ) ))
213cdf0e10cSrcweir         {
214cdf0e10cSrcweir             if (bIsGermanPreReform && aWord.equals( "Schifffahrt" ))
215cdf0e10cSrcweir             {
216cdf0e10cSrcweir                 nType = SpellFailure.SPELLING_ERROR;
217cdf0e10cSrcweir                 aProposals = new String[]{ "Schiffahrt" };
218cdf0e10cSrcweir             }
219cdf0e10cSrcweir             else if (!bIsGermanPreReform && aWord.equals( "Schiffahrt" ))
220cdf0e10cSrcweir             {
221cdf0e10cSrcweir                 nType = SpellFailure.SPELLING_ERROR;
222cdf0e10cSrcweir                 aProposals = new String[]{ "Schifffahrt" };
223cdf0e10cSrcweir             }
224cdf0e10cSrcweir         }
225cdf0e10cSrcweir         else if (IsEqual( aLocale, new Locale( "en", "US", "" ) ))
226cdf0e10cSrcweir         {
227cdf0e10cSrcweir             if (aWord.equals( "arizona" ))
228cdf0e10cSrcweir             {
229cdf0e10cSrcweir                 nType = SpellFailure.CAPTION_ERROR;
230cdf0e10cSrcweir                 aProposals = new String[]{ "Arizona" };
231cdf0e10cSrcweir             }
232cdf0e10cSrcweir             else if (aWord.equals( "house" ))
233cdf0e10cSrcweir             {
234cdf0e10cSrcweir                 nType = SpellFailure.SPELLING_ERROR;
235cdf0e10cSrcweir                 aProposals = new String[]{ "horse", "home" };
236cdf0e10cSrcweir             }
237cdf0e10cSrcweir             else if (aWord.equals( "course" ))
238cdf0e10cSrcweir             {
239cdf0e10cSrcweir                 nType = SpellFailure.IS_NEGATIVE_WORD;
240cdf0e10cSrcweir                 aProposals = new String[]{ "line", "plan", "approach" };
241cdf0e10cSrcweir             }
242cdf0e10cSrcweir         }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir         // always return a result if word is incorrect,
245cdf0e10cSrcweir         // proposals may be empty though.
246cdf0e10cSrcweir         return new XSpellAlternatives_impl( aWord, aLocale,
247cdf0e10cSrcweir                                             nType, aProposals );
248cdf0e10cSrcweir     }
249*5f946091Smseidel 
250cdf0e10cSrcweir     // __________ interface methods __________
251*5f946091Smseidel 
252*5f946091Smseidel 
253cdf0e10cSrcweir     //*****************
254cdf0e10cSrcweir     //XSupportedLocales
255cdf0e10cSrcweir     //*****************
getLocales()256cdf0e10cSrcweir     public Locale[] getLocales()
257cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
258cdf0e10cSrcweir     {
259*5f946091Smseidel         Locale aLocales[] =
260cdf0e10cSrcweir         {
261cdf0e10cSrcweir             new Locale( "de", "DE", "" ),
262cdf0e10cSrcweir             new Locale( "en", "US", "" )
263cdf0e10cSrcweir         };
264cdf0e10cSrcweir 
265cdf0e10cSrcweir         return aLocales;
266cdf0e10cSrcweir     }
267*5f946091Smseidel 
hasLocale( Locale aLocale )268*5f946091Smseidel     public boolean hasLocale( Locale aLocale )
269cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
270cdf0e10cSrcweir     {
271cdf0e10cSrcweir         boolean bRes = false;
272*5f946091Smseidel         if ( IsEqual( aLocale, new Locale( "de", "DE", "" ) ) ||
273cdf0e10cSrcweir              IsEqual( aLocale, new Locale( "en", "US", "" ) ))
274cdf0e10cSrcweir             bRes = true;
275*5f946091Smseidel         return bRes;
276cdf0e10cSrcweir     }
277cdf0e10cSrcweir 
278*5f946091Smseidel 
279cdf0e10cSrcweir     //*************
280cdf0e10cSrcweir     //XSpellChecker
281cdf0e10cSrcweir     //*************
isValid( String aWord, Locale aLocale, PropertyValue[] aProperties )282cdf0e10cSrcweir     public boolean isValid(
283cdf0e10cSrcweir             String aWord, Locale aLocale,
284*5f946091Smseidel             PropertyValue[] aProperties )
285cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException,
286cdf0e10cSrcweir                IllegalArgumentException
287cdf0e10cSrcweir     {
288cdf0e10cSrcweir         if (IsEqual( aLocale, new Locale() ) || aWord.length() == 0)
289cdf0e10cSrcweir             return true;
290*5f946091Smseidel 
291cdf0e10cSrcweir         // linguistic is currently not allowed to throw exceptions
292cdf0e10cSrcweir         // thus we return null which means 'word cannot be spelled'
293cdf0e10cSrcweir         if (!hasLocale( aLocale ))
294cdf0e10cSrcweir             return true;
295cdf0e10cSrcweir 
296cdf0e10cSrcweir         // get values of relevant properties that may be used.
297cdf0e10cSrcweir         //! The values for 'IsIgnoreControlCharacters' and 'IsUseDictionaryList'
298cdf0e10cSrcweir         //! are handled by the dispatcher! Thus there is no need to access
299cdf0e10cSrcweir         //! them here.
300cdf0e10cSrcweir         boolean bIsGermanPreReform      = GetValueToUse( "IsGermanPreReform", false, aProperties );
301cdf0e10cSrcweir         boolean bIsSpellWithDigits      = GetValueToUse( "IsSpellWithDigits", false, aProperties );
302cdf0e10cSrcweir         boolean bIsSpellUpperCase       = GetValueToUse( "IsSpellUpperCase", false, aProperties );
303cdf0e10cSrcweir         boolean bIsSpellCapitalization  = GetValueToUse( "IsSpellCapitalization", true, aProperties );
304*5f946091Smseidel 
305cdf0e10cSrcweir         short nFailure = GetSpellFailure( aWord, aLocale, aProperties );
306cdf0e10cSrcweir         if (nFailure != -1)
307cdf0e10cSrcweir         {
308cdf0e10cSrcweir             // postprocess result for errors that should be ignored
309cdf0e10cSrcweir             if (   (!bIsSpellUpperCase  && IsUpper( aWord, aLocale ))
310cdf0e10cSrcweir                 || (!bIsSpellWithDigits && HasDigits( aWord ))
311cdf0e10cSrcweir                 || (!bIsSpellCapitalization
312cdf0e10cSrcweir                     &&  nFailure == SpellFailure.CAPTION_ERROR)
313cdf0e10cSrcweir             )
314cdf0e10cSrcweir                 nFailure = -1;
315cdf0e10cSrcweir         }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir         return nFailure == -1;
318cdf0e10cSrcweir     }
319*5f946091Smseidel 
320*5f946091Smseidel 
spell( String aWord, Locale aLocale, PropertyValue[] aProperties )321cdf0e10cSrcweir     public XSpellAlternatives spell(
322cdf0e10cSrcweir             String aWord, Locale aLocale,
323*5f946091Smseidel             PropertyValue[] aProperties )
324cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException,
325cdf0e10cSrcweir                IllegalArgumentException
326cdf0e10cSrcweir     {
327cdf0e10cSrcweir         if (IsEqual( aLocale, new Locale() ) || aWord.length() == 0)
328cdf0e10cSrcweir             return null;
329*5f946091Smseidel 
330cdf0e10cSrcweir         // linguistic is currently not allowed to throw exceptions
331*5f946091Smseidel         // thus we return null which means 'word cannot be spelled'
332cdf0e10cSrcweir         if (!hasLocale( aLocale ))
333cdf0e10cSrcweir             return null;
334*5f946091Smseidel 
335cdf0e10cSrcweir         XSpellAlternatives xRes = null;
336cdf0e10cSrcweir         if (!isValid( aWord, aLocale, aProperties ))
337cdf0e10cSrcweir         {
338cdf0e10cSrcweir             xRes = GetProposals( aWord, aLocale, aProperties );
339cdf0e10cSrcweir         }
340cdf0e10cSrcweir         return xRes;
341cdf0e10cSrcweir     }
342*5f946091Smseidel 
343*5f946091Smseidel 
344cdf0e10cSrcweir     //*****************************
345cdf0e10cSrcweir     //XLinguServiceEventBroadcaster
346cdf0e10cSrcweir     //*****************************
addLinguServiceEventListener( XLinguServiceEventListener xLstnr )347cdf0e10cSrcweir     public boolean addLinguServiceEventListener (
348cdf0e10cSrcweir             XLinguServiceEventListener xLstnr )
349cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
350cdf0e10cSrcweir     {
351*5f946091Smseidel         boolean bRes = false;
352cdf0e10cSrcweir         if (!bDisposing && xLstnr != null)
353cdf0e10cSrcweir             bRes = aPropChgHelper.addLinguServiceEventListener( xLstnr );
354cdf0e10cSrcweir         return bRes;
355cdf0e10cSrcweir     }
356*5f946091Smseidel 
removeLinguServiceEventListener( XLinguServiceEventListener xLstnr )357cdf0e10cSrcweir     public boolean removeLinguServiceEventListener(
358*5f946091Smseidel             XLinguServiceEventListener xLstnr )
359cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
360cdf0e10cSrcweir     {
361*5f946091Smseidel         boolean bRes = false;
362cdf0e10cSrcweir         if (!bDisposing && xLstnr != null)
363cdf0e10cSrcweir             bRes = aPropChgHelper.removeLinguServiceEventListener( xLstnr );
364cdf0e10cSrcweir         return bRes;
365*5f946091Smseidel     }
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     //********************
368cdf0e10cSrcweir     // XServiceDisplayName
369cdf0e10cSrcweir     //********************
getServiceDisplayName( Locale aLocale )370*5f946091Smseidel     public String getServiceDisplayName( Locale aLocale )
371cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
372cdf0e10cSrcweir     {
373*5f946091Smseidel         return "Java Samples";
374cdf0e10cSrcweir     }
375cdf0e10cSrcweir 
376cdf0e10cSrcweir     //****************
377cdf0e10cSrcweir     // XInitialization
378cdf0e10cSrcweir     //****************
initialize( Object[] aArguments )379*5f946091Smseidel     public void initialize( Object[] aArguments )
380cdf0e10cSrcweir         throws com.sun.star.uno.Exception,
381cdf0e10cSrcweir                com.sun.star.uno.RuntimeException
382cdf0e10cSrcweir     {
383cdf0e10cSrcweir         int nLen = aArguments.length;
384cdf0e10cSrcweir         if (2 == nLen)
385cdf0e10cSrcweir         {
386cdf0e10cSrcweir             XPropertySet xPropSet = (XPropertySet)UnoRuntime.queryInterface(
387cdf0e10cSrcweir                                          XPropertySet.class, aArguments[0]);
388cdf0e10cSrcweir             // start listening to property changes
389cdf0e10cSrcweir             aPropChgHelper.AddAsListenerTo( xPropSet );
390cdf0e10cSrcweir         }
391cdf0e10cSrcweir     }
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     //*************
394cdf0e10cSrcweir     // XServiceInfo
395cdf0e10cSrcweir     //*************
supportsService( String aServiceName )396cdf0e10cSrcweir     public boolean supportsService( String aServiceName )
397cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
398cdf0e10cSrcweir     {
399cdf0e10cSrcweir         String[] aServices = getSupportedServiceNames_Static();
400cdf0e10cSrcweir         int i, nLength = aServices.length;
401cdf0e10cSrcweir         boolean bResult = false;
402cdf0e10cSrcweir 
403cdf0e10cSrcweir         for( i = 0; !bResult && i < nLength; ++i )
404cdf0e10cSrcweir             bResult = aServiceName.equals( aServices[ i ] );
405cdf0e10cSrcweir 
406cdf0e10cSrcweir         return bResult;
407cdf0e10cSrcweir     }
408cdf0e10cSrcweir 
getImplementationName()409cdf0e10cSrcweir     public String getImplementationName()
410cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
411cdf0e10cSrcweir     {
412cdf0e10cSrcweir         return _aSvcImplName;
413cdf0e10cSrcweir     }
414*5f946091Smseidel 
getSupportedServiceNames()415cdf0e10cSrcweir     public String[] getSupportedServiceNames()
416cdf0e10cSrcweir         throws com.sun.star.uno.RuntimeException
417cdf0e10cSrcweir     {
418cdf0e10cSrcweir         return getSupportedServiceNames_Static();
419cdf0e10cSrcweir     }
420*5f946091Smseidel 
421cdf0e10cSrcweir     // __________ static things __________
422cdf0e10cSrcweir 
423cdf0e10cSrcweir     public static String _aSvcImplName = SampleSpellChecker.class.getName();
424*5f946091Smseidel 
getSupportedServiceNames_Static()425cdf0e10cSrcweir     public static String[] getSupportedServiceNames_Static()
426cdf0e10cSrcweir     {
427cdf0e10cSrcweir         String[] aResult = { "com.sun.star.linguistic2.SpellChecker" };
428cdf0e10cSrcweir         return aResult;
429cdf0e10cSrcweir     }
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 
432cdf0e10cSrcweir     /**
433cdf0e10cSrcweir      * Returns a factory for creating the service.
434cdf0e10cSrcweir      * This method is called by the <code>JavaLoader</code>
435cdf0e10cSrcweir      * <p>
436cdf0e10cSrcweir      * @return  returns a <code>XSingleServiceFactory</code> for creating the component
437cdf0e10cSrcweir      * @param   implName     the name of the implementation for which a service is desired
438cdf0e10cSrcweir      * @param   multiFactory the service manager to be used if needed
439cdf0e10cSrcweir      * @param   regKey       the registryKey
440cdf0e10cSrcweir      * @see                  com.sun.star.comp.loader.JavaLoader
441cdf0e10cSrcweir      */
__getServiceFactory( String aImplName, XMultiServiceFactory xMultiFactory, com.sun.star.registry.XRegistryKey xRegKey )442cdf0e10cSrcweir     public static XSingleServiceFactory __getServiceFactory(
443cdf0e10cSrcweir         String aImplName,
444cdf0e10cSrcweir         XMultiServiceFactory xMultiFactory,
445cdf0e10cSrcweir         com.sun.star.registry.XRegistryKey xRegKey )
446cdf0e10cSrcweir     {
447cdf0e10cSrcweir         XSingleServiceFactory xSingleServiceFactory = null;
448cdf0e10cSrcweir         if( aImplName.equals( _aSvcImplName ) )
449cdf0e10cSrcweir         {
450cdf0e10cSrcweir             xSingleServiceFactory = new OneInstanceFactory(
451cdf0e10cSrcweir                     SampleSpellChecker.class, _aSvcImplName,
452cdf0e10cSrcweir                     getSupportedServiceNames_Static(),
453cdf0e10cSrcweir                     xMultiFactory );
454cdf0e10cSrcweir         }
455cdf0e10cSrcweir         return xSingleServiceFactory;
456cdf0e10cSrcweir     }
457cdf0e10cSrcweir 
458cdf0e10cSrcweir     /**
459cdf0e10cSrcweir      * Writes the service information into the given registry key.
460cdf0e10cSrcweir      * This method is called by the <code>JavaLoader</code>
461cdf0e10cSrcweir      * <p>
462cdf0e10cSrcweir      * @return  returns true if the operation succeeded
463cdf0e10cSrcweir      * @param   xRegKey       the registryKey
464cdf0e10cSrcweir      * @see                  com.sun.star.comp.loader.JavaLoader
465cdf0e10cSrcweir      */
466cdf0e10cSrcweir     // This method not longer necessary since OOo 3.4 where the component registration
467cdf0e10cSrcweir     // was changed to passive component registration. For more details see
468*5f946091Smseidel     // https://wiki.openoffice.org/wiki/Passive_Component_Registration
469cdf0e10cSrcweir 
470*5f946091Smseidel //     public static boolean __writeRegistryServiceInfo(
471cdf0e10cSrcweir //             com.sun.star.registry.XRegistryKey xRegKey )
472cdf0e10cSrcweir //     {
473cdf0e10cSrcweir //         boolean bResult = true;
474cdf0e10cSrcweir //         String[] aServices = getSupportedServiceNames_Static();
475cdf0e10cSrcweir //         int i, nLength = aServices.length;
476cdf0e10cSrcweir //         for( i = 0; i < nLength; ++i )
477cdf0e10cSrcweir //         {
478cdf0e10cSrcweir //             bResult = bResult && com.sun.star.comp.loader.FactoryHelper.writeRegistryServiceInfo(
479cdf0e10cSrcweir //                 _aSvcImplName, aServices[i], xRegKey );
480cdf0e10cSrcweir //         }
481cdf0e10cSrcweir //         return bResult;
482cdf0e10cSrcweir //     }
483cdf0e10cSrcweir }
484cdf0e10cSrcweir 
485