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 <hintids.hxx>
21 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
22 : #include <comphelper/processfactory.hxx>
23 : #include <editeng/unolingu.hxx>
24 : #include <unotools/localedatawrapper.hxx>
25 : #include <i18npool/lang.h>
26 : #include <svl/zformat.hxx>
27 : #include <svl/eitem.hxx>
28 : #include <svx/svxids.hrc>
29 : #include <svx/numinf.hxx>
30 : #include <vcl/msgbox.hxx>
31 : #include <svx/flagsdef.hxx>
32 : #include <svl/itemset.hxx>
33 : #include <docsh.hxx>
34 : #include <swtypes.hxx>
35 : #include <swmodule.hxx>
36 : #include <view.hxx>
37 : #include <wrtsh.hxx>
38 : #include <numfmtlb.hxx>
39 : #include <utlui.hrc>
40 : #include "swabstdlg.hxx"
41 : #include "dialog.hrc"
42 : #include <unomid.h>
43 : #include <sfx2/viewfrm.hxx>
44 :
45 : using namespace ::com::sun::star::uno;
46 : using namespace ::com::sun::star::lang;
47 :
48 :
49 : // STATIC DATA -----------------------------------------------------------
50 :
51 : /*--------------------------------------------------------------------
52 : Beschreibung:
53 : nFormatType: Formate dieses Typs anzeigen
54 : nDefFmt: Dieses Format selektieren und ggf vorher
55 : einfuegen
56 : --------------------------------------------------------------------*/
57 :
58 0 : NumFormatListBox::NumFormatListBox( Window* pWin, const ResId& rResId,
59 : short nFormatType, sal_uLong nDefFmt,
60 : sal_Bool bUsrFmts ) :
61 : ListBox ( pWin, rResId ),
62 : nCurrFormatType (-1),
63 : nStdEntry (0),
64 : bOneArea (sal_False),
65 : nDefFormat (nDefFmt),
66 : pVw (0),
67 : pOwnFormatter (0),
68 : bShowLanguageControl(sal_False),
69 0 : bUseAutomaticLanguage(sal_True)
70 : {
71 0 : Init(nFormatType, bUsrFmts);
72 0 : }
73 :
74 0 : NumFormatListBox::NumFormatListBox( Window* pWin, SwView* pView,
75 : const ResId& rResId, short nFormatType,
76 : sal_uLong nDefFmt, sal_Bool bUsrFmts ) :
77 : ListBox ( pWin, rResId ),
78 : nCurrFormatType (-1),
79 : nStdEntry (0),
80 : bOneArea (sal_False),
81 : nDefFormat (nDefFmt),
82 : pVw (pView),
83 : pOwnFormatter (0),
84 : bShowLanguageControl(sal_False),
85 0 : bUseAutomaticLanguage(sal_True)
86 : {
87 0 : Init(nFormatType, bUsrFmts);
88 0 : }
89 :
90 0 : void NumFormatListBox::Init(short nFormatType, sal_Bool bUsrFmts)
91 : {
92 0 : SwView *pView = GetView();
93 :
94 0 : if (pView)
95 0 : eCurLanguage = pView->GetWrtShell().GetCurLang();
96 : else
97 0 : eCurLanguage = SvtSysLocale().GetLanguageTag().getLanguageType();
98 :
99 0 : if (bUsrFmts == sal_False)
100 : {
101 0 : Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
102 0 : pOwnFormatter = new SvNumberFormatter(xMSF, eCurLanguage);
103 : }
104 :
105 0 : SetFormatType(nFormatType);
106 0 : SetDefFormat(nDefFormat);
107 :
108 0 : SetSelectHdl(LINK(this, NumFormatListBox, SelectHdl));
109 0 : }
110 :
111 0 : NumFormatListBox::~NumFormatListBox()
112 : {
113 0 : delete pOwnFormatter;
114 0 : }
115 :
116 0 : SwView* NumFormatListBox::GetView()
117 : {
118 0 : if( pVw )
119 0 : return pVw;
120 0 : return ::GetActiveView();
121 : }
122 :
123 0 : void NumFormatListBox::SetFormatType(const short nFormatType)
124 : {
125 0 : if (nCurrFormatType == -1 ||
126 : (nCurrFormatType & nFormatType) == 0) // Es gibt Mischformate, wie z.B. DateTime
127 : {
128 : SvNumberFormatter* pFormatter;
129 :
130 0 : if( pOwnFormatter )
131 0 : pFormatter = pOwnFormatter;
132 : else
133 : {
134 0 : SwView *pView = GetView();
135 : OSL_ENSURE(pView, "no view found");
136 0 : if(!pView)
137 0 : return;
138 0 : SwWrtShell &rSh = pView->GetWrtShell();
139 0 : pFormatter = rSh.GetNumberFormatter();
140 : }
141 :
142 0 : Clear(); // Alle Eintraege in der Listbox entfernen
143 :
144 0 : NfIndexTableOffset eOffsetStart = NF_NUMBER_START;
145 0 : NfIndexTableOffset eOffsetEnd = NF_NUMBER_START;
146 :
147 0 : switch( nFormatType )
148 : {
149 : case NUMBERFORMAT_NUMBER:
150 0 : eOffsetStart=NF_NUMBER_START;
151 0 : eOffsetEnd=NF_NUMBER_END;
152 0 : break;
153 :
154 : case NUMBERFORMAT_PERCENT:
155 0 : eOffsetStart=NF_PERCENT_START;
156 0 : eOffsetEnd=NF_PERCENT_END;
157 0 : break;
158 :
159 : case NUMBERFORMAT_CURRENCY:
160 0 : eOffsetStart=NF_CURRENCY_START;
161 0 : eOffsetEnd=NF_CURRENCY_END;
162 0 : break;
163 :
164 : case NUMBERFORMAT_DATETIME:
165 0 : eOffsetStart=NF_DATE_START;
166 0 : eOffsetEnd=NF_TIME_END;
167 0 : break;
168 :
169 : case NUMBERFORMAT_DATE:
170 0 : eOffsetStart=NF_DATE_START;
171 0 : eOffsetEnd=NF_DATE_END;
172 0 : break;
173 :
174 : case NUMBERFORMAT_TIME:
175 0 : eOffsetStart=NF_TIME_START;
176 0 : eOffsetEnd=NF_TIME_END;
177 0 : break;
178 :
179 : case NUMBERFORMAT_SCIENTIFIC:
180 0 : eOffsetStart=NF_SCIENTIFIC_START;
181 0 : eOffsetEnd=NF_SCIENTIFIC_END;
182 0 : break;
183 :
184 : case NUMBERFORMAT_FRACTION:
185 0 : eOffsetStart=NF_FRACTION_START;
186 0 : eOffsetEnd=NF_FRACTION_END;
187 0 : break;
188 :
189 : case NUMBERFORMAT_LOGICAL:
190 0 : eOffsetStart=NF_BOOLEAN;
191 0 : eOffsetEnd=NF_BOOLEAN;
192 0 : break;
193 :
194 : case NUMBERFORMAT_TEXT:
195 0 : eOffsetStart=NF_TEXT;
196 0 : eOffsetEnd=NF_TEXT;
197 0 : break;
198 :
199 : case NUMBERFORMAT_ALL:
200 0 : eOffsetStart=NF_NUMERIC_START;
201 0 : eOffsetEnd = NfIndexTableOffset( NF_INDEX_TABLE_ENTRIES - 1 );
202 0 : break;
203 :
204 : default:
205 : OSL_FAIL("what a format?");
206 0 : break;
207 : }
208 :
209 : const SvNumberformat* pFmt;
210 0 : sal_uInt16 nPos, i = 0;
211 : sal_uLong nFormat;
212 : Color* pCol;
213 0 : double fVal = GetDefValue( nFormatType );
214 0 : OUString sValue;
215 :
216 : sal_uLong nSysNumFmt = pFormatter->GetFormatIndex(
217 0 : NF_NUMBER_SYSTEM, eCurLanguage );
218 : sal_uLong nSysShortDateFmt = pFormatter->GetFormatIndex(
219 0 : NF_DATE_SYSTEM_SHORT, eCurLanguage );
220 : sal_uLong nSysLongDateFmt = pFormatter->GetFormatIndex(
221 0 : NF_DATE_SYSTEM_LONG, eCurLanguage );
222 :
223 0 : for( long nIndex = eOffsetStart; nIndex <= eOffsetEnd; ++nIndex )
224 : {
225 : nFormat = pFormatter->GetFormatIndex(
226 0 : (NfIndexTableOffset)nIndex, eCurLanguage );
227 0 : pFmt = pFormatter->GetEntry( nFormat );
228 :
229 0 : if( nFormat == pFormatter->GetFormatIndex( NF_NUMBER_STANDARD,
230 0 : eCurLanguage )
231 0 : || ((SvNumberformat*)pFmt)->GetOutputString( fVal, sValue, &pCol )
232 : || nFormatType == NUMBERFORMAT_UNDEFINED )
233 : {
234 0 : sValue = pFmt->GetFormatstring();
235 : }
236 0 : else if( nFormatType == NUMBERFORMAT_TEXT )
237 : {
238 0 : OUString sTxt("\"ABC\"");
239 0 : pFormatter->GetOutputString( sTxt, nFormat, sValue, &pCol);
240 : }
241 :
242 0 : if (nFormat != nSysNumFmt &&
243 : nFormat != nSysShortDateFmt &&
244 : nFormat != nSysLongDateFmt)
245 : {
246 0 : nPos = InsertEntry( sValue );
247 0 : SetEntryData( nPos, (void*)nFormat );
248 :
249 0 : if( nFormat == pFormatter->GetStandardFormat(
250 0 : nFormatType, eCurLanguage ) )
251 0 : nStdEntry = i;
252 0 : ++i;
253 : }
254 : }
255 :
256 0 : if (!pOwnFormatter)
257 : {
258 0 : nPos = InsertEntry(SW_RESSTR( STR_DEFINE_NUMBERFORMAT ));
259 0 : SetEntryData( nPos, NULL );
260 : }
261 :
262 0 : SelectEntryPos( nStdEntry );
263 :
264 0 : nCurrFormatType = nFormatType;
265 : }
266 : }
267 :
268 0 : void NumFormatListBox::SetDefFormat(const sal_uLong nDefFmt)
269 : {
270 0 : if (nDefFmt == ULONG_MAX)
271 : {
272 0 : nDefFormat = nDefFmt;
273 : return;
274 : }
275 :
276 : SvNumberFormatter* pFormatter;
277 0 : if (pOwnFormatter)
278 0 : pFormatter = pOwnFormatter;
279 : else
280 : {
281 0 : SwView *pView = GetView();
282 : OSL_ENSURE(pView, "no view found");
283 0 : if(!pView)
284 : return;
285 0 : SwWrtShell &rSh = pView->GetWrtShell();
286 0 : pFormatter = rSh.GetNumberFormatter();
287 : }
288 :
289 0 : short nType = pFormatter->GetType(nDefFmt);
290 :
291 0 : SetFormatType(nType);
292 :
293 0 : sal_uLong nFormat = pFormatter->GetFormatForLanguageIfBuiltIn(nDefFmt, eCurLanguage);
294 :
295 0 : for (sal_uInt16 i = 0; i < GetEntryCount(); i++)
296 : {
297 0 : if (nFormat == (sal_uLong)GetEntryData(i))
298 : {
299 0 : SelectEntryPos(i);
300 0 : nStdEntry = i;
301 0 : nDefFormat = GetFormat();
302 : return;
303 : }
304 : }
305 :
306 : // Kein Eintrag gefunden:
307 0 : double fValue = GetDefValue(nType);
308 0 : String sValue;
309 0 : Color* pCol = 0;
310 :
311 0 : if (nType == NUMBERFORMAT_TEXT)
312 : {
313 0 : OUString sTxt("\"ABC\"");
314 0 : OUString sTempOut(sValue);
315 0 : pFormatter->GetOutputString(sTxt, nDefFmt, sTempOut, &pCol);
316 0 : sValue = sTempOut;
317 : }
318 : else
319 0 : pFormatter->GetOutputString(fValue, nDefFmt, sValue, &pCol);
320 :
321 0 : sal_uInt16 nPos = 0;
322 0 : while ((sal_uLong)GetEntryData(nPos) == ULONG_MAX)
323 0 : nPos++;
324 :
325 0 : sal_uLong nSysNumFmt = pFormatter->GetFormatIndex( NF_NUMBER_SYSTEM, eCurLanguage);
326 0 : sal_uLong nSysShortDateFmt = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eCurLanguage);
327 0 : sal_uLong nSysLongDateFmt = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_LONG, eCurLanguage);
328 0 : sal_Bool bSysLang = sal_False;
329 0 : if( eCurLanguage == GetAppLanguage() )
330 0 : bSysLang = sal_True;
331 0 : sal_uLong nNumFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysNumFmt, LANGUAGE_SYSTEM );
332 0 : sal_uLong nShortDateFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysShortDateFmt, LANGUAGE_SYSTEM );
333 0 : sal_uLong nLongDateFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysLongDateFmt, LANGUAGE_SYSTEM );
334 :
335 0 : if (
336 : nDefFmt == nSysNumFmt ||
337 : nDefFmt == nSysShortDateFmt ||
338 : nDefFmt == nSysLongDateFmt ||
339 : (
340 : bSysLang &&
341 : (
342 : nDefFmt == nNumFormatForLanguage ||
343 : nDefFmt == nShortDateFormatForLanguage ||
344 : nDefFmt == nLongDateFormatForLanguage
345 : )
346 : )
347 : )
348 : {
349 0 : sValue += String(SW_RES(RID_STR_SYSTEM));
350 : }
351 :
352 0 : nPos = InsertEntry(sValue, nPos); // Als ersten numerischen Eintrag einfuegen
353 0 : SetEntryData(nPos, (void*)nDefFmt);
354 0 : SelectEntryPos(nPos);
355 0 : nDefFormat = GetFormat();
356 : }
357 :
358 0 : sal_uLong NumFormatListBox::GetFormat() const
359 : {
360 0 : sal_uInt16 nPos = GetSelectEntryPos();
361 :
362 0 : return (sal_uLong)GetEntryData(nPos);
363 : }
364 :
365 0 : IMPL_LINK( NumFormatListBox, SelectHdl, ListBox *, pBox )
366 : {
367 0 : sal_uInt16 nPos = pBox->GetSelectEntryPos();
368 0 : String sDefine(SW_RES( STR_DEFINE_NUMBERFORMAT ));
369 0 : SwView *pView = GetView();
370 :
371 0 : if( pView && nPos == pBox->GetEntryCount() - 1 &&
372 0 : pBox->GetEntry( nPos ) == sDefine )
373 : {
374 0 : SwWrtShell &rSh = pView->GetWrtShell();
375 0 : SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
376 :
377 0 : SfxItemSet aCoreSet( rSh.GetAttrPool(),
378 : SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_VALUE,
379 : SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO,
380 : SID_ATTR_NUMBERFORMAT_ONE_AREA, SID_ATTR_NUMBERFORMAT_ONE_AREA,
381 : SID_ATTR_NUMBERFORMAT_NOLANGUAGE, SID_ATTR_NUMBERFORMAT_NOLANGUAGE,
382 : SID_ATTR_NUMBERFORMAT_ADD_AUTO, SID_ATTR_NUMBERFORMAT_ADD_AUTO,
383 0 : 0 );
384 :
385 0 : double fValue = GetDefValue( nCurrFormatType);
386 :
387 0 : sal_uLong nFormat = pFormatter->GetStandardFormat( nCurrFormatType, eCurLanguage);
388 0 : aCoreSet.Put( SfxUInt32Item( SID_ATTR_NUMBERFORMAT_VALUE, nFormat ));
389 :
390 : aCoreSet.Put( SvxNumberInfoItem( pFormatter, fValue,
391 0 : SID_ATTR_NUMBERFORMAT_INFO ) );
392 :
393 0 : if( (NUMBERFORMAT_DATE | NUMBERFORMAT_TIME) & nCurrFormatType )
394 0 : aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_ONE_AREA, bOneArea));
395 :
396 0 : aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_NOLANGUAGE, !bShowLanguageControl));
397 0 : aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_ADD_AUTO, bUseAutomaticLanguage));
398 :
399 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
400 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
401 :
402 : SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( this, aCoreSet,
403 0 : GetView()->GetViewFrame()->GetFrame().GetFrameInterface(),
404 0 : RC_DLG_SWNUMFMTDLG );
405 : OSL_ENSURE(pDlg, "Dialogdiet fail!");
406 :
407 0 : if (RET_OK == pDlg->Execute())
408 : {
409 0 : const SfxPoolItem* pItem = pView->GetDocShell()->
410 0 : GetItem( SID_ATTR_NUMBERFORMAT_INFO );
411 :
412 0 : if( pItem && 0 != ((SvxNumberInfoItem*)pItem)->GetDelCount() )
413 : {
414 0 : const sal_uInt32* pDelArr = ((SvxNumberInfoItem*)pItem)->GetDelArray();
415 :
416 0 : for ( sal_uInt16 i = 0; i < ((SvxNumberInfoItem*)pItem)->GetDelCount(); i++ )
417 0 : pFormatter->DeleteEntry( pDelArr[i] );
418 : }
419 :
420 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
421 0 : if( SFX_ITEM_SET == pOutSet->GetItemState(
422 0 : SID_ATTR_NUMBERFORMAT_VALUE, sal_False, &pItem ))
423 : {
424 0 : sal_uInt32 nNumberFormat = ((SfxUInt32Item*)pItem)->GetValue();
425 : // oj #105473# change order of calls
426 0 : const SvNumberformat* pFmt = pFormatter->GetEntry(nNumberFormat);
427 0 : if( pFmt )
428 0 : eCurLanguage = pFmt->GetLanguage();
429 : // SetDefFormat uses eCurLanguage to look for if this format already in the list
430 0 : SetDefFormat(nNumberFormat);
431 : }
432 0 : if( bShowLanguageControl && SFX_ITEM_SET == pOutSet->GetItemState(
433 0 : SID_ATTR_NUMBERFORMAT_ADD_AUTO, sal_False, &pItem ))
434 : {
435 0 : bUseAutomaticLanguage = ((const SfxBoolItem*)pItem)->GetValue();
436 : }
437 : }
438 : else
439 0 : SetDefFormat(nFormat);
440 :
441 0 : delete pDlg;
442 : }
443 0 : return 0;
444 : }
445 :
446 0 : double NumFormatListBox::GetDefValue(const short nFormatType) const
447 : {
448 0 : double fDefValue = 0.0;
449 :
450 0 : switch (nFormatType)
451 : {
452 : case NUMBERFORMAT_DATE:
453 : case NUMBERFORMAT_DATE|NUMBERFORMAT_TIME:
454 0 : fDefValue = SVX_NUMVAL_DATE;
455 0 : break;
456 :
457 : case NUMBERFORMAT_TIME:
458 0 : fDefValue = SVX_NUMVAL_TIME;
459 0 : break;
460 :
461 : case NUMBERFORMAT_TEXT:
462 : case NUMBERFORMAT_UNDEFINED:
463 0 : fDefValue = 0;
464 0 : break;
465 :
466 : case NUMBERFORMAT_CURRENCY:
467 0 : fDefValue = SVX_NUMVAL_CURRENCY;
468 0 : break;
469 :
470 : case NUMBERFORMAT_PERCENT:
471 0 : fDefValue = SVX_NUMVAL_PERCENT;
472 0 : break;
473 :
474 : case NUMBERFORMAT_LOGICAL:
475 0 : fDefValue = SVX_NUMVAL_BOOLEAN;
476 0 : break;
477 :
478 : default:
479 0 : fDefValue = SVX_NUMVAL_STANDARD;
480 0 : break;
481 : }
482 :
483 0 : return fDefValue;
484 : }
485 :
486 0 : void NumFormatListBox::Clear()
487 : {
488 0 : ListBox::Clear();
489 0 : nCurrFormatType = -1;
490 30 : }
491 :
492 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|