summaryrefslogtreecommitdiff
path: root/sw/source/uibase/utlui/numfmtlb.cxx
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-05-26 17:43:14 +0200
committerMichael Stahl <mstahl@redhat.com>2014-05-27 11:13:02 +0200
commit35029b250318b3a4f02cef5194abdd3f68311c43 (patch)
tree5026ab2dab620dcdcae84e574483ce3c325e5a78 /sw/source/uibase/utlui/numfmtlb.cxx
parentf8d26c68e48e52265d4f20a1527bf52828c046ad (diff)
sw: move sw/source/core/uibase to sw/source/uibase
It's too confusing to have UI code inside of core; the important part is that it's separated from the optional UI code in swui library. Change-Id: I640a52723d5802faf08f3b8eaa03cd937fd93449
Diffstat (limited to 'sw/source/uibase/utlui/numfmtlb.cxx')
-rw-r--r--sw/source/uibase/utlui/numfmtlb.cxx488
1 files changed, 488 insertions, 0 deletions
diff --git a/sw/source/uibase/utlui/numfmtlb.cxx b/sw/source/uibase/utlui/numfmtlb.cxx
new file mode 100644
index 000000000000..55ac0d15725d
--- /dev/null
+++ b/sw/source/uibase/utlui/numfmtlb.cxx
@@ -0,0 +1,488 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <hintids.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <comphelper/processfactory.hxx>
+#include <editeng/unolingu.hxx>
+#include <unotools/localedatawrapper.hxx>
+#include <i18nlangtag/lang.h>
+#include <svl/zformat.hxx>
+#include <svl/eitem.hxx>
+#include <svx/svxids.hrc>
+#include <svx/numinf.hxx>
+#include <vcl/msgbox.hxx>
+#include <svx/flagsdef.hxx>
+#include <svl/itemset.hxx>
+#include <docsh.hxx>
+#include <swtypes.hxx>
+#include <swmodule.hxx>
+#include <view.hxx>
+#include <wrtsh.hxx>
+#include <numfmtlb.hxx>
+#include <utlui.hrc>
+#include "swabstdlg.hxx"
+#include "dialog.hrc"
+#include <unomid.h>
+#include <sfx2/viewfrm.hxx>
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+
+// STATIC DATA
+
+/**
+ * Description:
+ * nFormatType: Display the formats of this Type
+ * nDefFmt: Select this format and possibly insert it
+ */
+
+NumFormatListBox::NumFormatListBox(Window* pWin, WinBits nStyle) :
+ ListBox ( pWin, nStyle ),
+ nCurrFormatType (-1),
+ nStdEntry (0),
+ bOneArea (false),
+ nDefFormat (0),
+ pVw (0),
+ pOwnFormatter (0),
+ bShowLanguageControl(false),
+ bUseAutomaticLanguage(true)
+{
+ Init(NUMBERFORMAT_NUMBER, true);
+}
+
+extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeNumFormatListBox(Window *pParent, VclBuilder::stringmap &rMap)
+{
+ WinBits nBits = WB_LEFT|WB_VCENTER|WB_3DLOOK;
+
+ bool bDropdown = VclBuilder::extractDropdown(rMap);
+
+ if (bDropdown)
+ nBits |= WB_DROPDOWN;
+ else
+ nBits |= WB_BORDER;
+
+ NumFormatListBox* pListBox = new NumFormatListBox(pParent, nBits|WB_SIMPLEMODE);
+
+ if (bDropdown)
+ pListBox->EnableAutoSize(true);
+
+ return pListBox;
+}
+
+void NumFormatListBox::Init(short nFormatType, bool bUsrFmts)
+{
+ SwView *pView = GetView();
+
+ if (pView)
+ eCurLanguage = pView->GetWrtShell().GetCurLang();
+ else
+ eCurLanguage = SvtSysLocale().GetLanguageTag().getLanguageType();
+
+ if (bUsrFmts == false)
+ {
+ pOwnFormatter = new SvNumberFormatter(comphelper::getProcessComponentContext(), eCurLanguage);
+ }
+
+ SetFormatType(nFormatType);
+ SetDefFormat(nDefFormat);
+
+ SetSelectHdl(LINK(this, NumFormatListBox, SelectHdl));
+}
+
+NumFormatListBox::~NumFormatListBox()
+{
+ delete pOwnFormatter;
+}
+
+SwView* NumFormatListBox::GetView()
+{
+ if( pVw )
+ return pVw;
+ return ::GetActiveView();
+}
+
+void NumFormatListBox::SetFormatType(const short nFormatType)
+{
+ if (nCurrFormatType == -1 ||
+ (nCurrFormatType & nFormatType) == 0) // there are mixed formats, like for example DateTime
+ {
+ SvNumberFormatter* pFormatter;
+
+ if( pOwnFormatter )
+ pFormatter = pOwnFormatter;
+ else
+ {
+ SwView *pView = GetView();
+ OSL_ENSURE(pView, "no view found");
+ if(!pView)
+ return;
+ SwWrtShell &rSh = pView->GetWrtShell();
+ pFormatter = rSh.GetNumberFormatter();
+ }
+
+ Clear(); // Remove all entries from the Listbox
+
+ NfIndexTableOffset eOffsetStart = NF_NUMBER_START;
+ NfIndexTableOffset eOffsetEnd = NF_NUMBER_START;
+
+ switch( nFormatType )
+ {
+ case NUMBERFORMAT_NUMBER:
+ eOffsetStart=NF_NUMBER_START;
+ eOffsetEnd=NF_NUMBER_END;
+ break;
+
+ case NUMBERFORMAT_PERCENT:
+ eOffsetStart=NF_PERCENT_START;
+ eOffsetEnd=NF_PERCENT_END;
+ break;
+
+ case NUMBERFORMAT_CURRENCY:
+ eOffsetStart=NF_CURRENCY_START;
+ eOffsetEnd=NF_CURRENCY_END;
+ break;
+
+ case NUMBERFORMAT_DATETIME:
+ eOffsetStart=NF_DATE_START;
+ eOffsetEnd=NF_TIME_END;
+ break;
+
+ case NUMBERFORMAT_DATE:
+ eOffsetStart=NF_DATE_START;
+ eOffsetEnd=NF_DATE_END;
+ break;
+
+ case NUMBERFORMAT_TIME:
+ eOffsetStart=NF_TIME_START;
+ eOffsetEnd=NF_TIME_END;
+ break;
+
+ case NUMBERFORMAT_SCIENTIFIC:
+ eOffsetStart=NF_SCIENTIFIC_START;
+ eOffsetEnd=NF_SCIENTIFIC_END;
+ break;
+
+ case NUMBERFORMAT_FRACTION:
+ eOffsetStart=NF_FRACTION_START;
+ eOffsetEnd=NF_FRACTION_END;
+ break;
+
+ case NUMBERFORMAT_LOGICAL:
+ eOffsetStart=NF_BOOLEAN;
+ eOffsetEnd=NF_BOOLEAN;
+ break;
+
+ case NUMBERFORMAT_TEXT:
+ eOffsetStart=NF_TEXT;
+ eOffsetEnd=NF_TEXT;
+ break;
+
+ case NUMBERFORMAT_ALL:
+ eOffsetStart=NF_NUMERIC_START;
+ eOffsetEnd = NfIndexTableOffset( NF_INDEX_TABLE_ENTRIES - 1 );
+ break;
+
+ default:
+ OSL_FAIL("what a format?");
+ break;
+ }
+
+ const SvNumberformat* pFmt;
+ sal_uInt16 nPos, i = 0;
+ sal_uLong nFormat;
+ Color* pCol;
+ double fVal = GetDefValue( nFormatType );
+ OUString sValue;
+
+ sal_uLong nSysNumFmt = pFormatter->GetFormatIndex(
+ NF_NUMBER_SYSTEM, eCurLanguage );
+ sal_uLong nSysShortDateFmt = pFormatter->GetFormatIndex(
+ NF_DATE_SYSTEM_SHORT, eCurLanguage );
+ sal_uLong nSysLongDateFmt = pFormatter->GetFormatIndex(
+ NF_DATE_SYSTEM_LONG, eCurLanguage );
+
+ for( long nIndex = eOffsetStart; nIndex <= eOffsetEnd; ++nIndex )
+ {
+ nFormat = pFormatter->GetFormatIndex(
+ (NfIndexTableOffset)nIndex, eCurLanguage );
+ pFmt = pFormatter->GetEntry( nFormat );
+
+ if( nFormat == pFormatter->GetFormatIndex( NF_NUMBER_STANDARD,
+ eCurLanguage )
+ || ((SvNumberformat*)pFmt)->GetOutputString( fVal, sValue, &pCol )
+ || nFormatType == NUMBERFORMAT_UNDEFINED )
+ {
+ sValue = pFmt->GetFormatstring();
+ }
+ else if( nFormatType == NUMBERFORMAT_TEXT )
+ {
+ pFormatter->GetOutputString( "\"ABC\"", nFormat, sValue, &pCol);
+ }
+
+ if (nFormat != nSysNumFmt &&
+ nFormat != nSysShortDateFmt &&
+ nFormat != nSysLongDateFmt)
+ {
+ nPos = InsertEntry( sValue );
+ SetEntryData( nPos, (void*)nFormat );
+
+ if( nFormat == pFormatter->GetStandardFormat(
+ nFormatType, eCurLanguage ) )
+ nStdEntry = i;
+ ++i;
+ }
+ }
+
+ if (!pOwnFormatter)
+ {
+ nPos = InsertEntry(SW_RESSTR( STR_DEFINE_NUMBERFORMAT ));
+ SetEntryData( nPos, NULL );
+ }
+
+ SelectEntryPos( nStdEntry );
+
+ nCurrFormatType = nFormatType;
+ }
+}
+
+void NumFormatListBox::SetDefFormat(const sal_uLong nDefFmt)
+{
+ if (nDefFmt == ULONG_MAX)
+ {
+ nDefFormat = nDefFmt;
+ return;
+ }
+
+ SvNumberFormatter* pFormatter;
+ if (pOwnFormatter)
+ pFormatter = pOwnFormatter;
+ else
+ {
+ SwView *pView = GetView();
+ OSL_ENSURE(pView, "no view found");
+ if(!pView)
+ return;
+ SwWrtShell &rSh = pView->GetWrtShell();
+ pFormatter = rSh.GetNumberFormatter();
+ }
+
+ short nType = pFormatter->GetType(nDefFmt);
+
+ SetFormatType(nType);
+
+ sal_uLong nFormat = pFormatter->GetFormatForLanguageIfBuiltIn(nDefFmt, eCurLanguage);
+
+ for (sal_uInt16 i = 0; i < GetEntryCount(); i++)
+ {
+ if (nFormat == (sal_uLong)GetEntryData(i))
+ {
+ SelectEntryPos(i);
+ nStdEntry = i;
+ nDefFormat = GetFormat();
+ return;
+ }
+ }
+
+ // No entry found:
+ double fValue = GetDefValue(nType);
+ OUString sValue;
+ Color* pCol = 0;
+
+ if (nType == NUMBERFORMAT_TEXT)
+ {
+ pFormatter->GetOutputString("\"ABC\"", nDefFmt, sValue, &pCol);
+ }
+ else
+ {
+ pFormatter->GetOutputString(fValue, nDefFmt, sValue, &pCol);
+ }
+
+ sal_uInt16 nPos = 0;
+ while ((sal_uLong)GetEntryData(nPos) == ULONG_MAX)
+ nPos++;
+
+ sal_uLong nSysNumFmt = pFormatter->GetFormatIndex( NF_NUMBER_SYSTEM, eCurLanguage);
+ sal_uLong nSysShortDateFmt = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_SHORT, eCurLanguage);
+ sal_uLong nSysLongDateFmt = pFormatter->GetFormatIndex( NF_DATE_SYSTEM_LONG, eCurLanguage);
+ bool bSysLang = false;
+ if( eCurLanguage == GetAppLanguage() )
+ bSysLang = true;
+ sal_uLong nNumFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysNumFmt, LANGUAGE_SYSTEM );
+ sal_uLong nShortDateFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysShortDateFmt, LANGUAGE_SYSTEM );
+ sal_uLong nLongDateFormatForLanguage = pFormatter->GetFormatForLanguageIfBuiltIn(nSysLongDateFmt, LANGUAGE_SYSTEM );
+
+ if (
+ nDefFmt == nSysNumFmt ||
+ nDefFmt == nSysShortDateFmt ||
+ nDefFmt == nSysLongDateFmt ||
+ (
+ bSysLang &&
+ (
+ nDefFmt == nNumFormatForLanguage ||
+ nDefFmt == nShortDateFormatForLanguage ||
+ nDefFmt == nLongDateFormatForLanguage
+ )
+ )
+ )
+ {
+ sValue += SW_RES(RID_STR_SYSTEM);
+ }
+
+ nPos = InsertEntry(sValue, nPos); // Insert as first numeric entry
+ SetEntryData(nPos, (void*)nDefFmt);
+ SelectEntryPos(nPos);
+ nDefFormat = GetFormat();
+}
+
+sal_uLong NumFormatListBox::GetFormat() const
+{
+ sal_Int32 nPos = GetSelectEntryPos();
+
+ return (sal_uLong)GetEntryData(nPos);
+}
+
+IMPL_LINK( NumFormatListBox, SelectHdl, ListBox *, pBox )
+{
+ sal_uInt16 nPos = pBox->GetSelectEntryPos();
+ OUString sDefine(SW_RES( STR_DEFINE_NUMBERFORMAT ));
+ SwView *pView = GetView();
+
+ if( pView && nPos == pBox->GetEntryCount() - 1 &&
+ pBox->GetEntry( nPos ) == sDefine )
+ {
+ SwWrtShell &rSh = pView->GetWrtShell();
+ SvNumberFormatter* pFormatter = rSh.GetNumberFormatter();
+
+ SfxItemSet aCoreSet( rSh.GetAttrPool(),
+ SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_VALUE,
+ SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO,
+ SID_ATTR_NUMBERFORMAT_ONE_AREA, SID_ATTR_NUMBERFORMAT_ONE_AREA,
+ SID_ATTR_NUMBERFORMAT_NOLANGUAGE, SID_ATTR_NUMBERFORMAT_NOLANGUAGE,
+ SID_ATTR_NUMBERFORMAT_ADD_AUTO, SID_ATTR_NUMBERFORMAT_ADD_AUTO,
+ 0 );
+
+ double fValue = GetDefValue( nCurrFormatType);
+
+ sal_uLong nFormat = pFormatter->GetStandardFormat( nCurrFormatType, eCurLanguage);
+ aCoreSet.Put( SfxUInt32Item( SID_ATTR_NUMBERFORMAT_VALUE, nFormat ));
+
+ aCoreSet.Put( SvxNumberInfoItem( pFormatter, fValue,
+ SID_ATTR_NUMBERFORMAT_INFO ) );
+
+ if( (NUMBERFORMAT_DATE | NUMBERFORMAT_TIME) & nCurrFormatType )
+ aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_ONE_AREA, bOneArea));
+
+ aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_NOLANGUAGE, !bShowLanguageControl));
+ aCoreSet.Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_ADD_AUTO, bUseAutomaticLanguage));
+
+ SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
+ OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
+
+ SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( this, aCoreSet,
+ GetView()->GetViewFrame()->GetFrame().GetFrameInterface(),
+ RC_DLG_SWNUMFMTDLG );
+ OSL_ENSURE(pDlg, "Dialogdiet fail!");
+
+ if (RET_OK == pDlg->Execute())
+ {
+ const SfxPoolItem* pItem = pView->GetDocShell()->
+ GetItem( SID_ATTR_NUMBERFORMAT_INFO );
+
+ if( pItem && 0 != ((SvxNumberInfoItem*)pItem)->GetDelCount() )
+ {
+ const sal_uInt32* pDelArr = ((SvxNumberInfoItem*)pItem)->GetDelArray();
+
+ for ( sal_uInt16 i = 0; i < ((SvxNumberInfoItem*)pItem)->GetDelCount(); i++ )
+ pFormatter->DeleteEntry( pDelArr[i] );
+ }
+
+ const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
+ if( SFX_ITEM_SET == pOutSet->GetItemState(
+ SID_ATTR_NUMBERFORMAT_VALUE, false, &pItem ))
+ {
+ sal_uInt32 nNumberFormat = ((SfxUInt32Item*)pItem)->GetValue();
+ // oj #105473# change order of calls
+ const SvNumberformat* pFmt = pFormatter->GetEntry(nNumberFormat);
+ if( pFmt )
+ eCurLanguage = pFmt->GetLanguage();
+ // SetDefFormat uses eCurLanguage to look for if this format already in the list
+ SetDefFormat(nNumberFormat);
+ }
+ if( bShowLanguageControl && SFX_ITEM_SET == pOutSet->GetItemState(
+ SID_ATTR_NUMBERFORMAT_ADD_AUTO, false, &pItem ))
+ {
+ bUseAutomaticLanguage = ((const SfxBoolItem*)pItem)->GetValue();
+ }
+ }
+ else
+ SetDefFormat(nFormat);
+
+ delete pDlg;
+ }
+ return 0;
+}
+
+double NumFormatListBox::GetDefValue(const short nFormatType) const
+{
+ double fDefValue = 0.0;
+
+ switch (nFormatType)
+ {
+ case NUMBERFORMAT_DATE:
+ case NUMBERFORMAT_DATE|NUMBERFORMAT_TIME:
+ fDefValue = SVX_NUMVAL_DATE;
+ break;
+
+ case NUMBERFORMAT_TIME:
+ fDefValue = SVX_NUMVAL_TIME;
+ break;
+
+ case NUMBERFORMAT_TEXT:
+ case NUMBERFORMAT_UNDEFINED:
+ fDefValue = 0;
+ break;
+
+ case NUMBERFORMAT_CURRENCY:
+ fDefValue = SVX_NUMVAL_CURRENCY;
+ break;
+
+ case NUMBERFORMAT_PERCENT:
+ fDefValue = SVX_NUMVAL_PERCENT;
+ break;
+
+ case NUMBERFORMAT_LOGICAL:
+ fDefValue = SVX_NUMVAL_BOOLEAN;
+ break;
+
+ default:
+ fDefValue = SVX_NUMVAL_STANDARD;
+ break;
+ }
+
+ return fDefValue;
+}
+
+void NumFormatListBox::Clear()
+{
+ ListBox::Clear();
+ nCurrFormatType = -1;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */