diff options
Diffstat (limited to 'sw/source/ui/dbui/mmaddressblockpage.cxx')
-rw-r--r-- | sw/source/ui/dbui/mmaddressblockpage.cxx | 1827 |
1 files changed, 1827 insertions, 0 deletions
diff --git a/sw/source/ui/dbui/mmaddressblockpage.cxx b/sw/source/ui/dbui/mmaddressblockpage.cxx new file mode 100644 index 000000000000..a35b0727c1ed --- /dev/null +++ b/sw/source/ui/dbui/mmaddressblockpage.cxx @@ -0,0 +1,1827 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif +#include <mmaddressblockpage.hxx> +#include <mailmergewizard.hxx> +#include <swtypes.hxx> +#include <addresslistdialog.hxx> +#include <svtools/xtextedt.hxx> +#include <svtools/txtattr.hxx> +#include <vcl/msgbox.hxx> +#include <mmconfigitem.hxx> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/sdb/XColumn.hpp> + +#include <vector> +#include <mmaddressblockpage.hrc> +#include <dbui.hrc> +#include <helpid.h> + +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 + { + BOOL bNext = pButton == &m_aNextSetIB; + sal_Int32 nPos = rConfig.GetResultSetPosition(); + rConfig.MoveResultSet( bNext ? ++nPos : --nPos); + } + m_pWizard->LeaveWait(); + sal_Int32 nPos = rConfig.GetResultSetPosition(); + BOOL bEnable = TRUE; + if(nPos < 1) + { + bEnable = 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) +{ + BOOL bCallParent = TRUE; + if(rEvt.GetCharCode()) + { + String sKey = rEvt.GetCharCode(); + if( STRING_NOTFOUND != sForbiddenChars.Search(sKey)) + bCallParent = FALSE; + } + if(bCallParent) + ComboBox::KeyInput(rEvt); +} +/* -----------------------------28.02.05 09:00-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwRestrictedComboBox::Modify() +{ + Selection aSel = GetSelection(); + String sTemp = GetText(); + for(USHORT i = 0; i < sForbiddenChars.Len(); i++) + { + sTemp.EraseAllChars( sForbiddenChars.GetChar(i) ); + } + USHORT 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(USHORT 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(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(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<String>* 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<String>::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(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<FixedInfo*> m_aFieldNames; + ::std::vector<ListBox*> m_aMatches; + ::std::vector<FixedInfo*> 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 <XNameAccess> 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); + //fill the controls + for(USHORT 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( HID_MM_HEADER_0 + 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<FixedInfo*>::iterator aFIIter; + for(aFIIter = m_aFieldNames.begin(); aFIIter != m_aFieldNames.end(); ++aFIIter) + delete *aFIIter; + ::std::vector<ListBox*>::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(); + USHORT 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(FALSE); + long nIndex; + ::std::vector<FixedInfo*>::iterator aFIIter; + for(nIndex = 0, aFIIter = m_aFieldNames.begin(); aFIIter != m_aFieldNames.end(); ++aFIIter, ++nIndex) + lcl_Move(*aFIIter, nMove); + ::std::vector<ListBox*>::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(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 <XNameAccess> 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<ListBox*>::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<ListBox*>::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<ListBox*>::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) +{ + SetWindowBits( /*WB_HASBUTTONS|WB_HASBUTTONSATROOT|*/ + WB_CLIPCHILDREN ); +// SetSpaceBetweenEntries(3); + SetSelectionMode( SINGLE_SELECTION ); + SetDragDropMode( SV_DRAGDROP_CTRL_COPY ); + EnableAsyncDrag(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(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<const TextHint&>(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; + ULONG nParaCount = pTextEngine->GetParagraphCount(); + for(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) + { + USHORT nStart = sPara.Search( '<', nIndex ); + USHORT nEnd = sPara.Search( '>', nStart ); + nIndex = nEnd; + if(nStart != STRING_NOTFOUND && nEnd != STRING_NOTFOUND) + pTextEngine->SetAttrib( aProtectAttr, nPara, nStart, nEnd + 1, 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(); + ULONG nPara = rSelection.GetStart().GetPara(); + USHORT 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, ULONG nPara, USHORT 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())) + { + 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 + ULONG nPara = rSelection.GetStart().GetPara(); + USHORT 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())) + { + 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())) + { + 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(); + ULONG nParaCount = pTextEngine->GetParagraphCount(); + for(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; +} + |