Files
libreoffice/svx/source/dialog/thesdlg.cxx
Kurt Zenker 6ecd1d21e2 INTEGRATION: CWS intptr (1.11.206); FILE MERGED
2005/09/13 14:50:11 kendy 1.11.206.1: #i54498#
Introduce and use sal_IntPtr/sal_uIntPtr for ints where we have to store a pointer
2005-10-05 13:36:47 +00:00

527 lines
16 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: thesdlg.cxx,v $
*
* $Revision: 1.13 $
*
* last change: $Author: kz $ $Date: 2005-10-05 14:36:47 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
************************************************************************/
#pragma hdrstop
// include ---------------------------------------------------------------
#ifndef _SHL_HXX
#include <tools/shl.hxx>
#endif
#ifndef _SVTOOLS_LNGMISC_HXX_
#include <svtools/lngmisc.hxx>
#endif
#ifndef _SV_WRKWIN_HXX
#include <vcl/wrkwin.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _APP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC2_XTHESAURUS_HPP_
#include <com/sun/star/linguistic2/XThesaurus.hpp>
#endif
#ifndef _COM_SUN_STAR_LINGUISTIC2_XMEANING_HPP_
#include <com/sun/star/linguistic2/XMeaning.hpp>
#endif
#define _SVX_THESDLG_CXX
#include "thesdlg.hxx"
#include "dlgutil.hxx"
#include "dialmgr.hxx"
#include "svxerr.hxx"
#include "dialogs.hrc"
#include "thesdlg.hrc"
#ifndef _UNO_LINGU_HXX
#include <unolingu.hxx>
#endif
#ifndef _SVX_LANGBOX_HXX
#include <langbox.hxx>
#endif
using namespace ::rtl;
using namespace ::com::sun::star;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::linguistic2;
#define S2U(s) StringToOUString(s, CHARSET_SYSTEM)
#define U2S(s) OUStringToString(s, CHARSET_SYSTEM)
// GetReplaceEditString -------------------------------
static void GetReplaceEditString( String &rText )
{
// The strings returned by the thesaurus saometimes have some
// explanation text put in between '(' and ')' or a trailing '*'.
// These parts should not be put in the ReplaceEdit Text that may get
// inserted into the document. Thus we strip them from the text.
xub_StrLen nPos = rText.Search( sal_Unicode('(') );
while (STRING_NOTFOUND != nPos)
{
xub_StrLen nEnd = rText.Search( sal_Unicode(')'), nPos );
if (STRING_NOTFOUND != nEnd)
rText.Erase( nPos, nEnd-nPos+1 );
else
break;
nPos = rText.Search( sal_Unicode('(') );
}
nPos = rText.Search( sal_Unicode('*') );
if (STRING_NOTFOUND != nPos)
rText.Erase( nPos );
// remove any possible remaining ' ' that may confuse the thesaurus
// when it gets called with the text
rText.EraseLeadingAndTrailingChars( sal_Unicode(' ') );
}
// struct ThesDlg_Impl ---------------------------------------------------
struct ThesDlg_Impl
{
Reference< XThesaurus > xThesaurus;
OUString aLookUpText;
sal_Int16 nLookUpLanguage;
ThesDlg_Impl( Reference< XThesaurus > & xThes );
SfxErrorContext* pErrContext; // ErrorContext,
// w"ahrend der Dialog oben ist
};
ThesDlg_Impl::ThesDlg_Impl(Reference< XThesaurus > & xThes) :
xThesaurus (xThes)
{
pErrContext = NULL;
nLookUpLanguage = LANGUAGE_NONE;
}
// class SvxThesaurusLanguageDlg_Impl ------------------------------------
class SvxThesaurusLanguageDlg_Impl : public ModalDialog
{
private:
SvxLanguageBox aLangLB;
FixedLine aLangFL;
OKButton aOKBtn;
CancelButton aCancelBtn;
HelpButton aHelpBtn;
#if SUPD <= 626
Reference< XThesaurus > xThesaurus;
uno::Sequence< lang::Locale > aSuppLang; // supported languages
#endif
DECL_LINK( DoubleClickHdl_Impl, ListBox * );
public:
SvxThesaurusLanguageDlg_Impl( Window* pParent );
sal_uInt16 GetLanguage() const;
void SetLanguage( sal_uInt16 nLang );
};
// -----------------------------------------------------------------------
SvxThesaurusLanguageDlg_Impl::SvxThesaurusLanguageDlg_Impl( Window* pParent ) :
ModalDialog( pParent, SVX_RES( RID_SVXDLG_THES_LANGUAGE ) ),
aLangLB ( this, ResId( LB_THES_LANGUAGE ) ),
aLangFL ( this, ResId( FL_THES_LANGUAGE ) ),
aOKBtn ( this, ResId( BTN_LANG_OK ) ),
aCancelBtn ( this, ResId( BTN_LANG_CANCEL ) ),
aHelpBtn ( this, ResId( BTN_LANG_HELP ) )
{
FreeResource();
aLangLB.SetLanguageList( LANG_LIST_THES_USED, FALSE, FALSE );
aLangLB.SetDoubleClickHdl(
LINK( this, SvxThesaurusLanguageDlg_Impl, DoubleClickHdl_Impl ) );
}
// -----------------------------------------------------------------------
sal_uInt16 SvxThesaurusLanguageDlg_Impl::GetLanguage() const
{
sal_uInt16 nLang = aLangLB.GetSelectLanguage();
return nLang;
}
// -----------------------------------------------------------------------
void SvxThesaurusLanguageDlg_Impl::SetLanguage( sal_uInt16 nLang )
{
aLangLB.SelectLanguage( nLang );
}
// -----------------------------------------------------------------------
IMPL_LINK_INLINE_START( SvxThesaurusLanguageDlg_Impl, DoubleClickHdl_Impl, ListBox *, EMPTYARG )
{
EndDialog( RET_OK );
return 0;
}
IMPL_LINK_INLINE_END( SvxThesaurusLanguageDlg_Impl, DoubleClickHdl_Impl, ListBox *, EMPTYARG )
// class SvxThesaurusDialog ----------------------------------------------
// -----------------------------------------------------------------------
SvxThesaurusDialog::SvxThesaurusDialog( Window* pParent, Reference< XThesaurus > xThes,
const String &rWord, sal_Int16 nLanguage) :
SvxStandardDialog( pParent, SVX_RES( RID_SVXDLG_THESAURUS ) ),
aWordText ( this, ResId( FT_WORD ) ),
aWordLB ( this, ResId( LB_WORD ) ),
aReplaceText( this, ResId( FT_REPL ) ),
aReplaceEdit( this, ResId( ED_REPL ) ),
aMeanText ( this, ResId( FT_MEAN ) ),
aMeanLB ( this, ResId( LB_MEAN ) ),
aSynonymText( this, ResId( FT_SYNON ) ),
aSynonymLB ( this, ResId( LB_SYNON ) ),
aVarFL ( this, ResId( FL_VAR ) ),
aOkBtn ( this, ResId( BTN_THES_OK ) ),
aCancelBtn ( this, ResId( BTN_THES_CANCEL ) ),
aLookUpBtn ( this, ResId( BTN_LOOKUP ) ),
aLangBtn ( this, ResId( BTN_LANGUAGE ) ),
aHelpBtn ( this, ResId( BTN_THES_HELP ) ),
aErrStr ( ResId( STR_ERR_WORDNOTFOUND ) )
{
pImpl = new ThesDlg_Impl( xThes );
pImpl->aLookUpText = ::rtl::OUString( rWord );
pImpl->nLookUpLanguage = nLanguage;
pImpl->pErrContext =
new SfxErrorContext( ERRCTX_SVX_LINGU_THESAURUS, String(), this,
RID_SVXERRCTX, DIALOG_MGR() );
aLangBtn.SetClickHdl( LINK( this, SvxThesaurusDialog, LanguageHdl_Impl ) );
aLookUpBtn.SetClickHdl( LINK( this, SvxThesaurusDialog, LookUpHdl_Impl ) );
aMeanLB.SetSelectHdl( LINK( this, SvxThesaurusDialog, EntryHdl_Impl ) );
aSynonymLB.SetSelectHdl( LINK( this, SvxThesaurusDialog, SynonymHdl_Impl ) );
Link aLink = LINK( this, SvxThesaurusDialog, SelectHdl_Impl );
aMeanLB.SetDoubleClickHdl( aLink );
aSynonymLB.SetDoubleClickHdl( aLink );
aWordLB.SetSelectHdl( aLink );
FreeResource();
OUString aTmp( rWord );
linguistic::RemoveHyphens( aTmp );
linguistic::ReplaceControlChars( aTmp );
aReplaceEdit.SetText( aTmp );
aWordLB.InsertEntry( aTmp );
aWordLB.SelectEntry( aTmp );
Init_Impl( nLanguage );
// disable controls if service is missing
if (!pImpl->xThesaurus.is())
Enable( sal_False );
}
// -----------------------------------------------------------------------
SvxThesaurusDialog::~SvxThesaurusDialog()
{
delete pImpl->pErrContext;
delete pImpl;
}
// -----------------------------------------------------------------------
uno::Sequence< Reference< XMeaning > > SAL_CALL
SvxThesaurusDialog::queryMeanings_Impl(
OUString& rTerm,
const Locale& rLocale,
const beans::PropertyValues& rProperties )
throw(lang::IllegalArgumentException, uno::RuntimeException)
{
uno::Sequence< Reference< XMeaning > > aMeanings(
pImpl->xThesaurus->queryMeanings( rTerm, rLocale, rProperties ) );
// text with '.' at the end?
if (0 == aMeanings.getLength() && rTerm.getLength() &&
rTerm.getStr()[ rTerm.getLength() - 1 ] == '.')
{
// try again without trailing '.' chars. It may be a word at the
// end of a sentence and not an abbreviation...
String aTxt( rTerm );
aTxt.EraseTrailingChars( '.' );
aMeanings = pImpl->xThesaurus->queryMeanings( aTxt, rLocale, rProperties );
if (aMeanings.getLength())
{
rTerm = aTxt;
}
}
return aMeanings;
}
// -----------------------------------------------------------------------
sal_uInt16 SvxThesaurusDialog::GetLanguage() const
{
return pImpl->nLookUpLanguage;
}
// -----------------------------------------------------------------------
void SvxThesaurusDialog::UpdateMeaningBox_Impl( uno::Sequence< Reference< XMeaning > > *pMeaningSeq )
{
// create temporary meaning list if not supplied from somewhere else
sal_Bool bTmpSeq = sal_False;
if (!pMeaningSeq && pImpl->xThesaurus.is())
{
bTmpSeq = sal_True;
lang::Locale aLocale( SvxCreateLocale( pImpl->nLookUpLanguage ) );
uno::Sequence< Reference< XMeaning > > aTmpMean = queryMeanings_Impl(
pImpl->aLookUpText, aLocale, Sequence< PropertyValue >() );
pMeaningSeq = new Sequence< Reference< XMeaning > > ( aTmpMean );
// set new replace edit text if a different look up text was used
// see: queryMeanings_Impl
aReplaceEdit.SetText( pImpl->aLookUpText );
}
sal_Int32 nMeaningCount = pMeaningSeq ? pMeaningSeq->getLength() : 0;
const Reference< XMeaning > *pMeaning = pMeaningSeq ? pMeaningSeq->getConstArray() : NULL;
aMeanLB.Clear();
for ( sal_Int32 i = 0; i < nMeaningCount; ++i )
aMeanLB.InsertEntry( pMeaning[i]->getMeaning() );
// remove temporary meaning list
if (bTmpSeq)
delete pMeaningSeq;
if (aMeanLB.GetEntryCount() > 0)
aMeanLB.SelectEntryPos(0);
UpdateSynonymBox_Impl();
}
// -----------------------------------------------------------------------
void SvxThesaurusDialog::UpdateSynonymBox_Impl()
{
aSynonymLB.Clear();
sal_uInt16 nPos = aMeanLB.GetSelectEntryPos(); // active meaning pos
if (nPos != LISTBOX_ENTRY_NOTFOUND && pImpl->xThesaurus.is())
{
// get Reference< XMeaning > for selected meaning
lang::Locale aLocale( SvxCreateLocale( pImpl->nLookUpLanguage ) );
Reference< XMeaning > xMeaning = queryMeanings_Impl(
pImpl->aLookUpText, aLocale, Sequence< PropertyValue >() )
.getConstArray()[ nPos ];
uno::Sequence< OUString > aSynonyms;
if (xMeaning.is())
aSynonyms = xMeaning->querySynonyms();
sal_Int32 nSynonymCount = aSynonyms.getLength();
const OUString *pSynonym = aSynonyms.getConstArray();
for ( sal_Int32 i=0; i < nSynonymCount; ++i )
aSynonymLB.InsertEntry( pSynonym[i] );
}
}
// -----------------------------------------------------------------------
void SvxThesaurusDialog::Apply()
{
}
// -----------------------------------------------------------------------
void SvxThesaurusDialog::Init_Impl(sal_Int16 nLanguage)
{
// Sprache anpassen
String aStr( GetText() );
aStr.Erase( aStr.Search( sal_Unicode( '(' ) ) - 1 );
aStr.Append( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( " (" ) ) );
//aStr += GetLanguageString( (LanguageType)pImpl->pThesaurus->GetLanguage() );
aStr += GetLanguageString( (LanguageType) nLanguage );
aStr.Append( sal_Unicode( ')' ) );
SetText( aStr ); // Text der Window-Leiste setzen (Wort + Sprache)
// adapt meanings according to (new) language
UpdateMeaningBox_Impl();
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxThesaurusDialog, LookUpHdl_Impl, Button *, pBtn )
{
EnterWait();
String aText( aReplaceEdit.GetText() );
OUString aOldLookUpText = pImpl->aLookUpText;
pImpl->aLookUpText = ::rtl::OUString( aText );
uno::Sequence< Reference< XMeaning > > aMeanings;
if (pImpl->xThesaurus.is())
aMeanings = queryMeanings_Impl(
pImpl->aLookUpText,
SvxCreateLocale( pImpl->nLookUpLanguage ),
Sequence< PropertyValue >() );
LeaveWait();
if ( aMeanings.getLength() == 0 )
{
if( pBtn == &aCancelBtn ) // called via double click
{
pImpl->aLookUpText = aOldLookUpText;
}
else
{
UpdateMeaningBox_Impl( &aMeanings );
if( pBtn == &aLookUpBtn )
InfoBox( this, aErrStr ).Execute();
}
return 0;
}
UpdateMeaningBox_Impl( &aMeanings );
if ( aWordLB.GetEntryPos( aText ) == LISTBOX_ENTRY_NOTFOUND )
aWordLB.InsertEntry( aText );
aWordLB.SelectEntry( aText );
aMeanLB.SelectEntryPos( 0 );
String aStr( aMeanLB.GetSelectEntry() );
GetReplaceEditString( aStr );
aReplaceEdit.SetText( aStr );
aSynonymLB.SetNoSelection();
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxThesaurusDialog, LanguageHdl_Impl, Button *, EMPTYARG )
{
if (!pImpl->xThesaurus.is())
return 0;
SvxThesaurusLanguageDlg_Impl aDlg( this );
sal_uInt16 nLang = pImpl->nLookUpLanguage;
aDlg.SetLanguage( nLang );
if ( aDlg.Execute() == RET_OK )
{
nLang = aDlg.GetLanguage();
if (pImpl->xThesaurus->hasLocale( SvxCreateLocale( nLang ) ))
pImpl->nLookUpLanguage = nLang;
UpdateMeaningBox_Impl();
Init_Impl( nLang );
}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxThesaurusDialog, SynonymHdl_Impl, ListBox *, EMPTYARG )
{
if ( aSynonymLB.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
{
String aStr( aSynonymLB.GetSelectEntry() );
GetReplaceEditString( aStr );
aReplaceEdit.SetText( aStr );
}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxThesaurusDialog, SelectHdl_Impl, ListBox *, pBox )
{
String aStr( pBox->GetSelectEntry() );
GetReplaceEditString( aStr );
aReplaceEdit.SetText( aStr );
//! 'aCancelBtn' is used to indicate that the handler is called as result
//! of a double click action.
LookUpHdl_Impl( &aCancelBtn /* ??? &aLookUpBtn */ );
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxThesaurusDialog, EntryHdl_Impl, ListBox *, EMPTYARG )
{
UpdateSynonymBox_Impl();
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxThesaurusDialog, SpellErrorHdl_Impl, void *, pError )
{
// Der "ubergebene Pointer pError ist die falsche Sprachen-Nummer
LanguageType eLang = (LanguageType)(sal_uIntPtr)pError;
String aErr( ::GetLanguageString( eLang ) );
// Fehlermeldung ausgeben
ErrorHandler::HandleError(
*new StringErrorInfo( ERRCODE_SVX_LINGU_LANGUAGENOTEXISTS, aErr ) );
return 0;
}