/* -*- 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 #include #include #include #include #include #include #include #include #include #include #include "PageStylesPanel.hxx" #include #include #include #include #include #include #include using namespace ::com::sun::star; namespace sw::sidebar{ namespace { enum eFillStyle { NONE, SOLID, GRADIENT, HATCH, BITMAP, PATTERN }; } const SvxPageUsage aArr[] = { SvxPageUsage::All, SvxPageUsage::Mirror, SvxPageUsage::Right, SvxPageUsage::Left }; static sal_uInt16 PageUsageToPos_Impl( SvxPageUsage nUsage ) { for ( size_t i = 0; i < SAL_N_ELEMENTS(aArr); ++i ) if ( aArr[i] == nUsage ) return i; return 3; } static SvxPageUsage PosToPageUsage_Impl( sal_uInt16 nPos ) { if ( nPos >= SAL_N_ELEMENTS(aArr) ) return SvxPageUsage::NONE; return aArr[nPos]; } std::unique_ptr PageStylesPanel::Create(weld::Widget* pParent, SfxBindings* pBindings) { if( pParent == nullptr ) throw ::com::sun::star::lang::IllegalArgumentException(u"no parent window given to PageStylesPanel::Create"_ustr, nullptr, 0); if( pBindings == nullptr ) throw ::com::sun::star::lang::IllegalArgumentException(u"no SfxBindings given to PageStylesPanel::Create"_ustr, nullptr, 0); return std::make_unique(pParent, pBindings); } PageStylesPanel::PageStylesPanel( weld::Widget* pParent, SfxBindings* pBindings ) : PanelLayout(pParent, u"PageStylesPanel"_ustr, u"modules/swriter/ui/pagestylespanel.ui"_ustr), mpBindings( pBindings ), mpPageColumnItem( new SfxInt16Item(SID_ATTR_PAGE_COLUMN) ), mpPageItem( new SvxPageItem(SID_ATTR_PAGE) ), maPageColumnControl(SID_ATTR_PAGE_COLUMN, *pBindings, *this), maPageNumFormatControl( SID_ATTR_PAGE, *pBindings, *this ), maBgColorControl( SID_ATTR_PAGE_COLOR, *pBindings, *this ), maBgHatchingControl( SID_ATTR_PAGE_HATCH, *pBindings, *this ), maBgGradientControl( SID_ATTR_PAGE_GRADIENT, *pBindings, *this ), maBgBitmapControl( SID_ATTR_PAGE_BITMAP, *pBindings, *this ), maBgFillStyleControl(SID_ATTR_PAGE_FILLSTYLE, *pBindings, *this), mxBgColorLB(new ColorListBox(m_xBuilder->weld_menu_button(u"lbcolor"_ustr), [this]{ return GetFrameWeld(); })), mxBgHatchingLB(m_xBuilder->weld_combo_box(u"lbhatching"_ustr)), mxBgGradientLB(new ColorListBox(m_xBuilder->weld_menu_button(u"lbgradient"_ustr), [this]{ return GetFrameWeld(); })), mxBgBitmapLB(m_xBuilder->weld_combo_box(u"lbbitmap"_ustr)), mxLayoutSelectLB(m_xBuilder->weld_combo_box(u"layoutbox"_ustr)), mxColumnCount(m_xBuilder->weld_combo_box(u"columnbox"_ustr)), mxNumberSelectLB(new SvxPageNumberListBox(m_xBuilder->weld_combo_box(u"numberbox"_ustr))), mxBgFillType(m_xBuilder->weld_combo_box(u"bgselect"_ustr)), mxCustomEntry(m_xBuilder->weld_label(u"customlabel"_ustr)) { Initialize(); } PageStylesPanel::~PageStylesPanel() { mxColumnCount.reset(); mxNumberSelectLB.reset(); mxBgFillType.reset(); mxBgColorLB.reset(); mxBgHatchingLB.reset(); mxBgGradientLB.reset(); mxBgBitmapLB.reset(); mxLayoutSelectLB.reset(); mxCustomEntry.reset(); maBgBitmapControl.dispose(); maBgColorControl.dispose(); maBgFillStyleControl.dispose(); maBgGradientControl.dispose(); maBgHatchingControl.dispose(); maPageColumnControl.dispose(); maPageNumFormatControl.dispose(); } void PageStylesPanel::Initialize() { SvxFillTypeBox::Fill(*mxBgFillType); m_aCustomEntry = mxCustomEntry->get_label(); mpBindings->Invalidate(SID_ATTR_PAGE_COLUMN); mpBindings->Invalidate(SID_ATTR_PAGE); mpBindings->Invalidate(SID_ATTR_PAGE_FILLSTYLE); Update(); mxColumnCount->connect_changed( LINK(this, PageStylesPanel, ModifyColumnCountHdl) ); SvxNumOptionsTabPageHelper::GetI18nNumbering(mxNumberSelectLB->get_widget(), ::std::numeric_limits::max()); mxNumberSelectLB->connect_changed( LINK(this, PageStylesPanel, ModifyNumberingHdl) ); mxLayoutSelectLB->connect_changed( LINK(this, PageStylesPanel, ModifyLayoutHdl) ); mxBgFillType->connect_changed( LINK(this, PageStylesPanel, ModifyFillStyleHdl)); mxBgColorLB->SetSelectHdl( LINK(this, PageStylesPanel, ModifyFillColorListHdl)); mxBgGradientLB->SetSelectHdl( LINK(this, PageStylesPanel, ModifyFillColorListHdl)); mxBgHatchingLB->connect_changed( LINK(this, PageStylesPanel, ModifyFillColorHdl)); mxBgBitmapLB->connect_changed( LINK(this, PageStylesPanel, ModifyFillColorHdl)); } void PageStylesPanel::Update() { const eFillStyle eXFS = static_cast(mxBgFillType->get_active()); SfxObjectShell* pSh = SfxObjectShell::Current(); if (!pSh) { SAL_WARN("sw.ui", "PageStylesPanel::Update(): no SfxObjectShell found"); return; } switch(eXFS) { case NONE: { mxBgColorLB->hide(); mxBgHatchingLB->hide(); mxBgGradientLB->hide(); mxBgBitmapLB->hide(); } break; case SOLID: { mxBgBitmapLB->hide(); mxBgGradientLB->hide(); mxBgHatchingLB->hide(); mxBgColorLB->set_accessible_name(SwResId(STR_BACKGROUND_COLOR)); mxBgColorLB->show(); const Color aColor = GetColorSetOrDefault(); mxBgColorLB->SelectEntry(aColor); } break; case GRADIENT: { mxBgBitmapLB->hide(); mxBgHatchingLB->hide(); mxBgColorLB->set_accessible_name(SwResId(STR_GRADIENT_COLOR_1)); mxBgColorLB->show(); mxBgGradientLB->show(); const basegfx::BGradient aBGradient = GetGradientSetOrDefault(); const Color aStartColor(aBGradient.GetColorStops().front().getStopColor()); mxBgColorLB->SelectEntry(aStartColor); const Color aEndColor(aBGradient.GetColorStops().back().getStopColor()); mxBgGradientLB->SelectEntry(aEndColor); } break; case HATCH: { mxBgColorLB->hide(); mxBgGradientLB->hide(); mxBgBitmapLB->hide(); mxBgHatchingLB->show(); mxBgHatchingLB->clear(); SvxFillAttrBox::Fill(*mxBgHatchingLB, pSh->GetItem(SID_HATCH_LIST)->GetHatchList()); const OUString aHatchName = GetHatchingSetOrDefault(); mxBgHatchingLB->set_active_text( aHatchName ); } break; case BITMAP: case PATTERN: { mxBgColorLB->hide(); mxBgGradientLB->hide(); mxBgHatchingLB->hide(); const OUString sAccName = (eXFS == BITMAP) ? SwResId(STR_BACKGROUND_BITMAP) : SwResId(STR_BACKGROUND_PATTERN); mxBgBitmapLB->set_accessible_name(sAccName); mxBgBitmapLB->show(); mxBgBitmapLB->clear(); OUString aBitmapName; if( eXFS == BITMAP ) { SvxFillAttrBox::Fill(*mxBgBitmapLB, pSh->GetItem(SID_BITMAP_LIST)->GetBitmapList()); aBitmapName = GetBitmapSetOrDefault(); } else { SvxFillAttrBox::Fill(*mxBgBitmapLB, pSh->GetItem(SID_PATTERN_LIST)->GetPatternList()); aBitmapName = GetPatternSetOrDefault(); } mxBgBitmapLB->set_active_text( aBitmapName ); } break; default: break; } // Need to do a relayouting, otherwise the panel size is not updated after show / hide controls if (m_pPanel) m_pPanel->TriggerDeckLayouting(); } Color const & PageStylesPanel::GetColorSetOrDefault() { if ( !mpBgColorItem ) mpBgColorItem.reset( new XFillColorItem( OUString(), Color(0x72, 0x9f, 0xcf) ) ); return mpBgColorItem->GetColorValue(); } basegfx::BGradient const & PageStylesPanel::GetGradientSetOrDefault() { if( !mpBgGradientItem ) { basegfx::BGradient aGradient; OUString aGradientName; if (SfxObjectShell* pSh = SfxObjectShell::Current()) { const SvxGradientListItem* pGradListItem = pSh->GetItem(SID_GRADIENT_LIST); aGradient = pGradListItem->GetGradientList()->GetGradient(0)->GetGradient(); aGradientName = pGradListItem->GetGradientList()->GetGradient(0)->GetName(); } mpBgGradientItem.reset( new XFillGradientItem( aGradientName, aGradient ) ); } return mpBgGradientItem->GetGradientValue(); } OUString const & PageStylesPanel::GetHatchingSetOrDefault() { if( !mpBgHatchItem ) { XHatch aHatch; OUString aHatchName; if (SfxObjectShell* pSh = SfxObjectShell::Current()) { const SvxHatchListItem * pHatchListItem = pSh->GetItem(SID_HATCH_LIST); aHatch = pHatchListItem->GetHatchList()->GetHatch(0)->GetHatch(); aHatchName = pHatchListItem->GetHatchList()->GetHatch(0)->GetName(); } mpBgHatchItem.reset( new XFillHatchItem( aHatchName, aHatch ) ); } return mpBgHatchItem->GetName(); } OUString const & PageStylesPanel::GetBitmapSetOrDefault() { if( !mpBgBitmapItem || mpBgBitmapItem->isPattern() ) { GraphicObject aGraphObj; OUString aBmpName; if (SfxObjectShell* pSh = SfxObjectShell::Current()) { const SvxBitmapListItem * pBmpListItem = pSh->GetItem(SID_BITMAP_LIST); aGraphObj = pBmpListItem->GetBitmapList()->GetBitmap(0)->GetGraphicObject(); aBmpName = pBmpListItem->GetBitmapList()->GetBitmap(0)->GetName(); } mpBgBitmapItem.reset( new XFillBitmapItem( aBmpName, aGraphObj ) ); } return mpBgBitmapItem->GetName(); } OUString const & PageStylesPanel::GetPatternSetOrDefault() { if( !mpBgBitmapItem || !mpBgBitmapItem->isPattern() ) { GraphicObject aGraphObj; OUString aPatternName; if (SfxObjectShell* pSh = SfxObjectShell::Current()) { const SvxPatternListItem * pPatternListItem = pSh->GetItem(SID_PATTERN_LIST); aGraphObj = pPatternListItem->GetPatternList()->GetBitmap(0)->GetGraphicObject(); aPatternName = pPatternListItem->GetPatternList()->GetBitmap(0)->GetName(); } mpBgBitmapItem.reset( new XFillBitmapItem( aPatternName, aGraphObj ) ); } return mpBgBitmapItem->GetName(); } void PageStylesPanel::NotifyItemUpdate( const sal_uInt16 nSid, const SfxItemState eState, const SfxPoolItem* pState) { if (!mxColumnCount) //disposed return; switch(nSid) { case SID_ATTR_PAGE_COLUMN: { if ( eState >= SfxItemState::DEFAULT && dynamic_cast< const SfxInt16Item *>( pState ) ) { mpPageColumnItem.reset( static_cast(pState->Clone()) ); if(mpPageColumnItem->GetValue() <= 5) { mxColumnCount->set_active(mpPageColumnItem->GetValue() - 1); int nIndex = mxColumnCount->find_text(m_aCustomEntry); if (nIndex != -1) mxColumnCount->remove(nIndex); } else { if (mxColumnCount->find_text(m_aCustomEntry) == -1) mxColumnCount->append_text(m_aCustomEntry); mxColumnCount->set_active_text(m_aCustomEntry); } } } break; case SID_ATTR_PAGE: { if( eState >= SfxItemState::DEFAULT && dynamic_cast< const SvxPageItem*>( pState ) ) { mpPageItem.reset( static_cast(pState->Clone()) ); SvxNumType eNumType = mpPageItem->GetNumType(); mxNumberSelectLB->set_active_id(eNumType); SvxPageUsage nUse = mpPageItem->GetPageUsage(); mxLayoutSelectLB->set_active( PageUsageToPos_Impl( nUse ) ); } } break; case SID_ATTR_PAGE_COLOR: { if(eState >= SfxItemState::DEFAULT) { mxBgFillType->set_active( static_cast(SOLID) ); mpBgColorItem.reset(pState ? static_cast< XFillColorItem* >(pState->Clone()) : nullptr); Update(); } } break; case SID_ATTR_PAGE_HATCH: { if(eState >= SfxItemState::DEFAULT) { mxBgFillType->set_active( static_cast(HATCH) ); mpBgHatchItem.reset(pState ? static_cast < XFillHatchItem* >(pState->Clone()) : nullptr); Update(); } } break; case SID_ATTR_PAGE_GRADIENT: { if(eState >= SfxItemState::DEFAULT) { mxBgFillType->set_active( static_cast(GRADIENT) ); mpBgGradientItem.reset(pState ? static_cast< XFillGradientItem* >(pState->Clone()) : nullptr); Update(); } } break; case SID_ATTR_PAGE_BITMAP: { if(eState >= SfxItemState::DEFAULT) { mpBgBitmapItem.reset(pState ? static_cast< XFillBitmapItem* >(pState->Clone()) : nullptr); if (mpBgBitmapItem) { if (mpBgBitmapItem->isPattern()) mxBgFillType->set_active( static_cast(PATTERN) ); else mxBgFillType->set_active( static_cast(BITMAP) ); } Update(); } } break; case SID_ATTR_PAGE_FILLSTYLE: { const XFillStyleItem* pFillStyleItem = nullptr; if (eState >= SfxItemState::DEFAULT) pFillStyleItem = dynamic_cast< const XFillStyleItem* >(pState); if (pFillStyleItem) { css::drawing::FillStyle eXFS = pFillStyleItem->GetValue(); switch(eXFS) { case drawing::FillStyle_NONE: mxBgFillType->set_active( static_cast(NONE) ); break; case drawing::FillStyle_SOLID: mxBgFillType->set_active( static_cast(SOLID) ); break; case drawing::FillStyle_GRADIENT: mxBgFillType->set_active( static_cast(GRADIENT) ); break; case drawing::FillStyle_HATCH: mxBgFillType->set_active( static_cast(HATCH) ); break; case drawing::FillStyle_BITMAP: if (mpBgBitmapItem->isPattern()) mxBgFillType->set_active( static_cast(PATTERN) ); else mxBgFillType->set_active( static_cast(BITMAP) ); break; default: break; } Update(); } } break; default: break; } } IMPL_LINK_NOARG( PageStylesPanel, ModifyColumnCountHdl, weld::ComboBox&, void ) { sal_uInt16 nColumnType = mxColumnCount->get_active() + 1; mpPageColumnItem->SetValue( nColumnType ); mpBindings->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_COLUMN, SfxCallMode::RECORD, { mpPageColumnItem.get() }); } IMPL_LINK_NOARG( PageStylesPanel, ModifyNumberingHdl, weld::ComboBox&, void ) { SvxNumType nEntryData = mxNumberSelectLB->get_active_id(); mpPageItem->SetNumType(nEntryData); mpBindings->GetDispatcher()->ExecuteList(SID_ATTR_PAGE, SfxCallMode::RECORD, { mpPageItem.get() }); } IMPL_LINK_NOARG( PageStylesPanel, ModifyLayoutHdl, weld::ComboBox&, void ) { sal_uInt16 nUse = mxLayoutSelectLB->get_active(); mpPageItem->SetPageUsage(PosToPageUsage_Impl(nUse)); mpBindings->GetDispatcher()->ExecuteList(SID_ATTR_PAGE, SfxCallMode::RECORD, { mpPageItem.get() }); } IMPL_LINK_NOARG(PageStylesPanel, ModifyFillStyleHdl, weld::ComboBox&, void) { const eFillStyle eXFS = static_cast(mxBgFillType->get_active()); Update(); switch (eXFS) { case NONE: { const XFillStyleItem aXFillStyleItem(drawing::FillStyle_NONE); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_FILLSTYLE, SfxCallMode::RECORD, { &aXFillStyleItem }); } break; case SOLID: { XFillColorItem aItem( OUString(), mpBgColorItem->GetColorValue() ); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_COLOR, SfxCallMode::RECORD, { &aItem }); } break; case GRADIENT: { XFillGradientItem aItem( mpBgGradientItem->GetName(), mpBgGradientItem->GetGradientValue() ); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_GRADIENT, SfxCallMode::RECORD, { &aItem }); } break; case HATCH: { XFillHatchItem aItem( mpBgHatchItem->GetName(), mpBgHatchItem->GetHatchValue() ); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_HATCH, SfxCallMode::RECORD, { &aItem }); } break; case BITMAP: case PATTERN: { XFillBitmapItem aItem( mpBgBitmapItem->GetName(), mpBgBitmapItem->GetGraphicObject() ); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_BITMAP, SfxCallMode::RECORD, { &aItem }); } break; default: break; } } void PageStylesPanel::ModifyFillColor() { const eFillStyle eXFS = static_cast(mxBgFillType->get_active()); SfxObjectShell* pSh = SfxObjectShell::Current(); switch(eXFS) { case SOLID: { const NamedColor& rNamedColor = mxBgColorLB->GetSelectedEntry(); XFillColorItem aItem(OUString(), rNamedColor.m_aColor); aItem.setComplexColor(rNamedColor.getComplexColor()); aItem.setComplexColor(mxBgColorLB->GetSelectedEntry().getComplexColor()); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_COLOR, SfxCallMode::RECORD, { &aItem }); } break; case GRADIENT: { basegfx::BGradient aGradient( basegfx::BColorStops( mxBgColorLB->GetSelectEntryColor().getBColor(), mxBgGradientLB->GetSelectEntryColor().getBColor())); XFillGradientItem aItem(aGradient); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_GRADIENT, SfxCallMode::RECORD, { &aItem }); } break; case HATCH: if (pSh) { const SvxHatchListItem * pHatchListItem = pSh->GetItem(SID_HATCH_LIST); sal_uInt16 nPos = mxBgHatchingLB->get_active(); XHatch aHatch = pHatchListItem->GetHatchList()->GetHatch(nPos)->GetHatch(); const OUString aHatchName = pHatchListItem->GetHatchList()->GetHatch(nPos)->GetName(); XFillHatchItem aItem(aHatchName, aHatch); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_HATCH, SfxCallMode::RECORD, { &aItem }); } break; case BITMAP: case PATTERN: if (pSh) { sal_Int16 nPos = mxBgBitmapLB->get_active(); GraphicObject aBitmap; OUString aBitmapName; if ( eXFS == BITMAP ) { SvxBitmapListItem const * pBitmapListItem = pSh->GetItem(SID_BITMAP_LIST); aBitmap = pBitmapListItem->GetBitmapList()->GetBitmap(nPos)->GetGraphicObject(); aBitmapName = pBitmapListItem->GetBitmapList()->GetBitmap(nPos)->GetName(); } else { SvxPatternListItem const * pPatternListItem = pSh->GetItem(SID_PATTERN_LIST); aBitmap = pPatternListItem->GetPatternList()->GetBitmap(nPos)->GetGraphicObject(); aBitmapName = pPatternListItem->GetPatternList()->GetBitmap(nPos)->GetName(); } XFillBitmapItem aItem(aBitmapName, aBitmap); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_PAGE_BITMAP, SfxCallMode::RECORD, { &aItem }); } break; default: break; } } IMPL_LINK_NOARG(PageStylesPanel, ModifyFillColorHdl, weld::ComboBox&, void) { ModifyFillColor(); } IMPL_LINK_NOARG(PageStylesPanel, ModifyFillColorListHdl, ColorListBox&, void) { ModifyFillColor(); } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */