Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sfx2/request.hxx>
21 : #include <sfx2/frame.hxx>
22 : #include <vcl/svapp.hxx>
23 : #include <svl/zforlist.hxx>
24 : #include <svl/zformat.hxx>
25 : #include <svtools/treelistentry.hxx>
26 :
27 : #include <helpid.h>
28 : #include <swtypes.hxx>
29 : #include <globals.hrc>
30 : #include <fldbas.hxx>
31 : #include <docufld.hxx>
32 : #include <wrtsh.hxx>
33 :
34 : #include <fldui.hrc>
35 :
36 : #include <flddinf.hxx>
37 : #include <swmodule.hxx>
38 : #include <view.hxx>
39 : #include <com/sun/star/beans/XPropertySet.hpp>
40 : #include <com/sun/star/util/Time.hpp>
41 : #include <com/sun/star/util/DateTime.hpp>
42 : #include <com/sun/star/util/Date.hpp>
43 :
44 : #define USER_DATA_VERSION_1 "1"
45 : #define USER_DATA_VERSION USER_DATA_VERSION_1
46 :
47 : using namespace nsSwDocInfoSubType;
48 : using namespace com::sun::star;
49 :
50 0 : SwFldDokInfPage::SwFldDokInfPage(vcl::Window* pParent, const SfxItemSet& rCoreSet)
51 : : SwFldPage(pParent, "FldDocInfoPage",
52 : "modules/swriter/ui/flddocinfopage.ui", rCoreSet)
53 : , pSelEntry(0)
54 : , nOldSel(0)
55 0 : , nOldFormat(0)
56 : {
57 0 : get(m_pTypeTLB, "type");
58 0 : get(m_pSelection, "selectframe");
59 0 : get(m_pFormat, "formatframe");
60 0 : get(m_pSelectionLB, "select");
61 0 : get(m_pFormatLB, "format");
62 0 : get(m_pFixedCB, "fixed");
63 :
64 0 : long nHeight = m_pTypeTLB->GetTextHeight() * 20;
65 0 : m_pTypeTLB->set_height_request(nHeight);
66 0 : m_pSelectionLB->set_height_request(nHeight);
67 0 : m_pFormatLB->set_height_request(nHeight);
68 :
69 0 : long nWidth = m_pTypeTLB->LogicToPixel(Size(FIELD_COLUMN_WIDTH, 0), MapMode(MAP_APPFONT)).Width();
70 0 : m_pTypeTLB->set_width_request(nWidth);
71 0 : m_pFormatLB->set_width_request(nWidth);
72 0 : m_pSelectionLB->set_width_request(nWidth);
73 :
74 0 : m_pTypeTLB->SetSelectionMode(SINGLE_SELECTION);
75 0 : m_pTypeTLB->SetStyle(m_pTypeTLB->GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
76 0 : m_pTypeTLB->SetOptimalImageIndent();
77 : // Don't set font, so that the control's font is adobted!
78 : // Otherwise at wrong font bug to OV.
79 0 : m_pTypeTLB->SetSpaceBetweenEntries(0);
80 :
81 0 : m_pTypeTLB->SetNodeDefaultImages();
82 : //enable 'active' language selection
83 0 : m_pFormatLB->SetShowLanguageControl(true);
84 :
85 0 : SFX_ITEMSET_ARG( &rCoreSet, pItem, SfxUnoAnyItem, SID_DOCINFO, false );
86 0 : if ( pItem )
87 0 : pItem->GetValue() >>= xCustomPropertySet;
88 0 : }
89 :
90 0 : SwFldDokInfPage::~SwFldDokInfPage()
91 : {
92 0 : }
93 :
94 0 : void SwFldDokInfPage::Reset(const SfxItemSet* )
95 : {
96 0 : Init(); // general initialisation
97 :
98 : // initialise TypeListBox
99 0 : m_pTypeTLB->SetUpdateMode(false);
100 0 : m_pTypeTLB->Clear();
101 0 : pSelEntry = 0;
102 :
103 : // display SubTypes in TypeLB
104 0 : SvTreeListEntry* pEntry = 0;
105 :
106 0 : SvTreeListEntry* pInfo = 0;
107 :
108 0 : sal_uInt16 nSubType = USHRT_MAX;
109 0 : if (IsFldEdit())
110 : {
111 0 : const SwField* pCurField = GetCurField();
112 0 : nSubType = ((SwDocInfoField*)pCurField)->GetSubType() & 0xff;
113 0 : if( nSubType == DI_CUSTOM )
114 : {
115 0 : m_sOldCustomFieldName = static_cast<const SwDocInfoField*>(pCurField)->GetName();
116 : }
117 0 : m_pFormatLB->SetAutomaticLanguage(pCurField->IsAutomaticLanguage());
118 0 : SwWrtShell *pSh = GetWrtShell();
119 0 : if(pSh)
120 : {
121 0 : const SvNumberformat* pFormat = pSh->GetNumberFormatter()->GetEntry(pCurField->GetFormat());
122 0 : if(pFormat)
123 0 : m_pFormatLB->SetLanguage(pFormat->GetLanguage());
124 : }
125 : }
126 :
127 0 : sal_Int32 nSelEntryData = LISTBOX_ENTRY_NOTFOUND;
128 0 : const OUString sUserData = GetUserData();
129 0 : if (sUserData.getToken(0, ';').equalsIgnoreAsciiCase(USER_DATA_VERSION_1))
130 : {
131 0 : nSelEntryData = sUserData.getToken(1, ';').toInt32();
132 : }
133 :
134 0 : std::vector<OUString> aLst;
135 0 : GetFldMgr().GetSubTypes(TYP_DOCINFOFLD, aLst);
136 0 : for(size_t i = 0; i < aLst.size(); ++i)
137 : {
138 0 : if (!IsFldEdit() || nSubType == i)
139 : {
140 0 : if (DI_CUSTOM == i)
141 : {
142 0 : if(xCustomPropertySet.is() )
143 : {
144 0 : uno::Reference< beans::XPropertySetInfo > xSetInfo = xCustomPropertySet->getPropertySetInfo();
145 0 : const uno::Sequence< beans::Property > rProperties = xSetInfo->getProperties();
146 :
147 0 : if( rProperties.getLength() )
148 : {
149 0 : pInfo = m_pTypeTLB->InsertEntry( OUString(SW_RES( STR_CUSTOM )) );
150 0 : pInfo->SetUserData(reinterpret_cast<void*>(USHRT_MAX));
151 :
152 0 : for (sal_Int32 n=0; n < rProperties.getLength(); n++)
153 : {
154 0 : const OUString sEntry = rProperties[n].Name;
155 0 : pEntry = m_pTypeTLB->InsertEntry(sEntry, pInfo);
156 0 : if (m_sOldCustomFieldName == sEntry)
157 : {
158 0 : pSelEntry = pEntry;
159 0 : m_pTypeTLB->Expand( pInfo );
160 : }
161 0 : pEntry->SetUserData(reinterpret_cast<void*>(i));
162 0 : }
163 0 : }
164 : }
165 : }
166 : else
167 : {
168 0 : if (!(IsFldDlgHtmlMode() && (i == DI_EDIT || i == DI_THEMA || i == DI_PRINT)))
169 : {
170 0 : pEntry = m_pTypeTLB->InsertEntry(aLst[i]);
171 0 : pEntry->SetUserData(reinterpret_cast<void*>(i));
172 : }
173 : }
174 0 : if(static_cast<size_t>(nSelEntryData) == i)
175 0 : pSelEntry = pEntry;
176 : }
177 : }
178 :
179 : // select old Pos
180 0 : if (pSelEntry != 0)
181 : {
182 0 : m_pTypeTLB->Select(pSelEntry);
183 0 : nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
184 : }
185 0 : else if ( m_pTypeTLB->GetEntry(0) )
186 : {
187 0 : pSelEntry = m_pTypeTLB->GetEntry(0);
188 0 : nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
189 : }
190 :
191 0 : FillSelectionLB(nSubType);
192 0 : if ( pSelEntry )
193 0 : TypeHdl();
194 :
195 0 : m_pTypeTLB->SetUpdateMode(true);
196 0 : m_pTypeTLB->SetSelectHdl(LINK(this, SwFldDokInfPage, TypeHdl));
197 0 : m_pTypeTLB->SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl));
198 0 : m_pSelectionLB->SetSelectHdl(LINK(this, SwFldDokInfPage, SubTypeHdl));
199 0 : m_pSelectionLB->SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl));
200 0 : m_pFormatLB->SetDoubleClickHdl(LINK(this, SwFldDokInfPage, InsertHdl));
201 :
202 0 : if (IsFldEdit())
203 : {
204 0 : nOldSel = m_pSelectionLB->GetSelectEntryPos();
205 0 : nOldFormat = GetCurField()->GetFormat();
206 0 : m_pFixedCB->SaveValue();
207 0 : }
208 0 : }
209 :
210 0 : IMPL_LINK_NOARG(SwFldDokInfPage, TypeHdl)
211 : {
212 : // save old ListBoxPos
213 0 : SvTreeListEntry* pOldEntry = pSelEntry;
214 :
215 : // current ListBoxPos
216 0 : pSelEntry = m_pTypeTLB->FirstSelected();
217 :
218 0 : if(!pSelEntry)
219 : {
220 0 : pSelEntry = m_pTypeTLB->GetEntry(0);
221 0 : m_pTypeTLB->Select(pSelEntry);
222 : }
223 0 : else if (pOldEntry != pSelEntry)
224 0 : FillSelectionLB((sal_uInt16)(sal_uLong)pSelEntry->GetUserData());
225 :
226 0 : SubTypeHdl();
227 :
228 0 : return 0;
229 : }
230 :
231 0 : IMPL_LINK_NOARG(SwFldDokInfPage, SubTypeHdl)
232 : {
233 0 : sal_uInt16 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
234 0 : sal_Int32 nPos = m_pSelectionLB->GetSelectEntryPos();
235 : sal_uInt16 nExtSubType;
236 0 : sal_uInt16 nNewType = 0;
237 :
238 0 : if (nSubType != DI_EDIT)
239 : {
240 0 : if (nPos == LISTBOX_ENTRY_NOTFOUND)
241 : {
242 0 : if (!m_pSelectionLB->GetEntryCount())
243 : {
244 0 : m_pFormatLB->Clear();
245 0 : m_pFormat->Enable(false);
246 0 : if( nSubType == DI_CUSTOM )
247 : {
248 : //find out which type the custom field has - for a start set to DATE format
249 0 : const OUString sName = m_pTypeTLB->GetEntryText(pSelEntry);
250 : try
251 : {
252 0 : uno::Any aVal = xCustomPropertySet->getPropertyValue( sName );
253 0 : const uno::Type& rValueType = aVal.getValueType();
254 0 : if( rValueType == ::cppu::UnoType<util::DateTime>::get())
255 : {
256 0 : nNewType = NUMBERFORMAT_DATETIME;
257 : }
258 0 : else if( rValueType == ::cppu::UnoType<util::Date>::get())
259 : {
260 0 : nNewType = NUMBERFORMAT_DATE;
261 : }
262 0 : else if( rValueType == ::cppu::UnoType<util::Time>::get())
263 : {
264 0 : nNewType = NUMBERFORMAT_TIME;
265 0 : }
266 : }
267 0 : catch( const uno::Exception& )
268 : {
269 0 : }
270 : }
271 : else
272 0 : return 0;
273 : }
274 0 : nPos = 0;
275 : }
276 :
277 0 : nExtSubType = (sal_uInt16)(sal_uLong)m_pSelectionLB->GetEntryData(nPos);
278 : }
279 : else
280 0 : nExtSubType = DI_SUB_TIME;
281 :
282 0 : sal_uInt16 nOldType = 0;
283 0 : bool bEnable = false;
284 0 : bool bOneArea = false;
285 :
286 0 : if (m_pFormatLB->IsEnabled())
287 0 : nOldType = m_pFormatLB->GetFormatType();
288 :
289 0 : switch (nExtSubType)
290 : {
291 : case DI_SUB_AUTHOR:
292 0 : break;
293 :
294 : case DI_SUB_DATE:
295 0 : nNewType = NUMBERFORMAT_DATE;
296 0 : bOneArea = true;
297 0 : break;
298 :
299 : case DI_SUB_TIME:
300 0 : nNewType = NUMBERFORMAT_TIME;
301 0 : bOneArea = true;
302 0 : break;
303 : }
304 0 : if (!nNewType)
305 : {
306 0 : m_pFormatLB->Clear();
307 : }
308 : else
309 : {
310 0 : if (nOldType != nNewType)
311 : {
312 0 : m_pFormatLB->SetFormatType(nNewType);
313 0 : m_pFormatLB->SetOneArea(bOneArea);
314 : }
315 0 : bEnable = true;
316 : }
317 :
318 0 : sal_uLong nFormat = IsFldEdit() ? ((SwDocInfoField*)GetCurField())->GetFormat() : 0;
319 :
320 0 : sal_uInt16 nOldSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0;
321 :
322 0 : if (IsFldEdit())
323 : {
324 0 : nPos = m_pSelectionLB->GetSelectEntryPos();
325 0 : if (nPos != LISTBOX_ENTRY_NOTFOUND )
326 : {
327 0 : nSubType = (sal_uInt16)(sal_uLong)m_pSelectionLB->GetEntryData(nPos);
328 :
329 0 : nOldSubType &= ~DI_SUB_FIXED;
330 0 : if (nOldSubType == nSubType)
331 : {
332 0 : if (!nFormat && (nNewType == NUMBERFORMAT_DATE || nNewType == NUMBERFORMAT_TIME))
333 : {
334 0 : SwWrtShell *pSh = GetWrtShell();
335 0 : if(pSh)
336 : {
337 0 : SvNumberFormatter* pFormatter = pSh->GetNumberFormatter();
338 0 : LanguageType eLang = m_pFormatLB->GetCurLanguage();
339 0 : if (nNewType == NUMBERFORMAT_DATE)
340 0 : nFormat = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eLang);
341 0 : else if (nNewType == NUMBERFORMAT_TIME)
342 0 : nFormat = pFormatter->GetFormatIndex( NF_TIME_HHMM, eLang);
343 : }
344 : }
345 0 : m_pFormatLB->SetDefFormat(nFormat);
346 : }
347 : }
348 0 : else if( (nSubType == DI_CUSTOM) && (nNewType != 0) )
349 : {
350 0 : m_pFormatLB->SetDefFormat(nFormat);
351 : }
352 : }
353 :
354 0 : m_pFormat->Enable(bEnable);
355 :
356 0 : if (bEnable && m_pFormatLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND)
357 : {
358 0 : m_pFormatLB->SelectEntryPos(0);
359 : }
360 :
361 0 : return 0;
362 : }
363 :
364 0 : sal_Int32 SwFldDokInfPage::FillSelectionLB(sal_uInt16 nSubType)
365 : {
366 : // fill Format-Listbox
367 0 : sal_uInt16 nTypeId = TYP_DOCINFOFLD;
368 :
369 0 : EnableInsert(nSubType != USHRT_MAX);
370 :
371 0 : if (nSubType == USHRT_MAX) // Info-Text
372 0 : nSubType = DI_SUBTYPE_BEGIN;
373 :
374 0 : m_pSelectionLB->Clear();
375 :
376 0 : sal_uInt16 nSize = 0;
377 0 : sal_Int32 nSelPos = LISTBOX_ENTRY_NOTFOUND;
378 0 : sal_uInt16 nExtSubType = IsFldEdit() ? (((SwDocInfoField*)GetCurField())->GetSubType() & 0xff00) : 0;
379 :
380 0 : if (IsFldEdit())
381 : {
382 0 : m_pFixedCB->Check((nExtSubType & DI_SUB_FIXED) != 0);
383 0 : nExtSubType = ((nExtSubType & ~DI_SUB_FIXED) >> 8) - 1;
384 : }
385 :
386 0 : if (nSubType < DI_CREATE || nSubType == DI_DOCNO || nSubType == DI_EDIT|| nSubType == DI_CUSTOM )
387 : {
388 : // Format Box is empty for Title and Time
389 : }
390 : else
391 : {
392 0 : nSize = GetFldMgr().GetFormatCount(nTypeId, false, IsFldDlgHtmlMode());
393 0 : for (sal_uInt16 i = 0; i < nSize; i++)
394 : {
395 0 : sal_Int32 nPos = m_pSelectionLB->InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
396 0 : m_pSelectionLB->SetEntryData(nPos, reinterpret_cast<void*>(GetFldMgr().GetFormatId(nTypeId, i)));
397 0 : if (IsFldEdit() && i == nExtSubType)
398 0 : nSelPos = nPos;
399 : }
400 : }
401 :
402 0 : bool bEnable = nSize != 0;
403 :
404 0 : if (nSize)
405 : {
406 0 : if (!m_pSelectionLB->GetSelectEntryCount())
407 0 : m_pSelectionLB->SelectEntryPos(nSelPos == USHRT_MAX ? 0 : nSelPos);
408 :
409 0 : bEnable = true;
410 : }
411 :
412 0 : m_pSelection->Enable(bEnable);
413 :
414 0 : return nSize;
415 : }
416 :
417 0 : bool SwFldDokInfPage::FillItemSet(SfxItemSet* )
418 : {
419 0 : if (!pSelEntry || (sal_uInt16)(sal_uLong)pSelEntry->GetUserData() == USHRT_MAX)
420 0 : return false;
421 :
422 0 : sal_uInt16 nSubType = (sal_uInt16)(sal_uLong)pSelEntry->GetUserData();
423 :
424 0 : sal_uLong nFormat = 0;
425 :
426 0 : sal_Int32 nPos = m_pSelectionLB->GetSelectEntryPos();
427 :
428 0 : OUString aName;
429 0 : if (DI_CUSTOM == nSubType)
430 0 : aName = m_pTypeTLB->GetEntryText(pSelEntry);
431 :
432 0 : if (nPos != LISTBOX_ENTRY_NOTFOUND)
433 0 : nSubType |= (sal_uInt16)(sal_uLong)m_pSelectionLB->GetEntryData(nPos);
434 :
435 0 : if (m_pFixedCB->IsChecked())
436 0 : nSubType |= DI_SUB_FIXED;
437 :
438 0 : nPos = m_pFormatLB->GetSelectEntryPos();
439 0 : if(nPos != LISTBOX_ENTRY_NOTFOUND)
440 0 : nFormat = m_pFormatLB->GetFormat();
441 :
442 0 : if (!IsFldEdit() || nOldSel != m_pSelectionLB->GetSelectEntryPos() ||
443 0 : nOldFormat != nFormat || m_pFixedCB->IsValueChangedFromSaved()
444 0 : || (DI_CUSTOM == nSubType && aName != m_sOldCustomFieldName ))
445 : {
446 : InsertFld(TYP_DOCINFOFLD, nSubType, aName, aEmptyOUStr, nFormat,
447 0 : ' ', m_pFormatLB->IsAutomaticLanguage());
448 : }
449 :
450 0 : return false;
451 : }
452 :
453 0 : SfxTabPage* SwFldDokInfPage::Create( vcl::Window* pParent,
454 : const SfxItemSet* rAttrSet )
455 : {
456 0 : return ( new SwFldDokInfPage( pParent, *rAttrSet ) );
457 : }
458 :
459 0 : sal_uInt16 SwFldDokInfPage::GetGroup()
460 : {
461 0 : return GRP_REG;
462 : }
463 :
464 0 : void SwFldDokInfPage::FillUserData()
465 : {
466 0 : SvTreeListEntry* pEntry = m_pTypeTLB->FirstSelected();
467 0 : sal_uInt16 nTypeSel = pEntry ? sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(pEntry->GetUserData())) : USHRT_MAX;
468 0 : SetUserData(USER_DATA_VERSION ";" + OUString::number( nTypeSel ));
469 0 : }
470 :
471 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|