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