1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 // MARKER(update_precomp.py): autogen include statement, do not remove 23 #include "precompiled_sw.hxx" 24 25 #include <hintids.hxx> 26 #include <editeng/wghtitem.hxx> 27 #include <editeng/adjitem.hxx> 28 #ifndef __RSC //autogen 29 #include <tools/errinf.hxx> 30 #endif 31 #ifndef _MSGBOX_HXX //autogen 32 #include <vcl/msgbox.hxx> 33 #endif 34 #ifndef _MSGBOX_HXX //autogen 35 #include <vcl/msgbox.hxx> 36 #endif 37 #include <svl/macitem.hxx> 38 #include <sfx2/fcontnr.hxx> 39 #include <sfx2/docfile.hxx> 40 #define _SVSTDARR_STRINGS 41 #include <svl/svstdarr.hxx> 42 #include <svl/urihelper.hxx> 43 #include <unotools/transliterationwrapper.hxx> 44 #include <poolfmt.hxx> 45 #include <fmtcol.hxx> 46 #include <docary.hxx> 47 #include <wrtsh.hxx> 48 #include <uitool.hxx> // Fehlermeldungen 49 #include <view.hxx> 50 #include <swevent.hxx> 51 #include <gloshdl.hxx> 52 #include <glosdoc.hxx> 53 #include <shellio.hxx> 54 #include <swundo.hxx> // fuer Undo-Ids 55 #include <expfld.hxx> 56 #include <initui.hxx> // fuer ::GetGlossaries() 57 #include <gloslst.hxx> 58 #include <swdtflvr.hxx> 59 #ifndef _DOCSH_HXX 60 #include <docsh.hxx> 61 #endif 62 #include <crsskip.hxx> 63 64 #ifndef _DOCHDL_HRC 65 #include <dochdl.hrc> 66 #endif 67 #ifndef _SWERROR_H 68 #include <swerror.h> 69 #endif 70 #include <frmmgr.hxx> 71 #ifndef _LSTBOX_HXX //autogen 72 #include <vcl/lstbox.hxx> 73 #endif 74 75 #include <editeng/acorrcfg.hxx> 76 #include "swabstdlg.hxx" 77 #include <misc.hrc> 78 79 #include <IDocumentFieldsAccess.hxx> 80 81 using namespace ::com::sun::star; 82 83 const short RET_EDIT = 100; 84 85 // PUBLIC METHODES ------------------------------------------------------- 86 struct TextBlockInfo_Impl 87 { 88 String sTitle; 89 String sLongName; 90 String sGroupName; 91 }; 92 typedef TextBlockInfo_Impl* TextBlockInfo_ImplPtr; 93 SV_DECL_PTRARR_DEL( TextBlockInfoArr, TextBlockInfo_ImplPtr, 0, 4 ) 94 SV_IMPL_PTRARR( TextBlockInfoArr, TextBlockInfo_ImplPtr ) 95 SV_IMPL_REF( SwDocShell ) 96 /*------------------------------------------------------------------------ 97 Beschreibung: Dialog fuer Bearbeiten Vorlagen 98 ------------------------------------------------------------------------*/ 99 100 101 void SwGlossaryHdl::GlossaryDlg() 102 { 103 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 104 DBG_ASSERT(pFact, "Dialogdiet fail!"); 105 AbstractGlossaryDlg* pDlg = pFact->CreateGlossaryDlg( DLG_RENAME_GLOS, 106 pViewFrame, this, pWrtShell); 107 DBG_ASSERT(pDlg, "Dialogdiet fail!"); 108 String sName, sShortName; 109 110 if( RET_EDIT == pDlg->Execute() ) 111 { 112 sName = pDlg->GetCurrGrpName(); 113 sShortName = pDlg->GetCurrShortName(); 114 } 115 116 delete pDlg; 117 DELETEZ(pCurGrp); 118 if(HasGlossaryList()) 119 { 120 GetGlossaryList()->ClearGroups(); 121 } 122 123 if( sName.Len() || sShortName.Len() ) 124 rStatGlossaries.EditGroupDoc( sName, sShortName ); 125 } 126 127 /*------------------------------------------------------------------------ 128 Beschreibung: Setzen der aktuellen Gruppe; falls aus dem Dialog 129 gerufen, wird die Gruppe temp. erzeugt fuer einen 130 schnelleren Zugriff 131 ------------------------------------------------------------------------*/ 132 133 134 void SwGlossaryHdl::SetCurGroup(const String &rGrp, sal_Bool bApi, sal_Bool bAlwaysCreateNew ) 135 { 136 String sGroup(rGrp); 137 if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM) && !FindGroupName(sGroup)) 138 { 139 sGroup += GLOS_DELIM; 140 sGroup += '0'; 141 } 142 if(pCurGrp) 143 { 144 sal_Bool bPathEqual = sal_False; 145 if(!bAlwaysCreateNew) 146 { 147 INetURLObject aTemp( pCurGrp->GetFileName() ); 148 String sCurBase = aTemp.getBase(); 149 aTemp.removeSegment(); 150 const String sCurEntryPath = aTemp.GetMainURL(INetURLObject::NO_DECODE); 151 const SvStrings* pPathArr = rStatGlossaries.GetPathArray(); 152 sal_uInt16 nCurrentPath = USHRT_MAX; 153 for(sal_uInt16 nPath = 0; nPath < pPathArr->Count(); nPath++) 154 { 155 if(sCurEntryPath == *(*pPathArr)[nPath]) 156 { 157 nCurrentPath = nPath; 158 break; 159 } 160 } 161 String sPath = sGroup.GetToken(1, GLOS_DELIM); 162 sal_uInt16 nComparePath = (sal_uInt16)sPath.ToInt32(); 163 if(nCurrentPath == nComparePath && 164 sGroup.GetToken(0, GLOS_DELIM) == sCurBase) 165 bPathEqual = sal_True; 166 } 167 // const String aMac_Tmp(pCurGrp->GetName()); 168 // Beim Pfadwechsel kann man sich auf den Namen nicht verlassen 169 if(!bAlwaysCreateNew && 170 bPathEqual 171 // aMac_Tmp == sGroup 172 ) 173 return; 174 } 175 aCurGrp = sGroup; 176 if(!bApi) 177 { 178 if(pCurGrp) 179 { 180 rStatGlossaries.PutGroupDoc(pCurGrp); 181 pCurGrp = 0; 182 } 183 pCurGrp = rStatGlossaries.GetGroupDoc(aCurGrp, sal_True); 184 } 185 } 186 187 /*------------------------------------------------------------------------ 188 Beschreibung: 189 ------------------------------------------------------------------------*/ 190 191 192 sal_uInt16 SwGlossaryHdl::GetGroupCnt() const 193 { 194 return rStatGlossaries.GetGroupCnt(); 195 } 196 197 /*------------------------------------------------------------------------ 198 Beschreibung: 199 ------------------------------------------------------------------------*/ 200 201 202 String SwGlossaryHdl::GetGroupName( sal_uInt16 nId, String* pTitle ) 203 { 204 String sRet = rStatGlossaries.GetGroupName(nId); 205 if(pTitle) 206 { 207 SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sRet, sal_False); 208 if(pGroup && !pGroup->GetError()) 209 { 210 *pTitle = pGroup->GetName(); 211 if(!pTitle->Len()) 212 { 213 *pTitle = sRet.GetToken(0, GLOS_DELIM); 214 pGroup->SetName(*pTitle); 215 } 216 rStatGlossaries.PutGroupDoc( pGroup ); 217 } 218 else 219 sRet.Erase(); 220 } 221 return sRet; 222 } 223 /*------------------------------------------------------------------------ 224 Beschreibung: 225 ------------------------------------------------------------------------*/ 226 227 228 sal_Bool SwGlossaryHdl::NewGroup(String &rGrpName, const String& rTitle) 229 { 230 if(STRING_NOTFOUND == rGrpName.Search(GLOS_DELIM)) 231 FindGroupName(rGrpName); 232 return rStatGlossaries.NewGroupDoc(rGrpName, rTitle); 233 } 234 /* -----------------23.11.98 13:10------------------- 235 * Umbenennen eines Textbausteins 236 * --------------------------------------------------*/ 237 sal_Bool SwGlossaryHdl::RenameGroup(const String & rOld, String& rNew, const String& rNewTitle) 238 { 239 sal_Bool bRet = sal_False; 240 String sOldGroup(rOld); 241 if(STRING_NOTFOUND == rOld.Search(GLOS_DELIM)) 242 FindGroupName(sOldGroup); 243 if(rOld == rNew) 244 { 245 SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sOldGroup, sal_False); 246 if(pGroup) 247 { 248 pGroup->SetName(rNewTitle); 249 rStatGlossaries.PutGroupDoc( pGroup ); 250 bRet = sal_True; 251 } 252 } 253 else 254 { 255 String sNewGroup(rNew); 256 if(STRING_NOTFOUND == sNewGroup.Search(GLOS_DELIM)) 257 { 258 sNewGroup += GLOS_DELIM; 259 sNewGroup += '0'; 260 } 261 bRet = rStatGlossaries.RenameGroupDoc(sOldGroup, sNewGroup, rNewTitle); 262 rNew = sNewGroup; 263 } 264 return bRet; 265 } 266 /* -----------------27.11.98 13:49------------------- 267 * 268 * --------------------------------------------------*/ 269 sal_Bool SwGlossaryHdl::CopyOrMove( const String& rSourceGroupName, String& rSourceShortName, 270 const String& rDestGroupName, const String& rLongName, sal_Bool bMove ) 271 { 272 SwTextBlocks* pSourceGroup = rStatGlossaries.GetGroupDoc(rSourceGroupName, sal_False); 273 274 SwTextBlocks* pDestGroup = rStatGlossaries.GetGroupDoc(rDestGroupName, sal_False); 275 if(pDestGroup->IsReadOnly() || (bMove && pSourceGroup->IsReadOnly()) ) 276 return sal_False; 277 /*if(pDestGroup->IsOld()&& 0!= pDestGroup->ConvertToNew()) 278 return sal_False; 279 if(bMove && pSourceGroup->IsOld() && 0 != pSourceGroup->ConvertToNew()) 280 return sal_False;*/ 281 282 //Der Index muss hier ermittelt werden, weil rSourceShortName in CopyBlock evtl veraendert wird 283 sal_uInt16 nDeleteIdx = pSourceGroup->GetIndex( rSourceShortName ); 284 DBG_ASSERT(USHRT_MAX != nDeleteIdx, "Eintrag nicht gefunden"); 285 sal_uLong nRet = pSourceGroup->CopyBlock( *pDestGroup, rSourceShortName, rLongName ); 286 if(!nRet && bMove) 287 { 288 // der Index muss existieren 289 nRet = pSourceGroup->Delete( nDeleteIdx ) ? 0 : 1; 290 } 291 rStatGlossaries.PutGroupDoc( pSourceGroup ); 292 rStatGlossaries.PutGroupDoc( pDestGroup ); 293 return !nRet; 294 } 295 296 /*------------------------------------------------------------------------ 297 Beschreibung: Loeschen einer Textbausteindatei-Gruppe 298 ------------------------------------------------------------------------*/ 299 300 301 sal_Bool SwGlossaryHdl::DelGroup(const String &rGrpName) 302 { 303 String sGroup(rGrpName); 304 if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM)) 305 FindGroupName(sGroup); 306 if( rStatGlossaries.DelGroupDoc(sGroup) ) 307 { 308 if(pCurGrp) 309 { 310 const String aMac_Tmp(pCurGrp->GetName()); 311 if(aMac_Tmp == sGroup) 312 DELETEZ(pCurGrp); 313 } 314 return sal_True; 315 } 316 return sal_False; 317 } 318 319 /*------------------------------------------------------------------------ 320 Beschreibung: Anzahl Textbausteine erfragen 321 ------------------------------------------------------------------------*/ 322 323 324 sal_uInt16 SwGlossaryHdl::GetGlossaryCnt() 325 { 326 return pCurGrp ? pCurGrp->GetCount() : 0; 327 } 328 329 /*------------------------------------------------------------------------ 330 Beschreibung: 331 ------------------------------------------------------------------------*/ 332 333 334 String SwGlossaryHdl::GetGlossaryName( sal_uInt16 nId ) 335 { 336 ASSERT(nId < GetGlossaryCnt(), Textbausteinarray ueberindiziert.); 337 return pCurGrp->GetLongName( nId ); 338 } 339 /* -----------------30.11.98 13:18------------------- 340 * 341 * --------------------------------------------------*/ 342 String SwGlossaryHdl::GetGlossaryShortName(sal_uInt16 nId) 343 { 344 ASSERT(nId < GetGlossaryCnt(), Textbausteinarray ueberindiziert.); 345 return pCurGrp->GetShortName( nId ); 346 } 347 348 349 /*------------------------------------------------------------------------ 350 Beschreibung: Kurzname erfragen 351 ------------------------------------------------------------------------*/ 352 353 354 String SwGlossaryHdl::GetGlossaryShortName(const String &rName) 355 { 356 String sReturn; 357 SwTextBlocks *pTmp = 358 pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, sal_False ); 359 if(pTmp) 360 { 361 sal_uInt16 nIdx = pTmp->GetLongIndex( rName ); 362 if( nIdx != (sal_uInt16) -1 ) 363 sReturn = pTmp->GetShortName( nIdx ); 364 if( !pCurGrp ) 365 rStatGlossaries.PutGroupDoc( pTmp ); 366 } 367 return sReturn; 368 } 369 370 /*------------------------------------------------------------------------ 371 Beschreibung: Kuerzel fuer Textbaustein bereits verwendet? 372 ------------------------------------------------------------------------*/ 373 374 375 sal_Bool SwGlossaryHdl::HasShortName(const String& rShortName) const 376 { 377 SwTextBlocks *pBlock = pCurGrp ? pCurGrp 378 : rStatGlossaries.GetGroupDoc( aCurGrp ); 379 sal_Bool bRet = pBlock->GetIndex( rShortName ) != (sal_uInt16) -1; 380 if( !pCurGrp ) 381 rStatGlossaries.PutGroupDoc( pBlock ); 382 return bRet; 383 } 384 385 /* -----------------------------20.03.01 10:52-------------------------------- 386 387 ---------------------------------------------------------------------------*/ 388 sal_Bool SwGlossaryHdl::ConvertToNew(SwTextBlocks& /*rOld*/) 389 { 390 /*if( rOld.IsOld() ) 391 { 392 QueryBox aAsk( pWrtShell->GetView().GetWindow(), SW_RES( MSG_UPDATE_NEW_GLOS_FMT ) ); 393 if( aAsk.Execute() == RET_YES ) 394 { 395 if( rOld.ConvertToNew() ) 396 { 397 InfoBox(pWrtShell->GetView().GetWindow(), SW_RES(MSG_ERR_INSERT_GLOS)).Execute(); 398 return sal_False; 399 } 400 } 401 else 402 return sal_False; 403 }*/ 404 return sal_True; 405 } 406 407 /*------------------------------------------------------------------------ 408 Beschreibung: Erzeugen eines Textbausteines 409 ------------------------------------------------------------------------*/ 410 411 sal_Bool SwGlossaryHdl::NewGlossary(const String& rName, const String& rShortName, 412 sal_Bool bCreateGroup, sal_Bool bNoAttr) 413 { 414 SwTextBlocks *pTmp = 415 pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, bCreateGroup ); 416 //pTmp == 0 if the AutoText path setting is wrong 417 if(!pTmp) 418 return sal_False; 419 if(!ConvertToNew(*pTmp)) 420 return sal_False; 421 422 String sOnlyTxt; 423 String* pOnlyTxt = 0; 424 if( bNoAttr ) 425 { 426 if( !pWrtShell->GetSelectedText( sOnlyTxt, GETSELTXT_PARABRK_TO_ONLYCR )) 427 return sal_False; 428 pOnlyTxt = &sOnlyTxt; 429 } 430 431 const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); 432 433 const sal_uInt16 nSuccess = pWrtShell->MakeGlossary( *pTmp, rName, rShortName, 434 pCfg->IsSaveRelFile(), pOnlyTxt ); 435 if(nSuccess == (sal_uInt16) -1 ) 436 { 437 InfoBox(pWrtShell->GetView().GetWindow(), SW_RES(MSG_ERR_INSERT_GLOS)).Execute(); 438 } 439 if( !pCurGrp ) 440 rStatGlossaries.PutGroupDoc( pTmp ); 441 return sal_Bool( nSuccess != (sal_uInt16) -1 ); 442 } 443 /*------------------------------------------------------------------------ 444 Beschreibung: Loeschen eines Textbausteines 445 ------------------------------------------------------------------------*/ 446 447 448 sal_Bool SwGlossaryHdl::DelGlossary(const String &rShortName) 449 { 450 SwTextBlocks *pGlossary = pCurGrp ? pCurGrp 451 : rStatGlossaries.GetGroupDoc(aCurGrp); 452 //pTmp == 0 if the AutoText path setting is wrong 453 if(!pGlossary || !ConvertToNew(*pGlossary)) 454 return sal_False; 455 456 sal_uInt16 nIdx = pGlossary->GetIndex( rShortName ); 457 if( nIdx != (sal_uInt16) -1 ) 458 pGlossary->Delete( nIdx ); 459 if( !pCurGrp ) 460 rStatGlossaries.PutGroupDoc( pGlossary ); 461 return sal_True; 462 } 463 464 /*------------------------------------------------------------------------ 465 Beschreibung: Kurzform expandieren 466 ------------------------------------------------------------------------*/ 467 468 469 sal_Bool SwGlossaryHdl::ExpandGlossary() 470 { 471 ASSERT(pWrtShell->CanInsert(), illegal); 472 SwTextBlocks *pGlossary; 473 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 474 DBG_ASSERT(pFact, "Dialogdiet fail!"); 475 ::GlossaryGetCurrGroup fnGetCurrGroup = pFact->GetGlossaryCurrGroupFunc( DLG_RENAME_GLOS ); 476 DBG_ASSERT(fnGetCurrGroup, "Dialogdiet fail!"); 477 String sGroupName( (*fnGetCurrGroup)() ); 478 if(STRING_NOTFOUND == sGroupName.Search(GLOS_DELIM)) 479 FindGroupName(sGroupName); 480 pGlossary = rStatGlossaries.GetGroupDoc(sGroupName); 481 482 String aShortName; 483 484 // bei Textselektion diese verwenden 485 if(pWrtShell->SwCrsrShell::HasSelection() && !pWrtShell->IsBlockMode()) 486 { 487 aShortName = pWrtShell->GetSelTxt(); 488 } 489 else 490 { 491 if(pWrtShell->IsAddMode()) 492 pWrtShell->LeaveAddMode(); 493 else if(pWrtShell->IsBlockMode()) 494 pWrtShell->LeaveBlockMode(); 495 else if(pWrtShell->IsExtMode()) 496 pWrtShell->LeaveExtMode(); 497 // Wort selektieren 498 pWrtShell->SelNearestWrd(); 499 // Wort erfragen 500 if(pWrtShell->IsSelection()) 501 aShortName = pWrtShell->GetSelTxt(); 502 } 503 return pGlossary ? Expand( aShortName, &rStatGlossaries, pGlossary ) : sal_False; 504 } 505 506 sal_Bool SwGlossaryHdl::Expand( const String& rShortName, 507 SwGlossaries *pGlossaries, 508 SwTextBlocks *pGlossary ) 509 { 510 TextBlockInfoArr aFoundArr; 511 String aShortName( rShortName ); 512 sal_Bool bCancel = sal_False; 513 // search for text block 514 //#b6633427# - don't prefer current group depending on configuration setting 515 const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); 516 sal_uInt16 nFound = !pCfg->IsSearchInAllCategories() ? pGlossary->GetIndex( aShortName ) : -1; 517 // if not found then search in all groups 518 if( nFound == (sal_uInt16) -1 ) 519 { 520 const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore(); 521 SwGlossaryList* pGlossaryList = ::GetGlossaryList(); 522 sal_uInt16 nGroupCount = pGlossaryList->GetGroupCount(); 523 for(sal_uInt16 i = 1; i <= nGroupCount; i++) 524 { 525 // Gruppenname mit Pfad-Extension besorgen 526 String sTitle; 527 String sGroupName = pGlossaryList->GetGroupName(i - 1, sal_False, &sTitle); 528 if(sGroupName == pGlossary->GetName()) 529 continue; 530 sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1); 531 if(nBlockCount) 532 { 533 for(sal_uInt16 j = 0; j < nBlockCount; j++) 534 { 535 String sEntry; 536 String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry)); 537 if( rSCmp.isEqual( rShortName, sEntry )) 538 { 539 TextBlockInfo_Impl* pData = new TextBlockInfo_Impl; 540 pData->sTitle = sTitle; 541 pData->sLongName = sLongName; 542 pData->sGroupName = sGroupName; 543 aFoundArr.Insert(pData, aFoundArr.Count()); 544 } 545 } 546 } 547 } 548 if( aFoundArr.Count() ) // einer wurde gefunden 549 { 550 pGlossaries->PutGroupDoc(pGlossary); 551 if(1 == aFoundArr.Count()) 552 { 553 TextBlockInfo_Impl* pData = aFoundArr.GetObject(0); 554 pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName); 555 nFound = pGlossary->GetIndex( aShortName ); 556 } 557 else 558 { 559 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 560 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); 561 562 AbstractSwSelGlossaryDlg* pDlg = pFact->CreateSwSelGlossaryDlg( 0, aShortName, DLG_SEL_GLOS ); 563 DBG_ASSERT(pDlg, "Dialogdiet fail!"); 564 for(sal_uInt16 i = 0; i < aFoundArr.Count(); ++i) 565 { 566 TextBlockInfo_Impl* pData = aFoundArr.GetObject(i); 567 pDlg->InsertGlos(pData->sTitle, pData->sLongName); 568 } 569 pDlg->SelectEntryPos(0); 570 const sal_uInt16 nRet = RET_OK == pDlg->Execute()? 571 pDlg->GetSelectedIdx(): 572 LISTBOX_ENTRY_NOTFOUND; 573 delete pDlg; 574 if(LISTBOX_ENTRY_NOTFOUND != nRet) 575 { 576 TextBlockInfo_Impl* pData = aFoundArr.GetObject(nRet); 577 pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName); 578 nFound = pGlossary->GetIndex( aShortName ); 579 } 580 else 581 { 582 nFound = (sal_uInt16) -1; 583 bCancel = sal_True; 584 } 585 } 586 } 587 } 588 589 // not found 590 if( nFound == (sal_uInt16) -1 ) 591 { 592 if( !bCancel ) 593 { 594 pGlossaries->PutGroupDoc(pGlossary); 595 596 const sal_uInt16 nMaxLen = 50; 597 if(pWrtShell->IsSelection() && aShortName.Len() > nMaxLen) 598 { 599 aShortName.Erase(nMaxLen); 600 aShortName.AppendAscii(" ..."); 601 } 602 String aTmp( SW_RES(STR_NOGLOS)); 603 aTmp.SearchAndReplaceAscii("%1", aShortName); 604 InfoBox( pWrtShell->GetView().GetWindow(), aTmp ).Execute(); 605 } 606 607 return sal_False; 608 } 609 else 610 { 611 String aLongName = pGlossary->GetLongName( nFound ); 612 SvxMacro aStartMacro(aEmptyStr, aEmptyStr, STARBASIC); 613 SvxMacro aEndMacro(aEmptyStr, aEmptyStr, STARBASIC); 614 GetMacros( aShortName, aStartMacro, aEndMacro, pGlossary ); 615 616 // StartAction darf nicht vor HasSelection und DelRight stehen, 617 // sonst wird der mögliche Shellwechsel verzögert und 618 // API-Programme würden dann hängenbleiben 619 // ausserdem darf das Ereignismacro ebenfalls nicht in einer Action gerufen werden 620 pWrtShell->StartUndo(UNDO_INSGLOSSARY); 621 if( aStartMacro.GetMacName().Len() ) 622 pWrtShell->ExecMacro( aStartMacro ); 623 if(pWrtShell->HasSelection()) 624 pWrtShell->DelLeft(); 625 pWrtShell->StartAllAction(); 626 627 // alle InputFelder zwischenspeichern 628 SwInputFieldList aFldLst( pWrtShell, sal_True ); 629 630 pWrtShell->InsertGlossary(*pGlossary, aShortName); 631 pWrtShell->EndAllAction(); 632 if( aEndMacro.GetMacName().Len() ) 633 { 634 pWrtShell->ExecMacro( aEndMacro ); 635 } 636 pWrtShell->EndUndo(UNDO_INSGLOSSARY); 637 638 // für alle neuen InputFelder die Eingaben abfordern 639 if( aFldLst.BuildSortLst() ) 640 pWrtShell->UpdateInputFlds( &aFldLst ); 641 } 642 pGlossaries->PutGroupDoc(pGlossary); 643 return sal_True; 644 } 645 646 /*------------------------------------------------------------------------ 647 Beschreibung: Textbaustein einfuegen 648 ------------------------------------------------------------------------*/ 649 650 651 sal_Bool SwGlossaryHdl::InsertGlossary(const String &rName) 652 { 653 ASSERT(pWrtShell->CanInsert(), illegal); 654 655 SwTextBlocks *pGlos = 656 pCurGrp? pCurGrp: rStatGlossaries.GetGroupDoc(aCurGrp); 657 658 if (!pGlos) 659 return sal_False; 660 661 SvxMacro aStartMacro(aEmptyStr, aEmptyStr, STARBASIC); 662 SvxMacro aEndMacro(aEmptyStr, aEmptyStr, STARBASIC); 663 GetMacros( rName, aStartMacro, aEndMacro, pGlos ); 664 665 // StartAction darf nicht vor HasSelection und DelRight stehen, 666 // sonst wird der mögliche Shellwechsel verzögert und 667 // API-Programme würden dann hängenbleiben 668 // ausserdem darf das Ereignismacro ebenfalls nicht in einer Action gerufen werden 669 if( aStartMacro.GetMacName().Len() ) 670 pWrtShell->ExecMacro( aStartMacro ); 671 if( pWrtShell->HasSelection() ) 672 pWrtShell->DelRight(); 673 pWrtShell->StartAllAction(); 674 675 // alle InputFelder zwischenspeichern 676 SwInputFieldList aFldLst( pWrtShell, sal_True ); 677 678 pWrtShell->InsertGlossary(*pGlos, rName); 679 pWrtShell->EndAllAction(); 680 if( aEndMacro.GetMacName().Len() ) 681 { 682 pWrtShell->ExecMacro( aEndMacro ); 683 } 684 685 // fuer alle neuen InputFelder die Eingaben abfordern 686 if( aFldLst.BuildSortLst() ) 687 pWrtShell->UpdateInputFlds( &aFldLst ); 688 689 if(!pCurGrp) 690 rStatGlossaries.PutGroupDoc(pGlos); 691 return sal_True; 692 } 693 694 /*------------------------------------------------------------------------ 695 Beschreibung: Macro setzen / erfragen 696 ------------------------------------------------------------------------*/ 697 698 699 void SwGlossaryHdl::SetMacros(const String& rShortName, 700 const SvxMacro* pStart, 701 const SvxMacro* pEnd, 702 SwTextBlocks *pGlossary ) 703 { 704 SwTextBlocks *pGlos = pGlossary ? pGlossary : 705 pCurGrp ? pCurGrp 706 : rStatGlossaries.GetGroupDoc( aCurGrp ); 707 SvxMacroTableDtor aMacroTbl; 708 if( pStart ) 709 aMacroTbl.Insert( SW_EVENT_START_INS_GLOSSARY, new SvxMacro(*pStart)); 710 if( pEnd ) 711 aMacroTbl.Insert( SW_EVENT_END_INS_GLOSSARY, new SvxMacro(*pEnd)); 712 sal_uInt16 nIdx = pGlos->GetIndex( rShortName ); 713 if( !pGlos->SetMacroTable( nIdx, aMacroTbl ) && pGlos->GetError() ) 714 ErrorHandler::HandleError( pGlos->GetError() ); 715 716 if(!pCurGrp && !pGlossary) 717 rStatGlossaries.PutGroupDoc(pGlos); 718 } 719 720 void SwGlossaryHdl::GetMacros( const String &rShortName, 721 SvxMacro& rStart, 722 SvxMacro& rEnd, 723 SwTextBlocks *pGlossary ) 724 { 725 SwTextBlocks *pGlos = pGlossary ? pGlossary 726 : pCurGrp ? pCurGrp 727 : rStatGlossaries.GetGroupDoc(aCurGrp); 728 sal_uInt16 nIndex = pGlos->GetIndex( rShortName ); 729 if( nIndex != USHRT_MAX ) 730 { 731 SvxMacroTableDtor aMacroTbl; 732 if( pGlos->GetMacroTable( nIndex, aMacroTbl ) ) 733 { 734 SvxMacro *pMacro = aMacroTbl.Get( SW_EVENT_START_INS_GLOSSARY ); 735 if( pMacro ) 736 rStart = *pMacro; 737 738 pMacro = aMacroTbl.Get( SW_EVENT_END_INS_GLOSSARY ); 739 if( pMacro ) 740 rEnd = *pMacro; 741 } 742 } 743 744 if( !pCurGrp && !pGlossary ) 745 rStatGlossaries.PutGroupDoc( pGlos ); 746 } 747 748 749 /*------------------------------------------------------------------------ 750 Beschreibung: ctor, dtor 751 ------------------------------------------------------------------------*/ 752 753 754 SwGlossaryHdl::SwGlossaryHdl(SfxViewFrame* pVwFrm, SwWrtShell *pSh) 755 : rStatGlossaries( *::GetGlossaries() ), 756 aCurGrp( rStatGlossaries.GetDefName() ), 757 pViewFrame( pVwFrm ), 758 pWrtShell( pSh ), 759 pCurGrp( 0 ) 760 { 761 } 762 763 764 SwGlossaryHdl::~SwGlossaryHdl() 765 { 766 if( pCurGrp ) 767 rStatGlossaries.PutGroupDoc( pCurGrp ); 768 } 769 770 /*------------------------------------------------------------------------ 771 Beschreibung: Umbenennen eines Textbausteines 772 ------------------------------------------------------------------------*/ 773 774 775 sal_Bool SwGlossaryHdl::Rename(const String& rOldShort, const String& rNewShortName, 776 const String& rNewName ) 777 { 778 sal_Bool bRet = sal_False; 779 SwTextBlocks *pGlossary = pCurGrp ? pCurGrp 780 : rStatGlossaries.GetGroupDoc(aCurGrp); 781 if(pGlossary) 782 { 783 if(!ConvertToNew(*pGlossary)) 784 return sal_False; 785 786 sal_uInt16 nIdx = pGlossary->GetIndex( rOldShort ); 787 sal_uInt16 nOldLongIdx = pGlossary->GetLongIndex( rNewName ); 788 sal_uInt16 nOldIdx = pGlossary->GetIndex( rNewShortName ); 789 790 if( nIdx != USHRT_MAX && 791 (nOldLongIdx == USHRT_MAX || nOldLongIdx == nIdx )&& 792 (nOldIdx == USHRT_MAX || nOldIdx == nIdx )) 793 { 794 String aNewShort( rNewShortName ); 795 String aNewName( rNewName ); 796 pGlossary->Rename( nIdx, &aNewShort, &aNewName ); 797 bRet = pGlossary->GetError() == 0; 798 } 799 if( !pCurGrp ) 800 rStatGlossaries.PutGroupDoc(pGlossary); 801 } 802 return bRet; 803 } 804 805 806 sal_Bool SwGlossaryHdl::IsReadOnly( const String* pGrpNm ) const 807 { 808 SwTextBlocks *pGlossary = 0; 809 810 if (pGrpNm) 811 pGlossary = rStatGlossaries.GetGroupDoc( *pGrpNm ); 812 else if (pCurGrp) 813 pGlossary = pCurGrp; 814 else 815 pGlossary = rStatGlossaries.GetGroupDoc(aCurGrp); 816 817 sal_Bool bRet = pGlossary ? pGlossary->IsReadOnly() : sal_True; 818 if( pGrpNm || !pCurGrp ) 819 delete pGlossary; 820 return bRet; 821 } 822 823 824 sal_Bool SwGlossaryHdl::IsOld() const 825 { 826 SwTextBlocks *pGlossary = pCurGrp ? pCurGrp 827 : rStatGlossaries.GetGroupDoc(aCurGrp); 828 sal_Bool bRet = pGlossary ? pGlossary->IsOld() : sal_False; 829 if( !pCurGrp ) 830 delete pGlossary; 831 return bRet; 832 } 833 834 /*-----------------09.06.97 16:15------------------- 835 Gruppe ohne Pfadindex finden 836 --------------------------------------------------*/ 837 sal_Bool SwGlossaryHdl::FindGroupName(String & rGroup) 838 { 839 return rStatGlossaries.FindGroupName(rGroup); 840 } 841 842 /* -----------------29.07.99 08:34------------------- 843 844 --------------------------------------------------*/ 845 sal_Bool SwGlossaryHdl::CopyToClipboard(SwWrtShell& rSh, const String& rShortName) 846 { 847 SwTextBlocks *pGlossary = pCurGrp ? pCurGrp 848 : rStatGlossaries.GetGroupDoc(aCurGrp); 849 850 SwTransferable* pTransfer = new SwTransferable( rSh ); 851 /*??*/uno::Reference< 852 datatransfer::XTransferable > xRef( pTransfer ); 853 854 int nRet = pTransfer->CopyGlossary( *pGlossary, rShortName ); 855 if( !pCurGrp ) 856 rStatGlossaries.PutGroupDoc( pGlossary ); 857 return 0 != nRet; 858 } 859 860 sal_Bool SwGlossaryHdl::ImportGlossaries( const String& rName ) 861 { 862 sal_Bool bRet = sal_False; 863 if( rName.Len() ) 864 { 865 const SfxFilter* pFilter = 0; 866 SfxMedium* pMed = new SfxMedium( rName, STREAM_READ, sal_True, 0, 0 ); 867 SfxFilterMatcher aMatcher( String::CreateFromAscii("swriter") ); 868 pMed->UseInteractionHandler( sal_True ); 869 if( !aMatcher.GuessFilter( *pMed, &pFilter, sal_False ) ) 870 { 871 SwTextBlocks *pGlossary; 872 pMed->SetFilter( pFilter ); 873 Reader* pR = SwReaderWriter::GetReader( pFilter->GetUserData() ); 874 if( pR && 0 != ( pGlossary = pCurGrp ? pCurGrp 875 : rStatGlossaries.GetGroupDoc(aCurGrp)) ) 876 { 877 SwReader aReader( *pMed, rName ); 878 if( aReader.HasGlossaries( *pR ) ) 879 { 880 const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); 881 bRet = aReader.ReadGlossaries( *pR, *pGlossary, 882 pCfg->IsSaveRelFile() ); 883 } 884 } 885 } 886 DELETEZ(pMed); 887 } 888 return bRet; 889 } 890 891 /* vim: set noet sw=4 ts=4: */ 892