1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sw.hxx" 30 #ifdef SW_DLLIMPLEMENTATION 31 #undef SW_DLLIMPLEMENTATION 32 #endif 33 34 35 #include <swmodule.hxx> 36 #ifndef _VIEW_HXX 37 #include <view.hxx> 38 #endif 39 #include <wrtsh.hxx> 40 #ifndef _GLOBALS_HRC 41 #include <globals.hrc> 42 #endif 43 #include <dbfld.hxx> 44 #ifndef _FLDTDLG_HXX 45 #include <fldtdlg.hxx> 46 #endif 47 #include <numrule.hxx> 48 49 #ifndef _FLDTDLG_HRC 50 #include <fldtdlg.hrc> 51 #endif 52 #ifndef _FLDUI_HRC 53 #include <fldui.hrc> 54 #endif 55 #ifndef _FLDDB_HXX 56 #include <flddb.hxx> 57 #endif 58 #include <dbconfig.hxx> 59 #ifndef _DBMGR_HXX 60 #include <dbmgr.hxx> 61 #endif 62 63 #define USER_DATA_VERSION_1 "1" 64 #define USER_DATA_VERSION USER_DATA_VERSION_1 65 /*-------------------------------------------------------------------- 66 Beschreibung: 67 --------------------------------------------------------------------*/ 68 69 SwFldDBPage::SwFldDBPage(Window* pParent, const SfxItemSet& rCoreSet ) : 70 SwFldPage( pParent, SW_RES( TP_FLD_DB ), rCoreSet ), 71 aTypeFT (this, SW_RES(FT_DBTYPE)), 72 aTypeLB (this, SW_RES(LB_DBTYPE)), 73 aSelectionFT(this, SW_RES(FT_DBSELECTION)), 74 aDatabaseTLB(this, SW_RES(TLB_DBLIST), 0, aEmptyStr, sal_False), 75 aAddDBFT(this, SW_RES(FT_ADDDB)), 76 aAddDBPB(this, SW_RES(PB_ADDDB)), 77 aConditionFT(this, SW_RES(FT_DBCONDITION)), 78 aConditionED(this, SW_RES(ED_DBCONDITION)), 79 aValueFT (this, SW_RES(FT_DBSETNUMBER)), 80 aValueED (this, SW_RES(ED_DBSETNUMBER)), 81 aDBFormatRB (this, SW_RES(RB_DBOWNFORMAT)), 82 aNewFormatRB(this, SW_RES(RB_DBFORMAT)), 83 aNumFormatLB(this, SW_RES(LB_DBNUMFORMAT)), 84 aFormatLB (this, SW_RES(LB_DBFORMAT)), 85 aFormatFL (this, SW_RES(FL_DBFORMAT)), 86 aFormatVertFL (this, SW_RES(FL_DBFORMAT_VERT)) 87 { 88 FreeResource(); 89 90 aOldNumSelectHdl = aNumFormatLB.GetSelectHdl(); 91 92 aNumFormatLB.SetSelectHdl(LINK(this, SwFldDBPage, NumSelectHdl)); 93 aDatabaseTLB.SetSelectHdl(LINK(this, SwFldDBPage, TreeSelectHdl)); 94 aDatabaseTLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl)); 95 96 aValueED.SetModifyHdl(LINK(this, SwFldDBPage, ModifyHdl)); 97 aAddDBPB.SetClickHdl(LINK(this, SwFldDBPage, AddDBHdl)); 98 } 99 100 /*-------------------------------------------------------------------- 101 Beschreibung: 102 --------------------------------------------------------------------*/ 103 104 __EXPORT SwFldDBPage::~SwFldDBPage() 105 { 106 } 107 108 /*-------------------------------------------------------------------- 109 Beschreibung: TabPage initialisieren 110 --------------------------------------------------------------------*/ 111 112 void __EXPORT SwFldDBPage::Reset(const SfxItemSet&) 113 { 114 Init(); // Allgemeine initialisierung 115 116 aTypeLB.SetUpdateMode(sal_False); 117 sal_uInt16 nOldPos = aTypeLB.GetSelectEntryPos(); 118 sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName); 119 120 aTypeLB.Clear(); 121 122 sal_uInt16 nPos, nTypeId, i; 123 124 if (!IsFldEdit()) 125 { 126 // TypeListBox initialisieren 127 const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup()); 128 129 for(i = rRg.nStart; i < rRg.nEnd; ++i) 130 { 131 nTypeId = GetFldMgr().GetTypeId(i); 132 nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i)); 133 aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId)); 134 } 135 } 136 else 137 { 138 nTypeId = GetCurField()->GetTypeId(); 139 nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId))); 140 aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId)); 141 } 142 143 // alte Pos selektieren 144 if (GetTypeSel() != LISTBOX_ENTRY_NOTFOUND) 145 aTypeLB.SelectEntryPos(GetTypeSel()); 146 147 aFormatLB.Clear(); 148 149 sal_uInt16 nSize = GetFldMgr().GetFormatCount(TYP_DBSETNUMBERFLD, sal_False, IsFldDlgHtmlMode()); 150 for( i = 0; i < nSize; ++i ) 151 { 152 sal_uInt16 nEntryPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(TYP_DBSETNUMBERFLD, i)); 153 sal_uInt16 nFmtId = GetFldMgr().GetFormatId( TYP_DBSETNUMBERFLD, i ); 154 aFormatLB.SetEntryData( nEntryPos, reinterpret_cast<void*>(nFmtId) ); 155 if( SVX_NUM_ARABIC == nFmtId ) 156 aFormatLB.SelectEntryPos( nEntryPos ); 157 } 158 159 if (!IsFldEdit()) 160 { 161 if (nOldPos != LISTBOX_ENTRY_NOTFOUND) 162 aTypeLB.SelectEntryPos(nOldPos); 163 164 if (sOldDBName.Len()) 165 { 166 aDatabaseTLB.Select(sOldDBName, sOldTableName, sOldColumnName); 167 } 168 else 169 { 170 SwWrtShell *pSh = GetWrtShell(); 171 if(!pSh) 172 pSh = ::GetActiveWrtShell(); 173 if(pSh) 174 { 175 SwDBData aTmp(pSh->GetDBData()); 176 aDatabaseTLB.Select(aTmp.sDataSource, aTmp.sCommand, aEmptyStr); 177 } 178 } 179 } 180 181 if( !IsRefresh() ) 182 { 183 String sUserData = GetUserData(); 184 if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1)) 185 { 186 String sVal = sUserData.GetToken(1, ';'); 187 sal_uInt16 nVal = (sal_uInt16)sVal.ToInt32(); 188 if(nVal != USHRT_MAX) 189 { 190 for(i = 0; i < aTypeLB.GetEntryCount(); i++) 191 if(nVal == (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(i)) 192 { 193 aTypeLB.SelectEntryPos(i); 194 break; 195 } 196 } 197 } 198 } 199 TypeHdl(0); 200 201 aTypeLB.SetUpdateMode(sal_True); 202 aTypeLB.SetSelectHdl(LINK(this, SwFldDBPage, TypeHdl)); 203 aTypeLB.SetDoubleClickHdl(LINK(this, SwFldDBPage, InsertHdl)); 204 205 if (IsFldEdit()) 206 { 207 aConditionED.SaveValue(); 208 aValueED.SaveValue(); 209 sOldDBName = aDatabaseTLB.GetDBName(sOldTableName, sOldColumnName); 210 nOldFormat = GetCurField()->GetFormat(); 211 nOldSubType = GetCurField()->GetSubType(); 212 } 213 } 214 215 /*-------------------------------------------------------------------- 216 Beschreibung: 217 --------------------------------------------------------------------*/ 218 219 sal_Bool __EXPORT SwFldDBPage::FillItemSet(SfxItemSet& ) 220 { 221 String sTableName, sColumnName; 222 SwDBData aData; 223 sal_Bool bIsTable; 224 aData.sDataSource = aDatabaseTLB.GetDBName(sTableName, sColumnName, &bIsTable); 225 aData.sCommand = sTableName; 226 aData.nCommandType = bIsTable ? 0 : 1; 227 SwWrtShell *pSh = GetWrtShell(); 228 if(!pSh) 229 pSh = ::GetActiveWrtShell(); 230 231 if (!aData.sDataSource.getLength()) 232 aData = pSh->GetDBData(); 233 234 if(aData.sDataSource.getLength()) // Ohne Datenbank kein neuer Feldbefehl 235 { 236 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel()); 237 String aVal(aValueED.GetText()); 238 String aName(aConditionED.GetText()); 239 sal_uLong nFormat = 0; 240 sal_uInt16 nSubType = 0; 241 242 String sDBName = aData.sDataSource; 243 sDBName += DB_DELIM; 244 sDBName += (String)aData.sCommand; 245 sDBName += DB_DELIM; 246 sDBName += String::CreateFromInt32(aData.nCommandType); 247 sDBName += DB_DELIM; 248 if(sColumnName.Len()) 249 { 250 sDBName += sColumnName; 251 sDBName += DB_DELIM; 252 } 253 aName.Insert(sDBName, 0); 254 255 switch (nTypeId) 256 { 257 case TYP_DBFLD: 258 nFormat = aNumFormatLB.GetFormat(); 259 if (aNewFormatRB.IsEnabled() && aNewFormatRB.IsChecked()) 260 nSubType = nsSwExtendedSubType::SUB_OWN_FMT; 261 aName = sDBName; 262 break; 263 264 case TYP_DBSETNUMBERFLD: 265 nFormat = (sal_uInt16)(sal_uLong)aFormatLB.GetEntryData( 266 aFormatLB.GetSelectEntryPos() ); 267 break; 268 } 269 270 271 String sTempDBName, sTempTableName, sTempColumnName; 272 sTempDBName = aDatabaseTLB.GetDBName(sTempTableName, sTempColumnName); 273 sal_Bool bDBListBoxChanged = sOldDBName != sTempDBName || 274 sOldTableName != sTempTableName || sOldColumnName != sTempColumnName; 275 if (!IsFldEdit() || 276 aConditionED.GetSavedValue() != aConditionED.GetText() || 277 aValueED.GetSavedValue() != aValueED.GetText() || 278 bDBListBoxChanged || 279 nOldFormat != nFormat || nOldSubType != nSubType) 280 { 281 InsertFld( nTypeId, nSubType, aName, aVal, nFormat); 282 } 283 } 284 285 return sal_False; 286 } 287 288 /*-------------------------------------------------------------------- 289 Beschreibung: 290 --------------------------------------------------------------------*/ 291 292 SfxTabPage* __EXPORT SwFldDBPage::Create( Window* pParent, 293 const SfxItemSet& rAttrSet ) 294 { 295 return ( new SwFldDBPage( pParent, rAttrSet ) ); 296 } 297 298 /*-------------------------------------------------------------------- 299 Beschreibung: 300 --------------------------------------------------------------------*/ 301 302 sal_uInt16 SwFldDBPage::GetGroup() 303 { 304 return GRP_DB; 305 } 306 307 /*-------------------------------------------------------------------- 308 Beschreibung: 309 --------------------------------------------------------------------*/ 310 311 IMPL_LINK( SwFldDBPage, TypeHdl, ListBox *, pBox ) 312 { 313 // Alte ListBoxPos sichern 314 const sal_uInt16 nOld = GetTypeSel(); 315 316 // Aktuelle ListBoxPos 317 SetTypeSel(aTypeLB.GetSelectEntryPos()); 318 319 if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND) 320 { 321 SetTypeSel(0); 322 aTypeLB.SelectEntryPos(0); 323 } 324 325 if (nOld != GetTypeSel()) 326 { 327 SwWrtShell *pSh = GetWrtShell(); 328 if(!pSh) 329 pSh = ::GetActiveWrtShell(); 330 sal_Bool bCond = sal_False, bSetNo = sal_False, bFormat = sal_False, bDBFormat = sal_False; 331 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel()); 332 333 aDatabaseTLB.ShowColumns(nTypeId == TYP_DBFLD); 334 335 if (IsFldEdit()) 336 { 337 SwDBData aData; 338 String sColumnName; 339 if (nTypeId == TYP_DBFLD) 340 { 341 aData = ((SwDBField*)GetCurField())->GetDBData(); 342 sColumnName = ((SwDBFieldType*)GetCurField()->GetTyp())->GetColumnName(); 343 } 344 else 345 { 346 aData = ((SwDBNameInfField*)GetCurField())->GetDBData(pSh->GetDoc()); 347 } 348 aDatabaseTLB.Select(aData.sDataSource, aData.sCommand, sColumnName); 349 } 350 351 switch (nTypeId) 352 { 353 case TYP_DBFLD: 354 bFormat = sal_True; 355 bDBFormat = sal_True; 356 aNumFormatLB.Show(); 357 aFormatLB.Hide(); 358 359 if (pBox) // Typ wurde vom User geaendert 360 aDBFormatRB.Check(); 361 362 if (IsFldEdit()) 363 { 364 if (GetCurField()->GetFormat() != 0 && GetCurField()->GetFormat() != SAL_MAX_UINT32) 365 aNumFormatLB.SetDefFormat(GetCurField()->GetFormat()); 366 367 if (GetCurField()->GetSubType() & nsSwExtendedSubType::SUB_OWN_FMT) 368 aNewFormatRB.Check(); 369 else 370 aDBFormatRB.Check(); 371 } 372 break; 373 374 case TYP_DBNUMSETFLD: 375 bSetNo = sal_True; 376 // kein break! 377 case TYP_DBNEXTSETFLD: 378 bCond = sal_True; 379 if (IsFldEdit()) 380 { 381 aConditionED.SetText(GetCurField()->GetPar1()); 382 aValueED.SetText(GetCurField()->GetPar2()); 383 } 384 break; 385 386 case TYP_DBNAMEFLD: 387 break; 388 389 case TYP_DBSETNUMBERFLD: 390 bFormat = sal_True; 391 aNewFormatRB.Check(); 392 aNumFormatLB.Hide(); 393 aFormatLB.Show(); 394 if( IsFldEdit() ) 395 { 396 for( sal_uInt16 nI = aFormatLB.GetEntryCount(); nI; ) 397 if( GetCurField()->GetFormat() == (sal_uInt16)(sal_uLong) 398 aFormatLB.GetEntryData( --nI )) 399 { 400 aFormatLB.SelectEntryPos( nI ); 401 break; 402 } 403 } 404 break; 405 } 406 407 aConditionFT.Enable(bCond); 408 aConditionED.Enable(bCond); 409 aValueFT.Enable(bSetNo); 410 aValueED.Enable(bSetNo); 411 if (nTypeId != TYP_DBFLD) 412 { 413 aDBFormatRB.Enable(bDBFormat); 414 aNewFormatRB.Enable(bDBFormat|bFormat); 415 aNumFormatLB.Enable(bDBFormat); 416 aFormatLB.Enable(bFormat); 417 } 418 aFormatFL.Enable(bDBFormat|bFormat); 419 420 if (!IsFldEdit()) 421 { 422 aValueED.SetText(aEmptyStr); 423 if (bCond) 424 aConditionED.SetText( String::CreateFromAscii( 425 RTL_CONSTASCII_STRINGPARAM( "sal_True" ))); 426 else 427 aConditionED.SetText(aEmptyStr); 428 } 429 430 CheckInsert(); 431 } 432 433 return 0; 434 } 435 436 /*-------------------------------------------------------------------- 437 Beschreibung: 438 --------------------------------------------------------------------*/ 439 440 IMPL_LINK( SwFldDBPage, NumSelectHdl, NumFormatListBox *, pLB ) 441 { 442 aNewFormatRB.Check(); 443 aOldNumSelectHdl.Call(pLB); 444 445 return 0; 446 } 447 448 /*--------------------------------------------------------------------- 449 Beschreibung: 450 ---------------------------------------------------------------------*/ 451 452 void SwFldDBPage::CheckInsert() 453 { 454 sal_Bool bInsert = sal_True; 455 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel()); 456 457 SvLBoxEntry* pEntry = aDatabaseTLB.GetCurEntry(); 458 459 if (pEntry) 460 { 461 pEntry = aDatabaseTLB.GetParent(pEntry); 462 463 if (nTypeId == TYP_DBFLD && pEntry) 464 pEntry = aDatabaseTLB.GetParent(pEntry); 465 466 bInsert &= pEntry != 0; 467 } 468 else 469 bInsert = sal_False; 470 471 if (nTypeId == TYP_DBNUMSETFLD) 472 { 473 sal_Bool bHasValue = aValueED.GetText().Len() != 0; 474 475 bInsert &= bHasValue; 476 } 477 478 EnableInsert(bInsert); 479 } 480 481 /*--------------------------------------------------------------------- 482 Beschreibung: 483 ---------------------------------------------------------------------*/ 484 485 IMPL_LINK( SwFldDBPage, TreeSelectHdl, SvTreeListBox *, pBox ) 486 { 487 SvLBoxEntry* pColEntry; 488 SvLBoxEntry* pEntry = pColEntry = pBox->GetCurEntry(); 489 if (pEntry) 490 { 491 sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel()); 492 493 pEntry = aDatabaseTLB.GetParent(pEntry); 494 495 if (nTypeId == TYP_DBFLD && pEntry) 496 pEntry = aDatabaseTLB.GetParent(pEntry); 497 498 CheckInsert(); 499 500 if (nTypeId == TYP_DBFLD) 501 { 502 sal_Bool bNumFormat = sal_False; 503 504 if (pEntry != 0) 505 { 506 String sTableName; 507 String sColumnName; 508 sal_Bool bIsTable; 509 String sDBName = aDatabaseTLB.GetDBName(sTableName, sColumnName, &bIsTable); 510 bNumFormat = GetFldMgr().IsDBNumeric(sDBName, 511 sTableName, 512 bIsTable, 513 sColumnName); 514 if (!IsFldEdit()) 515 aDBFormatRB.Check(); 516 } 517 518 aDBFormatRB.Enable(bNumFormat); 519 aNewFormatRB.Enable(bNumFormat); 520 aNumFormatLB.Enable(bNumFormat); 521 aFormatFL.Enable(bNumFormat); 522 } 523 } 524 return 0; 525 } 526 /*-- 27.05.2004 09:14:01--------------------------------------------------- 527 528 -----------------------------------------------------------------------*/ 529 IMPL_LINK( SwFldDBPage, AddDBHdl, PushButton *, EMPTYARG ) 530 { 531 String sNewDB = SwNewDBMgr::LoadAndRegisterDataSource(); 532 if(sNewDB.Len()) 533 { 534 aDatabaseTLB.AddDataSource(sNewDB); 535 } 536 return 0; 537 } 538 539 /*-------------------------------------------------------------------- 540 Beschreibung: Modify 541 --------------------------------------------------------------------*/ 542 543 IMPL_LINK( SwFldDBPage, ModifyHdl, Edit *, EMPTYARG ) 544 { 545 CheckInsert(); 546 return 0; 547 } 548 549 /* -----------------12.01.99 11:21------------------- 550 * 551 * --------------------------------------------------*/ 552 void SwFldDBPage::FillUserData() 553 { 554 String sData( String::CreateFromAscii( 555 RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION ))); 556 sData += ';'; 557 sal_uInt16 nTypeSel = aTypeLB.GetSelectEntryPos(); 558 559 if( LISTBOX_ENTRY_NOTFOUND == nTypeSel ) 560 nTypeSel = USHRT_MAX; 561 else 562 nTypeSel = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData( nTypeSel ); 563 sData += String::CreateFromInt32( nTypeSel ); 564 SetUserData(sData); 565 } 566 /* -----------------12.12.2002 11:33----------------- 567 * 568 * --------------------------------------------------*/ 569 void SwFldDBPage::ActivateMailMergeAddress() 570 { 571 sal_uLong nData = TYP_DBFLD; 572 aTypeLB.SelectEntryPos(aTypeLB.GetEntryPos( (const void*) nData )); 573 aTypeLB.GetSelectHdl().Call(&aTypeLB); 574 const SwDBData& rData = SW_MOD()->GetDBConfig()->GetAddressSource(); 575 aDatabaseTLB.Select(rData.sDataSource, rData.sCommand, aEmptyStr); 576 } 577 /*-- 07.10.2003 13:59:04--------------------------------------------------- 578 579 -----------------------------------------------------------------------*/ 580 void SwFldDBPage::SetWrtShell(SwWrtShell& rSh) 581 { 582 aDatabaseTLB.SetWrtShell(rSh); 583 } 584