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 : SwFieldDokInfPage::SwFieldDokInfPage(vcl::Window* pParent, const SfxItemSet& rCoreSet)
51 : : SwFieldPage(pParent, "FieldDocInfoPage",
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 : SwFieldDokInfPage::~SwFieldDokInfPage()
91 : {
92 0 : disposeOnce();
93 0 : }
94 :
95 0 : void SwFieldDokInfPage::dispose()
96 : {
97 0 : m_pTypeTLB.clear();
98 0 : m_pSelection.clear();
99 0 : m_pSelectionLB.clear();
100 0 : m_pFormat.clear();
101 0 : m_pFormatLB.clear();
102 0 : m_pFixedCB.clear();
103 0 : SwFieldPage::dispose();
104 0 : }
105 :
106 0 : void SwFieldDokInfPage::Reset(const SfxItemSet* )
107 : {
108 0 : Init(); // general initialisation
109 :
110 : // initialise TypeListBox
111 0 : m_pTypeTLB->SetUpdateMode(false);
112 0 : m_pTypeTLB->Clear();
113 0 : pSelEntry = 0;
114 :
115 : // display SubTypes in TypeLB
116 0 : SvTreeListEntry* pEntry = 0;
117 :
118 0 : SvTreeListEntry* pInfo = 0;
119 :
120 0 : sal_uInt16 nSubType = USHRT_MAX;
121 0 : if (IsFieldEdit())
122 : {
123 0 : const SwField* pCurField = GetCurField();
124 0 : nSubType = static_cast<const SwDocInfoField*>(pCurField)->GetSubType() & 0xff;
125 0 : if( nSubType == DI_CUSTOM )
126 : {
127 0 : m_sOldCustomFieldName = static_cast<const SwDocInfoField*>(pCurField)->GetName();
128 : }
129 0 : m_pFormatLB->SetAutomaticLanguage(pCurField->IsAutomaticLanguage());
130 0 : SwWrtShell *pSh = GetWrtShell();
131 0 : if(pSh)
132 : {
133 0 : const SvNumberformat* pFormat = pSh->GetNumberFormatter()->GetEntry(pCurField->GetFormat());
134 0 : if(pFormat)
135 0 : m_pFormatLB->SetLanguage(pFormat->GetLanguage());
136 : }
137 : }
138 :
139 0 : sal_Int32 nSelEntryData = LISTBOX_ENTRY_NOTFOUND;
140 0 : const OUString sUserData = GetUserData();
141 0 : if (sUserData.getToken(0, ';').equalsIgnoreAsciiCase(USER_DATA_VERSION_1))
142 : {
143 0 : nSelEntryData = sUserData.getToken(1, ';').toInt32();
144 : }
145 :
146 0 : std::vector<OUString> aLst;
147 0 : GetFieldMgr().GetSubTypes(TYP_DOCINFOFLD, aLst);
148 0 : for(size_t i = 0; i < aLst.size(); ++i)
149 : {
150 0 : if (!IsFieldEdit() || nSubType == i)
151 : {
152 0 : if (DI_CUSTOM == i)
153 : {
154 0 : if(xCustomPropertySet.is() )
155 : {
156 0 : uno::Reference< beans::XPropertySetInfo > xSetInfo = xCustomPropertySet->getPropertySetInfo();
157 0 : const uno::Sequence< beans::Property > rProperties = xSetInfo->getProperties();
158 :
159 0 : if( rProperties.getLength() )
160 : {
161 0 : pInfo = m_pTypeTLB->InsertEntry( OUString(SW_RES( STR_CUSTOM )) );
162 0 : pInfo->SetUserData(reinterpret_cast<void*>(USHRT_MAX));
163 :
164 0 : for (sal_Int32 n=0; n < rProperties.getLength(); n++)
165 : {
166 0 : const OUString sEntry = rProperties[n].Name;
167 0 : pEntry = m_pTypeTLB->InsertEntry(sEntry, pInfo);
168 0 : if (m_sOldCustomFieldName == sEntry)
169 : {
170 0 : pSelEntry = pEntry;
171 0 : m_pTypeTLB->Expand( pInfo );
172 : }
173 0 : pEntry->SetUserData(reinterpret_cast<void*>(i));
174 0 : }
175 0 : }
176 : }
177 : }
178 : else
179 : {
180 0 : if (!(IsFieldDlgHtmlMode() && (i == DI_EDIT || i == DI_THEMA || i == DI_PRINT)))
181 : {
182 0 : pEntry = m_pTypeTLB->InsertEntry(aLst[i]);
183 0 : pEntry->SetUserData(reinterpret_cast<void*>(i));
184 : }
185 : }
186 0 : if(static_cast<size_t>(nSelEntryData) == i)
187 0 : pSelEntry = pEntry;
188 : }
189 : }
190 :
191 : // select old Pos
192 0 : if (pSelEntry != 0)
193 : {
194 0 : m_pTypeTLB->Select(pSelEntry);
195 0 : nSubType = (sal_uInt16)reinterpret_cast<sal_uLong>(pSelEntry->GetUserData());
196 : }
197 0 : else if ( m_pTypeTLB->GetEntry(0) )
198 : {
199 0 : pSelEntry = m_pTypeTLB->GetEntry(0);
200 0 : nSubType = (sal_uInt16)reinterpret_cast<sal_uLong>(pSelEntry->GetUserData());
201 : }
202 :
203 0 : FillSelectionLB(nSubType);
204 0 : if ( pSelEntry )
205 0 : TypeHdl();
206 :
207 0 : m_pTypeTLB->SetUpdateMode(true);
208 0 : m_pTypeTLB->SetSelectHdl(LINK(this, SwFieldDokInfPage, TypeHdl));
209 0 : m_pTypeTLB->SetDoubleClickHdl(LINK(this, SwFieldDokInfPage, InsertHdl));
210 0 : m_pSelectionLB->SetSelectHdl(LINK(this, SwFieldDokInfPage, SubTypeHdl));
211 0 : m_pSelectionLB->SetDoubleClickHdl(LINK(this, SwFieldDokInfPage, InsertHdl));
212 0 : m_pFormatLB->SetDoubleClickHdl(LINK(this, SwFieldDokInfPage, InsertHdl));
213 :
214 0 : if (IsFieldEdit())
215 : {
216 0 : nOldSel = m_pSelectionLB->GetSelectEntryPos();
217 0 : nOldFormat = GetCurField()->GetFormat();
218 0 : m_pFixedCB->SaveValue();
219 0 : }
220 0 : }
221 :
222 0 : IMPL_LINK_NOARG(SwFieldDokInfPage, TypeHdl)
223 : {
224 : // save old ListBoxPos
225 0 : SvTreeListEntry* pOldEntry = pSelEntry;
226 :
227 : // current ListBoxPos
228 0 : pSelEntry = m_pTypeTLB->FirstSelected();
229 :
230 0 : if(!pSelEntry)
231 : {
232 0 : pSelEntry = m_pTypeTLB->GetEntry(0);
233 0 : m_pTypeTLB->Select(pSelEntry);
234 : }
235 0 : else if (pOldEntry != pSelEntry)
236 0 : FillSelectionLB((sal_uInt16)reinterpret_cast<sal_uLong>(pSelEntry->GetUserData()));
237 :
238 0 : SubTypeHdl();
239 :
240 0 : return 0;
241 : }
242 :
243 0 : IMPL_LINK_NOARG(SwFieldDokInfPage, SubTypeHdl)
244 : {
245 0 : sal_uInt16 nSubType = (sal_uInt16)reinterpret_cast<sal_uLong>(pSelEntry->GetUserData());
246 0 : sal_Int32 nPos = m_pSelectionLB->GetSelectEntryPos();
247 : sal_uInt16 nExtSubType;
248 0 : sal_uInt16 nNewType = 0;
249 :
250 0 : if (nSubType != DI_EDIT)
251 : {
252 0 : if (nPos == LISTBOX_ENTRY_NOTFOUND)
253 : {
254 0 : if (!m_pSelectionLB->GetEntryCount())
255 : {
256 0 : m_pFormatLB->Clear();
257 0 : m_pFormat->Enable(false);
258 0 : if( nSubType == DI_CUSTOM )
259 : {
260 : //find out which type the custom field has - for a start set to DATE format
261 0 : const OUString sName = m_pTypeTLB->GetEntryText(pSelEntry);
262 : try
263 : {
264 0 : uno::Any aVal = xCustomPropertySet->getPropertyValue( sName );
265 0 : const uno::Type& rValueType = aVal.getValueType();
266 0 : if( rValueType == ::cppu::UnoType<util::DateTime>::get())
267 : {
268 0 : nNewType = css::util::NumberFormat::DATETIME;
269 : }
270 0 : else if( rValueType == ::cppu::UnoType<util::Date>::get())
271 : {
272 0 : nNewType = css::util::NumberFormat::DATE;
273 : }
274 0 : else if( rValueType == ::cppu::UnoType<util::Time>::get())
275 : {
276 0 : nNewType = css::util::NumberFormat::TIME;
277 0 : }
278 : }
279 0 : catch( const uno::Exception& )
280 : {
281 0 : }
282 : }
283 : else
284 0 : return 0;
285 : }
286 0 : nPos = 0;
287 : }
288 :
289 0 : nExtSubType = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pSelectionLB->GetEntryData(nPos));
290 : }
291 : else
292 0 : nExtSubType = DI_SUB_TIME;
293 :
294 0 : sal_uInt16 nOldType = 0;
295 0 : bool bEnable = false;
296 0 : bool bOneArea = false;
297 :
298 0 : if (m_pFormatLB->IsEnabled())
299 0 : nOldType = m_pFormatLB->GetFormatType();
300 :
301 0 : switch (nExtSubType)
302 : {
303 : case DI_SUB_AUTHOR:
304 0 : break;
305 :
306 : case DI_SUB_DATE:
307 0 : nNewType = css::util::NumberFormat::DATE;
308 0 : bOneArea = true;
309 0 : break;
310 :
311 : case DI_SUB_TIME:
312 0 : nNewType = css::util::NumberFormat::TIME;
313 0 : bOneArea = true;
314 0 : break;
315 : }
316 0 : if (!nNewType)
317 : {
318 0 : m_pFormatLB->Clear();
319 : }
320 : else
321 : {
322 0 : if (nOldType != nNewType)
323 : {
324 0 : m_pFormatLB->SetFormatType(nNewType);
325 0 : m_pFormatLB->SetOneArea(bOneArea);
326 : }
327 0 : bEnable = true;
328 : }
329 :
330 0 : sal_uLong nFormat = IsFieldEdit() ? static_cast<SwDocInfoField*>(GetCurField())->GetFormat() : 0;
331 :
332 0 : sal_uInt16 nOldSubType = IsFieldEdit() ? (static_cast<SwDocInfoField*>(GetCurField())->GetSubType() & 0xff00) : 0;
333 :
334 0 : if (IsFieldEdit())
335 : {
336 0 : nPos = m_pSelectionLB->GetSelectEntryPos();
337 0 : if (nPos != LISTBOX_ENTRY_NOTFOUND )
338 : {
339 0 : nSubType = (sal_uInt16)reinterpret_cast<sal_uLong>(m_pSelectionLB->GetEntryData(nPos));
340 :
341 0 : nOldSubType &= ~DI_SUB_FIXED;
342 0 : if (nOldSubType == nSubType)
343 : {
344 0 : if (!nFormat && (nNewType == css::util::NumberFormat::DATE || nNewType == css::util::NumberFormat::TIME))
345 : {
346 0 : SwWrtShell *pSh = GetWrtShell();
347 0 : if(pSh)
348 : {
349 0 : SvNumberFormatter* pFormatter = pSh->GetNumberFormatter();
350 0 : LanguageType eLang = m_pFormatLB->GetCurLanguage();
351 0 : if (nNewType == css::util::NumberFormat::DATE)
352 0 : nFormat = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eLang);
353 0 : else if (nNewType == css::util::NumberFormat::TIME)
354 0 : nFormat = pFormatter->GetFormatIndex( NF_TIME_HHMM, eLang);
355 : }
356 : }
357 0 : m_pFormatLB->SetDefFormat(nFormat);
358 : }
359 : }
360 0 : else if( (nSubType == DI_CUSTOM) && (nNewType != 0) )
361 : {
362 0 : m_pFormatLB->SetDefFormat(nFormat);
363 : }
364 : }
365 :
366 0 : m_pFormat->Enable(bEnable);
367 :
368 0 : if (bEnable && m_pFormatLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND)
369 : {
370 0 : m_pFormatLB->SelectEntryPos(0);
371 : }
372 :
373 0 : return 0;
374 : }
375 :
376 0 : sal_Int32 SwFieldDokInfPage::FillSelectionLB(sal_uInt16 nSubType)
377 : {
378 : // fill Format-Listbox
379 0 : sal_uInt16 nTypeId = TYP_DOCINFOFLD;
380 :
381 0 : EnableInsert(nSubType != USHRT_MAX);
382 :
383 0 : if (nSubType == USHRT_MAX) // Info-Text
384 0 : nSubType = DI_SUBTYPE_BEGIN;
385 :
386 0 : m_pSelectionLB->Clear();
387 :
388 0 : sal_uInt16 nSize = 0;
389 0 : sal_Int32 nSelPos = LISTBOX_ENTRY_NOTFOUND;
390 0 : sal_uInt16 nExtSubType = IsFieldEdit() ? (static_cast<SwDocInfoField*>(GetCurField())->GetSubType() & 0xff00) : 0;
391 :
392 0 : if (IsFieldEdit())
393 : {
394 0 : m_pFixedCB->Check((nExtSubType & DI_SUB_FIXED) != 0);
395 0 : nExtSubType = ((nExtSubType & ~DI_SUB_FIXED) >> 8) - 1;
396 : }
397 :
398 0 : if (nSubType < DI_CREATE || nSubType == DI_DOCNO || nSubType == DI_EDIT|| nSubType == DI_CUSTOM )
399 : {
400 : // Format Box is empty for Title and Time
401 : }
402 : else
403 : {
404 0 : nSize = GetFieldMgr().GetFormatCount(nTypeId, false, IsFieldDlgHtmlMode());
405 0 : for (sal_uInt16 i = 0; i < nSize; i++)
406 : {
407 0 : sal_Int32 nPos = m_pSelectionLB->InsertEntry(GetFieldMgr().GetFormatStr(nTypeId, i));
408 0 : m_pSelectionLB->SetEntryData(nPos, reinterpret_cast<void*>(GetFieldMgr().GetFormatId(nTypeId, i)));
409 0 : if (IsFieldEdit() && i == nExtSubType)
410 0 : nSelPos = nPos;
411 : }
412 : }
413 :
414 0 : bool bEnable = nSize != 0;
415 :
416 0 : if (nSize)
417 : {
418 0 : if (!m_pSelectionLB->GetSelectEntryCount())
419 0 : m_pSelectionLB->SelectEntryPos(nSelPos == USHRT_MAX ? 0 : nSelPos);
420 :
421 0 : bEnable = true;
422 : }
423 :
424 0 : m_pSelection->Enable(bEnable);
425 :
426 0 : return nSize;
427 : }
428 :
429 0 : bool SwFieldDokInfPage::FillItemSet(SfxItemSet* )
430 : {
431 0 : if (!pSelEntry || (sal_uInt16)reinterpret_cast<sal_uLong>(pSelEntry->GetUserData()) == USHRT_MAX)
432 0 : return false;
433 :
434 0 : sal_uInt16 nSubType = (sal_uInt16)reinterpret_cast<sal_uLong>(pSelEntry->GetUserData());
435 :
436 0 : sal_uLong nFormat = 0;
437 :
438 0 : sal_Int32 nPos = m_pSelectionLB->GetSelectEntryPos();
439 :
440 0 : OUString aName;
441 0 : if (DI_CUSTOM == nSubType)
442 0 : aName = m_pTypeTLB->GetEntryText(pSelEntry);
443 :
444 0 : if (nPos != LISTBOX_ENTRY_NOTFOUND)
445 0 : nSubType |= (sal_uInt16)reinterpret_cast<sal_uLong>(m_pSelectionLB->GetEntryData(nPos));
446 :
447 0 : if (m_pFixedCB->IsChecked())
448 0 : nSubType |= DI_SUB_FIXED;
449 :
450 0 : nPos = m_pFormatLB->GetSelectEntryPos();
451 0 : if(nPos != LISTBOX_ENTRY_NOTFOUND)
452 0 : nFormat = m_pFormatLB->GetFormat();
453 :
454 0 : if (!IsFieldEdit() || nOldSel != m_pSelectionLB->GetSelectEntryPos() ||
455 0 : nOldFormat != nFormat || m_pFixedCB->IsValueChangedFromSaved()
456 0 : || (DI_CUSTOM == nSubType && aName != m_sOldCustomFieldName ))
457 : {
458 : InsertField(TYP_DOCINFOFLD, nSubType, aName, aEmptyOUStr, nFormat,
459 0 : ' ', m_pFormatLB->IsAutomaticLanguage());
460 : }
461 :
462 0 : return false;
463 : }
464 :
465 0 : VclPtr<SfxTabPage> SwFieldDokInfPage::Create( vcl::Window* pParent,
466 : const SfxItemSet* rAttrSet )
467 : {
468 0 : return VclPtr<SwFieldDokInfPage>::Create( pParent, *rAttrSet );
469 : }
470 :
471 0 : sal_uInt16 SwFieldDokInfPage::GetGroup()
472 : {
473 0 : return GRP_REG;
474 : }
475 :
476 0 : void SwFieldDokInfPage::FillUserData()
477 : {
478 0 : SvTreeListEntry* pEntry = m_pTypeTLB->FirstSelected();
479 0 : sal_uInt16 nTypeSel = pEntry ? sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(pEntry->GetUserData())) : USHRT_MAX;
480 0 : SetUserData(USER_DATA_VERSION ";" + OUString::number( nTypeSel ));
481 0 : }
482 :
483 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|