12ee96f1cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 32ee96f1cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 42ee96f1cSAndrew Rist * or more contributor license agreements. See the NOTICE file 52ee96f1cSAndrew Rist * distributed with this work for additional information 62ee96f1cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 72ee96f1cSAndrew Rist * to you under the Apache License, Version 2.0 (the 82ee96f1cSAndrew Rist * "License"); you may not use this file except in compliance 92ee96f1cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 112ee96f1cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 132ee96f1cSAndrew Rist * Unless required by applicable law or agreed to in writing, 142ee96f1cSAndrew Rist * software distributed under the License is distributed on an 152ee96f1cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 162ee96f1cSAndrew Rist * KIND, either express or implied. See the License for the 172ee96f1cSAndrew Rist * specific language governing permissions and limitations 182ee96f1cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 202ee96f1cSAndrew Rist *************************************************************/ 212ee96f1cSAndrew Rist 222ee96f1cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_cui.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir // include --------------------------------------------------------------- 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <vcl/msgbox.hxx> 30cdf0e10cSrcweir #include <vcl/field.hxx> 31cdf0e10cSrcweir #include <vcl/fixed.hxx> 32cdf0e10cSrcweir #include <tools/shl.hxx> 33cdf0e10cSrcweir #include <tools/dynary.hxx> 34cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 35cdf0e10cSrcweir #include <unotools/lingucfg.hxx> 36cdf0e10cSrcweir #include <editeng/unolingu.hxx> 37cdf0e10cSrcweir #include <svx/dlgutil.hxx> 38cdf0e10cSrcweir #include <linguistic/lngprops.hxx> 39cdf0e10cSrcweir #include <linguistic/misc.hxx> 40cdf0e10cSrcweir #include <sfx2/sfxuno.hxx> 41cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 42cdf0e10cSrcweir #include <tools/urlobj.hxx> 43cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 44cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 45cdf0e10cSrcweir #include <com/sun/star/linguistic2/XSpellChecker.hpp> 46cdf0e10cSrcweir #include <com/sun/star/linguistic2/XProofreader.hpp> 47cdf0e10cSrcweir #include <com/sun/star/linguistic2/XHyphenator.hpp> 48cdf0e10cSrcweir #include <com/sun/star/linguistic2/XThesaurus.hpp> 49cdf0e10cSrcweir #include <com/sun/star/linguistic2/XAvailableLocales.hpp> 50cdf0e10cSrcweir #include <com/sun/star/lang/XServiceDisplayName.hpp> 51cdf0e10cSrcweir #include <com/sun/star/linguistic2/DictionaryListEventFlags.hpp> 52cdf0e10cSrcweir #include <com/sun/star/linguistic2/DictionaryListEvent.hpp> 53cdf0e10cSrcweir #include <com/sun/star/linguistic2/XDictionaryListEventListener.hpp> 54cdf0e10cSrcweir #include <com/sun/star/linguistic2/XDictionaryList.hpp> 55cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp> 56cdf0e10cSrcweir #include <com/sun/star/ucb/CommandAbortedException.hpp> 57*9807c9deSAriel Constenla-Haile #include <com/sun/star/system/SystemShellExecute.hpp> 58cdf0e10cSrcweir #include <com/sun/star/system/SystemShellExecuteFlags.hpp> 59cdf0e10cSrcweir #include <unotools/extendedsecurityoptions.hxx> 60cdf0e10cSrcweir #include <svtools/svlbox.hxx> 61cdf0e10cSrcweir #include <svl/eitem.hxx> 62cdf0e10cSrcweir #include <svl/intitem.hxx> 63cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 64cdf0e10cSrcweir #include <vcl/svapp.hxx> 65cdf0e10cSrcweir #define _SVX_OPTLINGU_CXX 66cdf0e10cSrcweir #include "optlingu.hrc" 67cdf0e10cSrcweir 68cdf0e10cSrcweir #include <svx/svxdlg.hxx> 69cdf0e10cSrcweir #include <editeng/optitems.hxx> 70cdf0e10cSrcweir #include "optlingu.hxx" 71cdf0e10cSrcweir #include <dialmgr.hxx> 72cdf0e10cSrcweir #include <cuires.hrc> 73cdf0e10cSrcweir #include "helpid.hrc" 74cdf0e10cSrcweir 75cdf0e10cSrcweir #include <ucbhelper/content.hxx> 76cdf0e10cSrcweir 77cdf0e10cSrcweir #include <vector> 78cdf0e10cSrcweir #include <map> 79cdf0e10cSrcweir 80cdf0e10cSrcweir 81cdf0e10cSrcweir using namespace ::ucbhelper; 82cdf0e10cSrcweir using namespace ::rtl; 83cdf0e10cSrcweir using namespace ::com::sun::star; 84cdf0e10cSrcweir using namespace ::com::sun::star::lang; 85cdf0e10cSrcweir using namespace ::com::sun::star::uno; 86cdf0e10cSrcweir using namespace ::com::sun::star::linguistic2; 87cdf0e10cSrcweir using namespace ::com::sun::star::beans; 88cdf0e10cSrcweir namespace css = com::sun::star; 89cdf0e10cSrcweir 90cdf0e10cSrcweir #define C2U(cChar) OUString::createFromAscii(cChar) 91cdf0e10cSrcweir #define SVX_MAX_USERDICTS 20 92cdf0e10cSrcweir #define CBCOL_FIRST 0 93cdf0e10cSrcweir #define CBCOL_SECOND 1 94cdf0e10cSrcweir #define CBCOL_BOTH 2 95cdf0e10cSrcweir 96cdf0e10cSrcweir static const sal_Char cSpell[] = SN_SPELLCHECKER; 97cdf0e10cSrcweir static const sal_Char cGrammar[] = SN_GRAMMARCHECKER; 98cdf0e10cSrcweir static const sal_Char cHyph[] = SN_HYPHENATOR; 99cdf0e10cSrcweir static const sal_Char cThes[] = SN_THESAURUS; 100cdf0e10cSrcweir 101cdf0e10cSrcweir // static ---------------------------------------------------------------- 102cdf0e10cSrcweir 103cdf0e10cSrcweir static Sequence< sal_Int16 > lcl_LocaleSeqToLangSeq( const Sequence< Locale > &rSeq ) 104cdf0e10cSrcweir { 105cdf0e10cSrcweir sal_Int32 nLen = rSeq.getLength(); 106cdf0e10cSrcweir Sequence< sal_Int16 > aRes( nLen ); 107cdf0e10cSrcweir sal_Int16 *pRes = aRes.getArray(); 108cdf0e10cSrcweir const Locale *pSeq = rSeq.getConstArray(); 109cdf0e10cSrcweir for (sal_Int32 i = 0; i < nLen; ++i) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir pRes[i] = SvxLocaleToLanguage( pSeq[i] ); 112cdf0e10cSrcweir } 113cdf0e10cSrcweir return aRes; 114cdf0e10cSrcweir } 115cdf0e10cSrcweir 116cdf0e10cSrcweir 117cdf0e10cSrcweir static sal_Bool lcl_SeqHasLang( const Sequence< sal_Int16 > &rSeq, sal_Int16 nLang ) 118cdf0e10cSrcweir { 119cdf0e10cSrcweir sal_Int32 nLen = rSeq.getLength(); 120cdf0e10cSrcweir const sal_Int16 *pLang = rSeq.getConstArray(); 121cdf0e10cSrcweir sal_Int32 nPos = -1; 122cdf0e10cSrcweir for (sal_Int32 i = 0; i < nLen && nPos < 0; ++i) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir if (nLang == pLang[i]) 125cdf0e10cSrcweir nPos = i; 126cdf0e10cSrcweir } 127cdf0e10cSrcweir return nPos < 0 ? sal_False : sal_True; 128cdf0e10cSrcweir } 129cdf0e10cSrcweir 130cdf0e10cSrcweir 131cdf0e10cSrcweir static sal_Int32 lcl_SeqGetEntryPos( 132cdf0e10cSrcweir const Sequence< OUString > &rSeq, const OUString &rEntry ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir sal_Int32 i; 135cdf0e10cSrcweir sal_Int32 nLen = rSeq.getLength(); 136cdf0e10cSrcweir const OUString *pItem = rSeq.getConstArray(); 137cdf0e10cSrcweir for (i = 0; i < nLen; ++i) 138cdf0e10cSrcweir { 139cdf0e10cSrcweir if (rEntry == pItem[i]) 140cdf0e10cSrcweir break; 141cdf0e10cSrcweir } 142cdf0e10cSrcweir return i < nLen ? i : -1; 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir static void lcl_OpenURL( const ::rtl::OUString& rURL ) 146cdf0e10cSrcweir { 147cdf0e10cSrcweir if ( rURL.getLength() > 0 ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir try 150cdf0e10cSrcweir { 151cdf0e10cSrcweir uno::Reference< css::system::XSystemShellExecute > xSystemShell( 152*9807c9deSAriel Constenla-Haile css::system::SystemShellExecute::create( 153*9807c9deSAriel Constenla-Haile ::comphelper::getProcessComponentContext() ) ); 154cdf0e10cSrcweir if ( xSystemShell.is() ) 155cdf0e10cSrcweir xSystemShell->execute( rURL, ::rtl::OUString(), css::system::SystemShellExecuteFlags::DEFAULTS ); 156cdf0e10cSrcweir } 157cdf0e10cSrcweir catch( const uno::Exception& e ) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir OSL_TRACE( "Caught exception: %s\n thread terminated.\n", 160cdf0e10cSrcweir rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr()); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir } 163cdf0e10cSrcweir } 164cdf0e10cSrcweir 165cdf0e10cSrcweir /*-------------------------------------------------- 166cdf0e10cSrcweir --------------------------------------------------*/ 167cdf0e10cSrcweir 168cdf0e10cSrcweir static const sal_uInt16 nNameLen = 8; 169cdf0e10cSrcweir 170cdf0e10cSrcweir static sal_uInt16 pRanges[] = 171cdf0e10cSrcweir { 172cdf0e10cSrcweir SID_ATTR_SPELL, 173cdf0e10cSrcweir SID_ATTR_SPELL, 174cdf0e10cSrcweir 0 175cdf0e10cSrcweir }; 176cdf0e10cSrcweir 177cdf0e10cSrcweir sal_Bool KillFile_Impl( const String& rURL ) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir sal_Bool bRet = sal_True; 180cdf0e10cSrcweir try 181cdf0e10cSrcweir { 182cdf0e10cSrcweir Content aCnt( rURL, uno::Reference< ::com::sun::star::ucb::XCommandEnvironment > () ); 183cdf0e10cSrcweir aCnt.executeCommand( OUString::createFromAscii( "delete" ), makeAny( sal_Bool( sal_True ) ) ); 184cdf0e10cSrcweir } 185cdf0e10cSrcweir catch( ::com::sun::star::ucb::CommandAbortedException& ) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir DBG_ERRORFILE( "KillFile: CommandAbortedException" ); 188cdf0e10cSrcweir bRet = sal_False; 189cdf0e10cSrcweir } 190cdf0e10cSrcweir catch( ... ) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir DBG_ERRORFILE( "KillFile: Any other exception" ); 193cdf0e10cSrcweir bRet = sal_False; 194cdf0e10cSrcweir } 195cdf0e10cSrcweir 196cdf0e10cSrcweir return bRet; 197cdf0e10cSrcweir } 198cdf0e10cSrcweir /* -----------------------------27.11.00 14:07-------------------------------- 199cdf0e10cSrcweir 200cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 201cdf0e10cSrcweir // 0x 0p 0t 0c nn 202cdf0e10cSrcweir // p: 1 -> parent 203cdf0e10cSrcweir // t: 1 -> spell, 2 -> hyph, 3 -> thes, 4 -> grammar 204cdf0e10cSrcweir // c: 1 -> checked 0 -> unchecked 205cdf0e10cSrcweir // n: index 206cdf0e10cSrcweir 207cdf0e10cSrcweir #define TYPE_SPELL (sal_uInt8)1 208cdf0e10cSrcweir #define TYPE_GRAMMAR (sal_uInt8)2 209cdf0e10cSrcweir #define TYPE_HYPH (sal_uInt8)3 210cdf0e10cSrcweir #define TYPE_THES (sal_uInt8)4 211cdf0e10cSrcweir 212cdf0e10cSrcweir class ModuleUserData_Impl 213cdf0e10cSrcweir { 214cdf0e10cSrcweir sal_Bool bParent; 215cdf0e10cSrcweir sal_Bool bIsChecked; 216cdf0e10cSrcweir sal_uInt8 nType; 217cdf0e10cSrcweir sal_uInt8 nIndex; 218cdf0e10cSrcweir String sImplName; 219cdf0e10cSrcweir 220cdf0e10cSrcweir public: 221cdf0e10cSrcweir ModuleUserData_Impl( String sImpName, sal_Bool bIsParent, sal_Bool bChecked, sal_uInt8 nSetType, sal_uInt8 nSetIndex ) : 222cdf0e10cSrcweir bParent(bIsParent), 223cdf0e10cSrcweir bIsChecked(bChecked), 224cdf0e10cSrcweir nType(nSetType), 225cdf0e10cSrcweir nIndex(nSetIndex), 226cdf0e10cSrcweir sImplName(sImpName) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir } 229cdf0e10cSrcweir sal_Bool IsParent() const {return bParent;} 230cdf0e10cSrcweir sal_uInt8 GetType() const {return nType;} 231cdf0e10cSrcweir sal_Bool IsChecked() const {return bIsChecked;} 232cdf0e10cSrcweir sal_uInt8 GetIndex() const {return nIndex;} 233cdf0e10cSrcweir void SetIndex(sal_uInt8 nSet) {nIndex = nSet;} 234cdf0e10cSrcweir const String& GetImplName() const {return sImplName;} 235cdf0e10cSrcweir 236cdf0e10cSrcweir }; 237cdf0e10cSrcweir 238cdf0e10cSrcweir /*-------------------------------------------------- 239cdf0e10cSrcweir --------------------------------------------------*/ 240cdf0e10cSrcweir // 241cdf0e10cSrcweir // User for user-dictionaries (XDictionary interface) 242cdf0e10cSrcweir // 243cdf0e10cSrcweir class DicUserData 244cdf0e10cSrcweir { 245cdf0e10cSrcweir sal_uLong nVal; 246cdf0e10cSrcweir 247cdf0e10cSrcweir public: 248cdf0e10cSrcweir DicUserData( sal_uLong nUserData ) : nVal( nUserData ) {} 249cdf0e10cSrcweir DicUserData( sal_uInt16 nEID, 250cdf0e10cSrcweir sal_Bool bChecked, sal_Bool bEditable, sal_Bool bDeletable ); 251cdf0e10cSrcweir 252cdf0e10cSrcweir sal_uLong GetUserData() const { return nVal; } 253cdf0e10cSrcweir sal_uInt16 GetEntryId() const { return (sal_uInt16)(nVal >> 16); } 254cdf0e10cSrcweir sal_Bool IsChecked() const { return (sal_Bool)(nVal >> 8) & 0x01; } 255cdf0e10cSrcweir sal_Bool IsEditable() const { return (sal_Bool)(nVal >> 9) & 0x01; } 256cdf0e10cSrcweir sal_Bool IsDeletable() const { return (sal_Bool)(nVal >> 10) & 0x01; } 257cdf0e10cSrcweir 258cdf0e10cSrcweir void SetChecked( sal_Bool bVal ); 259cdf0e10cSrcweir }; 260cdf0e10cSrcweir 261cdf0e10cSrcweir 262cdf0e10cSrcweir DicUserData::DicUserData( 263cdf0e10cSrcweir sal_uInt16 nEID, 264cdf0e10cSrcweir sal_Bool bChecked, sal_Bool bEditable, sal_Bool bDeletable ) 265cdf0e10cSrcweir { 266cdf0e10cSrcweir DBG_ASSERT( nEID < 65000, "Entry Id out of range" ); 267cdf0e10cSrcweir nVal = ((sal_uLong)(0xFFFF & nEID) << 16) | 268cdf0e10cSrcweir ((sal_uLong)(bChecked ? 1 : 0) << 8) | 269cdf0e10cSrcweir ((sal_uLong)(bEditable ? 1 : 0) << 9) | 270cdf0e10cSrcweir ((sal_uLong)(bDeletable ? 1 : 0) << 10); 271cdf0e10cSrcweir } 272cdf0e10cSrcweir 273cdf0e10cSrcweir 274cdf0e10cSrcweir void DicUserData::SetChecked( sal_Bool bVal ) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir nVal &= ~(1UL << 8); 277cdf0e10cSrcweir nVal |= (sal_uLong)(bVal ? 1 : 0) << 8; 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 280cdf0e10cSrcweir 281cdf0e10cSrcweir // class BrwString_Impl ------------------------------------------------- 282cdf0e10cSrcweir 283cdf0e10cSrcweir void lcl_SetCheckButton( SvLBoxEntry* pEntry, sal_Bool bCheck ) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir SvLBoxButton* pItem = (SvLBoxButton*)(pEntry->GetFirstItem(SV_ITEM_ID_LBOXBUTTON)); 286cdf0e10cSrcweir 287cdf0e10cSrcweir DBG_ASSERT(pItem,"SetCheckButton:Item not found"); 288cdf0e10cSrcweir if (((SvLBoxItem*)pItem)->IsA() == SV_ITEM_ID_LBOXBUTTON) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir if (bCheck) 291cdf0e10cSrcweir pItem->SetStateChecked(); 292cdf0e10cSrcweir else 293cdf0e10cSrcweir pItem->SetStateUnchecked(); 294cdf0e10cSrcweir //InvalidateEntry( pEntry ); 295cdf0e10cSrcweir } 296cdf0e10cSrcweir } 297cdf0e10cSrcweir 298cdf0e10cSrcweir 299cdf0e10cSrcweir class BrwStringDic_Impl : public SvLBoxString 300cdf0e10cSrcweir { 301cdf0e10cSrcweir public: 302cdf0e10cSrcweir 303cdf0e10cSrcweir BrwStringDic_Impl( SvLBoxEntry* pEntry, sal_uInt16 nFlags, 304cdf0e10cSrcweir const String& rStr ) : SvLBoxString( pEntry, nFlags, rStr ) {} 305cdf0e10cSrcweir 306cdf0e10cSrcweir virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, 307cdf0e10cSrcweir SvLBoxEntry* pEntry); 308cdf0e10cSrcweir }; 309cdf0e10cSrcweir 310cdf0e10cSrcweir void BrwStringDic_Impl::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16, 311cdf0e10cSrcweir SvLBoxEntry* pEntry ) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); 314cdf0e10cSrcweir Point aPos(rPos); 315cdf0e10cSrcweir Font aOldFont( rDev.GetFont()); 316cdf0e10cSrcweir if(pData->IsParent()) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir Font aFont( aOldFont ); 319cdf0e10cSrcweir aFont.SetWeight( WEIGHT_BOLD ); 320cdf0e10cSrcweir rDev.SetFont( aFont ); 321cdf0e10cSrcweir aPos.X() = 0; 322cdf0e10cSrcweir } 323cdf0e10cSrcweir else 324cdf0e10cSrcweir aPos.X() += 5; 325cdf0e10cSrcweir rDev.DrawText( aPos, GetText() ); 326cdf0e10cSrcweir rDev.SetFont( aOldFont ); 327cdf0e10cSrcweir } 328cdf0e10cSrcweir 329cdf0e10cSrcweir 330cdf0e10cSrcweir /*-------------------------------------------------- 331cdf0e10cSrcweir --------------------------------------------------*/ 332cdf0e10cSrcweir 333cdf0e10cSrcweir class OptionsBreakSet : public ModalDialog 334cdf0e10cSrcweir { 335cdf0e10cSrcweir OKButton aOKPB; 336cdf0e10cSrcweir CancelButton aCancelPB; 337cdf0e10cSrcweir FixedLine aValFL; 338cdf0e10cSrcweir NumericField aValNF; 339cdf0e10cSrcweir 340cdf0e10cSrcweir public: 341cdf0e10cSrcweir OptionsBreakSet(Window* pParent, int nRID) : 342cdf0e10cSrcweir ModalDialog(pParent, CUI_RES(RID_SVXDLG_LNG_ED_NUM_PREBREAK )), 343cdf0e10cSrcweir aOKPB (this, CUI_RES(BT_OK_PREBREAK)), 344cdf0e10cSrcweir aCancelPB (this, CUI_RES(BT_CANCEL_PREBREAK)), 345cdf0e10cSrcweir aValFL (this, CUI_RES(FL_NUMVAL_PREBREAK)), 346cdf0e10cSrcweir aValNF (this, CUI_RES(ED_PREBREAK)) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir DBG_ASSERT( STR_NUM_PRE_BREAK_DLG == nRID || 349cdf0e10cSrcweir STR_NUM_POST_BREAK_DLG == nRID || 350cdf0e10cSrcweir STR_NUM_MIN_WORDLEN_DLG == nRID, "unexpected RID" ); 351cdf0e10cSrcweir 352cdf0e10cSrcweir if (nRID != -1) 353cdf0e10cSrcweir aValFL.SetText( String( CUI_RES(nRID) ) ); 354cdf0e10cSrcweir FreeResource(); 355cdf0e10cSrcweir } 356cdf0e10cSrcweir 357cdf0e10cSrcweir NumericField& GetNumericFld() { return aValNF; } 358cdf0e10cSrcweir }; 359cdf0e10cSrcweir 360cdf0e10cSrcweir 361cdf0e10cSrcweir /*-------------------------------------------------- 362cdf0e10cSrcweir Entry IDs for options listbox of dialog 363cdf0e10cSrcweir --------------------------------------------------*/ 364cdf0e10cSrcweir 365cdf0e10cSrcweir enum EID_OPTIONS 366cdf0e10cSrcweir { 367cdf0e10cSrcweir EID_SPELL_AUTO, 368cdf0e10cSrcweir EID_GRAMMAR_AUTO, 369cdf0e10cSrcweir EID_CAPITAL_WORDS, 370cdf0e10cSrcweir EID_WORDS_WITH_DIGITS, 371cdf0e10cSrcweir EID_CAPITALIZATION, 372cdf0e10cSrcweir EID_SPELL_SPECIAL, 373cdf0e10cSrcweir EID_NUM_MIN_WORDLEN, 374cdf0e10cSrcweir EID_NUM_PRE_BREAK, 375cdf0e10cSrcweir EID_NUM_POST_BREAK, 376cdf0e10cSrcweir EID_HYPH_AUTO, 377cdf0e10cSrcweir EID_HYPH_SPECIAL 378cdf0e10cSrcweir }; 379cdf0e10cSrcweir 380cdf0e10cSrcweir //! this array must have an entry for every value of EID_OPTIONS. 381cdf0e10cSrcweir // It is used to get the respective property name. 382cdf0e10cSrcweir static const char * aEidToPropName[] = 383cdf0e10cSrcweir { 384cdf0e10cSrcweir UPN_IS_SPELL_AUTO, // EID_SPELL_AUTO 385cdf0e10cSrcweir UPN_IS_GRAMMAR_AUTO, // EID_GRAMMAR_AUTO 386cdf0e10cSrcweir UPN_IS_SPELL_UPPER_CASE, // EID_CAPITAL_WORDS 387cdf0e10cSrcweir UPN_IS_SPELL_WITH_DIGITS, // EID_WORDS_WITH_DIGITS 388cdf0e10cSrcweir UPN_IS_SPELL_CAPITALIZATION, // EID_CAPITALIZATION 389cdf0e10cSrcweir UPN_IS_SPELL_SPECIAL, // EID_SPELL_SPECIAL 390cdf0e10cSrcweir UPN_HYPH_MIN_WORD_LENGTH, // EID_NUM_MIN_WORDLEN, 391cdf0e10cSrcweir UPN_HYPH_MIN_LEADING, // EID_NUM_PRE_BREAK 392cdf0e10cSrcweir UPN_HYPH_MIN_TRAILING, // EID_NUM_POST_BREAK 393cdf0e10cSrcweir UPN_IS_HYPH_AUTO, // EID_HYPH_AUTO 394cdf0e10cSrcweir UPN_IS_HYPH_SPECIAL // EID_HYPH_SPECIAL 395cdf0e10cSrcweir }; 396cdf0e10cSrcweir 397cdf0e10cSrcweir 398cdf0e10cSrcweir static inline String lcl_GetPropertyName( EID_OPTIONS eEntryId ) 399cdf0e10cSrcweir { 400cdf0e10cSrcweir DBG_ASSERT( (unsigned int) eEntryId < sizeof(aEidToPropName) / sizeof(aEidToPropName[0]), "index out of range" ); 401cdf0e10cSrcweir return String::CreateFromAscii( aEidToPropName[ (int) eEntryId ] ); 402cdf0e10cSrcweir } 403cdf0e10cSrcweir 404cdf0e10cSrcweir // class OptionsUserData ------------------------------------------------- 405cdf0e10cSrcweir 406cdf0e10cSrcweir class OptionsUserData 407cdf0e10cSrcweir { 408cdf0e10cSrcweir sal_uLong nVal; 409cdf0e10cSrcweir 410cdf0e10cSrcweir void SetModified(); 411cdf0e10cSrcweir 412cdf0e10cSrcweir public: 413cdf0e10cSrcweir OptionsUserData( sal_uLong nUserData ) : nVal( nUserData ) {} 414cdf0e10cSrcweir OptionsUserData( sal_uInt16 nEID, 415cdf0e10cSrcweir sal_Bool bHasNV, sal_uInt16 nNumVal, 416cdf0e10cSrcweir sal_Bool bCheckable, sal_Bool bChecked ); 417cdf0e10cSrcweir 418cdf0e10cSrcweir sal_uLong GetUserData() const { return nVal; } 419cdf0e10cSrcweir sal_uInt16 GetEntryId() const { return (sal_uInt16)(nVal >> 16); } 420cdf0e10cSrcweir sal_Bool HasNumericValue() const { return (sal_Bool)(nVal >> 10) & 0x01; } 421cdf0e10cSrcweir sal_uInt16 GetNumericValue() const { return (sal_uInt16)(nVal & 0xFF); } 422cdf0e10cSrcweir sal_Bool IsChecked() const { return (sal_Bool)(nVal >> 8) & 0x01; } 423cdf0e10cSrcweir sal_Bool IsCheckable() const { return (sal_Bool)(nVal >> 9) & 0x01; } 424cdf0e10cSrcweir sal_Bool IsModified() const { return (sal_Bool)(nVal >> 11) & 0x01; } 425cdf0e10cSrcweir 426cdf0e10cSrcweir void SetChecked( sal_Bool bVal ); 427cdf0e10cSrcweir void SetNumericValue( sal_uInt8 nNumVal ); 428cdf0e10cSrcweir }; 429cdf0e10cSrcweir 430cdf0e10cSrcweir OptionsUserData::OptionsUserData( sal_uInt16 nEID, 431cdf0e10cSrcweir sal_Bool bHasNV, sal_uInt16 nNumVal, 432cdf0e10cSrcweir sal_Bool bCheckable, sal_Bool bChecked ) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir DBG_ASSERT( nEID < 65000, "Entry Id out of range" ); 435cdf0e10cSrcweir DBG_ASSERT( nNumVal < 256, "value out of range" ); 436cdf0e10cSrcweir nVal = ((sal_uLong)(0xFFFF & nEID) << 16) | 437cdf0e10cSrcweir ((sal_uLong)(bHasNV ? 1 : 0) << 10) | 438cdf0e10cSrcweir ((sal_uLong)(bCheckable ? 1 : 0) << 9) | 439cdf0e10cSrcweir ((sal_uLong)(bChecked ? 1 : 0) << 8) | 440cdf0e10cSrcweir ((sal_uLong)(0xFF & nNumVal)); 441cdf0e10cSrcweir } 442cdf0e10cSrcweir 443cdf0e10cSrcweir void OptionsUserData::SetChecked( sal_Bool bVal ) 444cdf0e10cSrcweir { 445cdf0e10cSrcweir if (IsCheckable() && (IsChecked() != bVal)) 446cdf0e10cSrcweir { 447cdf0e10cSrcweir nVal &= ~(1UL << 8); 448cdf0e10cSrcweir nVal |= (sal_uLong)(bVal ? 1 : 0) << 8; 449cdf0e10cSrcweir SetModified(); 450cdf0e10cSrcweir } 451cdf0e10cSrcweir } 452cdf0e10cSrcweir 453cdf0e10cSrcweir void OptionsUserData::SetNumericValue( sal_uInt8 nNumVal ) 454cdf0e10cSrcweir { 455cdf0e10cSrcweir // DBG_ASSERT( nNumVal < 256, "value out of range" ); 456cdf0e10cSrcweir if (HasNumericValue() && (GetNumericValue() != nNumVal)) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir nVal &= 0xffffff00; 459cdf0e10cSrcweir nVal |= (nNumVal); 460cdf0e10cSrcweir SetModified(); 461cdf0e10cSrcweir } 462cdf0e10cSrcweir } 463cdf0e10cSrcweir 464cdf0e10cSrcweir void OptionsUserData::SetModified() 465cdf0e10cSrcweir { 466cdf0e10cSrcweir nVal |= (sal_uLong)1 << 11; 467cdf0e10cSrcweir } 468cdf0e10cSrcweir 469cdf0e10cSrcweir // class BrwString_Impl ------------------------------------------------- 470cdf0e10cSrcweir 471cdf0e10cSrcweir class BrwString_Impl : public SvLBoxString 472cdf0e10cSrcweir { 473cdf0e10cSrcweir public: 474cdf0e10cSrcweir 475cdf0e10cSrcweir BrwString_Impl( SvLBoxEntry* pEntry, sal_uInt16 nFlags, 476cdf0e10cSrcweir const String& rStr ) : SvLBoxString( pEntry, nFlags, rStr ) {} 477cdf0e10cSrcweir 478cdf0e10cSrcweir virtual void Paint( const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, 479cdf0e10cSrcweir SvLBoxEntry* pEntry); 480cdf0e10cSrcweir }; 481cdf0e10cSrcweir 482cdf0e10cSrcweir void BrwString_Impl::Paint( const Point& rPos, SvLBox& rDev, sal_uInt16, 483cdf0e10cSrcweir SvLBoxEntry* pEntry ) 484cdf0e10cSrcweir { 485cdf0e10cSrcweir Point aPos(rPos); 486cdf0e10cSrcweir aPos.X() += 20; 487cdf0e10cSrcweir rDev.DrawText( aPos, GetText() ); 488cdf0e10cSrcweir if(pEntry->GetUserData()) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir Point aNewPos(aPos); 491cdf0e10cSrcweir aNewPos.X() += rDev.GetTextWidth(GetText()); 492cdf0e10cSrcweir Font aOldFont( rDev.GetFont()); 493cdf0e10cSrcweir Font aFont( aOldFont ); 494cdf0e10cSrcweir aFont.SetWeight( WEIGHT_BOLD ); 495cdf0e10cSrcweir 496cdf0e10cSrcweir // sal_Bool bFett = sal_True; 497cdf0e10cSrcweir // sal_uInt16 nPos = 0; 498cdf0e10cSrcweir //??? das untere byte aus dem user data in string wandeln 499cdf0e10cSrcweir OptionsUserData aData( (sal_uLong) pEntry->GetUserData() ); 500cdf0e10cSrcweir if(aData.HasNumericValue()) 501cdf0e10cSrcweir { 502cdf0e10cSrcweir String sTxt( ' ' ); 503cdf0e10cSrcweir sTxt += String::CreateFromInt32( aData.GetNumericValue() ); 504cdf0e10cSrcweir rDev.SetFont( aFont ); 505cdf0e10cSrcweir rDev.DrawText( aNewPos, sTxt ); 506cdf0e10cSrcweir } 507cdf0e10cSrcweir 508cdf0e10cSrcweir // if( STRING_NOTFOUND != nPos ) 509cdf0e10cSrcweir // aNewPos.X() += rDev.GetTextWidth( sTxt ); 510cdf0e10cSrcweir 511cdf0e10cSrcweir rDev.SetFont( aOldFont ); 512cdf0e10cSrcweir } 513cdf0e10cSrcweir } 514cdf0e10cSrcweir 515cdf0e10cSrcweir // ServiceInfo_Impl ---------------------------------------------------- 516cdf0e10cSrcweir 517cdf0e10cSrcweir struct ServiceInfo_Impl 518cdf0e10cSrcweir { 519cdf0e10cSrcweir OUString sDisplayName; 520cdf0e10cSrcweir OUString sSpellImplName; 521cdf0e10cSrcweir OUString sHyphImplName; 522cdf0e10cSrcweir OUString sThesImplName; 523cdf0e10cSrcweir OUString sGrammarImplName; 524cdf0e10cSrcweir uno::Reference< XSpellChecker > xSpell; 525cdf0e10cSrcweir uno::Reference< XHyphenator > xHyph; 526cdf0e10cSrcweir uno::Reference< XThesaurus > xThes; 527cdf0e10cSrcweir uno::Reference< XProofreader > xGrammar; 528cdf0e10cSrcweir sal_Bool bConfigured; 529cdf0e10cSrcweir 530cdf0e10cSrcweir ServiceInfo_Impl() : bConfigured(sal_False) {} 531cdf0e10cSrcweir }; 532cdf0e10cSrcweir 533cdf0e10cSrcweir typedef std::vector< ServiceInfo_Impl > ServiceInfoArr; 534cdf0e10cSrcweir typedef std::map< sal_Int16 /*LanguageType*/, Sequence< OUString > > LangImplNameTable; 535cdf0e10cSrcweir 536cdf0e10cSrcweir 537cdf0e10cSrcweir // SvxLinguData_Impl ---------------------------------------------------- 538cdf0e10cSrcweir 539cdf0e10cSrcweir class SvxLinguData_Impl 540cdf0e10cSrcweir { 541cdf0e10cSrcweir //contains services and implementation names sorted by implementation names 542cdf0e10cSrcweir ServiceInfoArr aDisplayServiceArr; 543cdf0e10cSrcweir sal_uLong nDisplayServices; 544cdf0e10cSrcweir 545cdf0e10cSrcweir Sequence< Locale > aAllServiceLocales; 546cdf0e10cSrcweir LangImplNameTable aCfgSpellTable; 547cdf0e10cSrcweir LangImplNameTable aCfgHyphTable; 548cdf0e10cSrcweir LangImplNameTable aCfgThesTable; 549cdf0e10cSrcweir LangImplNameTable aCfgGrammarTable; 550cdf0e10cSrcweir uno::Reference< XMultiServiceFactory > xMSF; 551cdf0e10cSrcweir uno::Reference< XLinguServiceManager > xLinguSrvcMgr; 552cdf0e10cSrcweir 553cdf0e10cSrcweir 554cdf0e10cSrcweir sal_Bool AddRemove( Sequence< OUString > &rConfigured, 555cdf0e10cSrcweir const OUString &rImplName, sal_Bool bAdd ); 556cdf0e10cSrcweir 557cdf0e10cSrcweir public: 558cdf0e10cSrcweir SvxLinguData_Impl(); 559cdf0e10cSrcweir SvxLinguData_Impl( const SvxLinguData_Impl &rData ); 560cdf0e10cSrcweir ~SvxLinguData_Impl(); 561cdf0e10cSrcweir 562cdf0e10cSrcweir SvxLinguData_Impl & operator = (const SvxLinguData_Impl &rData); 563cdf0e10cSrcweir 564cdf0e10cSrcweir uno::Reference<XLinguServiceManager> & GetManager() { return xLinguSrvcMgr; } 565cdf0e10cSrcweir 566cdf0e10cSrcweir void SetChecked( const Sequence< OUString > &rConfiguredServices ); 567cdf0e10cSrcweir void Reconfigure( const OUString &rDisplayName, sal_Bool bEnable ); 568cdf0e10cSrcweir 569cdf0e10cSrcweir const Sequence<Locale> & GetAllSupportedLocales() { return aAllServiceLocales; } 570cdf0e10cSrcweir 571cdf0e10cSrcweir const LangImplNameTable & GetSpellTable() const { return aCfgSpellTable; } 572cdf0e10cSrcweir LangImplNameTable & GetSpellTable() { return aCfgSpellTable; } 573cdf0e10cSrcweir const LangImplNameTable & GetHyphTable() const { return aCfgHyphTable; } 574cdf0e10cSrcweir LangImplNameTable & GetHyphTable() { return aCfgHyphTable; } 575cdf0e10cSrcweir const LangImplNameTable & GetThesTable() const { return aCfgThesTable; } 576cdf0e10cSrcweir LangImplNameTable & GetThesTable() { return aCfgThesTable; } 577cdf0e10cSrcweir const LangImplNameTable & GetGrammarTable() const { return aCfgGrammarTable; } 578cdf0e10cSrcweir LangImplNameTable & GetGrammarTable() { return aCfgGrammarTable; } 579cdf0e10cSrcweir 580cdf0e10cSrcweir const ServiceInfoArr & GetDisplayServiceArray() const { return aDisplayServiceArr; } 581cdf0e10cSrcweir ServiceInfoArr & GetDisplayServiceArray() { return aDisplayServiceArr; } 582cdf0e10cSrcweir 583cdf0e10cSrcweir const sal_uLong & GetDisplayServiceCount() const { return nDisplayServices; } 584cdf0e10cSrcweir void SetDisplayServiceCount( sal_uLong nVal ) { nDisplayServices = nVal; } 585cdf0e10cSrcweir 586cdf0e10cSrcweir // returns the list of service implementation names for the specified 587cdf0e10cSrcweir // language and service (TYPE_SPELL, TYPE_HYPH, TYPE_THES) sorted in 588cdf0e10cSrcweir // the proper order for the SvxEditModulesDlg (the ones from the 589cdf0e10cSrcweir // configuration (keeping that order!) first and then the other ones. 590cdf0e10cSrcweir // I.e. the ones available but not configured in arbitrary order). 591cdf0e10cSrcweir // They available ones may contain names that do not(!) support that 592cdf0e10cSrcweir // language. 593cdf0e10cSrcweir Sequence< OUString > GetSortedImplNames( sal_Int16 nLang, sal_uInt8 nType ); 594cdf0e10cSrcweir 595cdf0e10cSrcweir ServiceInfo_Impl * GetInfoByImplName( const OUString &rSvcImplName ); 596cdf0e10cSrcweir }; 597cdf0e10cSrcweir 598cdf0e10cSrcweir 599cdf0e10cSrcweir sal_Int32 lcl_SeqGetIndex( const Sequence< OUString > &rSeq, const OUString &rTxt ) 600cdf0e10cSrcweir { 601cdf0e10cSrcweir sal_Int32 nRes = -1; 602cdf0e10cSrcweir sal_Int32 nLen = rSeq.getLength(); 603cdf0e10cSrcweir const OUString *pString = rSeq.getConstArray(); 604cdf0e10cSrcweir for (sal_Int32 i = 0; i < nLen && nRes == -1; ++i) 605cdf0e10cSrcweir { 606cdf0e10cSrcweir if (pString[i] == rTxt) 607cdf0e10cSrcweir nRes = i; 608cdf0e10cSrcweir } 609cdf0e10cSrcweir return nRes; 610cdf0e10cSrcweir } 611cdf0e10cSrcweir 612cdf0e10cSrcweir 613cdf0e10cSrcweir Sequence< OUString > SvxLinguData_Impl::GetSortedImplNames( sal_Int16 nLang, sal_uInt8 nType ) 614cdf0e10cSrcweir { 615cdf0e10cSrcweir LangImplNameTable *pTable = 0; 616cdf0e10cSrcweir switch (nType) 617cdf0e10cSrcweir { 618cdf0e10cSrcweir case TYPE_SPELL : pTable = &aCfgSpellTable; break; 619cdf0e10cSrcweir case TYPE_HYPH : pTable = &aCfgHyphTable; break; 620cdf0e10cSrcweir case TYPE_THES : pTable = &aCfgThesTable; break; 621cdf0e10cSrcweir case TYPE_GRAMMAR : pTable = &aCfgGrammarTable; break; 622cdf0e10cSrcweir } 623cdf0e10cSrcweir Sequence< OUString > aRes; 624cdf0e10cSrcweir if (pTable->count( nLang )) 625cdf0e10cSrcweir aRes = (*pTable)[ nLang ]; // add configured services 626cdf0e10cSrcweir sal_Int32 nIdx = aRes.getLength(); 627cdf0e10cSrcweir DBG_ASSERT( (sal_Int32) nDisplayServices >= nIdx, "size mismatch" ); 628cdf0e10cSrcweir aRes.realloc( nDisplayServices ); 629cdf0e10cSrcweir OUString *pRes = aRes.getArray(); 630cdf0e10cSrcweir 631cdf0e10cSrcweir // add not configured services 632cdf0e10cSrcweir for (sal_Int32 i = 0; i < (sal_Int32) nDisplayServices; ++i) 633cdf0e10cSrcweir { 634cdf0e10cSrcweir const ServiceInfo_Impl &rInfo = aDisplayServiceArr[ i ]; 635cdf0e10cSrcweir OUString aImplName; 636cdf0e10cSrcweir switch (nType) 637cdf0e10cSrcweir { 638cdf0e10cSrcweir case TYPE_SPELL : aImplName = rInfo.sSpellImplName; break; 639cdf0e10cSrcweir case TYPE_HYPH : aImplName = rInfo.sHyphImplName; break; 640cdf0e10cSrcweir case TYPE_THES : aImplName = rInfo.sThesImplName; break; 641cdf0e10cSrcweir case TYPE_GRAMMAR : aImplName = rInfo.sGrammarImplName; break; 642cdf0e10cSrcweir } 643cdf0e10cSrcweir 644cdf0e10cSrcweir if (aImplName.getLength() && (lcl_SeqGetIndex( aRes, aImplName) == -1)) // name not yet added 645cdf0e10cSrcweir { 646cdf0e10cSrcweir DBG_ASSERT( nIdx < aRes.getLength(), "index out of range" ); 647cdf0e10cSrcweir if (nIdx < aRes.getLength()) 648cdf0e10cSrcweir pRes[ nIdx++ ] = aImplName; 649cdf0e10cSrcweir } 650cdf0e10cSrcweir } 651cdf0e10cSrcweir // don't forget to put aRes back to its actual size just in case you allocated too much 652cdf0e10cSrcweir // since all of the names may have already been added 653cdf0e10cSrcweir // otherwise you get duplicate entries in the edit dialog 654cdf0e10cSrcweir aRes.realloc( nIdx ); 655cdf0e10cSrcweir return aRes; 656cdf0e10cSrcweir } 657cdf0e10cSrcweir 658cdf0e10cSrcweir 659cdf0e10cSrcweir ServiceInfo_Impl * SvxLinguData_Impl::GetInfoByImplName( const OUString &rSvcImplName ) 660cdf0e10cSrcweir { 661cdf0e10cSrcweir ServiceInfo_Impl* pInfo = 0; 662cdf0e10cSrcweir for (sal_uLong i = 0; i < nDisplayServices && !pInfo; ++i) 663cdf0e10cSrcweir { 664cdf0e10cSrcweir ServiceInfo_Impl &rTmp = aDisplayServiceArr[ i ]; 665cdf0e10cSrcweir if (rTmp.sSpellImplName == rSvcImplName || 666cdf0e10cSrcweir rTmp.sHyphImplName == rSvcImplName || 667cdf0e10cSrcweir rTmp.sThesImplName == rSvcImplName || 668cdf0e10cSrcweir rTmp.sGrammarImplName == rSvcImplName) 669cdf0e10cSrcweir pInfo = &rTmp; 670cdf0e10cSrcweir } 671cdf0e10cSrcweir return pInfo; 672cdf0e10cSrcweir } 673cdf0e10cSrcweir 674cdf0e10cSrcweir 675cdf0e10cSrcweir //----------------------------------------------------------------------------- 676cdf0e10cSrcweir 677cdf0e10cSrcweir void lcl_MergeLocales(Sequence< Locale >& aAllLocales, const Sequence< Locale >& rAdd) 678cdf0e10cSrcweir { 679cdf0e10cSrcweir const Locale* pAdd = rAdd.getConstArray(); 680cdf0e10cSrcweir Sequence<Locale> aLocToAdd(rAdd.getLength()); 681cdf0e10cSrcweir const Locale* pAllLocales = aAllLocales.getConstArray(); 682cdf0e10cSrcweir Locale* pLocToAdd = aLocToAdd.getArray(); 683cdf0e10cSrcweir sal_Int32 nFound = 0; 684cdf0e10cSrcweir sal_Int32 i; 685cdf0e10cSrcweir for(i = 0; i < rAdd.getLength(); i++) 686cdf0e10cSrcweir { 687cdf0e10cSrcweir sal_Bool bFound = sal_False; 688cdf0e10cSrcweir for(sal_Int32 j = 0; j < aAllLocales.getLength() && !bFound; j++) 689cdf0e10cSrcweir { 690cdf0e10cSrcweir bFound = pAdd[i].Language == pAllLocales[j].Language && 691cdf0e10cSrcweir pAdd[i].Country == pAllLocales[j].Country; 692cdf0e10cSrcweir } 693cdf0e10cSrcweir if(!bFound) 694cdf0e10cSrcweir { 695cdf0e10cSrcweir pLocToAdd[nFound++] = pAdd[i]; 696cdf0e10cSrcweir } 697cdf0e10cSrcweir } 698cdf0e10cSrcweir sal_Int32 nLength = aAllLocales.getLength(); 699cdf0e10cSrcweir aAllLocales.realloc( nLength + nFound); 700cdf0e10cSrcweir Locale* pAllLocales2 = aAllLocales.getArray(); 701cdf0e10cSrcweir for(i = 0; i < nFound; i++) 702cdf0e10cSrcweir pAllLocales2[nLength++] = pLocToAdd[i]; 703cdf0e10cSrcweir } 704cdf0e10cSrcweir /* -----------------------------27.11.00 16:48-------------------------------- 705cdf0e10cSrcweir 706cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 707cdf0e10cSrcweir void lcl_MergeDisplayArray( 708cdf0e10cSrcweir SvxLinguData_Impl &rData, 709cdf0e10cSrcweir const ServiceInfo_Impl &rToAdd ) 710cdf0e10cSrcweir { 711cdf0e10cSrcweir sal_uLong nCnt = 0; 712cdf0e10cSrcweir 713cdf0e10cSrcweir ServiceInfoArr &rSvcInfoArr = rData.GetDisplayServiceArray(); 714cdf0e10cSrcweir sal_uLong nEntries = rData.GetDisplayServiceCount(); 715cdf0e10cSrcweir 716cdf0e10cSrcweir ServiceInfo_Impl* pEntry; 717cdf0e10cSrcweir for (sal_uLong i = 0; i < nEntries; ++i) 718cdf0e10cSrcweir { 719cdf0e10cSrcweir pEntry = &rSvcInfoArr[i]; 720cdf0e10cSrcweir if (pEntry && pEntry->sDisplayName == rToAdd.sDisplayName) 721cdf0e10cSrcweir { 722cdf0e10cSrcweir if(rToAdd.xSpell.is()) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir DBG_ASSERT( !pEntry->xSpell.is() && 725cdf0e10cSrcweir pEntry->sSpellImplName.getLength() == 0, 726cdf0e10cSrcweir "merge conflict" ); 727cdf0e10cSrcweir pEntry->sSpellImplName = rToAdd.sSpellImplName; 728cdf0e10cSrcweir pEntry->xSpell = rToAdd.xSpell; 729cdf0e10cSrcweir } 730cdf0e10cSrcweir if(rToAdd.xGrammar.is()) 731cdf0e10cSrcweir { 732cdf0e10cSrcweir DBG_ASSERT( !pEntry->xGrammar.is() && 733cdf0e10cSrcweir pEntry->sGrammarImplName.getLength() == 0, 734cdf0e10cSrcweir "merge conflict" ); 735cdf0e10cSrcweir pEntry->sGrammarImplName = rToAdd.sGrammarImplName; 736cdf0e10cSrcweir pEntry->xGrammar = rToAdd.xGrammar; 737cdf0e10cSrcweir } 738cdf0e10cSrcweir if(rToAdd.xHyph.is()) 739cdf0e10cSrcweir { 740cdf0e10cSrcweir DBG_ASSERT( !pEntry->xHyph.is() && 741cdf0e10cSrcweir pEntry->sHyphImplName.getLength() == 0, 742cdf0e10cSrcweir "merge conflict" ); 743cdf0e10cSrcweir pEntry->sHyphImplName = rToAdd.sHyphImplName; 744cdf0e10cSrcweir pEntry->xHyph = rToAdd.xHyph; 745cdf0e10cSrcweir } 746cdf0e10cSrcweir if(rToAdd.xThes.is()) 747cdf0e10cSrcweir { 748cdf0e10cSrcweir DBG_ASSERT( !pEntry->xThes.is() && 749cdf0e10cSrcweir pEntry->sThesImplName.getLength() == 0, 750cdf0e10cSrcweir "merge conflict" ); 751cdf0e10cSrcweir pEntry->sThesImplName = rToAdd.sThesImplName; 752cdf0e10cSrcweir pEntry->xThes = rToAdd.xThes; 753cdf0e10cSrcweir } 754cdf0e10cSrcweir return ; 755cdf0e10cSrcweir } 756cdf0e10cSrcweir ++nCnt; 757cdf0e10cSrcweir } 758cdf0e10cSrcweir rData.GetDisplayServiceArray().push_back( rToAdd ); 759cdf0e10cSrcweir rData.SetDisplayServiceCount( nCnt + 1 ); 760cdf0e10cSrcweir } 761cdf0e10cSrcweir /* -----------------------------26.11.00 18:07-------------------------------- 762cdf0e10cSrcweir 763cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 764cdf0e10cSrcweir SvxLinguData_Impl::SvxLinguData_Impl() : 765cdf0e10cSrcweir nDisplayServices (0) 766cdf0e10cSrcweir { 767cdf0e10cSrcweir xMSF = ::comphelper::getProcessServiceFactory(); 768cdf0e10cSrcweir uno::Reference < XInterface > xI = xMSF->createInstance( 769cdf0e10cSrcweir C2U( "com.sun.star.linguistic2.LinguServiceManager" ) ); 770cdf0e10cSrcweir xLinguSrvcMgr = uno::Reference<XLinguServiceManager>(xI, UNO_QUERY); 771cdf0e10cSrcweir DBG_ASSERT(xLinguSrvcMgr.is(), "No linguistic service available!"); 772cdf0e10cSrcweir if(xLinguSrvcMgr.is()) 773cdf0e10cSrcweir { 774cdf0e10cSrcweir Locale aCurrentLocale; 775cdf0e10cSrcweir LanguageType eLang = Application::GetSettings().GetLanguage(); 776cdf0e10cSrcweir SvxLanguageToLocale(aCurrentLocale, eLang); 777cdf0e10cSrcweir Sequence<Any> aArgs(2);//second arguments has to be empty! 778cdf0e10cSrcweir aArgs.getArray()[0] <<= SvxGetLinguPropertySet(); 779cdf0e10cSrcweir 780cdf0e10cSrcweir //read spell checker 781cdf0e10cSrcweir Sequence< OUString > aSpellNames = xLinguSrvcMgr->getAvailableServices( 782cdf0e10cSrcweir C2U(cSpell), Locale() ); 783cdf0e10cSrcweir const OUString* pSpellNames = aSpellNames.getConstArray(); 784cdf0e10cSrcweir 785cdf0e10cSrcweir sal_Int32 nIdx; 786cdf0e10cSrcweir for(nIdx = 0; nIdx < aSpellNames.getLength(); nIdx++) 787cdf0e10cSrcweir { 788cdf0e10cSrcweir ServiceInfo_Impl aInfo; 789cdf0e10cSrcweir aInfo.sSpellImplName = pSpellNames[nIdx]; 790cdf0e10cSrcweir aInfo.xSpell = uno::Reference<XSpellChecker>( 791cdf0e10cSrcweir xMSF->createInstanceWithArguments(aInfo.sSpellImplName, aArgs), UNO_QUERY); 792cdf0e10cSrcweir 793cdf0e10cSrcweir uno::Reference<XServiceDisplayName> xDispName(aInfo.xSpell, UNO_QUERY); 794cdf0e10cSrcweir if(xDispName.is()) 795cdf0e10cSrcweir aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); 796cdf0e10cSrcweir 797cdf0e10cSrcweir const Sequence< Locale > aLocales( aInfo.xSpell->getLocales() ); 798cdf0e10cSrcweir //! suppress display of entries with no supported languages (see feature 110994) 799cdf0e10cSrcweir if (aLocales.getLength()) 800cdf0e10cSrcweir { 801cdf0e10cSrcweir lcl_MergeLocales( aAllServiceLocales, aLocales ); 802cdf0e10cSrcweir lcl_MergeDisplayArray( *this, aInfo ); 803cdf0e10cSrcweir } 804cdf0e10cSrcweir } 805cdf0e10cSrcweir 806cdf0e10cSrcweir //read grammar checker 807cdf0e10cSrcweir Sequence< OUString > aGrammarNames = xLinguSrvcMgr->getAvailableServices( 808cdf0e10cSrcweir C2U(cGrammar), Locale() ); 809cdf0e10cSrcweir const OUString* pGrammarNames = aGrammarNames.getConstArray(); 810cdf0e10cSrcweir for(nIdx = 0; nIdx < aGrammarNames.getLength(); nIdx++) 811cdf0e10cSrcweir { 812cdf0e10cSrcweir ServiceInfo_Impl aInfo; 813cdf0e10cSrcweir aInfo.sGrammarImplName = pGrammarNames[nIdx]; 814cdf0e10cSrcweir aInfo.xGrammar = uno::Reference<XProofreader>( 815cdf0e10cSrcweir xMSF->createInstanceWithArguments(aInfo.sGrammarImplName, aArgs), UNO_QUERY); 816cdf0e10cSrcweir 817cdf0e10cSrcweir uno::Reference<XServiceDisplayName> xDispName(aInfo.xGrammar, UNO_QUERY); 818cdf0e10cSrcweir if(xDispName.is()) 819cdf0e10cSrcweir aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); 820cdf0e10cSrcweir 821cdf0e10cSrcweir const Sequence< Locale > aLocales( aInfo.xGrammar->getLocales() ); 822cdf0e10cSrcweir //! suppress display of entries with no supported languages (see feature 110994) 823cdf0e10cSrcweir if (aLocales.getLength()) 824cdf0e10cSrcweir { 825cdf0e10cSrcweir lcl_MergeLocales( aAllServiceLocales, aLocales ); 826cdf0e10cSrcweir lcl_MergeDisplayArray( *this, aInfo ); 827cdf0e10cSrcweir } 828cdf0e10cSrcweir } 829cdf0e10cSrcweir 830cdf0e10cSrcweir //read hyphenator 831cdf0e10cSrcweir Sequence< OUString > aHyphNames = xLinguSrvcMgr->getAvailableServices( 832cdf0e10cSrcweir C2U(cHyph), Locale() ); 833cdf0e10cSrcweir const OUString* pHyphNames = aHyphNames.getConstArray(); 834cdf0e10cSrcweir for(nIdx = 0; nIdx < aHyphNames.getLength(); nIdx++) 835cdf0e10cSrcweir { 836cdf0e10cSrcweir ServiceInfo_Impl aInfo; 837cdf0e10cSrcweir aInfo.sHyphImplName = pHyphNames[nIdx]; 838cdf0e10cSrcweir aInfo.xHyph = uno::Reference<XHyphenator>( 839cdf0e10cSrcweir xMSF->createInstanceWithArguments(aInfo.sHyphImplName, aArgs), UNO_QUERY); 840cdf0e10cSrcweir 841cdf0e10cSrcweir uno::Reference<XServiceDisplayName> xDispName(aInfo.xHyph, UNO_QUERY); 842cdf0e10cSrcweir if(xDispName.is()) 843cdf0e10cSrcweir aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); 844cdf0e10cSrcweir 845cdf0e10cSrcweir const Sequence< Locale > aLocales( aInfo.xHyph->getLocales() ); 846cdf0e10cSrcweir //! suppress display of entries with no supported languages (see feature 110994) 847cdf0e10cSrcweir if (aLocales.getLength()) 848cdf0e10cSrcweir { 849cdf0e10cSrcweir lcl_MergeLocales( aAllServiceLocales, aLocales ); 850cdf0e10cSrcweir lcl_MergeDisplayArray( *this, aInfo ); 851cdf0e10cSrcweir } 852cdf0e10cSrcweir } 853cdf0e10cSrcweir 854cdf0e10cSrcweir //read thesauri 855cdf0e10cSrcweir Sequence< OUString > aThesNames = xLinguSrvcMgr->getAvailableServices( 856cdf0e10cSrcweir C2U(cThes), Locale() ); 857cdf0e10cSrcweir const OUString* pThesNames = aThesNames.getConstArray(); 858cdf0e10cSrcweir for(nIdx = 0; nIdx < aThesNames.getLength(); nIdx++) 859cdf0e10cSrcweir { 860cdf0e10cSrcweir ServiceInfo_Impl aInfo; 861cdf0e10cSrcweir aInfo.sThesImplName = pThesNames[nIdx]; 862cdf0e10cSrcweir aInfo.xThes = uno::Reference<XThesaurus>( 863cdf0e10cSrcweir xMSF->createInstanceWithArguments(aInfo.sThesImplName, aArgs), UNO_QUERY); 864cdf0e10cSrcweir 865cdf0e10cSrcweir uno::Reference<XServiceDisplayName> xDispName(aInfo.xThes, UNO_QUERY); 866cdf0e10cSrcweir if(xDispName.is()) 867cdf0e10cSrcweir aInfo.sDisplayName = xDispName->getServiceDisplayName( aCurrentLocale ); 868cdf0e10cSrcweir 869cdf0e10cSrcweir const Sequence< Locale > aLocales( aInfo.xThes->getLocales() ); 870cdf0e10cSrcweir //! suppress display of entries with no supported languages (see feature 110994) 871cdf0e10cSrcweir if (aLocales.getLength()) 872cdf0e10cSrcweir { 873cdf0e10cSrcweir lcl_MergeLocales( aAllServiceLocales, aLocales ); 874cdf0e10cSrcweir lcl_MergeDisplayArray( *this, aInfo ); 875cdf0e10cSrcweir } 876cdf0e10cSrcweir } 877cdf0e10cSrcweir 878cdf0e10cSrcweir Sequence< OUString > aCfgSvcs; 879cdf0e10cSrcweir const Locale* pAllLocales = aAllServiceLocales.getConstArray(); 880cdf0e10cSrcweir for(sal_Int32 nLocale = 0; nLocale < aAllServiceLocales.getLength(); nLocale++) 881cdf0e10cSrcweir { 882cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( pAllLocales[nLocale] ); 883cdf0e10cSrcweir 884cdf0e10cSrcweir aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cSpell), pAllLocales[nLocale]); 885cdf0e10cSrcweir SetChecked( aCfgSvcs ); 886cdf0e10cSrcweir if (aCfgSvcs.getLength()) 887cdf0e10cSrcweir aCfgSpellTable[ nLang ] = aCfgSvcs; 888cdf0e10cSrcweir 889cdf0e10cSrcweir aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cGrammar), pAllLocales[nLocale]); 890cdf0e10cSrcweir SetChecked( aCfgSvcs ); 891cdf0e10cSrcweir if (aCfgSvcs.getLength()) 892cdf0e10cSrcweir aCfgGrammarTable[ nLang ] = aCfgSvcs; 893cdf0e10cSrcweir 894cdf0e10cSrcweir aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cHyph), pAllLocales[nLocale]); 895cdf0e10cSrcweir SetChecked( aCfgSvcs ); 896cdf0e10cSrcweir if (aCfgSvcs.getLength()) 897cdf0e10cSrcweir aCfgHyphTable[ nLang ] = aCfgSvcs; 898cdf0e10cSrcweir 899cdf0e10cSrcweir aCfgSvcs = xLinguSrvcMgr->getConfiguredServices(C2U(cThes), pAllLocales[nLocale]); 900cdf0e10cSrcweir SetChecked( aCfgSvcs ); 901cdf0e10cSrcweir if (aCfgSvcs.getLength()) 902cdf0e10cSrcweir aCfgThesTable[ nLang ] = aCfgSvcs; 903cdf0e10cSrcweir } 904cdf0e10cSrcweir } 905cdf0e10cSrcweir } 906cdf0e10cSrcweir /* -----------------------------22.05.01 10:43-------------------------------- 907cdf0e10cSrcweir 908cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 909cdf0e10cSrcweir SvxLinguData_Impl::SvxLinguData_Impl( const SvxLinguData_Impl &rData ) : 910cdf0e10cSrcweir aDisplayServiceArr (rData.aDisplayServiceArr), 911cdf0e10cSrcweir nDisplayServices (rData.nDisplayServices), 912cdf0e10cSrcweir aAllServiceLocales (rData.aAllServiceLocales), 913cdf0e10cSrcweir aCfgSpellTable (rData.aCfgSpellTable), 914cdf0e10cSrcweir aCfgHyphTable (rData.aCfgHyphTable), 915cdf0e10cSrcweir aCfgThesTable (rData.aCfgThesTable), 916cdf0e10cSrcweir aCfgGrammarTable (rData.aCfgGrammarTable), 917cdf0e10cSrcweir xMSF (rData.xMSF), 918cdf0e10cSrcweir xLinguSrvcMgr (rData.xLinguSrvcMgr) 919cdf0e10cSrcweir { 920cdf0e10cSrcweir } 921cdf0e10cSrcweir /* -----------------------------22.05.01 10:43-------------------------------- 922cdf0e10cSrcweir 923cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 924cdf0e10cSrcweir SvxLinguData_Impl & SvxLinguData_Impl::operator = (const SvxLinguData_Impl &rData) 925cdf0e10cSrcweir { 926cdf0e10cSrcweir xMSF = rData.xMSF; 927cdf0e10cSrcweir xLinguSrvcMgr = rData.xLinguSrvcMgr; 928cdf0e10cSrcweir aAllServiceLocales = rData.aAllServiceLocales; 929cdf0e10cSrcweir aCfgSpellTable = rData.aCfgSpellTable; 930cdf0e10cSrcweir aCfgHyphTable = rData.aCfgHyphTable; 931cdf0e10cSrcweir aCfgThesTable = rData.aCfgThesTable; 932cdf0e10cSrcweir aCfgGrammarTable = rData.aCfgGrammarTable; 933cdf0e10cSrcweir aDisplayServiceArr = rData.aDisplayServiceArr; 934cdf0e10cSrcweir nDisplayServices = rData.nDisplayServices; 935cdf0e10cSrcweir return *this; 936cdf0e10cSrcweir } 937cdf0e10cSrcweir /* -----------------------------26.11.00 18:08-------------------------------- 938cdf0e10cSrcweir 939cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 940cdf0e10cSrcweir SvxLinguData_Impl::~SvxLinguData_Impl() 941cdf0e10cSrcweir { 942cdf0e10cSrcweir } 943cdf0e10cSrcweir /* -----------------------------26.11.00 19:42-------------------------------- 944cdf0e10cSrcweir 945cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 946cdf0e10cSrcweir void SvxLinguData_Impl::SetChecked(const Sequence<OUString>& rConfiguredServices) 947cdf0e10cSrcweir { 948cdf0e10cSrcweir const OUString* pConfiguredServices = rConfiguredServices.getConstArray(); 949cdf0e10cSrcweir for(sal_Int32 n = 0; n < rConfiguredServices.getLength(); n++) 950cdf0e10cSrcweir { 951cdf0e10cSrcweir ServiceInfo_Impl* pEntry; 952cdf0e10cSrcweir for (sal_uLong i = 0; i < nDisplayServices; ++i) 953cdf0e10cSrcweir { 954cdf0e10cSrcweir pEntry = &aDisplayServiceArr[i]; 955cdf0e10cSrcweir if (pEntry && !pEntry->bConfigured) 956cdf0e10cSrcweir { 957cdf0e10cSrcweir const OUString &rSrvcImplName = pConfiguredServices[n]; 958cdf0e10cSrcweir if (rSrvcImplName.getLength() && 959cdf0e10cSrcweir (pEntry->sSpellImplName == rSrvcImplName || 960cdf0e10cSrcweir pEntry->sGrammarImplName == rSrvcImplName || 961cdf0e10cSrcweir pEntry->sHyphImplName == rSrvcImplName || 962cdf0e10cSrcweir pEntry->sThesImplName == rSrvcImplName)) 963cdf0e10cSrcweir { 964cdf0e10cSrcweir pEntry->bConfigured = sal_True; 965cdf0e10cSrcweir break; 966cdf0e10cSrcweir } 967cdf0e10cSrcweir } 968cdf0e10cSrcweir } 969cdf0e10cSrcweir } 970cdf0e10cSrcweir } 971cdf0e10cSrcweir /* -----------------------------26.11.00 20:43-------------------------------- 972cdf0e10cSrcweir 973cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 974cdf0e10cSrcweir 975cdf0e10cSrcweir sal_Bool SvxLinguData_Impl::AddRemove( 976cdf0e10cSrcweir Sequence< OUString > &rConfigured, 977cdf0e10cSrcweir const OUString &rImplName, sal_Bool bAdd ) 978cdf0e10cSrcweir { 979cdf0e10cSrcweir sal_Bool bRet = sal_False; // modified? 980cdf0e10cSrcweir 981cdf0e10cSrcweir sal_Int32 nEntries = rConfigured.getLength(); 982cdf0e10cSrcweir sal_Int32 nPos = lcl_SeqGetEntryPos(rConfigured, rImplName); 983cdf0e10cSrcweir if (bAdd && nPos < 0) // add new entry 984cdf0e10cSrcweir { 985cdf0e10cSrcweir rConfigured.realloc( ++nEntries ); 986cdf0e10cSrcweir OUString *pConfigured = rConfigured.getArray(); 987cdf0e10cSrcweir pConfigured = rConfigured.getArray(); 988cdf0e10cSrcweir pConfigured[nEntries - 1] = rImplName; 989cdf0e10cSrcweir bRet = sal_True; 990cdf0e10cSrcweir } 991cdf0e10cSrcweir else if (!bAdd && nPos >= 0) // remove existing entry 992cdf0e10cSrcweir { 993cdf0e10cSrcweir OUString *pConfigured = rConfigured.getArray(); 994cdf0e10cSrcweir for (sal_Int32 i = nPos; i < nEntries - 1; ++i) 995cdf0e10cSrcweir pConfigured[i] = pConfigured[i + 1]; 996cdf0e10cSrcweir rConfigured.realloc(--nEntries); 997cdf0e10cSrcweir bRet = sal_True; 998cdf0e10cSrcweir } 999cdf0e10cSrcweir 1000cdf0e10cSrcweir return bRet; 1001cdf0e10cSrcweir } 1002cdf0e10cSrcweir 1003cdf0e10cSrcweir 1004cdf0e10cSrcweir void SvxLinguData_Impl::Reconfigure( const OUString &rDisplayName, sal_Bool bEnable ) 1005cdf0e10cSrcweir { 1006cdf0e10cSrcweir DBG_ASSERT( rDisplayName.getLength(), "empty DisplayName" ); 1007cdf0e10cSrcweir 1008cdf0e10cSrcweir ServiceInfo_Impl *pInfo = 0; 1009cdf0e10cSrcweir ServiceInfo_Impl *pTmp = 0; 1010cdf0e10cSrcweir for (sal_uLong i = 0; i < nDisplayServices; ++i) 1011cdf0e10cSrcweir { 1012cdf0e10cSrcweir pTmp = &aDisplayServiceArr[i]; 1013cdf0e10cSrcweir if (pTmp && pTmp->sDisplayName == rDisplayName) 1014cdf0e10cSrcweir { 1015cdf0e10cSrcweir pInfo = pTmp; 1016cdf0e10cSrcweir break; 1017cdf0e10cSrcweir } 1018cdf0e10cSrcweir } 1019cdf0e10cSrcweir DBG_ASSERT( pInfo, "DisplayName entry not found" ); 1020cdf0e10cSrcweir if (pInfo) 1021cdf0e10cSrcweir { 1022cdf0e10cSrcweir pInfo->bConfigured = bEnable; 1023cdf0e10cSrcweir 1024cdf0e10cSrcweir Sequence< Locale > aLocales; 1025cdf0e10cSrcweir const Locale *pLocale = 0; 1026cdf0e10cSrcweir sal_Int32 nLocales = 0; 1027cdf0e10cSrcweir sal_Int32 i; 1028cdf0e10cSrcweir 1029cdf0e10cSrcweir // update configured spellchecker entries 1030cdf0e10cSrcweir if (pInfo->xSpell.is()) 1031cdf0e10cSrcweir { 1032cdf0e10cSrcweir aLocales = pInfo->xSpell->getLocales(); 1033cdf0e10cSrcweir pLocale = aLocales.getConstArray(); 1034cdf0e10cSrcweir nLocales = aLocales.getLength(); 1035cdf0e10cSrcweir for (i = 0; i < nLocales; ++i) 1036cdf0e10cSrcweir { 1037cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); 1038cdf0e10cSrcweir if (!aCfgSpellTable.count( nLang ) && bEnable) 1039cdf0e10cSrcweir aCfgSpellTable[ nLang ] = Sequence< OUString >(); 1040cdf0e10cSrcweir if (aCfgSpellTable.count( nLang )) 1041cdf0e10cSrcweir AddRemove( aCfgSpellTable[ nLang ], pInfo->sSpellImplName, bEnable ); 1042cdf0e10cSrcweir } 1043cdf0e10cSrcweir } 1044cdf0e10cSrcweir 1045cdf0e10cSrcweir // update configured grammar checker entries 1046cdf0e10cSrcweir if (pInfo->xGrammar.is()) 1047cdf0e10cSrcweir { 1048cdf0e10cSrcweir aLocales = pInfo->xGrammar->getLocales(); 1049cdf0e10cSrcweir pLocale = aLocales.getConstArray(); 1050cdf0e10cSrcweir nLocales = aLocales.getLength(); 1051cdf0e10cSrcweir for (i = 0; i < nLocales; ++i) 1052cdf0e10cSrcweir { 1053cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); 1054cdf0e10cSrcweir if (!aCfgGrammarTable.count( nLang ) && bEnable) 1055cdf0e10cSrcweir aCfgGrammarTable[ nLang ] = Sequence< OUString >(); 1056cdf0e10cSrcweir if (aCfgGrammarTable.count( nLang )) 1057cdf0e10cSrcweir AddRemove( aCfgGrammarTable[ nLang ], pInfo->sGrammarImplName, bEnable ); 1058cdf0e10cSrcweir } 1059cdf0e10cSrcweir } 1060cdf0e10cSrcweir 1061cdf0e10cSrcweir // update configured hyphenator entries 1062cdf0e10cSrcweir if (pInfo->xHyph.is()) 1063cdf0e10cSrcweir { 1064cdf0e10cSrcweir aLocales = pInfo->xHyph->getLocales(); 1065cdf0e10cSrcweir pLocale = aLocales.getConstArray(); 1066cdf0e10cSrcweir nLocales = aLocales.getLength(); 1067cdf0e10cSrcweir for (i = 0; i < nLocales; ++i) 1068cdf0e10cSrcweir { 1069cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); 1070cdf0e10cSrcweir if (!aCfgHyphTable.count( nLang ) && bEnable) 1071cdf0e10cSrcweir aCfgHyphTable[ nLang ] = Sequence< OUString >(); 1072cdf0e10cSrcweir if (aCfgHyphTable.count( nLang )) 1073cdf0e10cSrcweir AddRemove( aCfgHyphTable[ nLang ], pInfo->sHyphImplName, bEnable ); 1074cdf0e10cSrcweir } 1075cdf0e10cSrcweir } 1076cdf0e10cSrcweir 1077cdf0e10cSrcweir // update configured spellchecker entries 1078cdf0e10cSrcweir if (pInfo->xThes.is()) 1079cdf0e10cSrcweir { 1080cdf0e10cSrcweir aLocales = pInfo->xThes->getLocales(); 1081cdf0e10cSrcweir pLocale = aLocales.getConstArray(); 1082cdf0e10cSrcweir nLocales = aLocales.getLength(); 1083cdf0e10cSrcweir for (i = 0; i < nLocales; ++i) 1084cdf0e10cSrcweir { 1085cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( pLocale[i] ); 1086cdf0e10cSrcweir if (!aCfgThesTable.count( nLang ) && bEnable) 1087cdf0e10cSrcweir aCfgThesTable[ nLang ] = Sequence< OUString >(); 1088cdf0e10cSrcweir if (aCfgThesTable.count( nLang )) 1089cdf0e10cSrcweir AddRemove( aCfgThesTable[ nLang ], pInfo->sThesImplName, bEnable ); 1090cdf0e10cSrcweir } 1091cdf0e10cSrcweir } 1092cdf0e10cSrcweir } 1093cdf0e10cSrcweir } 1094cdf0e10cSrcweir 1095cdf0e10cSrcweir 1096cdf0e10cSrcweir // class SvxLinguTabPage ------------------------------------------------- 1097cdf0e10cSrcweir 1098cdf0e10cSrcweir #define CBCOL_FIRST 0 1099cdf0e10cSrcweir #define CBCOL_SECOND 1 1100cdf0e10cSrcweir #define CBCOL_BOTH 2 1101cdf0e10cSrcweir 1102cdf0e10cSrcweir SvxLinguTabPage::SvxLinguTabPage( Window* pParent, 1103cdf0e10cSrcweir const SfxItemSet& rSet ): 1104cdf0e10cSrcweir 1105cdf0e10cSrcweir SfxTabPage( pParent, CUI_RES( RID_SFXPAGE_LINGU ), rSet ), 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir aLinguisticFL ( this, CUI_RES( FL_LINGUISTIC ) ), 1108cdf0e10cSrcweir aLinguModulesFT ( this, CUI_RES( FT_LINGU_MODULES ) ), 1109cdf0e10cSrcweir aLinguModulesCLB ( this, CUI_RES( CLB_LINGU_MODULES ) ), 1110cdf0e10cSrcweir aLinguModulesEditPB ( this, CUI_RES( PB_LINGU_MODULES_EDIT ) ), 1111cdf0e10cSrcweir aLinguDicsFT ( this, CUI_RES( FT_LINGU_DICS ) ), 1112cdf0e10cSrcweir aLinguDicsCLB ( this, CUI_RES( CLB_LINGU_DICS ) ), 1113cdf0e10cSrcweir aLinguDicsNewPB ( this, CUI_RES( PB_LINGU_DICS_NEW_DIC ) ), 1114cdf0e10cSrcweir aLinguDicsEditPB ( this, CUI_RES( PB_LINGU_DICS_EDIT_DIC ) ), 1115cdf0e10cSrcweir aLinguDicsDelPB ( this, CUI_RES( PB_LINGU_DICS_DEL_DIC ) ), 1116cdf0e10cSrcweir aLinguOptionsFT ( this, CUI_RES( FT_LINGU_OPTIONS ) ), 1117cdf0e10cSrcweir aLinguOptionsCLB ( this, CUI_RES( CLB_LINGU_OPTIONS ) ), 1118cdf0e10cSrcweir aLinguOptionsEditPB ( this, CUI_RES( PB_LINGU_OPTIONS_EDIT ) ), 1119cdf0e10cSrcweir aMoreDictsLink ( this, CUI_RES( FT_LINGU_OPTIONS_MOREDICTS ) ), 1120cdf0e10cSrcweir sCapitalWords ( CUI_RES( STR_CAPITAL_WORDS ) ), 1121cdf0e10cSrcweir sWordsWithDigits ( CUI_RES( STR_WORDS_WITH_DIGITS ) ), 1122cdf0e10cSrcweir sCapitalization ( CUI_RES( STR_CAPITALIZATION ) ), 1123cdf0e10cSrcweir sSpellSpecial ( CUI_RES( STR_SPELL_SPECIAL ) ), 1124cdf0e10cSrcweir sSpellAuto ( CUI_RES( STR_SPELL_AUTO ) ), 1125cdf0e10cSrcweir sGrammarAuto ( CUI_RES( STR_GRAMMAR_AUTO ) ), 1126cdf0e10cSrcweir sNumMinWordlen ( CUI_RES( STR_NUM_MIN_WORDLEN ) ), 1127cdf0e10cSrcweir sNumPreBreak ( CUI_RES( STR_NUM_PRE_BREAK ) ), 1128cdf0e10cSrcweir sNumPostBreak ( CUI_RES( STR_NUM_POST_BREAK ) ), 1129cdf0e10cSrcweir sHyphAuto ( CUI_RES( STR_HYPH_AUTO ) ), 1130cdf0e10cSrcweir sHyphSpecial ( CUI_RES( STR_HYPH_SPECIAL ) ), 1131cdf0e10cSrcweir 1132cdf0e10cSrcweir pLinguData ( NULL ) 1133cdf0e10cSrcweir { 1134cdf0e10cSrcweir pCheckButtonData = NULL; 1135cdf0e10cSrcweir 1136cdf0e10cSrcweir aLinguModulesCLB.SetStyle( aLinguModulesCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); 1137cdf0e10cSrcweir aLinguModulesCLB.SetHelpId(HID_CLB_LINGU_MODULES ); 1138cdf0e10cSrcweir aLinguModulesCLB.SetHighlightRange(); 1139cdf0e10cSrcweir aLinguModulesCLB.SetSelectHdl( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); 1140cdf0e10cSrcweir aLinguModulesCLB.SetDoubleClickHdl(LINK(this, SvxLinguTabPage, BoxDoubleClickHdl_Impl)); 1141cdf0e10cSrcweir aLinguModulesCLB.SetCheckButtonHdl(LINK(this, SvxLinguTabPage, BoxCheckButtonHdl_Impl)); 1142cdf0e10cSrcweir 1143cdf0e10cSrcweir aLinguModulesEditPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); 1144cdf0e10cSrcweir aLinguOptionsEditPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); 1145cdf0e10cSrcweir 1146cdf0e10cSrcweir aLinguDicsCLB.SetStyle( aLinguDicsCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); 1147cdf0e10cSrcweir aLinguDicsCLB.SetHelpId(HID_CLB_EDIT_MODULES_DICS ); 1148cdf0e10cSrcweir aLinguDicsCLB.SetHighlightRange(); 1149cdf0e10cSrcweir aLinguDicsCLB.SetSelectHdl( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); 1150cdf0e10cSrcweir aLinguDicsCLB.SetCheckButtonHdl(LINK(this, SvxLinguTabPage, BoxCheckButtonHdl_Impl)); 1151cdf0e10cSrcweir 1152cdf0e10cSrcweir aLinguDicsNewPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); 1153cdf0e10cSrcweir aLinguDicsEditPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); 1154cdf0e10cSrcweir aLinguDicsDelPB.SetClickHdl( LINK( this, SvxLinguTabPage, ClickHdl_Impl )); 1155cdf0e10cSrcweir 1156cdf0e10cSrcweir aLinguOptionsCLB.SetStyle( aLinguOptionsCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); 1157cdf0e10cSrcweir aLinguOptionsCLB.SetHelpId(HID_CLB_LINGU_OPTIONS ); 1158cdf0e10cSrcweir aLinguOptionsCLB.SetHighlightRange(); 1159cdf0e10cSrcweir aLinguOptionsCLB.SetSelectHdl( LINK( this, SvxLinguTabPage, SelectHdl_Impl )); 1160cdf0e10cSrcweir aLinguOptionsCLB.SetDoubleClickHdl(LINK(this, SvxLinguTabPage, BoxDoubleClickHdl_Impl)); 1161cdf0e10cSrcweir 1162cdf0e10cSrcweir if ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode() 1163cdf0e10cSrcweir != SvtExtendedSecurityOptions::OPEN_NEVER ) 1164cdf0e10cSrcweir { 1165cdf0e10cSrcweir aMoreDictsLink.SetURL( String( 1166cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "http://extensions.services.openoffice.org/dictionary?cid=926386" ) ) ); 1167cdf0e10cSrcweir aMoreDictsLink.SetClickHdl( LINK( this, SvxLinguTabPage, OpenURLHdl_Impl ) ); 1168cdf0e10cSrcweir } 1169cdf0e10cSrcweir else 1170cdf0e10cSrcweir aMoreDictsLink.Hide(); 1171cdf0e10cSrcweir 1172cdf0e10cSrcweir String sAccessibleNameModuleEdit( CUI_RES( STR_LINGU_MODULES_EDIT ) ); 1173cdf0e10cSrcweir String sAccessibleNameDicsEdit ( CUI_RES( STR_LINGU_DICS_EDIT_DIC ) ); 1174cdf0e10cSrcweir String sAccessibleNameOptionEdit( CUI_RES( STR_LINGU_OPTIONS_EDIT ) ); 1175cdf0e10cSrcweir 1176cdf0e10cSrcweir aLinguModulesEditPB.SetAccessibleName(sAccessibleNameModuleEdit); 1177cdf0e10cSrcweir aLinguDicsEditPB.SetAccessibleName(sAccessibleNameDicsEdit); 1178cdf0e10cSrcweir aLinguOptionsEditPB.SetAccessibleName(sAccessibleNameOptionEdit); 1179cdf0e10cSrcweir 1180cdf0e10cSrcweir // force recalculation of hash value used for checking the need of updating 1181cdf0e10cSrcweir // because new dictionaries might be installed / downloaded. 1182cdf0e10cSrcweir //! Thus it needs to be called now since it may infuence the supported languages 1183cdf0e10cSrcweir //! to be reported AND the found user-dictionaries(!) as well. 1184cdf0e10cSrcweir SvxLinguConfigUpdate::UpdateAll( sal_True ); 1185cdf0e10cSrcweir 1186cdf0e10cSrcweir xProp = uno::Reference< XPropertySet >( SvxGetLinguPropertySet(), UNO_QUERY ); 1187cdf0e10cSrcweir xDicList = uno::Reference< XDictionaryList >( SvxGetDictionaryList(), UNO_QUERY ); 1188cdf0e10cSrcweir if (xDicList.is()) 1189cdf0e10cSrcweir { 1190cdf0e10cSrcweir // keep references to all **currently** available dictionaries, 1191cdf0e10cSrcweir // since the diclist may get changed meanwhile (e.g. through the API). 1192cdf0e10cSrcweir // We want the dialog to operate on the same set of dictionaries it 1193cdf0e10cSrcweir // was started with. 1194cdf0e10cSrcweir // Also we have to take care to not loose the last reference when 1195cdf0e10cSrcweir // someone else removes a dictionary from the list. 1196cdf0e10cSrcweir // removed dics will be replaced by NULL new entries be added to the end 1197cdf0e10cSrcweir // Thus we may use indizes as consistent references. 1198cdf0e10cSrcweir aDics = xDicList->getDictionaries(); 1199cdf0e10cSrcweir 1200cdf0e10cSrcweir UpdateDicBox_Impl(); 1201cdf0e10cSrcweir } 1202cdf0e10cSrcweir else 1203cdf0e10cSrcweir { 1204cdf0e10cSrcweir aLinguDicsFT.Disable(); 1205cdf0e10cSrcweir aLinguDicsCLB.Disable(); 1206cdf0e10cSrcweir aLinguDicsNewPB.Disable(); 1207cdf0e10cSrcweir aLinguDicsEditPB.Disable(); 1208cdf0e10cSrcweir aLinguDicsDelPB.Disable(); 1209cdf0e10cSrcweir } 1210cdf0e10cSrcweir 1211cdf0e10cSrcweir const SfxSpellCheckItem* pItem = 0; 1212cdf0e10cSrcweir SfxItemState eItemState = SFX_ITEM_UNKNOWN; 1213cdf0e10cSrcweir 1214cdf0e10cSrcweir eItemState = rSet.GetItemState( GetWhich( SID_ATTR_SPELL ), 1215cdf0e10cSrcweir sal_False, (const SfxPoolItem**)&pItem ); 1216cdf0e10cSrcweir 1217cdf0e10cSrcweir // handelt es sich um ein Default-Item? 1218cdf0e10cSrcweir if ( eItemState == SFX_ITEM_DEFAULT ) 1219cdf0e10cSrcweir pItem = (const SfxSpellCheckItem*)&(rSet.Get( GetWhich( SID_ATTR_SPELL ) ) ); 1220cdf0e10cSrcweir else if ( eItemState == SFX_ITEM_DONTCARE ) 1221cdf0e10cSrcweir pItem = NULL; 1222cdf0e10cSrcweir 1223cdf0e10cSrcweir FreeResource(); 1224cdf0e10cSrcweir } 1225cdf0e10cSrcweir 1226cdf0e10cSrcweir // ----------------------------------------------------------------------- 1227cdf0e10cSrcweir 1228cdf0e10cSrcweir SvxLinguTabPage::~SvxLinguTabPage() 1229cdf0e10cSrcweir { 1230cdf0e10cSrcweir if (pLinguData) 1231cdf0e10cSrcweir delete pLinguData; 1232cdf0e10cSrcweir } 1233cdf0e10cSrcweir 1234cdf0e10cSrcweir //------------------------------------------------------------------------ 1235cdf0e10cSrcweir 1236cdf0e10cSrcweir //nicht �berladen wegschmeissen 1237cdf0e10cSrcweir sal_uInt16* SvxLinguTabPage::GetRanges() 1238cdf0e10cSrcweir { 1239cdf0e10cSrcweir //TL??? 1240cdf0e10cSrcweir return pRanges; 1241cdf0e10cSrcweir } 1242cdf0e10cSrcweir 1243cdf0e10cSrcweir //------------------------------------------------------------------------ 1244cdf0e10cSrcweir 1245cdf0e10cSrcweir SfxTabPage* SvxLinguTabPage::Create( Window* pParent, 1246cdf0e10cSrcweir const SfxItemSet& rAttrSet ) 1247cdf0e10cSrcweir { 1248cdf0e10cSrcweir return ( new SvxLinguTabPage( pParent, rAttrSet ) ); 1249cdf0e10cSrcweir } 1250cdf0e10cSrcweir 1251cdf0e10cSrcweir //------------------------------------------------------------------------ 1252cdf0e10cSrcweir 1253cdf0e10cSrcweir Any lcl_Bool2Any(sal_Bool bVal) 1254cdf0e10cSrcweir { 1255cdf0e10cSrcweir Any aRet(&bVal, ::getBooleanCppuType()); 1256cdf0e10cSrcweir return aRet; 1257cdf0e10cSrcweir } 1258cdf0e10cSrcweir 1259cdf0e10cSrcweir 1260cdf0e10cSrcweir sal_Bool lcl_Bool2Any(Any& rVal) 1261cdf0e10cSrcweir { 1262cdf0e10cSrcweir return *(sal_Bool*)rVal.getValue(); 1263cdf0e10cSrcweir } 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir 1266cdf0e10cSrcweir sal_Bool SvxLinguTabPage::FillItemSet( SfxItemSet& rCoreSet ) 1267cdf0e10cSrcweir { 1268cdf0e10cSrcweir sal_Bool bModified = sal_True; // !!!! 1269cdf0e10cSrcweir 1270cdf0e10cSrcweir // if not HideGroups was called with GROUP_MODULES... 1271cdf0e10cSrcweir if (aLinguModulesCLB.IsVisible()) 1272cdf0e10cSrcweir { 1273cdf0e10cSrcweir DBG_ASSERT( pLinguData, "pLinguData not yet initialized" ); 1274cdf0e10cSrcweir if (!pLinguData) 1275cdf0e10cSrcweir pLinguData = new SvxLinguData_Impl; 1276cdf0e10cSrcweir 1277cdf0e10cSrcweir LangImplNameTable::const_iterator aIt; 1278cdf0e10cSrcweir 1279cdf0e10cSrcweir // update spellchecker configuration entries 1280cdf0e10cSrcweir const LangImplNameTable *pTable = &pLinguData->GetSpellTable(); 1281cdf0e10cSrcweir for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) 1282cdf0e10cSrcweir { 1283cdf0e10cSrcweir sal_Int16 nLang = aIt->first; 1284cdf0e10cSrcweir const Sequence< OUString > aImplNames( aIt->second ); 1285cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 1286cdf0e10cSrcweir const OUString *pTmpStr; 1287cdf0e10cSrcweir pTmpStr = aImplNames.getConstArray(); 1288cdf0e10cSrcweir #endif 1289cdf0e10cSrcweir uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); 1290cdf0e10cSrcweir Locale aLocale( SvxCreateLocale(nLang) ); 1291cdf0e10cSrcweir if (xMgr.is()) 1292cdf0e10cSrcweir xMgr->setConfiguredServices( C2U(cSpell), aLocale, aImplNames ); 1293cdf0e10cSrcweir } 1294cdf0e10cSrcweir 1295cdf0e10cSrcweir // update grammar checker configuration entries 1296cdf0e10cSrcweir pTable = &pLinguData->GetGrammarTable(); 1297cdf0e10cSrcweir for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) 1298cdf0e10cSrcweir { 1299cdf0e10cSrcweir sal_Int16 nLang = aIt->first; 1300cdf0e10cSrcweir const Sequence< OUString > aImplNames( aIt->second ); 1301cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 1302cdf0e10cSrcweir const OUString *pTmpStr; 1303cdf0e10cSrcweir pTmpStr = aImplNames.getConstArray(); 1304cdf0e10cSrcweir #endif 1305cdf0e10cSrcweir uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); 1306cdf0e10cSrcweir Locale aLocale( SvxCreateLocale(nLang) ); 1307cdf0e10cSrcweir if (xMgr.is()) 1308cdf0e10cSrcweir xMgr->setConfiguredServices( C2U(cGrammar), aLocale, aImplNames ); 1309cdf0e10cSrcweir } 1310cdf0e10cSrcweir 1311cdf0e10cSrcweir // update hyphenator configuration entries 1312cdf0e10cSrcweir pTable = &pLinguData->GetHyphTable(); 1313cdf0e10cSrcweir for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) 1314cdf0e10cSrcweir { 1315cdf0e10cSrcweir sal_Int16 nLang = aIt->first; 1316cdf0e10cSrcweir const Sequence< OUString > aImplNames( aIt->second ); 1317cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 1318cdf0e10cSrcweir const OUString *pTmpStr; 1319cdf0e10cSrcweir pTmpStr = aImplNames.getConstArray(); 1320cdf0e10cSrcweir #endif 1321cdf0e10cSrcweir uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); 1322cdf0e10cSrcweir Locale aLocale( SvxCreateLocale(nLang) ); 1323cdf0e10cSrcweir if (xMgr.is()) 1324cdf0e10cSrcweir xMgr->setConfiguredServices( C2U(cHyph), aLocale, aImplNames ); 1325cdf0e10cSrcweir } 1326cdf0e10cSrcweir 1327cdf0e10cSrcweir // update thesaurus configuration entries 1328cdf0e10cSrcweir pTable = &pLinguData->GetThesTable(); 1329cdf0e10cSrcweir for (aIt = pTable->begin(); aIt != pTable->end(); ++aIt) 1330cdf0e10cSrcweir { 1331cdf0e10cSrcweir sal_Int16 nLang = aIt->first; 1332cdf0e10cSrcweir const Sequence< OUString > aImplNames( aIt->second ); 1333cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 1334cdf0e10cSrcweir const OUString *pTmpStr; 1335cdf0e10cSrcweir pTmpStr = aImplNames.getConstArray(); 1336cdf0e10cSrcweir #endif 1337cdf0e10cSrcweir uno::Reference< XLinguServiceManager > xMgr( pLinguData->GetManager() ); 1338cdf0e10cSrcweir Locale aLocale( SvxCreateLocale(nLang) ); 1339cdf0e10cSrcweir if (xMgr.is()) 1340cdf0e10cSrcweir xMgr->setConfiguredServices( C2U(cThes), aLocale, aImplNames ); 1341cdf0e10cSrcweir } 1342cdf0e10cSrcweir } 1343cdf0e10cSrcweir 1344cdf0e10cSrcweir 1345cdf0e10cSrcweir // 1346cdf0e10cSrcweir // activate dictionaries according to checkbox state 1347cdf0e10cSrcweir // 1348cdf0e10cSrcweir Sequence< OUString > aActiveDics; 1349cdf0e10cSrcweir sal_Int32 nActiveDics = 0; 1350cdf0e10cSrcweir sal_uLong nEntries = aLinguDicsCLB.GetEntryCount(); 1351cdf0e10cSrcweir for (sal_uLong i = 0; i < nEntries; ++i) 1352cdf0e10cSrcweir { 1353cdf0e10cSrcweir sal_Int32 nDics = aDics.getLength(); 1354cdf0e10cSrcweir // const uno::Reference< XDictionary > *pDic = aDics.getConstArray(); 1355cdf0e10cSrcweir 1356cdf0e10cSrcweir aActiveDics.realloc( nDics ); 1357cdf0e10cSrcweir OUString *pActiveDic = aActiveDics.getArray(); 1358cdf0e10cSrcweir 1359cdf0e10cSrcweir SvLBoxEntry *pEntry = aLinguDicsCLB.GetEntry( i ); 1360cdf0e10cSrcweir if (pEntry) 1361cdf0e10cSrcweir { 1362cdf0e10cSrcweir DicUserData aData( (sal_uLong)pEntry->GetUserData() ); 1363cdf0e10cSrcweir if (aData.GetEntryId() < nDics) 1364cdf0e10cSrcweir { 1365cdf0e10cSrcweir sal_Bool bChecked = aLinguDicsCLB.IsChecked( (sal_uInt16) i ); 1366cdf0e10cSrcweir uno::Reference< XDictionary > xDic( aDics.getConstArray()[ i ] ); 1367cdf0e10cSrcweir if (xDic.is()) 1368cdf0e10cSrcweir { 1369cdf0e10cSrcweir if (SvxGetIgnoreAllList() == xDic) 1370cdf0e10cSrcweir bChecked = sal_True; 1371cdf0e10cSrcweir xDic->setActive( bChecked ); 1372cdf0e10cSrcweir 1373cdf0e10cSrcweir if (bChecked) 1374cdf0e10cSrcweir { 1375cdf0e10cSrcweir String aDicName( xDic->getName() ); 1376cdf0e10cSrcweir pActiveDic[ nActiveDics++ ] = aDicName; 1377cdf0e10cSrcweir } 1378cdf0e10cSrcweir } 1379cdf0e10cSrcweir } 1380cdf0e10cSrcweir } 1381cdf0e10cSrcweir } 1382cdf0e10cSrcweir // 1383cdf0e10cSrcweir aActiveDics.realloc( nActiveDics ); 1384cdf0e10cSrcweir Any aTmp; 1385cdf0e10cSrcweir aTmp <<= aActiveDics; 1386cdf0e10cSrcweir SvtLinguConfig aLngCfg; 1387cdf0e10cSrcweir aLngCfg.SetProperty( UPH_ACTIVE_DICTIONARIES, aTmp ); 1388cdf0e10cSrcweir 1389cdf0e10cSrcweir 1390cdf0e10cSrcweir nEntries = aLinguOptionsCLB.GetEntryCount(); 1391cdf0e10cSrcweir for (sal_uInt16 j = 0; j < nEntries; ++j) 1392cdf0e10cSrcweir { 1393cdf0e10cSrcweir SvLBoxEntry *pEntry = aLinguOptionsCLB.GetEntry( j ); 1394cdf0e10cSrcweir 1395cdf0e10cSrcweir OptionsUserData aData( (sal_uLong)pEntry->GetUserData() ); 1396cdf0e10cSrcweir String aPropName( lcl_GetPropertyName( (EID_OPTIONS) aData.GetEntryId() ) ); 1397cdf0e10cSrcweir 1398cdf0e10cSrcweir Any aAny; 1399cdf0e10cSrcweir if (aData.IsCheckable()) 1400cdf0e10cSrcweir { 1401cdf0e10cSrcweir sal_Bool bChecked = aLinguOptionsCLB.IsChecked( j ); 1402cdf0e10cSrcweir aAny <<= bChecked; 1403cdf0e10cSrcweir } 1404cdf0e10cSrcweir else if (aData.HasNumericValue()) 1405cdf0e10cSrcweir { 1406cdf0e10cSrcweir sal_Int16 nVal = aData.GetNumericValue(); 1407cdf0e10cSrcweir aAny <<= nVal; 1408cdf0e10cSrcweir } 1409cdf0e10cSrcweir 1410cdf0e10cSrcweir if (xProp.is()) 1411cdf0e10cSrcweir xProp->setPropertyValue( aPropName, aAny ); 1412cdf0e10cSrcweir aLngCfg.SetProperty( aPropName, aAny ); 1413cdf0e10cSrcweir } 1414cdf0e10cSrcweir 1415cdf0e10cSrcweir SvLBoxEntry *pPreBreakEntry = aLinguOptionsCLB.GetEntry( (sal_uInt16) EID_NUM_PRE_BREAK ); 1416cdf0e10cSrcweir SvLBoxEntry *pPostBreakEntry = aLinguOptionsCLB.GetEntry( (sal_uInt16) EID_NUM_POST_BREAK ); 1417cdf0e10cSrcweir DBG_ASSERT( pPreBreakEntry, "NULL Pointer" ); 1418cdf0e10cSrcweir DBG_ASSERT( pPostBreakEntry, "NULL Pointer" ); 1419cdf0e10cSrcweir if (pPreBreakEntry && pPostBreakEntry) 1420cdf0e10cSrcweir { 1421cdf0e10cSrcweir OptionsUserData aPreBreakData( (sal_uLong)pPreBreakEntry->GetUserData() ); 1422cdf0e10cSrcweir OptionsUserData aPostBreakData( (sal_uLong)pPostBreakEntry->GetUserData() ); 1423cdf0e10cSrcweir if ( aPreBreakData.IsModified() || aPostBreakData.IsModified() ) 1424cdf0e10cSrcweir { 1425cdf0e10cSrcweir SfxHyphenRegionItem aHyp( GetWhich( SID_ATTR_HYPHENREGION ) ); 1426cdf0e10cSrcweir aHyp.GetMinLead() = (sal_uInt8) aPreBreakData.GetNumericValue(); 1427cdf0e10cSrcweir aHyp.GetMinTrail() = (sal_uInt8) aPostBreakData.GetNumericValue(); 1428cdf0e10cSrcweir rCoreSet.Put( aHyp ); 1429cdf0e10cSrcweir } 1430cdf0e10cSrcweir } 1431cdf0e10cSrcweir 1432cdf0e10cSrcweir 1433cdf0e10cSrcweir // automatic spell checking 1434cdf0e10cSrcweir sal_Bool bNewAutoCheck = aLinguOptionsCLB.IsChecked( (sal_uInt16) EID_SPELL_AUTO ); 1435cdf0e10cSrcweir const SfxPoolItem* pOld = GetOldItem( rCoreSet, SID_AUTOSPELL_CHECK ); 1436cdf0e10cSrcweir if ( !pOld || ( (SfxBoolItem*)pOld )->GetValue() != bNewAutoCheck ) 1437cdf0e10cSrcweir { 1438cdf0e10cSrcweir rCoreSet.Put( SfxBoolItem( GetWhich( SID_AUTOSPELL_CHECK ), 1439cdf0e10cSrcweir bNewAutoCheck ) ); 1440cdf0e10cSrcweir bModified |= sal_True; 1441cdf0e10cSrcweir } 1442cdf0e10cSrcweir 1443cdf0e10cSrcweir return bModified; 1444cdf0e10cSrcweir } 1445cdf0e10cSrcweir 1446cdf0e10cSrcweir // ---------------------------------------------------------------------- 1447cdf0e10cSrcweir 1448cdf0e10cSrcweir sal_uLong SvxLinguTabPage::GetDicUserData( const uno::Reference< XDictionary > &rxDic, sal_uInt16 nIdx ) 1449cdf0e10cSrcweir { 1450cdf0e10cSrcweir sal_uLong nRes = 0; 1451cdf0e10cSrcweir DBG_ASSERT( rxDic.is(), "dictionary not supplied" ); 1452cdf0e10cSrcweir if (rxDic.is()) 1453cdf0e10cSrcweir { 1454cdf0e10cSrcweir uno::Reference< frame::XStorable > xStor( rxDic, UNO_QUERY ); 1455cdf0e10cSrcweir 1456cdf0e10cSrcweir // sal_uLong nUserData = 0; 1457cdf0e10cSrcweir sal_Bool bChecked = rxDic->isActive(); 1458cdf0e10cSrcweir sal_Bool bEditable = !xStor.is() || !xStor->isReadonly(); 1459cdf0e10cSrcweir sal_Bool bDeletable = bEditable; 1460cdf0e10cSrcweir // sal_Bool bNegativ = rxDic->getDictionaryType() == DictionaryType_NEGATIVE; 1461cdf0e10cSrcweir 1462cdf0e10cSrcweir nRes = DicUserData( nIdx, 1463cdf0e10cSrcweir bChecked, bEditable, bDeletable ).GetUserData(); 1464cdf0e10cSrcweir } 1465cdf0e10cSrcweir return nRes; 1466cdf0e10cSrcweir } 1467cdf0e10cSrcweir 1468cdf0e10cSrcweir 1469cdf0e10cSrcweir void SvxLinguTabPage::AddDicBoxEntry( 1470cdf0e10cSrcweir const uno::Reference< XDictionary > &rxDic, 1471cdf0e10cSrcweir sal_uInt16 nIdx ) 1472cdf0e10cSrcweir { 1473cdf0e10cSrcweir aLinguDicsCLB.SetUpdateMode(sal_False); 1474cdf0e10cSrcweir 1475cdf0e10cSrcweir String aTxt( ::GetDicInfoStr( rxDic->getName(), 1476cdf0e10cSrcweir SvxLocaleToLanguage( rxDic->getLocale() ), 1477cdf0e10cSrcweir DictionaryType_NEGATIVE == rxDic->getDictionaryType() ) ); 1478cdf0e10cSrcweir aLinguDicsCLB.InsertEntry( aTxt, (sal_uInt16)LISTBOX_APPEND ); // append at end 1479cdf0e10cSrcweir SvLBoxEntry* pEntry = aLinguDicsCLB.GetEntry( aLinguDicsCLB.GetEntryCount() - 1 ); 1480cdf0e10cSrcweir DBG_ASSERT( pEntry, "failed to add entry" ); 1481cdf0e10cSrcweir if (pEntry) 1482cdf0e10cSrcweir { 1483cdf0e10cSrcweir DicUserData aData( GetDicUserData( rxDic, nIdx ) ); 1484cdf0e10cSrcweir pEntry->SetUserData( (void *) aData.GetUserData() ); 1485cdf0e10cSrcweir lcl_SetCheckButton( pEntry, aData.IsChecked() ); 1486cdf0e10cSrcweir } 1487cdf0e10cSrcweir 1488cdf0e10cSrcweir aLinguDicsCLB.SetUpdateMode(sal_True); 1489cdf0e10cSrcweir } 1490cdf0e10cSrcweir 1491cdf0e10cSrcweir // ---------------------------------------------------------------------- 1492cdf0e10cSrcweir 1493cdf0e10cSrcweir void SvxLinguTabPage::UpdateDicBox_Impl() 1494cdf0e10cSrcweir { 1495cdf0e10cSrcweir aLinguDicsCLB.SetUpdateMode(sal_False); 1496cdf0e10cSrcweir aLinguDicsCLB.Clear(); 1497cdf0e10cSrcweir 1498cdf0e10cSrcweir sal_Int32 nDics = aDics.getLength(); 1499cdf0e10cSrcweir const uno::Reference< XDictionary > *pDic = aDics.getConstArray(); 1500cdf0e10cSrcweir for (sal_Int32 i = 0; i < nDics; ++i) 1501cdf0e10cSrcweir { 1502cdf0e10cSrcweir const uno::Reference< XDictionary > &rDic = pDic[i]; 1503cdf0e10cSrcweir if (rDic.is()) 1504cdf0e10cSrcweir AddDicBoxEntry( rDic, (sal_uInt16)i ); 1505cdf0e10cSrcweir } 1506cdf0e10cSrcweir 1507cdf0e10cSrcweir aLinguDicsCLB.SetUpdateMode(sal_True); 1508cdf0e10cSrcweir } 1509cdf0e10cSrcweir 1510cdf0e10cSrcweir // ---------------------------------------------------------------------- 1511cdf0e10cSrcweir 1512cdf0e10cSrcweir void SvxLinguTabPage::UpdateModulesBox_Impl() 1513cdf0e10cSrcweir { 1514cdf0e10cSrcweir if (pLinguData) 1515cdf0e10cSrcweir { 1516cdf0e10cSrcweir const ServiceInfoArr &rAllDispSrvcArr = pLinguData->GetDisplayServiceArray(); 1517cdf0e10cSrcweir const sal_uLong nDispSrvcCount = pLinguData->GetDisplayServiceCount(); 1518cdf0e10cSrcweir 1519cdf0e10cSrcweir aLinguModulesCLB.Clear(); 1520cdf0e10cSrcweir 1521cdf0e10cSrcweir for (sal_uInt16 i = 0; i < nDispSrvcCount; ++i) 1522cdf0e10cSrcweir { 1523cdf0e10cSrcweir const ServiceInfo_Impl &rInfo = rAllDispSrvcArr[i]; 1524cdf0e10cSrcweir aLinguModulesCLB.InsertEntry( rInfo.sDisplayName, (sal_uInt16)LISTBOX_APPEND ); 1525cdf0e10cSrcweir SvLBoxEntry* pEntry = aLinguModulesCLB.GetEntry(i); 1526cdf0e10cSrcweir pEntry->SetUserData( (void *) &rInfo ); 1527cdf0e10cSrcweir aLinguModulesCLB.CheckEntryPos( i, rInfo.bConfigured ); 1528cdf0e10cSrcweir } 1529cdf0e10cSrcweir aLinguModulesEditPB.Enable( nDispSrvcCount > 0 ); 1530cdf0e10cSrcweir } 1531cdf0e10cSrcweir } 1532cdf0e10cSrcweir 1533cdf0e10cSrcweir //------------------------------------------------------------------------ 1534cdf0e10cSrcweir 1535cdf0e10cSrcweir void SvxLinguTabPage::Reset( const SfxItemSet& rSet ) 1536cdf0e10cSrcweir { 1537cdf0e10cSrcweir // if not HideGroups was called with GROUP_MODULES... 1538cdf0e10cSrcweir if (aLinguModulesCLB.IsVisible()) 1539cdf0e10cSrcweir { 1540cdf0e10cSrcweir if (!pLinguData) 1541cdf0e10cSrcweir pLinguData = new SvxLinguData_Impl; 1542cdf0e10cSrcweir UpdateModulesBox_Impl(); 1543cdf0e10cSrcweir } 1544cdf0e10cSrcweir 1545cdf0e10cSrcweir 1546cdf0e10cSrcweir // 1547cdf0e10cSrcweir // get data from configuration 1548cdf0e10cSrcweir // 1549cdf0e10cSrcweir 1550cdf0e10cSrcweir SvtLinguConfig aLngCfg; 1551cdf0e10cSrcweir 1552cdf0e10cSrcweir aLinguOptionsCLB.SetUpdateMode(sal_False); 1553cdf0e10cSrcweir aLinguOptionsCLB.Clear(); 1554cdf0e10cSrcweir 1555cdf0e10cSrcweir SvLBoxTreeList *pModel = aLinguOptionsCLB.GetModel(); 1556cdf0e10cSrcweir SvLBoxEntry* pEntry = NULL; 1557cdf0e10cSrcweir 1558cdf0e10cSrcweir sal_Int16 nVal = 0; 1559cdf0e10cSrcweir sal_Bool bVal = sal_False; 1560cdf0e10cSrcweir sal_uLong nUserData = 0; 1561cdf0e10cSrcweir 1562cdf0e10cSrcweir pEntry = CreateEntry( sSpellAuto, CBCOL_FIRST ); 1563cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_SPELL_AUTO) ) >>= bVal; 1564cdf0e10cSrcweir const SfxPoolItem* pItem = GetItem( rSet, SID_AUTOSPELL_CHECK ); 1565cdf0e10cSrcweir if (pItem) 1566cdf0e10cSrcweir bVal = ((SfxBoolItem *) pItem)->GetValue(); 1567cdf0e10cSrcweir nUserData = OptionsUserData( EID_SPELL_AUTO, sal_False, 0, sal_True, bVal).GetUserData(); 1568cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1569cdf0e10cSrcweir pModel->Insert( pEntry ); 1570cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1571cdf0e10cSrcweir 1572cdf0e10cSrcweir pEntry = CreateEntry( sGrammarAuto, CBCOL_FIRST ); 1573cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_GRAMMAR_AUTO) ) >>= bVal; 1574cdf0e10cSrcweir // const SfxPoolItem* pItem = GetItem( rSet, SID_AUTOSPELL_CHECK ); 1575cdf0e10cSrcweir // if (pItem) 1576cdf0e10cSrcweir // bVal = ((SfxBoolItem *) pItem)->GetValue(); 1577cdf0e10cSrcweir nUserData = OptionsUserData( EID_GRAMMAR_AUTO, sal_False, 0, sal_True, bVal).GetUserData(); 1578cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1579cdf0e10cSrcweir pModel->Insert( pEntry ); 1580cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1581cdf0e10cSrcweir 1582cdf0e10cSrcweir pEntry = CreateEntry( sCapitalWords, CBCOL_FIRST ); 1583cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_SPELL_UPPER_CASE) ) >>= bVal; 1584cdf0e10cSrcweir nUserData = OptionsUserData( EID_CAPITAL_WORDS, sal_False, 0, sal_True, bVal).GetUserData(); 1585cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1586cdf0e10cSrcweir pModel->Insert( pEntry ); 1587cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1588cdf0e10cSrcweir 1589cdf0e10cSrcweir pEntry = CreateEntry( sWordsWithDigits, CBCOL_FIRST ); 1590cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_SPELL_WITH_DIGITS) ) >>= bVal; 1591cdf0e10cSrcweir nUserData = OptionsUserData( EID_WORDS_WITH_DIGITS, sal_False, 0, sal_True, bVal).GetUserData(); 1592cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1593cdf0e10cSrcweir pModel->Insert( pEntry ); 1594cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1595cdf0e10cSrcweir 1596cdf0e10cSrcweir pEntry = CreateEntry( sCapitalization, CBCOL_FIRST ); 1597cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_SPELL_CAPITALIZATION) ) >>= bVal; 1598cdf0e10cSrcweir nUserData = OptionsUserData( EID_CAPITALIZATION, sal_False, 0, sal_True, bVal).GetUserData(); 1599cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1600cdf0e10cSrcweir pModel->Insert( pEntry ); 1601cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1602cdf0e10cSrcweir 1603cdf0e10cSrcweir pEntry = CreateEntry( sSpellSpecial, CBCOL_FIRST ); 1604cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_SPELL_SPECIAL) ) >>= bVal; 1605cdf0e10cSrcweir nUserData = OptionsUserData( EID_SPELL_SPECIAL, sal_False, 0, sal_True, bVal).GetUserData(); 1606cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1607cdf0e10cSrcweir pModel->Insert( pEntry ); 1608cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1609cdf0e10cSrcweir 1610cdf0e10cSrcweir pEntry = CreateEntry( sNumMinWordlen, CBCOL_SECOND ); 1611cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_HYPH_MIN_WORD_LENGTH) ) >>= nVal; 1612cdf0e10cSrcweir nUserData = OptionsUserData( EID_NUM_MIN_WORDLEN, sal_True, (sal_uInt16)nVal, sal_False, sal_False).GetUserData(); 1613cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1614cdf0e10cSrcweir pModel->Insert( pEntry ); 1615cdf0e10cSrcweir 1616cdf0e10cSrcweir const SfxHyphenRegionItem *pHyp = NULL; 1617cdf0e10cSrcweir sal_uInt16 nWhich = GetWhich( SID_ATTR_HYPHENREGION ); 1618cdf0e10cSrcweir if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET ) 1619cdf0e10cSrcweir pHyp = &( (const SfxHyphenRegionItem &) rSet.Get( nWhich ) ); 1620cdf0e10cSrcweir 1621cdf0e10cSrcweir pEntry = CreateEntry( sNumPreBreak, CBCOL_SECOND ); 1622cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_HYPH_MIN_LEADING) ) >>= nVal; 1623cdf0e10cSrcweir if (pHyp) 1624cdf0e10cSrcweir nVal = (sal_Int16) pHyp->GetMinLead(); 1625cdf0e10cSrcweir nUserData = OptionsUserData( EID_NUM_PRE_BREAK, sal_True, (sal_uInt16)nVal, sal_False, sal_False).GetUserData(); 1626cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1627cdf0e10cSrcweir pModel->Insert( pEntry ); 1628cdf0e10cSrcweir 1629cdf0e10cSrcweir pEntry = CreateEntry( sNumPostBreak, CBCOL_SECOND ); 1630cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_HYPH_MIN_TRAILING) ) >>= nVal; 1631cdf0e10cSrcweir if (pHyp) 1632cdf0e10cSrcweir nVal = (sal_Int16) pHyp->GetMinTrail(); 1633cdf0e10cSrcweir nUserData = OptionsUserData( EID_NUM_POST_BREAK, sal_True, (sal_uInt16)nVal, sal_False, sal_False).GetUserData(); 1634cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1635cdf0e10cSrcweir pModel->Insert( pEntry ); 1636cdf0e10cSrcweir 1637cdf0e10cSrcweir pEntry = CreateEntry( sHyphAuto, CBCOL_FIRST ); 1638cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_HYPH_AUTO) ) >>= bVal; 1639cdf0e10cSrcweir nUserData = OptionsUserData( EID_HYPH_AUTO, sal_False, 0, sal_True, bVal).GetUserData(); 1640cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1641cdf0e10cSrcweir pModel->Insert( pEntry ); 1642cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1643cdf0e10cSrcweir 1644cdf0e10cSrcweir pEntry = CreateEntry( sHyphSpecial, CBCOL_FIRST ); 1645cdf0e10cSrcweir aLngCfg.GetProperty( C2U(UPN_IS_HYPH_SPECIAL) ) >>= bVal; 1646cdf0e10cSrcweir nUserData = OptionsUserData( EID_HYPH_SPECIAL, sal_False, 0, sal_True, bVal).GetUserData(); 1647cdf0e10cSrcweir pEntry->SetUserData( (void *)nUserData ); 1648cdf0e10cSrcweir pModel->Insert( pEntry ); 1649cdf0e10cSrcweir lcl_SetCheckButton( pEntry, bVal ); 1650cdf0e10cSrcweir 1651cdf0e10cSrcweir aLinguOptionsCLB.SetUpdateMode(sal_True); 1652cdf0e10cSrcweir } 1653cdf0e10cSrcweir 1654cdf0e10cSrcweir // ----------------------------------------------------------------------- 1655cdf0e10cSrcweir 1656cdf0e10cSrcweir IMPL_LINK( SvxLinguTabPage, BoxDoubleClickHdl_Impl, SvTreeListBox *, pBox ) 1657cdf0e10cSrcweir { 1658cdf0e10cSrcweir if (pBox == &aLinguModulesCLB) 1659cdf0e10cSrcweir { 1660cdf0e10cSrcweir //! in order to avoid a bug causing a GPF when double clicking 1661cdf0e10cSrcweir //! on a module entry and exiting the "Edit Modules" dialog 1662cdf0e10cSrcweir //! after that. 1663cdf0e10cSrcweir Application::PostUserEvent( LINK( 1664cdf0e10cSrcweir this, SvxLinguTabPage, PostDblClickHdl_Impl ) ); 1665cdf0e10cSrcweir } 1666cdf0e10cSrcweir else if (pBox == &aLinguOptionsCLB) 1667cdf0e10cSrcweir { 1668cdf0e10cSrcweir ClickHdl_Impl(&aLinguOptionsEditPB); 1669cdf0e10cSrcweir } 1670cdf0e10cSrcweir return 0; 1671cdf0e10cSrcweir } 1672cdf0e10cSrcweir 1673cdf0e10cSrcweir // ----------------------------------------------------------------------- 1674cdf0e10cSrcweir 1675cdf0e10cSrcweir IMPL_LINK( SvxLinguTabPage, PostDblClickHdl_Impl, SvTreeListBox *, EMPTYARG ) 1676cdf0e10cSrcweir { 1677cdf0e10cSrcweir ClickHdl_Impl(&aLinguModulesEditPB); 1678cdf0e10cSrcweir return 0; 1679cdf0e10cSrcweir } 1680cdf0e10cSrcweir 1681cdf0e10cSrcweir // ----------------------------------------------------------------------- 1682cdf0e10cSrcweir 1683cdf0e10cSrcweir IMPL_LINK( SvxLinguTabPage, OpenURLHdl_Impl, svt::FixedHyperlink *, EMPTYARG ) 1684cdf0e10cSrcweir { 1685cdf0e10cSrcweir ::rtl::OUString sURL( aMoreDictsLink.GetURL() ); 1686cdf0e10cSrcweir lcl_OpenURL( sURL ); 1687cdf0e10cSrcweir return 0; 1688cdf0e10cSrcweir } 1689cdf0e10cSrcweir 1690cdf0e10cSrcweir // ----------------------------------------------------------------------- 1691cdf0e10cSrcweir 1692cdf0e10cSrcweir IMPL_LINK( SvxLinguTabPage, BoxCheckButtonHdl_Impl, SvTreeListBox *, pBox ) 1693cdf0e10cSrcweir { 1694cdf0e10cSrcweir if (pBox == &aLinguModulesCLB) 1695cdf0e10cSrcweir { 1696cdf0e10cSrcweir DBG_ASSERT( pLinguData, "NULL pointer, LinguData missing" ); 1697cdf0e10cSrcweir sal_uInt16 nPos = aLinguModulesCLB.GetSelectEntryPos(); 1698cdf0e10cSrcweir if (nPos != LISTBOX_ENTRY_NOTFOUND && pLinguData) 1699cdf0e10cSrcweir { 1700cdf0e10cSrcweir pLinguData->Reconfigure( aLinguModulesCLB.GetText( nPos ), 1701cdf0e10cSrcweir aLinguModulesCLB.IsChecked( nPos ) ); 1702cdf0e10cSrcweir } 1703cdf0e10cSrcweir } 1704cdf0e10cSrcweir else if (pBox == &aLinguDicsCLB) 1705cdf0e10cSrcweir { 1706cdf0e10cSrcweir sal_uInt16 nPos = aLinguDicsCLB.GetSelectEntryPos(); 1707cdf0e10cSrcweir if (nPos != LISTBOX_ENTRY_NOTFOUND) 1708cdf0e10cSrcweir { 1709cdf0e10cSrcweir const uno::Reference< XDictionary > &rDic = aDics.getConstArray()[ nPos ]; 1710cdf0e10cSrcweir if (SvxGetIgnoreAllList() == rDic) 1711cdf0e10cSrcweir { 1712cdf0e10cSrcweir SvLBoxEntry* pEntry = aLinguDicsCLB.GetEntry( nPos ); 1713cdf0e10cSrcweir if (pEntry) 1714cdf0e10cSrcweir lcl_SetCheckButton( pEntry, sal_True ); 1715cdf0e10cSrcweir } 1716cdf0e10cSrcweir } 1717cdf0e10cSrcweir } 1718cdf0e10cSrcweir return 0; 1719cdf0e10cSrcweir } 1720cdf0e10cSrcweir 1721cdf0e10cSrcweir // ----------------------------------------------------------------------- 1722cdf0e10cSrcweir 1723cdf0e10cSrcweir IMPL_LINK( SvxLinguTabPage, ClickHdl_Impl, PushButton *, pBtn ) 1724cdf0e10cSrcweir { 1725cdf0e10cSrcweir if (&aLinguModulesEditPB == pBtn) 1726cdf0e10cSrcweir { 1727cdf0e10cSrcweir if (!pLinguData) 1728cdf0e10cSrcweir pLinguData = new SvxLinguData_Impl; 1729cdf0e10cSrcweir 1730cdf0e10cSrcweir SvxLinguData_Impl aOldLinguData( *pLinguData ); 1731cdf0e10cSrcweir SvxEditModulesDlg aDlg( this, *pLinguData ); 1732cdf0e10cSrcweir if (aDlg.Execute() != RET_OK) 1733cdf0e10cSrcweir *pLinguData = aOldLinguData; 1734cdf0e10cSrcweir 1735cdf0e10cSrcweir // evaluate new status of 'bConfigured' flag 1736cdf0e10cSrcweir sal_uLong nLen = pLinguData->GetDisplayServiceCount(); 1737cdf0e10cSrcweir for (sal_uLong i = 0; i < nLen; ++i) 1738cdf0e10cSrcweir pLinguData->GetDisplayServiceArray()[i].bConfigured = sal_False; 1739cdf0e10cSrcweir const Locale* pAllLocales = pLinguData->GetAllSupportedLocales().getConstArray(); 1740cdf0e10cSrcweir sal_Int32 nLocales = pLinguData->GetAllSupportedLocales().getLength(); 1741cdf0e10cSrcweir for (sal_Int32 k = 0; k < nLocales; ++k) 1742cdf0e10cSrcweir { 1743cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( pAllLocales[k] ); 1744cdf0e10cSrcweir if (pLinguData->GetSpellTable().count( nLang )) 1745cdf0e10cSrcweir pLinguData->SetChecked( pLinguData->GetSpellTable()[ nLang ] ); 1746cdf0e10cSrcweir if (pLinguData->GetGrammarTable().count( nLang )) 1747cdf0e10cSrcweir pLinguData->SetChecked( pLinguData->GetGrammarTable()[ nLang ] ); 1748cdf0e10cSrcweir if (pLinguData->GetHyphTable().count( nLang )) 1749cdf0e10cSrcweir pLinguData->SetChecked( pLinguData->GetHyphTable()[ nLang ] ); 1750cdf0e10cSrcweir if (pLinguData->GetThesTable().count( nLang )) 1751cdf0e10cSrcweir pLinguData->SetChecked( pLinguData->GetThesTable()[ nLang ] ); 1752cdf0e10cSrcweir } 1753cdf0e10cSrcweir 1754cdf0e10cSrcweir // show new status of modules 1755cdf0e10cSrcweir UpdateModulesBox_Impl(); 1756cdf0e10cSrcweir } 1757cdf0e10cSrcweir else if (&aLinguDicsNewPB == pBtn) 1758cdf0e10cSrcweir { 1759cdf0e10cSrcweir uno::Reference< XSpellChecker1 > xSpellChecker1; 1760cdf0e10cSrcweir SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 1761cdf0e10cSrcweir if(pFact) 1762cdf0e10cSrcweir { 1763cdf0e10cSrcweir AbstractSvxNewDictionaryDialog* aDlg = pFact->CreateSvxNewDictionaryDialog( this, xSpellChecker1, RID_SFXDLG_NEWDICT ); 1764cdf0e10cSrcweir DBG_ASSERT(aDlg, "Dialogdiet fail!"); 1765cdf0e10cSrcweir uno::Reference< XDictionary > xNewDic; 1766cdf0e10cSrcweir if ( aDlg->Execute() == RET_OK ) 1767cdf0e10cSrcweir xNewDic = uno::Reference< XDictionary >( aDlg->GetNewDictionary(), UNO_QUERY ); 1768cdf0e10cSrcweir if ( xNewDic.is() ) 1769cdf0e10cSrcweir { 1770cdf0e10cSrcweir // add new dics to the end 1771cdf0e10cSrcweir sal_Int32 nLen = aDics.getLength(); 1772cdf0e10cSrcweir aDics.realloc( nLen + 1 ); 1773cdf0e10cSrcweir 1774cdf0e10cSrcweir aDics.getArray()[ nLen ] = xNewDic; 1775cdf0e10cSrcweir 1776cdf0e10cSrcweir AddDicBoxEntry( xNewDic, (sal_uInt16) nLen ); 1777cdf0e10cSrcweir } 1778cdf0e10cSrcweir delete aDlg; //add by CHINA001 1779cdf0e10cSrcweir } 1780cdf0e10cSrcweir } 1781cdf0e10cSrcweir else if (&aLinguDicsEditPB == pBtn) 1782cdf0e10cSrcweir { 1783cdf0e10cSrcweir SvLBoxEntry *pEntry = aLinguDicsCLB.GetCurEntry(); 1784cdf0e10cSrcweir if (pEntry) 1785cdf0e10cSrcweir { 1786cdf0e10cSrcweir DicUserData aData( (sal_uLong) pEntry->GetUserData() ); 1787cdf0e10cSrcweir sal_uInt16 nDicPos = aData.GetEntryId(); 1788cdf0e10cSrcweir sal_Int32 nDics = aDics.getLength(); 1789cdf0e10cSrcweir if (nDicPos < nDics) 1790cdf0e10cSrcweir { 1791cdf0e10cSrcweir uno::Reference< XDictionary > xDic; 1792cdf0e10cSrcweir xDic = aDics.getConstArray()[ nDicPos ]; 1793cdf0e10cSrcweir if (xDic.is()) 1794cdf0e10cSrcweir { 1795cdf0e10cSrcweir uno::Reference< XSpellChecker1 > xSpellChecker1; 1796cdf0e10cSrcweir SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 1797cdf0e10cSrcweir if(pFact) 1798cdf0e10cSrcweir { 1799cdf0e10cSrcweir VclAbstractDialog* aDlg = pFact->CreateSvxEditDictionaryDialog( this, xDic->getName(), xSpellChecker1, RID_SFXDLG_EDITDICT ); 1800cdf0e10cSrcweir DBG_ASSERT(aDlg, "Dialogdiet fail!"); 1801cdf0e10cSrcweir aDlg->Execute(); 1802cdf0e10cSrcweir delete aDlg; 1803cdf0e10cSrcweir } 1804cdf0e10cSrcweir } 1805cdf0e10cSrcweir } 1806cdf0e10cSrcweir } 1807cdf0e10cSrcweir } 1808cdf0e10cSrcweir else if (&aLinguDicsDelPB == pBtn) 1809cdf0e10cSrcweir { 1810cdf0e10cSrcweir if ( RET_NO == 1811cdf0e10cSrcweir QueryBox( this, CUI_RES( RID_SFXQB_DELDICT ) ).Execute() ) 1812cdf0e10cSrcweir return 0; 1813cdf0e10cSrcweir 1814cdf0e10cSrcweir SvLBoxEntry *pEntry = aLinguDicsCLB.GetCurEntry(); 1815cdf0e10cSrcweir if (pEntry) 1816cdf0e10cSrcweir { 1817cdf0e10cSrcweir DicUserData aData( (sal_uLong) pEntry->GetUserData() ); 1818cdf0e10cSrcweir sal_uInt16 nDicPos = aData.GetEntryId(); 1819cdf0e10cSrcweir sal_Int32 nDics = aDics.getLength(); 1820cdf0e10cSrcweir if (nDicPos < nDics) 1821cdf0e10cSrcweir { 1822cdf0e10cSrcweir uno::Reference< XDictionary > xDic; 1823cdf0e10cSrcweir xDic = aDics.getConstArray()[ nDicPos ]; 1824cdf0e10cSrcweir if (xDic.is()) 1825cdf0e10cSrcweir { 1826cdf0e10cSrcweir if (SvxGetIgnoreAllList() == xDic) 1827cdf0e10cSrcweir xDic->clear(); 1828cdf0e10cSrcweir else 1829cdf0e10cSrcweir { 1830cdf0e10cSrcweir if (xDicList.is()) 1831cdf0e10cSrcweir xDicList->removeDictionary( xDic ); 1832cdf0e10cSrcweir 1833cdf0e10cSrcweir uno::Reference< frame::XStorable > xStor( xDic, UNO_QUERY ); 1834cdf0e10cSrcweir if ( xStor->hasLocation() && !xStor->isReadonly() ) 1835cdf0e10cSrcweir { 1836cdf0e10cSrcweir String sURL = xStor->getLocation(); 1837cdf0e10cSrcweir INetURLObject aObj(sURL); 1838cdf0e10cSrcweir DBG_ASSERT( aObj.GetProtocol() == INET_PROT_FILE, 1839cdf0e10cSrcweir "non-file URLs cannot be deleted" ); 1840cdf0e10cSrcweir if ( aObj.GetProtocol() == INET_PROT_FILE ) 1841cdf0e10cSrcweir { 1842cdf0e10cSrcweir KillFile_Impl( aObj.GetMainURL( INetURLObject::NO_DECODE ) ); 1843cdf0e10cSrcweir } 1844cdf0e10cSrcweir } 1845cdf0e10cSrcweir 1846cdf0e10cSrcweir aDics.getArray()[ nDicPos ] = 0; 1847cdf0e10cSrcweir 1848cdf0e10cSrcweir // remove entry from checklistbox 1849cdf0e10cSrcweir sal_uLong nCnt = aLinguDicsCLB.GetEntryCount(); 1850cdf0e10cSrcweir for (sal_uLong i = 0; i < nCnt; ++i) 1851cdf0e10cSrcweir { 1852cdf0e10cSrcweir SvLBoxEntry *pDicEntry = aLinguDicsCLB.GetEntry( i ); 1853cdf0e10cSrcweir DBG_ASSERT( pDicEntry, "missing entry" ); 1854cdf0e10cSrcweir if (pDicEntry) 1855cdf0e10cSrcweir { 1856cdf0e10cSrcweir DicUserData aDicData( (sal_uLong) pDicEntry->GetUserData() ); 1857cdf0e10cSrcweir if (aDicData.GetEntryId() == nDicPos ) 1858cdf0e10cSrcweir { 1859cdf0e10cSrcweir aLinguDicsCLB.RemoveEntry( (sal_uInt16) i ); 1860cdf0e10cSrcweir break; 1861cdf0e10cSrcweir } 1862cdf0e10cSrcweir } 1863cdf0e10cSrcweir } 1864cdf0e10cSrcweir DBG_ASSERT( nCnt > aLinguDicsCLB.GetEntryCount(), 1865cdf0e10cSrcweir "remove failed ?"); 1866cdf0e10cSrcweir } 1867cdf0e10cSrcweir } 1868cdf0e10cSrcweir } 1869cdf0e10cSrcweir } 1870cdf0e10cSrcweir } 1871cdf0e10cSrcweir else if (&aLinguOptionsEditPB == pBtn) 1872cdf0e10cSrcweir { 1873cdf0e10cSrcweir SvLBoxEntry *pEntry = aLinguOptionsCLB.GetCurEntry(); 1874cdf0e10cSrcweir DBG_ASSERT( pEntry, "no entry selected" ); 1875cdf0e10cSrcweir if (pEntry) 1876cdf0e10cSrcweir { 1877cdf0e10cSrcweir long nVal = -1; 1878cdf0e10cSrcweir OptionsUserData aData( (sal_uLong)pEntry->GetUserData() ); 1879cdf0e10cSrcweir if(aData.HasNumericValue()) 1880cdf0e10cSrcweir { 1881cdf0e10cSrcweir int nRID = -1; 1882cdf0e10cSrcweir switch (aData.GetEntryId()) 1883cdf0e10cSrcweir { 1884cdf0e10cSrcweir case EID_NUM_PRE_BREAK : nRID = STR_NUM_PRE_BREAK_DLG; break; 1885cdf0e10cSrcweir case EID_NUM_POST_BREAK : nRID = STR_NUM_POST_BREAK_DLG; break; 1886cdf0e10cSrcweir case EID_NUM_MIN_WORDLEN: nRID = STR_NUM_MIN_WORDLEN_DLG; break; 1887cdf0e10cSrcweir default: 1888cdf0e10cSrcweir DBG_ERROR( "unexpected case" ); 1889cdf0e10cSrcweir } 1890cdf0e10cSrcweir 1891cdf0e10cSrcweir OptionsBreakSet aDlg( this, nRID ); 1892cdf0e10cSrcweir aDlg.GetNumericFld().SetValue( aData.GetNumericValue() ); 1893cdf0e10cSrcweir if (RET_OK == aDlg.Execute() ) 1894cdf0e10cSrcweir { 1895cdf0e10cSrcweir nVal = static_cast<long>(aDlg.GetNumericFld().GetValue()); 1896cdf0e10cSrcweir if (-1 != nVal && aData.GetNumericValue() != nVal) 1897cdf0e10cSrcweir { 1898cdf0e10cSrcweir aData.SetNumericValue( (sal_uInt8)nVal ); //! sets IsModified ! 1899cdf0e10cSrcweir pEntry->SetUserData( (void *) aData.GetUserData() ); 1900cdf0e10cSrcweir aLinguOptionsCLB.Invalidate(); 1901cdf0e10cSrcweir } 1902cdf0e10cSrcweir } 1903cdf0e10cSrcweir } 1904cdf0e10cSrcweir } 1905cdf0e10cSrcweir } 1906cdf0e10cSrcweir else 1907cdf0e10cSrcweir { 1908cdf0e10cSrcweir DBG_ERROR( "pBtn unexpected value" ); 1909cdf0e10cSrcweir } 1910cdf0e10cSrcweir 1911cdf0e10cSrcweir return 0; 1912cdf0e10cSrcweir } 1913cdf0e10cSrcweir 1914cdf0e10cSrcweir // ----------------------------------------------------------------------- 1915cdf0e10cSrcweir 1916cdf0e10cSrcweir IMPL_LINK( SvxLinguTabPage, SelectHdl_Impl, SvxCheckListBox *, pBox ) 1917cdf0e10cSrcweir { 1918cdf0e10cSrcweir if (&aLinguModulesCLB == pBox) 1919cdf0e10cSrcweir { 1920cdf0e10cSrcweir } 1921cdf0e10cSrcweir else if (&aLinguDicsCLB == pBox) 1922cdf0e10cSrcweir { 1923cdf0e10cSrcweir SvLBoxEntry *pEntry = pBox->GetCurEntry(); 1924cdf0e10cSrcweir if (pEntry) 1925cdf0e10cSrcweir { 1926cdf0e10cSrcweir DicUserData aData( (sal_uLong) pEntry->GetUserData() ); 1927cdf0e10cSrcweir 1928cdf0e10cSrcweir // always allow to edit (i.e. at least view the content of the dictionary) 1929cdf0e10cSrcweir aLinguDicsEditPB.Enable( true/*aData.IsEditable()*/ ); 1930cdf0e10cSrcweir aLinguDicsDelPB .Enable( aData.IsDeletable() ); 1931cdf0e10cSrcweir } 1932cdf0e10cSrcweir } 1933cdf0e10cSrcweir else if (&aLinguOptionsCLB == pBox) 1934cdf0e10cSrcweir { 1935cdf0e10cSrcweir SvLBoxEntry *pEntry = pBox->GetCurEntry(); 1936cdf0e10cSrcweir if (pEntry) 1937cdf0e10cSrcweir { 1938cdf0e10cSrcweir OptionsUserData aData( (sal_uLong) pEntry->GetUserData() ); 1939cdf0e10cSrcweir aLinguOptionsEditPB.Enable( aData.HasNumericValue() ); 1940cdf0e10cSrcweir } 1941cdf0e10cSrcweir } 1942cdf0e10cSrcweir else 1943cdf0e10cSrcweir { 1944cdf0e10cSrcweir DBG_ERROR( "pBox unexpected value" ); 1945cdf0e10cSrcweir } 1946cdf0e10cSrcweir 1947cdf0e10cSrcweir return 0; 1948cdf0e10cSrcweir } 1949cdf0e10cSrcweir 1950cdf0e10cSrcweir // ----------------------------------------------------------------------- 1951cdf0e10cSrcweir 1952cdf0e10cSrcweir SvLBoxEntry* SvxLinguTabPage::CreateEntry( String& rTxt, sal_uInt16 nCol ) 1953cdf0e10cSrcweir { 1954cdf0e10cSrcweir SvLBoxEntry* pEntry = new SvLBoxEntry; 1955cdf0e10cSrcweir 1956cdf0e10cSrcweir if( !pCheckButtonData ) 1957cdf0e10cSrcweir pCheckButtonData = new SvLBoxButtonData( &aLinguOptionsCLB ); 1958cdf0e10cSrcweir 1959cdf0e10cSrcweir String sEmpty; 1960cdf0e10cSrcweir if (CBCOL_FIRST == nCol) 1961cdf0e10cSrcweir pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) ); 1962cdf0e10cSrcweir if (CBCOL_SECOND == nCol) 1963cdf0e10cSrcweir pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) ); // Leerspalte 1964cdf0e10cSrcweir pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0)); // Sonst Puff! 1965cdf0e10cSrcweir pEntry->AddItem( new BrwString_Impl( pEntry, 0, rTxt ) ); 1966cdf0e10cSrcweir 1967cdf0e10cSrcweir return pEntry; 1968cdf0e10cSrcweir } 1969cdf0e10cSrcweir 1970cdf0e10cSrcweir // ----------------------------------------------------------------------- 1971cdf0e10cSrcweir 1972cdf0e10cSrcweir void SvxLinguTabPage::HideGroups( sal_uInt16 nGrp ) 1973cdf0e10cSrcweir { 1974cdf0e10cSrcweir if ( 0 != ( GROUP_MODULES & nGrp ) ) 1975cdf0e10cSrcweir { 1976cdf0e10cSrcweir aLinguModulesFT.Hide(); 1977cdf0e10cSrcweir aLinguModulesCLB.Hide(); 1978cdf0e10cSrcweir aLinguModulesEditPB.Hide(); 1979cdf0e10cSrcweir 1980cdf0e10cSrcweir // reposition / resize remaining controls 1981cdf0e10cSrcweir long nDeltaY = aLinguDicsFT.GetPosPixel().Y() - 1982cdf0e10cSrcweir aLinguModulesFT.GetPosPixel().Y(); 1983cdf0e10cSrcweir DBG_ASSERT( nDeltaY >= 0, "move/resize value is negative" ); 1984cdf0e10cSrcweir Point aPos; 1985cdf0e10cSrcweir // 1986cdf0e10cSrcweir aPos = aLinguDicsFT.GetPosPixel(); 1987cdf0e10cSrcweir aPos.Y() -= nDeltaY; 1988cdf0e10cSrcweir aLinguDicsFT.SetPosPixel( aPos ); 1989cdf0e10cSrcweir aPos = aLinguDicsCLB.GetPosPixel(); 1990cdf0e10cSrcweir aPos.Y() -= nDeltaY; 1991cdf0e10cSrcweir aLinguDicsCLB.SetPosPixel( aPos ); 1992cdf0e10cSrcweir aPos = aLinguDicsNewPB.GetPosPixel(); 1993cdf0e10cSrcweir aPos.Y() -= nDeltaY; 1994cdf0e10cSrcweir aLinguDicsNewPB.SetPosPixel( aPos ); 1995cdf0e10cSrcweir aPos = aLinguDicsEditPB.GetPosPixel(); 1996cdf0e10cSrcweir aPos.Y() -= nDeltaY; 1997cdf0e10cSrcweir aLinguDicsEditPB.SetPosPixel( aPos ); 1998cdf0e10cSrcweir aPos = aLinguDicsDelPB.GetPosPixel(); 1999cdf0e10cSrcweir aPos.Y() -= nDeltaY; 2000cdf0e10cSrcweir aLinguDicsDelPB.SetPosPixel( aPos ); 2001cdf0e10cSrcweir // 2002cdf0e10cSrcweir aPos = aLinguOptionsFT.GetPosPixel(); 2003cdf0e10cSrcweir aPos.Y() -= nDeltaY; 2004cdf0e10cSrcweir aLinguOptionsFT.SetPosPixel( aPos ); 2005cdf0e10cSrcweir aPos = aLinguOptionsCLB.GetPosPixel(); 2006cdf0e10cSrcweir aPos.Y() -= nDeltaY; 2007cdf0e10cSrcweir aLinguOptionsCLB.SetPosPixel( aPos ); 2008cdf0e10cSrcweir aPos = aLinguOptionsEditPB.GetPosPixel(); 2009cdf0e10cSrcweir aPos.Y() -= nDeltaY; 2010cdf0e10cSrcweir aLinguOptionsEditPB.SetPosPixel( aPos ); 2011cdf0e10cSrcweir // 2012cdf0e10cSrcweir Size aSize( aLinguOptionsCLB.GetSizePixel() ); 2013cdf0e10cSrcweir aSize.Height() += nDeltaY; 2014cdf0e10cSrcweir aLinguOptionsCLB.SetSizePixel( aSize ); 2015cdf0e10cSrcweir 2016cdf0e10cSrcweir if ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode() 2017cdf0e10cSrcweir != SvtExtendedSecurityOptions::OPEN_NEVER ) 2018cdf0e10cSrcweir { 2019cdf0e10cSrcweir aSize = GetOutputSizePixel(); 2020cdf0e10cSrcweir aSize.Height() += ( aMoreDictsLink.GetSizePixel().Height() * 11 / 8 ); 2021cdf0e10cSrcweir SetSizePixel( aSize ); 2022cdf0e10cSrcweir aMoreDictsLink.Show(); 2023cdf0e10cSrcweir } 2024cdf0e10cSrcweir } 2025cdf0e10cSrcweir } 2026cdf0e10cSrcweir /*-------------------------------------------------- 2027cdf0e10cSrcweir --------------------------------------------------*/ 2028cdf0e10cSrcweir 2029cdf0e10cSrcweir SvxEditModulesDlg::SvxEditModulesDlg(Window* pParent, SvxLinguData_Impl& rData) : 2030cdf0e10cSrcweir ModalDialog( pParent, CUI_RES(RID_SVXDLG_EDIT_MODULES ) ), 2031cdf0e10cSrcweir aModulesFL ( this, CUI_RES( FL_EDIT_MODULES_OPTIONS ) ), 2032cdf0e10cSrcweir aLanguageFT ( this, CUI_RES( FT_EDIT_MODULES_LANGUAGE ) ), 2033cdf0e10cSrcweir aLanguageLB ( this, CUI_RES( LB_EDIT_MODULES_LANGUAGE ), sal_False ), 2034cdf0e10cSrcweir aModulesCLB ( this, CUI_RES( CLB_EDIT_MODULES_MODULES ) ), 2035cdf0e10cSrcweir aPrioUpPB ( this, CUI_RES( PB_EDIT_MODULES_PRIO_UP ) ), 2036cdf0e10cSrcweir aPrioDownPB ( this, CUI_RES( PB_EDIT_MODULES_PRIO_DOWN ) ), 2037cdf0e10cSrcweir aBackPB ( this, CUI_RES( PB_EDIT_MODULES_PRIO_BACK ) ), 2038cdf0e10cSrcweir aMoreDictsLink ( this, CUI_RES( FT_EDIT_MODULES_NEWDICTSLINK ) ), 2039cdf0e10cSrcweir aButtonsFL ( this, CUI_RES( FL_EDIT_MODULES_BUTTONS ) ), 2040cdf0e10cSrcweir aHelpPB ( this, CUI_RES( PB_HELP ) ), 2041cdf0e10cSrcweir aClosePB ( this, CUI_RES( PB_OK ) ), 2042cdf0e10cSrcweir sSpell ( CUI_RES( ST_SPELL ) ), 2043cdf0e10cSrcweir sHyph ( CUI_RES( ST_HYPH ) ), 2044cdf0e10cSrcweir sThes ( CUI_RES( ST_THES ) ), 2045cdf0e10cSrcweir sGrammar ( CUI_RES( ST_GRAMMAR ) ), 2046cdf0e10cSrcweir rLinguData ( rData ) 2047cdf0e10cSrcweir { 2048cdf0e10cSrcweir pCheckButtonData = NULL; 2049cdf0e10cSrcweir FreeResource(); 2050cdf0e10cSrcweir 2051cdf0e10cSrcweir pDefaultLinguData = new SvxLinguData_Impl( rLinguData ); 2052cdf0e10cSrcweir 2053cdf0e10cSrcweir aModulesCLB.SetStyle( aModulesCLB.GetStyle()|WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE ); 2054cdf0e10cSrcweir aModulesCLB.SetHighlightRange(); 2055cdf0e10cSrcweir aModulesCLB.SetHelpId(HID_CLB_EDIT_MODULES_MODULES ); 2056cdf0e10cSrcweir aModulesCLB.SetSelectHdl( LINK( this, SvxEditModulesDlg, SelectHdl_Impl )); 2057cdf0e10cSrcweir aModulesCLB.SetCheckButtonHdl( LINK( this, SvxEditModulesDlg, BoxCheckButtonHdl_Impl) ); 2058cdf0e10cSrcweir 2059cdf0e10cSrcweir aClosePB .SetClickHdl( LINK( this, SvxEditModulesDlg, ClickHdl_Impl )); 2060cdf0e10cSrcweir aPrioUpPB .SetClickHdl( LINK( this, SvxEditModulesDlg, UpDownHdl_Impl )); 2061cdf0e10cSrcweir aPrioDownPB.SetClickHdl( LINK( this, SvxEditModulesDlg, UpDownHdl_Impl )); 2062cdf0e10cSrcweir aBackPB .SetClickHdl( LINK( this, SvxEditModulesDlg, BackHdl_Impl )); 2063cdf0e10cSrcweir // in case of not installed language modules 2064cdf0e10cSrcweir aPrioUpPB .Enable( sal_False ); 2065cdf0e10cSrcweir aPrioDownPB.Enable( sal_False ); 2066cdf0e10cSrcweir 2067cdf0e10cSrcweir if ( SvtExtendedSecurityOptions().GetOpenHyperlinkMode() 2068cdf0e10cSrcweir != SvtExtendedSecurityOptions::OPEN_NEVER ) 2069cdf0e10cSrcweir { 2070cdf0e10cSrcweir aMoreDictsLink.SetURL( String( 2071cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "http://extensions.services.openoffice.org/dictionary?cid=926386" ) ) ); 2072cdf0e10cSrcweir aMoreDictsLink.SetClickHdl( LINK( this, SvxEditModulesDlg, OpenURLHdl_Impl ) ); 2073cdf0e10cSrcweir } 2074cdf0e10cSrcweir else 2075cdf0e10cSrcweir { 2076cdf0e10cSrcweir aMoreDictsLink.Hide(); 2077cdf0e10cSrcweir long nPos = aMoreDictsLink.GetPosPixel().Y() + aMoreDictsLink.GetSizePixel().Height(); 2078cdf0e10cSrcweir Size aSize = aModulesCLB.GetSizePixel(); 2079cdf0e10cSrcweir aSize.Height() += ( nPos - ( aModulesCLB.GetPosPixel().Y() + aSize.Height() ) ); 2080cdf0e10cSrcweir aModulesCLB.SetSizePixel( aSize ); 2081cdf0e10cSrcweir } 2082cdf0e10cSrcweir 2083cdf0e10cSrcweir // 2084cdf0e10cSrcweir //fill language box 2085cdf0e10cSrcweir // 2086cdf0e10cSrcweir Sequence< sal_Int16 > aAvailLang; 2087cdf0e10cSrcweir uno::Reference< XAvailableLocales > xAvail( rLinguData.GetManager(), UNO_QUERY ); 2088cdf0e10cSrcweir if (xAvail.is()) 2089cdf0e10cSrcweir { 2090cdf0e10cSrcweir aAvailLang = lcl_LocaleSeqToLangSeq( 2091cdf0e10cSrcweir xAvail->getAvailableLocales( C2U(cSpell) ) ); 2092cdf0e10cSrcweir } 2093cdf0e10cSrcweir const Sequence< Locale >& rLoc = rLinguData.GetAllSupportedLocales(); 2094cdf0e10cSrcweir const Locale* pLocales = rLoc.getConstArray(); 2095cdf0e10cSrcweir aLanguageLB.Clear(); 2096cdf0e10cSrcweir for(long i = 0; i < rLoc.getLength(); i++) 2097cdf0e10cSrcweir { 2098cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( pLocales[i] ); 2099cdf0e10cSrcweir aLanguageLB.InsertLanguage( nLang, lcl_SeqHasLang( aAvailLang, nLang ) ); 2100cdf0e10cSrcweir } 2101cdf0e10cSrcweir LanguageType eSysLang = MsLangId::getSystemLanguage(); 2102cdf0e10cSrcweir aLanguageLB.SelectLanguage( eSysLang ); 2103cdf0e10cSrcweir if(!aLanguageLB.IsLanguageSelected( eSysLang ) ) 2104cdf0e10cSrcweir aLanguageLB.SelectEntryPos(0); 2105cdf0e10cSrcweir 2106cdf0e10cSrcweir aLanguageLB.SetSelectHdl( LINK( this, SvxEditModulesDlg, LangSelectHdl_Impl )); 2107cdf0e10cSrcweir LangSelectHdl_Impl(&aLanguageLB); 2108cdf0e10cSrcweir } 2109cdf0e10cSrcweir 2110cdf0e10cSrcweir 2111cdf0e10cSrcweir SvxEditModulesDlg::~SvxEditModulesDlg() 2112cdf0e10cSrcweir { 2113cdf0e10cSrcweir delete pDefaultLinguData; 2114cdf0e10cSrcweir } 2115cdf0e10cSrcweir 2116cdf0e10cSrcweir 2117cdf0e10cSrcweir SvLBoxEntry* SvxEditModulesDlg::CreateEntry( String& rTxt, sal_uInt16 nCol ) 2118cdf0e10cSrcweir { 2119cdf0e10cSrcweir SvLBoxEntry* pEntry = new SvLBoxEntry; 2120cdf0e10cSrcweir if( !pCheckButtonData ) 2121cdf0e10cSrcweir { 2122cdf0e10cSrcweir pCheckButtonData = new SvLBoxButtonData( &aModulesCLB ); 2123cdf0e10cSrcweir pCheckButtonData->SetLink( aModulesCLB.GetCheckButtonHdl() ); 2124cdf0e10cSrcweir } 2125cdf0e10cSrcweir 2126cdf0e10cSrcweir String sEmpty; 2127cdf0e10cSrcweir if (CBCOL_FIRST == nCol) 2128cdf0e10cSrcweir pEntry->AddItem( new SvLBoxButton( pEntry, SvLBoxButtonKind_enabledCheckbox, 0, pCheckButtonData ) ); 2129cdf0e10cSrcweir if (CBCOL_SECOND == nCol) 2130cdf0e10cSrcweir pEntry->AddItem( new SvLBoxString( pEntry, 0, sEmpty) ); // Leerspalte 2131cdf0e10cSrcweir pEntry->AddItem( new SvLBoxContextBmp( pEntry, 0, Image(), Image(), 0)); // Sonst Puff! 2132cdf0e10cSrcweir pEntry->AddItem( new BrwStringDic_Impl( pEntry, 0, rTxt ) ); 2133cdf0e10cSrcweir 2134cdf0e10cSrcweir return pEntry; 2135cdf0e10cSrcweir } 2136cdf0e10cSrcweir 2137cdf0e10cSrcweir /* --------------------------------------------------------------------------- 2138cdf0e10cSrcweir 2139cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2140cdf0e10cSrcweir IMPL_LINK( SvxEditModulesDlg, SelectHdl_Impl, SvxCheckListBox *, pBox ) 2141cdf0e10cSrcweir { 2142cdf0e10cSrcweir if (&aModulesCLB == pBox) 2143cdf0e10cSrcweir { 2144cdf0e10cSrcweir sal_Bool bDisableUp = sal_True; 2145cdf0e10cSrcweir sal_Bool bDisableDown = sal_True; 2146cdf0e10cSrcweir SvLBoxEntry *pEntry = pBox->GetCurEntry(); 2147cdf0e10cSrcweir if (pEntry) 2148cdf0e10cSrcweir { 2149cdf0e10cSrcweir ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); 2150cdf0e10cSrcweir if(!pData->IsParent() && pData->GetType() != TYPE_HYPH) 2151cdf0e10cSrcweir { 2152cdf0e10cSrcweir sal_uInt16 nCurPos = pBox->GetSelectEntryPos(); 2153cdf0e10cSrcweir if(nCurPos < pBox->GetEntryCount() - 1) 2154cdf0e10cSrcweir { 2155cdf0e10cSrcweir bDisableDown = ((ModuleUserData_Impl*)pBox-> 2156cdf0e10cSrcweir GetEntry(nCurPos + 1)->GetUserData())->IsParent(); 2157cdf0e10cSrcweir } 2158cdf0e10cSrcweir if(nCurPos > 1) 2159cdf0e10cSrcweir { 2160cdf0e10cSrcweir bDisableUp = ((ModuleUserData_Impl*)pBox-> 2161cdf0e10cSrcweir GetEntry(nCurPos - 1)->GetUserData())->IsParent(); 2162cdf0e10cSrcweir } 2163cdf0e10cSrcweir } 2164cdf0e10cSrcweir aPrioUpPB.Enable(!bDisableUp); 2165cdf0e10cSrcweir aPrioDownPB.Enable(!bDisableDown); 2166cdf0e10cSrcweir } 2167cdf0e10cSrcweir } 2168cdf0e10cSrcweir else 2169cdf0e10cSrcweir { 2170cdf0e10cSrcweir DBG_ERROR( "pBox unexpected value" ); 2171cdf0e10cSrcweir } 2172cdf0e10cSrcweir 2173cdf0e10cSrcweir return 0; 2174cdf0e10cSrcweir } 2175cdf0e10cSrcweir /* -----------------------------28.05.01 11:00-------------------------------- 2176cdf0e10cSrcweir 2177cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2178cdf0e10cSrcweir IMPL_LINK( SvxEditModulesDlg, BoxCheckButtonHdl_Impl, SvTreeListBox *, pBox ) 2179cdf0e10cSrcweir { 2180cdf0e10cSrcweir // if (pBox == (SvTreeListBox *) &aModulesCLB) 2181cdf0e10cSrcweir // { 2182cdf0e10cSrcweir pBox = &aModulesCLB; 2183cdf0e10cSrcweir SvLBoxEntry *pCurEntry = pBox->GetCurEntry(); 2184cdf0e10cSrcweir if (pCurEntry) 2185cdf0e10cSrcweir { 2186cdf0e10cSrcweir ModuleUserData_Impl* pData = (ModuleUserData_Impl *) 2187cdf0e10cSrcweir pCurEntry->GetUserData(); 2188cdf0e10cSrcweir if (!pData->IsParent() && pData->GetType() == TYPE_HYPH) 2189cdf0e10cSrcweir { 2190cdf0e10cSrcweir // make hyphenator checkboxes function as radio-buttons 2191cdf0e10cSrcweir // (at most one box may be checked) 2192cdf0e10cSrcweir SvLBoxEntry *pEntry = pBox->First(); 2193cdf0e10cSrcweir while (pEntry) 2194cdf0e10cSrcweir { 2195cdf0e10cSrcweir pData = (ModuleUserData_Impl *) pEntry->GetUserData(); 2196cdf0e10cSrcweir if (!pData->IsParent() && 2197cdf0e10cSrcweir pData->GetType() == TYPE_HYPH && 2198cdf0e10cSrcweir pEntry != pCurEntry) 2199cdf0e10cSrcweir { 2200cdf0e10cSrcweir lcl_SetCheckButton( pEntry, sal_False ); 2201cdf0e10cSrcweir pBox->InvalidateEntry( pEntry ); 2202cdf0e10cSrcweir } 2203cdf0e10cSrcweir pEntry = pBox->Next( pEntry ); 2204cdf0e10cSrcweir } 2205cdf0e10cSrcweir } 2206cdf0e10cSrcweir } 2207cdf0e10cSrcweir // } 2208cdf0e10cSrcweir return 0; 2209cdf0e10cSrcweir } 2210cdf0e10cSrcweir /* -----------------------------27.11.00 14:00-------------------------------- 2211cdf0e10cSrcweir 2212cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2213cdf0e10cSrcweir OUString lcl_GetServiceName(sal_uInt8 nType) 2214cdf0e10cSrcweir { 2215cdf0e10cSrcweir switch(nType) 2216cdf0e10cSrcweir { 2217cdf0e10cSrcweir case TYPE_SPELL : return C2U(cSpell); 2218cdf0e10cSrcweir case TYPE_GRAMMAR : return C2U(cGrammar); 2219cdf0e10cSrcweir case TYPE_HYPH : return C2U(cHyph); 2220cdf0e10cSrcweir case TYPE_THES : return C2U(cThes); 2221cdf0e10cSrcweir } 2222cdf0e10cSrcweir return OUString(); 2223cdf0e10cSrcweir } 2224cdf0e10cSrcweir 2225cdf0e10cSrcweir 2226cdf0e10cSrcweir IMPL_LINK( SvxEditModulesDlg, LangSelectHdl_Impl, ListBox *, pBox ) 2227cdf0e10cSrcweir { 2228cdf0e10cSrcweir LanguageType eCurLanguage = aLanguageLB.GetSelectLanguage(); 2229cdf0e10cSrcweir static Locale aLastLocale; 2230cdf0e10cSrcweir Locale aCurLocale; 2231cdf0e10cSrcweir SvxLanguageToLocale(aCurLocale, eCurLanguage); 2232cdf0e10cSrcweir SvLBoxTreeList *pModel = aModulesCLB.GetModel(); 2233cdf0e10cSrcweir // uno::Reference<XLinguServiceManager>& xMgr = rLinguData.GetManager(); 2234cdf0e10cSrcweir 2235cdf0e10cSrcweir if (pBox) 2236cdf0e10cSrcweir { 2237cdf0e10cSrcweir // save old probably changed settings 2238cdf0e10cSrcweir // before switching to new language entries 2239cdf0e10cSrcweir 2240cdf0e10cSrcweir sal_Int16 nLang = SvxLocaleToLanguage( aLastLocale ); 2241cdf0e10cSrcweir 2242cdf0e10cSrcweir sal_Int32 nStart = 0, nLocalIndex = 0; 2243cdf0e10cSrcweir Sequence< OUString > aChange; 2244cdf0e10cSrcweir sal_Bool bChanged = sal_False; 2245cdf0e10cSrcweir for(sal_uInt16 i = 0; i < aModulesCLB.GetEntryCount(); i++) 2246cdf0e10cSrcweir { 2247cdf0e10cSrcweir SvLBoxEntry *pEntry = aModulesCLB.GetEntry(i); 2248cdf0e10cSrcweir ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); 2249cdf0e10cSrcweir if(pData->IsParent()) 2250cdf0e10cSrcweir { 2251cdf0e10cSrcweir if(bChanged) 2252cdf0e10cSrcweir { 2253cdf0e10cSrcweir LangImplNameTable *pTable = 0; 2254cdf0e10cSrcweir sal_uInt8 nType = pData->GetType(); 2255cdf0e10cSrcweir switch (nType - 1) 2256cdf0e10cSrcweir { 2257cdf0e10cSrcweir case TYPE_SPELL : pTable = &rLinguData.GetSpellTable(); break; 2258cdf0e10cSrcweir case TYPE_GRAMMAR : pTable = &rLinguData.GetGrammarTable(); break; 2259cdf0e10cSrcweir case TYPE_HYPH : pTable = &rLinguData.GetHyphTable(); break; 2260cdf0e10cSrcweir case TYPE_THES : pTable = &rLinguData.GetThesTable(); break; 2261cdf0e10cSrcweir } 2262cdf0e10cSrcweir if (pTable) 2263cdf0e10cSrcweir { 2264cdf0e10cSrcweir aChange.realloc(nStart); 2265cdf0e10cSrcweir (*pTable)[ nLang ] = aChange; 2266cdf0e10cSrcweir } 2267cdf0e10cSrcweir } 2268cdf0e10cSrcweir nLocalIndex = nStart = 0; 2269cdf0e10cSrcweir aChange.realloc(aModulesCLB.GetEntryCount()); 2270cdf0e10cSrcweir bChanged = sal_False; 2271cdf0e10cSrcweir } 2272cdf0e10cSrcweir else 2273cdf0e10cSrcweir { 2274cdf0e10cSrcweir OUString* pChange = aChange.getArray(); 2275cdf0e10cSrcweir pChange[nStart] = pData->GetImplName(); 2276cdf0e10cSrcweir bChanged |= pData->GetIndex() != nLocalIndex || 2277cdf0e10cSrcweir pData->IsChecked() != aModulesCLB.IsChecked(i); 2278cdf0e10cSrcweir if(aModulesCLB.IsChecked(i)) 2279cdf0e10cSrcweir nStart++; 2280cdf0e10cSrcweir ++nLocalIndex; 2281cdf0e10cSrcweir } 2282cdf0e10cSrcweir } 2283cdf0e10cSrcweir if(bChanged) 2284cdf0e10cSrcweir { 2285cdf0e10cSrcweir aChange.realloc(nStart); 2286cdf0e10cSrcweir rLinguData.GetThesTable()[ nLang ] = aChange; 2287cdf0e10cSrcweir } 2288cdf0e10cSrcweir } 2289cdf0e10cSrcweir 2290cdf0e10cSrcweir for(sal_uLong i = 0; i < aModulesCLB.GetEntryCount(); i++) 2291cdf0e10cSrcweir delete (ModuleUserData_Impl*)aModulesCLB.GetEntry(i)->GetUserData(); 2292cdf0e10cSrcweir 2293cdf0e10cSrcweir // 2294cdf0e10cSrcweir // display entries for new selected language 2295cdf0e10cSrcweir // 2296cdf0e10cSrcweir aModulesCLB.Clear(); 2297cdf0e10cSrcweir if(LANGUAGE_DONTKNOW != eCurLanguage) 2298cdf0e10cSrcweir { 2299cdf0e10cSrcweir // sal_Int32 nEntryPos = 1; 2300cdf0e10cSrcweir 2301cdf0e10cSrcweir sal_uLong n; 2302cdf0e10cSrcweir ServiceInfo_Impl* pInfo; 2303cdf0e10cSrcweir 2304cdf0e10cSrcweir // 2305cdf0e10cSrcweir // spellchecker entries 2306cdf0e10cSrcweir // 2307cdf0e10cSrcweir SvLBoxEntry* pEntry = CreateEntry( sSpell, CBCOL_SECOND ); 2308cdf0e10cSrcweir ModuleUserData_Impl* pUserData = new ModuleUserData_Impl( 2309cdf0e10cSrcweir String(), sal_True, sal_False, TYPE_SPELL, 0 ); 2310cdf0e10cSrcweir pEntry->SetUserData( (void *)pUserData ); 2311cdf0e10cSrcweir pModel->Insert( pEntry ); 2312cdf0e10cSrcweir // 2313cdf0e10cSrcweir Sequence< OUString > aNames( rLinguData.GetSortedImplNames( eCurLanguage, TYPE_SPELL ) ); 2314cdf0e10cSrcweir const OUString *pName = aNames.getConstArray(); 2315cdf0e10cSrcweir sal_uLong nNames = (sal_uLong) aNames.getLength(); 2316cdf0e10cSrcweir sal_Int32 nLocalIndex = 0; // index relative to parent 2317cdf0e10cSrcweir for (n = 0; n < nNames; ++n) 2318cdf0e10cSrcweir { 2319cdf0e10cSrcweir OUString aImplName; 2320cdf0e10cSrcweir sal_Bool bIsSuppLang = sal_False; 2321cdf0e10cSrcweir 2322cdf0e10cSrcweir pInfo = rLinguData.GetInfoByImplName( pName[n] ); 2323cdf0e10cSrcweir if (pInfo) 2324cdf0e10cSrcweir { 2325cdf0e10cSrcweir bIsSuppLang = pInfo->xSpell.is() && 2326cdf0e10cSrcweir pInfo->xSpell->hasLocale( aCurLocale ); 2327cdf0e10cSrcweir aImplName = pInfo->sSpellImplName; 2328cdf0e10cSrcweir } 2329cdf0e10cSrcweir if (aImplName.getLength() && bIsSuppLang) 2330cdf0e10cSrcweir { 2331cdf0e10cSrcweir String aTxt( pInfo->sDisplayName ); 2332cdf0e10cSrcweir SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); 2333cdf0e10cSrcweir 2334cdf0e10cSrcweir LangImplNameTable &rTable = rLinguData.GetSpellTable(); 2335cdf0e10cSrcweir const bool bHasLang = rTable.count( eCurLanguage ); 2336cdf0e10cSrcweir if (!bHasLang) 2337cdf0e10cSrcweir { 2338cdf0e10cSrcweir DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported 2339cdf0e10cSrcweir } 2340cdf0e10cSrcweir const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; 2341cdf0e10cSrcweir lcl_SetCheckButton( pNewEntry, bCheck ); 2342cdf0e10cSrcweir pUserData = new ModuleUserData_Impl( aImplName, sal_False, 2343cdf0e10cSrcweir bCheck, TYPE_SPELL, (sal_uInt8)nLocalIndex++ ); 2344cdf0e10cSrcweir pNewEntry->SetUserData( (void *)pUserData ); 2345cdf0e10cSrcweir pModel->Insert( pNewEntry ); 2346cdf0e10cSrcweir } 2347cdf0e10cSrcweir } 2348cdf0e10cSrcweir 2349cdf0e10cSrcweir // 2350cdf0e10cSrcweir // grammar checker entries 2351cdf0e10cSrcweir // 2352cdf0e10cSrcweir pEntry = CreateEntry( sGrammar, CBCOL_SECOND ); 2353cdf0e10cSrcweir pUserData = new ModuleUserData_Impl( String(), sal_True, sal_False, TYPE_GRAMMAR, 0 ); 2354cdf0e10cSrcweir pEntry->SetUserData( (void *)pUserData ); 2355cdf0e10cSrcweir pModel->Insert( pEntry ); 2356cdf0e10cSrcweir // 2357cdf0e10cSrcweir aNames = rLinguData.GetSortedImplNames( eCurLanguage, TYPE_GRAMMAR ); 2358cdf0e10cSrcweir pName = aNames.getConstArray(); 2359cdf0e10cSrcweir nNames = (sal_uLong) aNames.getLength(); 2360cdf0e10cSrcweir nLocalIndex = 0; 2361cdf0e10cSrcweir for (n = 0; n < nNames; ++n) 2362cdf0e10cSrcweir { 2363cdf0e10cSrcweir OUString aImplName; 2364cdf0e10cSrcweir sal_Bool bIsSuppLang = sal_False; 2365cdf0e10cSrcweir 2366cdf0e10cSrcweir pInfo = rLinguData.GetInfoByImplName( pName[n] ); 2367cdf0e10cSrcweir if (pInfo) 2368cdf0e10cSrcweir { 2369cdf0e10cSrcweir bIsSuppLang = pInfo->xGrammar.is() && 2370cdf0e10cSrcweir pInfo->xGrammar->hasLocale( aCurLocale ); 2371cdf0e10cSrcweir aImplName = pInfo->sGrammarImplName; 2372cdf0e10cSrcweir } 2373cdf0e10cSrcweir if (aImplName.getLength() && bIsSuppLang) 2374cdf0e10cSrcweir { 2375cdf0e10cSrcweir String aTxt( pInfo->sDisplayName ); 2376cdf0e10cSrcweir SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); 2377cdf0e10cSrcweir 2378cdf0e10cSrcweir LangImplNameTable &rTable = rLinguData.GetGrammarTable(); 2379cdf0e10cSrcweir const bool bHasLang = rTable.count( eCurLanguage ); 2380cdf0e10cSrcweir if (!bHasLang) 2381cdf0e10cSrcweir { 2382cdf0e10cSrcweir DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported 2383cdf0e10cSrcweir } 2384cdf0e10cSrcweir const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; 2385cdf0e10cSrcweir lcl_SetCheckButton( pNewEntry, bCheck ); 2386cdf0e10cSrcweir pUserData = new ModuleUserData_Impl( aImplName, sal_False, 2387cdf0e10cSrcweir bCheck, TYPE_GRAMMAR, (sal_uInt8)nLocalIndex++ ); 2388cdf0e10cSrcweir pNewEntry->SetUserData( (void *)pUserData ); 2389cdf0e10cSrcweir pModel->Insert( pNewEntry ); 2390cdf0e10cSrcweir } 2391cdf0e10cSrcweir } 2392cdf0e10cSrcweir 2393cdf0e10cSrcweir // 2394cdf0e10cSrcweir // hyphenator entries 2395cdf0e10cSrcweir // 2396cdf0e10cSrcweir pEntry = CreateEntry( sHyph, CBCOL_SECOND ); 2397cdf0e10cSrcweir pUserData = new ModuleUserData_Impl( String(), sal_True, sal_False, TYPE_HYPH, 0 ); 2398cdf0e10cSrcweir pEntry->SetUserData( (void *)pUserData ); 2399cdf0e10cSrcweir pModel->Insert( pEntry ); 2400cdf0e10cSrcweir // 2401cdf0e10cSrcweir aNames = rLinguData.GetSortedImplNames( eCurLanguage, TYPE_HYPH ); 2402cdf0e10cSrcweir pName = aNames.getConstArray(); 2403cdf0e10cSrcweir nNames = (sal_uLong) aNames.getLength(); 2404cdf0e10cSrcweir nLocalIndex = 0; 2405cdf0e10cSrcweir for (n = 0; n < nNames; ++n) 2406cdf0e10cSrcweir { 2407cdf0e10cSrcweir OUString aImplName; 2408cdf0e10cSrcweir sal_Bool bIsSuppLang = sal_False; 2409cdf0e10cSrcweir 2410cdf0e10cSrcweir pInfo = rLinguData.GetInfoByImplName( pName[n] ); 2411cdf0e10cSrcweir if (pInfo) 2412cdf0e10cSrcweir { 2413cdf0e10cSrcweir bIsSuppLang = pInfo->xHyph.is() && 2414cdf0e10cSrcweir pInfo->xHyph->hasLocale( aCurLocale ); 2415cdf0e10cSrcweir aImplName = pInfo->sHyphImplName; 2416cdf0e10cSrcweir } 2417cdf0e10cSrcweir if (aImplName.getLength() && bIsSuppLang) 2418cdf0e10cSrcweir { 2419cdf0e10cSrcweir String aTxt( pInfo->sDisplayName ); 2420cdf0e10cSrcweir SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); 2421cdf0e10cSrcweir 2422cdf0e10cSrcweir LangImplNameTable &rTable = rLinguData.GetHyphTable(); 2423cdf0e10cSrcweir const bool bHasLang = rTable.count( eCurLanguage ); 2424cdf0e10cSrcweir if (!bHasLang) 2425cdf0e10cSrcweir { 2426cdf0e10cSrcweir DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported 2427cdf0e10cSrcweir } 2428cdf0e10cSrcweir const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; 2429cdf0e10cSrcweir lcl_SetCheckButton( pNewEntry, bCheck ); 2430cdf0e10cSrcweir pUserData = new ModuleUserData_Impl( aImplName, sal_False, 2431cdf0e10cSrcweir bCheck, TYPE_HYPH, (sal_uInt8)nLocalIndex++ ); 2432cdf0e10cSrcweir pNewEntry->SetUserData( (void *)pUserData ); 2433cdf0e10cSrcweir pModel->Insert( pNewEntry ); 2434cdf0e10cSrcweir } 2435cdf0e10cSrcweir } 2436cdf0e10cSrcweir 2437cdf0e10cSrcweir // 2438cdf0e10cSrcweir // thesaurus entries 2439cdf0e10cSrcweir // 2440cdf0e10cSrcweir pEntry = CreateEntry( sThes, CBCOL_SECOND ); 2441cdf0e10cSrcweir pUserData = new ModuleUserData_Impl( String(), sal_True, sal_False, TYPE_THES, 0 ); 2442cdf0e10cSrcweir pEntry->SetUserData( (void *)pUserData ); 2443cdf0e10cSrcweir pModel->Insert( pEntry ); 2444cdf0e10cSrcweir // 2445cdf0e10cSrcweir aNames = rLinguData.GetSortedImplNames( eCurLanguage, TYPE_THES ); 2446cdf0e10cSrcweir pName = aNames.getConstArray(); 2447cdf0e10cSrcweir nNames = (sal_uLong) aNames.getLength(); 2448cdf0e10cSrcweir nLocalIndex = 0; 2449cdf0e10cSrcweir for (n = 0; n < nNames; ++n) 2450cdf0e10cSrcweir { 2451cdf0e10cSrcweir OUString aImplName; 2452cdf0e10cSrcweir sal_Bool bIsSuppLang = sal_False; 2453cdf0e10cSrcweir 2454cdf0e10cSrcweir pInfo = rLinguData.GetInfoByImplName( pName[n] ); 2455cdf0e10cSrcweir if (pInfo) 2456cdf0e10cSrcweir { 2457cdf0e10cSrcweir bIsSuppLang = pInfo->xThes.is() && 2458cdf0e10cSrcweir pInfo->xThes->hasLocale( aCurLocale ); 2459cdf0e10cSrcweir aImplName = pInfo->sThesImplName; 2460cdf0e10cSrcweir } 2461cdf0e10cSrcweir if (aImplName.getLength() && bIsSuppLang) 2462cdf0e10cSrcweir { 2463cdf0e10cSrcweir String aTxt( pInfo->sDisplayName ); 2464cdf0e10cSrcweir SvLBoxEntry* pNewEntry = CreateEntry( aTxt, CBCOL_FIRST ); 2465cdf0e10cSrcweir 2466cdf0e10cSrcweir LangImplNameTable &rTable = rLinguData.GetThesTable(); 2467cdf0e10cSrcweir const bool bHasLang = rTable.count( eCurLanguage ); 2468cdf0e10cSrcweir if (!bHasLang) 2469cdf0e10cSrcweir { 2470cdf0e10cSrcweir DBG_WARNING( "language entry missing" ); // only relevant if all languages found should be supported 2471cdf0e10cSrcweir } 2472cdf0e10cSrcweir const bool bCheck = bHasLang && lcl_SeqGetEntryPos( rTable[ eCurLanguage ], aImplName ) >= 0; 2473cdf0e10cSrcweir lcl_SetCheckButton( pNewEntry, bCheck ); 2474cdf0e10cSrcweir pUserData = new ModuleUserData_Impl( aImplName, sal_False, 2475cdf0e10cSrcweir bCheck, TYPE_THES, (sal_uInt8)nLocalIndex++ ); 2476cdf0e10cSrcweir pNewEntry->SetUserData( (void *)pUserData ); 2477cdf0e10cSrcweir pModel->Insert( pNewEntry ); 2478cdf0e10cSrcweir } 2479cdf0e10cSrcweir } 2480cdf0e10cSrcweir } 2481cdf0e10cSrcweir aLastLocale.Language = aCurLocale.Language; 2482cdf0e10cSrcweir aLastLocale.Country = aCurLocale.Country; 2483cdf0e10cSrcweir return 0; 2484cdf0e10cSrcweir } 2485cdf0e10cSrcweir /* -----------------------------27.11.00 19:50-------------------------------- 2486cdf0e10cSrcweir 2487cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2488cdf0e10cSrcweir IMPL_LINK( SvxEditModulesDlg, UpDownHdl_Impl, PushButton *, pBtn ) 2489cdf0e10cSrcweir { 2490cdf0e10cSrcweir sal_Bool bUp = &aPrioUpPB == pBtn; 2491cdf0e10cSrcweir sal_uInt16 nCurPos = aModulesCLB.GetSelectEntryPos(); 2492cdf0e10cSrcweir SvLBoxEntry* pEntry; 2493cdf0e10cSrcweir if (nCurPos != LISTBOX_ENTRY_NOTFOUND && 2494cdf0e10cSrcweir 0 != (pEntry = aModulesCLB.GetEntry(nCurPos))) 2495cdf0e10cSrcweir { 2496cdf0e10cSrcweir aModulesCLB.SetUpdateMode(sal_False); 2497cdf0e10cSrcweir SvLBoxTreeList *pModel = aModulesCLB.GetModel(); 2498cdf0e10cSrcweir 2499cdf0e10cSrcweir ModuleUserData_Impl* pData = (ModuleUserData_Impl*)pEntry->GetUserData(); 2500cdf0e10cSrcweir String aStr(aModulesCLB.GetEntryText(pEntry)); 2501cdf0e10cSrcweir SvLBoxEntry* pToInsert = CreateEntry( aStr, CBCOL_FIRST ); 2502cdf0e10cSrcweir pToInsert->SetUserData( (void *)pData); 2503cdf0e10cSrcweir sal_Bool bIsChecked = aModulesCLB.IsChecked(nCurPos); 2504cdf0e10cSrcweir 2505cdf0e10cSrcweir pModel->Remove(pEntry); 2506cdf0e10cSrcweir 2507cdf0e10cSrcweir sal_uInt16 nDestPos = bUp ? nCurPos - 1 : nCurPos + 1; 2508cdf0e10cSrcweir pModel->Insert(pToInsert, nDestPos); 2509cdf0e10cSrcweir aModulesCLB.CheckEntryPos(nDestPos, bIsChecked ); 2510cdf0e10cSrcweir aModulesCLB.SelectEntryPos(nDestPos ); 2511cdf0e10cSrcweir SelectHdl_Impl(&aModulesCLB); 2512cdf0e10cSrcweir aModulesCLB.SetUpdateMode(sal_True); 2513cdf0e10cSrcweir } 2514cdf0e10cSrcweir return 0; 2515cdf0e10cSrcweir } 2516cdf0e10cSrcweir /* --------------------------------------------------------------------------- 2517cdf0e10cSrcweir 2518cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2519cdf0e10cSrcweir IMPL_LINK( SvxEditModulesDlg, ClickHdl_Impl, PushButton *, pBtn ) 2520cdf0e10cSrcweir { 2521cdf0e10cSrcweir if (&aClosePB == pBtn) 2522cdf0e10cSrcweir { 2523cdf0e10cSrcweir // store language config 2524cdf0e10cSrcweir LangSelectHdl_Impl(&aLanguageLB); 2525cdf0e10cSrcweir EndDialog( RET_OK ); 2526cdf0e10cSrcweir } 2527cdf0e10cSrcweir else 2528cdf0e10cSrcweir { 2529cdf0e10cSrcweir DBG_ERROR( "pBtn unexpected value" ); 2530cdf0e10cSrcweir } 2531cdf0e10cSrcweir 2532cdf0e10cSrcweir return 0; 2533cdf0e10cSrcweir } 2534cdf0e10cSrcweir /* -----------------------------27.11.00 20:31-------------------------------- 2535cdf0e10cSrcweir 2536cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2537cdf0e10cSrcweir IMPL_LINK( SvxEditModulesDlg, BackHdl_Impl, PushButton *, EMPTYARG ) 2538cdf0e10cSrcweir { 2539cdf0e10cSrcweir rLinguData = *pDefaultLinguData; 2540cdf0e10cSrcweir LangSelectHdl_Impl(0); 2541cdf0e10cSrcweir return 0; 2542cdf0e10cSrcweir } 2543cdf0e10cSrcweir 2544cdf0e10cSrcweir // ----------------------------------------------------------------------- 2545cdf0e10cSrcweir 2546cdf0e10cSrcweir IMPL_LINK( SvxEditModulesDlg, OpenURLHdl_Impl, svt::FixedHyperlink *, EMPTYARG ) 2547cdf0e10cSrcweir { 2548cdf0e10cSrcweir ::rtl::OUString sURL( aMoreDictsLink.GetURL() ); 2549cdf0e10cSrcweir lcl_OpenURL( sURL ); 2550cdf0e10cSrcweir return 0; 2551cdf0e10cSrcweir } 2552cdf0e10cSrcweir 2553