diff options
Diffstat (limited to 'sw/source/ui/frmdlg/wrap.cxx')
-rw-r--r-- | sw/source/ui/frmdlg/wrap.cxx | 631 |
1 files changed, 631 insertions, 0 deletions
diff --git a/sw/source/ui/frmdlg/wrap.cxx b/sw/source/ui/frmdlg/wrap.cxx new file mode 100644 index 000000000..4db38e12f --- /dev/null +++ b/sw/source/ui/frmdlg/wrap.cxx @@ -0,0 +1,631 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <hintids.hxx> +#include <vcl/graph.hxx> + +#include <sfx2/htmlmode.hxx> +#include <sfx2/objsh.hxx> +#include <svl/intitem.hxx> +#include <editeng/opaqitem.hxx> +#include <editeng/ulspitem.hxx> +#include <editeng/lrspitem.hxx> +#include <fmtfollowtextflow.hxx> +#include <svtools/unitconv.hxx> +#include <svx/swframevalidation.hxx> + +#include <cmdid.h> +#include <docsh.hxx> +#include <uitool.hxx> +#include <wrtsh.hxx> +#include <swmodule.hxx> +#include <viewopt.hxx> +#include <fmtsrnd.hxx> +#include <frmmgr.hxx> +#include <wrap.hxx> +#include <bitmaps.hlst> +#include <fmtwrapinfluenceonobjpos.hxx> + +using namespace ::com::sun::star; + +const WhichRangesContainer SwWrapTabPage::m_aWrapPageRg(svl::Items< + RES_LR_SPACE, RES_UL_SPACE, + RES_PRINT, RES_PRINT, + RES_PROTECT, RES_SURROUND +>); + +SwWrapDlg::SwWrapDlg(weld::Window* pParent, const SfxItemSet& rSet, SwWrtShell* pWrtShell, bool bDrawMode) + : SfxSingleTabDialogController(pParent, &rSet, "modules/swriter/ui/wrapdialog.ui", "WrapDialog") +{ + // create TabPage + auto xNewPage = SwWrapTabPage::Create(get_content_area(), this, &rSet); + SwWrapTabPage* pWrapPage = static_cast<SwWrapTabPage*>(xNewPage.get()); + pWrapPage->SetFormatUsed(false, bDrawMode); + pWrapPage->SetShell(pWrtShell); + SetTabPage(std::move(xNewPage)); +} + +SwWrapTabPage::SwWrapTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet &rSet) + : SfxTabPage(pPage, pController, "modules/swriter/ui/wrappage.ui", "WrapPage", &rSet) + , m_nAnchorId(RndStdIds::FLY_AT_PARA) + , m_nHtmlMode(0) + , m_pWrtSh(nullptr) + , m_bFormat(false) + , m_bNew(true) + , m_bHtmlMode(false) + , m_bDrawMode(false) + , m_bContourImage(false) + , m_xNoWrapImg(m_xBuilder->weld_image("noneimg")) + , m_xNoWrapRB(m_xBuilder->weld_radio_button("none")) + , m_xWrapLeftImg(m_xBuilder->weld_image("beforeimg")) + , m_xWrapLeftRB(m_xBuilder->weld_radio_button("before")) + , m_xWrapRightImg(m_xBuilder->weld_image("afterimg")) + , m_xWrapRightRB(m_xBuilder->weld_radio_button("after")) + , m_xWrapParallelImg(m_xBuilder->weld_image("parallelimg")) + , m_xWrapParallelRB(m_xBuilder->weld_radio_button("parallel")) + , m_xWrapThroughImg(m_xBuilder->weld_image("throughimg")) + , m_xWrapThroughRB(m_xBuilder->weld_radio_button("through")) + , m_xIdealWrapImg(m_xBuilder->weld_image("optimalimg")) + , m_xIdealWrapRB(m_xBuilder->weld_radio_button("optimal")) + , m_xLeftMarginED(m_xBuilder->weld_metric_spin_button("left", FieldUnit::CM)) + , m_xRightMarginED(m_xBuilder->weld_metric_spin_button("right", FieldUnit::CM)) + , m_xTopMarginED(m_xBuilder->weld_metric_spin_button("top", FieldUnit::CM)) + , m_xBottomMarginED(m_xBuilder->weld_metric_spin_button("bottom", FieldUnit::CM)) + , m_xWrapAnchorOnlyCB(m_xBuilder->weld_check_button("anchoronly")) + , m_xWrapTransparentCB(m_xBuilder->weld_check_button("transparent")) + , m_xWrapOutlineCB(m_xBuilder->weld_check_button("outline")) + , m_xWrapOutsideCB(m_xBuilder->weld_check_button("outside")) + , m_xAllowOverlapCB(m_xBuilder->weld_check_button("allowoverlap")) +{ + SetExchangeSupport(); + + Link<weld::MetricSpinButton&,void> aLk = LINK(this, SwWrapTabPage, RangeModifyHdl); + m_xLeftMarginED->connect_value_changed(aLk); + m_xRightMarginED->connect_value_changed(aLk); + m_xTopMarginED->connect_value_changed(aLk); + m_xBottomMarginED->connect_value_changed(aLk); + + Link<weld::Toggleable&,void> aLk2 = LINK(this, SwWrapTabPage, WrapTypeHdl); + m_xNoWrapRB->connect_toggled(aLk2); + m_xWrapLeftRB->connect_toggled(aLk2); + m_xWrapRightRB->connect_toggled(aLk2); + m_xWrapParallelRB->connect_toggled(aLk2); + m_xWrapThroughRB->connect_toggled(aLk2); + m_xIdealWrapRB->connect_toggled(aLk2); + SetImages(); + m_xWrapOutlineCB->connect_toggled(LINK(this, SwWrapTabPage, ContourHdl)); +} + +SwWrapTabPage::~SwWrapTabPage() +{ +} + +std::unique_ptr<SfxTabPage> SwWrapTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet *rSet) +{ + return std::make_unique<SwWrapTabPage>(pPage, pController, *rSet); +} + +void SwWrapTabPage::Reset(const SfxItemSet *rSet) +{ + // contour for Draw, Graphic and OLE (Insert/Graphic/Properties still missing!) + if( m_bDrawMode ) + { + m_xWrapOutlineCB->show(); + m_xWrapOutsideCB->show(); + + m_xWrapTransparentCB->set_active( 0 == rSet->Get(FN_DRAW_WRAP_DLG).GetValue() ); + m_xWrapTransparentCB->save_state(); + } + else + { + bool bShowCB = m_bFormat; + if( !m_bFormat ) + { + SelectionType nSelType = m_pWrtSh->GetSelectionType(); + if( ( nSelType & SelectionType::Graphic ) || + ( nSelType & SelectionType::Ole && GraphicType::NONE != + m_pWrtSh->GetIMapGraphic().GetType() )) + bShowCB = true; + } + if( bShowCB ) + { + m_xWrapOutlineCB->show(); + m_xWrapOutsideCB->show(); + } + } + + m_nHtmlMode = ::GetHtmlMode(static_cast<const SwDocShell*>(SfxObjectShell::Current())); + m_bHtmlMode = (m_nHtmlMode & HTMLMODE_ON) != 0; + + FieldUnit aMetric = ::GetDfltMetric(m_bHtmlMode); + SetFieldUnit(*m_xLeftMarginED, aMetric); + SetFieldUnit(*m_xRightMarginED, aMetric); + SetFieldUnit(*m_xTopMarginED, aMetric); + SetFieldUnit(*m_xBottomMarginED, aMetric); + + const SwFormatSurround& rSurround = rSet->Get(RES_SURROUND); + + css::text::WrapTextMode nSur = rSurround.GetSurround(); + const SwFormatAnchor &rAnch = rSet->Get(RES_ANCHOR); + m_nAnchorId = rAnch.GetAnchorId(); + + if (((m_nAnchorId == RndStdIds::FLY_AT_PARA) || (m_nAnchorId == RndStdIds::FLY_AT_CHAR)) + && (nSur != css::text::WrapTextMode_NONE)) + { + m_xWrapAnchorOnlyCB->set_active(rSurround.IsAnchorOnly()); + } + else + { + m_xWrapAnchorOnlyCB->set_sensitive(false); + } + + const bool bContour = rSurround.IsContour(); + m_xWrapOutlineCB->set_active(bContour); + m_xWrapOutsideCB->set_active(rSurround.IsOutside()); + m_xWrapThroughRB->set_sensitive(!m_xWrapOutlineCB->get_active()); + m_bContourImage = !bContour; + + weld::RadioButton* pBtn = nullptr; + + switch (nSur) + { + case css::text::WrapTextMode_NONE: + { + pBtn = m_xNoWrapRB.get(); + break; + } + + case css::text::WrapTextMode_THROUGH: + { + // transparent ? + pBtn = m_xWrapThroughRB.get(); + + if (!m_bDrawMode) + { + const SvxOpaqueItem& rOpaque = rSet->Get(RES_OPAQUE); + m_xWrapTransparentCB->set_active(!rOpaque.GetValue()); + } + break; + } + + case css::text::WrapTextMode_PARALLEL: + { + pBtn = m_xWrapParallelRB.get(); + break; + } + + case css::text::WrapTextMode_DYNAMIC: + { + pBtn = m_xIdealWrapRB.get(); + break; + } + + default: + { + if (nSur == css::text::WrapTextMode_LEFT) + pBtn = m_xWrapLeftRB.get(); + else if (nSur == css::text::WrapTextMode_RIGHT) + pBtn = m_xWrapRightRB.get(); + } + } + if (pBtn) + { + pBtn->set_active(true); + WrapTypeHdl(*pBtn); + // For character objects that currently are in passage, the default + // "contour on" is prepared here, in case we switch to any other + // passage later. + if (m_bDrawMode && !m_xWrapOutlineCB->get_sensitive()) + m_xWrapOutlineCB->set_active(true); + } + m_xWrapTransparentCB->set_sensitive(pBtn == m_xWrapThroughRB.get() && !m_bHtmlMode); + + const SvxULSpaceItem& rUL = rSet->Get(RES_UL_SPACE); + const SvxLRSpaceItem& rLR = rSet->Get(RES_LR_SPACE); + + // gap to text + m_xLeftMarginED->set_value(m_xLeftMarginED->normalize(rLR.GetLeft()), FieldUnit::TWIP); + m_xRightMarginED->set_value(m_xRightMarginED->normalize(rLR.GetRight()), FieldUnit::TWIP); + m_xTopMarginED->set_value(m_xTopMarginED->normalize(rUL.GetUpper()), FieldUnit::TWIP); + m_xBottomMarginED->set_value(m_xBottomMarginED->normalize(rUL.GetLower()), FieldUnit::TWIP); + + m_xLeftMarginED->save_value(); + m_xRightMarginED->save_value(); + m_xTopMarginED->save_value(); + m_xBottomMarginED->save_value(); + + ContourHdl(*m_xWrapOutlineCB); + + const SwFormatWrapInfluenceOnObjPos& rInfluence = rSet->Get(RES_WRAP_INFLUENCE_ON_OBJPOS); + m_xAllowOverlapCB->set_active(rInfluence.GetAllowOverlap()); + + ActivatePage( *rSet ); +} + +// stuff attributes into the set when OK +bool SwWrapTabPage::FillItemSet(SfxItemSet *rSet) +{ + bool bModified = false; + const SfxPoolItem* pOldItem; + const SwFormatSurround& rOldSur = GetItemSet().Get(RES_SURROUND); + SwFormatSurround aSur( rOldSur ); + + std::shared_ptr<SvxOpaqueItem> aOp(std::make_shared<SvxOpaqueItem>(RES_OPAQUE)); + + if (!m_bDrawMode) + { + aOp.reset(GetItemSet().Get(RES_OPAQUE).Clone()); + aOp->SetValue(true); + } + + if (m_xNoWrapRB->get_active()) + aSur.SetSurround(css::text::WrapTextMode_NONE); + else if (m_xWrapLeftRB->get_active()) + aSur.SetSurround(css::text::WrapTextMode_LEFT); + else if (m_xWrapRightRB->get_active()) + aSur.SetSurround(css::text::WrapTextMode_RIGHT); + else if (m_xWrapParallelRB->get_active()) + aSur.SetSurround(css::text::WrapTextMode_PARALLEL); + else if (m_xWrapThroughRB->get_active()) + { + aSur.SetSurround(css::text::WrapTextMode_THROUGH); + if (m_xWrapTransparentCB->get_active() && !m_bDrawMode) + aOp->SetValue(false); + } + else if (m_xIdealWrapRB->get_active()) + aSur.SetSurround(css::text::WrapTextMode_DYNAMIC); + + aSur.SetAnchorOnly( m_xWrapAnchorOnlyCB->get_active() ); + bool bContour = m_xWrapOutlineCB->get_active() && m_xWrapOutlineCB->get_sensitive(); + aSur.SetContour( bContour ); + + if ( bContour ) + aSur.SetOutside(m_xWrapOutsideCB->get_active()); + + if(nullptr == (pOldItem = GetOldItem( *rSet, RES_SURROUND )) || + aSur != *pOldItem ) + { + rSet->Put(aSur); + bModified = true; + } + + if (!m_bDrawMode) + { + if(nullptr == (pOldItem = GetOldItem( *rSet, FN_OPAQUE )) || + *aOp != *pOldItem ) + { + rSet->Put(*aOp); + bModified = true; + } + } + + bool bTopMod = m_xTopMarginED->get_value_changed_from_saved(); + bool bBottomMod = m_xBottomMarginED->get_value_changed_from_saved(); + + SvxULSpaceItem aUL( RES_UL_SPACE ); + aUL.SetUpper(o3tl::narrowing<sal_uInt16>(m_xTopMarginED->denormalize(m_xTopMarginED->get_value(FieldUnit::TWIP)))); + aUL.SetLower(o3tl::narrowing<sal_uInt16>(m_xBottomMarginED->denormalize(m_xBottomMarginED->get_value(FieldUnit::TWIP)))); + + if ( bTopMod || bBottomMod ) + { + if(nullptr == (pOldItem = GetOldItem(*rSet, RES_UL_SPACE)) || + aUL != *pOldItem ) + { + rSet->Put( aUL ); + bModified = true; + } + } + + bool bLeftMod = m_xLeftMarginED->get_value_changed_from_saved(); + bool bRightMod = m_xRightMarginED->get_value_changed_from_saved(); + + SvxLRSpaceItem aLR( RES_LR_SPACE ); + aLR.SetLeft(o3tl::narrowing<sal_uInt16>(m_xLeftMarginED->denormalize(m_xLeftMarginED->get_value(FieldUnit::TWIP)))); + aLR.SetRight(o3tl::narrowing<sal_uInt16>(m_xRightMarginED->denormalize(m_xRightMarginED->get_value(FieldUnit::TWIP)))); + + if ( bLeftMod || bRightMod ) + { + if( nullptr == (pOldItem = GetOldItem(*rSet, RES_LR_SPACE)) || + aLR != *pOldItem ) + { + rSet->Put(aLR); + bModified = true; + } + } + + if ( m_bDrawMode ) + { + bool bChecked = m_xWrapTransparentCB->get_active() && m_xWrapTransparentCB->get_sensitive(); + if ((m_xWrapTransparentCB->get_saved_state() == TRISTATE_TRUE) != bChecked) + bModified |= nullptr != rSet->Put(SfxInt16Item(FN_DRAW_WRAP_DLG, bChecked ? 0 : 1)); + } + + const SwFormatWrapInfluenceOnObjPos& rOldInfluence + = GetItemSet().Get(RES_WRAP_INFLUENCE_ON_OBJPOS); + SwFormatWrapInfluenceOnObjPos aInfluence(rOldInfluence); + aInfluence.SetAllowOverlap(m_xAllowOverlapCB->get_active()); + + pOldItem = GetOldItem(*rSet, RES_WRAP_INFLUENCE_ON_OBJPOS); + if (!pOldItem || aInfluence != *pOldItem) + { + rSet->Put(aInfluence); + bModified = true; + } + + return bModified; +} + +// example update +void SwWrapTabPage::ActivatePage(const SfxItemSet& rSet) +{ + // anchor + const SwFormatAnchor &rAnch = rSet.Get(RES_ANCHOR); + m_nAnchorId = rAnch.GetAnchorId(); + bool bEnable = (m_nAnchorId != RndStdIds::FLY_AS_CHAR); + + SwWrtShell* pSh = m_bFormat ? ::GetActiveWrtShell() : m_pWrtSh; + if (pSh && !m_bDrawMode) + { + SwFlyFrameAttrMgr aMgr( m_bNew, pSh, GetItemSet() ); + SvxSwFrameValidation aVal; + + // size + const SwFormatFrameSize& rFrameSize = rSet.Get(RES_FRM_SIZE); + Size aSize = rFrameSize.GetSize(); + + // position + const SwFormatHoriOrient& rHori = rSet.Get(RES_HORI_ORIENT); + const SwFormatVertOrient& rVert = rSet.Get(RES_VERT_ORIENT); + + aVal.nAnchorType = m_nAnchorId; + aVal.bAutoHeight = rFrameSize.GetHeightSizeType() == SwFrameSize::Minimum; + aVal.bMirror = rHori.IsPosToggle(); + // #i18732# + aVal.bFollowTextFlow = rSet.Get(RES_FOLLOW_TEXT_FLOW).GetValue(); + + aVal.nHoriOrient = static_cast<short>(rHori.GetHoriOrient()); + aVal.nVertOrient = static_cast<short>(rVert.GetVertOrient()); + + aVal.nHPos = rHori.GetPos(); + aVal.nHRelOrient = rHori.GetRelationOrient(); + aVal.nVPos = rVert.GetPos(); + aVal.nVRelOrient = rVert.GetRelationOrient(); + + if (rFrameSize.GetWidthPercent() && rFrameSize.GetWidthPercent() != SwFormatFrameSize::SYNCED) + aSize.setWidth( aSize.Width() * rFrameSize.GetWidthPercent() / 100 ); + + if (rFrameSize.GetHeightPercent() && rFrameSize.GetHeightPercent() != SwFormatFrameSize::SYNCED) + aSize.setHeight( aSize.Height() * rFrameSize.GetHeightPercent() / 100 ); + + aVal.nWidth = aSize.Width(); + aVal.nHeight = aSize.Height(); + + aMgr.ValidateMetrics(aVal, nullptr); + + SwTwips nLeft; + SwTwips nRight; + SwTwips nTop; + SwTwips nBottom; + + nLeft = aVal.nHPos - aVal.nMinHPos; + nRight = aVal.nMaxWidth - aVal.nWidth; + nTop = aVal.nVPos - aVal.nMinVPos; + nBottom = aVal.nMaxHeight - aVal.nHeight; + + { + if (aVal.nAnchorType == RndStdIds::FLY_AS_CHAR) + { + nLeft = nRight; + + if (aVal.nVPos < 0) + { + if (aVal.nVPos <= aVal.nMaxHeight) + nTop = aVal.nMaxVPos - aVal.nHeight; + else + nTop = nBottom = 0; // no passage + } + else + nTop = aVal.nMaxVPos - aVal.nHeight - aVal.nVPos; + } + else + { + nLeft += nRight; + nTop += nBottom; + } + + nBottom = nTop; + nRight = nLeft; + } + + m_xLeftMarginED->set_max(m_xLeftMarginED->normalize(nLeft), FieldUnit::TWIP); + m_xRightMarginED->set_max(m_xRightMarginED->normalize(nRight), FieldUnit::TWIP); + + m_xTopMarginED->set_max(m_xTopMarginED->normalize(nTop), FieldUnit::TWIP); + m_xBottomMarginED->set_max(m_xBottomMarginED->normalize(nBottom), FieldUnit::TWIP); + + RangeModifyHdl(*m_xLeftMarginED); + RangeModifyHdl(*m_xTopMarginED); + } + + const SwFormatSurround& rSurround = rSet.Get(RES_SURROUND); + css::text::WrapTextMode nSur = rSurround.GetSurround(); + + m_xWrapTransparentCB->set_sensitive(bEnable && !m_bHtmlMode && nSur == css::text::WrapTextMode_THROUGH); + if(m_bHtmlMode) + { + const SwFormatHoriOrient& rHori = rSet.Get(RES_HORI_ORIENT); + sal_Int16 eHOrient = rHori.GetHoriOrient(); + sal_Int16 eHRelOrient = rHori.GetRelationOrient(); + m_xWrapOutlineCB->hide(); + const bool bAllHtmlModes = + ((m_nAnchorId == RndStdIds::FLY_AT_PARA) || (m_nAnchorId == RndStdIds::FLY_AT_CHAR)) && + (eHOrient == text::HoriOrientation::RIGHT || eHOrient == text::HoriOrientation::LEFT); + m_xWrapAnchorOnlyCB->set_sensitive(bAllHtmlModes && nSur != css::text::WrapTextMode_NONE); + m_xWrapOutsideCB->hide(); + m_xIdealWrapRB->set_sensitive(false); + + m_xWrapTransparentCB->set_sensitive(false); + m_xNoWrapRB->set_sensitive(RndStdIds::FLY_AT_PARA == m_nAnchorId); + m_xWrapParallelRB->set_sensitive(false); + m_xWrapLeftRB->set_sensitive + ( (RndStdIds::FLY_AT_PARA == m_nAnchorId) + || ( (RndStdIds::FLY_AT_CHAR == m_nAnchorId) + && (eHOrient == text::HoriOrientation::RIGHT) + && (eHRelOrient == text::RelOrientation::PRINT_AREA))); + m_xWrapRightRB->set_sensitive + ( (RndStdIds::FLY_AT_PARA == m_nAnchorId) + || ( (RndStdIds::FLY_AT_CHAR == m_nAnchorId) + && (eHOrient == text::HoriOrientation::LEFT) + && (eHRelOrient == text::RelOrientation::PRINT_AREA))); + + m_xWrapThroughRB->set_sensitive + ( ( (RndStdIds::FLY_AT_PAGE == m_nAnchorId) + || ( (RndStdIds::FLY_AT_CHAR == m_nAnchorId) + && (eHRelOrient != text::RelOrientation::PRINT_AREA)) + || (RndStdIds::FLY_AT_PARA == m_nAnchorId)) + && (eHOrient != text::HoriOrientation::RIGHT)); + if (m_xNoWrapRB->get_active() && !m_xNoWrapRB->get_sensitive()) + { + if(m_xWrapThroughRB->get_sensitive()) + m_xWrapThroughRB->set_active(true); + else if(m_xWrapLeftRB->get_sensitive()) + m_xWrapLeftRB->set_active(true); + else if(m_xWrapRightRB->get_sensitive()) + m_xWrapRightRB->set_active(true); + + } + if (m_xWrapLeftRB->get_active() && !m_xWrapLeftRB->get_sensitive()) + { + if(m_xWrapRightRB->get_sensitive()) + m_xWrapRightRB->set_active(true); + else if(m_xWrapThroughRB->get_sensitive()) + m_xWrapThroughRB->set_active(true); + } + if (m_xWrapRightRB->get_active() && !m_xWrapRightRB->get_sensitive()) + { + if(m_xWrapLeftRB->get_sensitive()) + m_xWrapLeftRB->set_active(true); + else if(m_xWrapThroughRB->get_sensitive()) + m_xWrapThroughRB->set_active(true); + } + if (m_xWrapThroughRB->get_active() && !m_xWrapThroughRB->get_sensitive()) + if(m_xNoWrapRB->get_sensitive()) + m_xNoWrapRB->set_active(true); + + if (m_xWrapParallelRB->get_active() && !m_xWrapParallelRB->get_sensitive()) + m_xWrapThroughRB->set_active(true); + } + else + { + m_xNoWrapRB->set_sensitive(bEnable); + m_xWrapLeftRB->set_sensitive(bEnable); + m_xWrapRightRB->set_sensitive(bEnable); + m_xIdealWrapRB->set_sensitive(bEnable); + m_xWrapThroughRB->set_sensitive(bEnable); + m_xWrapParallelRB->set_sensitive(bEnable); + m_xWrapAnchorOnlyCB->set_sensitive( + ((m_nAnchorId == RndStdIds::FLY_AT_PARA) || (m_nAnchorId == RndStdIds::FLY_AT_CHAR)) + && nSur != css::text::WrapTextMode_NONE ); + } + ContourHdl(*m_xWrapOutlineCB); +} + +DeactivateRC SwWrapTabPage::DeactivatePage(SfxItemSet* _pSet) +{ + if(_pSet) + FillItemSet(_pSet); + + return DeactivateRC::LeavePage; +} + +IMPL_LINK(SwWrapTabPage, RangeModifyHdl, weld::MetricSpinButton&, rEdit, void) +{ + auto nValue = rEdit.get_value(FieldUnit::NONE); + weld::MetricSpinButton* pOpposite = nullptr; + if (&rEdit == m_xLeftMarginED.get()) + pOpposite = m_xRightMarginED.get(); + else if (&rEdit == m_xRightMarginED.get()) + pOpposite = m_xLeftMarginED.get(); + else if (&rEdit == m_xTopMarginED.get()) + pOpposite = m_xBottomMarginED.get(); + else if (&rEdit == m_xBottomMarginED.get()) + pOpposite = m_xTopMarginED.get(); + + assert(pOpposite); + + if (pOpposite) + { + auto nOpposite = pOpposite->get_value(FieldUnit::NONE); + + if (nValue + nOpposite > std::max(rEdit.get_max(FieldUnit::NONE), pOpposite->get_max(FieldUnit::NONE))) + pOpposite->set_value(pOpposite->get_max(FieldUnit::NONE) - nValue, FieldUnit::NONE); + } +} + +IMPL_LINK_NOARG(SwWrapTabPage, WrapTypeHdl, weld::Toggleable&, void) +{ + bool bWrapThrough = m_xWrapThroughRB->get_active(); + m_xWrapTransparentCB->set_sensitive(bWrapThrough && !m_bHtmlMode); + bWrapThrough |= ( m_nAnchorId == RndStdIds::FLY_AS_CHAR ); + m_xWrapOutlineCB->set_sensitive(!bWrapThrough && !m_xNoWrapRB->get_active()); + m_xWrapOutsideCB->set_sensitive(!bWrapThrough && m_xWrapOutlineCB->get_active()); + m_xWrapAnchorOnlyCB->set_sensitive( + ((m_nAnchorId == RndStdIds::FLY_AT_PARA) || (m_nAnchorId == RndStdIds::FLY_AT_CHAR)) && + (!m_xNoWrapRB->get_active()) ); + + ContourHdl(*m_xWrapOutlineCB); +} + +IMPL_LINK_NOARG(SwWrapTabPage, ContourHdl, weld::Toggleable&, void) +{ + bool bEnable = !(m_xWrapOutlineCB->get_active() && m_xWrapOutlineCB->get_sensitive()); + + m_xWrapOutsideCB->set_sensitive(!bEnable); + + bEnable = !m_xWrapOutlineCB->get_active(); + if (bEnable == m_bContourImage) // so that it doesn't always flicker + { + m_bContourImage = !bEnable; + SetImages(); + } +} + +void SwWrapTabPage::SetImages() +{ + m_xWrapThroughImg->set_from_icon_name(RID_BMP_WRAP_THROUGH); + bool bWrapOutline = !m_xWrapOutlineCB->get_active(); + if (bWrapOutline) + { + m_xNoWrapImg->set_from_icon_name(RID_BMP_WRAP_NONE); + m_xWrapLeftImg->set_from_icon_name(RID_BMP_WRAP_LEFT); + m_xWrapRightImg->set_from_icon_name(RID_BMP_WRAP_RIGHT); + m_xWrapParallelImg->set_from_icon_name(RID_BMP_WRAP_PARALLEL); + m_xIdealWrapImg->set_from_icon_name(RID_BMP_WRAP_IDEAL); + } + else + { + m_xNoWrapImg->set_from_icon_name(RID_BMP_WRAP_CONTOUR_NONE); + m_xWrapLeftImg->set_from_icon_name(RID_BMP_WRAP_CONTOUR_LEFT); + m_xWrapRightImg->set_from_icon_name(RID_BMP_WRAP_CONTOUR_RIGHT); + m_xWrapParallelImg->set_from_icon_name(RID_BMP_WRAP_CONTOUR_PARALLEL); + m_xIdealWrapImg->set_from_icon_name(RID_BMP_WRAP_CONTOUR_IDEAL); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |