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