blob: 8b9136f85309c24d5fda858aa1b93261975ded0f [file] [log] [blame]
/**************************************************************
*
* 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 <vcl/msgbox.hxx>
#include <sfx2/request.hxx>
#include <svl/eitem.hxx>
#include <svl/stritem.hxx>
#include <editeng/numitem.hxx>
#include <editeng/brshitem.hxx>
#include <numrule.hxx>
#include "cmdid.h"
#include "wrtsh.hxx"
#include "view.hxx"
#include "viewopt.hxx"
#include "wdocsh.hxx"
#include "textsh.hxx"
#include "uiitems.hxx"
#include "swabstdlg.hxx"
#include <globals.hrc>
#include <sfx2/tabdlg.hxx>
#include <svx/nbdtmg.hxx>
#include <svx/nbdtmgfact.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/bindings.hxx>
void SwTextShell::ExecEnterNum(SfxRequest &rReq)
{
//wg. Aufzeichnung schon vor dem evtl. Shellwechsel
switch(rReq.GetSlot())
{
case FN_NUM_NUMBERING_ON:
{
GetShell().StartAllAction();
SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
sal_Bool bMode = !GetShell().SelectionHasNumber(); // #i29560#
if ( pItem )
bMode = pItem->GetValue();
else
rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
if ( bMode != (GetShell().SelectionHasNumber()) ) // #i29560#
{
rReq.Done();
if( bMode )
GetShell().NumOn();
else
GetShell().NumOrBulletOff(); // #i29560#
}
sal_Bool bNewResult = GetShell().SelectionHasNumber();
if (bNewResult!=bMode) {
SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
SfxBoolItem aItem(FN_NUM_NUMBERING_ON,!bNewResult);
rBindings.SetState(aItem);
SfxBoolItem aNewItem(FN_NUM_NUMBERING_ON,bNewResult);
rBindings.SetState(aNewItem);
}
GetShell().EndAllAction();
}
break;
case FN_NUM_BULLET_ON:
{
GetShell().StartAllAction();
SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FN_PARAM_1 , sal_False );
sal_Bool bMode = !GetShell().SelectionHasBullet(); // #i29560#
if ( pItem )
bMode = pItem->GetValue();
else
rReq.AppendItem( SfxBoolItem( FN_PARAM_1, bMode ) );
if ( bMode != (GetShell().SelectionHasBullet()) ) // #i29560#
{
rReq.Done();
if( bMode )
GetShell().BulletOn();
else
GetShell().NumOrBulletOff(); // #i29560#
}
sal_Bool bNewResult = GetShell().SelectionHasBullet();
if (bNewResult!=bMode) {
SfxBindings& rBindings = GetView().GetViewFrame()->GetBindings();
SfxBoolItem aItem(FN_NUM_BULLET_ON,!bNewResult);
rBindings.SetState(aItem);
SfxBoolItem aNewItem(FN_NUM_BULLET_ON,bNewResult);
rBindings.SetState(aNewItem);
}
GetShell().EndAllAction();
}
break;
case FN_NUMBER_BULLETS:
case SID_OUTLINE_BULLET:
{
SfxItemSet aSet( GetPool(),
SID_HTML_MODE, SID_HTML_MODE,
SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL,
0 );
SwDocShell* pDocSh = GetView().GetDocShell();
const bool bHtml = 0 != PTR_CAST( SwWebDocShell, pDocSh );
const SwNumRule* pNumRuleAtCurrentSelection = GetShell().GetNumRuleAtCurrentSelection();
if ( pNumRuleAtCurrentSelection != NULL )
{
SvxNumRule aRule = pNumRuleAtCurrentSelection->MakeSvxNumRule();
//convert type of linked bitmaps from SVX_NUM_BITMAP to (SVX_NUM_BITMAP|LINK_TOKEN)
for ( sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++ )
{
SvxNumberFormat aFmt( aRule.GetLevel( i ) );
if ( SVX_NUM_BITMAP == aFmt.GetNumberingType() )
{
const SvxBrushItem* pBrush = aFmt.GetBrush();
const String* pLinkStr = pBrush != NULL
? pBrush->GetGraphicLink()
: NULL;
if ( pLinkStr != NULL && pLinkStr->Len() > 0 )
{
aFmt.SetNumberingType( SvxExtNumType( SVX_NUM_BITMAP | LINK_TOKEN ) );
}
aRule.SetLevel( i, aFmt, aRule.Get( i ) != 0 );
}
}
if ( bHtml )
aRule.SetFeatureFlag( NUM_ENABLE_EMBEDDED_BMP, sal_False );
aSet.Put( SvxNumBulletItem( aRule ) );
ASSERT( GetShell().GetNumLevel() < MAXLEVEL,
"<SwTextShell::ExecEnterNum()> - numbered node without valid list level. Serious defect -> please inform OD." );
sal_uInt16 nLevel = GetShell().GetNumLevel();
if ( nLevel < MAXLEVEL )
{
nLevel = 1 << nLevel;
aSet.Put( SfxUInt16Item( SID_PARAM_CUR_NUM_LEVEL, nLevel ) );
}
}
else
{
SwNumRule aRule( GetShell().GetUniqueNumRuleName(),
numfunc::GetDefaultPositionAndSpaceMode() );
SvxNumRule aSvxRule = aRule.MakeSvxNumRule();
const bool bRightToLeft = GetShell().IsInRightToLeftText( 0 );
if ( bHtml || bRightToLeft )
{
for ( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
{
SvxNumberFormat aFmt( aSvxRule.GetLevel( n ) );
if ( n && bHtml )
{
// 1/2" fuer HTML
aFmt.SetLSpace( 720 );
aFmt.SetAbsLSpace( n * 720 );
}
// Default alignment for numbering/bullet should be rtl in rtl paragraph:
if ( bRightToLeft )
{
aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
}
aSvxRule.SetLevel( n, aFmt, sal_False );
}
aSvxRule.SetFeatureFlag( NUM_ENABLE_EMBEDDED_BMP, sal_False );
}
aSet.Put( SvxNumBulletItem( aSvxRule ) );
}
aSet.Put( SfxBoolItem( SID_PARAM_NUM_PRESET, sal_False ) );
// vor dem Dialog wird der HtmlMode an der DocShell versenkt
pDocSh->PutItem( SfxUInt16Item( SID_HTML_MODE, ::GetHtmlMode( pDocSh ) ) );
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT( pFact, "Dialogdiet fail!" );
SfxAbstractTabDialog* pDlg =
pFact->CreateSwTabDialog( DLG_SVXTEST_NUM_BULLET, GetView().GetWindow(), &aSet, GetShell() );
DBG_ASSERT(pDlg, "Dialogdiet fail!");
const sal_uInt16 nRet = pDlg->Execute();
const SfxPoolItem* pItem;
if ( RET_OK == nRet )
{
if ( SFX_ITEM_SET == pDlg->GetOutputItemSet()->GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ) )
{
rReq.AppendItem( *pItem );
rReq.Done();
SvxNumRule* pSetRule = ( (SvxNumBulletItem*) pItem )->GetNumRule();
pSetRule->UnLinkGraphics();
SwNumRule aSetRule( pNumRuleAtCurrentSelection != NULL
? pNumRuleAtCurrentSelection->GetName()
: GetShell().GetUniqueNumRuleName(),
numfunc::GetDefaultPositionAndSpaceMode() );
aSetRule.SetSvxRule( *pSetRule, GetShell().GetDoc() );
aSetRule.SetAutoRule( sal_True );
// No start of new list, if an existing list style is edited.
// Otherwise start a new list.
const bool bCreateList = ( pNumRuleAtCurrentSelection == NULL );
GetShell().SetCurNumRule( aSetRule, bCreateList );
}
// wenn der Dialog mit OK verlassen wurde, aber nichts ausgewaehlt
// wurde dann muss die Numerierung zumindest eingeschaltet werden,
// wenn sie das noch nicht ist
else if ( pNumRuleAtCurrentSelection == NULL
&& SFX_ITEM_SET == aSet.GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem ) )
{
rReq.AppendItem( *pItem );
rReq.Done();
SvxNumRule* pSetRule = ( (SvxNumBulletItem*) pItem )->GetNumRule();
SwNumRule aSetRule(
GetShell().GetUniqueNumRuleName(),
numfunc::GetDefaultPositionAndSpaceMode() );
aSetRule.SetSvxRule( *pSetRule, GetShell().GetDoc() );
aSetRule.SetAutoRule( sal_True );
// start new list
GetShell().SetCurNumRule( aSetRule, true );
}
}
else if ( RET_USER == nRet )
GetShell().DelNumRules();
delete pDlg;
}
break;
default:
ASSERT( sal_False, "wrong Dispatcher" );
return;
}
}
void SwTextShell::ExecSetNumber(SfxRequest &rReq)
{
const sal_uInt16 nSlot = rReq.GetSlot();
switch ( nSlot )
{
case FN_SVX_SET_NUMBER:
case FN_SVX_SET_BULLET:
{
SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, nSlot, sal_False );
if ( pItem != NULL )
{
const sal_uInt16 nChoosenItemIdx = pItem->GetValue();
if ( nChoosenItemIdx == DEFAULT_NONE )
{
GetShell().DelNumRules();
}
else
{
svx::sidebar::NBOTypeMgrBase* pNBOTypeMgr =
nSlot == FN_SVX_SET_NUMBER
? svx::sidebar::NBOutlineTypeMgrFact::CreateInstance( svx::sidebar::eNBOType::NUMBERING )
: svx::sidebar::NBOutlineTypeMgrFact::CreateInstance( svx::sidebar::eNBOType::MIXBULLETS );
if ( pNBOTypeMgr != NULL )
{
const SwNumRule* pNumRuleAtCurrentSelection = GetShell().GetNumRuleAtCurrentSelection();
sal_uInt16 nActNumLvl = (sal_uInt16) 0xFFFF;
if ( pNumRuleAtCurrentSelection != NULL )
{
sal_uInt16 nLevel = GetShell().GetNumLevel();
if ( nLevel < MAXLEVEL )
{
nActNumLvl = 1 << nLevel;
}
}
SwNumRule aNewNumRule(
pNumRuleAtCurrentSelection != NULL ? pNumRuleAtCurrentSelection->GetName() : GetShell().GetUniqueNumRuleName(),
numfunc::GetDefaultPositionAndSpaceMode() );
SvxNumRule aNewSvxNumRule = pNumRuleAtCurrentSelection != NULL
? pNumRuleAtCurrentSelection->MakeSvxNumRule()
: aNewNumRule.MakeSvxNumRule();
// set unit attribute to NB Manager
SfxItemSet aSet( GetPool(), SID_ATTR_NUMBERING_RULE, SID_PARAM_CUR_NUM_LEVEL, 0 );
aSet.Put( SvxNumBulletItem( aNewSvxNumRule ) );
pNBOTypeMgr->SetItems( &aSet );
pNBOTypeMgr->ApplyNumRule( aNewSvxNumRule, nChoosenItemIdx - 1, nActNumLvl );
aNewNumRule.SetSvxRule( aNewSvxNumRule, GetShell().GetDoc() );
aNewNumRule.SetAutoRule( sal_True );
const bool bCreateNewList = ( pNumRuleAtCurrentSelection == NULL );
GetShell().SetCurNumRule( aNewNumRule, bCreateNewList );
}
}
}
}
break;
default:
ASSERT( sal_False, "wrong Dispatcher" );
return;
}
}