xref: /trunk/main/sw/source/ui/dbui/createaddresslistdialog.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 <swtypes.hxx>
34*cdf0e10cSrcweir #include <createaddresslistdialog.hxx>
35*cdf0e10cSrcweir #include <customizeaddresslistdialog.hxx>
36*cdf0e10cSrcweir #include <mmconfigitem.hxx>
37*cdf0e10cSrcweir #include <vcl/scrbar.hxx>
38*cdf0e10cSrcweir #include <vcl/msgbox.hxx>
39*cdf0e10cSrcweir #ifndef _SVT_CONTROLDIMS_HRC_
40*cdf0e10cSrcweir #include <svtools/controldims.hrc>
41*cdf0e10cSrcweir #endif
42*cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
43*cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx>
44*cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
45*cdf0e10cSrcweir #include <sfx2/fcontnr.hxx>
46*cdf0e10cSrcweir #include <sfx2/docfac.hxx>
47*cdf0e10cSrcweir #include <sfx2/docfile.hxx>
48*cdf0e10cSrcweir #include <rtl/textenc.h>
49*cdf0e10cSrcweir #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
50*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
51*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
52*cdf0e10cSrcweir #include <tools/urlobj.hxx>
53*cdf0e10cSrcweir #include <createaddresslistdialog.hrc>
54*cdf0e10cSrcweir #include <dbui.hrc>
55*cdf0e10cSrcweir #include <helpid.h>
56*cdf0e10cSrcweir #include <unomid.h>
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir using namespace ::com::sun::star;
60*cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs;
61*cdf0e10cSrcweir using ::rtl::OUString;
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir /*-- 19.04.2004 12:19:50---------------------------------------------------
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
66*cdf0e10cSrcweir class SwAddressControl_Impl : public Control
67*cdf0e10cSrcweir {
68*cdf0e10cSrcweir     ScrollBar                       m_aScrollBar;
69*cdf0e10cSrcweir     Window                          m_aWindow;
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir     ::std::vector<FixedText*>       m_aFixedTexts;
72*cdf0e10cSrcweir     ::std::vector<Edit*>            m_aEdits;
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir     SwCSVData*                      m_pData;
75*cdf0e10cSrcweir     Size                            m_aWinOutputSize;
76*cdf0e10cSrcweir     sal_Int32                       m_nLineHeight;
77*cdf0e10cSrcweir     sal_uInt32                      m_nCurrentDataSet;
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir     bool                            m_bNoDataSet;
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir     DECL_LINK(ScrollHdl_Impl, ScrollBar*);
82*cdf0e10cSrcweir     DECL_LINK(GotFocusHdl_Impl, Edit*);
83*cdf0e10cSrcweir     DECL_LINK(EditModifyHdl_Impl, Edit*);
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir     void                MakeVisible(const Rectangle& aRect);
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir     virtual long        PreNotify( NotifyEvent& rNEvt );
88*cdf0e10cSrcweir     virtual void        Command( const CommandEvent& rCEvt );
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir     using Window::SetData;
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir public:
93*cdf0e10cSrcweir     SwAddressControl_Impl(Window* pParent, const ResId& rResId );
94*cdf0e10cSrcweir     ~SwAddressControl_Impl();
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir     void        SetData(SwCSVData& rDBData);
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir     void        SetCurrentDataSet(sal_uInt32 nSet);
99*cdf0e10cSrcweir     sal_uInt32  GetCurrentDataSet() const { return m_nCurrentDataSet;}
100*cdf0e10cSrcweir     void        SetCursorTo(sal_uInt32 nElement);
101*cdf0e10cSrcweir };
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir /*-- 13.04.2004 10:09:42---------------------------------------------------
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
106*cdf0e10cSrcweir SwAddressControl_Impl::SwAddressControl_Impl(Window* pParent, const ResId& rResId ) :
107*cdf0e10cSrcweir     Control(pParent, rResId),
108*cdf0e10cSrcweir #ifdef MSC
109*cdf0e10cSrcweir #pragma warning (disable : 4355)
110*cdf0e10cSrcweir #endif
111*cdf0e10cSrcweir     m_aScrollBar(this, ResId(SCR_1,*rResId.GetResMgr())),
112*cdf0e10cSrcweir     m_aWindow(this, ResId(WIN_DATA,*rResId.GetResMgr())),
113*cdf0e10cSrcweir #ifdef MSC
114*cdf0e10cSrcweir #pragma warning (default : 4355)
115*cdf0e10cSrcweir #endif
116*cdf0e10cSrcweir     m_pData(0),
117*cdf0e10cSrcweir     m_aWinOutputSize( m_aWindow.GetOutputSizePixel() ),
118*cdf0e10cSrcweir     m_nLineHeight(0),
119*cdf0e10cSrcweir     m_nCurrentDataSet(0),
120*cdf0e10cSrcweir     m_bNoDataSet(true)
121*cdf0e10cSrcweir {
122*cdf0e10cSrcweir     FreeResource();
123*cdf0e10cSrcweir     Link aScrollLink = LINK(this, SwAddressControl_Impl, ScrollHdl_Impl);
124*cdf0e10cSrcweir     m_aScrollBar.SetScrollHdl(aScrollLink);
125*cdf0e10cSrcweir     m_aScrollBar.SetEndScrollHdl(aScrollLink);
126*cdf0e10cSrcweir     m_aScrollBar.EnableDrag();
127*cdf0e10cSrcweir 
128*cdf0e10cSrcweir }
129*cdf0e10cSrcweir /*-- 13.04.2004 10:09:43---------------------------------------------------
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
132*cdf0e10cSrcweir SwAddressControl_Impl::~SwAddressControl_Impl()
133*cdf0e10cSrcweir {
134*cdf0e10cSrcweir     ::std::vector<FixedText*>::iterator aTextIter;
135*cdf0e10cSrcweir     for(aTextIter = m_aFixedTexts.begin(); aTextIter != m_aFixedTexts.end(); ++aTextIter)
136*cdf0e10cSrcweir         delete *aTextIter;
137*cdf0e10cSrcweir     ::std::vector<Edit*>::iterator aEditIter;
138*cdf0e10cSrcweir     for(aEditIter = m_aEdits.begin(); aEditIter != m_aEdits.end(); ++aEditIter)
139*cdf0e10cSrcweir         delete *aEditIter;
140*cdf0e10cSrcweir }
141*cdf0e10cSrcweir /*-- 19.04.2004 12:22:41---------------------------------------------------
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
144*cdf0e10cSrcweir void SwAddressControl_Impl::SetData(SwCSVData& rDBData)
145*cdf0e10cSrcweir {
146*cdf0e10cSrcweir     m_pData = &rDBData;
147*cdf0e10cSrcweir     //when the address data is updated then remove the controls an build again
148*cdf0e10cSrcweir     if(m_aFixedTexts.size())
149*cdf0e10cSrcweir     {
150*cdf0e10cSrcweir         ::std::vector<FixedText*>::iterator aTextIter;
151*cdf0e10cSrcweir         for(aTextIter = m_aFixedTexts.begin(); aTextIter != m_aFixedTexts.end(); ++aTextIter)
152*cdf0e10cSrcweir             delete *aTextIter;
153*cdf0e10cSrcweir         ::std::vector<Edit*>::iterator aEditIter;
154*cdf0e10cSrcweir         for(aEditIter = m_aEdits.begin(); aEditIter != m_aEdits.end(); ++aEditIter)
155*cdf0e10cSrcweir             delete *aEditIter;
156*cdf0e10cSrcweir         m_aFixedTexts.clear();
157*cdf0e10cSrcweir         m_aEdits.clear();
158*cdf0e10cSrcweir         m_bNoDataSet = true;
159*cdf0e10cSrcweir     }
160*cdf0e10cSrcweir     //now create appropriate controls
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir     ::std::vector< OUString >::iterator  aHeaderIter;
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir     long nFTXPos = m_aWindow.LogicToPixel(Point(RSC_SP_CTRL_X, RSC_SP_CTRL_X), MAP_APPFONT).X();
165*cdf0e10cSrcweir     long nFTHeight = m_aWindow.LogicToPixel(Size(RSC_BS_CHARHEIGHT, RSC_BS_CHARHEIGHT), MAP_APPFONT).Height();
166*cdf0e10cSrcweir     long nFTWidth = 0;
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir     //determine the width of the FixedTexts
169*cdf0e10cSrcweir     for(aHeaderIter = m_pData->aDBColumnHeaders.begin();
170*cdf0e10cSrcweir                 aHeaderIter != m_pData->aDBColumnHeaders.end();
171*cdf0e10cSrcweir                 ++aHeaderIter)
172*cdf0e10cSrcweir     {
173*cdf0e10cSrcweir         sal_Int32 nTemp = m_aWindow.GetTextWidth(*aHeaderIter);
174*cdf0e10cSrcweir         if(nTemp > nFTWidth)
175*cdf0e10cSrcweir           nFTWidth = nTemp;
176*cdf0e10cSrcweir     }
177*cdf0e10cSrcweir     //add some pixels
178*cdf0e10cSrcweir     nFTWidth += 2;
179*cdf0e10cSrcweir     long nEDXPos = nFTWidth + nFTXPos +
180*cdf0e10cSrcweir             m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_DESC_X, RSC_SP_CTRL_DESC_X), MAP_APPFONT).Width();
181*cdf0e10cSrcweir     long nEDHeight = m_aWindow.LogicToPixel(Size(RSC_CD_TEXTBOX_HEIGHT, RSC_CD_TEXTBOX_HEIGHT), MAP_APPFONT).Height();
182*cdf0e10cSrcweir     long nEDWidth = m_aWinOutputSize.Width() - nEDXPos - nFTXPos;
183*cdf0e10cSrcweir     m_nLineHeight = nEDHeight + m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_GROUP_Y, RSC_SP_CTRL_GROUP_Y), MAP_APPFONT).Height();
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir     long nEDYPos = m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_DESC_Y, RSC_SP_CTRL_DESC_Y), MAP_APPFONT).Height();
186*cdf0e10cSrcweir     long nFTYPos = nEDYPos + nEDHeight - nFTHeight;
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir     Link aFocusLink = LINK(this, SwAddressControl_Impl, GotFocusHdl_Impl);
189*cdf0e10cSrcweir     Link aEditModifyLink = LINK(this, SwAddressControl_Impl, EditModifyHdl_Impl);
190*cdf0e10cSrcweir     Edit* pLastEdit = 0;
191*cdf0e10cSrcweir     sal_Int32 nVisibleLines = 0;
192*cdf0e10cSrcweir     sal_Int32 nLines = 0;
193*cdf0e10cSrcweir     for(aHeaderIter = m_pData->aDBColumnHeaders.begin();
194*cdf0e10cSrcweir                 aHeaderIter != m_pData->aDBColumnHeaders.end();
195*cdf0e10cSrcweir                 ++aHeaderIter, nEDYPos += m_nLineHeight, nFTYPos += m_nLineHeight, nLines++)
196*cdf0e10cSrcweir     {
197*cdf0e10cSrcweir         FixedText* pNewFT = new FixedText(&m_aWindow, WB_RIGHT);
198*cdf0e10cSrcweir         Edit* pNewED = new Edit(&m_aWindow, WB_BORDER);
199*cdf0e10cSrcweir         //set nLines a position identifier - used in the ModifyHdl
200*cdf0e10cSrcweir         pNewED->SetData((void*)nLines);
201*cdf0e10cSrcweir         pNewED->SetGetFocusHdl(aFocusLink);
202*cdf0e10cSrcweir         pNewED->SetModifyHdl(aEditModifyLink);
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir         pNewFT->SetPosSizePixel(Point(nFTXPos, nFTYPos), Size(nFTWidth, nFTHeight));
205*cdf0e10cSrcweir         pNewED->SetPosSizePixel(Point(nEDXPos, nEDYPos), Size(nEDWidth, nEDHeight));
206*cdf0e10cSrcweir         if(nEDYPos + nEDHeight < m_aWinOutputSize.Height())
207*cdf0e10cSrcweir             ++nVisibleLines;
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir         pNewFT->SetText(*aHeaderIter);
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir         pNewFT->Show();
212*cdf0e10cSrcweir         pNewED->Show();
213*cdf0e10cSrcweir         m_aFixedTexts.push_back(pNewFT);
214*cdf0e10cSrcweir         m_aEdits.push_back(pNewED);
215*cdf0e10cSrcweir         pLastEdit = pNewED;
216*cdf0e10cSrcweir     }
217*cdf0e10cSrcweir     //scrollbar adjustment
218*cdf0e10cSrcweir     if(pLastEdit)
219*cdf0e10cSrcweir     {
220*cdf0e10cSrcweir         //the m_aWindow has to be at least as high as the ScrollBar and it must include the last Edit
221*cdf0e10cSrcweir         sal_Int32 nContentHeight = pLastEdit->GetPosPixel().Y() + nEDHeight +
222*cdf0e10cSrcweir                 m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_GROUP_Y, RSC_SP_CTRL_GROUP_Y), MAP_APPFONT).Height();
223*cdf0e10cSrcweir         if(nContentHeight < m_aScrollBar.GetSizePixel().Height())
224*cdf0e10cSrcweir         {
225*cdf0e10cSrcweir             nContentHeight = m_aScrollBar.GetSizePixel().Height();
226*cdf0e10cSrcweir             m_aScrollBar.Enable(sal_False);
227*cdf0e10cSrcweir         }
228*cdf0e10cSrcweir         else
229*cdf0e10cSrcweir         {
230*cdf0e10cSrcweir             m_aScrollBar.Enable(sal_True);
231*cdf0e10cSrcweir             m_aScrollBar.SetRange(Range(0, nLines));
232*cdf0e10cSrcweir             m_aScrollBar.SetThumbPos(0);
233*cdf0e10cSrcweir             m_aScrollBar.SetVisibleSize(nVisibleLines);
234*cdf0e10cSrcweir         }
235*cdf0e10cSrcweir         Size aWinOutputSize(m_aWinOutputSize);
236*cdf0e10cSrcweir         aWinOutputSize.Height() = nContentHeight;
237*cdf0e10cSrcweir         m_aWindow.SetOutputSizePixel(aWinOutputSize);
238*cdf0e10cSrcweir 
239*cdf0e10cSrcweir     }
240*cdf0e10cSrcweir }
241*cdf0e10cSrcweir /*-- 21.04.2004 11:37:09---------------------------------------------------
242*cdf0e10cSrcweir 
243*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
244*cdf0e10cSrcweir void SwAddressControl_Impl::SetCurrentDataSet(sal_uInt32 nSet)
245*cdf0e10cSrcweir {
246*cdf0e10cSrcweir     if(m_bNoDataSet || m_nCurrentDataSet != nSet)
247*cdf0e10cSrcweir     {
248*cdf0e10cSrcweir         m_bNoDataSet = false;
249*cdf0e10cSrcweir         m_nCurrentDataSet = nSet;
250*cdf0e10cSrcweir         DBG_ASSERT(m_pData->aDBData.size() > m_nCurrentDataSet, "wrong data set index");
251*cdf0e10cSrcweir         if(m_pData->aDBData.size() > m_nCurrentDataSet)
252*cdf0e10cSrcweir         {
253*cdf0e10cSrcweir             ::std::vector<Edit*>::iterator aEditIter;
254*cdf0e10cSrcweir             sal_uInt32 nIndex = 0;
255*cdf0e10cSrcweir             for(aEditIter = m_aEdits.begin(); aEditIter != m_aEdits.end(); ++aEditIter, ++nIndex)
256*cdf0e10cSrcweir             {
257*cdf0e10cSrcweir                 DBG_ASSERT(nIndex < m_pData->aDBData[m_nCurrentDataSet].size(),
258*cdf0e10cSrcweir                             "number of colums doesn't match number of Edits");
259*cdf0e10cSrcweir                 (*aEditIter)->SetText(m_pData->aDBData[m_nCurrentDataSet][nIndex]);
260*cdf0e10cSrcweir             }
261*cdf0e10cSrcweir         }
262*cdf0e10cSrcweir     }
263*cdf0e10cSrcweir }
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir /*-- 19.04.2004 14:17:50---------------------------------------------------
266*cdf0e10cSrcweir 
267*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
268*cdf0e10cSrcweir IMPL_LINK(SwAddressControl_Impl, ScrollHdl_Impl, ScrollBar*, pScroll)
269*cdf0e10cSrcweir {
270*cdf0e10cSrcweir     long nThumb = pScroll->GetThumbPos();
271*cdf0e10cSrcweir     m_aWindow.SetPosPixel(Point(0, - (m_nLineHeight * nThumb)));
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir     return 0;
274*cdf0e10cSrcweir }
275*cdf0e10cSrcweir /*-- 19.04.2004 16:16:25---------------------------------------------------
276*cdf0e10cSrcweir 
277*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
278*cdf0e10cSrcweir IMPL_LINK(SwAddressControl_Impl, GotFocusHdl_Impl, Edit*, pEdit)
279*cdf0e10cSrcweir {
280*cdf0e10cSrcweir     if(0 != (GETFOCUS_TAB & pEdit->GetGetFocusFlags()))
281*cdf0e10cSrcweir     {
282*cdf0e10cSrcweir         Rectangle aRect(pEdit->GetPosPixel(), pEdit->GetSizePixel());
283*cdf0e10cSrcweir         MakeVisible(aRect);
284*cdf0e10cSrcweir     }
285*cdf0e10cSrcweir     return 0;
286*cdf0e10cSrcweir }
287*cdf0e10cSrcweir /*-- 21.04.2004 14:56:54---------------------------------------------------
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
290*cdf0e10cSrcweir void SwAddressControl_Impl::MakeVisible(const Rectangle & rRect)
291*cdf0e10cSrcweir {
292*cdf0e10cSrcweir     long nThumb = m_aScrollBar.GetThumbPos();
293*cdf0e10cSrcweir     //determine range of visible positions
294*cdf0e10cSrcweir     long nMinVisiblePos = - m_aWindow.GetPosPixel().Y();
295*cdf0e10cSrcweir     long nMaxVisiblePos = m_aScrollBar.GetSizePixel().Height() + nMinVisiblePos;
296*cdf0e10cSrcweir     if( rRect.TopLeft().Y() < nMinVisiblePos)
297*cdf0e10cSrcweir     {
298*cdf0e10cSrcweir         nThumb -= 1 + ((nMinVisiblePos - rRect.TopLeft().Y()) / m_nLineHeight);
299*cdf0e10cSrcweir     }
300*cdf0e10cSrcweir     else if(rRect.BottomLeft().Y() > nMaxVisiblePos)
301*cdf0e10cSrcweir     {
302*cdf0e10cSrcweir         nThumb += 1 + ((nMaxVisiblePos - rRect.BottomLeft().Y()) / m_nLineHeight);
303*cdf0e10cSrcweir     }
304*cdf0e10cSrcweir     if(nThumb != m_aScrollBar.GetThumbPos())
305*cdf0e10cSrcweir     {
306*cdf0e10cSrcweir         m_aScrollBar.SetThumbPos(nThumb);
307*cdf0e10cSrcweir         ScrollHdl_Impl(&m_aScrollBar);
308*cdf0e10cSrcweir     }
309*cdf0e10cSrcweir }
310*cdf0e10cSrcweir /*-- 19.04.2004 16:16:25---------------------------------------------------
311*cdf0e10cSrcweir     copy data changes into database
312*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
313*cdf0e10cSrcweir IMPL_LINK(SwAddressControl_Impl, EditModifyHdl_Impl, Edit*, pEdit)
314*cdf0e10cSrcweir {
315*cdf0e10cSrcweir     //get the data element number of the current set
316*cdf0e10cSrcweir     sal_Int32 nIndex = (sal_Int32)(sal_IntPtr)pEdit->GetData();
317*cdf0e10cSrcweir     //get the index of the set
318*cdf0e10cSrcweir     DBG_ASSERT(m_pData->aDBData.size() > m_nCurrentDataSet, "wrong data set index" );
319*cdf0e10cSrcweir     if(m_pData->aDBData.size() > m_nCurrentDataSet)
320*cdf0e10cSrcweir     {
321*cdf0e10cSrcweir         m_pData->aDBData[m_nCurrentDataSet][nIndex] = pEdit->GetText();
322*cdf0e10cSrcweir     }
323*cdf0e10cSrcweir     return 0;
324*cdf0e10cSrcweir }
325*cdf0e10cSrcweir /*-- 21.04.2004 14:51:54---------------------------------------------------
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
328*cdf0e10cSrcweir void SwAddressControl_Impl::SetCursorTo(sal_uInt32 nElement)
329*cdf0e10cSrcweir {
330*cdf0e10cSrcweir     if(nElement < m_aEdits.size())
331*cdf0e10cSrcweir     {
332*cdf0e10cSrcweir         Edit* pEdit = m_aEdits[nElement];
333*cdf0e10cSrcweir         pEdit->GrabFocus();
334*cdf0e10cSrcweir         Rectangle aRect(pEdit->GetPosPixel(), pEdit->GetSizePixel());
335*cdf0e10cSrcweir         MakeVisible(aRect);
336*cdf0e10cSrcweir     }
337*cdf0e10cSrcweir 
338*cdf0e10cSrcweir }
339*cdf0e10cSrcweir /*-- 19.04.2004 16:16:25---------------------------------------------------
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
342*cdf0e10cSrcweir void SwAddressControl_Impl::Command( const CommandEvent& rCEvt )
343*cdf0e10cSrcweir {
344*cdf0e10cSrcweir     switch ( rCEvt.GetCommand() )
345*cdf0e10cSrcweir     {
346*cdf0e10cSrcweir         case COMMAND_WHEEL:
347*cdf0e10cSrcweir         case COMMAND_STARTAUTOSCROLL:
348*cdf0e10cSrcweir         case COMMAND_AUTOSCROLL:
349*cdf0e10cSrcweir         {
350*cdf0e10cSrcweir             const CommandWheelData* pWheelData = rCEvt.GetWheelData();
351*cdf0e10cSrcweir             if(pWheelData && !pWheelData->IsHorz() && COMMAND_WHEEL_ZOOM != pWheelData->GetMode())
352*cdf0e10cSrcweir             {
353*cdf0e10cSrcweir                 HandleScrollCommand( rCEvt, 0, &m_aScrollBar );
354*cdf0e10cSrcweir             }
355*cdf0e10cSrcweir         }
356*cdf0e10cSrcweir         break;
357*cdf0e10cSrcweir         default:
358*cdf0e10cSrcweir             Control::Command(rCEvt);
359*cdf0e10cSrcweir     }
360*cdf0e10cSrcweir }
361*cdf0e10cSrcweir /*-- 19.04.2004 16:16:25---------------------------------------------------
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
364*cdf0e10cSrcweir long SwAddressControl_Impl::PreNotify( NotifyEvent& rNEvt )
365*cdf0e10cSrcweir {
366*cdf0e10cSrcweir     if(rNEvt.GetType() == EVENT_COMMAND)
367*cdf0e10cSrcweir     {
368*cdf0e10cSrcweir         const CommandEvent* pCEvt = rNEvt.GetCommandEvent();
369*cdf0e10cSrcweir         sal_uInt16 nCmd = pCEvt->GetCommand();
370*cdf0e10cSrcweir         if( COMMAND_WHEEL == nCmd )
371*cdf0e10cSrcweir         {
372*cdf0e10cSrcweir             Command(*pCEvt);
373*cdf0e10cSrcweir             return 1;
374*cdf0e10cSrcweir         }
375*cdf0e10cSrcweir     }
376*cdf0e10cSrcweir     return Control::PreNotify(rNEvt);
377*cdf0e10cSrcweir }
378*cdf0e10cSrcweir /*-- 13.04.2004 10:08:59---------------------------------------------------
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
381*cdf0e10cSrcweir SwCreateAddressListDialog::SwCreateAddressListDialog(
382*cdf0e10cSrcweir         Window* pParent, const String& rURL, SwMailMergeConfigItem& rConfig) :
383*cdf0e10cSrcweir     SfxModalDialog(pParent, SW_RES(DLG_MM_CREATEADDRESSLIST)),
384*cdf0e10cSrcweir #ifdef MSC
385*cdf0e10cSrcweir #pragma warning (disable : 4355)
386*cdf0e10cSrcweir #endif
387*cdf0e10cSrcweir     m_aAddressInformation( this, SW_RES(  FI_ADDRESSINFORMATION)),
388*cdf0e10cSrcweir     m_pAddressControl(new SwAddressControl_Impl(this, SW_RES(CT_ADDRESS))),
389*cdf0e10cSrcweir     m_aNewPB( this, SW_RES(               PB_NEW)),
390*cdf0e10cSrcweir     m_aDeletePB( this, SW_RES(            PB_DELETE)),
391*cdf0e10cSrcweir     m_aFindPB( this, SW_RES(              PB_FIND)),
392*cdf0e10cSrcweir     m_aCustomizePB( this, SW_RES(         PB_CUSTOMIZE)),
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir     m_aViewEntriesFI( this, SW_RES(       FI_VIEWENTRIES)),
395*cdf0e10cSrcweir     m_aStartPB( this, SW_RES(             PB_START)),
396*cdf0e10cSrcweir     m_aPrevPB( this, SW_RES(              PB_PREV)),
397*cdf0e10cSrcweir     m_aSetNoNF( this, SW_RES(             NF_SETNO)),
398*cdf0e10cSrcweir     m_aNextPB( this, SW_RES(              PB_NEXT  )),
399*cdf0e10cSrcweir     m_aEndPB( this, SW_RES(               PB_END)),
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir     m_aSeparatorFL( this, SW_RES(         FL_SEPARATOR)),
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir     m_aOK( this, SW_RES(                  PB_OK)),
404*cdf0e10cSrcweir     m_aCancel( this, SW_RES(              PB_CANCEL)),
405*cdf0e10cSrcweir     m_aHelp( this, SW_RES(                PB_HELP)),
406*cdf0e10cSrcweir #ifdef MSC
407*cdf0e10cSrcweir #pragma warning (default : 4355)
408*cdf0e10cSrcweir #endif
409*cdf0e10cSrcweir     m_sAddressListFilterName( SW_RES(    ST_FILTERNAME)),
410*cdf0e10cSrcweir     m_sURL(rURL),
411*cdf0e10cSrcweir     m_pCSVData( new SwCSVData ),
412*cdf0e10cSrcweir     m_pFindDlg(0)
413*cdf0e10cSrcweir {
414*cdf0e10cSrcweir     FreeResource();
415*cdf0e10cSrcweir     m_aNewPB.SetClickHdl(LINK(this, SwCreateAddressListDialog, NewHdl_Impl));
416*cdf0e10cSrcweir     m_aDeletePB.SetClickHdl(LINK(this, SwCreateAddressListDialog, DeleteHdl_Impl));
417*cdf0e10cSrcweir     m_aFindPB.SetClickHdl(LINK(this, SwCreateAddressListDialog, FindHdl_Impl));
418*cdf0e10cSrcweir     m_aCustomizePB.SetClickHdl(LINK(this, SwCreateAddressListDialog, CustomizeHdl_Impl));
419*cdf0e10cSrcweir     m_aOK.SetClickHdl(LINK(this, SwCreateAddressListDialog, OkHdl_Impl));
420*cdf0e10cSrcweir 
421*cdf0e10cSrcweir     Link aLk = LINK(this, SwCreateAddressListDialog, DBCursorHdl_Impl);
422*cdf0e10cSrcweir     m_aStartPB.SetClickHdl(aLk);
423*cdf0e10cSrcweir     m_aPrevPB.SetClickHdl(aLk);
424*cdf0e10cSrcweir     m_aSetNoNF.SetModifyHdl(LINK(this, SwCreateAddressListDialog, DBNumCursorHdl_Impl));
425*cdf0e10cSrcweir     m_aNextPB.SetClickHdl(aLk);
426*cdf0e10cSrcweir     m_aEndPB.SetClickHdl(aLk);
427*cdf0e10cSrcweir 
428*cdf0e10cSrcweir     if(m_sURL.Len())
429*cdf0e10cSrcweir     {
430*cdf0e10cSrcweir         //file exists, has to be loaded here
431*cdf0e10cSrcweir         SfxMedium aMedium( m_sURL, STREAM_READ, sal_True );
432*cdf0e10cSrcweir         SvStream* pStream = aMedium.GetInStream();
433*cdf0e10cSrcweir         if(pStream)
434*cdf0e10cSrcweir         {
435*cdf0e10cSrcweir             pStream->SetLineDelimiter( LINEEND_LF );
436*cdf0e10cSrcweir             pStream->SetStreamCharSet(RTL_TEXTENCODING_UTF8);
437*cdf0e10cSrcweir 
438*cdf0e10cSrcweir             OUString sSemi(';');
439*cdf0e10cSrcweir             OUString sQuote('"');
440*cdf0e10cSrcweir             String sTempMiddle(sQuote);
441*cdf0e10cSrcweir             sTempMiddle += sal_Unicode(9);
442*cdf0e10cSrcweir             OUString sMiddle(sTempMiddle);
443*cdf0e10cSrcweir 
444*cdf0e10cSrcweir             String sLine;
445*cdf0e10cSrcweir             sal_Bool bRead = pStream->ReadUniOrByteStringLine( sLine, RTL_TEXTENCODING_UTF8 );
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir             if(bRead)
448*cdf0e10cSrcweir             {
449*cdf0e10cSrcweir                 //header line
450*cdf0e10cSrcweir                 xub_StrLen nHeaders = sLine.GetTokenCount('\t');
451*cdf0e10cSrcweir                 xub_StrLen nIndex = 0;
452*cdf0e10cSrcweir                 for( xub_StrLen nToken = 0; nToken < nHeaders; ++nToken)
453*cdf0e10cSrcweir                 {
454*cdf0e10cSrcweir                     String sHeader = sLine.GetToken( 0, '\t', nIndex );
455*cdf0e10cSrcweir                     DBG_ASSERT(sHeader.Len() > 2 &&
456*cdf0e10cSrcweir                             sHeader.GetChar(0) == '\"' && sHeader.GetChar(sHeader.Len() - 1) == '\"',
457*cdf0e10cSrcweir                             "Wrong format of header");
458*cdf0e10cSrcweir                     if(sHeader.Len() > 2)
459*cdf0e10cSrcweir                     {
460*cdf0e10cSrcweir                         m_pCSVData->aDBColumnHeaders.push_back( sHeader.Copy(1, sHeader.Len() -2));
461*cdf0e10cSrcweir                     }
462*cdf0e10cSrcweir                 }
463*cdf0e10cSrcweir             }
464*cdf0e10cSrcweir             while(pStream->ReadUniOrByteStringLine( sLine, RTL_TEXTENCODING_UTF8 ))
465*cdf0e10cSrcweir             {
466*cdf0e10cSrcweir                 ::std::vector<OUString> aNewData;
467*cdf0e10cSrcweir                 //analyze data line
468*cdf0e10cSrcweir                 xub_StrLen nDataCount = sLine.GetTokenCount('\t');
469*cdf0e10cSrcweir                 xub_StrLen nIndex = 0;
470*cdf0e10cSrcweir                 for( xub_StrLen nToken = 0; nToken < nDataCount; ++nToken)
471*cdf0e10cSrcweir                 {
472*cdf0e10cSrcweir                     String sData = sLine.GetToken( 0, '\t', nIndex );
473*cdf0e10cSrcweir                     DBG_ASSERT(sData.Len() >= 2 &&
474*cdf0e10cSrcweir                                 sData.GetChar(0) == '\"' && sData.GetChar(sData.Len() - 1) == '\"',
475*cdf0e10cSrcweir                             "Wrong format of line");
476*cdf0e10cSrcweir                     if(sData.Len() >= 2)
477*cdf0e10cSrcweir                         aNewData.push_back(sData.Copy(1, sData.Len() - 2));
478*cdf0e10cSrcweir                     else
479*cdf0e10cSrcweir                         aNewData.push_back(sData);
480*cdf0e10cSrcweir                 }
481*cdf0e10cSrcweir                 m_pCSVData->aDBData.push_back( aNewData );
482*cdf0e10cSrcweir             }
483*cdf0e10cSrcweir         }
484*cdf0e10cSrcweir     }
485*cdf0e10cSrcweir     else
486*cdf0e10cSrcweir     {
487*cdf0e10cSrcweir         //database has to be created
488*cdf0e10cSrcweir         const ResStringArray& rAddressHeader = rConfig.GetDefaultAddressHeaders();
489*cdf0e10cSrcweir         sal_uInt32 nCount = rAddressHeader.Count();
490*cdf0e10cSrcweir         for(sal_uInt16 nHeader = 0; nHeader < nCount; ++nHeader)
491*cdf0e10cSrcweir             m_pCSVData->aDBColumnHeaders.push_back( rAddressHeader.GetString(nHeader));
492*cdf0e10cSrcweir         ::std::vector<OUString> aNewData;
493*cdf0e10cSrcweir         String sTemp;
494*cdf0e10cSrcweir         aNewData.insert(aNewData.begin(), nCount, sTemp);
495*cdf0e10cSrcweir         m_pCSVData->aDBData.push_back(aNewData);
496*cdf0e10cSrcweir     }
497*cdf0e10cSrcweir     //now fill the address control
498*cdf0e10cSrcweir     m_pAddressControl->SetData(*m_pCSVData);
499*cdf0e10cSrcweir     m_pAddressControl->SetCurrentDataSet(0);
500*cdf0e10cSrcweir     m_aSetNoNF.SetMax(m_pCSVData->aDBData.size());
501*cdf0e10cSrcweir     UpdateButtons();
502*cdf0e10cSrcweir }
503*cdf0e10cSrcweir /*-- 13.04.2004 10:08:59---------------------------------------------------
504*cdf0e10cSrcweir 
505*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
506*cdf0e10cSrcweir SwCreateAddressListDialog::~SwCreateAddressListDialog()
507*cdf0e10cSrcweir {
508*cdf0e10cSrcweir     delete m_pAddressControl;
509*cdf0e10cSrcweir     delete m_pCSVData;
510*cdf0e10cSrcweir     delete m_pFindDlg;
511*cdf0e10cSrcweir }
512*cdf0e10cSrcweir /*-- 13.04.2004 10:08:59---------------------------------------------------
513*cdf0e10cSrcweir     add a new data set of empty strings and set the address input control
514*cdf0e10cSrcweir     to that new set
515*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
516*cdf0e10cSrcweir IMPL_LINK(SwCreateAddressListDialog, NewHdl_Impl, PushButton*, EMPTYARG)
517*cdf0e10cSrcweir {
518*cdf0e10cSrcweir     sal_uInt32 nCurrent = m_pAddressControl->GetCurrentDataSet();
519*cdf0e10cSrcweir     ::std::vector<OUString> aNewData;
520*cdf0e10cSrcweir     String sTemp;
521*cdf0e10cSrcweir     aNewData.insert(aNewData.begin(), m_pCSVData->aDBColumnHeaders.size(), sTemp);
522*cdf0e10cSrcweir     m_pCSVData->aDBData.insert(m_pCSVData->aDBData.begin() + ++nCurrent, aNewData);
523*cdf0e10cSrcweir     m_aSetNoNF.SetMax(m_pCSVData->aDBData.size());
524*cdf0e10cSrcweir     //the NumericField start at 1
525*cdf0e10cSrcweir     m_aSetNoNF.SetValue(nCurrent + 1);
526*cdf0e10cSrcweir     //the address control starts at 0
527*cdf0e10cSrcweir     m_pAddressControl->SetCurrentDataSet(nCurrent);
528*cdf0e10cSrcweir     UpdateButtons();
529*cdf0e10cSrcweir     return 0;
530*cdf0e10cSrcweir }
531*cdf0e10cSrcweir /*-- 13.04.2004 10:09:00---------------------------------------------------
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
534*cdf0e10cSrcweir IMPL_LINK(SwCreateAddressListDialog, DeleteHdl_Impl, PushButton*, EMPTYARG)
535*cdf0e10cSrcweir {
536*cdf0e10cSrcweir     sal_uInt32 nCurrent = m_pAddressControl->GetCurrentDataSet();
537*cdf0e10cSrcweir     if(m_pCSVData->aDBData.size() > 1)
538*cdf0e10cSrcweir     {
539*cdf0e10cSrcweir         m_pCSVData->aDBData.erase(m_pCSVData->aDBData.begin() + nCurrent);
540*cdf0e10cSrcweir         if(nCurrent)
541*cdf0e10cSrcweir             --nCurrent;
542*cdf0e10cSrcweir     }
543*cdf0e10cSrcweir     else
544*cdf0e10cSrcweir     {
545*cdf0e10cSrcweir         // if only one set is available then clear the data
546*cdf0e10cSrcweir         String sTemp;
547*cdf0e10cSrcweir         m_pCSVData->aDBData[0].assign(m_pCSVData->aDBData[0].size(), sTemp);
548*cdf0e10cSrcweir         m_aDeletePB.Enable(sal_False);
549*cdf0e10cSrcweir     }
550*cdf0e10cSrcweir     m_pAddressControl->SetCurrentDataSet(nCurrent);
551*cdf0e10cSrcweir     m_aSetNoNF.SetMax(m_pCSVData->aDBData.size());
552*cdf0e10cSrcweir     UpdateButtons();
553*cdf0e10cSrcweir     return 0;
554*cdf0e10cSrcweir }
555*cdf0e10cSrcweir /*-- 13.04.2004 10:09:00---------------------------------------------------
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
558*cdf0e10cSrcweir IMPL_LINK(SwCreateAddressListDialog, FindHdl_Impl, PushButton*, EMPTYARG)
559*cdf0e10cSrcweir {
560*cdf0e10cSrcweir     if(!m_pFindDlg)
561*cdf0e10cSrcweir     {
562*cdf0e10cSrcweir         m_pFindDlg = new SwFindEntryDialog(this);
563*cdf0e10cSrcweir         ListBox& rColumnBox = m_pFindDlg->GetFieldsListBox();
564*cdf0e10cSrcweir         ::std::vector< OUString >::iterator  aHeaderIter;
565*cdf0e10cSrcweir         for(aHeaderIter = m_pCSVData->aDBColumnHeaders.begin();
566*cdf0e10cSrcweir                     aHeaderIter != m_pCSVData->aDBColumnHeaders.end();
567*cdf0e10cSrcweir                     ++aHeaderIter)
568*cdf0e10cSrcweir             rColumnBox.InsertEntry(*aHeaderIter);
569*cdf0e10cSrcweir         rColumnBox.SelectEntryPos( 0 );
570*cdf0e10cSrcweir     }
571*cdf0e10cSrcweir     else
572*cdf0e10cSrcweir         m_pFindDlg->Show(!m_pFindDlg->IsVisible());
573*cdf0e10cSrcweir     return 0;
574*cdf0e10cSrcweir }
575*cdf0e10cSrcweir /*-- 13.04.2004 10:09:00---------------------------------------------------
576*cdf0e10cSrcweir 
577*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
578*cdf0e10cSrcweir IMPL_LINK(SwCreateAddressListDialog, CustomizeHdl_Impl, PushButton*, pButton)
579*cdf0e10cSrcweir {
580*cdf0e10cSrcweir     SwCustomizeAddressListDialog* pDlg = new SwCustomizeAddressListDialog(pButton, *m_pCSVData);
581*cdf0e10cSrcweir     if(RET_OK == pDlg->Execute())
582*cdf0e10cSrcweir     {
583*cdf0e10cSrcweir         delete m_pCSVData;
584*cdf0e10cSrcweir         m_pCSVData = pDlg->GetNewData();
585*cdf0e10cSrcweir         m_pAddressControl->SetData(*m_pCSVData);
586*cdf0e10cSrcweir         m_pAddressControl->SetCurrentDataSet(m_pAddressControl->GetCurrentDataSet());
587*cdf0e10cSrcweir     }
588*cdf0e10cSrcweir     delete pDlg;
589*cdf0e10cSrcweir 
590*cdf0e10cSrcweir     //update find dialog
591*cdf0e10cSrcweir     if(m_pFindDlg)
592*cdf0e10cSrcweir     {
593*cdf0e10cSrcweir         ListBox& rColumnBox = m_pFindDlg->GetFieldsListBox();
594*cdf0e10cSrcweir         rColumnBox.Clear();
595*cdf0e10cSrcweir         ::std::vector< OUString >::iterator  aHeaderIter;
596*cdf0e10cSrcweir         for(aHeaderIter = m_pCSVData->aDBColumnHeaders.begin();
597*cdf0e10cSrcweir                     aHeaderIter != m_pCSVData->aDBColumnHeaders.end();
598*cdf0e10cSrcweir                     ++aHeaderIter)
599*cdf0e10cSrcweir             rColumnBox.InsertEntry(*aHeaderIter);
600*cdf0e10cSrcweir     }
601*cdf0e10cSrcweir     return 0;
602*cdf0e10cSrcweir }
603*cdf0e10cSrcweir /*-- 23.04.2004 09:02:51---------------------------------------------------
604*cdf0e10cSrcweir     writes the data into a .csv file
605*cdf0e10cSrcweir     encoding is UTF8, separator is tab, strings are enclosed into "
606*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
607*cdf0e10cSrcweir IMPL_LINK(SwCreateAddressListDialog, OkHdl_Impl, PushButton*, EMPTYARG)
608*cdf0e10cSrcweir {
609*cdf0e10cSrcweir     if(!m_sURL.Len())
610*cdf0e10cSrcweir     {
611*cdf0e10cSrcweir         sfx2::FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_SIMPLE, 0 );
612*cdf0e10cSrcweir         uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir         String sPath( SvtPathOptions().SubstituteVariable(
615*cdf0e10cSrcweir                     String::CreateFromAscii("$(userurl)/database") ));
616*cdf0e10cSrcweir         aDlgHelper.SetDisplayDirectory( sPath );
617*cdf0e10cSrcweir         uno::Reference< XFilterManager > xFltMgr(xFP, uno::UNO_QUERY);
618*cdf0e10cSrcweir         ::rtl::OUString sCSV(C2U("*.csv"));
619*cdf0e10cSrcweir         xFltMgr->appendFilter( m_sAddressListFilterName, sCSV );
620*cdf0e10cSrcweir         xFltMgr->setCurrentFilter( m_sAddressListFilterName ) ;
621*cdf0e10cSrcweir 
622*cdf0e10cSrcweir         if( ERRCODE_NONE == aDlgHelper.Execute() )
623*cdf0e10cSrcweir         {
624*cdf0e10cSrcweir             m_sURL = xFP->getFiles().getConstArray()[0];
625*cdf0e10cSrcweir             INetURLObject aResult( m_sURL );
626*cdf0e10cSrcweir             aResult.setExtension(String::CreateFromAscii("csv"));
627*cdf0e10cSrcweir             m_sURL = aResult.GetMainURL(INetURLObject::NO_DECODE);
628*cdf0e10cSrcweir         }
629*cdf0e10cSrcweir     }
630*cdf0e10cSrcweir     if(m_sURL.Len())
631*cdf0e10cSrcweir     {
632*cdf0e10cSrcweir         SfxMedium aMedium( m_sURL, STREAM_READWRITE|STREAM_TRUNC, sal_True );
633*cdf0e10cSrcweir         SvStream* pStream = aMedium.GetOutStream();
634*cdf0e10cSrcweir         pStream->SetLineDelimiter( LINEEND_LF );
635*cdf0e10cSrcweir         pStream->SetStreamCharSet(RTL_TEXTENCODING_UTF8);
636*cdf0e10cSrcweir 
637*cdf0e10cSrcweir         OUString sSemi(';');
638*cdf0e10cSrcweir         OUString sQuote('"');
639*cdf0e10cSrcweir         String sTempMiddle(sQuote);
640*cdf0e10cSrcweir         sTempMiddle += sal_Unicode(9);
641*cdf0e10cSrcweir         OUString sMiddle(sTempMiddle);
642*cdf0e10cSrcweir         sMiddle += sQuote;
643*cdf0e10cSrcweir 
644*cdf0e10cSrcweir         //create a string for the header line
645*cdf0e10cSrcweir         OUString sLine(sQuote);
646*cdf0e10cSrcweir         ::std::vector< OUString >::iterator  aHeaderIter;
647*cdf0e10cSrcweir         for(aHeaderIter = m_pCSVData->aDBColumnHeaders.begin();
648*cdf0e10cSrcweir                     aHeaderIter != m_pCSVData->aDBColumnHeaders.end();
649*cdf0e10cSrcweir                     ++aHeaderIter)
650*cdf0e10cSrcweir         {
651*cdf0e10cSrcweir             sLine += *aHeaderIter;
652*cdf0e10cSrcweir             sLine += sMiddle;
653*cdf0e10cSrcweir         }
654*cdf0e10cSrcweir         //remove tab and quote
655*cdf0e10cSrcweir         sLine = sLine.copy( 0, sLine.getLength() - 2 );
656*cdf0e10cSrcweir         pStream->WriteUnicodeOrByteText( sLine, RTL_TEXTENCODING_UTF8 );
657*cdf0e10cSrcweir         endl(*pStream);
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir         ::std::vector< ::std::vector< OUString > >::iterator aDataIter;
660*cdf0e10cSrcweir         for( aDataIter = m_pCSVData->aDBData.begin(); aDataIter != m_pCSVData->aDBData.end(); ++aDataIter)
661*cdf0e10cSrcweir         {
662*cdf0e10cSrcweir             sLine = sQuote;
663*cdf0e10cSrcweir             ::std::vector< OUString >::iterator  aColumnIter;
664*cdf0e10cSrcweir             for(aColumnIter = aDataIter->begin(); aColumnIter != aDataIter->end(); ++aColumnIter)
665*cdf0e10cSrcweir             {
666*cdf0e10cSrcweir                 sLine += *aColumnIter;
667*cdf0e10cSrcweir                 sLine += sMiddle;
668*cdf0e10cSrcweir             }
669*cdf0e10cSrcweir             //remove tab and quote
670*cdf0e10cSrcweir             sLine = sLine.copy( 0, sLine.getLength() - 2 );
671*cdf0e10cSrcweir             pStream->WriteUnicodeOrByteText( sLine, RTL_TEXTENCODING_UTF8 );
672*cdf0e10cSrcweir             endl(*pStream);
673*cdf0e10cSrcweir         }
674*cdf0e10cSrcweir         aMedium.Commit();
675*cdf0e10cSrcweir         EndDialog(RET_OK);
676*cdf0e10cSrcweir     }
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir     return 0;
679*cdf0e10cSrcweir }
680*cdf0e10cSrcweir /*-- 13.04.2004 10:09:01---------------------------------------------------
681*cdf0e10cSrcweir 
682*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
683*cdf0e10cSrcweir IMPL_LINK(SwCreateAddressListDialog, DBCursorHdl_Impl, PushButton*, pButton)
684*cdf0e10cSrcweir {
685*cdf0e10cSrcweir     sal_uInt32 nValue = static_cast< sal_uInt32 >(m_aSetNoNF.GetValue());
686*cdf0e10cSrcweir 
687*cdf0e10cSrcweir     if(pButton == &m_aStartPB)
688*cdf0e10cSrcweir         nValue = 1;
689*cdf0e10cSrcweir     else if(pButton == &m_aPrevPB)
690*cdf0e10cSrcweir     {
691*cdf0e10cSrcweir         if(nValue > 1)
692*cdf0e10cSrcweir             --nValue;
693*cdf0e10cSrcweir     }
694*cdf0e10cSrcweir     else if(pButton == &m_aNextPB)
695*cdf0e10cSrcweir     {
696*cdf0e10cSrcweir         if(nValue < (sal_uInt32)m_aSetNoNF.GetMax())
697*cdf0e10cSrcweir             ++nValue;
698*cdf0e10cSrcweir     }
699*cdf0e10cSrcweir     else //m_aEndPB
700*cdf0e10cSrcweir         nValue = static_cast< sal_uInt32 >(m_aSetNoNF.GetMax());
701*cdf0e10cSrcweir     if(nValue != m_aSetNoNF.GetValue())
702*cdf0e10cSrcweir     {
703*cdf0e10cSrcweir         m_aSetNoNF.SetValue(nValue);
704*cdf0e10cSrcweir         DBNumCursorHdl_Impl(&m_aSetNoNF);
705*cdf0e10cSrcweir     }
706*cdf0e10cSrcweir     return 0;
707*cdf0e10cSrcweir }
708*cdf0e10cSrcweir /*-- 21.04.2004 12:06:47---------------------------------------------------
709*cdf0e10cSrcweir 
710*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
711*cdf0e10cSrcweir IMPL_LINK(SwCreateAddressListDialog, DBNumCursorHdl_Impl, NumericField*, EMPTYARG)
712*cdf0e10cSrcweir {
713*cdf0e10cSrcweir     m_pAddressControl->SetCurrentDataSet( static_cast< sal_uInt32 >(m_aSetNoNF.GetValue() - 1) );
714*cdf0e10cSrcweir     UpdateButtons();
715*cdf0e10cSrcweir     return 0;
716*cdf0e10cSrcweir }
717*cdf0e10cSrcweir /*-- 21.04.2004 13:22:27---------------------------------------------------
718*cdf0e10cSrcweir 
719*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
720*cdf0e10cSrcweir void SwCreateAddressListDialog::UpdateButtons()
721*cdf0e10cSrcweir {
722*cdf0e10cSrcweir     sal_uInt32 nCurrent = static_cast< sal_uInt32 >(m_aSetNoNF.GetValue() );
723*cdf0e10cSrcweir     sal_uInt32 nSize = (sal_uInt32 )m_pCSVData->aDBData.size();
724*cdf0e10cSrcweir     m_aStartPB.Enable(nCurrent != 1);
725*cdf0e10cSrcweir     m_aPrevPB.Enable(nCurrent != 1);
726*cdf0e10cSrcweir     m_aNextPB.Enable(nCurrent != nSize);
727*cdf0e10cSrcweir     m_aEndPB.Enable(nCurrent != nSize);
728*cdf0e10cSrcweir     m_aDeletePB.Enable(nSize > 0);
729*cdf0e10cSrcweir }
730*cdf0e10cSrcweir /*-- 21.04.2004 13:22:27---------------------------------------------------
731*cdf0e10cSrcweir 
732*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
733*cdf0e10cSrcweir void SwCreateAddressListDialog::Find(const String& rSearch, sal_Int32 nColumn)
734*cdf0e10cSrcweir {
735*cdf0e10cSrcweir     OUString sSearch = rSearch;
736*cdf0e10cSrcweir     sSearch.toAsciiLowerCase();
737*cdf0e10cSrcweir     sal_uInt32 nCurrent = m_pAddressControl->GetCurrentDataSet();
738*cdf0e10cSrcweir     //search forward
739*cdf0e10cSrcweir     bool bFound = false;
740*cdf0e10cSrcweir     sal_uInt32 nStart = nCurrent + 1;
741*cdf0e10cSrcweir     sal_uInt32 nEnd = m_pCSVData->aDBData.size();
742*cdf0e10cSrcweir     sal_uInt32 nElement = 0;
743*cdf0e10cSrcweir     sal_uInt32 nPos = 0;
744*cdf0e10cSrcweir     for(short nTemp = 0; nTemp < 2 && !bFound; nTemp++)
745*cdf0e10cSrcweir     {
746*cdf0e10cSrcweir         for(nPos = nStart; nPos < nEnd; ++nPos)
747*cdf0e10cSrcweir         {
748*cdf0e10cSrcweir             ::std::vector< OUString> aData = m_pCSVData->aDBData[nPos];
749*cdf0e10cSrcweir             if(nColumn >=0)
750*cdf0e10cSrcweir                 bFound = -1 != aData[(sal_uInt32)nColumn].toAsciiLowerCase().indexOf(sSearch);
751*cdf0e10cSrcweir             else
752*cdf0e10cSrcweir             {
753*cdf0e10cSrcweir                 for( nElement = 0; nElement < aData.size(); ++nElement)
754*cdf0e10cSrcweir                 {
755*cdf0e10cSrcweir                     bFound = -1 != aData[nElement].toAsciiLowerCase().indexOf(sSearch);
756*cdf0e10cSrcweir                     if(bFound)
757*cdf0e10cSrcweir                     {
758*cdf0e10cSrcweir                         nColumn = nElement;
759*cdf0e10cSrcweir                         break;
760*cdf0e10cSrcweir                     }
761*cdf0e10cSrcweir                 }
762*cdf0e10cSrcweir             }
763*cdf0e10cSrcweir             if(bFound)
764*cdf0e10cSrcweir                 break;
765*cdf0e10cSrcweir         }
766*cdf0e10cSrcweir         nStart = 0;
767*cdf0e10cSrcweir         nEnd = nCurrent + 1;
768*cdf0e10cSrcweir     }
769*cdf0e10cSrcweir     if(bFound)
770*cdf0e10cSrcweir     {
771*cdf0e10cSrcweir         m_pAddressControl->SetCurrentDataSet(nPos);
772*cdf0e10cSrcweir         m_aSetNoNF.SetValue( nPos + 1 );
773*cdf0e10cSrcweir         UpdateButtons();
774*cdf0e10cSrcweir         m_pAddressControl->SetCursorTo(nElement);
775*cdf0e10cSrcweir     }
776*cdf0e10cSrcweir }
777*cdf0e10cSrcweir /*-- 13.04.2004 13:48:38---------------------------------------------------
778*cdf0e10cSrcweir 
779*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
780*cdf0e10cSrcweir SwFindEntryDialog::SwFindEntryDialog(SwCreateAddressListDialog* pParent) :
781*cdf0e10cSrcweir     ModelessDialog(pParent, SW_RES(DLG_MM_FIND_ENTRY)),
782*cdf0e10cSrcweir #ifdef MSC
783*cdf0e10cSrcweir #pragma warning (disable : 4355)
784*cdf0e10cSrcweir #endif
785*cdf0e10cSrcweir     m_aFindFT( this, SW_RES(      FT_FIND      )),
786*cdf0e10cSrcweir     m_aFindED( this, SW_RES(      ED_FIND      )),
787*cdf0e10cSrcweir     m_aFindOnlyCB( this, SW_RES(  CB_FINDONLY )),
788*cdf0e10cSrcweir     m_aFindOnlyLB( this, SW_RES(  LB_FINDONLY  )),
789*cdf0e10cSrcweir     m_aFindPB( this, SW_RES(      PB_FIND)),
790*cdf0e10cSrcweir     m_aCancel( this, SW_RES(      PB_CANCEL)),
791*cdf0e10cSrcweir     m_aHelp( this, SW_RES(        PB_HELP)),
792*cdf0e10cSrcweir #ifdef MSC
793*cdf0e10cSrcweir #pragma warning (default : 4355)
794*cdf0e10cSrcweir #endif
795*cdf0e10cSrcweir    m_pParent(pParent)
796*cdf0e10cSrcweir {
797*cdf0e10cSrcweir     FreeResource();
798*cdf0e10cSrcweir     m_aFindPB.SetClickHdl(LINK(this, SwFindEntryDialog, FindHdl_Impl));
799*cdf0e10cSrcweir     m_aFindED.SetModifyHdl(LINK(this, SwFindEntryDialog, FindEnableHdl_Impl));
800*cdf0e10cSrcweir     m_aCancel.SetClickHdl(LINK(this, SwFindEntryDialog, CloseHdl_Impl));
801*cdf0e10cSrcweir }
802*cdf0e10cSrcweir /*-- 13.04.2004 13:48:38---------------------------------------------------
803*cdf0e10cSrcweir 
804*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
805*cdf0e10cSrcweir SwFindEntryDialog::~SwFindEntryDialog()
806*cdf0e10cSrcweir {
807*cdf0e10cSrcweir }
808*cdf0e10cSrcweir /*-- 21.04.2004 13:37:46---------------------------------------------------
809*cdf0e10cSrcweir 
810*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
811*cdf0e10cSrcweir IMPL_LINK(SwFindEntryDialog, FindHdl_Impl, PushButton*, EMPTYARG)
812*cdf0e10cSrcweir {
813*cdf0e10cSrcweir     sal_Int32 nColumn = -1;
814*cdf0e10cSrcweir     if(m_aFindOnlyCB.IsChecked())
815*cdf0e10cSrcweir         nColumn = m_aFindOnlyLB.GetSelectEntryPos();
816*cdf0e10cSrcweir     if(nColumn != LISTBOX_ENTRY_NOTFOUND)
817*cdf0e10cSrcweir         m_pParent->Find(m_aFindED.GetText(), nColumn);
818*cdf0e10cSrcweir     return 0;
819*cdf0e10cSrcweir }
820*cdf0e10cSrcweir /*-- 21.04.2004 13:37:46---------------------------------------------------
821*cdf0e10cSrcweir 
822*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
823*cdf0e10cSrcweir IMPL_LINK(SwFindEntryDialog, FindEnableHdl_Impl, Edit*, EMPTYARG)
824*cdf0e10cSrcweir {
825*cdf0e10cSrcweir     m_aFindPB.Enable(m_aFindED.GetText().Len() > 0);
826*cdf0e10cSrcweir     return 0;
827*cdf0e10cSrcweir }
828*cdf0e10cSrcweir /*-- 21.04.2004 15:36:36---------------------------------------------------
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir   -----------------------------------------------------------------------*/
831*cdf0e10cSrcweir IMPL_LINK(SwFindEntryDialog, CloseHdl_Impl, PushButton*, EMPTYARG)
832*cdf0e10cSrcweir {
833*cdf0e10cSrcweir     Show(sal_False);
834*cdf0e10cSrcweir     return 0;
835*cdf0e10cSrcweir }
836