Both are derived from SfxSetItem which means they contain a SfxItemSet themselves. That leads to problems since at their construction time a SfxItemPool has to be known and it *should* not be different to the one of the ItemSet that Item gets added later - that leads to the 2nd class of problems. In the long therm we should get rid of all SfxSetItems. This change simplifies already some stuff, including that the standard Items for DrawObjects reduces by two (and more due to containing a whole ItemSet) and e.g. the problem that these Items had to be converted to hard attributes in the done fixes for copy/pasting Slides. Signed-off-by: Armin Le Grand (collabora) <Armin.LeGrand@collabora.com> Change-Id: I8b1c6cabdaa43ed6062811b5508ab3dece47a755 Reviewed-on: https://gerrit.collaboraoffice.com/c/online/+/6795 Reviewed-by: Armin Le Grand <armin.legrand@collabora.com> Tested-by: Jenkins CPCI <releng@collaboraoffice.com> (cherry picked from commit e67458a9b769fe7a3a7ee0739ed6d5c46dbc0692) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211734 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
661 lines
25 KiB
C++
661 lines
25 KiB
C++
/* -*- 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 <memory>
|
|
#include <tools/urlobj.hxx>
|
|
#include <vcl/image.hxx>
|
|
#include <vcl/svapp.hxx>
|
|
#include <vcl/weld/Builder.hxx>
|
|
#include <vcl/weld/IconView.hxx>
|
|
#include <vcl/weld/ScrolledWindow.hxx>
|
|
#include <vcl/weld/MessageDialog.hxx>
|
|
#include <sfx2/dialoghelper.hxx>
|
|
#include <sfx2/objsh.hxx>
|
|
|
|
#include <strings.hrc>
|
|
#include <svx/drawitem.hxx>
|
|
#include <svx/xfillit0.hxx>
|
|
#include <svx/xflgrit.hxx>
|
|
#include <svx/colorbox.hxx>
|
|
#include <svx/xtable.hxx>
|
|
#include <svx/xgrscit.hxx>
|
|
#include <cuitabarea.hxx>
|
|
#include <dialmgr.hxx>
|
|
#include <svtools/dlgname.hxx>
|
|
#include <svx/dialmgr.hxx>
|
|
#include <svx/strings.hrc>
|
|
#include <svx/svxids.hrc>
|
|
#include <sal/log.hxx>
|
|
|
|
using namespace com::sun::star;
|
|
|
|
SvxGradientTabPage::SvxGradientTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rInAttrs)
|
|
: SfxTabPage(pPage, pController, u"cui/ui/gradientpage.ui"_ustr, u"GradientPage"_ustr, &rInAttrs)
|
|
, m_rOutAttrs(rInAttrs)
|
|
, m_nGradientListState(ChangeType::NONE)
|
|
, m_pnColorListState(nullptr)
|
|
, m_aFillAttributeSet(rInAttrs.getPool(), WhichRangesContainer(XATTR_FILL_FIRST, XATTR_FILL_LAST))
|
|
, m_xLbGradientType(m_xBuilder->weld_combo_box(u"gradienttypelb"_ustr))
|
|
, m_xFtCenter(m_xBuilder->weld_label(u"centerft"_ustr))
|
|
, m_xMtrCenterX(m_xBuilder->weld_metric_spin_button(u"centerxmtr"_ustr, FieldUnit::PERCENT))
|
|
, m_xMtrCenterY(m_xBuilder->weld_metric_spin_button(u"centerymtr"_ustr, FieldUnit::PERCENT))
|
|
, m_xFtAngle(m_xBuilder->weld_label(u"angleft"_ustr))
|
|
, m_xMtrAngle(m_xBuilder->weld_metric_spin_button(u"anglemtr"_ustr, FieldUnit::DEGREE))
|
|
, m_xSliderAngle(m_xBuilder->weld_scale(u"angleslider"_ustr))
|
|
, m_xMtrBorder(m_xBuilder->weld_metric_spin_button(u"bordermtr"_ustr, FieldUnit::PERCENT))
|
|
, m_xSliderBorder(m_xBuilder->weld_scale(u"borderslider"_ustr))
|
|
, m_xLbColorFrom(new ColorListBox(m_xBuilder->weld_menu_button(u"colorfromlb"_ustr),
|
|
[this]{ return GetDialogController()->getDialog(); }))
|
|
, m_xMtrColorFrom(m_xBuilder->weld_metric_spin_button(u"colorfrommtr"_ustr, FieldUnit::PERCENT))
|
|
, m_xLbColorTo(new ColorListBox(m_xBuilder->weld_menu_button(u"colortolb"_ustr),
|
|
[this]{ return GetDialogController()->getDialog(); }))
|
|
, m_xMtrColorTo(m_xBuilder->weld_metric_spin_button(u"colortomtr"_ustr, FieldUnit::PERCENT))
|
|
, m_xGradientPresets(m_xBuilder->weld_icon_view(u"gradientpresets"_ustr))
|
|
, m_xGradientLB(new SvxPresetListBox(*m_xGradientPresets))
|
|
, m_xMtrIncrement(m_xBuilder->weld_spin_button(u"incrementmtr"_ustr))
|
|
, m_xCbIncrement(m_xBuilder->weld_check_button(u"autoincrement"_ustr))
|
|
, m_xBtnAdd(m_xBuilder->weld_button(u"add"_ustr))
|
|
, m_xBtnModify(m_xBuilder->weld_button(u"modify"_ustr))
|
|
, m_xCtlPreview(new weld::CustomWeld(*m_xBuilder, u"previewctl"_ustr, m_aCtlPreview))
|
|
{
|
|
Size aSize = getDrawPreviewOptimalSize(m_aCtlPreview.GetDrawingArea()->get_ref_device());
|
|
m_xCtlPreview->set_size_request(aSize.Width(), aSize.Height());
|
|
// this page needs ExchangeSupport
|
|
SetExchangeSupport();
|
|
|
|
// as long as NOT supported by the item
|
|
|
|
m_xMtrColorTo->set_value(100, FieldUnit::PERCENT);
|
|
m_xMtrColorFrom->set_value(100, FieldUnit::PERCENT);
|
|
|
|
// setting the output device
|
|
m_aFillAttributeSet.Put( XFillStyleItem(drawing::FillStyle_GRADIENT) );
|
|
m_aFillAttributeSet.Put( XFillGradientItem(OUString(), basegfx::BGradient()));
|
|
m_aCtlPreview.SetAttributes(m_aFillAttributeSet);
|
|
|
|
// set handler
|
|
m_xGradientPresets->connect_item_activated(LINK(this, SvxGradientTabPage, ChangeGradientHdl));
|
|
m_xGradientLB->SetRenameHdl( LINK( this, SvxGradientTabPage, ClickRenameHdl_Impl ) );
|
|
m_xGradientLB->SetDeleteHdl( LINK( this, SvxGradientTabPage, ClickDeleteHdl_Impl ) );
|
|
m_xBtnAdd->connect_clicked(LINK(this, SvxGradientTabPage, ClickAddHdl_Impl));
|
|
m_xBtnModify->connect_clicked(LINK(this, SvxGradientTabPage, ClickModifyHdl_Impl));
|
|
|
|
Link<weld::MetricSpinButton&,void> aLink = LINK( this, SvxGradientTabPage, ModifiedMetricHdl_Impl );
|
|
Link<weld::ComboBox&,void> aLink2 = LINK( this, SvxGradientTabPage, ModifiedListBoxHdl_Impl );
|
|
m_xLbGradientType->connect_changed( aLink2 );
|
|
m_xCbIncrement->connect_toggled(LINK(this, SvxGradientTabPage, ChangeAutoStepHdl_Impl));
|
|
m_xMtrIncrement->connect_value_changed(LINK(this, SvxGradientTabPage, ModifiedEditHdl_Impl));
|
|
m_xMtrCenterX->connect_value_changed( aLink );
|
|
m_xMtrCenterY->connect_value_changed( aLink );
|
|
m_xMtrAngle->connect_value_changed( aLink );
|
|
m_xSliderAngle->connect_value_changed(LINK(this, SvxGradientTabPage, ModifiedSliderHdl_Impl));
|
|
m_xMtrBorder->connect_value_changed( aLink );
|
|
m_xSliderBorder->connect_value_changed(LINK(this, SvxGradientTabPage, ModifiedSliderHdl_Impl));
|
|
m_xMtrColorFrom->connect_value_changed( aLink );
|
|
Link<ColorListBox&,void> aLink3 = LINK( this, SvxGradientTabPage, ModifiedColorListBoxHdl_Impl );
|
|
m_xLbColorFrom->SetSelectHdl( aLink3 );
|
|
m_xMtrColorTo->connect_value_changed( aLink );
|
|
m_xLbColorTo->SetSelectHdl( aLink3 );
|
|
|
|
// #i76307# always paint the preview in LTR, because this is what the document does
|
|
m_aCtlPreview.EnableRTL(false);
|
|
}
|
|
|
|
SvxGradientTabPage::~SvxGradientTabPage()
|
|
{
|
|
m_xCtlPreview.reset();
|
|
m_xGradientLB.reset();
|
|
m_xLbColorTo.reset();
|
|
m_xLbColorFrom.reset();
|
|
|
|
if (m_nGradientListState & ChangeType::MODIFIED)
|
|
{
|
|
m_pGradientList->SetPath(AreaTabHelper::GetPalettePath());
|
|
m_pGradientList->Save();
|
|
|
|
// ToolBoxControls are informed:
|
|
SfxObjectShell* pShell = SfxObjectShell::Current();
|
|
if (pShell)
|
|
pShell->PutItem(SvxGradientListItem(m_pGradientList, SID_GRADIENT_LIST));
|
|
}
|
|
}
|
|
|
|
void SvxGradientTabPage::Construct()
|
|
{
|
|
m_xGradientLB->FillPresetListBox( *m_pGradientList );
|
|
}
|
|
|
|
void SvxGradientTabPage::ActivatePage( const SfxItemSet& rSet )
|
|
{
|
|
if( !m_pColorList.is() )
|
|
return;
|
|
|
|
// ColorList
|
|
if( *m_pnColorListState & ChangeType::CHANGED ||
|
|
*m_pnColorListState & ChangeType::MODIFIED )
|
|
{
|
|
SvxAreaTabDialog* pArea = (*m_pnColorListState & ChangeType::CHANGED) ?
|
|
dynamic_cast<SvxAreaTabDialog*>(GetDialogController()) : nullptr;
|
|
if (pArea)
|
|
m_pColorList = pArea->GetNewColorList();
|
|
|
|
ModifiedHdl_Impl( this );
|
|
}
|
|
|
|
// determining (and possibly cutting) the name and
|
|
// displaying it in the GroupBox
|
|
OUString aString = CuiResId( RID_CUISTR_TABLE ) + ": ";
|
|
INetURLObject aURL( m_pGradientList->GetPath() );
|
|
|
|
aURL.Append( m_pGradientList->GetName() );
|
|
SAL_WARN_IF( aURL.GetProtocol() == INetProtocol::NotValid, "cui.tabpages", "invalid URL" );
|
|
|
|
if ( aURL.getBase().getLength() > 18 )
|
|
{
|
|
aString += OUString::Concat(aURL.getBase().subView( 0, 15 )) + "...";
|
|
}
|
|
else
|
|
aString += aURL.getBase();
|
|
|
|
sal_Int32 nPos = SearchGradientList( rSet.Get(XATTR_FILLGRADIENT).GetName() );
|
|
if ( nPos != -1)
|
|
m_xGradientPresets->select(nPos);
|
|
|
|
// colors could have been deleted
|
|
ChangeGradientHdl_Impl();
|
|
}
|
|
|
|
|
|
DeactivateRC SvxGradientTabPage::DeactivatePage( SfxItemSet* _pSet )
|
|
{
|
|
if( _pSet )
|
|
FillItemSet( _pSet );
|
|
|
|
return DeactivateRC::LeavePage;
|
|
}
|
|
|
|
bool SvxGradientTabPage::FillItemSet( SfxItemSet* rSet )
|
|
{
|
|
std::unique_ptr<basegfx::BGradient> pBGradient;
|
|
int nPos = m_xGradientPresets->get_selected_index();
|
|
|
|
sal_uInt16 nValue = 0; // automatic step count
|
|
if (!m_xCbIncrement->get_active())
|
|
nValue = m_xMtrIncrement->get_value();
|
|
|
|
if (nPos >= 0)
|
|
{
|
|
pBGradient.reset(new basegfx::BGradient( m_pGradientList->GetGradient( static_cast<sal_uInt16>(nPos) )->GetGradient() ));
|
|
const OUString aString = m_xGradientPresets->get_item_tooltip_text(nPos);
|
|
// update StepCount to current value to be in sync with FillGradientStepCount
|
|
pBGradient->SetSteps(nValue);
|
|
rSet->Put( XFillGradientItem( aString, *pBGradient ) );
|
|
}
|
|
else
|
|
// gradient was passed (unidentified)
|
|
{
|
|
pBGradient.reset(new basegfx::BGradient(
|
|
createColorStops(),
|
|
static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active()),
|
|
Degree10(static_cast<sal_Int16>((m_xMtrAngle->get_value(FieldUnit::NONE) % 360) * 10)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterY->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrBorder->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorFrom->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorTo->get_value(FieldUnit::NONE)),
|
|
nValue));
|
|
rSet->Put( XFillGradientItem( OUString(), *pBGradient ) );
|
|
}
|
|
|
|
assert( pBGradient && "basegfx::BGradient could not be created" );
|
|
rSet->Put( XFillStyleItem( drawing::FillStyle_GRADIENT ) );
|
|
rSet->Put( XGradientStepCountItem( nValue ) );
|
|
return true;
|
|
}
|
|
|
|
void SvxGradientTabPage::Reset( const SfxItemSet* )
|
|
{
|
|
ChangeGradientHdl_Impl(); // includes setting m_xCbIncrement and m_xMtrIncrement
|
|
|
|
// determine state of the buttons
|
|
if( m_pGradientList->Count() )
|
|
m_xBtnModify->set_sensitive(true);
|
|
else
|
|
m_xBtnModify->set_sensitive(false);
|
|
}
|
|
|
|
std::unique_ptr<SvxGradientTabPage> SvxGradientTabPage::Create(weld::Container* pPage,
|
|
weld::DialogController* pController,
|
|
const SfxItemSet& rOutAttrs)
|
|
{
|
|
return std::make_unique<SvxGradientTabPage>(pPage, pController, rOutAttrs);
|
|
}
|
|
|
|
IMPL_LINK( SvxGradientTabPage, ModifiedListBoxHdl_Impl, weld::ComboBox&, rListBox, void )
|
|
{
|
|
ModifiedHdl_Impl(&rListBox);
|
|
// gradient params changed, it is no longer one of the presets
|
|
m_xGradientPresets->unselect_all();
|
|
}
|
|
|
|
IMPL_LINK( SvxGradientTabPage, ModifiedColorListBoxHdl_Impl, ColorListBox&, rListBox, void )
|
|
{
|
|
ModifiedHdl_Impl(&rListBox);
|
|
m_xGradientPresets->unselect_all();
|
|
}
|
|
|
|
IMPL_LINK( SvxGradientTabPage, ModifiedEditHdl_Impl, weld::SpinButton&, rBox, void )
|
|
{
|
|
ModifiedHdl_Impl(&rBox);
|
|
m_xGradientPresets->unselect_all();
|
|
}
|
|
|
|
IMPL_LINK( SvxGradientTabPage, ModifiedMetricHdl_Impl, weld::MetricSpinButton&, rBox, void )
|
|
{
|
|
ModifiedHdl_Impl(&rBox);
|
|
m_xGradientPresets->unselect_all();
|
|
}
|
|
|
|
IMPL_LINK( SvxGradientTabPage, ModifiedSliderHdl_Impl, weld::Scale&, rSlider, void )
|
|
{
|
|
ModifiedHdl_Impl(&rSlider);
|
|
m_xGradientPresets->unselect_all();
|
|
}
|
|
|
|
IMPL_LINK_NOARG( SvxGradientTabPage, ChangeAutoStepHdl_Impl, weld::Toggleable&, void )
|
|
{
|
|
if (m_xCbIncrement->get_active())
|
|
{
|
|
m_xMtrIncrement->set_sensitive(false);
|
|
}
|
|
else
|
|
{
|
|
m_xMtrIncrement->set_sensitive(true);
|
|
}
|
|
ModifiedHdl_Impl(m_xMtrIncrement.get());
|
|
}
|
|
|
|
void SvxGradientTabPage::ModifiedHdl_Impl( void const * pControl )
|
|
{
|
|
if (pControl == m_xMtrBorder.get())
|
|
m_xSliderBorder->set_value(m_xMtrBorder->get_value(FieldUnit::NONE));
|
|
if (pControl == m_xSliderBorder.get())
|
|
m_xMtrBorder->set_value(m_xSliderBorder->get_value(), FieldUnit::NONE);
|
|
if (pControl == m_xMtrAngle.get())
|
|
m_xSliderAngle->set_value(m_xMtrAngle->get_value(FieldUnit::NONE));
|
|
if (pControl == m_xSliderAngle.get())
|
|
m_xMtrAngle->set_value(m_xSliderAngle->get_value(), FieldUnit::NONE);
|
|
|
|
css::awt::GradientStyle eXGS = static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active());
|
|
|
|
sal_uInt16 nValue = 0; // automatic
|
|
if (!m_xCbIncrement->get_active())
|
|
nValue = static_cast<sal_uInt16>(m_xMtrIncrement->get_value());
|
|
|
|
basegfx::BGradient aBGradient(
|
|
createColorStops(),
|
|
eXGS,
|
|
Degree10(static_cast<sal_Int16>((m_xMtrAngle->get_value(FieldUnit::NONE) % 360) * 10)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterY->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrBorder->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorFrom->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorTo->get_value(FieldUnit::NONE)),
|
|
nValue);
|
|
|
|
// enable/disable controls
|
|
if (pControl == m_xLbGradientType.get() || pControl == this)
|
|
SetControlState_Impl( eXGS );
|
|
|
|
m_aFillAttributeSet.Put( XGradientStepCountItem( nValue ) );
|
|
|
|
// displaying in XOutDev
|
|
m_aFillAttributeSet.Put( XFillGradientItem( OUString(), aBGradient ) );
|
|
m_aCtlPreview.SetAttributes(m_aFillAttributeSet);
|
|
m_aCtlPreview.Invalidate();
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxGradientTabPage, ClickAddHdl_Impl, weld::Button&, void)
|
|
{
|
|
OUString aNewName( SvxResId( RID_SVXSTR_GRADIENT ) );
|
|
OUString aDesc( CuiResId( RID_CUISTR_DESC_GRADIENT ) );
|
|
OUString aName;
|
|
|
|
tools::Long nCount = m_pGradientList->Count();
|
|
tools::Long j = 1;
|
|
bool bValidGradientName = false;
|
|
|
|
while( !bValidGradientName )
|
|
{
|
|
aName = aNewName + " " + OUString::number( j++ );
|
|
bValidGradientName = (SearchGradientList(aName) == -1);
|
|
}
|
|
|
|
SvxNameDialog aDlg(GetFrameWeld(), aName, aDesc);
|
|
sal_uInt16 nError = 1;
|
|
|
|
while (aDlg.run() == RET_OK)
|
|
{
|
|
aName = aDlg.GetName();
|
|
|
|
bValidGradientName = (SearchGradientList(aName) == -1);
|
|
|
|
if (bValidGradientName)
|
|
{
|
|
nError = 0;
|
|
break;
|
|
}
|
|
|
|
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetFrameWeld(), u"cui/ui/queryduplicatedialog.ui"_ustr));
|
|
std::unique_ptr<weld::MessageDialog> xWarnBox(xBuilder->weld_message_dialog(u"DuplicateNameDialog"_ustr));
|
|
if (xWarnBox->run() != RET_OK)
|
|
break;
|
|
}
|
|
|
|
if( !nError )
|
|
{
|
|
sal_uInt16 nValue = 0; // automatic step count
|
|
if (!m_xCbIncrement->get_active())
|
|
nValue = m_xMtrIncrement->get_value();
|
|
basegfx::BGradient aBGradient(
|
|
createColorStops(),
|
|
static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active()),
|
|
Degree10(static_cast<sal_Int16>((m_xMtrAngle->get_value(FieldUnit::NONE) % 360) * 10)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterY->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrBorder->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorFrom->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorTo->get_value(FieldUnit::NONE)),
|
|
nValue);
|
|
|
|
m_pGradientList->Insert(std::make_unique<XGradientEntry>(aBGradient, aName), nCount);
|
|
|
|
Bitmap aBitmap = m_pGradientList->CreateBitmap(nCount, m_xGradientLB->GetIconSize());
|
|
m_xGradientPresets->insert(nCount, nullptr, nullptr, &aBitmap, nullptr);
|
|
m_xGradientPresets->set_item_accessible_name(nCount, aName);
|
|
m_xGradientPresets->set_item_tooltip_text(nCount, aName);
|
|
m_xGradientPresets->select(nCount);
|
|
|
|
m_nGradientListState |= ChangeType::MODIFIED;
|
|
|
|
ChangeGradientHdl_Impl();
|
|
}
|
|
|
|
// determine button state
|
|
if (m_pGradientList->Count())
|
|
m_xBtnModify->set_sensitive(true);
|
|
}
|
|
|
|
|
|
IMPL_LINK_NOARG(SvxGradientTabPage, ClickModifyHdl_Impl, weld::Button&, void)
|
|
{
|
|
const int nPos = m_xGradientPresets->get_selected_index();
|
|
|
|
if (nPos < 0)
|
|
return;
|
|
|
|
OUString aName(m_pGradientList->GetGradient(nPos)->GetName());
|
|
|
|
sal_uInt16 nValue = 0; // automatic step count
|
|
if (!m_xCbIncrement->get_active())
|
|
nValue = m_xMtrIncrement->get_value();
|
|
|
|
basegfx::BGradient aBGradient(
|
|
createColorStops(),
|
|
static_cast<css::awt::GradientStyle>(m_xLbGradientType->get_active()),
|
|
Degree10(static_cast<sal_Int16>((m_xMtrAngle->get_value(FieldUnit::NONE) % 360) * 10)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrCenterY->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrBorder->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorFrom->get_value(FieldUnit::NONE)),
|
|
static_cast<sal_uInt16>(m_xMtrColorTo->get_value(FieldUnit::NONE)),
|
|
nValue);
|
|
|
|
m_pGradientList->Replace(std::make_unique<XGradientEntry>(aBGradient, aName), nPos);
|
|
|
|
Bitmap aBitmap = m_pGradientList->CreateBitmap(nPos, m_xGradientLB->GetIconSize());
|
|
m_xGradientPresets->remove(nPos);
|
|
m_xGradientPresets->insert(nPos, nullptr, nullptr, &aBitmap, nullptr);
|
|
m_xGradientPresets->set_item_accessible_name(nPos, aName);
|
|
m_xGradientPresets->set_item_tooltip_text(nPos, aName);
|
|
m_xGradientPresets->select(nPos);
|
|
|
|
m_nGradientListState |= ChangeType::MODIFIED;
|
|
}
|
|
|
|
IMPL_LINK(SvxGradientTabPage, ClickDeleteHdl_Impl, int, nPos, void)
|
|
{
|
|
if (nPos >= 0)
|
|
{
|
|
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetFrameWeld(), u"cui/ui/querydeletegradientdialog.ui"_ustr));
|
|
std::unique_ptr<weld::MessageDialog> xQueryBox(xBuilder->weld_message_dialog(u"AskDelGradientDialog"_ustr));
|
|
if (xQueryBox->run() == RET_YES)
|
|
{
|
|
const bool bDeletingSelectedItem(nPos == m_xGradientPresets->get_selected_index());
|
|
m_pGradientList->Remove(nPos);
|
|
m_xGradientPresets->remove(nPos);
|
|
if (bDeletingSelectedItem)
|
|
{
|
|
m_xGradientPresets->select(0);
|
|
m_aCtlPreview.Invalidate();
|
|
}
|
|
|
|
ChangeGradientHdl_Impl();
|
|
|
|
m_nGradientListState |= ChangeType::MODIFIED;
|
|
}
|
|
}
|
|
// determine button state
|
|
if( !m_pGradientList->Count() )
|
|
m_xBtnModify->set_sensitive(false);
|
|
}
|
|
|
|
IMPL_LINK(SvxGradientTabPage, ClickRenameHdl_Impl, int, nPos, void)
|
|
{
|
|
if (nPos < 0)
|
|
return;
|
|
|
|
OUString aDesc( CuiResId( RID_CUISTR_DESC_GRADIENT ) );
|
|
OUString aName(m_pGradientList->GetGradient(nPos)->GetName());
|
|
|
|
SvxNameDialog aDlg(GetFrameWeld(), aName, aDesc);
|
|
|
|
bool bLoop = true;
|
|
while (bLoop && aDlg.run() == RET_OK)
|
|
{
|
|
aName = aDlg.GetName();
|
|
sal_Int32 nGradientPos = SearchGradientList(aName);
|
|
bool bValidGradientName = (nGradientPos == nPos) || (nGradientPos == -1);
|
|
|
|
if( bValidGradientName )
|
|
{
|
|
bLoop = false;
|
|
m_pGradientList->GetGradient(nPos)->SetName(aName);
|
|
|
|
m_xGradientPresets->set_item_accessible_name(nPos, aName);
|
|
m_xGradientPresets->set_item_tooltip_text(nPos, aName);
|
|
|
|
m_nGradientListState |= ChangeType::MODIFIED;
|
|
}
|
|
else
|
|
{
|
|
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(GetFrameWeld(), u"cui/ui/queryduplicatedialog.ui"_ustr));
|
|
std::unique_ptr<weld::MessageDialog> xBox(xBuilder->weld_message_dialog(u"DuplicateNameDialog"_ustr));
|
|
xBox->run();
|
|
}
|
|
}
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SvxGradientTabPage, ChangeGradientHdl, const weld::TreeIter&, bool)
|
|
{
|
|
ChangeGradientHdl_Impl();
|
|
return true;
|
|
}
|
|
|
|
void SvxGradientTabPage::ChangeGradientHdl_Impl()
|
|
{
|
|
std::unique_ptr<basegfx::BGradient> pGradient;
|
|
const int nPos = m_xGradientPresets->get_selected_index();
|
|
|
|
if (nPos >= 0)
|
|
pGradient.reset(new basegfx::BGradient(m_pGradientList->GetGradient(nPos)->GetGradient()));
|
|
else
|
|
{
|
|
if( const XFillStyleItem* pFillStyleItem = m_rOutAttrs.GetItemIfSet( GetWhich( XATTR_FILLSTYLE ) ) )
|
|
{
|
|
const XFillGradientItem* pGradientItem;
|
|
if( ( drawing::FillStyle_GRADIENT == pFillStyleItem->GetValue() ) &&
|
|
( pGradientItem = m_rOutAttrs.GetItemIfSet( GetWhich( XATTR_FILLGRADIENT ) ) ) )
|
|
{
|
|
pGradient.reset(new basegfx::BGradient( pGradientItem->GetGradientValue() ));
|
|
}
|
|
}
|
|
if (!pGradient && m_xGradientPresets->n_children() > 0)
|
|
{
|
|
m_xGradientPresets->select(0);
|
|
pGradient.reset(new basegfx::BGradient(m_pGradientList->GetGradient(0)->GetGradient()));
|
|
}
|
|
}
|
|
|
|
if( !pGradient )
|
|
return;
|
|
|
|
css::awt::GradientStyle eXGS = pGradient->GetGradientStyle();
|
|
sal_uInt16 nValue = pGradient->GetSteps();
|
|
if (const XGradientStepCountItem* pGradientStepCountItem = m_rOutAttrs.GetItemIfSet(GetWhich(XATTR_GRADIENTSTEPCOUNT)))
|
|
{
|
|
nValue = pGradientStepCountItem->GetValue();
|
|
}
|
|
if( nValue == 0 )
|
|
{
|
|
m_xCbIncrement->set_state(TRISTATE_TRUE);
|
|
m_xMtrIncrement->set_sensitive(false);
|
|
}
|
|
else
|
|
{
|
|
m_xCbIncrement->set_state(TRISTATE_FALSE);
|
|
m_xMtrIncrement->set_sensitive(true);
|
|
m_xMtrIncrement->set_value( nValue );
|
|
}
|
|
m_xLbGradientType->set_active(
|
|
sal::static_int_cast< sal_Int32 >( eXGS ) );
|
|
// if the entry is not in the listbox,
|
|
// colors are added temporarily
|
|
m_xLbColorFrom->SetNoSelection();
|
|
m_xLbColorFrom->SelectEntry(Color(pGradient->GetColorStops().front().getStopColor()));
|
|
|
|
m_xLbColorTo->SetNoSelection();
|
|
m_xLbColorTo->SelectEntry(Color(pGradient->GetColorStops().back().getStopColor()));
|
|
|
|
// MCGR: preserve ColorStops if given.
|
|
// tdf#155901 We need offset of first and last stop, so include them.
|
|
if (pGradient->GetColorStops().size() >= 2)
|
|
m_aColorStops = pGradient->GetColorStops();
|
|
else
|
|
m_aColorStops.clear();
|
|
|
|
m_xMtrAngle->set_value(pGradient->GetAngle().get() / 10, FieldUnit::NONE);
|
|
m_xSliderAngle->set_value(pGradient->GetAngle().get() / 10);
|
|
m_xMtrBorder->set_value(pGradient->GetBorder(), FieldUnit::NONE);
|
|
m_xSliderBorder->set_value(pGradient->GetBorder());
|
|
m_xMtrCenterX->set_value(pGradient->GetXOffset(), FieldUnit::NONE);
|
|
m_xMtrCenterY->set_value(pGradient->GetYOffset(), FieldUnit::NONE);
|
|
m_xMtrColorFrom->set_value(pGradient->GetStartIntens(), FieldUnit::NONE);
|
|
m_xMtrColorTo->set_value(pGradient->GetEndIntens(), FieldUnit::NONE);
|
|
|
|
// disable/enable controls
|
|
SetControlState_Impl( eXGS );
|
|
|
|
// fill ItemSet and pass it on to aCtlPreview
|
|
m_aFillAttributeSet.Put( XFillGradientItem( OUString(), *pGradient ) );
|
|
m_aFillAttributeSet.Put( XGradientStepCountItem( nValue ) );
|
|
m_aCtlPreview.SetAttributes(m_aFillAttributeSet);
|
|
|
|
m_aCtlPreview.Invalidate();
|
|
}
|
|
|
|
void SvxGradientTabPage::SetControlState_Impl( css::awt::GradientStyle eXGS )
|
|
{
|
|
switch( eXGS )
|
|
{
|
|
case css::awt::GradientStyle_LINEAR:
|
|
case css::awt::GradientStyle_AXIAL:
|
|
m_xFtCenter->set_sensitive(false);
|
|
m_xMtrCenterX->set_sensitive(false);
|
|
m_xMtrCenterY->set_sensitive(false);
|
|
m_xFtAngle->set_sensitive(true);
|
|
m_xMtrAngle->set_sensitive(true);
|
|
m_xSliderAngle->set_sensitive(true);
|
|
break;
|
|
|
|
case css::awt::GradientStyle_RADIAL:
|
|
m_xFtCenter->set_sensitive(true);
|
|
m_xMtrCenterX->set_sensitive(true);
|
|
m_xMtrCenterY->set_sensitive(true);
|
|
m_xFtAngle->set_sensitive(false);
|
|
m_xMtrAngle->set_sensitive(false);
|
|
m_xSliderAngle->set_sensitive(false);
|
|
break;
|
|
|
|
case css::awt::GradientStyle_ELLIPTICAL:
|
|
case css::awt::GradientStyle_SQUARE:
|
|
case css::awt::GradientStyle_RECT:
|
|
m_xFtCenter->set_sensitive(true);
|
|
m_xMtrCenterX->set_sensitive(true);
|
|
m_xMtrCenterY->set_sensitive(true);
|
|
m_xFtAngle->set_sensitive(true);
|
|
m_xMtrAngle->set_sensitive(true);
|
|
m_xSliderAngle->set_sensitive(true);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
sal_Int32 SvxGradientTabPage::SearchGradientList(std::u16string_view rGradientName)
|
|
{
|
|
tools::Long nCount = m_pGradientList->Count();
|
|
bool bValidGradientName = true;
|
|
sal_Int32 nPos = -1;
|
|
|
|
for(tools::Long i = 0;i < nCount && bValidGradientName;i++)
|
|
{
|
|
if(rGradientName == m_pGradientList->GetGradient( i )->GetName())
|
|
{
|
|
nPos = i;
|
|
bValidGradientName = false;
|
|
}
|
|
}
|
|
return nPos;
|
|
}
|
|
|
|
basegfx::BColorStops SvxGradientTabPage::createColorStops()
|
|
{
|
|
basegfx::BColorStops aColorStops = m_aColorStops;
|
|
|
|
aColorStops.changeStartAndEnd(
|
|
m_xLbColorFrom->GetSelectEntryColor().getBColor(),
|
|
m_xLbColorTo->GetSelectEntryColor().getBColor());
|
|
|
|
return aColorStops;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|