summaryrefslogtreecommitdiff
path: root/sw/source/ui/dbui/createaddresslistdialog.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/dbui/createaddresslistdialog.cxx')
-rw-r--r--sw/source/ui/dbui/createaddresslistdialog.cxx835
1 files changed, 835 insertions, 0 deletions
diff --git a/sw/source/ui/dbui/createaddresslistdialog.cxx b/sw/source/ui/dbui/createaddresslistdialog.cxx
new file mode 100644
index 000000000000..6c13fee26b9c
--- /dev/null
+++ b/sw/source/ui/dbui/createaddresslistdialog.cxx
@@ -0,0 +1,835 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+#ifdef SW_DLLIMPLEMENTATION
+#undef SW_DLLIMPLEMENTATION
+#endif
+#include <swtypes.hxx>
+#include <createaddresslistdialog.hxx>
+#include <customizeaddresslistdialog.hxx>
+#include <mmconfigitem.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/msgbox.hxx>
+#ifndef _SVT_CONTROLDIMS_HRC_
+#include <svtools/controldims.hrc>
+#endif
+#include <unotools/pathoptions.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <sfx2/docfac.hxx>
+#include <sfx2/docfile.hxx>
+#include <rtl/textenc.h>
+#include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
+#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
+#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
+#include <tools/urlobj.hxx>
+#include <createaddresslistdialog.hrc>
+#include <dbui.hrc>
+#include <helpid.h>
+#include <unomid.h>
+
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::ui::dialogs;
+using ::rtl::OUString;
+
+/*-- 19.04.2004 12:19:50---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+class SwAddressControl_Impl : public Control
+{
+ ScrollBar m_aScrollBar;
+ Window m_aWindow;
+
+ ::std::vector<FixedText*> m_aFixedTexts;
+ ::std::vector<Edit*> m_aEdits;
+
+ SwCSVData* m_pData;
+ Size m_aWinOutputSize;
+ sal_Int32 m_nLineHeight;
+ sal_uInt32 m_nCurrentDataSet;
+
+ bool m_bNoDataSet;
+
+ DECL_LINK(ScrollHdl_Impl, ScrollBar*);
+ DECL_LINK(GotFocusHdl_Impl, Edit*);
+ DECL_LINK(EditModifyHdl_Impl, Edit*);
+
+ void MakeVisible(const Rectangle& aRect);
+
+ virtual long PreNotify( NotifyEvent& rNEvt );
+ virtual void Command( const CommandEvent& rCEvt );
+
+ using Window::SetData;
+
+public:
+ SwAddressControl_Impl(Window* pParent, const ResId& rResId );
+ ~SwAddressControl_Impl();
+
+ void SetData(SwCSVData& rDBData);
+
+ void SetCurrentDataSet(sal_uInt32 nSet);
+ sal_uInt32 GetCurrentDataSet() const { return m_nCurrentDataSet;}
+ void SetCursorTo(sal_uInt32 nElement);
+};
+
+/*-- 13.04.2004 10:09:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwAddressControl_Impl::SwAddressControl_Impl(Window* pParent, const ResId& rResId ) :
+ Control(pParent, rResId),
+#ifdef MSC
+#pragma warning (disable : 4355)
+#endif
+ m_aScrollBar(this, ResId(SCR_1,*rResId.GetResMgr())),
+ m_aWindow(this, ResId(WIN_DATA,*rResId.GetResMgr())),
+#ifdef MSC
+#pragma warning (default : 4355)
+#endif
+ m_pData(0),
+ m_aWinOutputSize( m_aWindow.GetOutputSizePixel() ),
+ m_nLineHeight(0),
+ m_nCurrentDataSet(0),
+ m_bNoDataSet(true)
+{
+ FreeResource();
+ Link aScrollLink = LINK(this, SwAddressControl_Impl, ScrollHdl_Impl);
+ m_aScrollBar.SetScrollHdl(aScrollLink);
+ m_aScrollBar.SetEndScrollHdl(aScrollLink);
+ m_aScrollBar.EnableDrag();
+
+}
+/*-- 13.04.2004 10:09:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwAddressControl_Impl::~SwAddressControl_Impl()
+{
+ ::std::vector<FixedText*>::iterator aTextIter;
+ for(aTextIter = m_aFixedTexts.begin(); aTextIter != m_aFixedTexts.end(); ++aTextIter)
+ delete *aTextIter;
+ ::std::vector<Edit*>::iterator aEditIter;
+ for(aEditIter = m_aEdits.begin(); aEditIter != m_aEdits.end(); ++aEditIter)
+ delete *aEditIter;
+}
+/*-- 19.04.2004 12:22:41---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwAddressControl_Impl::SetData(SwCSVData& rDBData)
+{
+ m_pData = &rDBData;
+ //when the address data is updated then remove the controls an build again
+ if(m_aFixedTexts.size())
+ {
+ ::std::vector<FixedText*>::iterator aTextIter;
+ for(aTextIter = m_aFixedTexts.begin(); aTextIter != m_aFixedTexts.end(); ++aTextIter)
+ delete *aTextIter;
+ ::std::vector<Edit*>::iterator aEditIter;
+ for(aEditIter = m_aEdits.begin(); aEditIter != m_aEdits.end(); ++aEditIter)
+ delete *aEditIter;
+ m_aFixedTexts.clear();
+ m_aEdits.clear();
+ m_bNoDataSet = true;
+ }
+ //now create appropriate controls
+
+ ::std::vector< OUString >::iterator aHeaderIter;
+
+ long nFTXPos = m_aWindow.LogicToPixel(Point(RSC_SP_CTRL_X, RSC_SP_CTRL_X), MAP_APPFONT).X();
+ long nFTHeight = m_aWindow.LogicToPixel(Size(RSC_BS_CHARHEIGHT, RSC_BS_CHARHEIGHT), MAP_APPFONT).Height();
+ long nFTWidth = 0;
+
+ //determine the width of the FixedTexts
+ for(aHeaderIter = m_pData->aDBColumnHeaders.begin();
+ aHeaderIter != m_pData->aDBColumnHeaders.end();
+ ++aHeaderIter)
+ {
+ sal_Int32 nTemp = m_aWindow.GetTextWidth(*aHeaderIter);
+ if(nTemp > nFTWidth)
+ nFTWidth = nTemp;
+ }
+ //add some pixels
+ nFTWidth += 2;
+ long nEDXPos = nFTWidth + nFTXPos +
+ m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_DESC_X, RSC_SP_CTRL_DESC_X), MAP_APPFONT).Width();
+ long nEDHeight = m_aWindow.LogicToPixel(Size(RSC_CD_TEXTBOX_HEIGHT, RSC_CD_TEXTBOX_HEIGHT), MAP_APPFONT).Height();
+ long nEDWidth = m_aWinOutputSize.Width() - nEDXPos - nFTXPos;
+ m_nLineHeight = nEDHeight + m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_GROUP_Y, RSC_SP_CTRL_GROUP_Y), MAP_APPFONT).Height();
+
+ long nEDYPos = m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_DESC_Y, RSC_SP_CTRL_DESC_Y), MAP_APPFONT).Height();
+ long nFTYPos = nEDYPos + nEDHeight - nFTHeight;
+
+ Link aFocusLink = LINK(this, SwAddressControl_Impl, GotFocusHdl_Impl);
+ Link aEditModifyLink = LINK(this, SwAddressControl_Impl, EditModifyHdl_Impl);
+ Edit* pLastEdit = 0;
+ sal_Int32 nVisibleLines = 0;
+ sal_Int32 nLines = 0;
+ for(aHeaderIter = m_pData->aDBColumnHeaders.begin();
+ aHeaderIter != m_pData->aDBColumnHeaders.end();
+ ++aHeaderIter, nEDYPos += m_nLineHeight, nFTYPos += m_nLineHeight, nLines++)
+ {
+ FixedText* pNewFT = new FixedText(&m_aWindow, WB_RIGHT);
+ Edit* pNewED = new Edit(&m_aWindow, WB_BORDER);
+ //set nLines a position identifier - used in the ModifyHdl
+ pNewED->SetData((void*)nLines);
+ pNewED->SetGetFocusHdl(aFocusLink);
+ pNewED->SetModifyHdl(aEditModifyLink);
+
+ pNewFT->SetPosSizePixel(Point(nFTXPos, nFTYPos), Size(nFTWidth, nFTHeight));
+ pNewED->SetPosSizePixel(Point(nEDXPos, nEDYPos), Size(nEDWidth, nEDHeight));
+ if(nEDYPos + nEDHeight < m_aWinOutputSize.Height())
+ ++nVisibleLines;
+
+ pNewFT->SetText(*aHeaderIter);
+
+ pNewFT->Show();
+ pNewED->Show();
+ m_aFixedTexts.push_back(pNewFT);
+ m_aEdits.push_back(pNewED);
+ pLastEdit = pNewED;
+ }
+ //scrollbar adjustment
+ if(pLastEdit)
+ {
+ //the m_aWindow has to be at least as high as the ScrollBar and it must include the last Edit
+ sal_Int32 nContentHeight = pLastEdit->GetPosPixel().Y() + nEDHeight +
+ m_aWindow.LogicToPixel(Size(RSC_SP_CTRL_GROUP_Y, RSC_SP_CTRL_GROUP_Y), MAP_APPFONT).Height();
+ if(nContentHeight < m_aScrollBar.GetSizePixel().Height())
+ {
+ nContentHeight = m_aScrollBar.GetSizePixel().Height();
+ m_aScrollBar.Enable(FALSE);
+ }
+ else
+ {
+ m_aScrollBar.Enable(TRUE);
+ m_aScrollBar.SetRange(Range(0, nLines));
+ m_aScrollBar.SetThumbPos(0);
+ m_aScrollBar.SetVisibleSize(nVisibleLines);
+ }
+ Size aWinOutputSize(m_aWinOutputSize);
+ aWinOutputSize.Height() = nContentHeight;
+ m_aWindow.SetOutputSizePixel(aWinOutputSize);
+
+ }
+}
+/*-- 21.04.2004 11:37:09---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwAddressControl_Impl::SetCurrentDataSet(sal_uInt32 nSet)
+{
+ if(m_bNoDataSet || m_nCurrentDataSet != nSet)
+ {
+ m_bNoDataSet = false;
+ m_nCurrentDataSet = nSet;
+ DBG_ASSERT(m_pData->aDBData.size() > m_nCurrentDataSet, "wrong data set index");
+ if(m_pData->aDBData.size() > m_nCurrentDataSet)
+ {
+ ::std::vector<Edit*>::iterator aEditIter;
+ sal_uInt32 nIndex = 0;
+ for(aEditIter = m_aEdits.begin(); aEditIter != m_aEdits.end(); ++aEditIter, ++nIndex)
+ {
+ DBG_ASSERT(nIndex < m_pData->aDBData[m_nCurrentDataSet].size(),
+ "number of colums doesn't match number of Edits");
+ (*aEditIter)->SetText(m_pData->aDBData[m_nCurrentDataSet][nIndex]);
+ }
+ }
+ }
+}
+
+/*-- 19.04.2004 14:17:50---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwAddressControl_Impl, ScrollHdl_Impl, ScrollBar*, pScroll)
+{
+ long nThumb = pScroll->GetThumbPos();
+ m_aWindow.SetPosPixel(Point(0, - (m_nLineHeight * nThumb)));
+
+ return 0;
+}
+/*-- 19.04.2004 16:16:25---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwAddressControl_Impl, GotFocusHdl_Impl, Edit*, pEdit)
+{
+ if(0 != (GETFOCUS_TAB & pEdit->GetGetFocusFlags()))
+ {
+ Rectangle aRect(pEdit->GetPosPixel(), pEdit->GetSizePixel());
+ MakeVisible(aRect);
+ }
+ return 0;
+}
+/*-- 21.04.2004 14:56:54---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwAddressControl_Impl::MakeVisible(const Rectangle & rRect)
+{
+ long nThumb = m_aScrollBar.GetThumbPos();
+ //determine range of visible positions
+ long nMinVisiblePos = - m_aWindow.GetPosPixel().Y();
+ long nMaxVisiblePos = m_aScrollBar.GetSizePixel().Height() + nMinVisiblePos;
+ if( rRect.TopLeft().Y() < nMinVisiblePos)
+ {
+ nThumb -= 1 + ((nMinVisiblePos - rRect.TopLeft().Y()) / m_nLineHeight);
+ }
+ else if(rRect.BottomLeft().Y() > nMaxVisiblePos)
+ {
+ nThumb += 1 + ((nMaxVisiblePos - rRect.BottomLeft().Y()) / m_nLineHeight);
+ }
+ if(nThumb != m_aScrollBar.GetThumbPos())
+ {
+ m_aScrollBar.SetThumbPos(nThumb);
+ ScrollHdl_Impl(&m_aScrollBar);
+ }
+}
+/*-- 19.04.2004 16:16:25---------------------------------------------------
+ copy data changes into database
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwAddressControl_Impl, EditModifyHdl_Impl, Edit*, pEdit)
+{
+ //get the data element number of the current set
+ sal_Int32 nIndex = (sal_Int32)(sal_IntPtr)pEdit->GetData();
+ //get the index of the set
+ DBG_ASSERT(m_pData->aDBData.size() > m_nCurrentDataSet, "wrong data set index" );
+ if(m_pData->aDBData.size() > m_nCurrentDataSet)
+ {
+ m_pData->aDBData[m_nCurrentDataSet][nIndex] = pEdit->GetText();
+ }
+ return 0;
+}
+/*-- 21.04.2004 14:51:54---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwAddressControl_Impl::SetCursorTo(sal_uInt32 nElement)
+{
+ if(nElement < m_aEdits.size())
+ {
+ Edit* pEdit = m_aEdits[nElement];
+ pEdit->GrabFocus();
+ Rectangle aRect(pEdit->GetPosPixel(), pEdit->GetSizePixel());
+ MakeVisible(aRect);
+ }
+
+}
+/*-- 19.04.2004 16:16:25---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwAddressControl_Impl::Command( const CommandEvent& rCEvt )
+{
+ switch ( rCEvt.GetCommand() )
+ {
+ case COMMAND_WHEEL:
+ case COMMAND_STARTAUTOSCROLL:
+ case COMMAND_AUTOSCROLL:
+ {
+ const CommandWheelData* pWheelData = rCEvt.GetWheelData();
+ if(pWheelData && !pWheelData->IsHorz() && COMMAND_WHEEL_ZOOM != pWheelData->GetMode())
+ {
+ HandleScrollCommand( rCEvt, 0, &m_aScrollBar );
+ }
+ }
+ break;
+ default:
+ Control::Command(rCEvt);
+ }
+}
+/*-- 19.04.2004 16:16:25---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+long SwAddressControl_Impl::PreNotify( NotifyEvent& rNEvt )
+{
+ if(rNEvt.GetType() == EVENT_COMMAND)
+ {
+ const CommandEvent* pCEvt = rNEvt.GetCommandEvent();
+ USHORT nCmd = pCEvt->GetCommand();
+ if( COMMAND_WHEEL == nCmd )
+ {
+ Command(*pCEvt);
+ return 1;
+ }
+ }
+ return Control::PreNotify(rNEvt);
+}
+/*-- 13.04.2004 10:08:59---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwCreateAddressListDialog::SwCreateAddressListDialog(
+ Window* pParent, const String& rURL, SwMailMergeConfigItem& rConfig) :
+ SfxModalDialog(pParent, SW_RES(DLG_MM_CREATEADDRESSLIST)),
+#ifdef MSC
+#pragma warning (disable : 4355)
+#endif
+ m_aAddressInformation( this, SW_RES( FI_ADDRESSINFORMATION)),
+ m_pAddressControl(new SwAddressControl_Impl(this, SW_RES(CT_ADDRESS))),
+ m_aNewPB( this, SW_RES( PB_NEW)),
+ m_aDeletePB( this, SW_RES( PB_DELETE)),
+ m_aFindPB( this, SW_RES( PB_FIND)),
+ m_aCustomizePB( this, SW_RES( PB_CUSTOMIZE)),
+
+ m_aViewEntriesFI( this, SW_RES( FI_VIEWENTRIES)),
+ m_aStartPB( this, SW_RES( PB_START)),
+ m_aPrevPB( this, SW_RES( PB_PREV)),
+ m_aSetNoNF( this, SW_RES( NF_SETNO)),
+ m_aNextPB( this, SW_RES( PB_NEXT )),
+ m_aEndPB( this, SW_RES( PB_END)),
+
+ m_aSeparatorFL( this, SW_RES( FL_SEPARATOR)),
+
+ m_aOK( this, SW_RES( PB_OK)),
+ m_aCancel( this, SW_RES( PB_CANCEL)),
+ m_aHelp( this, SW_RES( PB_HELP)),
+#ifdef MSC
+#pragma warning (default : 4355)
+#endif
+ m_sAddressListFilterName( SW_RES( ST_FILTERNAME)),
+ m_sURL(rURL),
+ m_pCSVData( new SwCSVData ),
+ m_pFindDlg(0)
+{
+ FreeResource();
+ m_aNewPB.SetClickHdl(LINK(this, SwCreateAddressListDialog, NewHdl_Impl));
+ m_aDeletePB.SetClickHdl(LINK(this, SwCreateAddressListDialog, DeleteHdl_Impl));
+ m_aFindPB.SetClickHdl(LINK(this, SwCreateAddressListDialog, FindHdl_Impl));
+ m_aCustomizePB.SetClickHdl(LINK(this, SwCreateAddressListDialog, CustomizeHdl_Impl));
+ m_aOK.SetClickHdl(LINK(this, SwCreateAddressListDialog, OkHdl_Impl));
+
+ Link aLk = LINK(this, SwCreateAddressListDialog, DBCursorHdl_Impl);
+ m_aStartPB.SetClickHdl(aLk);
+ m_aPrevPB.SetClickHdl(aLk);
+ m_aSetNoNF.SetModifyHdl(LINK(this, SwCreateAddressListDialog, DBNumCursorHdl_Impl));
+ m_aNextPB.SetClickHdl(aLk);
+ m_aEndPB.SetClickHdl(aLk);
+
+ if(m_sURL.Len())
+ {
+ //file exists, has to be loaded here
+ SfxMedium aMedium( m_sURL, STREAM_READ, TRUE );
+ SvStream* pStream = aMedium.GetInStream();
+ if(pStream)
+ {
+ pStream->SetLineDelimiter( LINEEND_LF );
+ pStream->SetStreamCharSet(RTL_TEXTENCODING_UTF8);
+
+ OUString sSemi(';');
+ OUString sQuote('"');
+ String sTempMiddle(sQuote);
+ sTempMiddle += sal_Unicode(9);
+ OUString sMiddle(sTempMiddle);
+
+ String sLine;
+ BOOL bRead = pStream->ReadUniOrByteStringLine( sLine, RTL_TEXTENCODING_UTF8 );
+
+ if(bRead)
+ {
+ //header line
+ xub_StrLen nHeaders = sLine.GetTokenCount('\t');
+ xub_StrLen nIndex = 0;
+ for( xub_StrLen nToken = 0; nToken < nHeaders; ++nToken)
+ {
+ String sHeader = sLine.GetToken( 0, '\t', nIndex );
+ DBG_ASSERT(sHeader.Len() > 2 &&
+ sHeader.GetChar(0) == '\"' && sHeader.GetChar(sHeader.Len() - 1) == '\"',
+ "Wrong format of header");
+ if(sHeader.Len() > 2)
+ {
+ m_pCSVData->aDBColumnHeaders.push_back( sHeader.Copy(1, sHeader.Len() -2));
+ }
+ }
+ }
+ while(pStream->ReadUniOrByteStringLine( sLine, RTL_TEXTENCODING_UTF8 ))
+ {
+ ::std::vector<OUString> aNewData;
+ //analyze data line
+ xub_StrLen nDataCount = sLine.GetTokenCount('\t');
+ xub_StrLen nIndex = 0;
+ for( xub_StrLen nToken = 0; nToken < nDataCount; ++nToken)
+ {
+ String sData = sLine.GetToken( 0, '\t', nIndex );
+ DBG_ASSERT(sData.Len() >= 2 &&
+ sData.GetChar(0) == '\"' && sData.GetChar(sData.Len() - 1) == '\"',
+ "Wrong format of line");
+ if(sData.Len() >= 2)
+ aNewData.push_back(sData.Copy(1, sData.Len() - 2));
+ else
+ aNewData.push_back(sData);
+ }
+ m_pCSVData->aDBData.push_back( aNewData );
+ }
+ }
+ }
+ else
+ {
+ //database has to be created
+ const ResStringArray& rAddressHeader = rConfig.GetDefaultAddressHeaders();
+ sal_uInt32 nCount = rAddressHeader.Count();
+ for(USHORT nHeader = 0; nHeader < nCount; ++nHeader)
+ m_pCSVData->aDBColumnHeaders.push_back( rAddressHeader.GetString(nHeader));
+ ::std::vector<OUString> aNewData;
+ String sTemp;
+ aNewData.insert(aNewData.begin(), nCount, sTemp);
+ m_pCSVData->aDBData.push_back(aNewData);
+ }
+ //now fill the address control
+ m_pAddressControl->SetData(*m_pCSVData);
+ m_pAddressControl->SetCurrentDataSet(0);
+ m_aSetNoNF.SetMax(m_pCSVData->aDBData.size());
+ UpdateButtons();
+}
+/*-- 13.04.2004 10:08:59---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwCreateAddressListDialog::~SwCreateAddressListDialog()
+{
+ delete m_pAddressControl;
+ delete m_pCSVData;
+ delete m_pFindDlg;
+}
+/*-- 13.04.2004 10:08:59---------------------------------------------------
+ add a new data set of empty strings and set the address input control
+ to that new set
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwCreateAddressListDialog, NewHdl_Impl, PushButton*, EMPTYARG)
+{
+ sal_uInt32 nCurrent = m_pAddressControl->GetCurrentDataSet();
+ ::std::vector<OUString> aNewData;
+ String sTemp;
+ aNewData.insert(aNewData.begin(), m_pCSVData->aDBColumnHeaders.size(), sTemp);
+ m_pCSVData->aDBData.insert(m_pCSVData->aDBData.begin() + ++nCurrent, aNewData);
+ m_aSetNoNF.SetMax(m_pCSVData->aDBData.size());
+ //the NumericField start at 1
+ m_aSetNoNF.SetValue(nCurrent + 1);
+ //the address control starts at 0
+ m_pAddressControl->SetCurrentDataSet(nCurrent);
+ UpdateButtons();
+ return 0;
+}
+/*-- 13.04.2004 10:09:00---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwCreateAddressListDialog, DeleteHdl_Impl, PushButton*, EMPTYARG)
+{
+ sal_uInt32 nCurrent = m_pAddressControl->GetCurrentDataSet();
+ if(m_pCSVData->aDBData.size() > 1)
+ {
+ m_pCSVData->aDBData.erase(m_pCSVData->aDBData.begin() + nCurrent);
+ if(nCurrent)
+ --nCurrent;
+ }
+ else
+ {
+ // if only one set is available then clear the data
+ String sTemp;
+ m_pCSVData->aDBData[0].assign(m_pCSVData->aDBData[0].size(), sTemp);
+ m_aDeletePB.Enable(FALSE);
+ }
+ m_pAddressControl->SetCurrentDataSet(nCurrent);
+ m_aSetNoNF.SetMax(m_pCSVData->aDBData.size());
+ UpdateButtons();
+ return 0;
+}
+/*-- 13.04.2004 10:09:00---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwCreateAddressListDialog, FindHdl_Impl, PushButton*, EMPTYARG)
+{
+ if(!m_pFindDlg)
+ {
+ m_pFindDlg = new SwFindEntryDialog(this);
+ ListBox& rColumnBox = m_pFindDlg->GetFieldsListBox();
+ ::std::vector< OUString >::iterator aHeaderIter;
+ for(aHeaderIter = m_pCSVData->aDBColumnHeaders.begin();
+ aHeaderIter != m_pCSVData->aDBColumnHeaders.end();
+ ++aHeaderIter)
+ rColumnBox.InsertEntry(*aHeaderIter);
+ rColumnBox.SelectEntryPos( 0 );
+ }
+ else
+ m_pFindDlg->Show(!m_pFindDlg->IsVisible());
+ return 0;
+}
+/*-- 13.04.2004 10:09:00---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwCreateAddressListDialog, CustomizeHdl_Impl, PushButton*, pButton)
+{
+ SwCustomizeAddressListDialog* pDlg = new SwCustomizeAddressListDialog(pButton, *m_pCSVData);
+ if(RET_OK == pDlg->Execute())
+ {
+ delete m_pCSVData;
+ m_pCSVData = pDlg->GetNewData();
+ m_pAddressControl->SetData(*m_pCSVData);
+ m_pAddressControl->SetCurrentDataSet(m_pAddressControl->GetCurrentDataSet());
+ }
+ delete pDlg;
+
+ //update find dialog
+ if(m_pFindDlg)
+ {
+ ListBox& rColumnBox = m_pFindDlg->GetFieldsListBox();
+ rColumnBox.Clear();
+ ::std::vector< OUString >::iterator aHeaderIter;
+ for(aHeaderIter = m_pCSVData->aDBColumnHeaders.begin();
+ aHeaderIter != m_pCSVData->aDBColumnHeaders.end();
+ ++aHeaderIter)
+ rColumnBox.InsertEntry(*aHeaderIter);
+ }
+ return 0;
+}
+/*-- 23.04.2004 09:02:51---------------------------------------------------
+ writes the data into a .csv file
+ encoding is UTF8, separator is tab, strings are enclosed into "
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwCreateAddressListDialog, OkHdl_Impl, PushButton*, EMPTYARG)
+{
+ if(!m_sURL.Len())
+ {
+ sfx2::FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_SIMPLE, 0 );
+ uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
+
+ String sPath( SvtPathOptions().SubstituteVariable(
+ String::CreateFromAscii("$(userurl)/database") ));
+ aDlgHelper.SetDisplayDirectory( sPath );
+ uno::Reference< XFilterManager > xFltMgr(xFP, uno::UNO_QUERY);
+ ::rtl::OUString sCSV(C2U("*.csv"));
+ xFltMgr->appendFilter( m_sAddressListFilterName, sCSV );
+ xFltMgr->setCurrentFilter( m_sAddressListFilterName ) ;
+
+ if( ERRCODE_NONE == aDlgHelper.Execute() )
+ {
+ m_sURL = xFP->getFiles().getConstArray()[0];
+ INetURLObject aResult( m_sURL );
+ aResult.setExtension(String::CreateFromAscii("csv"));
+ m_sURL = aResult.GetMainURL(INetURLObject::NO_DECODE);
+ }
+ }
+ if(m_sURL.Len())
+ {
+ SfxMedium aMedium( m_sURL, STREAM_READWRITE|STREAM_TRUNC, TRUE );
+ SvStream* pStream = aMedium.GetOutStream();
+ pStream->SetLineDelimiter( LINEEND_LF );
+ pStream->SetStreamCharSet(RTL_TEXTENCODING_UTF8);
+
+ OUString sSemi(';');
+ OUString sQuote('"');
+ String sTempMiddle(sQuote);
+ sTempMiddle += sal_Unicode(9);
+ OUString sMiddle(sTempMiddle);
+ sMiddle += sQuote;
+
+ //create a string for the header line
+ OUString sLine(sQuote);
+ ::std::vector< OUString >::iterator aHeaderIter;
+ for(aHeaderIter = m_pCSVData->aDBColumnHeaders.begin();
+ aHeaderIter != m_pCSVData->aDBColumnHeaders.end();
+ ++aHeaderIter)
+ {
+ sLine += *aHeaderIter;
+ sLine += sMiddle;
+ }
+ //remove tab and quote
+ sLine = sLine.copy( 0, sLine.getLength() - 2 );
+ pStream->WriteUnicodeOrByteText( sLine, RTL_TEXTENCODING_UTF8 );
+ endl(*pStream);
+
+ ::std::vector< ::std::vector< OUString > >::iterator aDataIter;
+ for( aDataIter = m_pCSVData->aDBData.begin(); aDataIter != m_pCSVData->aDBData.end(); ++aDataIter)
+ {
+ sLine = sQuote;
+ ::std::vector< OUString >::iterator aColumnIter;
+ for(aColumnIter = aDataIter->begin(); aColumnIter != aDataIter->end(); ++aColumnIter)
+ {
+ sLine += *aColumnIter;
+ sLine += sMiddle;
+ }
+ //remove tab and quote
+ sLine = sLine.copy( 0, sLine.getLength() - 2 );
+ pStream->WriteUnicodeOrByteText( sLine, RTL_TEXTENCODING_UTF8 );
+ endl(*pStream);
+ }
+ aMedium.Commit();
+ EndDialog(RET_OK);
+ }
+
+ return 0;
+}
+/*-- 13.04.2004 10:09:01---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwCreateAddressListDialog, DBCursorHdl_Impl, PushButton*, pButton)
+{
+ sal_uInt32 nValue = static_cast< sal_uInt32 >(m_aSetNoNF.GetValue());
+
+ if(pButton == &m_aStartPB)
+ nValue = 1;
+ else if(pButton == &m_aPrevPB)
+ {
+ if(nValue > 1)
+ --nValue;
+ }
+ else if(pButton == &m_aNextPB)
+ {
+ if(nValue < (sal_uInt32)m_aSetNoNF.GetMax())
+ ++nValue;
+ }
+ else //m_aEndPB
+ nValue = static_cast< sal_uInt32 >(m_aSetNoNF.GetMax());
+ if(nValue != m_aSetNoNF.GetValue())
+ {
+ m_aSetNoNF.SetValue(nValue);
+ DBNumCursorHdl_Impl(&m_aSetNoNF);
+ }
+ return 0;
+}
+/*-- 21.04.2004 12:06:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwCreateAddressListDialog, DBNumCursorHdl_Impl, NumericField*, EMPTYARG)
+{
+ m_pAddressControl->SetCurrentDataSet( static_cast< sal_uInt32 >(m_aSetNoNF.GetValue() - 1) );
+ UpdateButtons();
+ return 0;
+}
+/*-- 21.04.2004 13:22:27---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwCreateAddressListDialog::UpdateButtons()
+{
+ sal_uInt32 nCurrent = static_cast< sal_uInt32 >(m_aSetNoNF.GetValue() );
+ sal_uInt32 nSize = (sal_uInt32 )m_pCSVData->aDBData.size();
+ m_aStartPB.Enable(nCurrent != 1);
+ m_aPrevPB.Enable(nCurrent != 1);
+ m_aNextPB.Enable(nCurrent != nSize);
+ m_aEndPB.Enable(nCurrent != nSize);
+ m_aDeletePB.Enable(nSize > 0);
+}
+/*-- 21.04.2004 13:22:27---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwCreateAddressListDialog::Find(const String& rSearch, sal_Int32 nColumn)
+{
+ OUString sSearch = rSearch;
+ sSearch.toAsciiLowerCase();
+ sal_uInt32 nCurrent = m_pAddressControl->GetCurrentDataSet();
+ //search forward
+ bool bFound = false;
+ sal_uInt32 nStart = nCurrent + 1;
+ sal_uInt32 nEnd = m_pCSVData->aDBData.size();
+ sal_uInt32 nElement = 0;
+ sal_uInt32 nPos = 0;
+ for(short nTemp = 0; nTemp < 2 && !bFound; nTemp++)
+ {
+ for(nPos = nStart; nPos < nEnd; ++nPos)
+ {
+ ::std::vector< OUString> aData = m_pCSVData->aDBData[nPos];
+ if(nColumn >=0)
+ bFound = -1 != aData[(sal_uInt32)nColumn].toAsciiLowerCase().indexOf(sSearch);
+ else
+ {
+ for( nElement = 0; nElement < aData.size(); ++nElement)
+ {
+ bFound = -1 != aData[nElement].toAsciiLowerCase().indexOf(sSearch);
+ if(bFound)
+ {
+ nColumn = nElement;
+ break;
+ }
+ }
+ }
+ if(bFound)
+ break;
+ }
+ nStart = 0;
+ nEnd = nCurrent + 1;
+ }
+ if(bFound)
+ {
+ m_pAddressControl->SetCurrentDataSet(nPos);
+ m_aSetNoNF.SetValue( nPos + 1 );
+ UpdateButtons();
+ m_pAddressControl->SetCursorTo(nElement);
+ }
+}
+/*-- 13.04.2004 13:48:38---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwFindEntryDialog::SwFindEntryDialog(SwCreateAddressListDialog* pParent) :
+ ModelessDialog(pParent, SW_RES(DLG_MM_FIND_ENTRY)),
+#ifdef MSC
+#pragma warning (disable : 4355)
+#endif
+ m_aFindFT( this, SW_RES( FT_FIND )),
+ m_aFindED( this, SW_RES( ED_FIND )),
+ m_aFindOnlyCB( this, SW_RES( CB_FINDONLY )),
+ m_aFindOnlyLB( this, SW_RES( LB_FINDONLY )),
+ m_aFindPB( this, SW_RES( PB_FIND)),
+ m_aCancel( this, SW_RES( PB_CANCEL)),
+ m_aHelp( this, SW_RES( PB_HELP)),
+#ifdef MSC
+#pragma warning (default : 4355)
+#endif
+ m_pParent(pParent)
+{
+ FreeResource();
+ m_aFindPB.SetClickHdl(LINK(this, SwFindEntryDialog, FindHdl_Impl));
+ m_aFindED.SetModifyHdl(LINK(this, SwFindEntryDialog, FindEnableHdl_Impl));
+ m_aCancel.SetClickHdl(LINK(this, SwFindEntryDialog, CloseHdl_Impl));
+}
+/*-- 13.04.2004 13:48:38---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwFindEntryDialog::~SwFindEntryDialog()
+{
+}
+/*-- 21.04.2004 13:37:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwFindEntryDialog, FindHdl_Impl, PushButton*, EMPTYARG)
+{
+ sal_Int32 nColumn = -1;
+ if(m_aFindOnlyCB.IsChecked())
+ nColumn = m_aFindOnlyLB.GetSelectEntryPos();
+ if(nColumn != LISTBOX_ENTRY_NOTFOUND)
+ m_pParent->Find(m_aFindED.GetText(), nColumn);
+ return 0;
+}
+/*-- 21.04.2004 13:37:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwFindEntryDialog, FindEnableHdl_Impl, Edit*, EMPTYARG)
+{
+ m_aFindPB.Enable(m_aFindED.GetText().Len() > 0);
+ return 0;
+}
+/*-- 21.04.2004 15:36:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+IMPL_LINK(SwFindEntryDialog, CloseHdl_Impl, PushButton*, EMPTYARG)
+{
+ Show(FALSE);
+ return 0;
+}