diff options
Diffstat (limited to 'sd/source/ui/func/fuolbull.cxx')
-rw-r--r-- | sd/source/ui/func/fuolbull.cxx | 402 |
1 files changed, 401 insertions, 1 deletions
diff --git a/sd/source/ui/func/fuolbull.cxx b/sd/source/ui/func/fuolbull.cxx index e96979b1818d..e8b31a725382 100644 --- a/sd/source/ui/func/fuolbull.cxx +++ b/sd/source/ui/func/fuolbull.cxx @@ -32,6 +32,9 @@ #include <editeng/eeitem.hxx> #include <sfx2/request.hxx> #include <svl/intitem.hxx> +#include <editeng/numitem.hxx> +#include "sdresid.hxx" +#include "glob.hrc" #include <editeng/editdata.hxx> #include <svx/svxids.hrc> @@ -43,7 +46,10 @@ #endif #include "drawdoc.hxx" #include "sdabstdlg.hxx" - +#include <svx/nbdtmg.hxx> +#include <svx/nbdtmgfact.hxx> +#include <svx/svdoutl.hxx> +using namespace svx::sidebar; namespace sd { TYPEINIT1( FuOutlineBullet, FuPoor ); @@ -70,6 +76,16 @@ FunctionReference FuOutlineBullet::Create( ViewShell* pViewSh, ::sd::Window* pWi void FuOutlineBullet::DoExecute( SfxRequest& rReq ) { + sal_uInt16 nSId = rReq.GetSlot(); + if (nSId == FN_SVX_SET_BULLET){ + SetCurrentBullet(rReq); + return; + } + else if (nSId == FN_SVX_SET_NUMBER){ + SetCurrentNumbering(rReq); + return; + } + const SfxItemSet* pArgs = rReq.GetArgs(); if( !pArgs ) @@ -137,6 +153,390 @@ void FuOutlineBullet::DoExecute( SfxRequest& rReq ) */ } +void FuOutlineBullet::SetCurrentNumbering(SfxRequest& rReq) +{ + if (!mpDoc || !mpView) + return; + + SfxItemSet aEditAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aEditAttr ); + + SfxItemSet aNewAttr( mpViewShell->GetPool(), + EE_ITEMS_START, EE_ITEMS_END ); + aNewAttr.Put( aEditAttr, sal_False ); + + SfxItemSet aSetAttr( mpViewShell->GetPool(), + EE_ITEMS_START, EE_ITEMS_END ); + + //Init bullet level in "Customize" tab page in bullet dialog in master page view + if( mpView && mpViewShell && mpViewShell->ISA(DrawViewShell) + && ((DrawViewShell *)mpViewShell)->GetEditMode() == EM_MASTERPAGE ) + { + SdrObject* pObj = mpView->GetTextEditObject(); + if( pObj && pObj->GetObjIdentifier() == OBJ_OUTLINETEXT ) + { + sal_uInt16 nLevel = mpView->GetSelectionLevel(); + if( nLevel != 0xFFFF ) + { + + SfxItemSet aStoreSet( aNewAttr ); + aNewAttr.ClearItem(); + //extend range + aNewAttr.MergeRange( SID_PARAM_NUM_PRESET, SID_PARAM_CUR_NUM_LEVEL ); + aNewAttr.Put( aStoreSet ); + //put current level user selected + aNewAttr.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ) ); + } + } + } + //End of add + + sal_uInt16 nActNumLvl = (sal_uInt16)0xFFFF; + SvxNumRule* pNumRule = NULL; + const SfxPoolItem* pTmpItem=NULL; + sal_uInt32 nNumItemId = SID_ATTR_NUMBERING_RULE; + + if(SFX_ITEM_SET == aNewAttr.GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pTmpItem)) + nActNumLvl = ((const SfxUInt16Item*)pTmpItem)->GetValue(); + + pTmpItem=GetNumBulletItem(aNewAttr, nNumItemId); + + if (pTmpItem) + pNumRule = new SvxNumRule(*((SvxNumBulletItem*)pTmpItem)->GetNumRule()); + + SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, FN_SVX_SET_NUMBER , sal_False ); + if (pItem && pNumRule) + { + sal_uInt16 nIdx = pItem->GetValue(); + // If the nIdx is (sal_uInt16)0xFFFF, means set bullet status to on/off + // And the bullet default status is 1. + bool bBulletSwitch = false; + sal_Bool isRemoveNum =false; + if( nIdx == (sal_uInt16)0xFFFF ) + { + nIdx = 1; + bBulletSwitch = true; + } + if (nIdx == DEFAULT_NONE) + { + bBulletSwitch = false; + isRemoveNum = true; + } + nIdx--; + + NBOTypeMgrBase* pNumbering = NBOutlineTypeMgrFact::CreateInstance(eNBOType::NUMBERING); + if ( pNumbering ) + { + //Sym3_2508, set unit attribute to NB Manager + pNumbering->SetItems(&aNewAttr); + SvxNumRule aTmpRule( *pNumRule ); + pNumbering->ApplyNumRule(aTmpRule,nIdx,nActNumLvl); + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < pNumRule->GetLevelCount(); i++) + { + if(nActNumLvl & nMask) + { + SvxNumberFormat aFmt(aTmpRule.GetLevel(i)); + pNumRule->SetLevel(i, aFmt); + } + nMask <<= 1 ; + } + aSetAttr.Put(SvxNumBulletItem( *pNumRule ), nNumItemId); + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + std::auto_ptr< OutlineViewModelChangeGuard > aGuard; + + if (mpView->ISA(OutlineView)) + { + pOLV = static_cast<OutlineView*>(mpView) + ->GetViewByWindow(mpViewShell->GetActiveWindow()); + + aGuard.reset( new OutlineViewModelChangeGuard( static_cast<OutlineView&>(*mpView) ) ); + } + + SdrOutliner* pOwner = mpView->GetTextEditOutliner(); + bool bMasterView = false; + + DrawViewShell* pDrawViewShell = static_cast< DrawViewShell* >(mpViewShell); + + if ( pOwner && pDrawViewShell && pDrawViewShell->GetEditMode() == EM_MASTERPAGE ) + bMasterView = !pOwner->IsInUndo() && pOwner->IsUndoEnabled(); + + if( bMasterView ) + { + pOwner->UndoActionStart( OLUNDO_ATTR ); + pOLV->ToggleBullets( bBulletSwitch, sal_False, bMasterView, pNumRule,isRemoveNum); + mpView->SetAttributes(aSetAttr); //Modify for Sym2_3151 + pOwner->UndoActionEnd( OLUNDO_ATTR ); + } + else if( pOLV ) + pOLV->ToggleBullets( bBulletSwitch, sal_False, bMasterView, pNumRule ,isRemoveNum); + else + { + sal_Bool bInMasterView = pDrawViewShell && pDrawViewShell->GetEditMode() == EM_MASTERPAGE; + SdrModel* pSdrModel = mpView->GetModel(); + sal_Bool bModelUndoEnabled = pSdrModel ? pSdrModel->IsUndoEnabled() : sal_False; + if (bInMasterView && bModelUndoEnabled) + { + pSdrModel->BegUndo(); + } + mpView->ToggleMarkedObjectsBullets(bBulletSwitch, sal_False, bInMasterView, pNumRule,isRemoveNum); + if (bInMasterView) + { + mpView->SetAttributes(aSetAttr); + } + if (bInMasterView && bModelUndoEnabled) + { + pSdrModel->EndUndo(); + } + } + } + //End + } + delete pNumRule; + rReq.Done(); +} + +void FuOutlineBullet::SetCurrentBullet(SfxRequest& rReq) +{ + if (!mpDoc || !mpView) + return; + + SfxItemSet aEditAttr( mpDoc->GetPool() ); + mpView->GetAttributes( aEditAttr ); + + SfxItemSet aNewAttr( mpViewShell->GetPool(), + EE_ITEMS_START, EE_ITEMS_END ); + aNewAttr.Put( aEditAttr, sal_False ); + + //Add for Sym2_3151, should add new attributes in an empty item set, then use this item set as parameter in SetAttributes() + SfxItemSet aSetAttr( mpViewShell->GetPool(), + EE_ITEMS_START, EE_ITEMS_END ); + + //Init bullet level in "Customize" tab page in bullet dialog in master page view + if( mpView && mpViewShell && mpViewShell->ISA(DrawViewShell) + && ((DrawViewShell *)mpViewShell)->GetEditMode() == EM_MASTERPAGE ) + { + SdrObject* pObj = mpView->GetTextEditObject(); + if( pObj && pObj->GetObjIdentifier() == OBJ_OUTLINETEXT ) + { + sal_uInt16 nLevel = mpView->GetSelectionLevel(); + if( nLevel != 0xFFFF ) + { + //aNewAttr.MergeRange( SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL ); + //aNewAttr.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ) ); + //save the itemset value + SfxItemSet aStoreSet( aNewAttr ); + aNewAttr.ClearItem(); + //extend range + aNewAttr.MergeRange( SID_PARAM_NUM_PRESET, SID_PARAM_CUR_NUM_LEVEL ); + aNewAttr.Put( aStoreSet ); + //put current level user selected + aNewAttr.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ) ); + } + } + } + //End of add + + sal_uInt16 nActNumLvl = (sal_uInt16)0xFFFF; + SvxNumRule* pNumRule = NULL; + const SfxPoolItem* pTmpItem=NULL; + sal_uInt32 nNumItemId = SID_ATTR_NUMBERING_RULE; + + if(SFX_ITEM_SET == aNewAttr.GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pTmpItem)) + nActNumLvl = ((const SfxUInt16Item*)pTmpItem)->GetValue(); + + pTmpItem=GetNumBulletItem(aNewAttr, nNumItemId); + + if (pTmpItem) + pNumRule = new SvxNumRule(*((SvxNumBulletItem*)pTmpItem)->GetNumRule()); + + SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, FN_SVX_SET_BULLET , sal_False ); + if (pItem && pNumRule) + { + sal_uInt16 nIdx = pItem->GetValue(); + // If the nIdx is (sal_uInt16)0xFFFF, means set bullet status to on/off + // And the bullet default status is 2. + bool bBulletSwitch = false; + sal_Bool isRemoveNum =false; + if( nIdx == (sal_uInt16)0xFFFF ) + { + nIdx = 1; + bBulletSwitch = true; + } + if (nIdx == DEFAULT_NONE) + { + bBulletSwitch = false; + isRemoveNum = true; + } + + nIdx--; + //Modified for Numbering&Bullets Dialog UX Enh(Story 992) by chengjh,2011.8.7 + + NBOTypeMgrBase* pBullets = NBOutlineTypeMgrFact::CreateInstance(eNBOType::MIXBULLETS); + if ( pBullets ) + { + //Sym3_2508, set unit attribute to NB Manager + pBullets->SetItems(&aNewAttr); + SvxNumRule aTmpRule( *pNumRule ); + //Sym3_3423 Always apply the "." if wants a default numbering rule + if (bBulletSwitch==true && nIdx==0) //want to reset bullet + { + pBullets->ApplyNumRule(aTmpRule,nIdx,nActNumLvl,true); + } + else { + pBullets->ApplyNumRule(aTmpRule,nIdx,nActNumLvl); + } + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < pNumRule->GetLevelCount(); i++) + { + if(nActNumLvl & nMask) + { + SvxNumberFormat aFmt(aTmpRule.GetLevel(i)); + pNumRule->SetLevel(i, aFmt); + } + nMask <<= 1; + } + aSetAttr.Put(SvxNumBulletItem( *pNumRule ), nNumItemId); + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + + std::auto_ptr< OutlineViewModelChangeGuard > aGuard; + + if (mpView->ISA(OutlineView)) + { + pOLV = static_cast<OutlineView*>(mpView) + ->GetViewByWindow(mpViewShell->GetActiveWindow()); + + aGuard.reset( new OutlineViewModelChangeGuard( static_cast<OutlineView&>(*mpView) ) ); + } + + SdrOutliner* pOwner = mpView->GetTextEditOutliner(); + bool bMasterView = false; + + DrawViewShell* pDrawViewShell = static_cast< DrawViewShell* >(mpViewShell); + + if ( pOwner && pDrawViewShell && pDrawViewShell->GetEditMode() == EM_MASTERPAGE ) + bMasterView = !pOwner->IsInUndo() && pOwner->IsUndoEnabled(); + + if( bMasterView ) + { + pOwner->UndoActionStart( OLUNDO_ATTR ); + pOLV->ToggleBullets( bBulletSwitch, sal_True, bMasterView, pNumRule, isRemoveNum ); + mpView->SetAttributes(aSetAttr); //Modify for Sym2_3151 + pOwner->UndoActionEnd( OLUNDO_ATTR ); + } + else if( pOLV ) + pOLV->ToggleBullets( bBulletSwitch, sal_True, bMasterView, pNumRule, isRemoveNum ); + else + { + sal_Bool bInMasterView = pDrawViewShell && pDrawViewShell->GetEditMode() == EM_MASTERPAGE; + SdrModel* pSdrModel = mpView->GetModel(); + sal_Bool bModelUndoEnabled = pSdrModel ? pSdrModel->IsUndoEnabled() : sal_False; + if (bInMasterView && bModelUndoEnabled) + { + pSdrModel->BegUndo(); + } + mpView->ToggleMarkedObjectsBullets(bBulletSwitch, sal_True, bInMasterView, pNumRule, isRemoveNum ); + if (bInMasterView) + { + mpView->SetAttributes(aSetAttr); + } + if (bInMasterView && bModelUndoEnabled) + { + pSdrModel->EndUndo(); + } + } + } + //End + } + delete pNumRule; + rReq.Done(); +} + +const SfxPoolItem* FuOutlineBullet::GetNumBulletItem(SfxItemSet& aNewAttr, sal_uInt32& nNumItemId) +{ + //SvxNumBulletItem* pRetItem = NULL; + const SfxPoolItem* pTmpItem = NULL; + + if(aNewAttr.GetItemState(nNumItemId, sal_False, &pTmpItem) == SFX_ITEM_SET) + { + return pTmpItem; + } + else + { + nNumItemId = aNewAttr.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE); + SfxItemState eState = aNewAttr.GetItemState(nNumItemId, sal_False, &pTmpItem); + if (eState == SFX_ITEM_SET) + return pTmpItem; + else + { + sal_Bool bOutliner = sal_False; + sal_Bool bTitle = sal_False; + + if( mpView ) + { + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + const sal_uInt32 nCount = rMarkList.GetMarkCount(); + for(sal_uInt32 nNum = 0; nNum < nCount; nNum++) + { + SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj(); + if( pObj->GetObjInventor() == SdrInventor ) + { + switch(pObj->GetObjIdentifier()) + { + case OBJ_TITLETEXT: + bTitle = sal_True; + break; + case OBJ_OUTLINETEXT: + bOutliner = sal_True; + break; + } + } + } + } + + const SvxNumBulletItem *pItem = NULL; + if(bOutliner) + { + SfxStyleSheetBasePool* pSSPool = mpView->GetDocSh()->GetStyleSheetPool(); + String aStyleName((SdResId((sal_uInt16)STR_LAYOUT_OUTLINE))); + aStyleName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " 1" ) ); + SfxStyleSheetBase* pFirstStyleSheet = pSSPool->Find( aStyleName, SD_STYLE_FAMILY_PSEUDO); + if( pFirstStyleSheet ) + pFirstStyleSheet->GetItemSet().GetItemState(EE_PARA_NUMBULLET, sal_False, (const SfxPoolItem**)&pItem); + } + + if( pItem == NULL ) + pItem = (SvxNumBulletItem*) aNewAttr.GetPool()->GetSecondaryPool()->GetPoolDefaultItem(EE_PARA_NUMBULLET); + + //DBG_ASSERT( pItem, "Kein EE_PARA_NUMBULLET im Pool! [CL]" ); + + aNewAttr.Put(*pItem, EE_PARA_NUMBULLET); + + if(bTitle && aNewAttr.GetItemState(EE_PARA_NUMBULLET,sal_True) == SFX_ITEM_ON ) + { + SvxNumBulletItem* pItem = (SvxNumBulletItem*)aNewAttr.GetItem(EE_PARA_NUMBULLET,sal_True); + SvxNumRule* pRule = pItem->GetNumRule(); + if(pRule) + { + SvxNumRule aNewRule( *pRule ); + aNewRule.SetFeatureFlag( NUM_NO_NUMBERS, sal_True ); + + SvxNumBulletItem aNewItem( aNewRule, EE_PARA_NUMBULLET ); + aNewAttr.Put(aNewItem); + } + } + + SfxItemState eState = aNewAttr.GetItemState(nNumItemId, sal_False, &pTmpItem); + if (eState == SFX_ITEM_SET) + return pTmpItem; + + } + //DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!") + } + return pTmpItem; +} } // end of namespace sd |