1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sfx2.hxx" 26 27 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 28 #include <com/sun/star/linguistic2/XThesaurus.hpp> 29 #include <com/sun/star/linguistic2/XMeaning.hpp> 30 #include <com/sun/star/linguistic2/XLinguServiceManager.hpp> 31 32 #include <comphelper/processfactory.hxx> 33 #include <svl/stritem.hxx> 34 #include <tools/debug.hxx> 35 #include <vcl/graph.hxx> 36 #include <svtools/filter.hxx> 37 38 39 #include <vector> 40 41 #include <sfx2/bindings.hxx> 42 #include <sfx2/dispatch.hxx> 43 #include <sfx2/viewsh.hxx> 44 #include "thessubmenu.hxx" 45 46 47 using namespace ::com::sun::star; 48 using ::rtl::OUString; 49 50 51 // STATIC DATA ----------------------------------------------------------- 52 53 SFX_IMPL_MENU_CONTROL(SfxThesSubMenuControl, SfxStringItem); 54 55 //////////////////////////////////////////////////////////// 56 57 58 /* 59 Ctor; setzt Select-Handler am Menu und traegt Menu 60 in seinen Parent ein. 61 */ 62 SfxThesSubMenuControl::SfxThesSubMenuControl( sal_uInt16 nSlotId, Menu &rMenu, SfxBindings &rBindings ) 63 : SfxMenuControl( nSlotId, rBindings ), 64 pMenu(new PopupMenu), 65 rParent(rMenu) 66 { 67 rMenu.SetPopupMenu(nSlotId, pMenu); 68 pMenu->SetSelectHdl(LINK(this, SfxThesSubMenuControl, MenuSelect)); 69 pMenu->Clear(); 70 rParent.EnableItem( GetId(), sal_False ); 71 } 72 73 74 SfxThesSubMenuControl::~SfxThesSubMenuControl() 75 { 76 delete pMenu; 77 } 78 79 80 /* 81 Statusbenachrichtigung; 82 Ist die Funktionalit"at disabled, wird der entsprechende 83 Menueeintrag im Parentmenu disabled, andernfalls wird er enabled. 84 */ 85 void SfxThesSubMenuControl::StateChanged( 86 sal_uInt16 /*nSID*/, 87 SfxItemState eState, 88 const SfxPoolItem* /*pState*/ ) 89 { 90 rParent.EnableItem(GetId(), SFX_ITEM_AVAILABLE == eState ); 91 } 92 93 94 /* 95 Select-Handler des Menus; 96 das selektierte Verb mit ausgef"uhrt, 97 */ 98 IMPL_LINK_INLINE_START( SfxThesSubMenuControl, MenuSelect, Menu *, pSelMenu ) 99 { 100 const sal_uInt16 nSlotId = pSelMenu->GetCurItemId(); 101 if( nSlotId ) 102 GetBindings().Execute(nSlotId); 103 return 1; 104 } 105 IMPL_LINK_INLINE_END( SfxThesSubMenuControl, MenuSelect, Menu *, pSelMenu ) 106 107 108 PopupMenu* SfxThesSubMenuControl::GetPopup() const 109 { 110 return pMenu; 111 } 112 113 114 //////////////////////////////////////////////////////////// 115 116 OUString SfxThesSubMenuHelper::GetText( 117 const String &rLookUpString, 118 xub_StrLen nDelimPos ) 119 { 120 return OUString( rLookUpString.Copy( 0, nDelimPos ) ); 121 } 122 123 124 void SfxThesSubMenuHelper::GetLocale( 125 lang::Locale /*out */ &rLocale, 126 const String &rLookUpString, 127 xub_StrLen nDelimPos ) 128 { 129 String aIsoLang( rLookUpString.Copy( nDelimPos + 1) ); 130 const xub_StrLen nPos = aIsoLang.Search( '-' ); 131 if (nPos != STRING_NOTFOUND) 132 { 133 rLocale.Language = aIsoLang.Copy( 0, nPos ); 134 rLocale.Country = aIsoLang.Copy( nPos + 1 ); 135 rLocale.Variant = String::EmptyString(); 136 } 137 } 138 139 140 SfxThesSubMenuHelper::SfxThesSubMenuHelper() 141 { 142 try 143 { 144 uno::Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW ); 145 m_xLngMgr = uno::Reference< linguistic2::XLinguServiceManager >( xMSF->createInstance( 146 OUString( RTL_CONSTASCII_USTRINGPARAM( 147 "com.sun.star.linguistic2.LinguServiceManager" ))), uno::UNO_QUERY_THROW ); 148 m_xThesarus = m_xLngMgr->getThesaurus(); 149 } 150 catch (uno::Exception &e) 151 { 152 (void) e; 153 DBG_ASSERT( 0, "failed to get thesaurus" ); 154 } 155 } 156 157 158 SfxThesSubMenuHelper::~SfxThesSubMenuHelper() 159 { 160 } 161 162 163 bool SfxThesSubMenuHelper::IsSupportedLocale( const lang::Locale & rLocale ) const 164 { 165 return m_xThesarus.is() && m_xThesarus->hasLocale( rLocale ); 166 } 167 168 169 bool SfxThesSubMenuHelper::GetMeanings( 170 std::vector< OUString > & rSynonyms, 171 const OUString & rWord, 172 const lang::Locale & rLocale, 173 sal_Int16 nMaxSynonms ) 174 { 175 bool bHasMoreSynonyms = false; 176 rSynonyms.clear(); 177 if (IsSupportedLocale( rLocale ) && rWord.getLength() && nMaxSynonms > 0) 178 { 179 try 180 { 181 // get all meannings 182 const uno::Sequence< uno::Reference< linguistic2::XMeaning > > aMeaningSeq( 183 m_xThesarus->queryMeanings( rWord, rLocale, uno::Sequence< beans::PropertyValue >() )); 184 const uno::Reference< linguistic2::XMeaning > *pxMeaning = aMeaningSeq.getConstArray(); 185 const sal_Int32 nMeanings = aMeaningSeq.getLength(); 186 187 // iterate over all meanings until nMaxSynonms are found or all meanings are processed 188 sal_Int32 nCount = 0; 189 sal_Int32 i = 0; 190 for ( ; i < nMeanings && nCount < nMaxSynonms; ++i) 191 { 192 const uno::Sequence< OUString > aSynonymSeq( pxMeaning[i]->querySynonyms() ); 193 const OUString *pSynonyms = aSynonymSeq.getConstArray(); 194 const sal_Int32 nSynonyms = aSynonymSeq.getLength(); 195 sal_Int32 k = 0; 196 for ( ; k < nSynonyms && nCount < nMaxSynonms; ++k) 197 { 198 rSynonyms.push_back( pSynonyms[k] ); 199 ++nCount; 200 } 201 bHasMoreSynonyms = k < nSynonyms; // any synonym from this meaning skipped? 202 } 203 204 bHasMoreSynonyms |= i < nMeanings; // any meaning skipped? 205 } 206 catch (uno::Exception &e) 207 { 208 (void) e; 209 DBG_ASSERT( 0, "failed to get synonyms" ); 210 } 211 } 212 return bHasMoreSynonyms; 213 } 214 215 216 String SfxThesSubMenuHelper::GetThesImplName( const lang::Locale &rLocale ) const 217 { 218 String aRes; 219 DBG_ASSERT( m_xLngMgr.is(), "LinguServiceManager missing" ); 220 if (m_xLngMgr.is()) 221 { 222 uno::Sequence< OUString > aServiceNames = m_xLngMgr->getConfiguredServices( 223 OUString::createFromAscii("com.sun.star.linguistic2.Thesaurus"), rLocale ); 224 // there should be at most one thesaurus configured for each language 225 DBG_ASSERT( aServiceNames.getLength() <= 1, "more than one thesaurus found. Should not be possible" ); 226 if (aServiceNames.getLength() == 1) 227 aRes = aServiceNames[0]; 228 } 229 return aRes; 230 } 231 232 //////////////////////////////////////////////////////////// 233 234 235