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 27 #ifdef SW_DLLIMPLEMENTATION 28 #undef SW_DLLIMPLEMENTATION 29 #endif 30 31 #include <sfx2/request.hxx> 32 #include <sfx2/frame.hxx> 33 #include <vcl/svapp.hxx> 34 #include <svl/zforlist.hxx> 35 #include <svl/zformat.hxx> 36 37 #include <helpid.h> 38 #include <swtypes.hxx> 39 #include <globals.hrc> 40 #include <fldbas.hxx> 41 #include <docufld.hxx> 42 #include <wrtsh.hxx> 43 44 #include <fldui.hrc> 45 46 #ifndef _FLDTDLG_HRC 47 #include <fldtdlg.hrc> 48 #endif 49 #ifndef _FLDDINF_HXX 50 #include <flddinf.hxx> 51 #endif 52 #include <swmodule.hxx> 53 #ifndef _VIEW_HXX 54 #include <view.hxx> 55 #endif 56 #include <com/sun/star/beans/XPropertySet.hpp> 57 #include <com/sun/star/util/Time.hpp> 58 #include <com/sun/star/util/DateTime.hpp> 59 #include <com/sun/star/util/Date.hpp> 60 61 #define USER_DATA_VERSION_1 "1" 62 #define USER_DATA_VERSION USER_DATA_VERSION_1 63 64 using namespace nsSwDocInfoSubType; 65 using namespace com::sun::star; 66 /*-------------------------------------------------------------------- 67 Beschreibung: 68 --------------------------------------------------------------------*/ 69 70 SwFldDokInfPage::SwFldDokInfPage(Window* pWindow, const SfxItemSet& rCoreSet ) : 71 SwFldPage( pWindow, SW_RES( TP_FLD_DOKINF ), rCoreSet ), 72 73 aTypeFT (this, SW_RES(FT_DOKINFTYPE)), 74 aTypeTLB (this, SW_RES(TLB_DOKINFTYPE)), 75 aSelectionFT(this, SW_RES(FT_DOKINFSELECTION)), 76 aSelectionLB(this, SW_RES(LB_DOKINFSELECTION)), 77 aFormatFT (this, SW_RES(FT_DOKINFFORMAT)), 78 aFormatLB (this, SW_RES(LB_DOKINFFORMAT)), 79 aFixedCB (this, SW_RES(CB_DOKINFFIXEDCONTENT)), 80 81 pSelEntry (0), 82 aInfoStr (SW_RES(STR_DOKINF_INFO)) 83 { 84 FreeResource(); 85 86 aTypeTLB.SetHelpId(HID_FIELD_DINF_TYPE); 87 aTypeTLB.SetSelectionMode(SINGLE_SELECTION); 88 aTypeTLB.SetStyle(aTypeTLB.GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL); 89 // Font nicht setzen, damit der Font des Controls uebernommen wird! 90 // Sonst bei falschem Font Bug an OV. 91 aTypeTLB.SetSpaceBetweenEntries(0); 92 93 aTypeTLB.SetNodeDefaultImages(); 94 //enable 'active' language selection 95 aFormatLB.SetShowLanguageControl(sal_True); 96 97 SFX_ITEMSET_ARG( &rCoreSet, pItem, SfxUnoAnyItem, SID_DOCINFO, sal_False ); 98 if ( pItem ) 99 pItem->GetValue() >>= xCustomPropertySet; 100 } 101 102 /*-------------------------------------------------------------------- 103 Beschreibung: 104 --------------------------------------------------------------------*/ 105 106 __EXPORT SwFldDokInfPage::~SwFldDokInfPage() 107 { 108 } 109 110 /*-------------------------------------------------------------------- 111 Beschreibung: 112 --------------------------------------------------------------------*/ 113 114 void __EXPORT SwFldDokInfPage::Reset(const SfxItemSet& ) 115 { 116 Init(); // Allgemeine initialisierung 117 118 // TypeListBox initialisieren 119 aTypeTLB.SetUpdateMode(sal_False); 120 aTypeTLB.Clear(); 121 pSelEntry = 0; 122 123 // SubTypes in der TypeLB anzeigen 124 sal_uInt16 nTypeId = TYP_DOCINFOFLD; 125 SvLBoxEntry* pEntry = 0; 126 127 SvLBoxEntry* pInfo = 0; 128 129 sal_uInt16 nSubType = USHRT_MAX; 130 if (IsFldEdit()) 131 { 132 const SwField* pCurField = GetCurField(); 133 nSubType = ((SwDocInfoField*)pCurField)->GetSubType() & 0xff; 134 if( nSubType == DI_CUSTOM ) 135 { 136 m_sOldCustomFieldName = static_cast<const SwDocInfoField*>(pCurField)->GetName(); 137 } 138 aFormatLB.SetAutomaticLanguage(pCurField->IsAutomaticLanguage()); 139 SwWrtShell *pSh = GetWrtShell(); 140 if(pSh) 141 { 142 const SvNumberformat* pFormat = pSh->GetNumberFormatter()->GetEntry(pCurField->GetFormat()); 143 if(pFormat) 144 aFormatLB.SetLanguage(pFormat->GetLanguage()); 145 } 146 } 147 148 sal_uInt16 nSelEntryData = USHRT_MAX; 149 String sUserData = GetUserData(); 150 if(sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1)) 151 { 152 String sVal = sUserData.GetToken(1, ';'); 153 nSelEntryData = static_cast< sal_uInt16 >(sVal.ToInt32()); 154 } 155 156 SvStringsDtor aLst; 157 GetFldMgr().GetSubTypes(nTypeId, aLst); 158 for (sal_uInt16 i = 0; i < aLst.Count(); ++i) 159 { 160 if (!IsFldEdit() || nSubType == i) 161 { 162 if (DI_CUSTOM == i) 163 { 164 if(xCustomPropertySet.is() ) 165 { 166 uno::Reference< beans::XPropertySetInfo > xSetInfo = xCustomPropertySet->getPropertySetInfo(); 167 const uno::Sequence< beans::Property > rProperties = xSetInfo->getProperties(); 168 // uno::Sequence< ::rtl::OUString > aPropertyNames(rProperties.getLength()); 169 // for (sal_Int32 i = 0; i < rProperties.getLength(); ++i) { 170 // aPropertyNames[i] = rProperties[i].Name; 171 // } 172 //if ( !IsFldEdit() ) 173 if( rProperties.getLength() ) 174 { 175 pInfo = aTypeTLB.InsertEntry( String(SW_RES( STR_CUSTOM )) ); 176 pInfo->SetUserData(reinterpret_cast<void*>(USHRT_MAX)); 177 178 for (sal_Int32 n=0; n < rProperties.getLength(); n++) 179 { 180 rtl::OUString sEntry = rProperties[n].Name; 181 pEntry = aTypeTLB.InsertEntry(sEntry, pInfo); 182 if(m_sOldCustomFieldName.equals( sEntry )) 183 { 184 pSelEntry = pEntry; 185 aTypeTLB.Expand( pInfo ); 186 } 187 pEntry->SetUserData(reinterpret_cast<void*>(i)); 188 } 189 } 190 } 191 } 192 else 193 { 194 if (!(IsFldDlgHtmlMode() && (i == DI_EDIT || i == DI_THEMA || i == DI_PRINT))) 195 { 196 pEntry = aTypeTLB.InsertEntry(*aLst[i]); 197 pEntry->SetUserData(reinterpret_cast<void*>(i)); 198 } 199 } 200 if(nSelEntryData == i) 201 pSelEntry = pEntry; 202 } 203 } 204 205 // alte Pos selektieren 206 if (pSelEntry != 0) 207 { 208 aTypeTLB.Select(pSelEntry); 209 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData(); 210 } 211 else if ( aTypeTLB.GetEntry(0) ) 212 { 213 pSelEntry = aTypeTLB.GetEntry(0); 214 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData(); 215 } 216 217 FillSelectionLB(nSubType); 218 if ( pSelEntry ) 219 TypeHdl(); 220 221 aTypeTLB.SetUpdateMode(sal_True); 222 aTypeTLB.SetSelectHdl(LINK(this, SwFldDokInfPage, TypeHdl)); 223 aTypeTLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl)); 224 aSelectionLB.SetSelectHdl(LINK(this, SwFldDokInfPage, SubTypeHdl)); 225 aSelectionLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl)); 226 aFormatLB.SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl)); 227 228 if (IsFldEdit()) 229 { 230 nOldSel = aSelectionLB.GetSelectEntryPos(); 231 nOldFormat = GetCurField()->GetFormat(); 232 aFixedCB.SaveValue(); 233 } 234 } 235 236 /*-------------------------------------------------------------------- 237 Beschreibung: 238 --------------------------------------------------------------------*/ 239 240 IMPL_LINK( SwFldDokInfPage, TypeHdl, ListBox *, EMPTYARG ) 241 { 242 // Alte ListBoxPos sichern 243 SvLBoxEntry* pOldEntry = pSelEntry; 244 245 // Aktuelle ListBoxPos 246 pSelEntry = aTypeTLB.FirstSelected(); 247 248 if(!pSelEntry) 249 { 250 pSelEntry = aTypeTLB.GetEntry(0); 251 aTypeTLB.Select(pSelEntry); 252 } 253 else 254 255 if (pOldEntry != pSelEntry) 256 FillSelectionLB((sal_uInt16)(sal_uLong)pSelEntry->GetUserData()); 257 258 SubTypeHdl(); 259 260 return 0; 261 } 262 263 /*-------------------------------------------------------------------- 264 Beschreibung: 265 --------------------------------------------------------------------*/ 266 IMPL_LINK( SwFldDokInfPage, SubTypeHdl, ListBox *, EMPTYARG ) 267 { 268 sal_uInt16 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData(); 269 sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos(); 270 sal_uInt16 nExtSubType; 271 sal_uInt16 nNewType = 0; 272 273 if (nSubType != DI_EDIT) 274 { 275 if (nPos == LISTBOX_ENTRY_NOTFOUND) 276 { 277 if (!aSelectionLB.GetEntryCount()) 278 { 279 aFormatLB.Clear(); 280 aFormatLB.Enable(sal_False); 281 aFormatFT.Enable(sal_False); 282 if( nSubType == DI_CUSTOM ) 283 { 284 //find out which type the custom field has - for a start set to DATE format 285 ::rtl::OUString sName = aTypeTLB.GetEntryText(pSelEntry); 286 try 287 { 288 uno::Any aVal = xCustomPropertySet->getPropertyValue( sName ); 289 const uno::Type& rValueType = aVal.getValueType(); 290 if( rValueType == ::getCppuType( (util::DateTime*)0 )) 291 { 292 nNewType = NUMBERFORMAT_DATETIME; 293 } 294 else if( rValueType == ::getCppuType( (util::Date*)0 )) 295 { 296 nNewType = NUMBERFORMAT_DATE; 297 } 298 else if( rValueType == ::getCppuType( (util::Time*)0 )) 299 { 300 nNewType = NUMBERFORMAT_TIME; 301 } 302 } 303 catch( const uno::Exception& ) 304 { 305 } 306 } 307 else 308 return 0; 309 } 310 nPos = 0; 311 } 312 313 nExtSubType = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos); 314 } 315 else 316 nExtSubType = DI_SUB_TIME; 317 318 sal_uInt16 nOldType = 0; 319 sal_Bool bEnable = sal_False; 320 sal_Bool bOneArea = sal_False; 321 322 if (aFormatLB.IsEnabled()) 323 nOldType = aFormatLB.GetFormatType(); 324 325 switch (nExtSubType) 326 { 327 case DI_SUB_AUTHOR: 328 break; 329 330 case DI_SUB_DATE: 331 nNewType = NUMBERFORMAT_DATE; 332 bOneArea = sal_True; 333 break; 334 335 case DI_SUB_TIME: 336 nNewType = NUMBERFORMAT_TIME; 337 bOneArea = sal_True; 338 break; 339 } 340 if (!nNewType) 341 { 342 aFormatLB.Clear(); 343 } 344 else 345 { 346 if (nOldType != nNewType) 347 { 348 aFormatLB.SetFormatType(nNewType); 349 aFormatLB.SetOneArea(bOneArea); 350 } 351 bEnable = sal_True; 352 } 353 354 sal_uLong nFormat = IsFldEdit() ? ((SwDocInfoField*)GetCurField())->GetFormat() : 0; 355 356 sal_uInt16 nOldSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0; 357 358 if (IsFldEdit()) 359 { 360 nPos = aSelectionLB.GetSelectEntryPos(); 361 if (nPos != LISTBOX_ENTRY_NOTFOUND ) 362 { 363 nSubType = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos); 364 365 nOldSubType &= ~DI_SUB_FIXED; 366 if (nOldSubType == nSubType) 367 { 368 if (!nFormat && (nNewType == NUMBERFORMAT_DATE || nNewType == NUMBERFORMAT_TIME)) 369 { 370 SwWrtShell *pSh = GetWrtShell(); 371 if(pSh) 372 { 373 SvNumberFormatter* pFormatter = pSh->GetNumberFormatter(); 374 LanguageType eLang = aFormatLB.GetCurLanguage(); 375 if (nNewType == NUMBERFORMAT_DATE) 376 nFormat = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eLang); 377 else if (nNewType == NUMBERFORMAT_TIME) 378 nFormat = pFormatter->GetFormatIndex( NF_TIME_HHMM, eLang); 379 } 380 } 381 aFormatLB.SetDefFormat(nFormat); 382 } 383 } 384 else if( (nSubType == DI_CUSTOM) && (nNewType != 0) ) 385 { 386 aFormatLB.SetDefFormat(nFormat); 387 } 388 } 389 390 aFormatLB.Enable(bEnable); 391 aFormatFT.Enable(bEnable); 392 393 if (bEnable && aFormatLB.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND) 394 { 395 aFormatLB.SelectEntryPos(0); 396 } 397 398 return 0; 399 } 400 401 /*-------------------------------------------------------------------- 402 Beschreibung: 403 --------------------------------------------------------------------*/ 404 405 sal_uInt16 SwFldDokInfPage::FillSelectionLB(sal_uInt16 nSubType) 406 { 407 // Format-Listbox fuellen 408 sal_uInt16 nTypeId = TYP_DOCINFOFLD; 409 410 EnableInsert(nSubType != USHRT_MAX); 411 412 if (nSubType == USHRT_MAX) // Info-Text 413 nSubType = DI_SUBTYPE_BEGIN; 414 415 aSelectionLB.Clear(); 416 417 sal_uInt16 nSize = 0; 418 sal_uInt16 nSelPos = USHRT_MAX; 419 sal_uInt16 nExtSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0; 420 421 if (IsFldEdit()) 422 { 423 aFixedCB.Check((nExtSubType & DI_SUB_FIXED) != 0); 424 nExtSubType = ((nExtSubType & ~DI_SUB_FIXED) >> 8) - 1; 425 } 426 427 if (nSubType < DI_CREATE || nSubType == DI_DOCNO || nSubType == DI_EDIT|| nSubType == DI_CUSTOM ) 428 { 429 // Format Box ist fuer Title und Time leer 430 } 431 else 432 { 433 nSize = GetFldMgr().GetFormatCount(nTypeId, sal_False, IsFldDlgHtmlMode()); 434 for (sal_uInt16 i = 0; i < nSize; i++) 435 { 436 sal_uInt16 nPos = aSelectionLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i)); 437 aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId(nTypeId, i))); 438 if (IsFldEdit() && i == nExtSubType) 439 nSelPos = nPos; 440 } 441 } 442 443 sal_Bool bEnable = nSize != 0; 444 445 if (nSize) 446 { 447 if (!aSelectionLB.GetSelectEntryCount()) 448 aSelectionLB.SelectEntryPos(nSelPos == USHRT_MAX ? 0 : nSelPos); 449 450 bEnable = sal_True; 451 } 452 453 aSelectionFT.Enable(bEnable); 454 aSelectionLB.Enable(bEnable); 455 456 return nSize; 457 } 458 459 /*-------------------------------------------------------------------- 460 Beschreibung: 461 --------------------------------------------------------------------*/ 462 463 sal_Bool __EXPORT SwFldDokInfPage::FillItemSet(SfxItemSet& ) 464 { 465 if (!pSelEntry || (sal_uInt16)(sal_uLong)pSelEntry->GetUserData() == USHRT_MAX) 466 return sal_False; 467 468 sal_uInt16 nTypeId = TYP_DOCINFOFLD; 469 sal_uInt16 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData(); 470 471 sal_uLong nFormat = 0; 472 473 sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos(); 474 475 ::rtl::OUString aName; 476 if (DI_CUSTOM == nSubType) 477 aName = aTypeTLB.GetEntryText(pSelEntry); 478 479 if (nPos != LISTBOX_ENTRY_NOTFOUND) 480 nSubType |= (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos); 481 482 if (aFixedCB.IsChecked()) 483 nSubType |= DI_SUB_FIXED; 484 485 nPos = aFormatLB.GetSelectEntryPos(); 486 if(nPos != LISTBOX_ENTRY_NOTFOUND) 487 nFormat = aFormatLB.GetFormat(); 488 489 if (!IsFldEdit() || nOldSel != aSelectionLB.GetSelectEntryPos() || 490 nOldFormat != nFormat || aFixedCB.GetState() != aFixedCB.GetSavedValue() 491 || (DI_CUSTOM == nSubType && !aName.equals( m_sOldCustomFieldName ))) 492 { 493 InsertFld(nTypeId, nSubType, aName, aEmptyStr, nFormat, 494 ' ', aFormatLB.IsAutomaticLanguage()); 495 } 496 497 return sal_False; 498 } 499 500 /*-------------------------------------------------------------------- 501 Beschreibung: 502 --------------------------------------------------------------------*/ 503 504 SfxTabPage* __EXPORT SwFldDokInfPage::Create( Window* pParent, 505 const SfxItemSet& rAttrSet ) 506 { 507 return ( new SwFldDokInfPage( pParent, rAttrSet ) ); 508 } 509 510 /*-------------------------------------------------------------------- 511 Beschreibung: 512 --------------------------------------------------------------------*/ 513 514 sal_uInt16 SwFldDokInfPage::GetGroup() 515 { 516 return GRP_REG; 517 } 518 /* -----------------12.01.99 11:21------------------- 519 * 520 * --------------------------------------------------*/ 521 void SwFldDokInfPage::FillUserData() 522 { 523 String sData( String::CreateFromAscii( 524 RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION ))); 525 sData += ';'; 526 SvLBoxEntry* pEntry = aTypeTLB.FirstSelected(); 527 sal_uInt16 nTypeSel = pEntry ? sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(pEntry->GetUserData())) : USHRT_MAX; 528 sData += String::CreateFromInt32( nTypeSel ); 529 SetUserData(sData); 530 } 531 532 533 534