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