| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the 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(sal_False); |
| } |
| else |
| { |
| m_aScrollBar.Enable(sal_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(); |
| sal_uInt16 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, sal_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; |
| sal_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(sal_uInt16 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(sal_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, sal_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(sal_False); |
| return 0; |
| } |