/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #ifdef SW_DLLIMPLEMENTATION #undef SW_DLLIMPLEMENTATION #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace svt; using namespace ::com::sun::star; using namespace ::com::sun::star::container; using namespace ::com::sun::star::sdb; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::sdbcx; //------------------------------------------------------------------------- void lcl_Move(Control* pCtrl, long nYOffset) { Point aPos(pCtrl->GetPosPixel()); aPos.Y() += nYOffset; pCtrl->SetPosPixel(aPos); } /*-- 02.04.2004 12:46:40--------------------------------------------------- -----------------------------------------------------------------------*/ SwMailMergeAddressBlockPage::SwMailMergeAddressBlockPage( SwMailMergeWizard* _pParent) : svt::OWizardPage(_pParent, SW_RES(DLG_MM_ADDRESSBLOCK_PAGE)), #ifdef MSC #pragma warning (disable : 4355) #endif m_aHeaderFI( this, SW_RES( FI_HEADER ) ), m_aFirstFI( this, SW_RES( FI_FIRST ) ), m_aAddressListFI( this, SW_RES( FI_ADDRESSLIST ) ), m_aAddressListPB( this, SW_RES( PB_ADDRESSLIST ) ), m_aCurrentAddressFI( this, SW_RES( FI_CURRENTADDRESS ) ), m_aFirstFL( this, SW_RES( FL_FIRST ) ), m_aSecondFI( this, SW_RES( FI_SECOND )), m_aSettingsFI( this, SW_RES( FI_SECOND ) ), m_aAddressCB( this, SW_RES( CB_ADDRESS ) ), m_aSettingsWIN( this, SW_RES( WIN_SETTINGS ) ), m_aSettingsPB( this, SW_RES( PB_SETTINGS ) ), m_aHideEmptyParagraphsCB( this, SW_RES( CB_HIDE_EMPTY_PARA ) ), m_aSecondFL( this, SW_RES( FL_SECOND )), m_aThirdFI( this, SW_RES( FI_THIRD ) ), m_aMatchFieldsFI( this, SW_RES( FI_MATCH_FIELDS ) ), m_aAssignPB( this, SW_RES( PB_ASSIGN ) ), m_aThirdFL( this, SW_RES( FL_THIRD ) ), m_aFourthFI( this, SW_RES( FI_FOURTH ) ), m_aPreviewFI( this, SW_RES( FI_PREVIEW ) ), m_aPreviewWIN( this, SW_RES( WIN_PREVIEW ) ), m_aDocumentIndexFI( this, SW_RES( FI_DOCINDEX ) ), m_aPrevSetIB( this, SW_RES( IB_PREVSET ) ), m_aNextSetIB( this, SW_RES( IB_NEXTSET ) ), #ifdef MSC #pragma warning (default : 4355) #endif m_sDocument( SW_RES( STR_DOCUMENT ) ), m_sChangeAddress( SW_RES( STR_CHANGEADDRESS )), m_pWizard(_pParent) { FreeResource(); m_sCurrentAddress = m_aCurrentAddressFI.GetText(); m_aAddressListPB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, AddressListHdl_Impl)); m_aSettingsPB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, SettingsHdl_Impl)); m_aAssignPB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, AssignHdl_Impl )); m_aAddressCB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, AddressBlockHdl_Impl)); m_aSettingsWIN.SetSelectHdl(LINK(this, SwMailMergeAddressBlockPage, AddressBlockSelectHdl_Impl)); m_aHideEmptyParagraphsCB.SetClickHdl(LINK(this, SwMailMergeAddressBlockPage, HideParagraphsHdl_Impl)); Link aLink = LINK(this, SwMailMergeAddressBlockPage, InsertDataHdl_Impl); m_aPrevSetIB.SetClickHdl(aLink); m_aNextSetIB.SetClickHdl(aLink); } /*-- 02.04.2004 12:46:40--------------------------------------------------- -----------------------------------------------------------------------*/ SwMailMergeAddressBlockPage::~SwMailMergeAddressBlockPage() { } /*-- 05.07.2004 13:55:15--------------------------------------------------- -----------------------------------------------------------------------*/ bool SwMailMergeAddressBlockPage::canAdvance() const { return m_pWizard->GetConfigItem().GetResultSet().is(); } /*-- 16.06.2004 12:34:09--------------------------------------------------- -----------------------------------------------------------------------*/ void SwMailMergeAddressBlockPage::ActivatePage() { SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); bool bIsLetter = rConfigItem.IsOutputToLetter(); //no address block is created for e-Mail m_aSettingsFI.Show( bIsLetter ); m_aAddressCB.Show( bIsLetter ); m_aSettingsWIN.Show( bIsLetter ); m_aSettingsPB.Show( bIsLetter ); m_aPreviewFI.Show( bIsLetter ); m_aPreviewWIN.Show( bIsLetter ); m_aAssignPB.Show( bIsLetter ); m_aDocumentIndexFI.Show( bIsLetter ); m_aPrevSetIB.Show( bIsLetter ); m_aNextSetIB.Show( bIsLetter ); m_aHideEmptyParagraphsCB.Show( bIsLetter ); m_aSecondFL.Show( bIsLetter ); m_aSecondFI.Show( bIsLetter ); m_aSettingsFI.Show( bIsLetter ); m_aMatchFieldsFI.Show( bIsLetter ); m_aThirdFI.Show( bIsLetter ); m_aThirdFL.Show( bIsLetter ); m_aFourthFI.Show( bIsLetter ); if(bIsLetter) { m_aHideEmptyParagraphsCB.Check( rConfigItem.IsHideEmptyParagraphs() ); String sTemp(m_sDocument); sTemp.SearchAndReplaceAscii("%1", String::CreateFromInt32(1)); m_aDocumentIndexFI.SetText(sTemp); m_aSettingsWIN.Clear(); const uno::Sequence< ::rtl::OUString> aBlocks = m_pWizard->GetConfigItem().GetAddressBlocks(); for(sal_Int32 nAddress = 0; nAddress < aBlocks.getLength(); ++nAddress) m_aSettingsWIN.AddAddress(aBlocks[nAddress]); m_aSettingsWIN.SelectAddress((sal_uInt16)rConfigItem.GetCurrentAddressBlockIndex()); m_aAddressCB.Check(rConfigItem.IsAddressBlock()); AddressBlockHdl_Impl(&m_aAddressCB); m_aSettingsWIN.SetLayout(1, 2); InsertDataHdl_Impl(0); } } /*-- 27.05.2004 13:59:15--------------------------------------------------- -----------------------------------------------------------------------*/ sal_Bool SwMailMergeAddressBlockPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason ) { if ( ::svt::WizardTypes::eTravelForward == _eReason && !m_pWizard->GetConfigItem().GetResultSet().is() ) return sal_False; return sal_True; } /*-- 07.04.2004 16:19:30--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwMailMergeAddressBlockPage, AddressListHdl_Impl, PushButton*, EMPTYARG) { SwAddressListDialog* pAddrDialog = new SwAddressListDialog(this); if(RET_OK == pAddrDialog->Execute()) { SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); rConfigItem.SetCurrentConnection( pAddrDialog->GetSource(), pAddrDialog->GetConnection(), pAddrDialog->GetColumnsSupplier(), pAddrDialog->GetDBData()); ::rtl::OUString sFilter = pAddrDialog->GetFilter(); rConfigItem.SetFilter( sFilter ); InsertDataHdl_Impl(0); GetWizard()->UpdateRoadmap(); GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); } delete pAddrDialog; return 0; } /*-- 07.04.2004 16:19:30--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwMailMergeAddressBlockPage, SettingsHdl_Impl, PushButton*, pButton) { SwSelectAddressBlockDialog* pDlg = new SwSelectAddressBlockDialog(pButton, m_pWizard->GetConfigItem()); SwMailMergeConfigItem& rConfig = m_pWizard->GetConfigItem(); pDlg->SetAddressBlocks(rConfig.GetAddressBlocks(), m_aSettingsWIN.GetSelectedAddress()); pDlg->SetSettings(rConfig.IsIncludeCountry(), rConfig.GetExcludeCountry()); if(RET_OK == pDlg->Execute()) { //the dialog provides the selected address at the first position! const uno::Sequence< ::rtl::OUString> aBlocks = pDlg->GetAddressBlocks(); rConfig.SetAddressBlocks(aBlocks); m_aSettingsWIN.Clear(); for(sal_Int32 nAddress = 0; nAddress < aBlocks.getLength(); ++nAddress) m_aSettingsWIN.AddAddress(aBlocks[nAddress]); m_aSettingsWIN.SelectAddress(0); m_aSettingsWIN.Invalidate(); // #i40408 rConfig.SetCountrySettings(pDlg->IsIncludeCountry(), pDlg->GetCountry()); InsertDataHdl_Impl(0); } delete pDlg; GetWizard()->UpdateRoadmap(); GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); return 0; } /*-- 07.04.2004 16:19:31--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwMailMergeAddressBlockPage, AssignHdl_Impl, PushButton*, pButton) { SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); sal_uInt16 nSel = m_aSettingsWIN.GetSelectedAddress(); const uno::Sequence< ::rtl::OUString> aBlocks = rConfigItem.GetAddressBlocks(); SwAssignFieldsDialog* pDlg = new SwAssignFieldsDialog(pButton, m_pWizard->GetConfigItem(), aBlocks[nSel], true); if(RET_OK == pDlg->Execute()) { //preview update InsertDataHdl_Impl(0); GetWizard()->UpdateRoadmap(); GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); } delete pDlg; return 0; } /*-- 11.06.2004 13:37:22--------------------------------------------------- -----------------------------------------------------------------------*/ void SwMailMergeAddressBlockPage::EnableAddressBlock(sal_Bool bAll, sal_Bool bSelective) { m_aSettingsFI.Enable(bAll); m_aAddressCB.Enable(bAll); bSelective &= bAll; m_aHideEmptyParagraphsCB.Enable(bSelective); m_aSettingsWIN.Enable(bSelective); m_aSettingsPB.Enable(bSelective); m_aPreviewFI.Enable(bSelective); m_aPreviewWIN.Enable(bSelective); m_aThirdFI.Enable(bSelective); m_aMatchFieldsFI.Enable(bSelective); m_aAssignPB.Enable(bSelective); m_aDocumentIndexFI.Enable(bSelective); m_aPrevSetIB.Enable(bSelective); m_aNextSetIB.Enable(bSelective); } /*-- 28.04.2004 12:45:58--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwMailMergeAddressBlockPage, AddressBlockHdl_Impl, CheckBox*, pBox) { EnableAddressBlock(pBox->IsEnabled(), pBox->IsChecked()); SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); rConfigItem.SetAddressBlock(m_aAddressCB.IsChecked()); m_pWizard->UpdateRoadmap(); return 0; } /*-- 08.06.2004 13:00:29--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwMailMergeAddressBlockPage, AddressBlockSelectHdl_Impl, SwAddressPreview*, EMPTYARG) { sal_uInt16 nSel = m_aSettingsWIN.GetSelectedAddress(); const uno::Sequence< ::rtl::OUString> aBlocks = m_pWizard->GetConfigItem().GetAddressBlocks(); String sPreview = SwAddressPreview::FillData(aBlocks[nSel], m_pWizard->GetConfigItem()); m_aPreviewWIN.SetAddress(sPreview); m_pWizard->GetConfigItem().SetCurrentAddressBlockIndex( nSel ); GetWizard()->UpdateRoadmap(); GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); return 0; } /*-- 31.08.2005 15:34:55--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwMailMergeAddressBlockPage, HideParagraphsHdl_Impl, CheckBox*, pBox) { SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); rConfigItem.SetHideEmptyParagraphs( pBox->IsChecked() ); return 0; } // ------------------------------------------------------------------------------ IMPL_LINK(SwMailMergeAddressBlockPage, InsertDataHdl_Impl, ImageButton*, pButton) { //if no pButton is given, the first set has to be pre-set SwMailMergeConfigItem& rConfig = m_pWizard->GetConfigItem(); m_pWizard->EnterWait(); if(!pButton) { rConfig.GetResultSet(); } else { sal_Bool bNext = pButton == &m_aNextSetIB; sal_Int32 nPos = rConfig.GetResultSetPosition(); rConfig.MoveResultSet( bNext ? ++nPos : --nPos); } m_pWizard->LeaveWait(); sal_Int32 nPos = rConfig.GetResultSetPosition(); sal_Bool bEnable = sal_True; if(nPos < 1) { bEnable = sal_False; nPos = 1; } else { //if output type is letter if(m_aSettingsWIN.IsVisible()) { //Fill data into preview sal_uInt16 nSel = m_aSettingsWIN.GetSelectedAddress(); const uno::Sequence< ::rtl::OUString> aBlocks = m_pWizard->GetConfigItem().GetAddressBlocks(); String sPreview = SwAddressPreview::FillData(aBlocks[nSel], rConfig); m_aPreviewWIN.SetAddress(sPreview); } } m_aPrevSetIB.Enable(bEnable); //m_aNextSetIB.Enable(bEnable); //m_aDocumentIndexFI.Enable(bEnable); String sTemp(m_sDocument); sTemp.SearchAndReplaceAscii("%1", String::CreateFromInt32(nPos)); m_aDocumentIndexFI.SetText(sTemp); GetWizard()->enableButtons(WZB_NEXT, GetWizard()->isStateEnabled(MM_GREETINGSPAGE)); sal_Bool bHasResultSet = rConfig.GetResultSet().is(); m_aCurrentAddressFI.Show(bHasResultSet); if(bHasResultSet) { String sTmp = m_sCurrentAddress; sTmp.SearchAndReplaceAscii("%1", rConfig.GetCurrentDBData().sDataSource ); m_aCurrentAddressFI.SetText(sTmp); m_aAddressListPB.SetText(m_sChangeAddress); } EnableAddressBlock(bHasResultSet, m_aAddressCB.IsChecked()); return 0; } /*-- 13.04.2004 16:01:26--------------------------------------------------- -----------------------------------------------------------------------*/ SwSelectAddressBlockDialog::SwSelectAddressBlockDialog( Window* pParent, SwMailMergeConfigItem& rConfig) : SfxModalDialog(pParent, SW_RES(DLG_MM_SELECTADDRESSBLOCK)), #ifdef MSC #pragma warning (disable : 4355) #endif m_aSelectFT( this, SW_RES( FT_SELECT)), m_aPreview( this, SW_RES( WIN_PREVIEW)), m_aNewPB( this, SW_RES( PB_NEW)), m_aCustomizePB( this, SW_RES( PB_CUSTOMIZE)), m_aDeletePB( this, SW_RES( PB_DELETE)), m_aSettingsFI( this, SW_RES( FI_SETTINGS)), m_aNeverRB( this, SW_RES( RB_NEVER)), m_aAlwaysRB( this, SW_RES( RB_ALWAYS)), m_aDependentRB( this, SW_RES( RB_DEPENDENT)), m_aCountryED( this, SW_RES( ED_COUNTRY)), m_aSeparatorFL( this, SW_RES( FL_SEPARATOR)), m_aOK( this, SW_RES( PB_OK)), m_aCancel( this, SW_RES( PB_CANCEL)), m_aHelp( this, SW_RES( PB_HELP)), #ifdef MSC #pragma warning (default : 4355) #endif m_rConfig(rConfig) { FreeResource(); Link aCustomizeHdl = LINK(this, SwSelectAddressBlockDialog, NewCustomizeHdl_Impl); m_aNewPB.SetClickHdl(aCustomizeHdl); m_aCustomizePB.SetClickHdl(aCustomizeHdl); m_aDeletePB.SetClickHdl(LINK(this, SwSelectAddressBlockDialog, DeleteHdl_Impl)); Link aLk = LINK(this, SwSelectAddressBlockDialog, IncludeHdl_Impl); m_aNeverRB.SetClickHdl(aLk); m_aAlwaysRB.SetClickHdl(aLk); m_aDependentRB.SetClickHdl(aLk); m_aPreview.SetLayout(2, 2); m_aPreview.EnableScrollBar(); } /*-- 13.04.2004 16:01:27--------------------------------------------------- -----------------------------------------------------------------------*/ SwSelectAddressBlockDialog::~SwSelectAddressBlockDialog() { } /*-- 28.04.2004 11:48:11--------------------------------------------------- -----------------------------------------------------------------------*/ void SwSelectAddressBlockDialog::SetAddressBlocks(const uno::Sequence< ::rtl::OUString>& rBlocks, sal_uInt16 nSelectedAddress) { m_aAddressBlocks = rBlocks; for(sal_Int32 nAddress = 0; nAddress < m_aAddressBlocks.getLength(); ++nAddress) m_aPreview.AddAddress(m_aAddressBlocks[nAddress]); m_aPreview.SelectAddress(nSelectedAddress); } /*-- 25.06.2004 10:51:36--------------------------------------------------- return the address blocks and put the selected one to the first position -----------------------------------------------------------------------*/ const uno::Sequence< ::rtl::OUString >& SwSelectAddressBlockDialog::GetAddressBlocks() { //put the selected block to the first position sal_uInt16 nSelect = m_aPreview.GetSelectedAddress(); if(nSelect) { uno::Sequence< ::rtl::OUString >aTemp = m_aAddressBlocks; ::rtl::OUString* pTemp = aTemp.getArray(); pTemp[0] = m_aAddressBlocks[nSelect]; sal_uInt32 nIndex = 0; const sal_uInt32 nNumBlocks = m_aAddressBlocks.getLength(); for(sal_uInt32 nAddress = 1; nAddress < nNumBlocks; ++nAddress) { if(nIndex == nSelect) ++nIndex; pTemp[nAddress] = m_aAddressBlocks[nIndex]; nIndex++; } m_aAddressBlocks = aTemp; } return m_aAddressBlocks; } /*-- 28.04.2004 11:48:11--------------------------------------------------- -----------------------------------------------------------------------*/ void SwSelectAddressBlockDialog::SetSettings( sal_Bool bIsCountry, ::rtl::OUString rCountry) { if(bIsCountry) { rCountry.getLength() ? m_aDependentRB.Check() : m_aAlwaysRB.Check(); m_aCountryED.SetText(rCountry); } else m_aNeverRB.Check(); m_aDeletePB.Enable(m_aAddressBlocks.getLength() > 1); } /*-- 10.05.2004 11:17:06--------------------------------------------------- -----------------------------------------------------------------------*/ ::rtl::OUString SwSelectAddressBlockDialog::GetCountry() const { ::rtl::OUString sRet; if(m_aDependentRB.IsChecked()) sRet = m_aCountryED.GetText(); return sRet; } /*-- 13.04.2004 16:02:32--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwSelectAddressBlockDialog, DeleteHdl_Impl, PushButton*, pButton) { if(m_aAddressBlocks.getLength()) { sal_uInt16 nSelected = m_aPreview.GetSelectedAddress(); ::rtl::OUString* pAddressBlocks = m_aAddressBlocks.getArray(); sal_Int32 nSource = 0; for(sal_Int32 nTarget = 0; nTarget < m_aAddressBlocks.getLength() - 1; nTarget++) { if(nSource == nSelected) ++nSource; pAddressBlocks[nTarget] = pAddressBlocks[nSource++]; } m_aAddressBlocks.realloc(m_aAddressBlocks.getLength() - 1); if(m_aAddressBlocks.getLength() <= 1) pButton->Enable(sal_False); m_aPreview.RemoveSelectedAddress(); } return 0; } /*-- 13.04.2004 16:02:32--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwSelectAddressBlockDialog, NewCustomizeHdl_Impl, PushButton*, pButton) { bool bCustomize = pButton == &m_aCustomizePB; SwCustomizeAddressBlockDialog::DialogType nType = bCustomize ? SwCustomizeAddressBlockDialog::ADDRESSBLOCK_EDIT : SwCustomizeAddressBlockDialog::ADDRESSBLOCK_NEW; SwCustomizeAddressBlockDialog *pDlg = new SwCustomizeAddressBlockDialog(pButton,m_rConfig,nType); if(bCustomize) { pDlg->SetAddress(m_aAddressBlocks[m_aPreview.GetSelectedAddress()]); } if(RET_OK == pDlg->Execute()) { if(bCustomize) { ::rtl::OUString sNew = pDlg->GetAddress(); m_aPreview.ReplaceSelectedAddress(sNew); m_aAddressBlocks[m_aPreview.GetSelectedAddress()] = sNew; } else { ::rtl::OUString sNew = pDlg->GetAddress(); m_aPreview.AddAddress(sNew); m_aAddressBlocks.realloc(m_aAddressBlocks.getLength() + 1); sal_uInt16 nSelect = (sal_uInt16)m_aAddressBlocks.getLength() - 1; m_aAddressBlocks[nSelect] = sNew; m_aPreview.SelectAddress(nSelect); } m_aDeletePB.Enable( m_aAddressBlocks.getLength() > 1); } delete pDlg; return 0; } /*-- 13.04.2004 16:02:33--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwSelectAddressBlockDialog, IncludeHdl_Impl, RadioButton*, pButton) { m_aCountryED.Enable(&m_aDependentRB == pButton); return 0; } /* -----------------------------28.02.05 09:00-------------------------------- ---------------------------------------------------------------------------*/ SwRestrictedComboBox::~SwRestrictedComboBox() { } /* -----------------------------28.02.05 09:00-------------------------------- ---------------------------------------------------------------------------*/ void SwRestrictedComboBox::KeyInput(const KeyEvent& rEvt) { sal_Bool bCallParent = sal_True; if(rEvt.GetCharCode()) { String sKey = rEvt.GetCharCode(); if( STRING_NOTFOUND != sForbiddenChars.Search(sKey)) bCallParent = sal_False; } if(bCallParent) ComboBox::KeyInput(rEvt); } /* -----------------------------28.02.05 09:00-------------------------------- ---------------------------------------------------------------------------*/ void SwRestrictedComboBox::Modify() { Selection aSel = GetSelection(); String sTemp = GetText(); for(sal_uInt16 i = 0; i < sForbiddenChars.Len(); i++) { sTemp.EraseAllChars( sForbiddenChars.GetChar(i) ); } sal_uInt16 nDiff = GetText().Len() - sTemp.Len(); if(nDiff) { aSel.setMin(aSel.getMin() - nDiff); aSel.setMax(aSel.getMin()); SetText(sTemp); SetSelection(aSel); } if(GetModifyHdl().IsSet()) GetModifyHdl().Call(this); } /*-- 13.04.2004 16:01:08--------------------------------------------------- -----------------------------------------------------------------------*/ #define USER_DATA_SALUTATION -1 #define USER_DATA_PUNCTUATION -2 #define USER_DATA_TEXT -3 #define USER_DATA_NONE -4 SwCustomizeAddressBlockDialog::SwCustomizeAddressBlockDialog( Window* pParent, SwMailMergeConfigItem& rConfig, DialogType eType) : SfxModalDialog(pParent, SW_RES(DLG_MM_CUSTOMIZEADDRESSBLOCK)), #ifdef MSC #pragma warning (disable : 4355) #endif m_aAddressElementsFT( this, SW_RES( FT_ADDRESSELEMENTS )), m_aAddressElementsLB( this, SW_RES( LB_ADDRESSELEMENTS )), m_aInsertFieldIB( this, SW_RES( IB_INSERTFIELD )), m_aRemoveFieldIB( this, SW_RES( IB_REMOVEFIELD )), m_aDragFT( this, SW_RES( FT_DRAG )), m_aDragED( this, SW_RES( ED_DRAG )), m_aUpIB( this, SW_RES( IB_UP )), m_aLeftIB( this, SW_RES( IB_LEFT )), m_aRightIB( this, SW_RES( IB_RIGHT )), m_aDownIB( this, SW_RES( IB_DOWN )), m_aFieldFT( this, SW_RES( FT_FIELD )), m_aFieldCB( this, SW_RES( CB_FIELD )), m_aPreviewFI( this, SW_RES( FI_PREVIEW )), m_aPreviewWIN( this, SW_RES( WIN_PREVIEW )), m_aSeparatorFL( this, SW_RES( FL_SEPARATOR )), m_aOK( this, SW_RES( PB_OK )), m_aCancel( this, SW_RES( PB_CANCEL )), m_aHelp( this, SW_RES( PB_HELP )), #ifdef MSC #pragma warning (default : 4355) #endif m_rConfigItem(rConfig), m_eType(eType) { m_aFieldCB.SetForbiddenChars( String::CreateFromAscii("<>")); m_aDragED.SetStyle(m_aDragED.GetStyle() |WB_NOHIDESELECTION); if( eType >= GREETING_FEMALE ) { m_aFieldFT.Show(); m_aFieldCB.Show(); SvLBoxEntry* pEntry = m_aAddressElementsLB.InsertEntry(String(SW_RES(ST_SALUTATION ))); pEntry->SetUserData((void*)(sal_Int32)USER_DATA_SALUTATION ); pEntry = m_aAddressElementsLB.InsertEntry(String(SW_RES(ST_PUNCTUATION))); pEntry->SetUserData((void*)(sal_Int32)USER_DATA_PUNCTUATION ); pEntry = m_aAddressElementsLB.InsertEntry(String(SW_RES(ST_TEXT ))); pEntry->SetUserData((void*)(sal_Int32)USER_DATA_TEXT ); ResStringArray aSalutArr(SW_RES( eType == GREETING_MALE ? RA_SALUTATION_MALE : RA_SALUTATION_FEMALE)); sal_uInt16 i; for(i = 0; i < aSalutArr.Count(); ++i) m_aSalutations.push_back(aSalutArr.GetString(i)); ResStringArray aPunctArr(SW_RES(RA_PUNCTUATION)); for(i = 0; i < aPunctArr.Count(); ++i) m_aPunctuations.push_back(aPunctArr.GetString(i)); m_aDragED.SetText(String::CreateFromAscii(" ")); SetText( String( SW_RES( eType == GREETING_MALE ? ST_TITLE_MALE : ST_TITLE_FEMALE))); m_aAddressElementsFT.SetText(String(SW_RES(ST_SALUTATIONELEMENTS))); m_aInsertFieldIB.SetQuickHelpText(String(SW_RES(ST_INSERTSALUTATIONFIELD))); m_aRemoveFieldIB.SetQuickHelpText(String(SW_RES(ST_REMOVESALUTATIONFIELD))); m_aDragFT.SetText(String(SW_RES(ST_DRAGSALUTATION))); } else { if(eType == ADDRESSBLOCK_EDIT) SetText(String(SW_RES(ST_TITLE_EDIT))); //resize the preview Point aFieldPos(m_aFieldFT.GetPosPixel()); long nDiff = m_aPreviewFI.GetPosPixel().Y() - aFieldPos.Y(); m_aPreviewFI.SetPosPixel(aFieldPos); Size aPreviewSize = m_aPreviewWIN.GetSizePixel(); aPreviewSize.Height() += nDiff; m_aPreviewWIN.SetSizePixel(aPreviewSize); m_aPreviewWIN.SetPosPixel(m_aFieldCB.GetPosPixel()); m_aDragED.SetText(String::CreateFromAscii("\n\n\n\n\n")); } FreeResource(); const ResStringArray& rHeaders = m_rConfigItem.GetDefaultAddressHeaders(); for(sal_uInt16 i = 0; i < rHeaders.Count(); ++i) { const XubString& rHeader = rHeaders.GetString( i ); SvLBoxEntry* pEntry = m_aAddressElementsLB.InsertEntry(rHeader); pEntry->SetUserData((void*)(sal_Int32)i); } m_aOK.SetClickHdl(LINK(this, SwCustomizeAddressBlockDialog, OKHdl_Impl)); m_aAddressElementsLB.SetSelectHdl(LINK(this, SwCustomizeAddressBlockDialog, ListBoxSelectHdl_Impl )); m_aDragED.SetModifyHdl(LINK(this, SwCustomizeAddressBlockDialog, EditModifyHdl_Impl)); m_aDragED.SetSelectionChangedHdl( LINK( this, SwCustomizeAddressBlockDialog, SelectionChangedHdl_Impl)); Link aFieldsLink = LINK(this, SwCustomizeAddressBlockDialog, FieldChangeHdl_Impl); m_aFieldCB.SetModifyHdl(aFieldsLink); m_aFieldCB.SetSelectHdl(aFieldsLink); Link aImgButtonHdl = LINK(this, SwCustomizeAddressBlockDialog, ImageButtonHdl_Impl); m_aInsertFieldIB.SetClickHdl(aImgButtonHdl); m_aRemoveFieldIB.SetClickHdl(aImgButtonHdl); m_aUpIB.SetClickHdl(aImgButtonHdl); m_aLeftIB.SetClickHdl(aImgButtonHdl); m_aRightIB.SetClickHdl(aImgButtonHdl); m_aDownIB.SetClickHdl(aImgButtonHdl); UpdateImageButtons_Impl(); } /*-- 13.04.2004 16:01:08--------------------------------------------------- -----------------------------------------------------------------------*/ SwCustomizeAddressBlockDialog::~SwCustomizeAddressBlockDialog() { } /*-- 07.06.2004 13:51:11--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwCustomizeAddressBlockDialog, OKHdl_Impl, OKButton*, EMPTYARG) { EndDialog(RET_OK); return 0; } /*-- 24.06.2004 11:36:05--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwCustomizeAddressBlockDialog, ListBoxSelectHdl_Impl, DDListBox*, pBox) { sal_Int32 nUserData = (sal_Int32)(sal_IntPtr)pBox->FirstSelected()->GetUserData(); // Check if the selected entry is already in the address and then forbid inserting m_aInsertFieldIB.Enable(nUserData >= 0 || !HasItem_Impl(nUserData)); return 0; } /*-- 25.06.2004 11:21:24--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwCustomizeAddressBlockDialog, EditModifyHdl_Impl, AddressMultiLineEdit*, EMPTYARG) { String sAddress = SwAddressPreview::FillData( GetAddress(), m_rConfigItem); m_aPreviewWIN.SetAddress(sAddress); UpdateImageButtons_Impl(); return 0; } /*-- 25.06.2004 12:14:11--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwCustomizeAddressBlockDialog, ImageButtonHdl_Impl, ImageButton*, pButton) { if(&m_aInsertFieldIB == pButton) { SvLBoxEntry* pEntry = m_aAddressElementsLB.GetCurEntry(); if(pEntry) { String sEntry = m_aAddressElementsLB.GetEntryText(pEntry); sEntry.Insert('<', 0); sEntry += '>'; m_aDragED.InsertNewEntry(sEntry); } } else if(&m_aRemoveFieldIB == pButton) { m_aDragED.RemoveCurrentEntry(); } else { sal_uInt16 nMove = MOVE_ITEM_DOWN; if(&m_aUpIB == pButton) nMove = MOVE_ITEM_UP; else if(&m_aLeftIB == pButton) nMove = MOVE_ITEM_LEFT; else if(&m_aRightIB == pButton) nMove = MOVE_ITEM_RIGHT; m_aDragED.MoveCurrentItem(nMove); } UpdateImageButtons_Impl(); return 0; } /*-- 01.07.2004 09:27:02--------------------------------------------------- -----------------------------------------------------------------------*/ sal_Int32 SwCustomizeAddressBlockDialog::GetSelectedItem_Impl() { sal_Int32 nRet = USER_DATA_NONE; String sSelected = m_aDragED.GetCurrentItem(); if(sSelected.Len()) for(sal_uLong i = 0; i < m_aAddressElementsLB.GetEntryCount(); ++i) { SvLBoxEntry* pEntry = m_aAddressElementsLB.GetEntry(i); String sEntry = m_aAddressElementsLB.GetEntryText(pEntry); if( sSelected.Equals( sEntry, 1, sSelected.Len() - 2 ) ) { nRet = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); break; } } return nRet; } /*-- 01.07.2004 10:01:19--------------------------------------------------- -----------------------------------------------------------------------*/ bool SwCustomizeAddressBlockDialog::HasItem_Impl(sal_Int32 nUserData) { //get the entry from the ListBox String sEntry; for(sal_uLong i = 0; i < m_aAddressElementsLB.GetEntryCount(); ++i) { SvLBoxEntry* pEntry = m_aAddressElementsLB.GetEntry(i); if((sal_Int32)(sal_IntPtr)pEntry->GetUserData() == nUserData) { sEntry = m_aAddressElementsLB.GetEntryText(pEntry); break; } } //put it into '<>' sEntry += '>'; sEntry.Insert( '<', 0); //search for this entry in the content String sText = m_aDragED.GetText(); bool bRet = sText.Search(sEntry) != STRING_NOTFOUND; return bRet; } /*-- 25.06.2004 13:10:16--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwCustomizeAddressBlockDialog, SelectionChangedHdl_Impl, AddressMultiLineEdit*, pEdit) { // called in case the selection of the edit field changes. // determine selection - if it's one of the editable fields then // enable the related ComboBox and fill it static bool bOnEntry = false; if(bOnEntry) return 0; bOnEntry = true; sal_Int32 nSelected = GetSelectedItem_Impl(); if(USER_DATA_NONE != nSelected) pEdit->SelectCurrentItem(); if(m_aFieldCB.IsVisible() && (USER_DATA_NONE != nSelected) && (nSelected < 0)) { //search in ListBox if it's one of the first entries String sSelect; ::std::vector* pVector = 0; switch(nSelected) { case USER_DATA_SALUTATION: sSelect = m_sCurrentSalutation; pVector = &m_aSalutations; break; case USER_DATA_PUNCTUATION: sSelect = m_sCurrentPunctuation; pVector = &m_aPunctuations; break; case USER_DATA_TEXT: sSelect = m_sCurrentText; break; } m_aFieldCB.Clear(); if(pVector) { ::std::vector::iterator aIterator; for( aIterator = pVector->begin(); aIterator != pVector->end(); ++aIterator) m_aFieldCB.InsertEntry(*aIterator); } m_aFieldCB.SetText(sSelect); m_aFieldCB.Enable(sal_True); m_aFieldFT.Enable(sal_True); } else { m_aFieldCB.Enable(sal_False); m_aFieldFT.Enable(sal_False); } UpdateImageButtons_Impl(); bOnEntry = false; return 0; } /*-- 25.06.2004 13:36:29--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwCustomizeAddressBlockDialog, FieldChangeHdl_Impl, ComboBox*, EMPTYARG) { //changing the field content changes the related members, too sal_Int32 nSelected = GetSelectedItem_Impl(); String sContent = m_aFieldCB.GetText(); switch(nSelected) { case USER_DATA_SALUTATION: m_sCurrentSalutation = sContent; break; case USER_DATA_PUNCTUATION: m_sCurrentPunctuation = sContent; break; case USER_DATA_TEXT: m_sCurrentText = sContent; break; } UpdateImageButtons_Impl(); m_aPreviewWIN.SetAddress(GetAddress()); m_aDragED.Modify(); return 0; } /*-- 25.06.2004 12:35:51--------------------------------------------------- -----------------------------------------------------------------------*/ void SwCustomizeAddressBlockDialog::UpdateImageButtons_Impl() { sal_uInt16 nMove = m_aDragED.IsCurrentItemMoveable(); m_aUpIB.Enable(nMove & MOVE_ITEM_UP ); m_aLeftIB.Enable(nMove & MOVE_ITEM_LEFT ); m_aRightIB.Enable(nMove & MOVE_ITEM_RIGHT ); m_aDownIB.Enable(nMove & MOVE_ITEM_DOWN); m_aRemoveFieldIB.Enable(m_aDragED.HasCurrentItem() ? sal_True : sal_False); SvLBoxEntry* pEntry = m_aAddressElementsLB.GetCurEntry(); m_aInsertFieldIB.Enable( pEntry && (0 < (sal_Int32)(sal_IntPtr)pEntry->GetUserData() || m_aFieldCB.GetText().Len())); } /*-- 28.04.2004 12:04:14--------------------------------------------------- -----------------------------------------------------------------------*/ void SwCustomizeAddressBlockDialog::SetAddress(const ::rtl::OUString& rAddress) { m_aDragED.SetText( rAddress ); UpdateImageButtons_Impl(); m_aDragED.Modify(); } /*-- 28.04.2004 12:04:14--------------------------------------------------- -----------------------------------------------------------------------*/ ::rtl::OUString SwCustomizeAddressBlockDialog::GetAddress() { String sAddress(m_aDragED.GetAddress()); //remove placeholders by the actual content if(m_aFieldFT.IsVisible()) { for(sal_uLong i = 0; i < m_aAddressElementsLB.GetEntryCount(); ++i) { SvLBoxEntry* pEntry = m_aAddressElementsLB.GetEntry(i); String sEntry = m_aAddressElementsLB.GetEntryText(pEntry); sEntry += '>'; sEntry.Insert('<', 0); sal_Int32 nUserData = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); switch(nUserData) { case USER_DATA_SALUTATION : sAddress.SearchAndReplace(sEntry, m_sCurrentSalutation); break; case USER_DATA_PUNCTUATION: sAddress.SearchAndReplace(sEntry, m_sCurrentPunctuation); break; case USER_DATA_TEXT : sAddress.SearchAndReplace(sEntry, m_sCurrentText); break; } } } return sAddress; } /*-- 28.02.2005 11:03:35--------------------------------------------------- -----------------------------------------------------------------------*/ void SwCustomizeAddressBlockDialog::MoveFocus( Window* pMember, bool bNext ) { ::std::vector< Window* > aControls; aControls.push_back(&m_aAddressElementsLB); aControls.push_back(&m_aInsertFieldIB); aControls.push_back(&m_aRemoveFieldIB); aControls.push_back(&m_aDragED); aControls.push_back(&m_aUpIB); aControls.push_back(&m_aLeftIB); aControls.push_back(&m_aRightIB); aControls.push_back(&m_aDownIB); aControls.push_back(&m_aFieldCB); aControls.push_back(&m_aOK); aControls.push_back(&m_aCancel); aControls.push_back(&m_aHelp); ::std::vector< Window* >::iterator aMemberIter = aControls.begin(); for( ; aMemberIter != aControls.end(); ++aMemberIter) { if(*aMemberIter == pMember) break; } if( aMemberIter == aControls.end() ) { DBG_ERROR( "Window not found?" ); return; } if( bNext ) { ::std::vector< Window* >::iterator aSearch = aMemberIter; ++aSearch; while( true ) { if( aSearch == aControls.end()) aSearch = aControls.begin(); else if( (*aSearch)->IsEnabled() ) { (*aSearch)->GrabFocus(); break; } else ++aSearch; } } else { ::std::vector< Window* >::iterator aSearch = aMemberIter; if(aSearch == aControls.begin()) aSearch = aControls.end(); while( true ) { if(aSearch == aControls.begin()) aSearch = aControls.end(); else --aSearch; if( (*aSearch)->IsEnabled() ) { (*aSearch)->GrabFocus(); break; } } } } /*-- 13.04.2004 17:49:45--------------------------------------------------- -----------------------------------------------------------------------*/ class SwAssignFieldsControl : public Control { friend class SwAssignFieldsDialog; ScrollBar m_aVScroll; HeaderBar m_aHeaderHB; Window m_aWindow; ::std::vector m_aFieldNames; ::std::vector m_aMatches; ::std::vector m_aPreviews; SwMailMergeConfigItem& m_rConfigItem; Link m_aModifyHdl; long m_nLBStartTopPos; long m_nYOffset; long m_nFirstYPos; DECL_LINK(ScrollHdl_Impl, ScrollBar*); DECL_LINK(MatchHdl_Impl, ListBox*); DECL_LINK(GotFocusHdl_Impl, ListBox*); virtual long PreNotify( NotifyEvent& rNEvt ); virtual void Command( const CommandEvent& rCEvt ); void MakeVisible( sal_Int32 nIndex ); public: SwAssignFieldsControl(Window* pParent, const ResId& rResId, SwMailMergeConfigItem& rConfigItem); ~SwAssignFieldsControl(); void SetModifyHdl(const Link& rModifyHdl) { m_aModifyHdl = rModifyHdl; m_aModifyHdl.Call(this); } }; /*-- 13.04.2004 17:51:27--------------------------------------------------- -----------------------------------------------------------------------*/ //------------------------------------------------------------------------- SwAssignFieldsControl::SwAssignFieldsControl( Window* pParent, const ResId& rResId, SwMailMergeConfigItem& rConfigItem) : Control(pParent, rResId), #ifdef MSC #pragma warning (disable : 4355) #endif m_aVScroll(this, ResId(SCR_1, *rResId.GetResMgr() )), m_aHeaderHB(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER), m_aWindow(this, ResId(WIN_DATA, *rResId.GetResMgr())), #ifdef MSC #pragma warning (default : 4355) #endif m_rConfigItem(rConfigItem), m_nLBStartTopPos(0), m_nYOffset(0), m_nFirstYPos(0) { SetStyle(GetStyle()|WB_TABSTOP|WB_DIALOGCONTROL); SetHelpId(HID_MM_ASSIGN_FIELDS); long nHBHeight = m_aHeaderHB.CalcWindowSizePixel().Height(); Size aOutputSize(GetOutputSize()); m_aHeaderHB.SetSizePixel( Size(aOutputSize.Width(), nHBHeight)); m_aHeaderHB.Show(); m_aWindow.SetPosPixel(Point( 0, nHBHeight) ); m_aWindow.SetSizePixel(Size(aOutputSize.Width() - m_aVScroll.GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); m_aWindow.Show(); //get the name of the default headers const ResStringArray& rHeaders = rConfigItem.GetDefaultAddressHeaders(); //get the actual data uno::Reference< XColumnsSupplier > xColsSupp( rConfigItem.GetResultSet(), uno::UNO_QUERY); //get the name of the actual columns uno::Reference xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0; uno::Sequence< ::rtl::OUString > aFields; if(xColAccess.is()) aFields = xColAccess->getElementNames(); const ::rtl::OUString* pFields = aFields.getConstArray(); //get the current assignment list //each position in this sequence matches the position in the header array rHeaders //if no assignment is available an empty sequence will be returned uno::Sequence< ::rtl::OUString> aAssignments = rConfigItem.GetColumnAssignment( rConfigItem.GetCurrentDBData() ); Link aMatchHdl = LINK(this, SwAssignFieldsControl, MatchHdl_Impl); Link aFocusHdl = LINK(this, SwAssignFieldsControl, GotFocusHdl_Impl); static const char* aHIDs[] = { HID_MM_HEADER_0, HID_MM_HEADER_1, HID_MM_HEADER_2, HID_MM_HEADER_3, HID_MM_HEADER_4, HID_MM_HEADER_5, HID_MM_HEADER_6, HID_MM_HEADER_7, HID_MM_HEADER_8, HID_MM_HEADER_9, HID_MM_HEADER_10, HID_MM_HEADER_11, HID_MM_HEADER_12, HID_MM_HEADER_13 }; //fill the controls for(sal_uInt16 i = 0; i < rHeaders.Count(); ++i) { const XubString& rHeader = rHeaders.GetString( i ); FixedInfo* pNewText = new FixedInfo(&m_aWindow, ResId( FT_FIELDS, *rResId.GetResMgr())); String sLabel(String::CreateFromAscii("<>")); sLabel.Insert(rHeader, 1); pNewText->SetText(sLabel); ListBox* pNewLB = new ListBox(&m_aWindow, ResId(LB_FIELDS, *rResId.GetResMgr())); pNewLB->SetHelpId( aHIDs[i] ); pNewLB->SelectEntryPos(0); for(sal_Int32 nField = 0; nField < aFields.getLength(); ++nField) pNewLB->InsertEntry(pFields[nField]); FixedInfo* pNewPreview = new FixedInfo(&m_aWindow, ResId( FT_PREVIEW, *rResId.GetResMgr() )); //select the ListBox //if there is an assignment if(aAssignments.getLength() > i && aAssignments[i].getLength()) pNewLB->SelectEntry(aAssignments[i]); else //otherwise the current column name may match one of the db columns pNewLB->SelectEntry(rHeader); //then the preview can be filled accordingly if(xColAccess.is() && pNewLB->GetSelectEntryPos() > 0 && xColAccess->hasByName(pNewLB->GetSelectEntry())) { uno::Any aCol = xColAccess->getByName(pNewLB->GetSelectEntry()); uno::Reference< XColumn > xColumn; aCol >>= xColumn; if(xColumn.is()) try { pNewPreview->SetText(xColumn->getString()); } catch(SQLException& ) { } } if(!i) { //determine the vertical offset, use the bottom position of the ListBox m_nFirstYPos = m_nYOffset = pNewLB->GetPosPixel().Y(); m_nLBStartTopPos = m_nYOffset; m_nYOffset += pNewLB->GetSizePixel().Height(); } long nMove = m_nYOffset * i; lcl_Move(pNewText, nMove); lcl_Move(pNewLB, nMove); lcl_Move(pNewPreview, nMove); //set the select handler pNewLB->SetSelectHdl(aMatchHdl); pNewLB->SetGetFocusHdl(aFocusHdl); m_aFieldNames.push_back(pNewText); m_aMatches.push_back(pNewLB); m_aPreviews.push_back(pNewPreview); } ListBox* pBottomBox = m_aMatches[rHeaders.Count() -1]; long nYBottom = pBottomBox->GetPosPixel().Y(); nYBottom += pBottomBox->GetDropDownPosSizePixel().GetHeight(); m_aVScroll.SetRange(Range(0, rHeaders.Count())); m_aVScroll.SetPageSize((aOutputSize.Height() - nHBHeight - m_nLBStartTopPos)/ m_nYOffset); m_aVScroll.EnableDrag(); m_aVScroll.SetVisibleSize(m_aVScroll.GetPageSize()); m_aVScroll.SetScrollHdl(LINK(this, SwAssignFieldsControl, ScrollHdl_Impl)); FreeResource(); m_aVScroll.SetPosPixel(Point(aOutputSize.Width() - m_aVScroll.GetSizePixel().Width(), nHBHeight)); m_aVScroll.SetSizePixel(Size(m_aVScroll.GetSizePixel().Width(), aOutputSize.Height() - nHBHeight)); } /*-- 13.04.2004 17:51:28--------------------------------------------------- -----------------------------------------------------------------------*/ SwAssignFieldsControl::~SwAssignFieldsControl() { ::std::vector::iterator aFIIter; for(aFIIter = m_aFieldNames.begin(); aFIIter != m_aFieldNames.end(); ++aFIIter) delete *aFIIter; ::std::vector::iterator aLBIter; for(aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter) delete *aLBIter; for(aFIIter = m_aPreviews.begin(); aFIIter != m_aPreviews.end(); ++aFIIter) delete *aFIIter; } /*-- 07.05.2004 13:11:26--------------------------------------------------- -----------------------------------------------------------------------*/ void SwAssignFieldsControl::Command( const CommandEvent& rCEvt ) { switch ( rCEvt.GetCommand() ) { case COMMAND_WHEEL: case COMMAND_STARTAUTOSCROLL: case COMMAND_AUTOSCROLL: { const CommandWheelData* pWheelData = rCEvt.GetWheelData(); if(pWheelData && !pWheelData->IsHorz() && COMMAND_WHEEL_ZOOM != pWheelData->GetMode()) { HandleScrollCommand( rCEvt, 0, &m_aVScroll ); } } break; default: Control::Command(rCEvt); } } /*-- 07.05.2004 13:11:21--------------------------------------------------- -----------------------------------------------------------------------*/ long SwAssignFieldsControl::PreNotify( NotifyEvent& rNEvt ) { if(rNEvt.GetType() == EVENT_COMMAND) { const CommandEvent* pCEvt = rNEvt.GetCommandEvent(); sal_uInt16 nCmd = pCEvt->GetCommand(); if( COMMAND_WHEEL == nCmd ) { Command(*pCEvt); return 1; } } return Control::PreNotify(rNEvt); } /*-- 03.09.2004 13:19:09--------------------------------------------------- -----------------------------------------------------------------------*/ void SwAssignFieldsControl::MakeVisible( sal_Int32 nIndex ) { long nThumb = m_aVScroll.GetThumbPos(); long nPage = m_aVScroll.GetPageSize(); if(nThumb > nIndex) m_aVScroll.SetThumbPos( nIndex ); else if( (nThumb + nPage) < nIndex) m_aVScroll.SetThumbPos( nIndex - nPage ); else return; ScrollHdl_Impl( &m_aVScroll ); } /*-- 30.04.2004 16:10:58--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwAssignFieldsControl, ScrollHdl_Impl, ScrollBar*, pScroll) { long nThumb = pScroll->GetThumbPos(); // the scrollbar moves on a per line basis // the height of a line is stored in m_nYOffset // nThumb determines which line has to be set at the top (m_nYOffset) // The first line has to be -(nThumb * m_nYOffset) in the negative long nMove = m_nFirstYPos - (*m_aMatches.begin())->GetPosPixel().Y() - (nThumb * m_nYOffset); SetUpdateMode(sal_False); long nIndex; ::std::vector::iterator aFIIter; for(nIndex = 0, aFIIter = m_aFieldNames.begin(); aFIIter != m_aFieldNames.end(); ++aFIIter, ++nIndex) lcl_Move(*aFIIter, nMove); ::std::vector::iterator aLBIter; for(nIndex = 0, aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter, ++nIndex) lcl_Move(*aLBIter, nMove); for(nIndex = 0, aFIIter = m_aPreviews.begin(); aFIIter != m_aPreviews.end(); ++aFIIter, ++nIndex) lcl_Move(*aFIIter, nMove); SetUpdateMode(sal_True); return 0; } /*-- 03.05.2004 15:37:52--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwAssignFieldsControl, MatchHdl_Impl, ListBox*, pBox) { String sColumn = pBox->GetSelectEntry(); uno::Reference< XColumnsSupplier > xColsSupp( m_rConfigItem.GetResultSet(), uno::UNO_QUERY); uno::Reference xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0; ::rtl::OUString sPreview; if(xColAccess.is() && xColAccess->hasByName(sColumn)) { uno::Any aCol = xColAccess->getByName(sColumn); uno::Reference< XColumn > xColumn; aCol >>= xColumn; if(xColumn.is()) { try { sPreview = xColumn->getString(); } catch( sdbc::SQLException& ) { } } } ::std::vector::iterator aLBIter; sal_Int32 nIndex = 0; for(aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter, ++nIndex) { if(*aLBIter == pBox) { m_aPreviews[nIndex]->SetText(sPreview); break; } } m_aModifyHdl.Call(0); return 0; } /*-- 03.09.2004 13:16:04--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwAssignFieldsControl, GotFocusHdl_Impl, ListBox*, pBox) { if(0 != (GETFOCUS_TAB & pBox->GetGetFocusFlags())) { sal_Int32 nIndex = 0; ::std::vector::iterator aLBIter; for(aLBIter = m_aMatches.begin(); aLBIter != m_aMatches.end(); ++aLBIter, ++nIndex) { if(*aLBIter == pBox) { MakeVisible(nIndex); break; } } } return 0; } /*-- 13.04.2004 17:44:01--------------------------------------------------- -----------------------------------------------------------------------*/ SwAssignFieldsDialog::SwAssignFieldsDialog( Window* pParent, SwMailMergeConfigItem& rConfigItem, const ::rtl::OUString& rPreview, bool bIsAddressBlock) : SfxModalDialog(pParent, SW_RES(DLG_MM_ASSIGNFIELDS)), #ifdef MSC #pragma warning (disable : 4355) #endif m_aMatchingFI( this, SW_RES( FI_MATCHING)), m_pFieldsControl( new SwAssignFieldsControl(this, SW_RES( CT_FIELDS ), rConfigItem)), m_aPreviewFI( this, SW_RES( FI_PREVIEW )), m_aPreviewWIN( this, SW_RES( WIN_PREVIEW )), m_aSeparatorFL( this, SW_RES( FL_SEPARATOR)), m_aOK( this, SW_RES( PB_OK )), m_aCancel( this, SW_RES( PB_CANCEL )), m_aHelp( this, SW_RES( PB_HELP )), #ifdef MSC #pragma warning (default : 4355) #endif m_sNone(SW_RES(ST_NONE)), m_rPreviewString(rPreview), m_rConfigItem(rConfigItem) { //resize the HeaderBar String sAddressElement( SW_RES(ST_ADDRESSELEMENT )); String sMatchesTo( SW_RES(ST_MATCHESTO )); String sPreview( SW_RES(ST_PREVIEW )); if(!bIsAddressBlock) { m_aPreviewFI.SetText(String(SW_RES(ST_SALUTATIONPREVIEW))); m_aMatchingFI.SetText(String(SW_RES(ST_SALUTATIONMATCHING))); sAddressElement = String(SW_RES(ST_SALUTATIONELEMENT)); } FreeResource(); Size aOutputSize(m_pFieldsControl->m_aHeaderHB.GetSizePixel()); sal_Int32 nFirstWidth; sal_Int32 nSecondWidth = nFirstWidth = aOutputSize.Width() / 3; const WinBits nHeadBits = HIB_VCENTER | HIB_FIXED| HIB_FIXEDPOS; m_pFieldsControl->m_aHeaderHB.InsertItem( 1, sAddressElement, nFirstWidth, nHeadBits|HIB_LEFT); m_pFieldsControl->m_aHeaderHB.InsertItem( 2, sMatchesTo, nSecondWidth, nHeadBits|HIB_LEFT); m_pFieldsControl->m_aHeaderHB.InsertItem( 3, sPreview, aOutputSize.Width() - nFirstWidth - nSecondWidth, nHeadBits|HIB_LEFT); m_pFieldsControl->SetModifyHdl(LINK(this, SwAssignFieldsDialog, AssignmentModifyHdl_Impl )); String sMatching = m_aMatchingFI.GetText(); sMatching.SearchAndReplaceAscii("%1", sMatchesTo); m_aMatchingFI.SetText(sMatching); m_aOK.SetClickHdl(LINK(this, SwAssignFieldsDialog, OkHdl_Impl)); } /*-- 13.04.2004 17:44:02--------------------------------------------------- -----------------------------------------------------------------------*/ SwAssignFieldsDialog::~SwAssignFieldsDialog() { delete m_pFieldsControl; } /*-- 05.05.2004 14:39:13--------------------------------------------------- -----------------------------------------------------------------------*/ uno::Sequence< ::rtl::OUString > SwAssignFieldsDialog::CreateAssignments() { uno::Sequence< ::rtl::OUString > aAssignments( m_rConfigItem.GetDefaultAddressHeaders().Count()); ::rtl::OUString* pAssignments = aAssignments.getArray(); ::std::vector::iterator aLBIter; sal_Int32 nIndex = 0; for(aLBIter = m_pFieldsControl->m_aMatches.begin(); aLBIter != m_pFieldsControl->m_aMatches.end(); ++aLBIter, ++nIndex) { String sSelect = (*aLBIter)->GetSelectEntry(); if(m_sNone != sSelect) pAssignments[nIndex] = sSelect; else pAssignments[nIndex] = ::rtl::OUString(); } return aAssignments; } /*-- 03.05.2004 18:04:00--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwAssignFieldsDialog, OkHdl_Impl, PushButton*, EMPTYARG) { m_rConfigItem.SetColumnAssignment( m_rConfigItem.GetCurrentDBData(), CreateAssignments() ); EndDialog(RET_OK); return 0; } /*-- 05.05.2004 14:37:19--------------------------------------------------- -----------------------------------------------------------------------*/ IMPL_LINK(SwAssignFieldsDialog, AssignmentModifyHdl_Impl, void*, EMPTYARG) { uno::Sequence< ::rtl::OUString > aAssignments = CreateAssignments(); String sPreview = SwAddressPreview::FillData( m_rPreviewString, m_rConfigItem, &aAssignments); m_aPreviewWIN.SetAddress(sPreview); return 0; } /*-- 26.05.2004 11:20:11--------------------------------------------------- -----------------------------------------------------------------------*/ DDListBox::DDListBox(SwCustomizeAddressBlockDialog* pParent, const ResId rResId) : SvTreeListBox(pParent, rResId), m_pParentDialog(pParent) { SetStyle( GetStyle() | /*WB_HASBUTTONS|WB_HASBUTTONSATROOT|*/ WB_CLIPCHILDREN ); // SetSpaceBetweenEntries(3); SetSelectionMode( SINGLE_SELECTION ); SetDragDropMode( SV_DRAGDROP_CTRL_COPY ); EnableAsyncDrag(sal_True); SetHelpId(HID_MM_CUSTOMFIELDS); // expand selection to the complete width of the ListBox SetHighlightRange(); Show(); } /*-- 26.05.2004 11:20:15--------------------------------------------------- -----------------------------------------------------------------------*/ DDListBox::~DDListBox() { } /*-- 26.05.2004 11:20:16--------------------------------------------------- -----------------------------------------------------------------------*/ void DDListBox::StartDrag( sal_Int8 /*nAction*/, const Point& /*rPosPixel*/ ) { SvLBoxEntry* pEntry = GetCurEntry(); if(pEntry) { ReleaseMouse(); TransferDataContainer* pContainer = new TransferDataContainer; uno::Reference< datatransfer::XTransferable > xRef( pContainer ); sal_Int32 nUserData = (sal_Int32)(sal_IntPtr)pEntry->GetUserData(); //special entries can only be once in the address / greeting if(nUserData >= 0 || !m_pParentDialog->HasItem_Impl(nUserData)) { String sEntry; sEntry = GetEntryText(pEntry); sEntry.Insert('<', 0); sEntry += '>'; if(sEntry.Len()) { pContainer->CopyString( sEntry ); pContainer->StartDrag( this, DND_ACTION_COPY, GetDragFinishedHdl() ); } } } } /*-- 26.05.2004 13:14:53--------------------------------------------------- -----------------------------------------------------------------------*/ AddressMultiLineEdit::AddressMultiLineEdit(SwCustomizeAddressBlockDialog* pParent, const ResId& rResId) : MultiLineEdit(pParent, rResId), m_pParentDialog(pParent) { GetTextView()->SupportProtectAttribute(sal_True); StartListening(*GetTextEngine()); //DisableSelectionOnFocus(); EnableFocusSelectionHide(sal_False); } /*-- 26.05.2004 13:14:53--------------------------------------------------- -----------------------------------------------------------------------*/ AddressMultiLineEdit::~AddressMultiLineEdit() { EndListening(*GetTextEngine()); } /*-- 25.06.2004 13:02:49--------------------------------------------------- -----------------------------------------------------------------------*/ void AddressMultiLineEdit::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) { if(rHint.ISA(TextHint) && static_cast(rHint).GetId() == TEXT_HINT_VIEWSELECTIONCHANGED && m_aSelectionLink.IsSet()) { m_aSelectionLink.Call(this); } } /*-- 26.05.2004 13:45:46--------------------------------------------------- -----------------------------------------------------------------------*/ long AddressMultiLineEdit::PreNotify( NotifyEvent& rNEvt ) { long nHandled = 0; if( EVENT_KEYINPUT == rNEvt.GetType() && rNEvt.GetKeyEvent()->GetCharCode()) { const KeyEvent* pKEvent = rNEvt.GetKeyEvent(); if('\t' == pKEvent->GetCharCode() && 0 == (pKEvent->GetKeyCode().GetModifier() & (KEY_MOD1|KEY_MOD2))) { m_pParentDialog->MoveFocus(this, !pKEvent->GetKeyCode().IsShift()); } nHandled = 1; } else if(EVENT_MOUSEBUTTONDOWN == rNEvt.GetType()) { const MouseEvent *pMEvt = rNEvt.GetMouseEvent(); if(pMEvt->GetClicks() >= 2) nHandled = 1; } if(!nHandled) nHandled = MultiLineEdit::PreNotify( rNEvt ); return nHandled; } /*-- 25.06.2004 08:20:54--------------------------------------------------- -----------------------------------------------------------------------*/ void AddressMultiLineEdit::SetText( const String& rStr ) { MultiLineEdit::SetText(rStr); //set attributes to all address tokens ExtTextEngine* pTextEngine = GetTextEngine(); TextAttribProtect aProtectAttr; sal_uLong nParaCount = pTextEngine->GetParagraphCount(); for(sal_uLong nPara = 0; nPara < nParaCount; ++nPara) { xub_StrLen nIndex = 0; String sPara = pTextEngine->GetText( nPara ); if(sPara.Len() && sPara.GetChar(sPara.Len() - 1) != ' ') { TextPaM aPaM(nPara, sPara.Len()); pTextEngine->ReplaceText(TextSelection( aPaM ), String(' ')); } while(true) { sal_uInt16 nStart = sPara.Search( '<', nIndex ); sal_uInt16 nEnd = sPara.Search( '>', nStart ); nIndex = nEnd; if(nStart != STRING_NOTFOUND && nEnd != STRING_NOTFOUND) pTextEngine->SetAttrib( aProtectAttr, nPara, nStart, nEnd + 1, sal_False ); else break; } } // add two empty paragraphs at the end if(m_pParentDialog->m_eType == SwCustomizeAddressBlockDialog::ADDRESSBLOCK_NEW || m_pParentDialog->m_eType == SwCustomizeAddressBlockDialog::ADDRESSBLOCK_EDIT) { xub_StrLen nLastLen = pTextEngine->GetText(nParaCount - 1).Len(); if(nLastLen) { TextPaM aPaM(nParaCount ? nParaCount - 1 : 0, nLastLen); pTextEngine->ReplaceText( TextSelection( aPaM ), String::CreateFromAscii("\n \n ")); } } } /*-- 25.06.2004 12:32:41--------------------------------------------------- Insert the new entry in front of the entry at the beginning of the selection -----------------------------------------------------------------------*/ void AddressMultiLineEdit::InsertNewEntry( const String& rStr ) { // insert new entry after current selected one. ExtTextView* pTextView = GetTextView(); const TextSelection& rSelection = pTextView->GetSelection(); sal_uLong nPara = rSelection.GetStart().GetPara(); sal_uInt16 nIndex = rSelection.GetEnd().GetIndex(); ExtTextEngine *pTextEngine = GetTextEngine(); const TextCharAttrib *pAttrib; if(0 != (pAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ))) nIndex = pAttrib->GetEnd(); InsertNewEntryAtPosition( rStr, nPara, nIndex ); // select the new entry pAttrib = pTextEngine->FindCharAttrib(TextPaM(nPara, nIndex),TEXTATTR_PROTECTED); TextSelection aEntrySel(TextPaM(nPara, nIndex), TextPaM(nPara, pAttrib->GetEnd())); pTextView->SetSelection(aEntrySel); Invalidate(); Modify(); } void AddressMultiLineEdit::InsertNewEntryAtPosition( const String& rStr, sal_uLong nPara, sal_uInt16 nIndex ) { ExtTextEngine* pTextEngine = GetTextEngine(); TextPaM aInsertPos( nPara, nIndex ); pTextEngine->ReplaceText( aInsertPos, rStr ); //restore the attributes SetText( GetAddress() ); //select the newly inserted/moved element TextSelection aEntrySel(aInsertPos); ExtTextView* pTextView = GetTextView(); pTextView->SetSelection(aEntrySel); m_aSelectionLink.Call(this); } /*-- 25.06.2004 12:32:41--------------------------------------------------- -----------------------------------------------------------------------*/ void AddressMultiLineEdit::RemoveCurrentEntry() { ExtTextEngine* pTextEngine = GetTextEngine(); ExtTextView* pTextView = GetTextView(); const TextSelection& rSelection = pTextView->GetSelection(); const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); // const TextCharAttrib* pEndAttrib = pTextEngine->FindCharAttrib( rSelection.GetEnd(), TEXTATTR_PROTECTED ); if(pBeginAttrib && (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) { sal_uLong nPara = rSelection.GetStart().GetPara(); TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); pTextEngine->ReplaceText(aEntrySel, String()); //restore the attributes SetText( GetAddress() ); Modify(); } } /*-- 25.06.2004 12:32:41--------------------------------------------------- -----------------------------------------------------------------------*/ void AddressMultiLineEdit::MoveCurrentItem(sal_uInt16 nMove) { ExtTextEngine* pTextEngine = GetTextEngine(); ExtTextView* pTextView = GetTextView(); const TextSelection& rSelection = pTextView->GetSelection(); const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); if(pBeginAttrib && (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) { //current item has been found sal_uLong nPara = rSelection.GetStart().GetPara(); sal_uInt16 nIndex = pBeginAttrib->GetStart(); TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); String sCurrentItem = pTextEngine->GetText(aEntrySel); pTextEngine->RemoveAttrib( nPara, *pBeginAttrib ); pTextEngine->ReplaceText(aEntrySel, String()); switch(nMove) { case MOVE_ITEM_LEFT : if(nIndex) { //go left to find a predecessor or simple text --nIndex; String sPara = pTextEngine->GetText( nPara ); xub_StrLen nSearchIndex = sPara.SearchBackward( '>', nIndex+1 ); if( nSearchIndex != STRING_NOTFOUND && nSearchIndex == nIndex ) { nSearchIndex = sPara.SearchBackward( '<', nIndex ); if( nSearchIndex != STRING_NOTFOUND ) nIndex = nSearchIndex; } } break; case MOVE_ITEM_RIGHT: { //go right to find a successor or simple text ++nIndex; const TextCharAttrib* pEndAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); if(pEndAttrib && pEndAttrib->GetEnd() >= nIndex) { nIndex = pEndAttrib->GetEnd(); } } break; case MOVE_ITEM_UP : --nPara; nIndex = 0; break; case MOVE_ITEM_DOWN : ++nPara; nIndex = 0; break; } //add a new paragraph if there is none yet if(nPara >= pTextEngine->GetParagraphCount()) { TextPaM aTemp(nPara - 1, pTextEngine->GetTextLen( nPara - 1 )); pTextEngine->ReplaceText( aTemp, String('\n')); } InsertNewEntryAtPosition( sCurrentItem, nPara, nIndex ); // select the new entry [#i40817] const TextCharAttrib *pAttrib; pAttrib = pTextEngine->FindCharAttrib(TextPaM(nPara, nIndex),TEXTATTR_PROTECTED); aEntrySel = TextSelection(TextPaM(nPara, nIndex), TextPaM(nPara, pAttrib->GetEnd())); pTextView->SetSelection(aEntrySel); Invalidate(); Modify(); } } /*-- 25.06.2004 12:32:41--------------------------------------------------- -----------------------------------------------------------------------*/ sal_uInt16 AddressMultiLineEdit::IsCurrentItemMoveable() { sal_uInt16 nRet = 0; ExtTextEngine* pTextEngine = GetTextEngine(); ExtTextView* pTextView = GetTextView(); const TextSelection& rSelection = pTextView->GetSelection(); const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); // const TextCharAttrib* pEndAttrib = pTextEngine->FindCharAttrib( rSelection.GetEnd(), TEXTATTR_PROTECTED ); if(pBeginAttrib && (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) { if(pBeginAttrib->GetStart()) nRet |= MOVE_ITEM_LEFT; //if there is an entry it can always be move to the right and down nRet |= MOVE_ITEM_RIGHT|MOVE_ITEM_DOWN; if(rSelection.GetStart().GetPara() > 0) nRet |= MOVE_ITEM_UP; } return nRet; } /*-- 25.06.2004 12:32:42--------------------------------------------------- -----------------------------------------------------------------------*/ bool AddressMultiLineEdit::HasCurrentItem() { ExtTextEngine* pTextEngine = GetTextEngine(); ExtTextView* pTextView = GetTextView(); const TextSelection& rSelection = pTextView->GetSelection(); const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); return (pBeginAttrib && (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())); } /*-- 01.07.2004 09:07:44--------------------------------------------------- -----------------------------------------------------------------------*/ String AddressMultiLineEdit::GetCurrentItem() { String sRet; ExtTextEngine* pTextEngine = GetTextEngine(); ExtTextView* pTextView = GetTextView(); const TextSelection& rSelection = pTextView->GetSelection(); const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); if(pBeginAttrib && (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) { sal_uLong nPara = rSelection.GetStart().GetPara(); TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); sRet = pTextEngine->GetText( aEntrySel ); } return sRet; } /*-- 05.07.2004 14:29:02--------------------------------------------------- -----------------------------------------------------------------------*/ void AddressMultiLineEdit::SelectCurrentItem() { ExtTextEngine* pTextEngine = GetTextEngine(); ExtTextView* pTextView = GetTextView(); const TextSelection& rSelection = pTextView->GetSelection(); const TextCharAttrib* pBeginAttrib = pTextEngine->FindCharAttrib( rSelection.GetStart(), TEXTATTR_PROTECTED ); if(pBeginAttrib && (pBeginAttrib->GetStart() <= rSelection.GetStart().GetIndex() && pBeginAttrib->GetEnd() >= rSelection.GetEnd().GetIndex())) { sal_uLong nPara = rSelection.GetStart().GetPara(); TextSelection aEntrySel(TextPaM( nPara, pBeginAttrib->GetStart()), TextPaM(nPara, pBeginAttrib->GetEnd())); pTextView->SetSelection(aEntrySel); Invalidate(); } } /*-- 25.06.2004 09:10:43--------------------------------------------------- returns the address remove trailing spaces and trailing empty paragraphs -----------------------------------------------------------------------*/ String AddressMultiLineEdit::GetAddress() { String sRet; ExtTextEngine* pTextEngine = GetTextEngine(); sal_uLong nParaCount = pTextEngine->GetParagraphCount(); for(sal_uLong nPara = nParaCount; nPara; --nPara) { String sPara = pTextEngine->GetText( nPara - 1); sPara.EraseTrailingChars(' '); //don't add empty trailing paragraphs if(sRet.Len() || sPara.Len()) { sRet.Insert(sPara, 0); //insert the para break if(nPara > 1) sRet.Insert( '\n', 0); } } return sRet; }