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
SwFldDokInfPage(Window * pWindow,const SfxItemSet & rCoreSet)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
~SwFldDokInfPage()106 __EXPORT SwFldDokInfPage::~SwFldDokInfPage()
107 {
108 }
109
110 /*--------------------------------------------------------------------
111 Beschreibung:
112 --------------------------------------------------------------------*/
113
Reset(const SfxItemSet &)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
IMPL_LINK(SwFldDokInfPage,TypeHdl,ListBox *,EMPTYARG)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 --------------------------------------------------------------------*/
IMPL_LINK(SwFldDokInfPage,SubTypeHdl,ListBox *,EMPTYARG)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
FillSelectionLB(sal_uInt16 nSubType)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
FillItemSet(SfxItemSet &)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
Create(Window * pParent,const SfxItemSet & rAttrSet)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
GetGroup()514 sal_uInt16 SwFldDokInfPage::GetGroup()
515 {
516 return GRP_REG;
517 }
518 /* -----------------12.01.99 11:21-------------------
519 *
520 * --------------------------------------------------*/
FillUserData()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