1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: thesdlg.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svx.hxx"
33 #include <tools/shl.hxx>
34 #include <svtools/lngmisc.hxx>
35 #include <vcl/wrkwin.hxx>
36 #ifndef _MSGBOX_HXX //autogen
37 #include <vcl/msgbox.hxx>
39 #ifndef _APP_HXX //autogen
40 #include <vcl/svapp.hxx>
42 #include <com/sun/star/linguistic2/XThesaurus.hpp>
43 #include <com/sun/star/linguistic2/XMeaning.hpp>
46 #define _SVX_THESDLG_CXX
48 #include <svx/thesdlg.hxx>
49 #include "dlgutil.hxx"
50 #include <svx/dialmgr.hxx>
53 #include <svx/dialogs.hrc>
54 #include "thesdlg.hrc"
55 #include <unolingu.hxx>
56 #include <svx/langbox.hxx>
59 using namespace ::com::sun::star
;
60 using namespace ::com::sun::star::lang
;
61 using namespace ::com::sun::star::uno
;
62 using namespace ::com::sun::star::beans
;
63 using namespace ::com::sun::star::linguistic2
;
67 //#define S2U(s) StringToOUString(s, CHARSET_SYSTEM)
68 //#define U2S(s) OUStringToString(s, CHARSET_SYSTEM)
71 // GetReplaceEditString -------------------------------
73 static void GetReplaceEditString( String
&rText
)
75 // The strings returned by the thesaurus saometimes have some
76 // explanation text put in between '(' and ')' or a trailing '*'.
77 // These parts should not be put in the ReplaceEdit Text that may get
78 // inserted into the document. Thus we strip them from the text.
80 xub_StrLen nPos
= rText
.Search( sal_Unicode('(') );
81 while (STRING_NOTFOUND
!= nPos
)
83 xub_StrLen nEnd
= rText
.Search( sal_Unicode(')'), nPos
);
84 if (STRING_NOTFOUND
!= nEnd
)
85 rText
.Erase( nPos
, nEnd
-nPos
+1 );
88 nPos
= rText
.Search( sal_Unicode('(') );
91 nPos
= rText
.Search( sal_Unicode('*') );
92 if (STRING_NOTFOUND
!= nPos
)
95 // remove any possible remaining ' ' that may confuse the thesaurus
96 // when it gets called with the text
97 rText
.EraseLeadingAndTrailingChars( sal_Unicode(' ') );
100 // struct ThesDlg_Impl ---------------------------------------------------
104 Reference
< XThesaurus
> xThesaurus
;
105 ::rtl::OUString aLookUpText
;
106 sal_Int16 nLookUpLanguage
;
108 ThesDlg_Impl( Reference
< XThesaurus
> & xThes
);
109 SfxErrorContext
* pErrContext
; // ErrorContext,
110 // w"ahrend der Dialog oben ist
113 ThesDlg_Impl::ThesDlg_Impl(Reference
< XThesaurus
> & xThes
) :
117 nLookUpLanguage
= LANGUAGE_NONE
;
121 // class SvxThesaurusLanguageDlg_Impl ------------------------------------
123 class SvxThesaurusLanguageDlg_Impl
: public ModalDialog
126 SvxLanguageBox aLangLB
;
129 CancelButton aCancelBtn
;
132 DECL_LINK( DoubleClickHdl_Impl
, ListBox
* );
135 SvxThesaurusLanguageDlg_Impl( Window
* pParent
);
137 sal_uInt16
GetLanguage() const;
138 void SetLanguage( sal_uInt16 nLang
);
141 // -----------------------------------------------------------------------
144 SvxThesaurusLanguageDlg_Impl::SvxThesaurusLanguageDlg_Impl( Window
* pParent
) :
146 ModalDialog( pParent
, SVX_RES( RID_SVXDLG_THES_LANGUAGE
) ),
148 aLangLB ( this, SVX_RES( LB_THES_LANGUAGE
) ),
149 aLangFL ( this, SVX_RES( FL_THES_LANGUAGE
) ),
150 aOKBtn ( this, SVX_RES( BTN_LANG_OK
) ),
151 aCancelBtn ( this, SVX_RES( BTN_LANG_CANCEL
) ),
152 aHelpBtn ( this, SVX_RES( BTN_LANG_HELP
) )
156 aLangLB
.SetLanguageList( LANG_LIST_THES_USED
, FALSE
, FALSE
);
157 aLangLB
.SetDoubleClickHdl(
158 LINK( this, SvxThesaurusLanguageDlg_Impl
, DoubleClickHdl_Impl
) );
162 // -----------------------------------------------------------------------
164 sal_uInt16
SvxThesaurusLanguageDlg_Impl::GetLanguage() const
166 sal_uInt16 nLang
= aLangLB
.GetSelectLanguage();
170 // -----------------------------------------------------------------------
172 void SvxThesaurusLanguageDlg_Impl::SetLanguage( sal_uInt16 nLang
)
174 aLangLB
.SelectLanguage( nLang
);
177 // -----------------------------------------------------------------------
179 IMPL_LINK_INLINE_START( SvxThesaurusLanguageDlg_Impl
, DoubleClickHdl_Impl
, ListBox
*, EMPTYARG
)
184 IMPL_LINK_INLINE_END( SvxThesaurusLanguageDlg_Impl
, DoubleClickHdl_Impl
, ListBox
*, EMPTYARG
)
186 // class SvxThesaurusDialog ----------------------------------------------
189 // -----------------------------------------------------------------------
192 SvxThesaurusDialog::SvxThesaurusDialog( Window
* pParent
, Reference
< XThesaurus
> xThes
,
193 const String
&rWord
, sal_Int16 nLanguage
) :
195 SvxStandardDialog( pParent
, SVX_RES( RID_SVXDLG_THESAURUS
) ),
197 aWordText ( this, SVX_RES( FT_WORD
) ),
198 aWordLB ( this, SVX_RES( LB_WORD
) ),
199 aReplaceText( this, SVX_RES( FT_REPL
) ),
200 aReplaceEdit( this, SVX_RES( ED_REPL
) ),
201 aMeanText ( this, SVX_RES( FT_MEAN
) ),
202 aMeanLB ( this, SVX_RES( LB_MEAN
) ),
203 aSynonymText( this, SVX_RES( FT_SYNON
) ),
204 aSynonymLB ( this, SVX_RES( LB_SYNON
) ),
205 aVarFL ( this, SVX_RES( FL_VAR
) ),
206 aOkBtn ( this, SVX_RES( BTN_THES_OK
) ),
207 aCancelBtn ( this, SVX_RES( BTN_THES_CANCEL
) ),
208 aLookUpBtn ( this, SVX_RES( BTN_LOOKUP
) ),
209 aLangBtn ( this, SVX_RES( BTN_LANGUAGE
) ),
210 aHelpBtn ( this, SVX_RES( BTN_THES_HELP
) ),
211 aErrStr ( SVX_RES( STR_ERR_WORDNOTFOUND
) )
213 pImpl
= new ThesDlg_Impl( xThes
);
214 pImpl
->aLookUpText
= ::rtl::OUString( rWord
);
215 pImpl
->nLookUpLanguage
= nLanguage
;
217 new SfxErrorContext( ERRCTX_SVX_LINGU_THESAURUS
, String(), this,
218 RID_SVXERRCTX
, &DIALOG_MGR() );
220 aLangBtn
.SetClickHdl( LINK( this, SvxThesaurusDialog
, LanguageHdl_Impl
) );
221 aLookUpBtn
.SetClickHdl( LINK( this, SvxThesaurusDialog
, LookUpHdl_Impl
) );
222 aMeanLB
.SetSelectHdl( LINK( this, SvxThesaurusDialog
, EntryHdl_Impl
) );
223 aSynonymLB
.SetSelectHdl( LINK( this, SvxThesaurusDialog
, SynonymHdl_Impl
) );
224 Link aLink
= LINK( this, SvxThesaurusDialog
, SelectHdl_Impl
);
225 aMeanLB
.SetDoubleClickHdl( aLink
);
226 aSynonymLB
.SetDoubleClickHdl( aLink
);
227 aWordLB
.SetSelectHdl( aLink
);
231 ::rtl::OUString
aTmp( rWord
);
232 linguistic::RemoveHyphens( aTmp
);
233 linguistic::ReplaceControlChars( aTmp
);
234 aReplaceEdit
.SetText( aTmp
);
235 aWordLB
.InsertEntry( aTmp
);
236 aWordLB
.SelectEntry( aTmp
);
238 Init_Impl( nLanguage
);
240 // disable controls if service is missing
241 if (!pImpl
->xThesaurus
.is())
246 // -----------------------------------------------------------------------
248 SvxThesaurusDialog::~SvxThesaurusDialog()
250 delete pImpl
->pErrContext
;
254 // -----------------------------------------------------------------------
256 uno::Sequence
< Reference
< XMeaning
> > SAL_CALL
257 SvxThesaurusDialog::queryMeanings_Impl(
258 ::rtl::OUString
& rTerm
,
259 const Locale
& rLocale
,
260 const beans::PropertyValues
& rProperties
)
261 throw(lang::IllegalArgumentException
, uno::RuntimeException
)
263 uno::Sequence
< Reference
< XMeaning
> > aMeanings(
264 pImpl
->xThesaurus
->queryMeanings( rTerm
, rLocale
, rProperties
) );
266 // text with '.' at the end?
267 if (0 == aMeanings
.getLength() && rTerm
.getLength() &&
268 rTerm
.getStr()[ rTerm
.getLength() - 1 ] == '.')
270 // try again without trailing '.' chars. It may be a word at the
271 // end of a sentence and not an abbreviation...
272 String
aTxt( rTerm
);
273 aTxt
.EraseTrailingChars( '.' );
274 aMeanings
= pImpl
->xThesaurus
->queryMeanings( aTxt
, rLocale
, rProperties
);
275 if (aMeanings
.getLength())
284 // -----------------------------------------------------------------------
286 sal_uInt16
SvxThesaurusDialog::GetLanguage() const
288 return pImpl
->nLookUpLanguage
;
291 // -----------------------------------------------------------------------
293 void SvxThesaurusDialog::UpdateMeaningBox_Impl( uno::Sequence
< Reference
< XMeaning
> > *pMeaningSeq
)
295 // create temporary meaning list if not supplied from somewhere else
296 sal_Bool bTmpSeq
= sal_False
;
297 if (!pMeaningSeq
&& pImpl
->xThesaurus
.is())
300 lang::Locale
aLocale( SvxCreateLocale( pImpl
->nLookUpLanguage
) );
301 uno::Sequence
< Reference
< XMeaning
> > aTmpMean
= queryMeanings_Impl(
302 pImpl
->aLookUpText
, aLocale
, Sequence
< PropertyValue
>() );
304 pMeaningSeq
= new Sequence
< Reference
< XMeaning
> > ( aTmpMean
);
306 // set new replace edit text if a different look up text was used
307 // see: queryMeanings_Impl
308 aReplaceEdit
.SetText( pImpl
->aLookUpText
);
311 sal_Int32 nMeaningCount
= pMeaningSeq
? pMeaningSeq
->getLength() : 0;
312 const Reference
< XMeaning
> *pMeaning
= pMeaningSeq
? pMeaningSeq
->getConstArray() : NULL
;
314 for ( sal_Int32 i
= 0; i
< nMeaningCount
; ++i
)
315 aMeanLB
.InsertEntry( pMeaning
[i
]->getMeaning() );
317 // remove temporary meaning list
321 if (aMeanLB
.GetEntryCount() > 0)
322 aMeanLB
.SelectEntryPos(0);
323 UpdateSynonymBox_Impl();
327 // -----------------------------------------------------------------------
328 void SvxThesaurusDialog::UpdateSynonymBox_Impl()
333 sal_uInt16 nPos
= aMeanLB
.GetSelectEntryPos(); // active meaning pos
334 if (nPos
!= LISTBOX_ENTRY_NOTFOUND
&& pImpl
->xThesaurus
.is())
336 // get Reference< XMeaning > for selected meaning
337 lang::Locale
aLocale( SvxCreateLocale( pImpl
->nLookUpLanguage
) );
338 Reference
< XMeaning
> xMeaning
= queryMeanings_Impl(
339 pImpl
->aLookUpText
, aLocale
, Sequence
< PropertyValue
>() )
340 .getConstArray()[ nPos
];
342 uno::Sequence
< ::rtl::OUString
> aSynonyms
;
344 aSynonyms
= xMeaning
->querySynonyms();
346 sal_Int32 nSynonymCount
= aSynonyms
.getLength();
347 const ::rtl::OUString
*pSynonym
= aSynonyms
.getConstArray();
348 for ( sal_Int32 i
=0; i
< nSynonymCount
; ++i
)
349 aSynonymLB
.InsertEntry( pSynonym
[i
] );
354 // -----------------------------------------------------------------------
356 void SvxThesaurusDialog::Apply()
360 // -----------------------------------------------------------------------
361 void SvxThesaurusDialog::Init_Impl(sal_Int16 nLanguage
)
364 String
aStr( GetText() );
365 aStr
.Erase( aStr
.Search( sal_Unicode( '(' ) ) - 1 );
366 aStr
.Append( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( " (" ) ) );
367 //aStr += GetLanguageString( (LanguageType)pImpl->pThesaurus->GetLanguage() );
368 aStr
+= GetLanguageString( (LanguageType
) nLanguage
);
369 aStr
.Append( sal_Unicode( ')' ) );
370 SetText( aStr
); // Text der Window-Leiste setzen (Wort + Sprache)
372 // adapt meanings according to (new) language
373 UpdateMeaningBox_Impl();
376 // -----------------------------------------------------------------------
378 IMPL_LINK( SvxThesaurusDialog
, LookUpHdl_Impl
, Button
*, pBtn
)
383 String
aText( aReplaceEdit
.GetText() );
385 ::rtl::OUString aOldLookUpText
= pImpl
->aLookUpText
;
386 pImpl
->aLookUpText
= ::rtl::OUString( aText
);
388 uno::Sequence
< Reference
< XMeaning
> > aMeanings
;
389 if (pImpl
->xThesaurus
.is())
390 aMeanings
= queryMeanings_Impl(
392 SvxCreateLocale( pImpl
->nLookUpLanguage
),
393 Sequence
< PropertyValue
>() );
396 if ( aMeanings
.getLength() == 0 )
398 if( pBtn
== &aCancelBtn
) // called via double click
400 pImpl
->aLookUpText
= aOldLookUpText
;
404 UpdateMeaningBox_Impl( &aMeanings
);
405 if( pBtn
== &aLookUpBtn
)
406 InfoBox( this, aErrStr
).Execute();
411 UpdateMeaningBox_Impl( &aMeanings
);
413 if ( aWordLB
.GetEntryPos( aText
) == LISTBOX_ENTRY_NOTFOUND
)
414 aWordLB
.InsertEntry( aText
);
416 aWordLB
.SelectEntry( aText
);
417 aMeanLB
.SelectEntryPos( 0 );
419 String
aStr( aMeanLB
.GetSelectEntry() );
420 GetReplaceEditString( aStr
);
421 aReplaceEdit
.SetText( aStr
);
422 aSynonymLB
.SetNoSelection();
427 // -----------------------------------------------------------------------
429 IMPL_LINK( SvxThesaurusDialog
, LanguageHdl_Impl
, Button
*, EMPTYARG
)
431 if (!pImpl
->xThesaurus
.is())
434 SvxThesaurusLanguageDlg_Impl
aDlg( this );
435 sal_uInt16 nLang
= pImpl
->nLookUpLanguage
;
436 aDlg
.SetLanguage( nLang
);
438 if ( aDlg
.Execute() == RET_OK
)
440 nLang
= aDlg
.GetLanguage();
441 if (pImpl
->xThesaurus
->hasLocale( SvxCreateLocale( nLang
) ))
442 pImpl
->nLookUpLanguage
= nLang
;
443 UpdateMeaningBox_Impl();
450 // -----------------------------------------------------------------------
452 IMPL_LINK( SvxThesaurusDialog
, SynonymHdl_Impl
, ListBox
*, EMPTYARG
)
454 if ( aSynonymLB
.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND
)
456 String
aStr( aSynonymLB
.GetSelectEntry() );
457 GetReplaceEditString( aStr
);
458 aReplaceEdit
.SetText( aStr
);
463 // -----------------------------------------------------------------------
465 IMPL_LINK( SvxThesaurusDialog
, SelectHdl_Impl
, ListBox
*, pBox
)
467 String
aStr( pBox
->GetSelectEntry() );
468 GetReplaceEditString( aStr
);
469 aReplaceEdit
.SetText( aStr
);
471 //! 'aCancelBtn' is used to indicate that the handler is called as result
472 //! of a double click action.
473 LookUpHdl_Impl( &aCancelBtn
/* ??? &aLookUpBtn */ );
478 // -----------------------------------------------------------------------
480 IMPL_LINK( SvxThesaurusDialog
, EntryHdl_Impl
, ListBox
*, EMPTYARG
)
483 UpdateSynonymBox_Impl();
488 // -----------------------------------------------------------------------
490 IMPL_LINK( SvxThesaurusDialog
, SpellErrorHdl_Impl
, void *, pError
)
492 // Der "ubergebene Pointer pError ist die falsche Sprachen-Nummer
493 LanguageType eLang
= (LanguageType
)(sal_uIntPtr
)pError
;
494 String
aErr( ::GetLanguageString( eLang
) );
495 // Fehlermeldung ausgeben
496 ErrorHandler::HandleError(
497 *new StringErrorInfo( ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS
, aErr
) );