1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 #ifdef SW_DLLIMPLEMENTATION 27 #undef SW_DLLIMPLEMENTATION 28 #endif 29 #include <mmaddressblockpage.hxx> 30 #include <mailmergewizard.hxx> 31 #include <swtypes.hxx> 32 #include <addresslistdialog.hxx> 33 #include <svtools/xtextedt.hxx> 34 #include <svtools/txtattr.hxx> 35 #include <vcl/msgbox.hxx> 36 #include <mmconfigitem.hxx> 37 #include <com/sun/star/container/XNameAccess.hpp> 38 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> 39 #include <com/sun/star/sdb/XColumn.hpp> 40 41 #include <vector> 42 #include <mmaddressblockpage.hrc> 43 #include <dbui.hrc> 44 #include <helpid.h> 45 46 using namespace svt; 47 using namespace ::com::sun::star; 48 using namespace ::com::sun::star::container; 49 using namespace ::com::sun::star::sdb; 50 using namespace ::com::sun::star::sdbc; 51 using namespace ::com::sun::star::sdbcx; 52 53 //------------------------------------------------------------------------- 54 void lcl_Move(Control* pCtrl, long nYOffset) 55 { 56 Point aPos(pCtrl->GetPosPixel()); 57 aPos.Y() += nYOffset; 58 pCtrl->SetPosPixel(aPos); 59 } 60 /*-- 02.04.2004 12:46:40--------------------------------------------------- 61 62 -----------------------------------------------------------------------*/ 63 SwMailMergeAddressBlockPage::SwMailMergeAddressBlockPage( SwMailMergeWizard* _pParent) : 64 svt::OWizardPage(_pParent, SW_RES(DLG_MM_ADDRESSBLOCK_PAGE)), 65 #ifdef MSC 66 #pragma warning (disable : 4355) 67 #endif 68 m_aHeaderFI( this, SW_RES( FI_HEADER ) ), 69 m_aFirstFI( this, SW_RES( FI_FIRST ) ), 70 m_aAddressListFI( this, SW_RES( FI_ADDRESSLIST ) ), 71 m_aAddressListPB( this, SW_RES( PB_ADDRESSLIST ) ), 72 m_aCurrentAddressFI( this, SW_RES( FI_CURRENTADDRESS ) ), 73 m_aFirstFL( this, SW_RES( FL_FIRST ) ), 74 m_aSecondFI( this, SW_RES( FI_SECOND )), 75 m_aSettingsFI( this, SW_RES( FI_SECOND ) ), 76 m_aAddressCB( this, SW_RES( CB_ADDRESS ) ), 77 m_aSettingsWIN( this, SW_RES( WIN_SETTINGS ) ), 78 m_aSettingsPB( this, SW_RES( PB_SETTINGS ) ), 79 m_aHideEmptyParagraphsCB( this, SW_RES( CB_HIDE_EMPTY_PARA ) ), 80 m_aSecondFL( this, SW_RES( FL_SECOND )), 81 m_aThirdFI( this, SW_RES( FI_THIRD ) ), 82 m_aMatchFieldsFI( this, SW_RES( FI_MATCH_FIELDS ) ), 83 m_aAssignPB( this, SW_RES( PB_ASSIGN ) ), 84 m_aThirdFL( this, SW_RES( FL_THIRD ) ), 85 m_aFourthFI( this, SW_RES( FI_FOURTH ) ), 86 m_aPreviewFI( this, SW_RES( FI_PREVIEW ) ), 87 m_aPreviewWIN( this, SW_RES( WIN_PREVIEW ) ), 88 m_aDocumentIndexFI( this, SW_RES( FI_DOCINDEX ) ), 89 m_aPrevSetIB( this, SW_RES( IB_PREVSET ) ), 90 m_aNextSetIB( this, SW_RES( IB_NEXTSET ) ), 91 #ifdef MSC 92 #pragma warning (default : 4355) 93 #endif 94 m_sDocument( SW_RES( STR_DOCUMENT ) ), 95 m_sChangeAddress( SW_RES( STR_CHANGEADDRESS )), 96 m_pWizard(_pParent) 97 { 98 FreeResource(); 99 m_sCurrentAddress = m_aCurrentAddressFI.GetText(); 100 m_aAddressListPB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, AddressListHdl_Impl)); 101 m_aSettingsPB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, SettingsHdl_Impl)); 102 m_aAssignPB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, AssignHdl_Impl )); 103 m_aAddressCB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, AddressBlockHdl_Impl)); 104 m_aSettingsWIN.SetSelectHdl(LINK(this, SwMailMergeAddressBlockPage, AddressBlockSelectHdl_Impl)); 105 m_aHideEmptyParagraphsCB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, HideParagraphsHdl_Impl)); 106 107 Link aLink = LINK(this, SwMailMergeAddressBlockPage, InsertDataHdl_Impl); 108 m_aPrevSetIB.SetClickHdl(aLink); 109 m_aNextSetIB.SetClickHdl(aLink); 110 } 111 /*-- 02.04.2004 12:46:40--------------------------------------------------- 112 113 -----------------------------------------------------------------------*/ 114 SwMailMergeAddressBlockPage::~SwMailMergeAddressBlockPage() 115 { 116 } 117 /*-- 05.07.2004 13:55:15--------------------------------------------------- 118 119 -----------------------------------------------------------------------*/ 120 bool SwMailMergeAddressBlockPage::canAdvance() const 121 { 122 return m_pWizard->GetConfigItem().GetResultSet().is(); 123 } 124 /*-- 16.06.2004 12:34:09--------------------------------------------------- 125 126 -----------------------------------------------------------------------*/ 127 void SwMailMergeAddressBlockPage::ActivatePage() 128 { 129 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 130 bool bIsLetter = rConfigItem.IsOutputToLetter(); 131 132 //no address block is created for e-Mail 133 m_aSettingsFI.Show( bIsLetter ); 134 m_aAddressCB.Show( bIsLetter ); 135 m_aSettingsWIN.Show( bIsLetter ); 136 m_aSettingsPB.Show( bIsLetter ); 137 m_aPreviewFI.Show( bIsLetter ); 138 m_aPreviewWIN.Show( bIsLetter ); 139 m_aAssignPB.Show( bIsLetter ); 140 m_aDocumentIndexFI.Show( bIsLetter ); 141 m_aPrevSetIB.Show( bIsLetter ); 142 m_aNextSetIB.Show( bIsLetter ); 143 m_aHideEmptyParagraphsCB.Show( bIsLetter ); 144 m_aSecondFL.Show( bIsLetter ); 145 m_aSecondFI.Show( bIsLetter ); 146 m_aSettingsFI.Show( bIsLetter ); 147 m_aMatchFieldsFI.Show( bIsLetter ); 148 m_aThirdFI.Show( bIsLetter ); 149 m_aThirdFL.Show( bIsLetter ); 150 m_aFourthFI.Show( bIsLetter ); 151 152 if(bIsLetter) 153 { 154 m_aHideEmptyParagraphsCB.Check( rConfigItem.IsHideEmptyParagraphs() ); 155 String sTemp(m_sDocument); 156 sTemp.SearchAndReplaceAscii("%1", String::CreateFromInt32(1)); 157 m_aDocumentIndexFI.SetText(sTemp); 158 159 m_aSettingsWIN.Clear(); 160 const uno::Sequence< ::rtl::OUString> aBlocks = 161 m_pWizard->GetConfigItem().GetAddressBlocks(); 162 for(sal_Int32 nAddress = 0; nAddress < aBlocks.getLength(); ++nAddress) 163 m_aSettingsWIN.AddAddress(aBlocks[nAddress]); 164 m_aSettingsWIN.SelectAddress((sal_uInt16)rConfigItem.GetCurrentAddressBlockIndex()); 165 m_aAddressCB.Check(rConfigItem.IsAddressBlock()); 166 AddressBlockHdl_Impl(&m_aAddressCB); 167 m_aSettingsWIN.SetLayout(1, 2); 168 InsertDataHdl_Impl(0); 169 } 170 } 171 /*-- 27.05.2004 13:59:15--------------------------------------------------- 172 173 -----------------------------------------------------------------------*/ 174 sal_Bool SwMailMergeAddressBlockPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason ) 175 { 176 if ( ::svt::WizardTypes::eTravelForward == _eReason && !m_pWizard->GetConfigItem().GetResultSet().is() ) 177 return sal_False; 178 return sal_True; 179 } 180 /*-- 07.04.2004 16:19:30--------------------------------------------------- 181 182 -----------------------------------------------------------------------*/ 183 IMPL_LINK(SwMailMergeAddressBlockPage, AddressListHdl_Impl, PushButton*, EMPTYARG) 184 { 185 SwAddressListDialog* pAddrDialog = new SwAddressListDialog(this); 186 if(RET_OK == pAddrDialog->Execute()) 187 { 188 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 189 rConfigItem.SetCurrentConnection( 190 pAddrDialog->GetSource(), 191 pAddrDialog->GetConnection(), 192 pAddrDialog->GetColumnsSupplier(), 193 pAddrDialog->GetDBData()); 194 ::rtl::OUString sFilter = pAddrDialog->GetFilter(); 195 rConfigItem.SetFilter( sFilter ); 196 InsertDataHdl_Impl(0); 197 GetWizard()->UpdateRoadmap(); 198 GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); 199 } 200 delete pAddrDialog; 201 return 0; 202 } 203 /*-- 07.04.2004 16:19:30--------------------------------------------------- 204 205 -----------------------------------------------------------------------*/ 206 IMPL_LINK(SwMailMergeAddressBlockPage, SettingsHdl_Impl, PushButton*, pButton) 207 { 208 SwSelectAddressBlockDialog* pDlg = 209 new SwSelectAddressBlockDialog(pButton, m_pWizard->GetConfigItem()); 210 SwMailMergeConfigItem& rConfig = m_pWizard->GetConfigItem(); 211 pDlg->SetAddressBlocks(rConfig.GetAddressBlocks(), m_aSettingsWIN.GetSelectedAddress()); 212 pDlg->SetSettings(rConfig.IsIncludeCountry(), rConfig.GetExcludeCountry()); 213 if(RET_OK == pDlg->Execute()) 214 { 215 //the dialog provides the selected address at the first position! 216 const uno::Sequence< ::rtl::OUString> aBlocks = 217 pDlg->GetAddressBlocks(); 218 rConfig.SetAddressBlocks(aBlocks); 219 m_aSettingsWIN.Clear(); 220 for(sal_Int32 nAddress = 0; nAddress < aBlocks.getLength(); ++nAddress) 221 m_aSettingsWIN.AddAddress(aBlocks[nAddress]); 222 m_aSettingsWIN.SelectAddress(0); 223 m_aSettingsWIN.Invalidate(); // #i40408 224 rConfig.SetCountrySettings(pDlg->IsIncludeCountry(), pDlg->GetCountry()); 225 InsertDataHdl_Impl(0); 226 } 227 delete pDlg; 228 GetWizard()->UpdateRoadmap(); 229 GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); 230 return 0; 231 } 232 /*-- 07.04.2004 16:19:31--------------------------------------------------- 233 234 -----------------------------------------------------------------------*/ 235 IMPL_LINK(SwMailMergeAddressBlockPage, AssignHdl_Impl, PushButton*, pButton) 236 { 237 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 238 sal_uInt16 nSel = m_aSettingsWIN.GetSelectedAddress(); 239 const uno::Sequence< ::rtl::OUString> aBlocks = rConfigItem.GetAddressBlocks(); 240 SwAssignFieldsDialog* pDlg = 241 new SwAssignFieldsDialog(pButton, m_pWizard->GetConfigItem(), aBlocks[nSel], true); 242 if(RET_OK == pDlg->Execute()) 243 { 244 //preview update 245 InsertDataHdl_Impl(0); 246 GetWizard()->UpdateRoadmap(); 247 GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); 248 } 249 delete pDlg; 250 return 0; 251 } 252 /*-- 11.06.2004 13:37:22--------------------------------------------------- 253 254 -----------------------------------------------------------------------*/ 255 void SwMailMergeAddressBlockPage::EnableAddressBlock(sal_Bool bAll, sal_Bool bSelective) 256 { 257 m_aSettingsFI.Enable(bAll); 258 m_aAddressCB.Enable(bAll); 259 bSelective &= bAll; 260 m_aHideEmptyParagraphsCB.Enable(bSelective); 261 m_aSettingsWIN.Enable(bSelective); 262 m_aSettingsPB.Enable(bSelective); 263 m_aPreviewFI.Enable(bSelective); 264 m_aPreviewWIN.Enable(bSelective); 265 m_aThirdFI.Enable(bSelective); 266 m_aMatchFieldsFI.Enable(bSelective); 267 m_aAssignPB.Enable(bSelective); 268 m_aDocumentIndexFI.Enable(bSelective); 269 m_aPrevSetIB.Enable(bSelective); 270 m_aNextSetIB.Enable(bSelective); 271 } 272 /*-- 28.04.2004 12:45:58--------------------------------------------------- 273 274 -----------------------------------------------------------------------*/ 275 IMPL_LINK(SwMailMergeAddressBlockPage, AddressBlockHdl_Impl, CheckBox*, pBox) 276 { 277 EnableAddressBlock(pBox->IsEnabled(), pBox->IsChecked()); 278 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 279 rConfigItem.SetAddressBlock(m_aAddressCB.IsChecked()); 280 m_pWizard->UpdateRoadmap(); 281 return 0; 282 } 283 /*-- 08.06.2004 13:00:29--------------------------------------------------- 284 285 -----------------------------------------------------------------------*/ 286 IMPL_LINK(SwMailMergeAddressBlockPage, AddressBlockSelectHdl_Impl, SwAddressPreview*, EMPTYARG) 287 { 288 sal_uInt16 nSel = m_aSettingsWIN.GetSelectedAddress(); 289 const uno::Sequence< ::rtl::OUString> aBlocks = 290 m_pWizard->GetConfigItem().GetAddressBlocks(); 291 String sPreview = SwAddressPreview::FillData(aBlocks[nSel], m_pWizard->GetConfigItem()); 292 m_aPreviewWIN.SetAddress(sPreview); 293 m_pWizard->GetConfigItem().SetCurrentAddressBlockIndex( nSel ); 294 GetWizard()->UpdateRoadmap(); 295 GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); 296 return 0; 297 } 298 /*-- 31.08.2005 15:34:55--------------------------------------------------- 299 300 -----------------------------------------------------------------------*/ 301 IMPL_LINK(SwMailMergeAddressBlockPage, HideParagraphsHdl_Impl, CheckBox*, pBox) 302 { 303 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 304 rConfigItem.SetHideEmptyParagraphs( pBox->IsChecked() ); 305 return 0; 306 } 307 308 // ------------------------------------------------------------------------------ 309 IMPL_LINK(SwMailMergeAddressBlockPage, InsertDataHdl_Impl, ImageButton*, pButton) 310 { 311 //if no pButton is given, the first set has to be pre-set 312 SwMailMergeConfigItem& rConfig = m_pWizard->GetConfigItem(); 313 m_pWizard->EnterWait(); 314 if(!pButton) 315 { 316 rConfig.GetResultSet(); 317 } 318 else 319 { 320 sal_Bool bNext = pButton == &m_aNextSetIB; 321 sal_Int32 nPos = rConfig.GetResultSetPosition(); 322 rConfig.MoveResultSet( bNext ? ++nPos : --nPos); 323 } 324 m_pWizard->LeaveWait(); 325 sal_Int32 nPos = rConfig.GetResultSetPosition(); 326 sal_Bool bEnable = sal_True; 327 if(nPos < 1) 328 { 329 bEnable = sal_False; 330 nPos = 1; 331 } 332 else 333 { 334 //if output type is letter 335 if(m_aSettingsWIN.IsVisible()) 336 { 337 //Fill data into preview 338 sal_uInt16 nSel = m_aSettingsWIN.GetSelectedAddress(); 339 const uno::Sequence< ::rtl::OUString> aBlocks = 340 m_pWizard->GetConfigItem().GetAddressBlocks(); 341 String sPreview = SwAddressPreview::FillData(aBlocks[nSel], rConfig); 342 m_aPreviewWIN.SetAddress(sPreview); 343 } 344 } 345 m_aPrevSetIB.Enable(bEnable); 346 //m_aNextSetIB.Enable(bEnable); 347 //m_aDocumentIndexFI.Enable(bEnable); 348 String sTemp(m_sDocument); 349 sTemp.SearchAndReplaceAscii("%1", String::CreateFromInt32(nPos)); 350 m_aDocumentIndexFI.SetText(sTemp); 351 352 GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); 353 sal_Bool bHasResultSet = rConfig.GetResultSet().is(); 354 m_aCurrentAddressFI.Show(bHasResultSet); 355 if(bHasResultSet) 356 { 357 String sTmp = m_sCurrentAddress; 358 sTmp.SearchAndReplaceAscii("%1", rConfig.GetCurrentDBData().sDataSource ); 359 m_aCurrentAddressFI.SetText(sTmp); 360 m_aAddressListPB.SetText(m_sChangeAddress); 361 } 362 EnableAddressBlock(bHasResultSet, m_aAddressCB.IsChecked()); 363 return 0; 364 } 365 /*-- 13.04.2004 16:01:26--------------------------------------------------- 366 367 -----------------------------------------------------------------------*/ 368 SwSelectAddressBlockDialog::SwSelectAddressBlockDialog( 369 Window* pParent, SwMailMergeConfigItem& rConfig) : 370 SfxModalDialog(pParent, SW_RES(DLG_MM_SELECTADDRESSBLOCK)), 371 #ifdef MSC 372 #pragma warning (disable : 4355) 373 #endif 374 m_aSelectFT( this, SW_RES( FT_SELECT)), 375 m_aPreview( this, SW_RES( WIN_PREVIEW)), 376 m_aNewPB( this, SW_RES( PB_NEW)), 377 m_aCustomizePB( this, SW_RES( PB_CUSTOMIZE)), 378 m_aDeletePB( this, SW_RES( PB_DELETE)), 379 m_aSettingsFI( this, SW_RES( FI_SETTINGS)), 380 m_aNeverRB( this, SW_RES( RB_NEVER)), 381 m_aAlwaysRB( this, SW_RES( RB_ALWAYS)), 382 m_aDependentRB( this, SW_RES( RB_DEPENDENT)), 383 m_aCountryED( this, SW_RES( ED_COUNTRY)), 384 m_aSeparatorFL( this, SW_RES( FL_SEPARATOR)), 385 m_aOK( this, SW_RES( PB_OK)), 386 m_aCancel( this, SW_RES( PB_CANCEL)), 387 m_aHelp( this, SW_RES( PB_HELP)), 388 #ifdef MSC 389 #pragma warning (default : 4355) 390 #endif 391 m_rConfig(rConfig) 392 { 393 FreeResource(); 394 395 Link aCustomizeHdl = LINK(this, SwSelectAddressBlockDialog, NewCustomizeHdl_Impl); 396 m_aNewPB.SetClickHdl(aCustomizeHdl); 397 m_aCustomizePB.SetClickHdl(aCustomizeHdl); 398 399 m_aDeletePB.SetClickHdl(LINK(this, SwSelectAddressBlockDialog, DeleteHdl_Impl)); 400 401 Link aLk = LINK(this, SwSelectAddressBlockDialog, IncludeHdl_Impl); 402 m_aNeverRB.SetClickHdl(aLk); 403 m_aAlwaysRB.SetClickHdl(aLk); 404 m_aDependentRB.SetClickHdl(aLk); 405 m_aPreview.SetLayout(2, 2); 406 m_aPreview.EnableScrollBar(); 407 } 408 /*-- 13.04.2004 16:01:27--------------------------------------------------- 409 410 -----------------------------------------------------------------------*/ 411 SwSelectAddressBlockDialog::~SwSelectAddressBlockDialog() 412 { 413 } 414 /*-- 28.04.2004 11:48:11--------------------------------------------------- 415 416 -----------------------------------------------------------------------*/ 417 void SwSelectAddressBlockDialog::SetAddressBlocks(const uno::Sequence< ::rtl::OUString>& rBlocks, 418 sal_uInt16 nSelectedAddress) 419 { 420 m_aAddressBlocks = rBlocks; 421 for(sal_Int32 nAddress = 0; nAddress < m_aAddressBlocks.getLength(); ++nAddress) 422 m_aPreview.AddAddress(m_aAddressBlocks[nAddress]); 423 m_aPreview.SelectAddress(nSelectedAddress); 424 } 425 /*-- 25.06.2004 10:51:36--------------------------------------------------- 426 return the address blocks and put the selected one to the first position 427 -----------------------------------------------------------------------*/ 428 const uno::Sequence< ::rtl::OUString >& SwSelectAddressBlockDialog::GetAddressBlocks() 429 { 430 //put the selected block to the first position 431 sal_uInt16 nSelect = m_aPreview.GetSelectedAddress(); 432 if(nSelect) 433 { 434 uno::Sequence< ::rtl::OUString >aTemp = m_aAddressBlocks; 435 ::rtl::OUString* pTemp = aTemp.getArray(); 436 pTemp[0] = m_aAddressBlocks[nSelect]; 437 sal_uInt32 nIndex = 0; 438 const sal_uInt32 nNumBlocks = m_aAddressBlocks.getLength(); 439 for(sal_uInt32 nAddress = 1; nAddress < nNumBlocks; ++nAddress) 440 { 441 if(nIndex == nSelect) 442 ++nIndex; 443 pTemp[nAddress] = m_aAddressBlocks[nIndex]; 444 nIndex++; 445 } 446 m_aAddressBlocks = aTemp; 447 } 448 return m_aAddressBlocks; 449 } 450 /*-- 28.04.2004 11:48:11--------------------------------------------------- 451 452 -----------------------------------------------------------------------*/ 453 void SwSelectAddressBlockDialog::SetSettings( 454 sal_Bool bIsCountry, ::rtl::OUString rCountry) 455 { 456 if(bIsCountry) 457 { 458 rCountry.getLength() ? m_aDependentRB.Check() : m_aAlwaysRB.Check(); 459 m_aCountryED.SetText(rCountry); 460 } 461 else 462 m_aNeverRB.Check(); 463 m_aDeletePB.Enable(m_aAddressBlocks.getLength() > 1); 464 } 465 /*-- 10.05.2004 11:17:06--------------------------------------------------- 466 467 -----------------------------------------------------------------------*/ 468 ::rtl::OUString SwSelectAddressBlockDialog::GetCountry() const 469 { 470 ::rtl::OUString sRet; 471 if(m_aDependentRB.IsChecked()) 472 sRet = m_aCountryED.GetText(); 473 return sRet; 474 } 475 476 /*-- 13.04.2004 16:02:32--------------------------------------------------- 477 478 -----------------------------------------------------------------------*/ 479 IMPL_LINK(SwSelectAddressBlockDialog, DeleteHdl_Impl, PushButton*, pButton) 480 { 481 if(m_aAddressBlocks.getLength()) 482 { 483 sal_uInt16 nSelected = m_aPreview.GetSelectedAddress(); 484 ::rtl::OUString* pAddressBlocks = m_aAddressBlocks.getArray(); 485 sal_Int32 nSource = 0; 486 for(sal_Int32 nTarget = 0; nTarget < m_aAddressBlocks.getLength() - 1; nTarget++) 487 { 488 if(nSource == nSelected) 489 ++nSource; 490 pAddressBlocks[nTarget] = pAddressBlocks[nSource++]; 491 } 492 m_aAddressBlocks.realloc(m_aAddressBlocks.getLength() - 1); 493 if(m_aAddressBlocks.getLength() <= 1) 494 pButton->Enable(sal_False); 495 m_aPreview.RemoveSelectedAddress(); 496 } 497 return 0; 498 } 499 /*-- 13.04.2004 16:02:32--------------------------------------------------- 500 501 -----------------------------------------------------------------------*/ 502 IMPL_LINK(SwSelectAddressBlockDialog, NewCustomizeHdl_Impl, PushButton*, pButton) 503 { 504 bool bCustomize = pButton == &m_aCustomizePB; 505 SwCustomizeAddressBlockDialog::DialogType nType = bCustomize ? 506 SwCustomizeAddressBlockDialog::ADDRESSBLOCK_EDIT : 507 SwCustomizeAddressBlockDialog::ADDRESSBLOCK_NEW; 508 SwCustomizeAddressBlockDialog *pDlg = 509 new SwCustomizeAddressBlockDialog(pButton,m_rConfig,nType); 510 if(bCustomize) 511 { 512 pDlg->SetAddress(m_aAddressBlocks[m_aPreview.GetSelectedAddress()]); 513 } 514 if(RET_OK == pDlg->Execute()) 515 { 516 if(bCustomize) 517 { 518 ::rtl::OUString sNew = pDlg->GetAddress(); 519 m_aPreview.ReplaceSelectedAddress(sNew); 520 m_aAddressBlocks[m_aPreview.GetSelectedAddress()] = sNew; 521 } 522 else 523 { 524 ::rtl::OUString sNew = pDlg->GetAddress(); 525 m_aPreview.AddAddress(sNew); 526 m_aAddressBlocks.realloc(m_aAddressBlocks.getLength() + 1); 527 sal_uInt16 nSelect = (sal_uInt16)m_aAddressBlocks.getLength() - 1; 528 m_aAddressBlocks[nSelect] = sNew; 529 m_aPreview.SelectAddress(nSelect); 530 } 531 m_aDeletePB.Enable( m_aAddressBlocks.getLength() > 1); 532 } 533 delete pDlg; 534 return 0; 535 } 536 /*-- 13.04.2004 16:02:33--------------------------------------------------- 537 538 -----------------------------------------------------------------------*/ 539 IMPL_LINK(SwSelectAddressBlockDialog, IncludeHdl_Impl, RadioButton*, pButton) 540 { 541 m_aCountryED.Enable(&m_aDependentRB == pButton); 542 return 0; 543 } 544 545 /* -----------------------------28.02.05 09:00-------------------------------- 546 547 ---------------------------------------------------------------------------*/ 548 SwRestrictedComboBox::~SwRestrictedComboBox() 549 { 550 } 551 /* -----------------------------28.02.05 09:00-------------------------------- 552 553 ---------------------------------------------------------------------------*/ 554 void SwRestrictedComboBox::KeyInput(const KeyEvent& rEvt) 555 { 556 sal_Bool bCallParent = sal_True; 557 if(rEvt.GetCharCode()) 558 { 559 String sKey = rEvt.GetCharCode(); 560 if( STRING_NOTFOUND != sForbiddenChars.Search(sKey)) 561 bCallParent = sal_False; 562 } 563 if(bCallParent) 564 ComboBox::KeyInput(rEvt); 565 } 566 /* -----------------------------28.02.05 09:00-------------------------------- 567 568 ---------------------------------------------------------------------------*/ 569 void SwRestrictedComboBox::Modify() 570 { 571 Selection aSel = GetSelection(); 572 String sTemp = GetText(); 573 for(sal_uInt16 i = 0; i < sForbiddenChars.Len(); i++) 574 { 575 sTemp.EraseAllChars( sForbiddenChars.GetChar(i) ); 576 } 577 sal_uInt16 nDiff = GetText().Len() - sTemp.Len(); 578 if(nDiff) 579 { 580 aSel.setMin(aSel.getMin() - nDiff); 581 aSel.setMax(aSel.getMin()); 582 SetText(sTemp); 583 SetSelection(aSel); 584 } 585 if(GetModifyHdl().IsSet()) 586 GetModifyHdl().Call(this); 587 } 588 589 /*-- 13.04.2004 16:01:08--------------------------------------------------- 590 591 -----------------------------------------------------------------------*/ 592 #define USER_DATA_SALUTATION -1 593 #define USER_DATA_PUNCTUATION -2 594 #define USER_DATA_TEXT -3 595 #define USER_DATA_NONE -4 596 597 SwCustomizeAddressBlockDialog::SwCustomizeAddressBlockDialog( 598 Window* pParent, SwMailMergeConfigItem& rConfig, DialogType eType) : 599 SfxModalDialog(pParent, SW_RES(DLG_MM_CUSTOMIZEADDRESSBLOCK)), 600 #ifdef MSC 601 #pragma warning (disable : 4355) 602 #endif 603 m_aAddressElementsFT( this, SW_RES( FT_ADDRESSELEMENTS )), 604 m_aAddressElementsLB( this, SW_RES( LB_ADDRESSELEMENTS )), 605 m_aInsertFieldIB( this, SW_RES( IB_INSERTFIELD )), 606 m_aRemoveFieldIB( this, SW_RES( IB_REMOVEFIELD )), 607 m_aDragFT( this, SW_RES( FT_DRAG )), 608 m_aDragED( this, SW_RES( ED_DRAG )), 609 m_aUpIB( this, SW_RES( IB_UP )), 610 m_aLeftIB( this, SW_RES( IB_LEFT )), 611 m_aRightIB( this, SW_RES( IB_RIGHT )), 612 m_aDownIB( this, SW_RES( IB_DOWN )), 613 m_aFieldFT( this, SW_RES( FT_FIELD )), 614 m_aFieldCB( this, SW_RES( CB_FIELD )), 615 m_aPreviewFI( this, SW_RES( FI_PREVIEW )), 616 m_aPreviewWIN( this, SW_RES( WIN_PREVIEW )), 617 m_aSeparatorFL( this, SW_RES( FL_SEPARATOR )), 618 m_aOK( this, SW_RES( PB_OK )), 619 m_aCancel( this, SW_RES( PB_CANCEL )), 620 m_aHelp( this, SW_RES( PB_HELP )), 621 #ifdef MSC 622 #pragma warning (default : 4355) 623 #endif 624 m_rConfigItem(rConfig), 625 m_eType(eType) 626 { 627 m_aFieldCB.SetForbiddenChars( String::CreateFromAscii("<>")); 628 m_aDragED.SetStyle(m_aDragED.GetStyle() |WB_NOHIDESELECTION); 629 if( eType >= GREETING_FEMALE ) 630 { 631 m_aFieldFT.Show(); 632 m_aFieldCB.Show(); 633 SvLBoxEntry* pEntry = m_aAddressElementsLB.InsertEntry(String(SW_RES(ST_SALUTATION ))); 634 pEntry->SetUserData((void*)(sal_Int32)USER_DATA_SALUTATION ); 635 pEntry = m_aAddressElementsLB.InsertEntry(String(SW_RES(ST_PUNCTUATION))); 636 pEntry->SetUserData((void*)(sal_Int32)USER_DATA_PUNCTUATION ); 637 pEntry = m_aAddressElementsLB.InsertEntry(String(SW_RES(ST_TEXT ))); 638 pEntry->SetUserData((void*)(sal_Int32)USER_DATA_TEXT ); 639 ResStringArray aSalutArr(SW_RES( 640 eType == GREETING_MALE ? RA_SALUTATION_MALE : RA_SALUTATION_FEMALE)); 641 sal_uInt16 i; 642 for(i = 0; i < aSalutArr.Count(); ++i) 643 m_aSalutations.push_back(aSalutArr.GetString(i)); 644 ResStringArray aPunctArr(SW_RES(RA_PUNCTUATION)); 645 for(i = 0; i < aPunctArr.Count(); ++i) 646 m_aPunctuations.push_back(aPunctArr.GetString(i)); 647 m_aDragED.SetText(String::CreateFromAscii(" ")); 648 SetText( String( SW_RES( eType == GREETING_MALE ? ST_TITLE_MALE : ST_TITLE_FEMALE))); 649 m_aAddressElementsFT.SetText(String(SW_RES(ST_SALUTATIONELEMENTS))); 650 m_aInsertFieldIB.SetQuickHelpText(String(SW_RES(ST_INSERTSALUTATIONFIELD))); 651 m_aRemoveFieldIB.SetQuickHelpText(String(SW_RES(ST_REMOVESALUTATIONFIELD))); 652 m_aDragFT.SetText(String(SW_RES(ST_DRAGSALUTATION))); 653 } 654 else 655 { 656 if(eType == ADDRESSBLOCK_EDIT) 657 SetText(String(SW_RES(ST_TITLE_EDIT))); 658 659 //resize the preview 660 Point aFieldPos(m_aFieldFT.GetPosPixel()); 661 long nDiff = m_aPreviewFI.GetPosPixel().Y() - aFieldPos.Y(); 662 m_aPreviewFI.SetPosPixel(aFieldPos); 663 Size aPreviewSize = m_aPreviewWIN.GetSizePixel(); 664 aPreviewSize.Height() += nDiff; 665 m_aPreviewWIN.SetSizePixel(aPreviewSize); 666 m_aPreviewWIN.SetPosPixel(m_aFieldCB.GetPosPixel()); 667 m_aDragED.SetText(String::CreateFromAscii("\n\n\n\n\n")); 668 } 669 FreeResource(); 670 const ResStringArray& rHeaders = m_rConfigItem.GetDefaultAddressHeaders(); 671 for(sal_uInt16 i = 0; i < rHeaders.Count(); ++i) 672 { 673 const XubString& rHeader = rHeaders.GetString( i ); 674 SvLBoxEntry* pEntry = m_aAddressElementsLB.InsertEntry(rHeader); 675 pEntry->SetUserData((void*)(sal_Int32)i); 676 } 677 m_aOK.SetClickHdl(LINK(this, SwCustomizeAddressBlockDialog, OKHdl_Impl)); 678 m_aAddressElementsLB.SetSelectHdl(LINK(this, SwCustomizeAddressBlockDialog, ListBoxSelectHdl_Impl )); 679 m_aDragED.SetModifyHdl(LINK(this, SwCustomizeAddressBlockDialog, EditModifyHdl_Impl)); 680 m_aDragED.SetSelectionChangedHdl( LINK( this, SwCustomizeAddressBlockDialog, SelectionChangedHdl_Impl)); 681 Link aFieldsLink = LINK(this, SwCustomizeAddressBlockDialog, FieldChangeHdl_Impl); 682 m_aFieldCB.SetModifyHdl(aFieldsLink); 683 m_aFieldCB.SetSelectHdl(aFieldsLink); 684 Link aImgButtonHdl = LINK(this, SwCustomizeAddressBlockDialog, ImageButtonHdl_Impl); 685 m_aInsertFieldIB.SetClickHdl(aImgButtonHdl); 686 m_aRemoveFieldIB.SetClickHdl(aImgButtonHdl); 687 m_aUpIB.SetClickHdl(aImgButtonHdl); 688 m_aLeftIB.SetClickHdl(aImgButtonHdl); 689 m_aRightIB.SetClickHdl(aImgButtonHdl); 690 m_aDownIB.SetClickHdl(aImgButtonHdl); 691 UpdateImageButtons_Impl(); 692 } 693 /*-- 13.04.2004 16:01:08--------------------------------------------------- 694 695 -----------------------------------------------------------------------*/ 696 SwCustomizeAddressBlockDialog::~SwCustomizeAddressBlockDialog() 697 { 698 } 699 /*-- 07.06.2004 13:51:11--------------------------------------------------- 700 701 -----------------------------------------------------------------------*/ 702 IMPL_LINK(SwCustomizeAddressBlockDialog, OKHdl_Impl, OKButton*, EMPTYARG) 703 { 704 EndDialog(RET_OK); 705 return 0; 706 } 707 /*-- 24.06.2004 11:36:05--------------------------------------------------- 708 709 -----------------------------------------------------------------------*/ 710 IMPL_LINK(SwCustomizeAddressBlockDialog, ListBoxSelectHdl_Impl, DDListBox*, pBox) 711 { 712 sal_Int32 nUserData = (sal_Int32)(sal_IntPtr)pBox->FirstSelected()->GetUserData(); 713 // Check if the selected entry is already in the address and then forbid inserting 714 m_aInsertFieldIB.Enable(nUserData >= 0 || !HasItem_Impl(nUserData)); 715 return 0; 716 } 717 /*-- 25.06.2004 11:21:24--------------------------------------------------- 718 719 -----------------------------------------------------------------------*/ 720 IMPL_LINK(SwCustomizeAddressBlockDialog, EditModifyHdl_Impl, AddressMultiLineEdit*, EMPTYARG) 721 { 722 String sAddress = SwAddressPreview::FillData( 723 GetAddress(), 724 m_rConfigItem); 725 m_aPreviewWIN.SetAddress(sAddress); 726 UpdateImageButtons_Impl(); 727 return 0; 728 } 729 /*-- 25.06.2004 12:14:11--------------------------------------------------- 730 731 -----------------------------------------------------------------------*/ 732 IMPL_LINK(SwCustomizeAddressBlockDialog, ImageButtonHdl_Impl, ImageButton*, pButton) 733 { 734 if(&m_aInsertFieldIB == pButton) 735 { 736 SvLBoxEntry* pEntry = m_aAddressElementsLB.GetCurEntry(); 737 if(pEntry) 738 { 739 String sEntry = m_aAddressElementsLB.GetEntryText(pEntry); 740 sEntry.Insert('<', 0); 741 sEntry += '>'; 742 m_aDragED.InsertNewEntry(sEntry); 743 } 744 } 745 else if(&m_aRemoveFieldIB == pButton) 746 { 747 m_aDragED.RemoveCurrentEntry(); 748 } 749 else 750 { 751 sal_uInt16 nMove = MOVE_ITEM_DOWN; 752 if(&m_aUpIB == pButton) 753 nMove = MOVE_ITEM_UP; 754 else if(&m_aLeftIB == pButton) 755 nMove = MOVE_ITEM_LEFT; 756 else if(&m_aRightIB == pButton) 757 nMove = MOVE_ITEM_RIGHT; 758 m_aDragED.MoveCurrentItem(nMove); 759 } 760 UpdateImageButtons_Impl(); 761 return 0; 762 } 763 /*-- 01.07.2004 09:27:02--------------------------------------------------- 764 765 -----------------------------------------------------------------------*/ 766 sal_Int32 SwCustomizeAddressBlockDialog::GetSelectedItem_Impl() 767 { 768 sal_Int32 nRet = USER_DATA_NONE; 769 String sSelected = m_aDragED.GetCurrentItem(); 770 if(sSelected.Len()) 771 for(sal_uLong i = 0; i < m_aAddressElementsLB.GetEntryCount(); ++i) 772 { 773 SvLBoxEntry* pEntry = m_aAddressElementsLB.GetEntry(i); 774 String sEntry = m_aAddressElementsLB.GetEntryText(pEntry); 775 if( sSelected.Equals( sEntry, 1, sSelected.Len() - 2 ) ) 776 { 777 nRet = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); 778 break; 779 } 780 } 781 return nRet; 782 } 783 /*-- 01.07.2004 10:01:19--------------------------------------------------- 784 785 -----------------------------------------------------------------------*/ 786 bool SwCustomizeAddressBlockDialog::HasItem_Impl(sal_Int32 nUserData) 787 { 788 //get the entry from the ListBox 789 String sEntry; 790 for(sal_uLong i = 0; i < m_aAddressElementsLB.GetEntryCount(); ++i) 791 { 792 SvLBoxEntry* pEntry = m_aAddressElementsLB.GetEntry(i); 793 if((sal_Int32)(sal_IntPtr)pEntry->GetUserData() == nUserData) 794 { 795 sEntry = m_aAddressElementsLB.GetEntryText(pEntry); 796 break; 797 } 798 } 799 //put it into '<>' 800 sEntry += '>'; 801 sEntry.Insert( '<', 0); 802 //search for this entry in the content 803 String sText = m_aDragED.GetText(); 804 bool bRet = sText.Search(sEntry) != STRING_NOTFOUND; 805 return bRet; 806 } 807 /*-- 25.06.2004 13:10:16--------------------------------------------------- 808 809 -----------------------------------------------------------------------*/ 810 IMPL_LINK(SwCustomizeAddressBlockDialog, SelectionChangedHdl_Impl, AddressMultiLineEdit*, pEdit) 811 { 812 // called in case the selection of the edit field changes. 813 // determine selection - if it's one of the editable fields then 814 // enable the related ComboBox and fill it 815 static bool bOnEntry = false; 816 if(bOnEntry) 817 return 0; 818 819 bOnEntry = true; 820 sal_Int32 nSelected = GetSelectedItem_Impl(); 821 if(USER_DATA_NONE != nSelected) 822 pEdit->SelectCurrentItem(); 823 824 if(m_aFieldCB.IsVisible() && (USER_DATA_NONE != nSelected) && (nSelected < 0)) 825 { 826 //search in ListBox if it's one of the first entries 827 String sSelect; 828 ::std::vector<String>* pVector = 0; 829 switch(nSelected) { 830 case USER_DATA_SALUTATION: 831 sSelect = m_sCurrentSalutation; 832 pVector = &m_aSalutations; 833 break; 834 case USER_DATA_PUNCTUATION: 835 sSelect = m_sCurrentPunctuation; 836 pVector = &m_aPunctuations; 837 break; 838 case USER_DATA_TEXT: 839 sSelect = m_sCurrentText; 840 break; 841 } 842 m_aFieldCB.Clear(); 843 if(pVector) { 844 ::std::vector<String>::iterator aIterator; 845 for( aIterator = pVector->begin(); aIterator != pVector->end(); ++aIterator) 846 m_aFieldCB.InsertEntry(*aIterator); 847 } 848 m_aFieldCB.SetText(sSelect); 849 m_aFieldCB.Enable(sal_True); 850 m_aFieldFT.Enable(sal_True); 851 } 852 else 853 { 854 m_aFieldCB.Enable(sal_False); 855 m_aFieldFT.Enable(sal_False); 856 } 857 858 UpdateImageButtons_Impl(); 859 bOnEntry = false; 860 return 0; 861 } 862 /*-- 25.06.2004 13:36:29--------------------------------------------------- 863 864 -----------------------------------------------------------------------*/ 865 IMPL_LINK(SwCustomizeAddressBlockDialog, FieldChangeHdl_Impl, ComboBox*, EMPTYARG) 866 { 867 //changing the field content changes the related members, too 868 sal_Int32 nSelected = GetSelectedItem_Impl(); 869 String sContent = m_aFieldCB.GetText(); 870 switch(nSelected) { 871 case USER_DATA_SALUTATION: 872 m_sCurrentSalutation = sContent; 873 break; 874 case USER_DATA_PUNCTUATION: 875 m_sCurrentPunctuation = sContent; 876 break; 877 case USER_DATA_TEXT: 878 m_sCurrentText = sContent; 879 break; 880 } 881 UpdateImageButtons_Impl(); 882 m_aPreviewWIN.SetAddress(GetAddress()); 883 m_aDragED.Modify(); 884 return 0; 885 } 886 887 /*-- 25.06.2004 12:35:51--------------------------------------------------- 888 889 -----------------------------------------------------------------------*/ 890 void SwCustomizeAddressBlockDialog::UpdateImageButtons_Impl() 891 { 892 sal_uInt16 nMove = m_aDragED.IsCurrentItemMoveable(); 893 m_aUpIB.Enable(nMove & MOVE_ITEM_UP ); 894 m_aLeftIB.Enable(nMove & MOVE_ITEM_LEFT ); 895 m_aRightIB.Enable(nMove & MOVE_ITEM_RIGHT ); 896 m_aDownIB.Enable(nMove & MOVE_ITEM_DOWN); 897 m_aRemoveFieldIB.Enable(m_aDragED.HasCurrentItem() ? sal_True : sal_False); 898 SvLBoxEntry* pEntry = m_aAddressElementsLB.GetCurEntry(); 899 m_aInsertFieldIB.Enable( pEntry && 900 (0 < (sal_Int32)(sal_IntPtr)pEntry->GetUserData() || m_aFieldCB.GetText().Len())); 901 } 902 /*-- 28.04.2004 12:04:14--------------------------------------------------- 903 904 -----------------------------------------------------------------------*/ 905 void SwCustomizeAddressBlockDialog::SetAddress(const ::rtl::OUString& rAddress) 906 { 907 m_aDragED.SetText( rAddress ); 908 UpdateImageButtons_Impl(); 909 m_aDragED.Modify(); 910 } 911 /*-- 28.04.2004 12:04:14--------------------------------------------------- 912 913 -----------------------------------------------------------------------*/ 914 ::rtl::OUString SwCustomizeAddressBlockDialog::GetAddress() 915 { 916 String sAddress(m_aDragED.GetAddress()); 917 //remove placeholders by the actual content 918 if(m_aFieldFT.IsVisible()) 919 { 920 for(sal_uLong i = 0; i < m_aAddressElementsLB.GetEntryCount(); ++i) 921 { 922 SvLBoxEntry* pEntry = m_aAddressElementsLB.GetEntry(i); 923 String sEntry = m_aAddressElementsLB.GetEntryText(pEntry); 924 sEntry += '>'; 925 sEntry.Insert('<', 0); 926 sal_Int32 nUserData = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); 927 switch(nUserData) 928 { 929 case USER_DATA_SALUTATION : sAddress.SearchAndReplace(sEntry, m_sCurrentSalutation); break; 930 case USER_DATA_PUNCTUATION: sAddress.SearchAndReplace(sEntry, m_sCurrentPunctuation); break; 931 case USER_DATA_TEXT : sAddress.SearchAndReplace(sEntry, m_sCurrentText); break; 932 } 933 } 934 } 935 return sAddress; 936 } 937 /*-- 28.02.2005 11:03:35--------------------------------------------------- 938 939 -----------------------------------------------------------------------*/ 940 void SwCustomizeAddressBlockDialog::MoveFocus( Window* pMember, bool bNext ) 941 { 942 ::std::vector< Window* > aControls; 943 944 aControls.push_back(&m_aAddressElementsLB); 945 aControls.push_back(&m_aInsertFieldIB); 946 aControls.push_back(&m_aRemoveFieldIB); 947 aControls.push_back(&m_aDragED); 948 aControls.push_back(&m_aUpIB); 949 aControls.push_back(&m_aLeftIB); 950 aControls.push_back(&m_aRightIB); 951 aControls.push_back(&m_aDownIB); 952 aControls.push_back(&m_aFieldCB); 953 aControls.push_back(&m_aOK); 954 aControls.push_back(&m_aCancel); 955 aControls.push_back(&m_aHelp); 956 957 ::std::vector< Window* >::iterator aMemberIter = aControls.begin(); 958 for( ; aMemberIter != aControls.end(); ++aMemberIter) 959 { 960 if(*aMemberIter == pMember) 961 break; 962 } 963 if( aMemberIter == aControls.end() ) 964 { 965 DBG_ERROR( "Window not found?" ); 966 return; 967 } 968 969 if( bNext ) 970 { 971 ::std::vector< Window* >::iterator aSearch = aMemberIter; 972 ++aSearch; 973 while( true ) 974 { 975 if( aSearch == aControls.end()) 976 aSearch = aControls.begin(); 977 else if( (*aSearch)->IsEnabled() ) 978 { 979 (*aSearch)->GrabFocus(); 980 break; 981 } 982 else 983 ++aSearch; 984 } 985 } 986 else 987 { 988 ::std::vector< Window* >::iterator aSearch = aMemberIter; 989 if(aSearch == aControls.begin()) 990 aSearch = aControls.end(); 991 while( true ) 992 { 993 if(aSearch == aControls.begin()) 994 aSearch = aControls.end(); 995 else 996 --aSearch; 997 if( (*aSearch)->IsEnabled() ) 998 { 999 (*aSearch)->GrabFocus(); 1000 break; 1001 } 1002 } 1003 } 1004 1005 } 1006 /*-- 13.04.2004 17:49:45--------------------------------------------------- 1007 1008 -----------------------------------------------------------------------*/ 1009 class SwAssignFieldsControl : public Control 1010 { 1011 friend class SwAssignFieldsDialog; 1012 ScrollBar m_aVScroll; 1013 HeaderBar m_aHeaderHB; 1014 Window m_aWindow; 1015 1016 ::std::vector<FixedInfo*> m_aFieldNames; 1017 ::std::vector<ListBox*> m_aMatches; 1018 ::std::vector<FixedInfo*> m_aPreviews; 1019 1020 SwMailMergeConfigItem& m_rConfigItem; 1021 1022 Link m_aModifyHdl; 1023 1024 long m_nLBStartTopPos; 1025 long m_nYOffset; 1026 long m_nFirstYPos; 1027 1028 DECL_LINK(ScrollHdl_Impl, ScrollBar*); 1029 DECL_LINK(MatchHdl_Impl, ListBox*); 1030 DECL_LINK(GotFocusHdl_Impl, ListBox*); 1031 1032 virtual long PreNotify( NotifyEvent& rNEvt ); 1033 virtual void Command( const CommandEvent& rCEvt ); 1034 1035 void MakeVisible( sal_Int32 nIndex ); 1036 public: 1037 SwAssignFieldsControl(Window* pParent, const ResId& rResId, 1038 SwMailMergeConfigItem& rConfigItem); 1039 ~SwAssignFieldsControl(); 1040 1041 void SetModifyHdl(const Link& rModifyHdl) 1042 { 1043 m_aModifyHdl = rModifyHdl; 1044 m_aModifyHdl.Call(this); 1045 } 1046 }; 1047 /*-- 13.04.2004 17:51:27--------------------------------------------------- 1048 1049 -----------------------------------------------------------------------*/ 1050 //------------------------------------------------------------------------- 1051 SwAssignFieldsControl::SwAssignFieldsControl( 1052 Window* pParent, const ResId& rResId, SwMailMergeConfigItem& rConfigItem) : 1053 Control(pParent, rResId), 1054 #ifdef MSC 1055 #pragma warning (disable : 4355) 1056 #endif 1057 m_aVScroll(this, ResId(SCR_1, *rResId.GetResMgr() )), 1058 m_aHeaderHB(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER), 1059 m_aWindow(this, ResId(WIN_DATA, *rResId.GetResMgr())), 1060 #ifdef MSC 1061 #pragma warning (default : 4355) 1062 #endif 1063 m_rConfigItem(rConfigItem), 1064 m_nLBStartTopPos(0), 1065 m_nYOffset(0), 1066 m_nFirstYPos(0) 1067 { 1068 SetStyle(GetStyle()|WB_TABSTOP|WB_DIALOGCONTROL); 1069 SetHelpId(HID_MM_ASSIGN_FIELDS); 1070 long nHBHeight = m_aHeaderHB.CalcWindowSizePixel().Height(); 1071 Size aOutputSize(GetOutputSize()); 1072 m_aHeaderHB.SetSizePixel( 1073 Size(aOutputSize.Width(), nHBHeight)); 1074 m_aHeaderHB.Show(); 1075 m_aWindow.SetPosPixel(Point( 0, nHBHeight) ); 1076 m_aWindow.SetSizePixel(Size(aOutputSize.Width() - m_aVScroll.GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); 1077 m_aWindow.Show(); 1078 1079 //get the name of the default headers 1080 const ResStringArray& rHeaders = rConfigItem.GetDefaultAddressHeaders(); 1081 //get the actual data 1082 uno::Reference< XColumnsSupplier > xColsSupp( rConfigItem.GetResultSet(), uno::UNO_QUERY); 1083 //get the name of the actual columns 1084 uno::Reference <XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0; 1085 uno::Sequence< ::rtl::OUString > aFields; 1086 if(xColAccess.is()) 1087 aFields = xColAccess->getElementNames(); 1088 const ::rtl::OUString* pFields = aFields.getConstArray(); 1089 1090 //get the current assignment list 1091 //each position in this sequence matches the position in the header array rHeaders 1092 //if no assignment is available an empty sequence will be returned 1093 uno::Sequence< ::rtl::OUString> aAssignments = rConfigItem.GetColumnAssignment( rConfigItem.GetCurrentDBData() ); 1094 Link aMatchHdl = LINK(this, SwAssignFieldsControl, MatchHdl_Impl); 1095 Link aFocusHdl = LINK(this, SwAssignFieldsControl, GotFocusHdl_Impl); 1096 1097 static const char* aHIDs[] = 1098 { 1099 HID_MM_HEADER_0, 1100 HID_MM_HEADER_1, 1101 HID_MM_HEADER_2, 1102 HID_MM_HEADER_3, 1103 HID_MM_HEADER_4, 1104 HID_MM_HEADER_5, 1105 HID_MM_HEADER_6, 1106 HID_MM_HEADER_7, 1107 HID_MM_HEADER_8, 1108 HID_MM_HEADER_9, 1109 HID_MM_HEADER_10, 1110 HID_MM_HEADER_11, 1111 HID_MM_HEADER_12, 1112 HID_MM_HEADER_13 1113 }; 1114 1115 //fill the controls 1116 for(sal_uInt16 i = 0; i < rHeaders.Count(); ++i) 1117 { 1118 const XubString& rHeader = rHeaders.GetString( i ); 1119 FixedInfo* pNewText = new FixedInfo(&m_aWindow, ResId( FT_FIELDS, *rResId.GetResMgr())); 1120 String sLabel(String::CreateFromAscii("<>")); 1121 sLabel.Insert(rHeader, 1); 1122 pNewText->SetText(sLabel); 1123 ListBox* pNewLB = new ListBox(&m_aWindow, ResId(LB_FIELDS, *rResId.GetResMgr())); 1124 pNewLB->SetHelpId( aHIDs[i] ); 1125 pNewLB->SelectEntryPos(0); 1126 for(sal_Int32 nField = 0; nField < aFields.getLength(); ++nField) 1127 pNewLB->InsertEntry(pFields[nField]); 1128 FixedInfo* pNewPreview = new FixedInfo(&m_aWindow, ResId( FT_PREVIEW, *rResId.GetResMgr() )); 1129 //select the ListBox 1130 //if there is an assignment 1131 if(aAssignments.getLength() > i && aAssignments[i].getLength()) 1132 pNewLB->SelectEntry(aAssignments[i]); 1133 else //otherwise the current column name may match one of the db columns 1134 pNewLB->SelectEntry(rHeader); 1135 //then the preview can be filled accordingly 1136 if(xColAccess.is() && pNewLB->GetSelectEntryPos() > 0 && 1137 xColAccess->hasByName(pNewLB->GetSelectEntry())) 1138 { 1139 uno::Any aCol = xColAccess->getByName(pNewLB->GetSelectEntry()); 1140 uno::Reference< XColumn > xColumn; 1141 aCol >>= xColumn; 1142 if(xColumn.is()) 1143 try 1144 { 1145 pNewPreview->SetText(xColumn->getString()); 1146 } 1147 catch(SQLException& ) 1148 { 1149 } 1150 } 1151 if(!i) 1152 { 1153 //determine the vertical offset, use the bottom position of the ListBox 1154 m_nFirstYPos = m_nYOffset = pNewLB->GetPosPixel().Y(); 1155 m_nLBStartTopPos = m_nYOffset; 1156 m_nYOffset += pNewLB->GetSizePixel().Height(); 1157 } 1158 1159 long nMove = m_nYOffset * i; 1160 lcl_Move(pNewText, nMove); 1161 lcl_Move(pNewLB, nMove); 1162 lcl_Move(pNewPreview, nMove); 1163 //set the select handler 1164 pNewLB->SetSelectHdl(aMatchHdl); 1165 pNewLB->SetGetFocusHdl(aFocusHdl); 1166 1167 m_aFieldNames.push_back(pNewText); 1168 m_aMatches.push_back(pNewLB); 1169 m_aPreviews.push_back(pNewPreview); 1170 } 1171 ListBox* pBottomBox = m_aMatches[rHeaders.Count() -1]; 1172 long nYBottom = pBottomBox->GetPosPixel().Y(); 1173 nYBottom += pBottomBox->GetDropDownPosSizePixel().GetHeight(); 1174 m_aVScroll.SetRange(Range(0, rHeaders.Count())); 1175 m_aVScroll.SetPageSize((aOutputSize.Height() - nHBHeight - m_nLBStartTopPos)/ m_nYOffset); 1176 m_aVScroll.EnableDrag(); 1177 m_aVScroll.SetVisibleSize(m_aVScroll.GetPageSize()); 1178 m_aVScroll.SetScrollHdl(LINK(this, SwAssignFieldsControl, ScrollHdl_Impl)); 1179 1180 FreeResource(); 1181 m_aVScroll.SetPosPixel(Point(aOutputSize.Width() - m_aVScroll.GetSizePixel().Width(), nHBHeight)); 1182 m_aVScroll.SetSizePixel(Size(m_aVScroll.GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); 1183 1184 } 1185 /*-- 13.04.2004 17:51:28--------------------------------------------------- 1186 1187 -----------------------------------------------------------------------*/ 1188 SwAssignFieldsControl::~SwAssignFieldsControl() 1189 { 1190 ::std::vector<FixedInfo*>::iterator aFIIter; 1191 for(aFIIter = m_aFieldNames.begin(); aFIIter != m_aFieldNames.end(); ++aFIIter) 1192 delete *aFIIter; 1193 ::std::vector<ListBox*>::iterator aLBIter; 1194 for(aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter) 1195 delete *aLBIter; 1196 for(aFIIter = m_aPreviews.begin(); aFIIter != m_aPreviews.end(); ++aFIIter) 1197 delete *aFIIter; 1198 } 1199 1200 /*-- 07.05.2004 13:11:26--------------------------------------------------- 1201 1202 -----------------------------------------------------------------------*/ 1203 void SwAssignFieldsControl::Command( const CommandEvent& rCEvt ) 1204 { 1205 switch ( rCEvt.GetCommand() ) 1206 { 1207 case COMMAND_WHEEL: 1208 case COMMAND_STARTAUTOSCROLL: 1209 case COMMAND_AUTOSCROLL: 1210 { 1211 const CommandWheelData* pWheelData = rCEvt.GetWheelData(); 1212 if(pWheelData && !pWheelData->IsHorz() && COMMAND_WHEEL_ZOOM != pWheelData->GetMode()) 1213 { 1214 HandleScrollCommand( rCEvt, 0, &m_aVScroll ); 1215 } 1216 } 1217 break; 1218 default: 1219 Control::Command(rCEvt); 1220 } 1221 } 1222 /*-- 07.05.2004 13:11:21--------------------------------------------------- 1223 1224 -----------------------------------------------------------------------*/ 1225 long SwAssignFieldsControl::PreNotify( NotifyEvent& rNEvt ) 1226 { 1227 if(rNEvt.GetType() == EVENT_COMMAND) 1228 { 1229 const CommandEvent* pCEvt = rNEvt.GetCommandEvent(); 1230 sal_uInt16 nCmd = pCEvt->GetCommand(); 1231 if( COMMAND_WHEEL == nCmd ) 1232 { 1233 Command(*pCEvt); 1234 return 1; 1235 } 1236 } 1237 return Control::PreNotify(rNEvt); 1238 } 1239 /*-- 03.09.2004 13:19:09--------------------------------------------------- 1240 1241 -----------------------------------------------------------------------*/ 1242 void SwAssignFieldsControl::MakeVisible( sal_Int32 nIndex ) 1243 { 1244 long nThumb = m_aVScroll.GetThumbPos(); 1245 long nPage = m_aVScroll.GetPageSize(); 1246 if(nThumb > nIndex) 1247 m_aVScroll.SetThumbPos( nIndex ); 1248 else if( (nThumb + nPage) < nIndex) 1249 m_aVScroll.SetThumbPos( nIndex - nPage ); 1250 else 1251 return; 1252 ScrollHdl_Impl( &m_aVScroll ); 1253 } 1254 /*-- 30.04.2004 16:10:58--------------------------------------------------- 1255 1256 -----------------------------------------------------------------------*/ 1257 IMPL_LINK(SwAssignFieldsControl, ScrollHdl_Impl, ScrollBar*, pScroll) 1258 { 1259 long nThumb = pScroll->GetThumbPos(); 1260 // the scrollbar moves on a per line basis 1261 // the height of a line is stored in m_nYOffset 1262 // nThumb determines which line has to be set at the top (m_nYOffset) 1263 // The first line has to be -(nThumb * m_nYOffset) in the negative 1264 long nMove = m_nFirstYPos - (*m_aMatches.begin())->GetPosPixel().Y() - (nThumb * m_nYOffset); 1265 1266 SetUpdateMode(sal_False); 1267 long nIndex; 1268 ::std::vector<FixedInfo*>::iterator aFIIter; 1269 for(nIndex = 0, aFIIter = m_aFieldNames.begin(); aFIIter != m_aFieldNames.end(); ++aFIIter, ++nIndex) 1270 lcl_Move(*aFIIter, nMove); 1271 ::std::vector<ListBox*>::iterator aLBIter; 1272 for(nIndex = 0, aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter, ++nIndex) 1273 lcl_Move(*aLBIter, nMove); 1274 for(nIndex = 0, aFIIter = m_aPreviews.begin(); aFIIter != m_aPreviews.end(); ++aFIIter, ++nIndex) 1275 lcl_Move(*aFIIter, nMove); 1276 SetUpdateMode(sal_True); 1277 1278 return 0; 1279 } 1280 1281 /*-- 03.05.2004 15:37:52--------------------------------------------------- 1282 1283 -----------------------------------------------------------------------*/ 1284 IMPL_LINK(SwAssignFieldsControl, MatchHdl_Impl, ListBox*, pBox) 1285 { 1286 String sColumn = pBox->GetSelectEntry(); 1287 uno::Reference< XColumnsSupplier > xColsSupp( m_rConfigItem.GetResultSet(), uno::UNO_QUERY); 1288 uno::Reference <XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0; 1289 ::rtl::OUString sPreview; 1290 if(xColAccess.is() && xColAccess->hasByName(sColumn)) 1291 { 1292 uno::Any aCol = xColAccess->getByName(sColumn); 1293 uno::Reference< XColumn > xColumn; 1294 aCol >>= xColumn; 1295 if(xColumn.is()) 1296 { 1297 try 1298 { 1299 sPreview = xColumn->getString(); 1300 } 1301 catch( sdbc::SQLException& ) 1302 { 1303 } 1304 } 1305 } 1306 ::std::vector<ListBox*>::iterator aLBIter; 1307 sal_Int32 nIndex = 0; 1308 for(aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter, ++nIndex) 1309 { 1310 if(*aLBIter == pBox) 1311 { 1312 m_aPreviews[nIndex]->SetText(sPreview); 1313 break; 1314 } 1315 } 1316 m_aModifyHdl.Call(0); 1317 return 0; 1318 } 1319 /*-- 03.09.2004 13:16:04--------------------------------------------------- 1320 1321 -----------------------------------------------------------------------*/ 1322 IMPL_LINK(SwAssignFieldsControl, GotFocusHdl_Impl, ListBox*, pBox) 1323 { 1324 if(0 != (GETFOCUS_TAB & pBox->GetGetFocusFlags())) 1325 { 1326 sal_Int32 nIndex = 0; 1327 ::std::vector<ListBox*>::iterator aLBIter; 1328 for(aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter, ++nIndex) 1329 { 1330 if(*aLBIter == pBox) 1331 { 1332 MakeVisible(nIndex); 1333 break; 1334 } 1335 } 1336 } 1337 return 0; 1338 } 1339 /*-- 13.04.2004 17:44:01--------------------------------------------------- 1340 1341 -----------------------------------------------------------------------*/ 1342 SwAssignFieldsDialog::SwAssignFieldsDialog( 1343 Window* pParent, SwMailMergeConfigItem& rConfigItem, 1344 const ::rtl::OUString& rPreview, 1345 bool bIsAddressBlock) : 1346 SfxModalDialog(pParent, SW_RES(DLG_MM_ASSIGNFIELDS)), 1347 #ifdef MSC 1348 #pragma warning (disable : 4355) 1349 #endif 1350 m_aMatchingFI( this, SW_RES( FI_MATCHING)), 1351 m_pFieldsControl( new SwAssignFieldsControl(this, SW_RES( CT_FIELDS ), rConfigItem)), 1352 m_aPreviewFI( this, SW_RES( FI_PREVIEW )), 1353 m_aPreviewWIN( this, SW_RES( WIN_PREVIEW )), 1354 m_aSeparatorFL( this, SW_RES( FL_SEPARATOR)), 1355 m_aOK( this, SW_RES( PB_OK )), 1356 m_aCancel( this, SW_RES( PB_CANCEL )), 1357 m_aHelp( this, SW_RES( PB_HELP )), 1358 #ifdef MSC 1359 #pragma warning (default : 4355) 1360 #endif 1361 m_sNone(SW_RES(ST_NONE)), 1362 m_rPreviewString(rPreview), 1363 m_rConfigItem(rConfigItem) 1364 { 1365 //resize the HeaderBar 1366 String sAddressElement( SW_RES(ST_ADDRESSELEMENT )); 1367 String sMatchesTo( SW_RES(ST_MATCHESTO )); 1368 String sPreview( SW_RES(ST_PREVIEW )); 1369 if(!bIsAddressBlock) 1370 { 1371 m_aPreviewFI.SetText(String(SW_RES(ST_SALUTATIONPREVIEW))); 1372 m_aMatchingFI.SetText(String(SW_RES(ST_SALUTATIONMATCHING))); 1373 sAddressElement = String(SW_RES(ST_SALUTATIONELEMENT)); 1374 } 1375 FreeResource(); 1376 Size aOutputSize(m_pFieldsControl->m_aHeaderHB.GetSizePixel()); 1377 sal_Int32 nFirstWidth; 1378 sal_Int32 nSecondWidth = nFirstWidth = aOutputSize.Width() / 3; 1379 const WinBits nHeadBits = HIB_VCENTER | HIB_FIXED| HIB_FIXEDPOS; 1380 m_pFieldsControl->m_aHeaderHB.InsertItem( 1, sAddressElement, nFirstWidth, nHeadBits|HIB_LEFT); 1381 m_pFieldsControl->m_aHeaderHB.InsertItem( 2, sMatchesTo, nSecondWidth, nHeadBits|HIB_LEFT); 1382 m_pFieldsControl->m_aHeaderHB.InsertItem( 3, sPreview, 1383 aOutputSize.Width() - nFirstWidth - nSecondWidth, nHeadBits|HIB_LEFT); 1384 1385 m_pFieldsControl->SetModifyHdl(LINK(this, SwAssignFieldsDialog, AssignmentModifyHdl_Impl )); 1386 1387 String sMatching = m_aMatchingFI.GetText(); 1388 sMatching.SearchAndReplaceAscii("%1", sMatchesTo); 1389 m_aMatchingFI.SetText(sMatching); 1390 1391 m_aOK.SetClickHdl(LINK(this, SwAssignFieldsDialog, OkHdl_Impl)); 1392 } 1393 /*-- 13.04.2004 17:44:02--------------------------------------------------- 1394 1395 -----------------------------------------------------------------------*/ 1396 SwAssignFieldsDialog::~SwAssignFieldsDialog() 1397 { 1398 delete m_pFieldsControl; 1399 } 1400 /*-- 05.05.2004 14:39:13--------------------------------------------------- 1401 1402 -----------------------------------------------------------------------*/ 1403 uno::Sequence< ::rtl::OUString > SwAssignFieldsDialog::CreateAssignments() 1404 { 1405 uno::Sequence< ::rtl::OUString > aAssignments( 1406 m_rConfigItem.GetDefaultAddressHeaders().Count()); 1407 ::rtl::OUString* pAssignments = aAssignments.getArray(); 1408 ::std::vector<ListBox*>::iterator aLBIter; 1409 sal_Int32 nIndex = 0; 1410 for(aLBIter = m_pFieldsControl->m_aMatches.begin(); 1411 aLBIter != m_pFieldsControl->m_aMatches.end(); 1412 ++aLBIter, ++nIndex) 1413 { 1414 String sSelect = (*aLBIter)->GetSelectEntry(); 1415 if(m_sNone != sSelect) 1416 pAssignments[nIndex] = sSelect; 1417 else 1418 pAssignments[nIndex] = ::rtl::OUString(); 1419 } 1420 return aAssignments; 1421 } 1422 /*-- 03.05.2004 18:04:00--------------------------------------------------- 1423 1424 -----------------------------------------------------------------------*/ 1425 IMPL_LINK(SwAssignFieldsDialog, OkHdl_Impl, PushButton*, EMPTYARG) 1426 { 1427 m_rConfigItem.SetColumnAssignment( 1428 m_rConfigItem.GetCurrentDBData(), 1429 CreateAssignments() ); 1430 EndDialog(RET_OK); 1431 return 0; 1432 } 1433 /*-- 05.05.2004 14:37:19--------------------------------------------------- 1434 1435 -----------------------------------------------------------------------*/ 1436 IMPL_LINK(SwAssignFieldsDialog, AssignmentModifyHdl_Impl, void*, EMPTYARG) 1437 { 1438 uno::Sequence< ::rtl::OUString > aAssignments = CreateAssignments(); 1439 String sPreview = SwAddressPreview::FillData( 1440 m_rPreviewString, m_rConfigItem, &aAssignments); 1441 m_aPreviewWIN.SetAddress(sPreview); 1442 return 0; 1443 } 1444 1445 /*-- 26.05.2004 11:20:11--------------------------------------------------- 1446 1447 -----------------------------------------------------------------------*/ 1448 DDListBox::DDListBox(SwCustomizeAddressBlockDialog* pParent, const ResId rResId) : 1449 SvTreeListBox(pParent, rResId), 1450 m_pParentDialog(pParent) 1451 { 1452 SetStyle( GetStyle() | /*WB_HASBUTTONS|WB_HASBUTTONSATROOT|*/ 1453 WB_CLIPCHILDREN ); 1454 // SetSpaceBetweenEntries(3); 1455 SetSelectionMode( SINGLE_SELECTION ); 1456 SetDragDropMode( SV_DRAGDROP_CTRL_COPY ); 1457 EnableAsyncDrag(sal_True); 1458 SetHelpId(HID_MM_CUSTOMFIELDS); 1459 // expand selection to the complete width of the ListBox 1460 SetHighlightRange(); 1461 Show(); 1462 1463 } 1464 /*-- 26.05.2004 11:20:15--------------------------------------------------- 1465 1466 -----------------------------------------------------------------------*/ 1467 DDListBox::~DDListBox() 1468 { 1469 } 1470 /*-- 26.05.2004 11:20:16--------------------------------------------------- 1471 1472 -----------------------------------------------------------------------*/ 1473 void DDListBox::StartDrag( sal_Int8 /*nAction*/, const Point& /*rPosPixel*/ ) 1474 { 1475 SvLBoxEntry* pEntry = GetCurEntry(); 1476 if(pEntry) 1477 { 1478 ReleaseMouse(); 1479 1480 TransferDataContainer* pContainer = new TransferDataContainer; 1481 uno::Reference< 1482 datatransfer::XTransferable > xRef( pContainer ); 1483 1484 sal_Int32 nUserData = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); 1485 //special entries can only be once in the address / greeting 1486 if(nUserData >= 0 || !m_pParentDialog->HasItem_Impl(nUserData)) 1487 { 1488 String sEntry; 1489 sEntry = GetEntryText(pEntry); 1490 sEntry.Insert('<', 0); 1491 sEntry += '>'; 1492 if(sEntry.Len()) 1493 { 1494 pContainer->CopyString( sEntry ); 1495 pContainer->StartDrag( this, DND_ACTION_COPY, GetDragFinishedHdl() ); 1496 } 1497 } 1498 } 1499 } 1500 /*-- 26.05.2004 13:14:53--------------------------------------------------- 1501 1502 -----------------------------------------------------------------------*/ 1503 AddressMultiLineEdit::AddressMultiLineEdit(SwCustomizeAddressBlockDialog* pParent, const ResId& rResId) : 1504 MultiLineEdit(pParent, rResId), 1505 m_pParentDialog(pParent) 1506 1507 { 1508 GetTextView()->SupportProtectAttribute(sal_True); 1509 StartListening(*GetTextEngine()); 1510 //DisableSelectionOnFocus(); 1511 EnableFocusSelectionHide(sal_False); 1512 } 1513 /*-- 26.05.2004 13:14:53--------------------------------------------------- 1514 1515 -----------------------------------------------------------------------*/ 1516 AddressMultiLineEdit::~AddressMultiLineEdit() 1517 { 1518 EndListening(*GetTextEngine()); 1519 } 1520 /*-- 25.06.2004 13:02:49--------------------------------------------------- 1521 1522 -----------------------------------------------------------------------*/ 1523 void AddressMultiLineEdit::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) 1524 { 1525 if(rHint.ISA(TextHint) && 1526 static_cast<const TextHint&>(rHint).GetId() == TEXT_HINT_VIEWSELECTIONCHANGED && 1527 m_aSelectionLink.IsSet()) 1528 { 1529 m_aSelectionLink.Call(this); 1530 } 1531 } 1532 /*-- 26.05.2004 13:45:46--------------------------------------------------- 1533 1534 -----------------------------------------------------------------------*/ 1535 long AddressMultiLineEdit::PreNotify( NotifyEvent& rNEvt ) 1536 { 1537 long nHandled = 0; 1538 if( EVENT_KEYINPUT == rNEvt.GetType() && 1539 rNEvt.GetKeyEvent()->GetCharCode()) 1540 { 1541 const KeyEvent* pKEvent = rNEvt.GetKeyEvent(); 1542 if('\t' == pKEvent->GetCharCode() && 1543 0 == (pKEvent->GetKeyCode().GetModifier() & (KEY_MOD1|KEY_MOD2))) 1544 { 1545 m_pParentDialog->MoveFocus(this, !pKEvent->GetKeyCode().IsShift()); 1546 } 1547 nHandled = 1; 1548 } 1549 else if(EVENT_MOUSEBUTTONDOWN == rNEvt.GetType()) { 1550 const MouseEvent *pMEvt = rNEvt.GetMouseEvent(); 1551 if(pMEvt->GetClicks() >= 2) 1552 nHandled = 1; 1553 } 1554 if(!nHandled) 1555 nHandled = MultiLineEdit::PreNotify( rNEvt ); 1556 return nHandled; 1557 1558 } 1559 /*-- 25.06.2004 08:20:54--------------------------------------------------- 1560 1561 -----------------------------------------------------------------------*/ 1562 void AddressMultiLineEdit::SetText( const String& rStr ) 1563 { 1564 MultiLineEdit::SetText(rStr); 1565 //set attributes to all address tokens 1566 1567 ExtTextEngine* pTextEngine = GetTextEngine(); 1568 TextAttribProtect aProtectAttr; 1569 sal_uLong nParaCount = pTextEngine->GetParagraphCount(); 1570 for(sal_uLong nPara = 0; nPara < nParaCount; ++nPara) 1571 { 1572 xub_StrLen nIndex = 0; 1573 String sPara = pTextEngine->GetText( nPara ); 1574 if(sPara.Len() && sPara.GetChar(sPara.Len() - 1) != ' ') 1575 { 1576 TextPaM aPaM(nPara, sPara.Len()); 1577 pTextEngine->ReplaceText(TextSelection( aPaM ), String(' ')); 1578 } 1579 while(true) 1580 { 1581 sal_uInt16 nStart = sPara.Search( '<', nIndex ); 1582 sal_uInt16 nEnd = sPara.Search( '>', nStart ); 1583 nIndex = nEnd; 1584 if(nStart != STRING_NOTFOUND && nEnd != STRING_NOTFOUND) 1585 pTextEngine->SetAttrib( aProtectAttr, nPara, nStart, nEnd + 1, sal_False ); 1586 else 1587 break; 1588 } 1589 1590 } 1591 // add two empty paragraphs at the end 1592 if(m_pParentDialog->m_eType == SwCustomizeAddressBlockDialog::ADDRESSBLOCK_NEW || 1593 m_pParentDialog->m_eType == SwCustomizeAddressBlockDialog::ADDRESSBLOCK_EDIT) 1594 { 1595 xub_StrLen nLastLen = pTextEngine->GetText(nParaCount - 1).Len(); 1596 if(nLastLen) 1597 { 1598 TextPaM aPaM(nParaCount ? nParaCount - 1 : 0, nLastLen); 1599 pTextEngine->ReplaceText( TextSelection( aPaM ), String::CreateFromAscii("\n \n ")); 1600 } 1601 } 1602 } 1603 1604 /*-- 25.06.2004 12:32:41--------------------------------------------------- 1605 Insert the new entry in front of the entry at the beginning of the selection 1606 1607 -----------------------------------------------------------------------*/ 1608 void AddressMultiLineEdit::InsertNewEntry( const String& rStr ) 1609 { 1610 // insert new entry after current selected one. 1611 ExtTextView* pTextView = GetTextView(); 1612 const TextSelection& rSelection = pTextView->GetSelection(); 1613 sal_uLong nPara = rSelection.GetStart().GetPara(); 1614 sal_uInt16 nIndex = rSelection.GetEnd().GetIndex(); 1615 ExtTextEngine *pTextEngine = GetTextEngine(); 1616 const TextCharAttrib *pAttrib; 1617 if(0 != (pAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ))) 1618 nIndex = pAttrib->GetEnd(); 1619 InsertNewEntryAtPosition( rStr, nPara, nIndex ); 1620 1621 // select the new entry 1622 pAttrib = pTextEngine->FindCharAttrib(TextPaM(nPara, nIndex),TEXTATTR_PROTECTED); 1623 TextSelection aEntrySel(TextPaM(nPara, nIndex), TextPaM(nPara, pAttrib->GetEnd())); 1624 pTextView->SetSelection(aEntrySel); 1625 Invalidate(); 1626 Modify(); 1627 } 1628 1629 void AddressMultiLineEdit::InsertNewEntryAtPosition( const String& rStr, sal_uLong nPara, sal_uInt16 nIndex ) 1630 { 1631 ExtTextEngine* pTextEngine = GetTextEngine(); 1632 TextPaM aInsertPos( nPara, nIndex ); 1633 1634 pTextEngine->ReplaceText( aInsertPos, rStr ); 1635 1636 //restore the attributes 1637 SetText( GetAddress() ); 1638 //select the newly inserted/moved element 1639 TextSelection aEntrySel(aInsertPos); 1640 ExtTextView* pTextView = GetTextView(); 1641 pTextView->SetSelection(aEntrySel); 1642 m_aSelectionLink.Call(this); 1643 } 1644 /*-- 25.06.2004 12:32:41--------------------------------------------------- 1645 1646 -----------------------------------------------------------------------*/ 1647 void AddressMultiLineEdit::RemoveCurrentEntry() 1648 { 1649 ExtTextEngine* pTextEngine = GetTextEngine(); 1650 ExtTextView* pTextView = GetTextView(); 1651 const TextSelection& rSelection = pTextView->GetSelection(); 1652 const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); 1653 // const TextCharAttrib* pEndAttrib = pTextEngine->FindCharAttrib( rSelection.GetEnd(), TEXTATTR_PROTECTED ); 1654 if(pBeginAttrib && 1655 (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() 1656 && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) 1657 { 1658 sal_uLong nPara = rSelection.GetStart().GetPara(); 1659 TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); 1660 pTextEngine->ReplaceText(aEntrySel, String()); 1661 //restore the attributes 1662 SetText( GetAddress() ); 1663 Modify(); 1664 } 1665 } 1666 /*-- 25.06.2004 12:32:41--------------------------------------------------- 1667 1668 -----------------------------------------------------------------------*/ 1669 void AddressMultiLineEdit::MoveCurrentItem(sal_uInt16 nMove) 1670 { 1671 ExtTextEngine* pTextEngine = GetTextEngine(); 1672 ExtTextView* pTextView = GetTextView(); 1673 const TextSelection& rSelection = pTextView->GetSelection(); 1674 const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); 1675 if(pBeginAttrib && 1676 (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() 1677 && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) 1678 { 1679 //current item has been found 1680 sal_uLong nPara = rSelection.GetStart().GetPara(); 1681 sal_uInt16 nIndex = pBeginAttrib->GetStart(); 1682 TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); 1683 String sCurrentItem = pTextEngine->GetText(aEntrySel); 1684 pTextEngine->RemoveAttrib( nPara, *pBeginAttrib ); 1685 pTextEngine->ReplaceText(aEntrySel, String()); 1686 switch(nMove) 1687 { 1688 case MOVE_ITEM_LEFT : 1689 if(nIndex) 1690 { 1691 //go left to find a predecessor or simple text 1692 --nIndex; 1693 String sPara = pTextEngine->GetText( nPara ); 1694 xub_StrLen nSearchIndex = sPara.SearchBackward( '>', nIndex+1 ); 1695 if( nSearchIndex != STRING_NOTFOUND && nSearchIndex == nIndex ) 1696 { 1697 nSearchIndex = sPara.SearchBackward( '<', nIndex ); 1698 if( nSearchIndex != STRING_NOTFOUND ) 1699 nIndex = nSearchIndex; 1700 } 1701 } 1702 break; 1703 case MOVE_ITEM_RIGHT: 1704 { 1705 //go right to find a successor or simple text 1706 ++nIndex; 1707 const TextCharAttrib* pEndAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); 1708 if(pEndAttrib && pEndAttrib->GetEnd() >= nIndex) 1709 { 1710 nIndex = pEndAttrib->GetEnd(); 1711 } 1712 } 1713 break; 1714 case MOVE_ITEM_UP : 1715 --nPara; 1716 nIndex = 0; 1717 break; 1718 case MOVE_ITEM_DOWN : 1719 ++nPara; 1720 nIndex = 0; 1721 break; 1722 } 1723 //add a new paragraph if there is none yet 1724 if(nPara >= pTextEngine->GetParagraphCount()) 1725 { 1726 1727 TextPaM aTemp(nPara - 1, pTextEngine->GetTextLen( nPara - 1 )); 1728 pTextEngine->ReplaceText( aTemp, String('\n')); 1729 } 1730 InsertNewEntryAtPosition( sCurrentItem, nPara, nIndex ); 1731 1732 // select the new entry [#i40817] 1733 const TextCharAttrib *pAttrib; 1734 pAttrib = pTextEngine->FindCharAttrib(TextPaM(nPara, nIndex),TEXTATTR_PROTECTED); 1735 aEntrySel = TextSelection(TextPaM(nPara, nIndex), TextPaM(nPara, pAttrib->GetEnd())); 1736 pTextView->SetSelection(aEntrySel); 1737 Invalidate(); 1738 Modify(); 1739 } 1740 } 1741 /*-- 25.06.2004 12:32:41--------------------------------------------------- 1742 1743 -----------------------------------------------------------------------*/ 1744 sal_uInt16 AddressMultiLineEdit::IsCurrentItemMoveable() 1745 { 1746 sal_uInt16 nRet = 0; 1747 ExtTextEngine* pTextEngine = GetTextEngine(); 1748 ExtTextView* pTextView = GetTextView(); 1749 const TextSelection& rSelection = pTextView->GetSelection(); 1750 const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); 1751 // const TextCharAttrib* pEndAttrib = pTextEngine->FindCharAttrib( rSelection.GetEnd(), TEXTATTR_PROTECTED ); 1752 if(pBeginAttrib && 1753 (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() 1754 && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) 1755 { 1756 if(pBeginAttrib->GetStart()) 1757 nRet |= MOVE_ITEM_LEFT; 1758 //if there is an entry it can always be move to the right and down 1759 nRet |= MOVE_ITEM_RIGHT|MOVE_ITEM_DOWN; 1760 if(rSelection.GetStart().GetPara() > 0) 1761 nRet |= MOVE_ITEM_UP; 1762 } 1763 return nRet; 1764 } 1765 /*-- 25.06.2004 12:32:42--------------------------------------------------- 1766 1767 -----------------------------------------------------------------------*/ 1768 bool AddressMultiLineEdit::HasCurrentItem() 1769 { 1770 ExtTextEngine* pTextEngine = GetTextEngine(); 1771 ExtTextView* pTextView = GetTextView(); 1772 const TextSelection& rSelection = pTextView->GetSelection(); 1773 const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); 1774 return (pBeginAttrib && 1775 (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() 1776 && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())); 1777 } 1778 /*-- 01.07.2004 09:07:44--------------------------------------------------- 1779 1780 -----------------------------------------------------------------------*/ 1781 String AddressMultiLineEdit::GetCurrentItem() 1782 { 1783 String sRet; 1784 ExtTextEngine* pTextEngine = GetTextEngine(); 1785 ExtTextView* pTextView = GetTextView(); 1786 const TextSelection& rSelection = pTextView->GetSelection(); 1787 const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); 1788 if(pBeginAttrib && 1789 (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() 1790 && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) 1791 { 1792 sal_uLong nPara = rSelection.GetStart().GetPara(); 1793 TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); 1794 sRet = pTextEngine->GetText( aEntrySel ); 1795 } 1796 return sRet; 1797 } 1798 /*-- 05.07.2004 14:29:02--------------------------------------------------- 1799 1800 -----------------------------------------------------------------------*/ 1801 void AddressMultiLineEdit::SelectCurrentItem() 1802 { 1803 ExtTextEngine* pTextEngine = GetTextEngine(); 1804 ExtTextView* pTextView = GetTextView(); 1805 const TextSelection& rSelection = pTextView->GetSelection(); 1806 const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); 1807 if(pBeginAttrib && 1808 (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() 1809 && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) 1810 { 1811 sal_uLong nPara = rSelection.GetStart().GetPara(); 1812 TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); 1813 pTextView->SetSelection(aEntrySel); 1814 Invalidate(); 1815 } 1816 } 1817 /*-- 25.06.2004 09:10:43--------------------------------------------------- 1818 returns the address 1819 remove trailing spaces 1820 and trailing empty paragraphs 1821 -----------------------------------------------------------------------*/ 1822 String AddressMultiLineEdit::GetAddress() 1823 { 1824 String sRet; 1825 ExtTextEngine* pTextEngine = GetTextEngine(); 1826 sal_uLong nParaCount = pTextEngine->GetParagraphCount(); 1827 for(sal_uLong nPara = nParaCount; nPara; --nPara) 1828 { 1829 String sPara = pTextEngine->GetText( nPara - 1); 1830 sPara.EraseTrailingChars(' '); 1831 //don't add empty trailing paragraphs 1832 if(sRet.Len() || sPara.Len()) 1833 { 1834 sRet.Insert(sPara, 0); 1835 //insert the para break 1836 if(nPara > 1) 1837 sRet.Insert( '\n', 0); 1838 } 1839 } 1840 return sRet; 1841 } 1842 1843