Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 :
21 : #include <tools/debug.hxx>
22 : #include <sal/macros.h>
23 :
24 : #include <com/sun/star/linguistic2/LinguServiceEvent.hpp>
25 : #include <com/sun/star/linguistic2/LinguServiceEventFlags.hpp>
26 : #include <com/sun/star/linguistic2/XLinguServiceEventListener.hpp>
27 : #include <com/sun/star/beans/XPropertySet.hpp>
28 : #include <osl/mutex.hxx>
29 :
30 : #include <linguistic/misc.hxx>
31 : #include <linguistic/lngprops.hxx>
32 :
33 : #include <linguistic/lngprophelp.hxx>
34 :
35 : using namespace osl;
36 : using namespace com::sun::star;
37 : using namespace com::sun::star::beans;
38 : using namespace com::sun::star::lang;
39 : using namespace com::sun::star::uno;
40 : using namespace com::sun::star::linguistic2;
41 : using namespace linguistic;
42 :
43 :
44 : namespace linguistic
45 : {
46 :
47 :
48 : static const char *aCH[] =
49 : {
50 : UPN_IS_IGNORE_CONTROL_CHARACTERS,
51 : UPN_IS_USE_DICTIONARY_LIST,
52 : };
53 :
54 : static const int nCHCount = sizeof(aCH) / sizeof(aCH[0]);
55 :
56 :
57 0 : PropertyChgHelper::PropertyChgHelper(
58 : const Reference< XInterface > &rxSource,
59 : Reference< XLinguProperties > &rxPropSet,
60 : int nAllowedEvents ) :
61 : PropertyChgHelperBase(),
62 : aPropNames (nCHCount),
63 : xMyEvtObj (rxSource),
64 0 : aLngSvcEvtListeners (GetLinguMutex()),
65 : xPropSet (rxPropSet),
66 0 : nEvtFlags (nAllowedEvents)
67 : {
68 0 : OUString *pName = aPropNames.getArray();
69 0 : for (sal_Int32 i = 0; i < nCHCount; ++i)
70 : {
71 0 : pName[i] = OUString::createFromAscii( aCH[i] );
72 : }
73 :
74 0 : SetDefaultValues();
75 0 : }
76 :
77 :
78 0 : PropertyChgHelper::PropertyChgHelper( const PropertyChgHelper &rHelper ) :
79 : PropertyChgHelperBase(),
80 0 : aLngSvcEvtListeners (GetLinguMutex())
81 : {
82 0 : RemoveAsPropListener();
83 0 : aPropNames = rHelper.aPropNames;
84 0 : xMyEvtObj = rHelper.xMyEvtObj;
85 0 : xPropSet = rHelper.xPropSet;
86 0 : nEvtFlags = rHelper.nEvtFlags;
87 0 : AddAsPropListener();
88 :
89 0 : SetDefaultValues();
90 0 : GetCurrentValues();
91 0 : }
92 :
93 :
94 0 : PropertyChgHelper::~PropertyChgHelper()
95 : {
96 0 : }
97 :
98 :
99 0 : void PropertyChgHelper::AddPropNames( const char *pNewNames[], sal_Int32 nCount )
100 : {
101 0 : if (pNewNames && nCount)
102 : {
103 0 : sal_Int32 nLen = GetPropNames().getLength();
104 0 : GetPropNames().realloc( nLen + nCount );
105 0 : OUString *pName = GetPropNames().getArray();
106 0 : for (sal_Int32 i = 0; i < nCount; ++i)
107 : {
108 0 : pName[ nLen + i ] = OUString::createFromAscii( pNewNames[ i ] );
109 :
110 : }
111 : }
112 0 : }
113 :
114 :
115 0 : void PropertyChgHelper::SetDefaultValues()
116 : {
117 0 : bResIsIgnoreControlCharacters = bIsIgnoreControlCharacters = true;
118 0 : bResIsUseDictionaryList = bIsUseDictionaryList = true;
119 0 : }
120 :
121 :
122 0 : void PropertyChgHelper::GetCurrentValues()
123 : {
124 0 : sal_Int32 nLen = GetPropNames().getLength();
125 0 : if (GetPropSet().is() && nLen)
126 : {
127 0 : const OUString *pPropName = GetPropNames().getConstArray();
128 0 : for (sal_Int32 i = 0; i < nLen; ++i)
129 : {
130 0 : bool *pbVal = NULL,
131 0 : *pbResVal = NULL;
132 :
133 0 : if ( pPropName[i] == UPN_IS_IGNORE_CONTROL_CHARACTERS )
134 : {
135 0 : pbVal = &bIsIgnoreControlCharacters;
136 0 : pbResVal = &bResIsIgnoreControlCharacters;
137 : }
138 0 : else if ( pPropName[i] == UPN_IS_USE_DICTIONARY_LIST )
139 : {
140 0 : pbVal = &bIsUseDictionaryList;
141 0 : pbResVal = &bResIsUseDictionaryList;
142 : }
143 :
144 0 : if (pbVal && pbResVal)
145 : {
146 0 : GetPropSet()->getPropertyValue( pPropName[i] ) >>= *pbVal;
147 0 : *pbResVal = *pbVal;
148 : }
149 : }
150 : }
151 0 : }
152 :
153 :
154 0 : void PropertyChgHelper::SetTmpPropVals( const PropertyValues &rPropVals )
155 : {
156 : // return value is default value unless there is an explicitly supplied
157 : // temporary value
158 0 : bResIsIgnoreControlCharacters = bIsIgnoreControlCharacters;
159 0 : bResIsUseDictionaryList = bIsUseDictionaryList;
160 :
161 0 : sal_Int32 nLen = rPropVals.getLength();
162 0 : if (nLen)
163 : {
164 0 : const PropertyValue *pVal = rPropVals.getConstArray();
165 0 : for (sal_Int32 i = 0; i < nLen; ++i)
166 : {
167 0 : bool *pbResVal = NULL;
168 0 : switch (pVal[i].Handle)
169 : {
170 : case UPH_IS_IGNORE_CONTROL_CHARACTERS :
171 0 : pbResVal = &bResIsIgnoreControlCharacters; break;
172 : case UPH_IS_USE_DICTIONARY_LIST :
173 0 : pbResVal = &bResIsUseDictionaryList; break;
174 : default:
175 : ;
176 : }
177 0 : if (pbResVal)
178 0 : pVal[i].Value >>= *pbResVal;
179 : }
180 : }
181 0 : }
182 :
183 :
184 0 : bool PropertyChgHelper::propertyChange_Impl( const PropertyChangeEvent& rEvt )
185 : {
186 0 : bool bRes = false;
187 :
188 0 : if (GetPropSet().is() && rEvt.Source == GetPropSet())
189 : {
190 0 : sal_Int16 nLngSvcFlags = (nEvtFlags & AE_HYPHENATOR) ?
191 0 : LinguServiceEventFlags::HYPHENATE_AGAIN : 0;
192 0 : bool bSCWA = false, // SPELL_CORRECT_WORDS_AGAIN ?
193 0 : bSWWA = false; // SPELL_WRONG_WORDS_AGAIN ?
194 :
195 0 : bool *pbVal = NULL;
196 0 : switch (rEvt.PropertyHandle)
197 : {
198 : case UPH_IS_IGNORE_CONTROL_CHARACTERS :
199 : {
200 0 : pbVal = &bIsIgnoreControlCharacters;
201 0 : nLngSvcFlags = 0;
202 0 : break;
203 : }
204 : case UPH_IS_USE_DICTIONARY_LIST :
205 : {
206 0 : pbVal = &bIsUseDictionaryList;
207 0 : bSCWA = bSWWA = true;
208 0 : break;
209 : }
210 : default:
211 : {
212 0 : bRes = false;
213 : }
214 : }
215 0 : if (pbVal)
216 0 : rEvt.NewValue >>= *pbVal;
217 :
218 0 : bRes = 0 != pbVal; // sth changed?
219 0 : if (bRes)
220 : {
221 0 : bool bSpellEvts = (nEvtFlags & AE_SPELLCHECKER);
222 0 : if (bSCWA && bSpellEvts)
223 0 : nLngSvcFlags |= LinguServiceEventFlags::SPELL_CORRECT_WORDS_AGAIN;
224 0 : if (bSWWA && bSpellEvts)
225 0 : nLngSvcFlags |= LinguServiceEventFlags::SPELL_WRONG_WORDS_AGAIN;
226 0 : if (nLngSvcFlags)
227 : {
228 0 : LinguServiceEvent aEvt( GetEvtObj(), nLngSvcFlags );
229 0 : LaunchEvent( aEvt );
230 : }
231 : }
232 : }
233 :
234 0 : return bRes;
235 : }
236 :
237 :
238 : void SAL_CALL
239 0 : PropertyChgHelper::propertyChange( const PropertyChangeEvent& rEvt )
240 : throw(RuntimeException, std::exception)
241 : {
242 0 : MutexGuard aGuard( GetLinguMutex() );
243 0 : propertyChange_Impl( rEvt );
244 0 : }
245 :
246 :
247 0 : void PropertyChgHelper::AddAsPropListener()
248 : {
249 0 : if (xPropSet.is())
250 : {
251 0 : sal_Int32 nLen = aPropNames.getLength();
252 0 : const OUString *pPropName = aPropNames.getConstArray();
253 0 : for (sal_Int32 i = 0; i < nLen; ++i)
254 : {
255 0 : if (!pPropName[i].isEmpty())
256 0 : xPropSet->addPropertyChangeListener( pPropName[i], this );
257 : }
258 : }
259 0 : }
260 :
261 0 : void PropertyChgHelper::RemoveAsPropListener()
262 : {
263 0 : if (xPropSet.is())
264 : {
265 0 : sal_Int32 nLen = aPropNames.getLength();
266 0 : const OUString *pPropName = aPropNames.getConstArray();
267 0 : for (sal_Int32 i = 0; i < nLen; ++i)
268 : {
269 0 : if (!pPropName[i].isEmpty())
270 0 : xPropSet->removePropertyChangeListener( pPropName[i], this );
271 : }
272 : }
273 0 : }
274 :
275 :
276 0 : void PropertyChgHelper::LaunchEvent( const LinguServiceEvent &rEvt )
277 : {
278 0 : cppu::OInterfaceIteratorHelper aIt( aLngSvcEvtListeners );
279 0 : while (aIt.hasMoreElements())
280 : {
281 0 : Reference< XLinguServiceEventListener > xRef( aIt.next(), UNO_QUERY );
282 0 : if (xRef.is())
283 0 : xRef->processLinguServiceEvent( rEvt );
284 0 : }
285 0 : }
286 :
287 :
288 0 : void SAL_CALL PropertyChgHelper::disposing( const EventObject& rSource )
289 : throw(RuntimeException, std::exception)
290 : {
291 0 : MutexGuard aGuard( GetLinguMutex() );
292 0 : if (rSource.Source == xPropSet)
293 : {
294 0 : RemoveAsPropListener();
295 0 : xPropSet = NULL;
296 0 : aPropNames.realloc( 0 );
297 0 : }
298 0 : }
299 :
300 :
301 : sal_Bool SAL_CALL
302 0 : PropertyChgHelper::addLinguServiceEventListener(
303 : const Reference< XLinguServiceEventListener >& rxListener )
304 : throw(RuntimeException, std::exception)
305 : {
306 0 : MutexGuard aGuard( GetLinguMutex() );
307 :
308 0 : sal_Bool bRes = sal_False;
309 0 : if (rxListener.is())
310 : {
311 0 : sal_Int32 nCount = aLngSvcEvtListeners.getLength();
312 0 : bRes = aLngSvcEvtListeners.addInterface( rxListener ) != nCount;
313 : }
314 0 : return bRes;
315 : }
316 :
317 :
318 : sal_Bool SAL_CALL
319 0 : PropertyChgHelper::removeLinguServiceEventListener(
320 : const Reference< XLinguServiceEventListener >& rxListener )
321 : throw(RuntimeException, std::exception)
322 : {
323 0 : MutexGuard aGuard( GetLinguMutex() );
324 :
325 0 : sal_Bool bRes = sal_False;
326 0 : if (rxListener.is())
327 : {
328 0 : sal_Int32 nCount = aLngSvcEvtListeners.getLength();
329 0 : bRes = aLngSvcEvtListeners.removeInterface( rxListener ) != nCount;
330 : }
331 0 : return bRes;
332 : }
333 :
334 :
335 :
336 0 : PropertyHelper_Thes::PropertyHelper_Thes(
337 : const Reference< XInterface > &rxSource,
338 : Reference< XLinguProperties > &rxPropSet ) :
339 0 : PropertyChgHelper ( rxSource, rxPropSet, 0 )
340 : {
341 0 : SetDefaultValues();
342 0 : GetCurrentValues();
343 0 : }
344 :
345 :
346 0 : PropertyHelper_Thes::~PropertyHelper_Thes()
347 : {
348 0 : }
349 :
350 :
351 : void SAL_CALL
352 0 : PropertyHelper_Thes::propertyChange( const PropertyChangeEvent& rEvt )
353 : throw(RuntimeException, std::exception)
354 : {
355 0 : MutexGuard aGuard( GetLinguMutex() );
356 0 : PropertyChgHelper::propertyChange_Impl( rEvt );
357 0 : }
358 :
359 :
360 :
361 : // list of properties from the property set to be used
362 : // and listened to
363 : static const char *aSP[] =
364 : {
365 : UPN_IS_SPELL_UPPER_CASE,
366 : UPN_IS_SPELL_WITH_DIGITS,
367 : UPN_IS_SPELL_CAPITALIZATION
368 : };
369 :
370 :
371 0 : PropertyHelper_Spell::PropertyHelper_Spell(
372 : const Reference< XInterface > & rxSource,
373 : Reference< XLinguProperties > &rxPropSet ) :
374 0 : PropertyChgHelper ( rxSource, rxPropSet, AE_SPELLCHECKER )
375 : {
376 0 : AddPropNames( aSP, sizeof(aSP) / sizeof(aSP[0]) );
377 0 : SetDefaultValues();
378 0 : GetCurrentValues();
379 :
380 0 : nResMaxNumberOfSuggestions = GetDefaultNumberOfSuggestions();
381 0 : }
382 :
383 :
384 0 : PropertyHelper_Spell::~PropertyHelper_Spell()
385 : {
386 0 : }
387 :
388 :
389 0 : void PropertyHelper_Spell::SetDefaultValues()
390 : {
391 0 : PropertyChgHelper::SetDefaultValues();
392 :
393 0 : bResIsSpellUpperCase = bIsSpellUpperCase = false;
394 0 : bResIsSpellWithDigits = bIsSpellWithDigits = false;
395 0 : bResIsSpellCapitalization = bIsSpellCapitalization = true;
396 0 : }
397 :
398 :
399 0 : void PropertyHelper_Spell::GetCurrentValues()
400 : {
401 0 : PropertyChgHelper::GetCurrentValues();
402 :
403 0 : sal_Int32 nLen = GetPropNames().getLength();
404 0 : if (GetPropSet().is() && nLen)
405 : {
406 0 : const OUString *pPropName = GetPropNames().getConstArray();
407 0 : for (sal_Int32 i = 0; i < nLen; ++i)
408 : {
409 0 : bool *pbVal = NULL,
410 0 : *pbResVal = NULL;
411 :
412 0 : if ( pPropName[i] == UPN_IS_SPELL_UPPER_CASE )
413 : {
414 0 : pbVal = &bIsSpellUpperCase;
415 0 : pbResVal = &bResIsSpellUpperCase;
416 : }
417 0 : else if ( pPropName[i] == UPN_IS_SPELL_WITH_DIGITS )
418 : {
419 0 : pbVal = &bIsSpellWithDigits;
420 0 : pbResVal = &bResIsSpellWithDigits;
421 : }
422 0 : else if ( pPropName[i] == UPN_IS_SPELL_CAPITALIZATION )
423 : {
424 0 : pbVal = &bIsSpellCapitalization;
425 0 : pbResVal = &bResIsSpellCapitalization;
426 : }
427 :
428 0 : if (pbVal && pbResVal)
429 : {
430 0 : GetPropSet()->getPropertyValue( pPropName[i] ) >>= *pbVal;
431 0 : *pbResVal = *pbVal;
432 : }
433 : }
434 : }
435 0 : }
436 :
437 :
438 0 : bool PropertyHelper_Spell::propertyChange_Impl( const PropertyChangeEvent& rEvt )
439 : {
440 0 : bool bRes = PropertyChgHelper::propertyChange_Impl( rEvt );
441 :
442 0 : if (!bRes && GetPropSet().is() && rEvt.Source == GetPropSet())
443 : {
444 0 : bool bSCWA = false, // SPELL_CORRECT_WORDS_AGAIN ?
445 0 : bSWWA = false; // SPELL_WRONG_WORDS_AGAIN ?
446 :
447 0 : bool *pbVal = NULL;
448 0 : switch (rEvt.PropertyHandle)
449 : {
450 : case UPH_IS_SPELL_UPPER_CASE :
451 : {
452 0 : pbVal = &bIsSpellUpperCase;
453 0 : bSCWA = ! *pbVal; // sal_False->sal_True change?
454 0 : bSWWA = !bSCWA; // sal_True->sal_False change?
455 0 : break;
456 : }
457 : case UPH_IS_SPELL_WITH_DIGITS :
458 : {
459 0 : pbVal = &bIsSpellWithDigits;
460 0 : bSCWA = ! *pbVal; // sal_False->sal_True change?
461 0 : bSWWA = !bSCWA; // sal_True->sal_False change?
462 0 : break;
463 : }
464 : case UPH_IS_SPELL_CAPITALIZATION :
465 : {
466 0 : pbVal = &bIsSpellCapitalization;
467 0 : bSCWA = ! *pbVal; // sal_False->sal_True change?
468 0 : bSWWA = !bSCWA; // sal_True->sal_False change?
469 0 : break;
470 : }
471 : default:
472 : DBG_ASSERT( false, "unknown property" );
473 : }
474 0 : if (pbVal)
475 0 : rEvt.NewValue >>= *pbVal;
476 :
477 0 : bRes = (pbVal != 0);
478 0 : if (bRes)
479 : {
480 0 : sal_Int16 nLngSvcFlags = 0;
481 0 : if (bSCWA)
482 0 : nLngSvcFlags |= LinguServiceEventFlags::SPELL_CORRECT_WORDS_AGAIN;
483 0 : if (bSWWA)
484 0 : nLngSvcFlags |= LinguServiceEventFlags::SPELL_WRONG_WORDS_AGAIN;
485 0 : if (nLngSvcFlags)
486 : {
487 0 : LinguServiceEvent aEvt( GetEvtObj(), nLngSvcFlags );
488 0 : LaunchEvent( aEvt );
489 : }
490 : }
491 : }
492 :
493 0 : return bRes;
494 : }
495 :
496 :
497 : void SAL_CALL
498 0 : PropertyHelper_Spell::propertyChange( const PropertyChangeEvent& rEvt )
499 : throw(RuntimeException, std::exception)
500 : {
501 0 : MutexGuard aGuard( GetLinguMutex() );
502 0 : propertyChange_Impl( rEvt );
503 0 : }
504 :
505 :
506 0 : void PropertyHelper_Spell::SetTmpPropVals( const PropertyValues &rPropVals )
507 : {
508 0 : PropertyChgHelper::SetTmpPropVals( rPropVals );
509 :
510 : // return value is default value unless there is an explicitly supplied
511 : // temporary value
512 0 : nResMaxNumberOfSuggestions = GetDefaultNumberOfSuggestions();
513 0 : bResIsSpellWithDigits = bIsSpellWithDigits;
514 0 : bResIsSpellCapitalization = bIsSpellCapitalization;
515 0 : bResIsSpellUpperCase = bIsSpellUpperCase;
516 :
517 0 : sal_Int32 nLen = rPropVals.getLength();
518 0 : if (nLen)
519 : {
520 0 : const PropertyValue *pVal = rPropVals.getConstArray();
521 0 : for (sal_Int32 i = 0; i < nLen; ++i)
522 : {
523 0 : if ( pVal[i].Name == UPN_MAX_NUMBER_OF_SUGGESTIONS )
524 : {
525 0 : pVal[i].Value >>= nResMaxNumberOfSuggestions;
526 : }
527 : else
528 : {
529 0 : bool *pbResVal = NULL;
530 0 : switch (pVal[i].Handle)
531 : {
532 0 : case UPH_IS_SPELL_UPPER_CASE : pbResVal = &bResIsSpellUpperCase; break;
533 0 : case UPH_IS_SPELL_WITH_DIGITS : pbResVal = &bResIsSpellWithDigits; break;
534 0 : case UPH_IS_SPELL_CAPITALIZATION : pbResVal = &bResIsSpellCapitalization; break;
535 : default:
536 : DBG_ASSERT( false, "unknown property" );
537 : }
538 0 : if (pbResVal)
539 0 : pVal[i].Value >>= *pbResVal;
540 : }
541 : }
542 : }
543 0 : }
544 :
545 0 : sal_Int16 PropertyHelper_Spell::GetDefaultNumberOfSuggestions() const
546 : {
547 0 : return 16;
548 : }
549 :
550 :
551 : static const char *aHP[] =
552 : {
553 : UPN_HYPH_MIN_LEADING,
554 : UPN_HYPH_MIN_TRAILING,
555 : UPN_HYPH_MIN_WORD_LENGTH
556 : };
557 :
558 :
559 0 : PropertyHelper_Hyphen::PropertyHelper_Hyphen(
560 : const Reference< XInterface > & rxSource,
561 : Reference< XLinguProperties > &rxPropSet ) :
562 0 : PropertyChgHelper ( rxSource, rxPropSet, AE_HYPHENATOR )
563 : {
564 0 : AddPropNames( aHP, sizeof(aHP) / sizeof(aHP[0]) );
565 0 : SetDefaultValues();
566 0 : GetCurrentValues();
567 0 : }
568 :
569 :
570 0 : PropertyHelper_Hyphen::~PropertyHelper_Hyphen()
571 : {
572 0 : }
573 :
574 :
575 0 : void PropertyHelper_Hyphen::SetDefaultValues()
576 : {
577 0 : PropertyChgHelper::SetDefaultValues();
578 :
579 0 : nResHyphMinLeading = nHyphMinLeading = 2;
580 0 : nResHyphMinTrailing = nHyphMinTrailing = 2;
581 0 : nResHyphMinWordLength = nHyphMinWordLength = 0;
582 0 : }
583 :
584 :
585 0 : void PropertyHelper_Hyphen::GetCurrentValues()
586 : {
587 0 : PropertyChgHelper::GetCurrentValues();
588 :
589 0 : sal_Int32 nLen = GetPropNames().getLength();
590 0 : if (GetPropSet().is() && nLen)
591 : {
592 0 : const OUString *pPropName = GetPropNames().getConstArray();
593 0 : for (sal_Int32 i = 0; i < nLen; ++i)
594 : {
595 0 : sal_Int16 *pnVal = NULL,
596 0 : *pnResVal = NULL;
597 :
598 0 : if ( pPropName[i] == UPN_HYPH_MIN_LEADING )
599 : {
600 0 : pnVal = &nHyphMinLeading;
601 0 : pnResVal = &nResHyphMinLeading;
602 : }
603 0 : else if ( pPropName[i] == UPN_HYPH_MIN_TRAILING )
604 : {
605 0 : pnVal = &nHyphMinTrailing;
606 0 : pnResVal = &nResHyphMinTrailing;
607 : }
608 0 : else if ( pPropName[i] == UPN_HYPH_MIN_WORD_LENGTH )
609 : {
610 0 : pnVal = &nHyphMinWordLength;
611 0 : pnResVal = &nResHyphMinWordLength;
612 : }
613 :
614 0 : if (pnVal && pnResVal)
615 : {
616 0 : GetPropSet()->getPropertyValue( pPropName[i] ) >>= *pnVal;
617 0 : *pnResVal = *pnVal;
618 : }
619 : }
620 : }
621 0 : }
622 :
623 :
624 0 : bool PropertyHelper_Hyphen::propertyChange_Impl( const PropertyChangeEvent& rEvt )
625 : {
626 0 : bool bRes = PropertyChgHelper::propertyChange_Impl( rEvt );
627 :
628 0 : if (!bRes && GetPropSet().is() && rEvt.Source == GetPropSet())
629 : {
630 0 : sal_Int16 nLngSvcFlags = LinguServiceEventFlags::HYPHENATE_AGAIN;
631 :
632 0 : sal_Int16 *pnVal = NULL;
633 0 : switch (rEvt.PropertyHandle)
634 : {
635 0 : case UPH_HYPH_MIN_LEADING : pnVal = &nHyphMinLeading; break;
636 0 : case UPH_HYPH_MIN_TRAILING : pnVal = &nHyphMinTrailing; break;
637 0 : case UPH_HYPH_MIN_WORD_LENGTH : pnVal = &nHyphMinWordLength; break;
638 : default:
639 : DBG_ASSERT( false, "unknown property" );
640 : }
641 0 : if (pnVal)
642 0 : rEvt.NewValue >>= *pnVal;
643 :
644 0 : bRes = (pnVal != 0);
645 0 : if (bRes)
646 : {
647 0 : if (nLngSvcFlags)
648 : {
649 0 : LinguServiceEvent aEvt( GetEvtObj(), nLngSvcFlags );
650 0 : LaunchEvent( aEvt );
651 : }
652 : }
653 : }
654 :
655 0 : return bRes;
656 : }
657 :
658 :
659 : void SAL_CALL
660 0 : PropertyHelper_Hyphen::propertyChange( const PropertyChangeEvent& rEvt )
661 : throw(RuntimeException, std::exception)
662 : {
663 0 : MutexGuard aGuard( GetLinguMutex() );
664 0 : propertyChange_Impl( rEvt );
665 0 : }
666 :
667 :
668 0 : void PropertyHelper_Hyphen::SetTmpPropVals( const PropertyValues &rPropVals )
669 : {
670 0 : PropertyChgHelper::SetTmpPropVals( rPropVals );
671 :
672 : // return value is default value unless there is an explicitly supplied
673 : // temporary value
674 0 : nResHyphMinLeading = nHyphMinLeading;
675 0 : nResHyphMinTrailing = nHyphMinTrailing;
676 0 : nResHyphMinWordLength = nHyphMinWordLength;
677 :
678 0 : sal_Int32 nLen = rPropVals.getLength();
679 :
680 0 : if (nLen)
681 : {
682 0 : const PropertyValue *pVal = rPropVals.getConstArray();
683 0 : for (sal_Int32 i = 0; i < nLen; ++i)
684 : {
685 0 : sal_Int16 *pnResVal = NULL;
686 :
687 0 : if ( pVal[i].Name == UPN_HYPH_MIN_LEADING )
688 0 : pnResVal = &nResHyphMinLeading;
689 0 : else if ( pVal[i].Name == UPN_HYPH_MIN_TRAILING )
690 0 : pnResVal = &nResHyphMinTrailing;
691 0 : else if ( pVal[i].Name == UPN_HYPH_MIN_WORD_LENGTH )
692 0 : pnResVal = &nResHyphMinWordLength;
693 :
694 : DBG_ASSERT( pnResVal, "unknown property" );
695 :
696 0 : if (pnResVal)
697 0 : pVal[i].Value >>= *pnResVal;
698 : }
699 : }
700 0 : }
701 :
702 0 : PropertyHelper_Thesaurus::PropertyHelper_Thesaurus(
703 : const ::com::sun::star::uno::Reference<
704 : ::com::sun::star::uno::XInterface > &rxSource,
705 : ::com::sun::star::uno::Reference<
706 0 : ::com::sun::star::linguistic2::XLinguProperties > &rxPropSet )
707 : {
708 0 : pInst = new PropertyHelper_Thes( rxSource, rxPropSet );
709 0 : xPropHelper = pInst;
710 0 : }
711 :
712 0 : PropertyHelper_Thesaurus::~PropertyHelper_Thesaurus()
713 : {
714 0 : }
715 :
716 0 : void PropertyHelper_Thesaurus::AddAsPropListener()
717 : {
718 0 : pInst->AddAsPropListener();
719 0 : }
720 :
721 0 : void PropertyHelper_Thesaurus::RemoveAsPropListener()
722 : {
723 0 : pInst->RemoveAsPropListener();
724 0 : }
725 :
726 0 : void PropertyHelper_Thesaurus::SetTmpPropVals( const com::sun::star::beans::PropertyValues &rPropVals )
727 : {
728 0 : pInst->SetTmpPropVals( rPropVals );
729 0 : }
730 :
731 0 : PropertyHelper_Hyphenation::PropertyHelper_Hyphenation(
732 : const ::com::sun::star::uno::Reference<
733 : ::com::sun::star::uno::XInterface > &rxSource,
734 : ::com::sun::star::uno::Reference<
735 0 : ::com::sun::star::linguistic2::XLinguProperties > &rxPropSet)
736 : {
737 0 : pInst = new PropertyHelper_Hyphen( rxSource, rxPropSet );
738 0 : xPropHelper = pInst;
739 0 : }
740 :
741 0 : PropertyHelper_Hyphenation::~PropertyHelper_Hyphenation()
742 : {
743 0 : }
744 :
745 0 : void PropertyHelper_Hyphenation::AddAsPropListener()
746 : {
747 0 : pInst->AddAsPropListener();
748 0 : }
749 :
750 0 : void PropertyHelper_Hyphenation::RemoveAsPropListener()
751 : {
752 0 : pInst->RemoveAsPropListener();
753 0 : }
754 :
755 0 : void PropertyHelper_Hyphenation::SetTmpPropVals( const com::sun::star::beans::PropertyValues &rPropVals )
756 : {
757 0 : pInst->SetTmpPropVals( rPropVals );
758 0 : }
759 :
760 0 : sal_Int16 PropertyHelper_Hyphenation::GetMinLeading() const
761 : {
762 0 : return pInst->GetMinLeading();
763 : }
764 :
765 0 : sal_Int16 PropertyHelper_Hyphenation::GetMinTrailing() const
766 : {
767 0 : return pInst->GetMinTrailing();
768 : }
769 :
770 0 : sal_Int16 PropertyHelper_Hyphenation::GetMinWordLength() const
771 : {
772 0 : return pInst->GetMinWordLength();
773 : }
774 :
775 0 : sal_Bool PropertyHelper_Hyphenation::addLinguServiceEventListener(
776 : const ::com::sun::star::uno::Reference<
777 : ::com::sun::star::linguistic2::XLinguServiceEventListener >& rxListener )
778 : throw(::com::sun::star::uno::RuntimeException)
779 : {
780 0 : return pInst->addLinguServiceEventListener( rxListener );
781 : }
782 :
783 0 : sal_Bool PropertyHelper_Hyphenation::removeLinguServiceEventListener(
784 : const ::com::sun::star::uno::Reference<
785 : ::com::sun::star::linguistic2::XLinguServiceEventListener >& rxListener )
786 : throw(::com::sun::star::uno::RuntimeException)
787 : {
788 0 : return pInst->removeLinguServiceEventListener( rxListener );
789 : }
790 :
791 0 : PropertyHelper_Spelling::PropertyHelper_Spelling(
792 : const ::com::sun::star::uno::Reference<
793 : ::com::sun::star::uno::XInterface > &rxSource,
794 : ::com::sun::star::uno::Reference<
795 0 : ::com::sun::star::linguistic2::XLinguProperties > &rxPropSet )
796 : {
797 0 : pInst = new PropertyHelper_Spell( rxSource, rxPropSet );
798 0 : xPropHelper = pInst;
799 0 : }
800 :
801 0 : PropertyHelper_Spelling::~PropertyHelper_Spelling()
802 : {
803 0 : }
804 :
805 0 : void PropertyHelper_Spelling::AddAsPropListener()
806 : {
807 0 : pInst->AddAsPropListener();
808 0 : }
809 :
810 0 : void PropertyHelper_Spelling::RemoveAsPropListener()
811 : {
812 0 : pInst->RemoveAsPropListener();
813 0 : }
814 :
815 0 : void PropertyHelper_Spelling::SetTmpPropVals( const com::sun::star::beans::PropertyValues &rPropVals )
816 : {
817 0 : pInst->SetTmpPropVals( rPropVals );
818 0 : }
819 :
820 0 : bool PropertyHelper_Spelling::IsSpellUpperCase() const
821 : {
822 0 : return pInst->IsSpellUpperCase();
823 : }
824 :
825 0 : bool PropertyHelper_Spelling::IsSpellWithDigits() const
826 : {
827 0 : return pInst->IsSpellWithDigits();
828 : }
829 :
830 0 : bool PropertyHelper_Spelling::IsSpellCapitalization() const
831 : {
832 0 : return pInst->IsSpellCapitalization();
833 : }
834 :
835 0 : bool PropertyHelper_Spelling::addLinguServiceEventListener(
836 : const ::com::sun::star::uno::Reference<
837 : ::com::sun::star::linguistic2::XLinguServiceEventListener >& rxListener )
838 : throw(::com::sun::star::uno::RuntimeException)
839 : {
840 0 : return pInst->addLinguServiceEventListener( rxListener );
841 : }
842 :
843 0 : bool PropertyHelper_Spelling::removeLinguServiceEventListener(
844 : const ::com::sun::star::uno::Reference<
845 : ::com::sun::star::linguistic2::XLinguServiceEventListener >& rxListener )
846 : throw(::com::sun::star::uno::RuntimeException)
847 : {
848 0 : return pInst->removeLinguServiceEventListener( rxListener );
849 : }
850 :
851 : } // namespace linguistic
852 :
853 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|