blob: f6672132851922796d0ed203ce00dfef3f76ff54 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sfx2.hxx"
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/linguistic2/XThesaurus.hpp>
#include <com/sun/star/linguistic2/XMeaning.hpp>
#include <com/sun/star/linguistic2/XLinguServiceManager.hpp>
#include <comphelper/processfactory.hxx>
#include <svl/stritem.hxx>
#include <tools/debug.hxx>
#include <vcl/graph.hxx>
#include <svtools/filter.hxx>
#include <vector>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/viewsh.hxx>
#include "thessubmenu.hxx"
using namespace ::com::sun::star;
using ::rtl::OUString;
// STATIC DATA -----------------------------------------------------------
SFX_IMPL_MENU_CONTROL(SfxThesSubMenuControl, SfxStringItem);
////////////////////////////////////////////////////////////
/*
Ctor; setzt Select-Handler am Menu und traegt Menu
in seinen Parent ein.
*/
SfxThesSubMenuControl::SfxThesSubMenuControl( sal_uInt16 nSlotId, Menu &rMenu, SfxBindings &rBindings )
: SfxMenuControl( nSlotId, rBindings ),
pMenu(new PopupMenu),
rParent(rMenu)
{
rMenu.SetPopupMenu(nSlotId, pMenu);
pMenu->SetSelectHdl(LINK(this, SfxThesSubMenuControl, MenuSelect));
pMenu->Clear();
rParent.EnableItem( GetId(), sal_False );
}
SfxThesSubMenuControl::~SfxThesSubMenuControl()
{
delete pMenu;
}
/*
Statusbenachrichtigung;
Ist die Funktionalit"at disabled, wird der entsprechende
Menueeintrag im Parentmenu disabled, andernfalls wird er enabled.
*/
void SfxThesSubMenuControl::StateChanged(
sal_uInt16 /*nSID*/,
SfxItemState eState,
const SfxPoolItem* /*pState*/ )
{
rParent.EnableItem(GetId(), SFX_ITEM_AVAILABLE == eState );
}
/*
Select-Handler des Menus;
das selektierte Verb mit ausgef"uhrt,
*/
IMPL_LINK_INLINE_START( SfxThesSubMenuControl, MenuSelect, Menu *, pSelMenu )
{
const sal_uInt16 nSlotId = pSelMenu->GetCurItemId();
if( nSlotId )
GetBindings().Execute(nSlotId);
return 1;
}
IMPL_LINK_INLINE_END( SfxThesSubMenuControl, MenuSelect, Menu *, pSelMenu )
PopupMenu* SfxThesSubMenuControl::GetPopup() const
{
return pMenu;
}
////////////////////////////////////////////////////////////
OUString SfxThesSubMenuHelper::GetText(
const String &rLookUpString,
xub_StrLen nDelimPos )
{
return OUString( rLookUpString.Copy( 0, nDelimPos ) );
}
void SfxThesSubMenuHelper::GetLocale(
lang::Locale /*out */ &rLocale,
const String &rLookUpString,
xub_StrLen nDelimPos )
{
String aIsoLang( rLookUpString.Copy( nDelimPos + 1) );
const xub_StrLen nPos = aIsoLang.Search( '-' );
if (nPos != STRING_NOTFOUND)
{
rLocale.Language = aIsoLang.Copy( 0, nPos );
rLocale.Country = aIsoLang.Copy( nPos + 1 );
rLocale.Variant = String::EmptyString();
}
}
SfxThesSubMenuHelper::SfxThesSubMenuHelper()
{
try
{
uno::Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
m_xLngMgr = uno::Reference< linguistic2::XLinguServiceManager >( xMSF->createInstance(
OUString( RTL_CONSTASCII_USTRINGPARAM(
"com.sun.star.linguistic2.LinguServiceManager" ))), uno::UNO_QUERY_THROW );
m_xThesarus = m_xLngMgr->getThesaurus();
}
catch (uno::Exception &e)
{
(void) e;
DBG_ASSERT( 0, "failed to get thesaurus" );
}
}
SfxThesSubMenuHelper::~SfxThesSubMenuHelper()
{
}
bool SfxThesSubMenuHelper::IsSupportedLocale( const lang::Locale & rLocale ) const
{
return m_xThesarus.is() && m_xThesarus->hasLocale( rLocale );
}
bool SfxThesSubMenuHelper::GetMeanings(
std::vector< OUString > & rSynonyms,
const OUString & rWord,
const lang::Locale & rLocale,
sal_Int16 nMaxSynonms )
{
bool bHasMoreSynonyms = false;
rSynonyms.clear();
if (IsSupportedLocale( rLocale ) && rWord.getLength() && nMaxSynonms > 0)
{
try
{
// get all meannings
const uno::Sequence< uno::Reference< linguistic2::XMeaning > > aMeaningSeq(
m_xThesarus->queryMeanings( rWord, rLocale, uno::Sequence< beans::PropertyValue >() ));
const uno::Reference< linguistic2::XMeaning > *pxMeaning = aMeaningSeq.getConstArray();
const sal_Int32 nMeanings = aMeaningSeq.getLength();
// iterate over all meanings until nMaxSynonms are found or all meanings are processed
sal_Int32 nCount = 0;
sal_Int32 i = 0;
for ( ; i < nMeanings && nCount < nMaxSynonms; ++i)
{
const uno::Sequence< OUString > aSynonymSeq( pxMeaning[i]->querySynonyms() );
const OUString *pSynonyms = aSynonymSeq.getConstArray();
const sal_Int32 nSynonyms = aSynonymSeq.getLength();
sal_Int32 k = 0;
for ( ; k < nSynonyms && nCount < nMaxSynonms; ++k)
{
rSynonyms.push_back( pSynonyms[k] );
++nCount;
}
bHasMoreSynonyms = k < nSynonyms; // any synonym from this meaning skipped?
}
bHasMoreSynonyms |= i < nMeanings; // any meaning skipped?
}
catch (uno::Exception &e)
{
(void) e;
DBG_ASSERT( 0, "failed to get synonyms" );
}
}
return bHasMoreSynonyms;
}
String SfxThesSubMenuHelper::GetThesImplName( const lang::Locale &rLocale ) const
{
String aRes;
DBG_ASSERT( m_xLngMgr.is(), "LinguServiceManager missing" );
if (m_xLngMgr.is())
{
uno::Sequence< OUString > aServiceNames = m_xLngMgr->getConfiguredServices(
OUString::createFromAscii("com.sun.star.linguistic2.Thesaurus"), rLocale );
// there should be at most one thesaurus configured for each language
DBG_ASSERT( aServiceNames.getLength() <= 1, "more than one thesaurus found. Should not be possible" );
if (aServiceNames.getLength() == 1)
aRes = aServiceNames[0];
}
return aRes;
}
////////////////////////////////////////////////////////////