blob: 02e54445d7ad86977775a68569d8e5e9f50aa340 [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 <svl/whiter.hxx>
#include <svtools/imapobj.hxx>
#include <svl/srchitem.hxx>
#include <svtools/imap.hxx>
#include <sfx2/viewfrm.hxx>
#include <basic/sbstar.hxx>
#include <svl/rectitem.hxx>
#include <svl/ptitem.hxx>
#include <svl/stritem.hxx>
#include <svl/intitem.hxx>
#include <svl/eitem.hxx>
#include <editeng/colritem.hxx>
#include <editeng/bolnitem.hxx>
#include <editeng/boxitem.hxx>
#include <editeng/protitem.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/request.hxx>
#include <sfx2/objface.hxx>
#include <sfx2/sidebar/EnumContext.hxx>
#include <svx/hlnkitem.hxx>
// --> OD 2009-07-07 #i73249#
#include <svx/svdview.hxx>
#include <vcl/msgbox.hxx>
// <--
#include <doc.hxx>
#include <fmturl.hxx>
#include <fmtclds.hxx>
#include <fmtcnct.hxx>
#include <swmodule.hxx>
#include <wrtsh.hxx>
#include <wview.hxx>
#include <frmatr.hxx>
#include <uitool.hxx>
#include <frmfmt.hxx>
#include <frmsh.hxx>
#include <frmmgr.hxx>
#include <frmdlg.hxx>
#include <swevent.hxx>
#include <usrpref.hxx>
#include <edtwin.hxx>
#include <swdtflvr.hxx>
#include <swwait.hxx>
#include <docstat.hxx>
#include <IDocumentStatistics.hxx>
#include <comphelper/processfactory.hxx>
#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
#include <helpid.h>
#include <cmdid.h>
#include <cfgitems.hxx>
#include <globals.hrc>
#include <popup.hrc>
#include <shells.hrc>
#include "swabstdlg.hxx"
#include "misc.hrc"
// --> OD 2009-07-14 #i73249#
#include <svx/dialogs.hrc>
// <--
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
// Prototypen ------------------------------------------------------------
void lcl_FrmGetMaxLineWidth(const SvxBorderLine* pBorderLine, SvxBorderLine& rBorderLine);
const SwFrmFmt* lcl_GetFrmFmtByName(SwWrtShell& rSh, const String& rName)
{
sal_uInt16 nCount = rSh.GetFlyCount(FLYCNTTYPE_FRM);
for( sal_uInt16 i = 0; i < nCount; i++)
{
const SwFrmFmt* pFmt = rSh.GetFlyNum(i, FLYCNTTYPE_FRM);
if(pFmt->GetName() == rName)
return pFmt;
}
return 0;
}
#define SwFrameShell
#include <sfx2/msg.hxx>
#include "swslots.hxx"
SFX_IMPL_INTERFACE(SwFrameShell, SwBaseShell, SW_RES(STR_SHELLNAME_FRAME))
{
SFX_POPUPMENU_REGISTRATION(SW_RES(MN_FRM_POPUPMENU));
SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_FRAME_TOOLBOX));
}
void SwFrameShell::Execute(SfxRequest &rReq)
{
//Erstmal die, die keinen FrmMgr benoetigen.
SwWrtShell &rSh = GetShell();
sal_Bool bMore = sal_False;
const SfxItemSet* pArgs = rReq.GetArgs();
const SfxPoolItem* pItem;
sal_uInt16 nSlot = rReq.GetSlot();
switch ( nSlot )
{
case FN_FRAME_TO_ANCHOR:
if ( rSh.IsFrmSelected() )
{
rSh.GotoFlyAnchor();
rSh.EnterStdMode();
rSh.CallChgLnk();
}
break;
case SID_FRAME_TO_TOP:
rSh.SelectionToTop();
break;
case SID_FRAME_TO_BOTTOM:
rSh.SelectionToBottom();
break;
case FN_FRAME_UP:
rSh.SelectionToTop( sal_False );
break;
case FN_FRAME_DOWN:
rSh.SelectionToBottom( sal_False );
break;
case FN_INSERT_FRAME:
if (!pArgs)
{
// Rahmen existiert bereits, Rahmendialog zur Bearbeitung oeffnen
SfxUInt16Item aDefPage(FN_FORMAT_FRAME_DLG, TP_COLUMN);
rSh.GetView().GetViewFrame()->GetDispatcher()->Execute( FN_FORMAT_FRAME_DLG,
SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD,
&aDefPage, 0L );
}
else
{
// Rahmen existiert bereits, nur Spaltenanzahl wird geaendert
sal_uInt16 nCols = 1;
if(pArgs->GetItemState(SID_ATTR_COLUMNS, sal_False, &pItem) == SFX_ITEM_SET)
nCols = ((SfxUInt16Item *)pItem)->GetValue();
SfxItemSet aSet(GetPool(),RES_COL,RES_COL);
rSh.GetFlyFrmAttr( aSet );
SwFmtCol aCol((const SwFmtCol&)aSet.Get(RES_COL));
// GutterWidth wird nicht immer uebergeben, daher erst besorgen (siehe view2: Execute auf diesen Slot)
sal_uInt16 nGutterWidth = aCol.GetGutterWidth();
if(!nCols )
nCols++;
aCol.Init(nCols, nGutterWidth, aCol.GetWishWidth());
aSet.Put(aCol);
// Vorlagen-AutoUpdate
SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
if(pFmt && pFmt->IsAutoUpdateFmt())
{
rSh.AutoUpdateFrame(pFmt, aSet);
}
else
{
rSh.StartAllAction();
rSh.SetFlyFrmAttr( aSet );
rSh.SetModified();
rSh.EndAllAction();
}
}
return;
case SID_HYPERLINK_SETLINK:
{
if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(SID_HYPERLINK_SETLINK, sal_False, &pItem))
{
const SvxHyperlinkItem& rHLinkItem = *(const SvxHyperlinkItem *)pItem;
const String& rURL = rHLinkItem.GetURL();
const String& rTarget = rHLinkItem.GetTargetFrame();
SfxItemSet aSet( rSh.GetAttrPool(), RES_URL, RES_URL );
rSh.GetFlyFrmAttr( aSet );
SwFmtURL aURL( (SwFmtURL&)aSet.Get( RES_URL ) );
String sOldName(rHLinkItem.GetName());
String sFlyName(rSh.GetFlyName());
if (sOldName.ToUpperAscii() != sFlyName.ToUpperAscii())
{
String sName(sOldName);
sal_uInt16 i = 1;
while (rSh.FindFlyByName(sName))
{
sName = sOldName;
sName += '_';
sName += String::CreateFromInt32(i++);
}
rSh.SetFlyName(sName);
}
aURL.SetURL( rURL, sal_False );
aURL.SetTargetFrameName(rTarget);
aSet.Put( aURL );
rSh.SetFlyFrmAttr( aSet );
}
}
break;
case FN_FRAME_CHAIN:
rSh.GetView().GetEditWin().SetChainMode( !rSh.GetView().GetEditWin().IsChainMode() );
break;
case FN_FRAME_UNCHAIN:
rSh.Unchain( (SwFrmFmt&)*rSh.GetFlyFrmFmt() );
GetView().GetViewFrame()->GetBindings().Invalidate(FN_FRAME_CHAIN);
break;
case FN_FORMAT_FOOTNOTE_DLG:
{
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
VclAbstractDialog* pDlg = pFact->CreateSwFootNoteOptionDlg( GetView().GetWindow(), GetView().GetWrtShell(), DLG_DOC_FOOTNOTE );
DBG_ASSERT(pDlg, "Dialogdiet fail!");
pDlg->Execute();
delete pDlg;
break;
}
case FN_NUMBERING_OUTLINE_DLG:
{
SfxItemSet aTmp(GetPool(), FN_PARAM_1, FN_PARAM_1);
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "Dialogdiet fail!");
SfxAbstractTabDialog* pDlg = pFact->CreateSwTabDialog( DLG_TAB_OUTLINE,
GetView().GetWindow(), &aTmp, GetView().GetWrtShell());
DBG_ASSERT(pDlg, "Dialogdiet fail!");
pDlg->Execute();
delete pDlg;
rReq.Done();
break;
}
case SID_OPEN_XML_FILTERSETTINGS:
{
try
{
uno::Reference < ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString::createFromAscii("com.sun.star.comp.ui.XSLTFilterDialog")), uno::UNO_QUERY);
if( xDialog.is() )
{
xDialog->execute();
}
}
catch( uno::Exception& )
{
}
rReq.Ignore ();
}
break;
case FN_WORDCOUNT_DIALOG:
{
SwDocStat aCurr;
SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() );
{
SwWait aWait( *GetView().GetDocShell(), true );
rSh.StartAction();
rSh.CountWords( aCurr );
rSh.UpdateDocStat( aDocStat );
rSh.EndAction();
}
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "Dialogdiet fail!");
AbstractSwWordCountDialog* pDialog = pFact->CreateSwWordCountDialog( GetView().GetWindow() );
pDialog->SetValues(aCurr, aDocStat );
pDialog->Execute();
delete pDialog;
}
break;
default: bMore = sal_True;
}
if ( !bMore )
{
return;
}
SwFlyFrmAttrMgr aMgr( sal_False, &rSh, FRMMGR_TYPE_NONE );
sal_Bool bUpdateMgr = sal_True;
sal_Bool bCopyToFmt = sal_False;
switch ( nSlot )
{
case SID_OBJECT_ALIGN_MIDDLE:
case FN_FRAME_ALIGN_VERT_CENTER:
aMgr.SetVertOrientation( text::VertOrientation::CENTER );
break;
case SID_OBJECT_ALIGN_DOWN :
case FN_FRAME_ALIGN_VERT_BOTTOM:
aMgr.SetVertOrientation( text::VertOrientation::BOTTOM );
break;
case SID_OBJECT_ALIGN_UP :
case FN_FRAME_ALIGN_VERT_TOP:
aMgr.SetVertOrientation( text::VertOrientation::TOP );
break;
case FN_FRAME_ALIGN_VERT_CHAR_CENTER:
aMgr.SetVertOrientation( text::VertOrientation::CHAR_CENTER );
break;
case FN_FRAME_ALIGN_VERT_CHAR_BOTTOM:
aMgr.SetVertOrientation( text::VertOrientation::CHAR_BOTTOM );
break;
case FN_FRAME_ALIGN_VERT_CHAR_TOP:
aMgr.SetVertOrientation( text::VertOrientation::CHAR_TOP );
break;
case FN_FRAME_ALIGN_VERT_ROW_CENTER:
aMgr.SetVertOrientation( text::VertOrientation::LINE_CENTER );
break;
case FN_FRAME_ALIGN_VERT_ROW_BOTTOM:
aMgr.SetVertOrientation( text::VertOrientation::LINE_BOTTOM );
break;
case FN_FRAME_ALIGN_VERT_ROW_TOP:
aMgr.SetVertOrientation( text::VertOrientation::LINE_TOP );
break;
case SID_OBJECT_ALIGN_CENTER :
case FN_FRAME_ALIGN_HORZ_CENTER:
aMgr.SetHorzOrientation( text::HoriOrientation::CENTER );
break;
case SID_OBJECT_ALIGN_RIGHT:
case FN_FRAME_ALIGN_HORZ_RIGHT:
aMgr.SetHorzOrientation( text::HoriOrientation::RIGHT );
break;
case SID_OBJECT_ALIGN_LEFT:
case FN_FRAME_ALIGN_HORZ_LEFT:
aMgr.SetHorzOrientation( text::HoriOrientation::LEFT );
break;
case FN_SET_FRM_POSITION:
{
aMgr.SetAbsPos(((SfxPointItem &)pArgs->Get
(FN_SET_FRM_POSITION)).GetValue());
}
break;
case SID_ATTR_BRUSH:
{
if(pArgs)
{
aMgr.SetAttrSet( *pArgs );
bCopyToFmt = sal_True;
}
}
break;
case SID_ATTR_ULSPACE:
case SID_ATTR_LRSPACE:
{
if(pArgs && SFX_ITEM_SET == pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem))
{
aMgr.SetAttrSet( *pArgs );
if(SID_ATTR_ULSPACE == nSlot && SID_ATTR_ULSPACE == nSlot)
bCopyToFmt = sal_True;
}
}
break;
case SID_ATTR_TRANSFORM:
{
bool bApplyNewSize = false;
Size aNewSize = aMgr.GetSize();
if ( SFX_ITEM_SET == pArgs->GetItemState( SID_ATTR_TRANSFORM_WIDTH, sal_False, &pItem ) )
{
aNewSize.setWidth( static_cast< const SfxUInt32Item* >(pItem)->GetValue() );
bApplyNewSize = true;
}
if ( SFX_ITEM_SET == pArgs->GetItemState( SID_ATTR_TRANSFORM_HEIGHT, sal_False, &pItem ) )
{
aNewSize.setHeight( static_cast< const SfxUInt32Item* >(pItem)->GetValue() );
bApplyNewSize = true;
}
if ( bApplyNewSize )
{
aMgr.SetSize( aNewSize );
}
else
{
bUpdateMgr = sal_False;
}
}
break;
case FN_FORMAT_FRAME_DLG:
case FN_DRAW_WRAP_DLG:
{
const int nSel = rSh.GetSelectionType();
if (nSel & nsSelectionType::SEL_GRF)
{
rSh.GetView().GetViewFrame()->GetDispatcher()->Execute(FN_FORMAT_GRAFIC_DLG);
bUpdateMgr = sal_False;
}
else
{
SfxItemSet aSet(GetPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1,
SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
FN_GET_PRINT_AREA, FN_GET_PRINT_AREA,
SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
SID_ATTR_BRUSH, SID_ATTR_BRUSH,
SID_ATTR_LRSPACE, SID_ATTR_ULSPACE,
FN_SURROUND, FN_HORI_ORIENT,
FN_SET_FRM_NAME, FN_SET_FRM_NAME,
FN_KEEP_ASPECT_RATIO, FN_KEEP_ASPECT_RATIO,
SID_DOCFRAME, SID_DOCFRAME,
SID_HTML_MODE, SID_HTML_MODE,
FN_SET_FRM_ALT_NAME, FN_SET_FRM_ALT_NAME,
FN_PARAM_CHAIN_PREVIOUS, FN_PARAM_CHAIN_NEXT,
FN_OLE_IS_MATH, FN_OLE_IS_MATH,
FN_MATH_BASELINE_ALIGNMENT, FN_MATH_BASELINE_ALIGNMENT,
0);
const SwViewOption* pVOpt = rSh.GetViewOptions();
if(nSel & nsSelectionType::SEL_OLE)
aSet.Put( SfxBoolItem(FN_KEEP_ASPECT_RATIO, pVOpt->IsKeepRatio()) );
aSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell())));
aSet.Put(SfxStringItem(FN_SET_FRM_NAME, rSh.GetFlyName()));
if( nSel & nsSelectionType::SEL_OLE )
{
aSet.Put( SfxStringItem( FN_SET_FRM_ALT_NAME, rSh.GetObjTitle() ) );
}
const SwRect &rPg = rSh.GetAnyCurRect(RECT_PAGE);
SwFmtFrmSize aFrmSize(ATT_VAR_SIZE, rPg.Width(), rPg.Height());
aFrmSize.SetWhich(GetPool().GetWhich(SID_ATTR_PAGE_SIZE));
aSet.Put(aFrmSize);
const SwRect &rPr = rSh.GetAnyCurRect(RECT_PAGE_PRT);
SwFmtFrmSize aPrtSize(ATT_VAR_SIZE, rPr.Width(), rPr.Height());
aPrtSize.SetWhich(GetPool().GetWhich(FN_GET_PRINT_AREA));
aSet.Put(aPrtSize);
aSet.Put(aMgr.GetAttrSet());
aSet.SetParent( aMgr.GetAttrSet().GetParent() );
// Bei %-Werten Groesse initialisieren
SwFmtFrmSize& rSize = (SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE);
if (rSize.GetWidthPercent() && rSize.GetWidthPercent() != 0xff)
rSize.SetWidth(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Width());
if (rSize.GetHeightPercent() && rSize.GetHeightPercent() != 0xff)
rSize.SetHeight(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Height());
// disable vertical positioning for Math Objects anchored 'as char' if baseline alignment is activated
aSet.Put( SfxBoolItem( FN_MATH_BASELINE_ALIGNMENT,
rSh.GetDoc()->get( IDocumentSettingAccess::MATH_BASELINE_ALIGNMENT ) ) );
const uno::Reference < embed::XEmbeddedObject > xObj( rSh.GetOleRef() );
aSet.Put( SfxBoolItem( FN_OLE_IS_MATH, xObj.is() && SotExchange::IsMath( xObj->getClassID() ) ) );
sal_uInt16 nDefPage = 0;
if(pArgs && pArgs->GetItemState(FN_FORMAT_FRAME_DLG, sal_False, &pItem) == SFX_ITEM_SET)
nDefPage = ((SfxUInt16Item *)pItem)->GetValue();
aSet.Put(SfxFrameItem( SID_DOCFRAME, &GetView().GetViewFrame()->GetTopFrame()));
FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &GetView()));
SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric) ));
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "Dialogdiet fail!");
SfxAbstractTabDialog* pDlg = pFact->CreateFrmTabDialog( DLG_FRM_STD,
GetView().GetViewFrame(),
GetView().GetWindow(),
aSet, sal_False,
nSel & nsSelectionType::SEL_GRF ? DLG_FRM_GRF :
nSel & nsSelectionType::SEL_OLE ? DLG_FRM_OLE :
DLG_FRM_STD,
sal_False,
nDefPage);
DBG_ASSERT(pDlg, "Dialogdiet fail!");
if ( nSlot == FN_DRAW_WRAP_DLG )
{
pDlg->SetCurPageId(TP_FRM_WRAP);
}
if ( pDlg->Execute() )
{
const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
if(pOutSet)
{
rReq.Done(*pOutSet);
if(nSel & nsSelectionType::SEL_OLE &&
SFX_ITEM_SET == pOutSet->GetItemState(FN_KEEP_ASPECT_RATIO, sal_True, &pItem))
{
SwViewOption aUsrPref( *pVOpt );
aUsrPref.SetKeepRatio(((const SfxBoolItem*)pItem)->GetValue());
SW_MOD()->ApplyUsrPref(aUsrPref, &GetView());
}
if (SFX_ITEM_SET == pOutSet->GetItemState(FN_SET_FRM_ALT_NAME, sal_True, &pItem))
{
// --> OD 2009-07-13 #i73249#
// rSh.SetAlternateText(((const SfxStringItem*)pItem)->GetValue());
rSh.SetObjTitle(((const SfxStringItem*)pItem)->GetValue());
// <--
}
// Vorlagen-AutoUpdate
SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
if(pFmt && pFmt->IsAutoUpdateFmt())
{
rSh.AutoUpdateFrame(pFmt, *pOutSet);
// alles, dass das Format nicht kann, muss hart
// gesetzt werden
if(SFX_ITEM_SET == pOutSet->GetItemState(FN_SET_FRM_NAME, sal_False, &pItem))
rSh.SetFlyName(((SfxStringItem*)pItem)->GetValue());
SfxItemSet aShellSet(GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
RES_SURROUND, RES_SURROUND,
RES_ANCHOR, RES_ANCHOR,
RES_VERT_ORIENT,RES_HORI_ORIENT,
0);
aShellSet.Put(*pOutSet);
aMgr.SetAttrSet(aShellSet);
if(SFX_ITEM_SET == pOutSet->GetItemState(FN_SET_FRM_NAME, sal_False, &pItem))
rSh.SetFlyName(((SfxStringItem*)pItem)->GetValue());
}
else
aMgr.SetAttrSet( *pOutSet );
const SwFrmFmt* pCurrFlyFmt = rSh.GetFlyFrmFmt();
if(SFX_ITEM_SET ==
pOutSet->GetItemState(FN_PARAM_CHAIN_PREVIOUS,
sal_False, &pItem))
{
rSh.HideChainMarker();
String sPrevName =
((const SfxStringItem*)pItem)->GetValue();
const SwFmtChain &rChain = pCurrFlyFmt->GetChain();
//needs cast - no non-const method available
SwFlyFrmFmt* pFlyFmt =
(SwFlyFrmFmt*)rChain.GetPrev();
if(pFlyFmt)
{
if (pFlyFmt->GetName() != sPrevName)
{
rSh.Unchain(*pFlyFmt);
}
else
sPrevName.Erase();
}
if(sPrevName.Len())
{
//needs cast - no non-const method available
SwFrmFmt* pPrevFmt = (SwFrmFmt*)
lcl_GetFrmFmtByName(rSh, sPrevName);
DBG_ASSERT(pPrevFmt, "No frame found!");
if(pPrevFmt)
{
rSh.Chain(*pPrevFmt, *pCurrFlyFmt);
}
}
rSh.SetChainMarker();
}
if(SFX_ITEM_SET ==
pOutSet->GetItemState(FN_PARAM_CHAIN_NEXT, sal_False,
&pItem))
{
rSh.HideChainMarker();
String sNextName =
((const SfxStringItem*)pItem)->GetValue();
const SwFmtChain &rChain = pCurrFlyFmt->GetChain();
//needs cast - no non-const method available
SwFlyFrmFmt* pFlyFmt =
(SwFlyFrmFmt*)rChain.GetNext();
if(pFlyFmt)
{
if (pFlyFmt->GetName() != sNextName)
{
rSh.Unchain(*((SwFlyFrmFmt*) pCurrFlyFmt));
}
else
sNextName.Erase();
}
if(sNextName.Len())
{
//needs cast - no non-const method available
SwFrmFmt* pNextFmt = (SwFrmFmt*)
lcl_GetFrmFmtByName(rSh, sNextName);
DBG_ASSERT(pNextFmt, "No frame found!");
if(pNextFmt)
{
rSh.Chain(*(SwFrmFmt*)
pCurrFlyFmt, *pNextFmt);
}
}
rSh.SetChainMarker();
}
}
}
else
bUpdateMgr = sal_False;
delete pDlg;
}
}
break;
case FN_FRAME_MIRROR_ON_EVEN_PAGES:
{
SwFmtHoriOrient aHori(aMgr.GetHoriOrient());
sal_Bool bMirror = !aHori.IsPosToggle();
aHori.SetPosToggle(bMirror);
SfxItemSet aSet(GetPool(), RES_HORI_ORIENT, RES_HORI_ORIENT);
aSet.Put(aHori);
aMgr.SetAttrSet(aSet);
bCopyToFmt = sal_True;
rReq.SetReturnValue(SfxBoolItem(nSlot, bMirror));
}
break;
// --> OD 2009-07-14 #i73249#
case FN_TITLE_DESCRIPTION_SHAPE:
{
bUpdateMgr = sal_False;
SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList();
if ( pSdrView &&
pSdrView->GetMarkedObjectCount() == 1 )
{
String aDescription(rSh.GetObjDescription());
String aTitle(rSh.GetObjTitle());
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
OSL_ENSURE(pFact, "Dialogdiet fail!");
AbstractSvxObjectTitleDescDialog* pDlg =
pFact->CreateSvxObjectTitleDescDialog( NULL,
aTitle,
aDescription );
OSL_ENSURE(pDlg, "Dialogdiet fail!");
if ( pDlg->Execute() == RET_OK )
{
pDlg->GetDescription(aDescription);
pDlg->GetTitle(aTitle);
rSh.SetObjDescription(aDescription);
rSh.SetObjTitle(aTitle);
}
delete pDlg;
}
}
break;
// <--
default:
ASSERT( !this, "falscher Dispatcher" );
return;
}
if ( bUpdateMgr )
{
SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
if ( bCopyToFmt && pFmt && pFmt->IsAutoUpdateFmt() )
{
rSh.AutoUpdateFrame(pFmt, aMgr.GetAttrSet());
}
else
{
aMgr.UpdateFlyFrm();
}
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void SwFrameShell::GetState(SfxItemSet& rSet)
{
SwWrtShell &rSh = GetShell();
sal_Bool bHtmlMode = 0 != ::GetHtmlMode(rSh.GetView().GetDocShell());
if (rSh.IsFrmSelected())
{
SfxItemSet aSet( rSh.GetAttrPool(),
RES_LR_SPACE, RES_UL_SPACE,
RES_PROTECT, RES_HORI_ORIENT,
RES_OPAQUE, RES_OPAQUE,
RES_PRINT, RES_OPAQUE,
0 );
rSh.GetFlyFrmAttr( aSet );
sal_Bool bProtect = rSh.IsSelObjProtected(FLYPROTECT_POS);
sal_Bool bParentCntProt = rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0;
bProtect |= bParentCntProt;
const sal_uInt16 eFrmType = rSh.GetFrmType(0,sal_True);
SwFlyFrmAttrMgr aMgr( sal_False, &rSh, FRMMGR_TYPE_NONE );
SfxWhichIter aIter( rSet );
sal_uInt16 nWhich = aIter.FirstWhich();
while ( nWhich )
{
switch ( nWhich )
{
case RES_FRM_SIZE:
{
SwFmtFrmSize aSz(aMgr.GetFrmSize());
rSet.Put(aSz);
}
break;
case RES_VERT_ORIENT:
case RES_HORI_ORIENT:
case SID_ATTR_ULSPACE:
case SID_ATTR_LRSPACE:
case RES_LR_SPACE:
case RES_UL_SPACE:
case RES_PROTECT:
case RES_OPAQUE:
case RES_PRINT:
case RES_SURROUND:
{
rSet.Put(aSet.Get(GetPool().GetWhich(nWhich), sal_True ));
}
break;
case SID_OBJECT_ALIGN_LEFT :
case SID_OBJECT_ALIGN_CENTER :
case SID_OBJECT_ALIGN_RIGHT :
case FN_FRAME_ALIGN_HORZ_CENTER:
case FN_FRAME_ALIGN_HORZ_RIGHT:
case FN_FRAME_ALIGN_HORZ_LEFT:
if ( (eFrmType & FRMTYPE_FLY_INCNT) ||
bProtect ||
((nWhich == FN_FRAME_ALIGN_HORZ_CENTER || nWhich == SID_OBJECT_ALIGN_CENTER)&& bHtmlMode) )
rSet.DisableItem( nWhich );
break;
case FN_FRAME_ALIGN_VERT_ROW_TOP:
case FN_FRAME_ALIGN_VERT_ROW_CENTER:
case FN_FRAME_ALIGN_VERT_ROW_BOTTOM:
case FN_FRAME_ALIGN_VERT_CHAR_TOP:
case FN_FRAME_ALIGN_VERT_CHAR_CENTER:
case FN_FRAME_ALIGN_VERT_CHAR_BOTTOM:
if ( !(eFrmType & FRMTYPE_FLY_INCNT) || bProtect
|| (bHtmlMode && FN_FRAME_ALIGN_VERT_CHAR_BOTTOM == nWhich) )
rSet.DisableItem( nWhich );
break;
case SID_OBJECT_ALIGN_UP :
case SID_OBJECT_ALIGN_MIDDLE :
case SID_OBJECT_ALIGN_DOWN :
case FN_FRAME_ALIGN_VERT_TOP:
case FN_FRAME_ALIGN_VERT_CENTER:
case FN_FRAME_ALIGN_VERT_BOTTOM:
if ( bProtect || (bHtmlMode && eFrmType & FRMTYPE_FLY_ATCNT) )
rSet.DisableItem( nWhich );
else
{
sal_uInt16 nId = 0;
if (eFrmType & FRMTYPE_FLY_INCNT)
{
switch (nWhich)
{
case SID_OBJECT_ALIGN_UP :
case FN_FRAME_ALIGN_VERT_TOP:
nId = STR_TOP_BASE; break;
case SID_OBJECT_ALIGN_MIDDLE :
case FN_FRAME_ALIGN_VERT_CENTER:
nId = STR_CENTER_BASE; break;
case SID_OBJECT_ALIGN_DOWN :
case FN_FRAME_ALIGN_VERT_BOTTOM:
if(!bHtmlMode)
nId = STR_BOTTOM_BASE;
else
rSet.DisableItem( nWhich );
break;
}
}
else
{
if (nWhich != FN_FRAME_ALIGN_VERT_TOP &&
nWhich != SID_OBJECT_ALIGN_UP )
{
if (aMgr.GetAnchor() == FLY_AT_FLY)
{
const SwFrmFmt* pFmt = rSh.IsFlyInFly();
if (pFmt)
{
const SwFmtFrmSize& rFrmSz = pFmt->GetFrmSize();
if (rFrmSz.GetHeightSizeType() != ATT_FIX_SIZE)
{
rSet.DisableItem( nWhich );
break;
}
}
}
}
switch (nWhich)
{
case SID_OBJECT_ALIGN_UP :
case FN_FRAME_ALIGN_VERT_TOP:
nId = STR_TOP; break;
case SID_OBJECT_ALIGN_MIDDLE:
case FN_FRAME_ALIGN_VERT_CENTER:
nId = STR_CENTER_VERT; break;
case SID_OBJECT_ALIGN_DOWN:
case FN_FRAME_ALIGN_VERT_BOTTOM:
nId = STR_BOTTOM; break;
}
}
if ( nId )
rSet.Put( SfxStringItem( nWhich, SW_RES(nId) ));
}
break;
case SID_HYPERLINK_GETLINK:
{
String sURL;
SvxHyperlinkItem aHLinkItem;
const SfxPoolItem* pItem;
SfxItemSet aURLSet(GetPool(), RES_URL, RES_URL);
rSh.GetFlyFrmAttr( aURLSet );
if(SFX_ITEM_SET == aURLSet.GetItemState(RES_URL, sal_True, &pItem))
{
const SwFmtURL* pFmtURL = (const SwFmtURL*)pItem;
aHLinkItem.SetURL(pFmtURL->GetURL());
aHLinkItem.SetTargetFrame(pFmtURL->GetTargetFrameName());
aHLinkItem.SetName(rSh.GetFlyName());
}
aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
(bHtmlMode ? HLINK_HTMLMODE : 0)));
rSet.Put(aHLinkItem);
}
break;
case FN_FRAME_CHAIN:
{
const int nSel = rSh.GetSelectionType();
if (nSel & nsSelectionType::SEL_GRF || nSel & nsSelectionType::SEL_OLE)
rSet.DisableItem( FN_FRAME_CHAIN );
else
{
const SwFrmFmt *pFmt = rSh.GetFlyFrmFmt();
if ( bParentCntProt || rSh.GetView().GetEditWin().GetApplyTemplate() ||
!pFmt || pFmt->GetChain().GetNext() )
{
rSet.DisableItem( FN_FRAME_CHAIN );
}
else
{
sal_Bool bChainMode = rSh.GetView().GetEditWin().IsChainMode();
rSet.Put( SfxBoolItem( FN_FRAME_CHAIN, bChainMode ) );
}
}
}
break;
case FN_FRAME_UNCHAIN:
{
const int nSel = rSh.GetSelectionType();
if (nSel & nsSelectionType::SEL_GRF || nSel & nsSelectionType::SEL_OLE)
rSet.DisableItem( FN_FRAME_UNCHAIN );
else
{
const SwFrmFmt *pFmt = rSh.GetFlyFrmFmt();
if ( bParentCntProt || rSh.GetView().GetEditWin().GetApplyTemplate() ||
!pFmt || !pFmt->GetChain().GetNext() )
{
rSet.DisableItem( FN_FRAME_UNCHAIN );
}
}
}
break;
case SID_FRAME_TO_TOP:
case SID_FRAME_TO_BOTTOM:
case FN_FRAME_UP:
case FN_FRAME_DOWN:
if ( bParentCntProt )
rSet.DisableItem( nWhich );
break;
case SID_ATTR_TRANSFORM:
{
rSet.DisableItem( nWhich );
}
break;
case SID_ATTR_TRANSFORM_PROTECT_SIZE:
{
const sal_uInt8 eProtection = rSh.IsSelObjProtected( FLYPROTECT_SIZE );
if ( ( eProtection & FLYPROTECT_CONTENT ) ||
( eProtection & FLYPROTECT_SIZE ) )
{
rSet.Put( SfxBoolItem( SID_ATTR_TRANSFORM_PROTECT_SIZE, sal_True ) );
}
else
{
rSet.Put( SfxBoolItem( SID_ATTR_TRANSFORM_PROTECT_SIZE, sal_False ) );
}
}
break;
case SID_ATTR_TRANSFORM_WIDTH:
{
rSet.Put( SfxUInt32Item( SID_ATTR_TRANSFORM_WIDTH, aMgr.GetSize().getWidth() ) );
}
break;
case SID_ATTR_TRANSFORM_HEIGHT:
{
rSet.Put( SfxUInt32Item( SID_ATTR_TRANSFORM_HEIGHT, aMgr.GetSize().getHeight() ) );
}
break;
case FN_FORMAT_FRAME_DLG:
{
const int nSel = rSh.GetSelectionType();
if ( bParentCntProt || nSel & nsSelectionType::SEL_GRF)
rSet.DisableItem( nWhich );
}
break;
case FN_TITLE_DESCRIPTION_SHAPE:
{
SwWrtShell &rWrtSh = GetShell();
SdrView* pSdrView = rWrtSh.GetDrawViewWithValidMarkList();
if ( !pSdrView ||
pSdrView->GetMarkedObjectCount() != 1 )
{
rSet.DisableItem( nWhich );
}
}
break;
default:
/* do nothing */;
break;
}
nWhich = aIter.NextWhich();
}
}
}
/*--------------------------------------------------------------------
Beschreibung: Ctor fuer FrameShell
--------------------------------------------------------------------*/
SwFrameShell::SwFrameShell(SwView &_rView) :
SwBaseShell( _rView )
{
SetName(String::CreateFromAscii("Frame"));
SetHelpId(SW_FRAMESHELL);
/* #96392# Use this to announce it is the frame shell who creates the
selection. */
SwTransferable::CreateSelection( _rView.GetWrtShell(), (ViewShell *) this );
SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Frame));
}
SwFrameShell::~SwFrameShell()
{
/* #96392# Only clear the selection if it was this frame shell who created
it. */
SwTransferable::ClearSelection( GetShell(), (ViewShell *) this );
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void SwFrameShell::ExecFrameStyle(SfxRequest& rReq)
{
SwWrtShell &rSh = GetShell();
sal_Bool bDefault = sal_False;
if (!rSh.IsFrmSelected())
return;
// Erst Default-BoxItem aus Pool holen. Wenn ungleich normalem Boxitem,
// dann ist es bereits geaendert worden (neues ist kein Default).
const SvxBoxItem* pPoolBoxItem = (const SvxBoxItem*)::GetDfltAttr(RES_BOX);
const SfxItemSet *pArgs = rReq.GetArgs();
SfxItemSet aFrameSet(rSh.GetAttrPool(), RES_BOX, RES_BOX);
rSh.GetFlyFrmAttr( aFrameSet );
const SvxBoxItem& rBoxItem = (const SvxBoxItem&)aFrameSet.Get(RES_BOX);
if (pPoolBoxItem == &rBoxItem)
bDefault = sal_True;
SvxBoxItem aBoxItem(rBoxItem);
SvxBorderLine aBorderLine;
const SfxPoolItem *pItem = 0;
if(pArgs) //irgendein Controller kann auch mal nichts liefern #48169#
{
switch (rReq.GetSlot())
{
case SID_ATTR_BORDER:
{
if (pArgs->GetItemState(RES_BOX, sal_True, &pItem) == SFX_ITEM_SET)
{
SvxBoxItem aNewBox(*((SvxBoxItem *)pItem));
const SvxBorderLine* pBorderLine;
if ((pBorderLine = aBoxItem.GetTop()) != NULL)
lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);
if ((pBorderLine = aBoxItem.GetBottom()) != NULL)
lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);
if ((pBorderLine = aBoxItem.GetLeft()) != NULL)
lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);
if ((pBorderLine = aBoxItem.GetRight()) != NULL)
lcl_FrmGetMaxLineWidth(pBorderLine, aBorderLine);
if(aBorderLine.GetOutWidth() == 0)
{
aBorderLine.SetInWidth(0);
aBorderLine.SetOutWidth(DEF_LINE_WIDTH_0);
aBorderLine.SetDistance(0);
}
//Distance nur setzen, wenn der Request vom Controller kommt
if(!StarBASIC::IsRunning())
{
aNewBox.SetDistance( rBoxItem.GetDistance() );
}
aBoxItem = aNewBox;
SvxBorderLine aDestBorderLine;
if ((pBorderLine = aBoxItem.GetTop()) != NULL)
aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
if ((pBorderLine = aBoxItem.GetBottom()) != NULL)
aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
if ((pBorderLine = aBoxItem.GetLeft()) != NULL)
aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
if ((pBorderLine = aBoxItem.GetRight()) != NULL)
aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
}
}
break;
case SID_FRAME_LINESTYLE:
{
if (pArgs->GetItemState(SID_FRAME_LINESTYLE, sal_False, &pItem) == SFX_ITEM_SET)
{
const SvxLineItem* pLineItem =
(const SvxLineItem*)pItem;
if ( pLineItem->GetLine() )
{
aBorderLine = *(pLineItem->GetLine());
if (!aBoxItem.GetTop() && !aBoxItem.GetBottom() &&
!aBoxItem.GetLeft() && !aBoxItem.GetRight())
{
aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
}
else
{
if( aBoxItem.GetTop() )
{
aBorderLine.SetColor( aBoxItem.GetTop()->GetColor() );
aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
}
if( aBoxItem.GetBottom() )
{
aBorderLine.SetColor( aBoxItem.GetBottom()->GetColor());
aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
}
if( aBoxItem.GetLeft() )
{
aBorderLine.SetColor( aBoxItem.GetLeft()->GetColor());
aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
}
if( aBoxItem.GetRight() )
{
aBorderLine.SetColor(aBoxItem.GetRight()->GetColor());
aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
}
}
}
else
{
aBoxItem.SetLine(0, BOX_LINE_TOP);
aBoxItem.SetLine(0, BOX_LINE_BOTTOM);
aBoxItem.SetLine(0, BOX_LINE_LEFT);
aBoxItem.SetLine(0, BOX_LINE_RIGHT);
}
}
}
break;
case SID_FRAME_LINECOLOR:
{
if (pArgs->GetItemState(SID_FRAME_LINECOLOR, sal_False, &pItem) == SFX_ITEM_SET)
{
const Color& rNewColor = ((const SvxColorItem*)pItem)->GetValue();
if (!aBoxItem.GetTop() && !aBoxItem.GetBottom() &&
!aBoxItem.GetLeft() && !aBoxItem.GetRight())
{
aBorderLine.SetColor( rNewColor );
aBoxItem.SetLine(&aBorderLine, BOX_LINE_TOP);
aBoxItem.SetLine(&aBorderLine, BOX_LINE_BOTTOM);
aBoxItem.SetLine(&aBorderLine, BOX_LINE_LEFT);
aBoxItem.SetLine(&aBorderLine, BOX_LINE_RIGHT);
}
else
{
if ( aBoxItem.GetTop() )
((SvxBorderLine*)aBoxItem.GetTop())->SetColor( rNewColor );
if ( aBoxItem.GetBottom() )
((SvxBorderLine*)aBoxItem.GetBottom())->SetColor( rNewColor );
if ( aBoxItem.GetLeft() )
((SvxBorderLine*)aBoxItem.GetLeft())->SetColor( rNewColor );
if ( aBoxItem.GetRight() )
((SvxBorderLine*)aBoxItem.GetRight())->SetColor( rNewColor );
}
}
}
break;
}
}
if (bDefault && (aBoxItem.GetTop() || aBoxItem.GetBottom() ||
aBoxItem.GetLeft() || aBoxItem.GetRight()))
{
aBoxItem.SetDistance(MIN_BORDER_DIST);
}
aFrameSet.Put( aBoxItem );
// Vorlagen-AutoUpdate
SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
if(pFmt && pFmt->IsAutoUpdateFmt())
{
rSh.AutoUpdateFrame(pFmt, aFrameSet);
}
else
rSh.SetFlyFrmAttr( aFrameSet );
}
void lcl_FrmGetMaxLineWidth(const SvxBorderLine* pBorderLine, SvxBorderLine& rBorderLine)
{
if(pBorderLine->GetInWidth() > rBorderLine.GetInWidth())
rBorderLine.SetInWidth(pBorderLine->GetInWidth());
if(pBorderLine->GetOutWidth() > rBorderLine.GetOutWidth())
rBorderLine.SetOutWidth(pBorderLine->GetOutWidth());
if(pBorderLine->GetDistance() > rBorderLine.GetDistance())
rBorderLine.SetDistance(pBorderLine->GetDistance());
rBorderLine.SetColor(pBorderLine->GetColor());
}
void SwFrameShell::GetLineStyleState(SfxItemSet &rSet)
{
SwWrtShell &rSh = GetShell();
sal_Bool bParentCntProt = rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0;
if (bParentCntProt)
{
if (rSh.IsFrmSelected())
rSet.DisableItem( SID_FRAME_LINECOLOR );
rSet.DisableItem( SID_ATTR_BORDER );
rSet.DisableItem( SID_FRAME_LINESTYLE );
}
else
{
if (rSh.IsFrmSelected())
{
SfxItemSet aFrameSet( rSh.GetAttrPool(), RES_BOX, RES_BOX );
rSh.GetFlyFrmAttr(aFrameSet);
const SvxBorderLine* pLine = ((const SvxBoxItem&)aFrameSet.Get(RES_BOX)).GetTop();
rSet.Put(SvxColorItem(pLine ? pLine->GetColor() : Color(), SID_FRAME_LINECOLOR));
}
}
}
void SwFrameShell::StateInsert(SfxItemSet &rSet)
{
const int nSel = GetShell().GetSelectionType();
if ( (nSel & nsSelectionType::SEL_GRF)
|| (nSel & nsSelectionType::SEL_OLE) )
{
rSet.DisableItem(FN_INSERT_FRAME);
}
else if ( GetShell().CrsrInsideInputFld() )
{
rSet.DisableItem(FN_INSERT_FRAME);
}
}