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