| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sw.hxx" |
| |
| |
| #include <hintids.hxx> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <comphelper/processfactory.hxx> |
| #include <editeng/unolingu.hxx> |
| #include <unotools/localedatawrapper.hxx> |
| #include <i18npool/lang.h> |
| #ifndef _ZFORMAT_HXX //autogen |
| #define _ZFORLIST_DECLARE_TABLE |
| #include <svl/zformat.hxx> |
| #endif |
| #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 ----------------------------------------------------------- |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| nFormatType: Formate dieses Typs anzeigen |
| nDefFmt: Dieses Format selektieren und ggf vorher |
| einfuegen |
| --------------------------------------------------------------------*/ |
| |
| NumFormatListBox::NumFormatListBox( Window* pWin, const ResId& rResId, |
| short nFormatType, sal_uLong nDefFmt, |
| sal_Bool bUsrFmts ) : |
| ListBox ( pWin, rResId ), |
| nCurrFormatType (-1), |
| nStdEntry (0), |
| bOneArea (sal_False), |
| nDefFormat (nDefFmt), |
| pVw (0), |
| pOwnFormatter (0), |
| bShowLanguageControl(sal_False), |
| bUseAutomaticLanguage(sal_True) |
| { |
| Init(nFormatType, bUsrFmts); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| NumFormatListBox::NumFormatListBox( Window* pWin, SwView* pView, |
| const ResId& rResId, short nFormatType, |
| sal_uLong nDefFmt, sal_Bool bUsrFmts ) : |
| ListBox ( pWin, rResId ), |
| nCurrFormatType (-1), |
| nStdEntry (0), |
| bOneArea (sal_False), |
| nDefFormat (nDefFmt), |
| pVw (pView), |
| pOwnFormatter (0), |
| bShowLanguageControl(sal_False), |
| bUseAutomaticLanguage(sal_True) |
| { |
| Init(nFormatType, bUsrFmts); |
| } |
| |
| /* -----------------15.06.98 11:29------------------- |
| * |
| * --------------------------------------------------*/ |
| |
| void NumFormatListBox::Init(short nFormatType, sal_Bool bUsrFmts) |
| { |
| SwView *pView = GetView(); |
| |
| if (pView) |
| eCurLanguage = pView->GetWrtShell().GetCurLang(); |
| else |
| eCurLanguage = SvxLocaleToLanguage( SvtSysLocale().GetLocaleData().getLocale() ); |
| |
| if (bUsrFmts == sal_False) |
| { |
| Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); |
| pOwnFormatter = new SvNumberFormatter(xMSF, eCurLanguage); |
| } |
| |
| SetFormatType(nFormatType); |
| SetDefFormat(nDefFormat); |
| |
| SetSelectHdl(LINK(this, NumFormatListBox, SelectHdl)); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| NumFormatListBox::~NumFormatListBox() |
| { |
| if (pOwnFormatter) |
| delete pOwnFormatter; |
| } |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| SwView* NumFormatListBox::GetView() |
| { |
| if( pVw ) |
| return pVw; |
| return ::GetActiveView(); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| void NumFormatListBox::SetFormatType(const short nFormatType) |
| { |
| if (nCurrFormatType == -1 || |
| (nCurrFormatType & nFormatType) == 0) // Es gibt Mischformate, wie z.B. DateTime |
| { |
| SvNumberFormatter* pFormatter; |
| |
| if( pOwnFormatter ) |
| pFormatter = pOwnFormatter; |
| else |
| { |
| SwView *pView = GetView(); |
| DBG_ASSERT(pView, "no view found"); |
| if(!pView) |
| return; |
| SwWrtShell &rSh = pView->GetWrtShell(); |
| pFormatter = rSh.GetNumberFormatter(); |
| } |
| |
| Clear(); // Alle Eintraege in der Listbox entfernen |
| |
| 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: |
| DBG_ERROR("what a format?"); |
| break; |
| } |
| |
| const SvNumberformat* pFmt; |
| sal_uInt16 nPos, i = 0; |
| sal_uLong nFormat; |
| Color* pCol; |
| double fVal = GetDefValue( nFormatType ); |
| String 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 ) |
| { |
| String sTxt(C2S("\"ABC\"")); |
| pFormatter->GetOutputString( sTxt, 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; |
| } |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| void NumFormatListBox::SetDefFormat(const sal_uLong nDefFmt) |
| { |
| if (nDefFmt == ULONG_MAX) |
| { |
| nDefFormat = nDefFmt; |
| return; |
| } |
| |
| SvNumberFormatter* pFormatter; |
| if (pOwnFormatter) |
| pFormatter = pOwnFormatter; |
| else |
| { |
| SwView *pView = GetView(); |
| DBG_ASSERT(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; |
| } |
| } |
| |
| // Kein Eintrag gefunden: |
| double fValue = GetDefValue(nType); |
| String sValue; |
| Color* pCol = 0; |
| |
| if (nType == NUMBERFORMAT_TEXT) |
| { |
| String sTxt(C2S("\"ABC\"")); |
| pFormatter->GetOutputString(sTxt, 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); |
| sal_Bool bSysLang = sal_False; |
| if( eCurLanguage == GetAppLanguage() ) |
| bSysLang = sal_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 += String(SW_RES(RID_STR_SYSTEM)); |
| } |
| |
| nPos = InsertEntry(sValue, nPos); // Als ersten numerischen Eintrag einfuegen |
| SetEntryData(nPos, (void*)nDefFmt); |
| SelectEntryPos(nPos); |
| nDefFormat = GetFormat(); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| sal_uLong NumFormatListBox::GetFormat() const |
| { |
| sal_uInt16 nPos = GetSelectEntryPos(); |
| |
| return (sal_uLong)GetEntryData(nPos); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| IMPL_LINK( NumFormatListBox, SelectHdl, ListBox *, pBox ) |
| { |
| sal_uInt16 nPos = pBox->GetSelectEntryPos(); |
| String 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(); |
| DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); |
| |
| SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( this, aCoreSet, |
| GetView()->GetViewFrame()->GetFrame().GetFrameInterface(), |
| RC_DLG_SWNUMFMTDLG ); |
| DBG_ASSERT(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, sal_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, sal_False, &pItem )) |
| { |
| bUseAutomaticLanguage = ((const SfxBoolItem*)pItem)->GetValue(); |
| } |
| } |
| else |
| SetDefFormat(nFormat); |
| |
| delete pDlg; |
| } |
| return 0; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| 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; |
| /* { |
| String sValue("31.8.1997 16:57:34"); |
| sal_uLong nFormat = pFormatter->GetStandardFormat(nFormatType, LANGUAGE_GERMAN); |
| pFormatter->IsNumberFormat( sValue, nFormat, fDefValue ); |
| } |
| 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; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: |
| --------------------------------------------------------------------*/ |
| |
| void NumFormatListBox::Clear() |
| { |
| ListBox::Clear(); |
| nCurrFormatType = -1; |
| } |
| |