/************************************************************** * * 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. * *************************************************************/ #include "precompiled_svx.hxx" #ifndef _NBDTMG_HXX #include #endif #ifndef _SVX_SVXIDS_HRC #include #endif #ifndef _SV_SVAPP_HXX #include #endif #ifndef _SFXITEMSET_HXX #include #endif #ifndef _SFXREQUEST_HXX #include #endif #ifndef _SFXSTRITEM_HXX #include #endif #ifndef _UNO_LINGU_HXX #include #endif #ifndef _CTRLTOOL_HXX #include #endif #ifndef _SFX_OBJSH_HXX #include #endif #ifndef _SVX_FLSTITEM_HXX #include #endif #ifndef _SFXITEMPOOL_HXX #include #endif #ifndef _SV_OUTDEV_HXX #include #endif #ifndef _GALLERY_HXX_ #include #endif #ifndef _SVX_BRSHITEM_HXX #include #endif #include #ifndef _SVX_DIALOGS_HRC #include #endif #ifndef _SV_GRAPH_HXX #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::beans; using namespace com::sun::star::lang; using namespace com::sun::star::text; using namespace com::sun::star::container; using namespace com::sun::star::style; using rtl::OUString; namespace svx { namespace sidebar { #define NUM_TYPE_MEMBER 4 #define NUM_VALUSET_COUNT 16 #define MAX_VALUESET_GRAPHIC 30 typedef NumSettings_Impl* NumSettings_ImplPtr; SV_DECL_PTRARR_DEL(NumSettingsArr_Impl,NumSettings_ImplPtr,8,4) SV_IMPL_PTRARR( NumSettingsArr_Impl, NumSettings_ImplPtr ) typedef NumberSettings_Impl* NumberSettings_ImplPtr; SV_DECL_PTRARR_DEL(NumberSettingsArr_Impl,NumberSettings_ImplPtr,8,4) SV_IMPL_PTRARR( NumberSettingsArr_Impl, NumberSettings_ImplPtr ) Font& lcl_GetDefaultBulletFont() { static sal_Bool bInit = 0; static Font aDefBulletFont( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ), String(), Size( 0, 14 ) ); if(!bInit) { aDefBulletFont.SetCharSet( RTL_TEXTENCODING_SYMBOL ); aDefBulletFont.SetFamily( FAMILY_DONTKNOW ); aDefBulletFont.SetPitch( PITCH_DONTKNOW ); aDefBulletFont.SetWeight( WEIGHT_DONTKNOW ); aDefBulletFont.SetTransparent( sal_True ); bInit = sal_True; } return aDefBulletFont; } static const sal_Unicode aDefaultBulletTypes[] = { 0x2022, 0x25cf, 0xe00c, 0xe00a, 0x2794, 0x27a2, 0x2717, 0x2714 }; static const sal_Unicode aDefaultRTLBulletTypes[] = { 0x2022, 0x25cf, 0xe00c, 0xe00a, 0x25c4, 0x272b, 0x2717, 0x2714 }; static const sal_Char sNumberingType[] = "NumberingType"; static const sal_Char sValue[] = "Value"; static const sal_Char sParentNumbering[] = "ParentNumbering"; static const sal_Char sPrefix[] = "Prefix"; static const sal_Char sSuffix[] = "Suffix"; static const sal_Char sBulletChar[] = "BulletChar"; static const sal_Char sBulletFontName[] = "BulletFontName"; NumSettings_ImplPtr lcl_CreateNumberingSettingsPtr(const Sequence& rLevelProps) { const PropertyValue* pValues = rLevelProps.getConstArray(); NumSettings_ImplPtr pNew = new NumSettings_Impl; for(sal_Int32 j = 0; j < rLevelProps.getLength(); j++) { if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sNumberingType))) pValues[j].Value >>= pNew->nNumberType; else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sPrefix))) pValues[j].Value >>= pNew->sPrefix; else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sSuffix))) pValues[j].Value >>= pNew->sSuffix; else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sParentNumbering))) pValues[j].Value >>= pNew->nParentNumbering; else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sBulletChar))) pValues[j].Value >>= pNew->sBulletChar; else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sBulletFontName))) pValues[j].Value >>= pNew->sBulletFont; } const sal_Unicode cLocalPrefix = pNew->sPrefix.getLength() ? pNew->sPrefix.getStr()[0] : 0; const sal_Unicode cLocalSuffix = pNew->sSuffix.getLength() ? pNew->sSuffix.getStr()[0] : 0; String aEmptyStr; if( cLocalPrefix == ' ') pNew->sPrefix=aEmptyStr; if( cLocalSuffix == ' ') pNew->sSuffix=aEmptyStr; return pNew; } sal_uInt16 NBOTypeMgrBase:: IsSingleLevel(sal_uInt16 nCurLevel) { sal_uInt16 nLv = (sal_uInt16)0xFFFF; sal_uInt16 nCount = 0; sal_uInt16 nMask = 1; for( sal_uInt16 i = 0; i < SVX_MAX_NUM; i++ ) { if(nCurLevel & nMask) { nCount++; nLv=i; } nMask <<= 1 ; } if ( nCount == 1) return nLv; else return (sal_uInt16)0xFFFF; } void NBOTypeMgrBase::StoreBulCharFmtName_impl() { if ( pSet ) { SfxAllItemSet aSet(*pSet); SFX_ITEMSET_ARG(&aSet,pBulletCharFmt,SfxStringItem,SID_BULLET_CHAR_FMT,sal_False); if ( pBulletCharFmt ) { aNumCharFmtName = String(pBulletCharFmt->GetValue()); } } } String NBOTypeMgrBase::GetBulCharFmtName() { return aNumCharFmtName; } void NBOTypeMgrBase::ImplLoad(String filename) { bIsLoading = true; SfxMapUnit eOldCoreUnit=eCoreUnit; eCoreUnit = SFX_MAPUNIT_100TH_MM; INetURLObject aFile( SvtPathOptions().GetPalettePath() ); aFile.Append( filename); SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aFile.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); if( pIStm ) { sal_uInt32 nVersion; sal_Int32 nNumIndex; *pIStm >> nVersion; if (nVersion==DEFAULT_NUMBERING_CACHE_FORMAT_VERSION) // first version { *pIStm >> nNumIndex; sal_uInt16 mLevel = 0x1; while (nNumIndex>=0 && nNumIndex> nNumIndex; } delete pIStm; } } eCoreUnit = eOldCoreUnit; bIsLoading = false; } void NBOTypeMgrBase::ImplStore(String filename) { if (bIsLoading) return; SfxMapUnit eOldCoreUnit=eCoreUnit; eCoreUnit = SFX_MAPUNIT_100TH_MM; INetURLObject aFile( SvtPathOptions().GetPalettePath() ); aFile.Append( filename); SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aFile.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE ); if( pOStm ) { sal_uInt32 nVersion; sal_Int32 nNumIndex; nVersion = DEFAULT_NUMBERING_CACHE_FORMAT_VERSION; *pOStm << nVersion; for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ ) { if (IsCustomized(nItem)) { SvxNumRule aDefNumRule( NUM_BULLET_REL_SIZE|NUM_CONTINUOUS|NUM_BULLET_COLOR|NUM_CHAR_TEXT_DISTANCE|NUM_SYMBOL_ALIGNMENT,10, sal_False , SVX_RULETYPE_NUMBERING,SvxNumberFormat::LABEL_ALIGNMENT); sal_uInt16 mLevel = 0x1; *pOStm << nItem; ApplyNumRule(aDefNumRule,nItem,mLevel,false,true); aDefNumRule.Store(*pOStm); } } nNumIndex = -1; *pOStm << nNumIndex; // write end flag delete pOStm; } eCoreUnit = eOldCoreUnit; } void NBOTypeMgrBase::StoreMapUnit_impl() { if ( pSet ) { const SfxPoolItem* pItem; SfxItemState eState = pSet->GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem); if(eState == SFX_ITEM_SET) { eCoreUnit = pSet->GetPool()->GetMetric(pSet->GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE)); } else { // sd use different sid for numbering rule eState = pSet->GetItemState(EE_PARA_NUMBULLET, sal_False, &pItem); if(eState == SFX_ITEM_SET) { eCoreUnit = pSet->GetPool()->GetMetric(pSet->GetPool()->GetWhich(EE_PARA_NUMBULLET)); } } } } SfxMapUnit NBOTypeMgrBase::GetMapUnit() { return eCoreUnit; } /*************************************************************************************************** **********************Character Bullet Type lib********************************************************** ****************************************************************************************************/ BulletsTypeMgr* BulletsTypeMgr::_instance = 0; BulletsSettings_Impl* BulletsTypeMgr::pActualBullets[] ={0,0,0,0,0,0,0,0}; sal_Unicode BulletsTypeMgr::aDynamicBulletTypes[]={' ',' ',' ',' ',' ',' ',' ',' '}; sal_Unicode BulletsTypeMgr::aDynamicRTLBulletTypes[]={' ',' ',' ',' ',' ',' ',' ',' '}; BulletsTypeMgr::BulletsTypeMgr(const NBOType aType): NBOTypeMgrBase(aType) { Init(); } BulletsTypeMgr::BulletsTypeMgr(const NBOType aType,const SfxItemSet* pArg): NBOTypeMgrBase(aType,pArg) { Init(); } BulletsTypeMgr::BulletsTypeMgr(const BulletsTypeMgr& aTypeMgr): NBOTypeMgrBase(aTypeMgr) { for (sal_uInt16 i=0;ibIsCustomized = aTypeMgr.pActualBullets[i]->bIsCustomized; pActualBullets[i]->cBulletChar = aTypeMgr.pActualBullets[i]->cBulletChar; pActualBullets[i]->aFont = aTypeMgr.pActualBullets[i]->aFont; pActualBullets[i]->sDescription = aTypeMgr. pActualBullets[i]->sDescription; pActualBullets[i]->eType = aTypeMgr. pActualBullets[i]->eType; } } void BulletsTypeMgr::Init() { Font& rActBulletFont = lcl_GetDefaultBulletFont(); String sName = rActBulletFont.GetName(); if( Application::GetSettings().GetLayoutRTL() ) { for (sal_uInt16 i=0;icBulletChar = aDefaultRTLBulletTypes[i]; pActualBullets[i]->aFont = rActBulletFont; if (i==4 || i==5) pActualBullets[i]->sDescription = SVX_RESSTR( RID_SVXSTR_BULLET_RTL_DESCRIPTION_4 - 4 + i ); else pActualBullets[i]->sDescription = SVX_RESSTR( RID_SVXSTR_BULLET_DESCRIPTION_0 + i ); } }else { for (sal_uInt16 i=0;icBulletChar = aDefaultBulletTypes[i]; pActualBullets[i]->aFont =rActBulletFont; pActualBullets[i]->sDescription = SVX_RESSTR( RID_SVXSTR_BULLET_DESCRIPTION_0 + i ); } } } sal_uInt16 BulletsTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex) { if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0) return (sal_uInt16)0xFFFF; //if ( !lcl_IsNumFmtSet(pNR, mLevel) ) return (sal_uInt16)0xFFFF; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return (sal_uInt16)0xFFFF; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); sal_Unicode cChar = aFmt.GetBulletChar(); //sal_uInt16 nLength = 0; /*if( Application::GetSettings().GetLayoutRTL() ) { nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode); for(sal_uInt16 i = 0; i < nLength; i++) { if ( cChar == aDynamicRTLBulletTypes[i] || (cChar == 9830 && 57356 == aDynamicRTLBulletTypes[i]) || (cChar == 9632 && 57354 == aDynamicRTLBulletTypes[i]) ) { return i+1; } } } else { nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode); for(sal_uInt16 i = 0; i < nLength; i++) { if ( cChar == aDynamicBulletTypes[i] || (cChar == 9830 && 57356 == aDynamicBulletTypes[i]) || (cChar == 9632 && 57354 == aDynamicBulletTypes[i]) ) { return i+1; } } }*/ //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); for(sal_uInt16 i = nFromIndex; i < DEFAULT_BULLET_TYPES; i++) { if ( (cChar == pActualBullets[i]->cBulletChar|| (cChar == 9830 && 57356 == pActualBullets[i]->cBulletChar) || (cChar == 9632 && 57354 == pActualBullets[i]->cBulletChar)))// && pFont && (pFont->GetName().CompareTo(pActualBullets[i]->aFont.GetName())==COMPARE_EQUAL)) { return i+1; } } return (sal_uInt16)0xFFFF; } sal_Bool BulletsTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel) { if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0) return sal_False; if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF ) return sal_False; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return sal_False; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); sal_Unicode cChar = aFmt.GetBulletChar(); const Font* pFont = aFmt.GetBulletFont(); //sal_uInt16 nLength = 0; /*if( Application::GetSettings().GetLayoutRTL() ) { nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode); if ( nIndex >= nLength ) return sal_False; aDynamicRTLBulletTypes[nIndex] = cChar; } else { nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode); if ( nIndex >= nLength ) return sal_False; aDynamicBulletTypes[nIndex] = cChar; }*/ //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); if ( nIndex >= DEFAULT_BULLET_TYPES ) return sal_False; pActualBullets[nIndex]->cBulletChar = cChar; if ( pFont ) pActualBullets[nIndex]->aFont = *pFont; pActualBullets[nIndex]->bIsCustomized = sal_True; String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); aStrFromRES.SearchAndReplace(aReplace,sNUM); pActualBullets[nIndex]->sDescription = aStrFromRES; return sal_True; } sal_Bool BulletsTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool /* isDefault */,sal_Bool isResetSize) { //if ( mLevel == (sal_uInt16)0xFFFF ) // return sal_False; sal_Unicode cChar; //sal_uInt16 nLength = 0; /*if( Application::GetSettings().GetLayoutRTL() ) { nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode); if ( nIndex >= nLength ) return sal_False; cChar = aDynamicRTLBulletTypes[nIndex]; }else { nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode); if ( nIndex >= nLength ) return sal_False; cChar = aDynamicBulletTypes[nIndex]; }*/ //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); if ( nIndex >= DEFAULT_BULLET_TYPES ) return sal_False; cChar = pActualBullets[nIndex]->cBulletChar; //Font& rActBulletFont = lcl_GetDefaultBulletFont(); Font rActBulletFont = pActualBullets[nIndex]->aFont; sal_uInt16 nMask = 1; String sBulletCharFmtName = GetBulCharFmtName(); for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++) { if(mLevel & nMask) { SvxNumberFormat aFmt(aNum.GetLevel(i)); aFmt.SetNumberingType( SVX_NUM_CHAR_SPECIAL ); aFmt.SetBulletFont(&rActBulletFont); aFmt.SetBulletChar(cChar ); aFmt.SetCharFmtName(sBulletCharFmtName); if (isResetSize) aFmt.SetBulletRelSize(45); aNum.SetLevel(i, aFmt); } nMask <<= 1; } return sal_True; } String BulletsTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool /* isDefault */) { String sRet; //sal_uInt16 nLength = 0; //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); if ( nIndex >= DEFAULT_BULLET_TYPES ) return sRet; else sRet = pActualBullets[nIndex]->sDescription; return sRet; } sal_Bool BulletsTypeMgr::IsCustomized(sal_uInt16 nIndex) { sal_Bool bRet = sal_False; //sal_uInt16 nLength = 0; //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); if ( nIndex >= DEFAULT_BULLET_TYPES ) bRet = sal_False; else bRet = pActualBullets[nIndex]->bIsCustomized; return bRet; } sal_Unicode BulletsTypeMgr::GetBulChar(sal_uInt16 nIndex) { sal_Unicode cChar; //sal_uInt16 nLength = 0; //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); if ( nIndex >= DEFAULT_BULLET_TYPES ) cChar = ' '; else cChar = pActualBullets[nIndex]->cBulletChar; /*if( Application::GetSettings().GetLayoutRTL() ) { nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode); if ( nIndex >= nLength ) cChar = ' '; else cChar = aDynamicRTLBulletTypes[nIndex]; }else { nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode); if ( nIndex >= nLength ) cChar = ' '; else cChar = aDynamicBulletTypes[nIndex]; }*/ return cChar; } Font BulletsTypeMgr::GetBulCharFont(sal_uInt16 nIndex) { Font aRet; if ( nIndex >= DEFAULT_BULLET_TYPES ) aRet = lcl_GetDefaultBulletFont(); else aRet = pActualBullets[nIndex]->aFont; return aRet; } /*************************************************************************************************** **********************Graphic Bullet Type lib*********************************************************** ****************************************************************************************************/ GraphicBulletsTypeMgr* GraphicBulletsTypeMgr::_instance = 0; GraphicBulletsTypeMgr::GraphicBulletsTypeMgr(const NBOType aType): NBOTypeMgrBase(aType) { Init(); } GraphicBulletsTypeMgr::GraphicBulletsTypeMgr(const NBOType aType,const SfxItemSet* pArg): NBOTypeMgrBase(aType,pArg) { Init(); } GraphicBulletsTypeMgr::GraphicBulletsTypeMgr(const GraphicBulletsTypeMgr& aTypeMgr): NBOTypeMgrBase(aTypeMgr) { for (sal_uInt16 i=0;i< aTypeMgr.aGrfDataLst.Count();i++) { GrfBulDataRelation* pEntry = new GrfBulDataRelation(eNBType::GRAPHICBULLETS); GrfBulDataRelation* pSrcEntry = (GrfBulDataRelation*)(aTypeMgr.aGrfDataLst.GetObject(i)); if ( pEntry && pSrcEntry) { pEntry->bIsCustomized = pSrcEntry->bIsCustomized; pEntry->nTabIndex = pSrcEntry->nTabIndex; pEntry->nGallaryIndex = pSrcEntry->nGallaryIndex; pEntry->sGrfName = pSrcEntry->sGrfName; pEntry->sDescription = pSrcEntry->sDescription; aGrfDataLst.Insert( pEntry, LIST_APPEND ); } else delete pEntry; } } void GraphicBulletsTypeMgr::Init() { List aGrfNames; GalleryExplorer::FillObjList(GALLERY_THEME_BULLETS, aGrfNames); for(sal_uInt16 i = 0; i < aGrfNames.Count(); i++) { String* pGrfNm = (String*) aGrfNames.GetObject(i); INetURLObject aObj(*pGrfNm); if(aObj.GetProtocol() == INET_PROT_FILE) *pGrfNm = aObj.PathToFileName(); GrfBulDataRelation* pEntry = new GrfBulDataRelation(eNBType::GRAPHICBULLETS); pEntry->nTabIndex = i+1; pEntry->nGallaryIndex = i; pEntry->sGrfName = *pGrfNm; if( i < MAX_VALUESET_GRAPHIC ) { pEntry->sDescription = SVX_RESSTR( RID_SVXSTR_GRAPHICS_DESCRIPTIONS + i ); }else { pEntry->sDescription = *pGrfNm; } aGrfDataLst.Insert( pEntry, LIST_APPEND ); } } sal_uInt16 GraphicBulletsTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 /* nFromIndex */) { if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0) return (sal_uInt16)0xFFFF; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return (sal_uInt16)0xFFFF; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); const SvxBrushItem* pBrsh = aFmt.GetBrush(); const Graphic* pGrf = 0; if ( pBrsh ) pGrf = pBrsh->GetGraphic(); if ( pGrf ) { Graphic aGraphic; for(sal_uInt16 i=0;isGrfName.CompareTo(*pGrfName)==COMPARE_EQUAL ) bExist = GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, pEntry->nGallaryIndex,&aGraphic); if (bExist) { Bitmap aSum=pGrf->GetBitmap(); Bitmap aSum1=aGraphic.GetBitmap(); if (aSum.IsEqual(aSum1)) return pEntry->nTabIndex; } } } return (sal_uInt16)0xFFFF; } sal_Bool GraphicBulletsTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel) { if ( mLevel == (sal_uInt16)0xFFFF || mLevel > aNum.GetLevelCount() || mLevel == 0) return sal_False; if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF ) return sal_False; if ( nIndex >= aGrfDataLst.Count() ) return sal_False; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return sal_False; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); const SvxBrushItem* pBrsh = aFmt.GetBrush(); const Graphic* pGrf = 0; if ( pBrsh ) pGrf = pBrsh->GetGraphic(); else return sal_False; String sEmpty; if ( pGrf ) { const String* pGrfName = pBrsh->GetGraphicLink(); //String* pGrfName = (String*)(pBrsh->GetGraphicLink()); GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex); if ( pGrfName ) pEntry->sGrfName = *pGrfName; //pEntry->sDescription = sEmpty; pEntry->nGallaryIndex = (sal_uInt16)0xFFFF; pEntry->bIsCustomized = sal_True; String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); aStrFromRES.SearchAndReplace(aReplace,sNUM); pEntry->sDescription = aStrFromRES; }else { return sal_False; } return sal_True; } sal_Bool GraphicBulletsTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool /* isDefault */,sal_Bool /* isResetSize */) { //if ( mLevel == (sal_uInt16)0xFFFF ) // return sal_False; if ( nIndex >= aGrfDataLst.Count() ) return sal_False; String sGrfName; GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex); sGrfName= pEntry->sGrfName; sal_uInt16 nMask = 1; String aEmptyStr; sal_uInt16 nSetNumberingType = SVX_NUM_BITMAP; String sNumCharFmtName = GetBulCharFmtName(); for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++) { if(mLevel & nMask) { SvxNumberFormat aFmt(aNum.GetLevel(i)); aFmt.SetNumberingType(nSetNumberingType); aFmt.SetPrefix( aEmptyStr ); aFmt.SetSuffix( aEmptyStr ); aFmt.SetCharFmtName( sNumCharFmtName ); Graphic aGraphic; if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, pEntry->nGallaryIndex, &aGraphic)) { Size aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic); sal_Int16 eOrient = text::VertOrientation::LINE_CENTER; aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit()); SvxBrushItem aBrush(aGraphic, GPOS_AREA, SID_ATTR_BRUSH ); aFmt.SetGraphicBrush( &aBrush, &aSize, &eOrient ); } else // if(pGrfName) aFmt.SetGraphic( sGrfName ); aNum.SetLevel(i, aFmt); } nMask <<= 1 ; } return sal_True; } String GraphicBulletsTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool /* isDefault */) { String sRet; sal_uInt16 nLength = 0; nLength = aGrfDataLst.Count() ; if ( nIndex >= nLength ) return sRet; else { GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex); if ( pEntry ) { sRet = pEntry->sDescription; }; } return sRet; } sal_Bool GraphicBulletsTypeMgr::IsCustomized(sal_uInt16 nIndex) { sal_Bool bRet = sal_False; sal_uInt16 nLength = 0; nLength = aGrfDataLst.Count() ; if ( nIndex >= nLength ) return bRet; else { GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex); if ( pEntry ) { bRet = pEntry->bIsCustomized; }; } return bRet; } String GraphicBulletsTypeMgr::GetGrfName(sal_uInt16 nIndex) { String sRet; if ( nIndex < aGrfDataLst.Count() ) { GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex); if ( pEntry ) { sRet = pEntry->sGrfName; } } return sRet; } /*************************************************************************************************** **********************Mix Bullets Type lib************************************************************** ****************************************************************************************************/ MixBulletsTypeMgr* MixBulletsTypeMgr::_instance = 0; MixBulletsSettings_Impl* MixBulletsTypeMgr::pActualBullets[] ={0,0,0,0,0,0,0,0}; MixBulletsSettings_Impl* MixBulletsTypeMgr::pDefaultActualBullets[] ={0,0,0,0,0,0,0,0}; MixBulletsTypeMgr::MixBulletsTypeMgr(const NBOType aType): NBOTypeMgrBase(aType) { Init(); for(sal_Int32 nItem = 0; nItem < DEFAULT_BULLET_TYPES; nItem++ ) { pDefaultActualBullets[nItem] = pActualBullets[nItem]; } // Initialize the first time to store the default value. Then do it again for customized value Init(); ImplLoad(String::CreateFromAscii("standard.sya")); } MixBulletsTypeMgr::MixBulletsTypeMgr(const NBOType aType,const SfxItemSet* pArg): NBOTypeMgrBase(aType,pArg) { Init(); for(sal_Int32 nItem = 0; nItem < DEFAULT_BULLET_TYPES; nItem++ ) { pDefaultActualBullets[nItem] = pActualBullets[nItem]; } // Initialize the first time to store the default value. Then do it again for customized value Init(); ImplLoad(String::CreateFromAscii("standard.sya")); } MixBulletsTypeMgr::MixBulletsTypeMgr(const MixBulletsTypeMgr& aTypeMgr): NBOTypeMgrBase(aTypeMgr) { for (sal_uInt16 i=0;ieType == eNBType::BULLETS ) { pActualBullets[i]->eType = aTypeMgr.pActualBullets[i]->eType; pActualBullets[i]->nIndex = aTypeMgr.pActualBullets[i]->nIndex; // Index in the tab page display pActualBullets[i]->nIndexDefault = aTypeMgr.pActualBullets[i]->nIndexDefault; pActualBullets[i]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->cBulletChar; ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->aFont = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->aFont; ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->sDescription = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->sDescription; ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->bIsCustomized = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->bIsCustomized; ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->eType = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->eType; }else if ( aTypeMgr.pActualBullets[i]->eType == eNBType::GRAPHICBULLETS ) { pActualBullets[i]->eType = aTypeMgr.pActualBullets[i]->eType; pActualBullets[i]->nIndex = aTypeMgr.pActualBullets[i]->nIndex; // Index in the tab page display pActualBullets[i]->nIndexDefault = aTypeMgr.pActualBullets[i]->nIndexDefault; pActualBullets[i]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ; ((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->sGrfName = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->sGrfName; ((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->sDescription = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->sDescription; ((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->bIsCustomized = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->bIsCustomized; ((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->eType = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->eType; if ( ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->bIsCustomized && ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->pGrfObj != NULL) { ((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->pGrfObj = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->pGrfObj; } } } ImplLoad(String::CreateFromAscii("standard.sya")); } void MixBulletsTypeMgr::Init() { BulletsTypeMgr* pBTMgr = BulletsTypeMgr::GetInstance(); if ( pBTMgr ) { // Index 1 pActualBullets[0] = new MixBulletsSettings_Impl(eNBType::BULLETS); pActualBullets[0]->eType = eNBType::BULLETS; pActualBullets[0]->nIndex = 0+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[0]->nIndexDefault = 2; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[0]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[0]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[0]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[0]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[0]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->eType = eNBType::BULLETS; // Index 2 pActualBullets[1] = new MixBulletsSettings_Impl(eNBType::BULLETS); pActualBullets[1]->eType = eNBType::BULLETS; pActualBullets[1]->nIndex = 1+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[1]->nIndexDefault = 3; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[1]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[1]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[1]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[1]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[1]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->eType = eNBType::BULLETS; // Index 3 pActualBullets[2] = new MixBulletsSettings_Impl(eNBType::BULLETS); pActualBullets[2]->eType = eNBType::BULLETS; pActualBullets[2]->nIndex = 2+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[2]->nIndexDefault = 4; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[2]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[2]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[2]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[2]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[2]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->eType = eNBType::BULLETS; // Index 4 pActualBullets[3] = new MixBulletsSettings_Impl(eNBType::BULLETS); pActualBullets[3]->eType = eNBType::BULLETS; pActualBullets[3]->nIndex = 3+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[3]->nIndexDefault = 5; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[3]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[3]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[3]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[3]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[3]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->eType = eNBType::BULLETS; // Index 5 pActualBullets[4] = new MixBulletsSettings_Impl(eNBType::BULLETS); pActualBullets[4]->eType = eNBType::BULLETS; pActualBullets[4]->nIndex = 4+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[4]->nIndexDefault = 6; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[4]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[4]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[4]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[4]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[4]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->eType = eNBType::BULLETS; // Index 6 pActualBullets[5] = new MixBulletsSettings_Impl(eNBType::BULLETS); pActualBullets[5]->eType = eNBType::BULLETS; pActualBullets[5]->nIndex = 5+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[5]->nIndexDefault = 8; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[5]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[5]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[5]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[5]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[5]->nIndexDefault-1); ((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->eType = eNBType::BULLETS; } GraphicBulletsTypeMgr* mGrfTMgr = GraphicBulletsTypeMgr::GetInstance(); if ( mGrfTMgr ) { // Index 7 pActualBullets[6] = new MixBulletsSettings_Impl(eNBType::GRAPHICBULLETS); pActualBullets[6]->eType = eNBType::GRAPHICBULLETS; pActualBullets[6]->nIndex = 6+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[6]->nIndexDefault = 9; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[6]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ; ((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->sGrfName = mGrfTMgr->GetGrfName(pActualBullets[6]->nIndexDefault); ((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->sDescription = mGrfTMgr->GetDescription(pActualBullets[6]->nIndexDefault); ((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->bIsCustomized = mGrfTMgr->IsCustomized(pActualBullets[6]->nIndexDefault); ((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->eType = eNBType::GRAPHICBULLETS; // Index 8 pActualBullets[7] = new MixBulletsSettings_Impl(eNBType::GRAPHICBULLETS); pActualBullets[7]->eType = eNBType::GRAPHICBULLETS; pActualBullets[7]->nIndex = 7+1; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[7]->nIndexDefault = 23; // Index in the tab page display,decrease 1 to the index within arr pActualBullets[7]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ; ((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->sGrfName = mGrfTMgr->GetGrfName(pActualBullets[7]->nIndexDefault); ((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->sDescription = mGrfTMgr->GetDescription(pActualBullets[7]->nIndexDefault); ((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->bIsCustomized = mGrfTMgr->IsCustomized(pActualBullets[7]->nIndexDefault); ((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->eType = eNBType::GRAPHICBULLETS; } } sal_uInt16 MixBulletsTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex) { if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0) return (sal_uInt16)0xFFFF; //if ( !lcl_IsNumFmtSet(pNR, mLevel) ) return (sal_uInt16)0xFFFF; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return (sal_uInt16)0xFFFF; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); sal_Int16 eNumType = aFmt.GetNumberingType(); if( eNumType == SVX_NUM_CHAR_SPECIAL) { sal_Unicode cChar = aFmt.GetBulletChar(); const Font* pFont = aFmt.GetBulletFont(); String sName = pFont?pFont->GetName():String(); for(sal_uInt16 i = nFromIndex; i < DEFAULT_BULLET_TYPES; i++) { if ( pActualBullets[i]->eType == eNBType::BULLETS ) { String ssName = ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->aFont.GetName(); if ( (cChar == ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar|| (cChar == 9830 && 57356 == ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar) || (cChar == 9632 && 57354 == ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar)))//&& //(pFont && pFont->GetName().CompareTo(((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->aFont.GetName())==COMPARE_EQUAL) ) { return pActualBullets[i]->nIndex; } } } }else if ( (eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) { const SvxBrushItem* pBrsh = aFmt.GetBrush(); const Graphic* pGrf = 0; if ( pBrsh ) pGrf = pBrsh->GetGraphic(); if ( pGrf ) { for(sal_uInt16 i = nFromIndex; i < DEFAULT_BULLET_TYPES; i++) { if ( pActualBullets[i]->eType == eNBType::GRAPHICBULLETS ) { GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pActualBullets[i]->pBullets); //sal_Bool bExist = sal_False; if ( pEntry && pActualBullets[i]->nIndexDefault == (sal_uInt16)0xFFFF && pEntry->pGrfObj) { if ( pEntry->pGrfObj->GetBitmap().IsEqual(pGrf->GetBitmap())) { return pActualBullets[i]->nIndex; } }else { //if ( pEntry && pGrfName && pEntry->sGrfName.CompareTo(*pGrfName)==COMPARE_EQUAL ) //bExist = GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, pActualBullets[i]->nIndexDefault-1,pSrGrf); Graphic aSrGrf; if (pEntry) GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, pActualBullets[i]->nIndexDefault,&aSrGrf); Bitmap aSum=pGrf->GetBitmap(); Bitmap aSum1=aSrGrf.GetBitmap(); if (aSum.IsEqual(aSum1)) return pActualBullets[i]->nIndex; } } } } } return (sal_uInt16)0xFFFF; } sal_Bool MixBulletsTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel) { if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0 || nIndex>=DEFAULT_BULLET_TYPES) return sal_False; //if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF ) // return sal_False; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return sal_False; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); sal_Int16 eNumType = aFmt.GetNumberingType(); if( eNumType == SVX_NUM_CHAR_SPECIAL && pActualBullets[nIndex]->eType == eNBType::BULLETS ) { sal_Unicode cChar = aFmt.GetBulletChar(); const Font* pFont = aFmt.GetBulletFont(); BulletsSettings_Impl* pEntry = (BulletsSettings_Impl*) (pActualBullets[nIndex]->pBullets); pEntry->cBulletChar = cChar; pEntry->aFont = pFont?*pFont:lcl_GetDefaultBulletFont(); pEntry->bIsCustomized = sal_True; String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); aStrFromRES.SearchAndReplace(aReplace,sNUM); pEntry->sDescription = aStrFromRES; }else if ( (eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP && pActualBullets[nIndex]->eType == eNBType::GRAPHICBULLETS ) { const SvxBrushItem* pBrsh = aFmt.GetBrush(); const Graphic* pGrf = 0; if ( pBrsh ) pGrf = pBrsh->GetGraphic(); else return sal_False; String sEmpty; if ( pGrf ) { const String* pGrfName = pBrsh->GetGraphicLink(); //String* pGrfName = (String*)(pBrsh->GetGraphicLink()); GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pActualBullets[nIndex]->pBullets); if ( pGrfName ) pEntry->sGrfName = *pGrfName; GraphicBulletsTypeMgr* mGrfTMgr = GraphicBulletsTypeMgr::GetInstance(); if ( mGrfTMgr ) { //sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel); //if ( nDIndex != (sal_uInt16)0xFFFF) //{ // pActualBullets[nIndex]->nIndexDefault = nDIndex -1; // sEmpty = mGrfTMgr->GetDescription( nDIndex -1); //}else { pActualBullets[nIndex]->nIndexDefault = (sal_uInt16)0xFFFF; sEmpty = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); sEmpty.SearchAndReplace(aReplace,sNUM); //pEntry->pGrfObj = pGrf; pEntry->pGrfObj = new Graphic(*pGrf); pEntry->aSize = aFmt.GetGraphicSize(); pEntry->aSize = OutputDevice::LogicToLogic(pEntry->aSize,(MapUnit)GetMapUnit(),MAP_100TH_MM); sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel); if (nDIndex!=(sal_uInt16)0xFFFF) pEntry->aSize=Size(0,0); } } pEntry->sDescription = sEmpty; pEntry->bIsCustomized = sal_True; }else { return sal_False; } }else { delete pActualBullets[nIndex]->pBullets; pActualBullets[nIndex]->pBullets = 0; if ( eNumType == SVX_NUM_CHAR_SPECIAL ) { sal_Unicode cChar = aFmt.GetBulletChar(); const Font* pFont = aFmt.GetBulletFont(); pActualBullets[nIndex]->eType = eNBType::BULLETS; pActualBullets[nIndex]->nIndex = nIndex+1; // Index in the tab page display, decrease 1 to the index within arr pActualBullets[nIndex]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ; ((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->cBulletChar = cChar; ((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->aFont = pFont?*pFont:lcl_GetDefaultBulletFont(); ((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->bIsCustomized = sal_True; ((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->eType = eNBType::BULLETS; BulletsTypeMgr* pBTMgr = BulletsTypeMgr::GetInstance(); if ( pBTMgr ) { //sal_uInt16 nDIndex = pBTMgr->GetNBOIndexForNumRule(aNum,mLevel); //if ( nDIndex != (sal_uInt16)0xFFFF) //{ // pActualBullets[nIndex]->nIndexDefault = nDIndex -1; // ((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->sDescription = pBTMgr->GetDescription(nDIndex - 1); //}else { pActualBullets[nIndex]->nIndexDefault = (sal_uInt16)0xFFFF; String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); aStrFromRES.SearchAndReplace(aReplace,sNUM); ((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->sDescription = aStrFromRES; } } }else if ( (eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) { const SvxBrushItem* pBrsh = aFmt.GetBrush(); const Graphic* pGrf = 0; if ( pBrsh ) pGrf = pBrsh->GetGraphic(); else return sal_False; String sEmpty; const String* pGrfName = 0; if ( pGrf ) { pGrfName = pBrsh->GetGraphicLink(); pActualBullets[nIndex]->eType = eNBType::GRAPHICBULLETS; pActualBullets[nIndex]->nIndex = nIndex+1; // Index in the tab page display, decrease 1 to the index within arr pActualBullets[nIndex]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ; if (pGrfName) ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->sGrfName = *pGrfName; ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->bIsCustomized = sal_True; ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->eType = eNBType::GRAPHICBULLETS; GraphicBulletsTypeMgr* mGrfTMgr = GraphicBulletsTypeMgr::GetInstance(); if ( mGrfTMgr ) { //sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel); //if ( nDIndex != (sal_uInt16)0xFFFF) //{ // pActualBullets[nIndex]->nIndexDefault = nDIndex - 1; // ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->sDescription = mGrfTMgr->GetDescription(nDIndex - 1); //}else { pActualBullets[nIndex]->nIndexDefault = (sal_uInt16)0xFFFF; String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); aStrFromRES.SearchAndReplace(aReplace,sNUM); ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->sDescription = aStrFromRES; //((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->pGrfObj = pGrf; ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->pGrfObj = new Graphic(*pGrf); ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->pGrfObj = new Graphic(*pGrf); Size aTmpSize = aFmt.GetGraphicSize(); aTmpSize = OutputDevice::LogicToLogic(aTmpSize,(MapUnit)GetMapUnit(),MAP_100TH_MM); sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel); if (nDIndex!=(sal_uInt16)0xFFFF) aTmpSize=Size(0,0); ((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->aSize = aTmpSize; } } } } } SvxNumRule aTmpRule1(aNum); ApplyNumRule(aTmpRule1,nIndex,mLevel,true); if (GetNBOIndexForNumRule(aTmpRule1,mLevel,nIndex)==nIndex+1) { if (pActualBullets[nIndex]->eType == eNBType::BULLETS) { BulletsSettings_Impl* pEntry = (BulletsSettings_Impl*) (pActualBullets[nIndex]->pBullets); pEntry->bIsCustomized = false; pEntry->sDescription = GetDescription(nIndex,true); } if (pActualBullets[nIndex]->eType == eNBType::GRAPHICBULLETS) { GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pActualBullets[nIndex]->pBullets); pEntry->bIsCustomized = false; pEntry->sDescription = GetDescription(nIndex,true); } } ImplStore(String::CreateFromAscii("standard.sya")); return sal_True; } sal_Bool MixBulletsTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool isDefault,sal_Bool isResetSize) { //if ( mLevel == (sal_uInt16)0xFFFF || nIndex>=DEFAULT_BULLET_TYPES ) if ( nIndex>=DEFAULT_BULLET_TYPES ) return sal_False; MixBulletsSettings_Impl* pCurrentBullets = pActualBullets[nIndex]; if (isDefault) pCurrentBullets=pDefaultActualBullets[nIndex]; if ( pCurrentBullets->eType == eNBType::BULLETS ) { sal_Unicode cChar; cChar = ((BulletsSettings_Impl*)(pCurrentBullets->pBullets))->cBulletChar; //Font& rActBulletFont = lcl_GetDefaultBulletFont(); Font rActBulletFont = ((BulletsSettings_Impl*)(pCurrentBullets->pBullets))->aFont; sal_uInt16 nMask = 1; String sBulletCharFmtName = GetBulCharFmtName(); for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++) { if(mLevel & nMask) { SvxNumberFormat aFmt(aNum.GetLevel(i)); if (SVX_NUM_CHAR_SPECIAL !=aFmt.GetNumberingType()) isResetSize=true; aFmt.SetNumberingType( SVX_NUM_CHAR_SPECIAL ); aFmt.SetBulletFont(&rActBulletFont); aFmt.SetBulletChar(cChar ); aFmt.SetCharFmtName(sBulletCharFmtName); String aEmptyStr; aFmt.SetPrefix( aEmptyStr ); aFmt.SetSuffix( aEmptyStr ); if (isResetSize) aFmt.SetBulletRelSize(45); aNum.SetLevel(i, aFmt); } nMask <<= 1; } }else if ( pCurrentBullets->eType == eNBType::GRAPHICBULLETS ) { String sGrfName; GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pCurrentBullets->pBullets); sGrfName= pEntry->sGrfName; sal_uInt16 nMask = 1; String aEmptyStr; sal_uInt16 nSetNumberingType = SVX_NUM_BITMAP; String sNumCharFmtName = GetBulCharFmtName(); for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++) { if(mLevel & nMask) { SvxNumberFormat aFmt(aNum.GetLevel(i)); if (SVX_NUM_BITMAP !=aFmt.GetNumberingType()) isResetSize=true; aFmt.SetNumberingType(nSetNumberingType); aFmt.SetPrefix( aEmptyStr ); aFmt.SetSuffix( aEmptyStr ); aFmt.SetCharFmtName( sNumCharFmtName ); if ( pCurrentBullets->nIndexDefault == (sal_uInt16)0xFFFF && pEntry->pGrfObj ) { Size aSize = pEntry->aSize; sal_Int16 eOrient = text::VertOrientation::LINE_CENTER; if (!isResetSize && aFmt.GetGraphicSize()!=Size(0,0)) aSize=aFmt.GetGraphicSize(); else { if (aSize.Width()==0 && aSize.Height()==0) { aSize = SvxNumberFormat::GetGraphicSizeMM100( pEntry->pGrfObj ); } aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit()); } SvxBrushItem aBrush(*(pEntry->pGrfObj), GPOS_AREA, SID_ATTR_BRUSH ); aFmt.SetGraphicBrush( &aBrush, &aSize, &eOrient ); }else { Graphic aGraphic; if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, pCurrentBullets->nIndexDefault, &aGraphic)) { Size aSize = pEntry->aSize; sal_Int16 eOrient = text::VertOrientation::LINE_CENTER; if (!isResetSize && aFmt.GetGraphicSize()!=Size(0,0)) aSize=aFmt.GetGraphicSize(); else { if (aSize.Width()==0 && aSize.Height()==0) { aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic); } aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit()); } SvxBrushItem aBrush(aGraphic, GPOS_AREA, SID_ATTR_BRUSH ); aFmt.SetGraphicBrush( &aBrush, &aSize, &eOrient ); }else aFmt.SetGraphic( sGrfName ); } aNum.SetLevel(i, aFmt); } nMask <<= 1 ; } } return sal_True; } String MixBulletsTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault) { String sRet; //sal_uInt16 nLength = 0; //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); if ( nIndex >= DEFAULT_BULLET_TYPES ) return sRet; else sRet = pActualBullets[nIndex]->pBullets->sDescription; if (isDefault) sRet = pDefaultActualBullets[nIndex]->pBullets->sDescription; return sRet; } sal_Bool MixBulletsTypeMgr::IsCustomized(sal_uInt16 nIndex) { sal_Bool bRet = sal_False; //sal_uInt16 nLength = 0; //nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl); if ( nIndex >= DEFAULT_BULLET_TYPES ) bRet = sal_False; else bRet = pActualBullets[nIndex]->pBullets->bIsCustomized; return bRet; } /*************************************************************************************************** **********************Numbering Type lib************************************************************** ****************************************************************************************************/ NumberingTypeMgr* NumberingTypeMgr::_instance = 0; NumberingTypeMgr::NumberingTypeMgr(const NBOType aType): NBOTypeMgrBase(aType), //pNumSettingsArr( new NumSettingsArr_Impl ), pNumberSettingsArr (new NumberSettingsArr_Impl) { Init(); pDefaultNumberSettingsArr = pNumberSettingsArr; pNumberSettingsArr = new NumberSettingsArr_Impl; // Initialize the first time to store the default value. Then do it again for customized value Init(); ImplLoad(String::CreateFromAscii("standard.syb")); } NumberingTypeMgr::NumberingTypeMgr(const NBOType aType,const SfxItemSet* pArg): NBOTypeMgrBase(aType,pArg), //pNumSettingsArr( new NumSettingsArr_Impl ), pNumberSettingsArr (new NumberSettingsArr_Impl) { Init(); pDefaultNumberSettingsArr = pNumberSettingsArr; pNumberSettingsArr = new NumberSettingsArr_Impl; // Initialize the first time to store the default value. Then do it again for customized value Init(); ImplLoad(String::CreateFromAscii("standard.syb")); } NumberingTypeMgr::NumberingTypeMgr(const NumberingTypeMgr& aTypeMgr): NBOTypeMgrBase(aTypeMgr), //pNumSettingsArr( new NumSettingsArr_Impl ), pNumberSettingsArr (new NumberSettingsArr_Impl) { /* for(sal_uInt16 i=0;iGetObject(i)->nIndex = _pSet->nIndex; pNumberSettingsArr->GetObject(i)->nIndexDefault = _pSet->nIndexDefault; pNumberSettingsArr->GetObject(i)->sDescription = _pSet->sDescription; pNumberSettingsArr->GetObject(i)->bIsCustomized = _pSet->bIsCustomized; if ( _pSet->pNumSetting ) { pNumberSettingsArr->GetObject(i)->pNumSetting->nNumberType = _pSet->pNumSetting->nNumberType; pNumberSettingsArr->GetObject(i)->pNumSetting->nParentNumbering = _pSet->pNumSetting->nParentNumbering; pNumberSettingsArr->GetObject(i)->pNumSetting->sPrefix = _pSet->pNumSetting->sPrefix; pNumberSettingsArr->GetObject(i)->pNumSetting->sSuffix = _pSet->pNumSetting->sSuffix; pNumberSettingsArr->GetObject(i)->pNumSetting->sBulletChar = _pSet->pNumSetting->sBulletChar; pNumberSettingsArr->GetObject(i)->pNumSetting->sBulletFont = _pSet->pNumSetting->sBulletFont; pNumberSettingsArr->GetObject(i)->pNumSetting->eLabelFollowedBy = _pSet->pNumSetting->eLabelFollowedBy; pNumberSettingsArr->GetObject(i)->pNumSetting->nTabValue = _pSet->pNumSetting->nTabValue; pNumberSettingsArr->GetObject(i)->pNumSetting->eNumAlign = _pSet->pNumSetting->eNumAlign; pNumberSettingsArr->GetObject(i)->pNumSetting->nNumAlignAt = _pSet->pNumSetting->nNumAlignAt; pNumberSettingsArr->GetObject(i)->pNumSetting->nNumIndentAt = _pSet->pNumSetting->nNumIndentAt; } } } */ ImplLoad(String::CreateFromAscii("standard.syb")); } void NumberingTypeMgr::Init() { Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); Reference < XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.text.DefaultNumberingProvider" ) ); Reference xDefNum(xI, UNO_QUERY); if(xDefNum.is()) { Sequence< Sequence< PropertyValue > > aNumberings; LanguageType eLang = Application::GetSettings().GetLanguage(); Locale aLocale = SvxCreateLocale(eLang); try { aNumberings = xDefNum->getDefaultContinuousNumberingLevels( aLocale ); sal_Int32 nLength = aNumberings.getLength() > DEFAULT_NUM_VALUSET_COUNT ? DEFAULT_NUM_VALUSET_COUNT :aNumberings.getLength(); const Sequence* pValuesArr = aNumberings.getConstArray(); for(sal_Int32 i = 0; i < nLength; i++) { NumSettings_ImplPtr pNew = lcl_CreateNumberingSettingsPtr(pValuesArr[i]); NumberSettings_Impl* pNumEntry = new NumberSettings_Impl; pNumEntry->nIndex = i + 1; pNumEntry->nIndexDefault = i; pNumEntry->pNumSetting = pNew; //SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS + i )); // { // String sText; // //const OUString sValue(C2U("Value")); // Reference xFormatter(xDefNum, UNO_QUERY); // if(xFormatter.is() && aNumberings.getLength() > i) // { // for (sal_uInt16 j=0;j<3;j++) // { // Sequence aLevel = aNumberings.getConstArray()[i]; // try // { // aLevel.realloc(aLevel.getLength() + 1); // PropertyValue& rValue = aLevel.getArray()[aLevel.getLength() - 1]; // rValue.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value")); // rValue.Value <<= (sal_Int32)(j + 1); // if (j!=0) // sText += String::CreateFromAscii(" "); // sText+=String(xFormatter->makeNumberingString( aLevel, aLocale )); // } // catch(Exception&) // { // DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString"); // } // } // } // String aStrFromRES(SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS)); // String aReplace = String::CreateFromAscii("%NUMBERINGSAMPLE"); // aStrFromRES.SearchAndReplace(aReplace,sText); // pNumEntry->sDescription = aStrFromRES; // } // End modification pNumEntry->sDescription = SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS + i ); pNumberSettingsArr->Insert(pNumEntry, pNumberSettingsArr->Count()); } } catch(Exception&) { } } } sal_uInt16 NumberingTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex) { if ( mLevel == (sal_uInt16)0xFFFF || mLevel > aNum.GetLevelCount() || mLevel == 0) return (sal_uInt16)0xFFFF; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return (sal_uInt16)0xFFFF; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); String sPreFix = aFmt.GetPrefix(); String sSuffix = aFmt.GetSuffix(); String sEmpty; sal_Int16 eNumType = aFmt.GetNumberingType(); sal_uInt16 nCount = pNumberSettingsArr->Count(); for(sal_uInt16 i = nFromIndex; i < nCount; i++) { NumberSettings_ImplPtr _pSet = pNumberSettingsArr->GetObject(i); sal_Int16 eNType = _pSet->pNumSetting->nNumberType; String sLocalPreFix = _pSet->pNumSetting->sPrefix.getStr(); String sLocalSuffix = _pSet->pNumSetting->sSuffix.getStr(); if (sPreFix.CompareTo(sLocalPreFix)==COMPARE_EQUAL && sSuffix.CompareTo(sLocalSuffix)==COMPARE_EQUAL && eNumType == eNType ) { return i+1; } } return (sal_uInt16)0xFFFF; } sal_Bool NumberingTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel) { //if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0) // return sal_False; //if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF ) // return sal_False; sal_uInt16 nActLv = IsSingleLevel(mLevel); if ( nActLv == (sal_uInt16)0xFFFF ) return sal_False; SvxNumberFormat aFmt(aNum.GetLevel(nActLv)); //sal_Unicode cPrefix = rtl::OUString(aFmt.GetPrefix()).getStr()[0]; //sal_Unicode cSuffix = rtl::OUString(aFmt.GetSuffix()).getStr()[0]; sal_Int16 eNumType = aFmt.GetNumberingType(); sal_uInt16 nCount = pNumberSettingsArr->Count(); if ( nIndex >= nCount ) return sal_False; NumberSettings_ImplPtr _pSet = pNumberSettingsArr->GetObject(nIndex); _pSet->pNumSetting->sPrefix = aFmt.GetPrefix(); _pSet->pNumSetting->sSuffix = aFmt.GetSuffix(); _pSet->pNumSetting->nNumberType = eNumType; _pSet->bIsCustomized = sal_True; SvxNumRule aTmpRule1(aNum); SvxNumRule aTmpRule2(aNum); ApplyNumRule(aTmpRule1,nIndex,mLevel,true); ApplyNumRule(aTmpRule2,nIndex,mLevel,false); if (aTmpRule1==aTmpRule2) _pSet->bIsCustomized=false; if (_pSet->bIsCustomized) { String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_NUMBERING_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); aStrFromRES.SearchAndReplace(aReplace,sNUM); _pSet->sDescription = aStrFromRES; } else { _pSet->sDescription = GetDescription(nIndex,true); } ImplStore(String::CreateFromAscii("standard.syb")); return sal_True; } sal_Bool NumberingTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool isDefault,sal_Bool isResetSize) { //if ( mLevel == (sal_uInt16)0xFFFF ) // return sal_False; //DBG_ASSERT(pNumSettingsArr->Count() > nIndex, "wrong index"); if(pNumberSettingsArr->Count() <= nIndex) return sal_False; NumberSettingsArr_Impl* pCurrentNumberSettingsArr=pNumberSettingsArr; if (isDefault) pCurrentNumberSettingsArr=pDefaultNumberSettingsArr; NumberSettings_ImplPtr _pSet = pCurrentNumberSettingsArr->GetObject(nIndex); sal_Int16 eNewType = _pSet->pNumSetting->nNumberType; sal_uInt16 nMask = 1; String sNumCharFmtName = GetBulCharFmtName(); for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++) { if(mLevel & nMask) { SvxNumberFormat aFmt(aNum.GetLevel(i)); if (eNewType!=aFmt.GetNumberingType()) isResetSize=true; aFmt.SetNumberingType(eNewType); aFmt.SetPrefix(_pSet->pNumSetting->sPrefix); aFmt.SetSuffix(_pSet->pNumSetting->sSuffix); aFmt.SetCharFmtName(sNumCharFmtName); if (isResetSize) aFmt.SetBulletRelSize(100); aNum.SetLevel(i, aFmt); } nMask <<= 1 ; } return sal_True; } String NumberingTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault) { String sRet; sal_uInt16 nLength = 0; nLength = pNumberSettingsArr->Count(); if ( nIndex >= nLength ) return sRet; else sRet = pNumberSettingsArr->GetObject(nIndex)->sDescription; if (isDefault) sRet = pDefaultNumberSettingsArr->GetObject(nIndex)->sDescription; return sRet; } sal_Bool NumberingTypeMgr::IsCustomized(sal_uInt16 nIndex) { sal_Bool bRet = sal_False; sal_uInt16 nLength = 0; nLength = pNumberSettingsArr->Count(); if ( nIndex >= nLength ) bRet = sal_False; else bRet = pNumberSettingsArr->GetObject(nIndex)->bIsCustomized; return bRet; } sal_uInt16 NumberingTypeMgr::GetNumCount() const { sal_uInt16 nRet = 0; if ( pNumberSettingsArr ) nRet = pNumberSettingsArr->Count(); return nRet; } NumberSettings_Impl* NumberingTypeMgr::GetNumSettingByIndex(sal_uInt16 nIndex) const { NumberSettings_Impl* pRet = 0; if ( pNumberSettingsArr && nIndex< pNumberSettingsArr->Count() ) { pRet = pNumberSettingsArr->GetObject(nIndex); } return pRet; } /*************************************************************************************************** **********************Multi-level /Outline Type lib******************************************************* ****************************************************************************************************/ OutlineTypeMgr* OutlineTypeMgr::_instance = 0; OutlineTypeMgr::OutlineTypeMgr(const NBOType aType): NBOTypeMgrBase(aType)//, //pNumSettingsArrs( new NumSettingsArr_Impl[DEFAULT_NUM_VALUSET_COUNT] ) { Init(); for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ ) { pDefaultOutlineSettingsArrs[nItem] = pOutlineSettingsArrs[nItem]; } // Initialize the first time to store the default value. Then do it again for customized value Init(); ImplLoad(String::CreateFromAscii("standard.syc")); } OutlineTypeMgr::OutlineTypeMgr(const NBOType aType,const SfxItemSet* pArg): NBOTypeMgrBase(aType,pArg)//, //pNumSettingsArrs( new NumSettingsArr_Impl[DEFAULT_NUM_VALUSET_COUNT]) { Init(); for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ ) { pDefaultOutlineSettingsArrs[nItem] = pOutlineSettingsArrs[nItem]; } // Initialize the first time to store the default value. Then do it again for customized value Init(); ImplLoad(String::CreateFromAscii("standard.syc")); } OutlineTypeMgr::OutlineTypeMgr(const OutlineTypeMgr& aTypeMgr): NBOTypeMgrBase(aTypeMgr)//, //pNumSettingsArrs( new NumSettingsArr_Impl[DEFAULT_NUM_VALUSET_COUNT]) { Init(); for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ ) { pDefaultOutlineSettingsArrs[nItem] = pOutlineSettingsArrs[nItem]; } // Initialize the first time to store the default value. Then do it again for customized value Init(); ImplLoad(String::CreateFromAscii("standard.syc")); } void OutlineTypeMgr::Init() { Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); Reference < XInterface > xI = xMSF->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.text.DefaultNumberingProvider" ) ); Reference xDefNum(xI, UNO_QUERY); if(xDefNum.is()) { Sequence > aOutlineAccess; LanguageType eLang = Application::GetSettings().GetLanguage(); Locale aLocale = SvxCreateLocale(eLang); try { aOutlineAccess = xDefNum->getDefaultOutlineNumberings( aLocale ); SvxNumRule aDefNumRule( NUM_BULLET_REL_SIZE|NUM_CONTINUOUS|NUM_BULLET_COLOR|NUM_CHAR_TEXT_DISTANCE|NUM_SYMBOL_ALIGNMENT,10, sal_False , SVX_RULETYPE_NUMBERING,SvxNumberFormat::LABEL_ALIGNMENT); for(sal_Int32 nItem = 0; nItem < aOutlineAccess.getLength() && nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ ) { pOutlineSettingsArrs[ nItem ] = new OutlineSettings_Impl; OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[ nItem ]; pItemArr->sDescription = SVX_RESSTR( RID_SVXSTR_OUTLINENUM_DESCRIPTION_0 + nItem ); pItemArr->pNumSettingsArr = new NumSettingsArr_Impl; Reference xLevel = aOutlineAccess.getConstArray()[nItem]; for(sal_Int32 nLevel = 0; nLevel < xLevel->getCount() && nLevel < 5; nLevel++) { Any aValueAny = xLevel->getByIndex(nLevel); Sequence aLevelProps; aValueAny >>= aLevelProps; NumSettings_ImplPtr pNew = lcl_CreateNumberingSettingsPtr(aLevelProps); SvxNumberFormat aNumFmt( aDefNumRule.GetLevel( nLevel) ); pNew->eLabelFollowedBy = aNumFmt.GetLabelFollowedBy(); pNew->nTabValue = aNumFmt.GetListtabPos(); pNew->eNumAlign = aNumFmt.GetNumAdjust(); pNew->nNumAlignAt = aNumFmt.GetFirstLineIndent(); pNew->nNumIndentAt = aNumFmt.GetIndentAt(); pItemArr->pNumSettingsArr->Insert( pNew, pItemArr->pNumSettingsArr->Count() ); } } } catch(Exception&) { } } } sal_uInt16 OutlineTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 /* mLevel */,sal_uInt16 nFromIndex) { sal_uInt16 nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*); for(sal_uInt16 iDex = nFromIndex; iDex < nLength; iDex++) { sal_Bool bNotMatch = sal_False; OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[iDex]; sal_uInt16 nCount = pItemArr->pNumSettingsArr->Count(); for (sal_uInt16 iLevel=0;iLevel < nCount;iLevel++) { NumSettings_ImplPtr _pSet = pItemArr->pNumSettingsArr->GetObject(iLevel); sal_Int16 eNType = _pSet->nNumberType; SvxNumberFormat aFmt(aNum.GetLevel(iLevel)); String sPreFix = aFmt.GetPrefix(); String sSuffix = aFmt.GetSuffix(); String sEmpty; sal_Int16 eNumType = aFmt.GetNumberingType(); if( eNumType == SVX_NUM_CHAR_SPECIAL) { sal_Unicode cChar = aFmt.GetBulletChar(); sal_Unicode ccChar = _pSet->sBulletChar.getStr()[0]; rtl::OUString sFont = _pSet->sBulletFont; if ( !((cChar == ccChar) && //pFont && sFont.compareTo(pFont->GetName()) && _pSet->eLabelFollowedBy == aFmt.GetLabelFollowedBy() && _pSet->nTabValue == aFmt.GetListtabPos() && _pSet->eNumAlign == aFmt.GetNumAdjust() && _pSet->nNumAlignAt == aFmt.GetFirstLineIndent() && _pSet->nNumIndentAt == aFmt.GetIndentAt())) { bNotMatch = sal_True; break; } }else if ((eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) { const SvxBrushItem* pBrsh1 = aFmt.GetBrush(); const SvxBrushItem* pBrsh2 = _pSet->pBrushItem; sal_Bool bIsMatch = false; if (pBrsh1==pBrsh2) bIsMatch = true; if (pBrsh1 && pBrsh2) { const Graphic* pGrf1 = pBrsh1->GetGraphic();; const Graphic* pGrf2 = pBrsh2->GetGraphic();; if (pGrf1==pGrf2) bIsMatch = true; if (pGrf1 && pGrf2) { if ( pGrf1->GetBitmap().IsEqual(pGrf2->GetBitmap()) && _pSet->aSize==aFmt.GetGraphicSize()) bIsMatch = true; } } if (!bIsMatch) { bNotMatch = sal_True; break; } } else { if (!((sPreFix.CompareTo(_pSet->sPrefix.getStr())==COMPARE_EQUAL) && ( sSuffix.CompareTo(_pSet->sSuffix.getStr())==COMPARE_EQUAL ) && eNumType == eNType && _pSet->eLabelFollowedBy == aFmt.GetLabelFollowedBy() && _pSet->nTabValue == aFmt.GetListtabPos() && _pSet->eNumAlign == aFmt.GetNumAdjust() && _pSet->nNumAlignAt == aFmt.GetFirstLineIndent() && _pSet->nNumIndentAt == aFmt.GetIndentAt())) { bNotMatch = sal_True; break; } } } if ( !bNotMatch ) return iDex+1; } return (sal_uInt16)0xFFFF; } sal_Bool OutlineTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel) { //if ( mLevel == 0 || mLevel == (sal_uInt16)0xFFFF ) // return sal_False; sal_uInt16 nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*); if ( nIndex >= nLength ) return sal_False; OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex]; sal_uInt16 nCount = pItemArr->pNumSettingsArr->Count(); for (sal_uInt16 iLevel=0;iLevel < nCount;iLevel++) { SvxNumberFormat aFmt(aNum.GetLevel(iLevel)); sal_Int16 eNumType = aFmt.GetNumberingType(); NumSettings_ImplPtr _pSet = pItemArr->pNumSettingsArr->GetObject(iLevel); _pSet->eLabelFollowedBy = aFmt.GetLabelFollowedBy(); _pSet->nTabValue = aFmt.GetListtabPos(); _pSet->eNumAlign = aFmt.GetNumAdjust(); _pSet->nNumAlignAt = aFmt.GetFirstLineIndent(); _pSet->nNumIndentAt = aFmt.GetIndentAt(); if( eNumType == SVX_NUM_CHAR_SPECIAL) { sal_Unicode cChar = aFmt.GetBulletChar(); OUString sChar(cChar); _pSet->sBulletChar = sChar;//OUString(cChar); if ( aFmt.GetBulletFont() ) _pSet->sBulletFont = rtl::OUString(aFmt.GetBulletFont()->GetName()); _pSet->nNumberType = eNumType; pItemArr->bIsCustomized = sal_True; }else if ((eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) { if (_pSet->pBrushItem) { delete (_pSet->pBrushItem); _pSet->pBrushItem=NULL; } if (aFmt.GetBrush()) _pSet->pBrushItem = new SvxBrushItem(*aFmt.GetBrush()); _pSet->aSize = aFmt.GetGraphicSize(); _pSet->nNumberType = eNumType; } else { _pSet->sPrefix = aFmt.GetPrefix(); _pSet->sSuffix = aFmt.GetSuffix(); _pSet->nNumberType = eNumType; if ( aFmt.GetBulletFont() ) _pSet->sBulletFont = rtl::OUString(aFmt.GetBulletFont()->GetName()); pItemArr->bIsCustomized = sal_True; } } SvxNumRule aTmpRule1(aNum); SvxNumRule aTmpRule2(aNum); ApplyNumRule(aTmpRule1,nIndex,mLevel,true); ApplyNumRule(aTmpRule2,nIndex,mLevel,false); if (aTmpRule1==aTmpRule2) pItemArr->bIsCustomized=false; if (pItemArr->bIsCustomized) { String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_MULTILEVEL_DESCRIPTION)); String aReplace = String::CreateFromAscii("%LIST_NUM"); String sNUM = String::CreateFromInt32( nIndex + 1 ); aStrFromRES.SearchAndReplace(aReplace,sNUM); pItemArr->sDescription = aStrFromRES; } else { pItemArr->sDescription = GetDescription(nIndex,true); } ImplStore(String::CreateFromAscii("standard.syc")); return sal_True; } sal_Bool OutlineTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 /* mLevel */,sal_Bool isDefault,sal_Bool isResetSize) { //if ( mLevel == (sal_uInt16)0xFFFF ) // return sal_False; DBG_ASSERT(DEFAULT_NUM_VALUSET_COUNT > nIndex, "wrong index"); if(DEFAULT_NUM_VALUSET_COUNT <= nIndex) return sal_False; const FontList* pList = 0; OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex]; if (isDefault) pItemArr=pDefaultOutlineSettingsArrs[nIndex]; //Font& rActBulletFont = lcl_GetDefaultBulletFont(); NumSettingsArr_Impl *pNumSettingsArr=pItemArr->pNumSettingsArr; NumSettings_ImplPtr pLevelSettings = 0; String sBulletCharFmtName = GetBulCharFmtName(); for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++) { if(pNumSettingsArr->Count() > i) pLevelSettings = pNumSettingsArr->GetObject(i); if(!pLevelSettings) break; SvxNumberFormat aFmt(aNum.GetLevel(i)); //aFmt.SetBulletFont(&pLevelSettings->aFont); Font& rActBulletFont = lcl_GetDefaultBulletFont(); if (pLevelSettings->nNumberType !=aFmt.GetNumberingType()) isResetSize=true; aFmt.SetNumberingType( pLevelSettings->nNumberType ); sal_uInt16 nUpperLevelOrChar = (sal_uInt16)pLevelSettings->nParentNumbering; if(aFmt.GetNumberingType() == SVX_NUM_CHAR_SPECIAL) { if( pLevelSettings->sBulletFont.getLength() && pLevelSettings->sBulletFont.compareTo(rActBulletFont.GetName())) { // search for the font if(!pList) { SfxObjectShell* pCurDocShell = SfxObjectShell::Current(); const SvxFontListItem* pFontListItem = (const SvxFontListItem* )pCurDocShell->GetItem( SID_ATTR_CHAR_FONTLIST ); pList = pFontListItem ? pFontListItem->GetFontList() : 0; } if(pList && pList->IsAvailable( pLevelSettings->sBulletFont ) ) { FontInfo aInfo = pList->Get(pLevelSettings->sBulletFont,WEIGHT_NORMAL, ITALIC_NONE); Font aFont(aInfo); aFmt.SetBulletFont(&aFont); } else { // if it cannot be found then create a new one Font aCreateFont( pLevelSettings->sBulletFont,String(), Size( 0, 14 ) ); aCreateFont.SetCharSet( RTL_TEXTENCODING_DONTKNOW ); aCreateFont.SetFamily( FAMILY_DONTKNOW ); aCreateFont.SetPitch( PITCH_DONTKNOW ); aCreateFont.SetWeight( WEIGHT_DONTKNOW ); aCreateFont.SetTransparent( sal_True ); aFmt.SetBulletFont( &aCreateFont ); } }else aFmt.SetBulletFont( &rActBulletFont ); sal_Unicode cChar = 0; if( pLevelSettings->sBulletChar.getLength() ) cChar = pLevelSettings->sBulletChar.getStr()[0]; if( Application::GetSettings().GetLayoutRTL() ) { if( 0 == i && cChar == BulletsTypeMgr::aDynamicBulletTypes[5] ) cChar = BulletsTypeMgr::aDynamicRTLBulletTypes[5]; else if( 1 == i ) { const SvxNumberFormat& numberFmt = aNum.GetLevel(0); if( numberFmt.GetBulletChar() == BulletsTypeMgr::aDynamicRTLBulletTypes[5] ) cChar = BulletsTypeMgr::aDynamicRTLBulletTypes[4]; } } aFmt.SetBulletChar(cChar); aFmt.SetCharFmtName( sBulletCharFmtName ); if (isResetSize) aFmt.SetBulletRelSize(45); }else if ((aFmt.GetNumberingType()&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) { if (pLevelSettings->pBrushItem) { const Graphic* pGrf = pLevelSettings->pBrushItem->GetGraphic();; Size aSize = pLevelSettings->aSize; sal_Int16 eOrient = text::VertOrientation::LINE_CENTER; if (!isResetSize && aFmt.GetGraphicSize()!=Size(0,0)) aSize=aFmt.GetGraphicSize(); else { if (aSize.Width()==0 && aSize.Height()==0 && pGrf) { aSize = SvxNumberFormat::GetGraphicSizeMM100( pGrf ); } } aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit()); aFmt.SetGraphicBrush( pLevelSettings->pBrushItem, &aSize, &eOrient ); } } else { aFmt.SetIncludeUpperLevels(sal::static_int_cast< sal_uInt8 >(0 != nUpperLevelOrChar ? aNum.GetLevelCount() : 0)); aFmt.SetCharFmtName(sBulletCharFmtName); if (isResetSize) aFmt.SetBulletRelSize(100); } if(pNumSettingsArr->Count() > i) { aFmt.SetLabelFollowedBy(pLevelSettings->eLabelFollowedBy); aFmt.SetListtabPos(pLevelSettings->nTabValue); aFmt.SetNumAdjust(pLevelSettings->eNumAlign); aFmt.SetFirstLineIndent(pLevelSettings->nNumAlignAt); aFmt.SetIndentAt(pLevelSettings->nNumIndentAt); } aFmt.SetPrefix(pLevelSettings->sPrefix); aFmt.SetSuffix(pLevelSettings->sSuffix); aNum.SetLevel(i, aFmt); } return sal_True; } String OutlineTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault) { String sRet; sal_uInt16 nLength = 0; nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*); if ( nIndex >= nLength ) return sRet; else { OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex]; if (isDefault) pItemArr = pDefaultOutlineSettingsArrs[nIndex]; if ( pItemArr ) { sRet = pItemArr->sDescription; }; } return sRet; } sal_Bool OutlineTypeMgr::IsCustomized(sal_uInt16 nIndex) { sal_Bool bRet = sal_False; sal_uInt16 nLength = 0; nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*); if ( nIndex >= nLength ) return bRet; else { OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex]; if ( pItemArr ) { bRet = pItemArr->bIsCustomized; }; } return bRet; } }} /* vim: set noet sw=4 ts=4: */