36#include <svx/strings.hrc>
39#define DEFAULT_GRADIENTSTEP 64
44 :
SfxTabPage(pPage, pController,
"cui/ui/gradientpage.ui",
"GradientPage", &rInAttrs)
45 , m_rOutAttrs(rInAttrs)
46 , m_pnGradientListState(nullptr)
47 , m_pnColorListState(nullptr)
48 , m_aXFillAttr(rInAttrs.GetPool())
50 , m_xLbGradientType(m_xBuilder->weld_combo_box(
"gradienttypelb"))
51 , m_xFtCenter(m_xBuilder->weld_label(
"centerft"))
52 , m_xMtrCenterX(m_xBuilder->weld_metric_spin_button(
"centerxmtr",
FieldUnit::
PERCENT))
53 , m_xMtrCenterY(m_xBuilder->weld_metric_spin_button(
"centerymtr",
FieldUnit::
PERCENT))
54 , m_xFtAngle(m_xBuilder->weld_label(
"angleft"))
55 , m_xMtrAngle(m_xBuilder->weld_metric_spin_button(
"anglemtr",
FieldUnit::
DEGREE))
56 , m_xSliderAngle(m_xBuilder->weld_scale(
"angleslider"))
57 , m_xMtrBorder(m_xBuilder->weld_metric_spin_button(
"bordermtr",
FieldUnit::
PERCENT))
58 , m_xSliderBorder(m_xBuilder->weld_scale(
"borderslider"))
59 , m_xLbColorFrom(new
ColorListBox(m_xBuilder->weld_menu_button(
"colorfromlb"),
61 , m_xMtrColorFrom(m_xBuilder->weld_metric_spin_button(
"colorfrommtr", FieldUnit::PERCENT))
62 , m_xLbColorTo(
new ColorListBox(m_xBuilder->weld_menu_button(
"colortolb"),
63 [
this]{ return GetDialogController()->getDialog(); }))
64 , m_xMtrColorTo(m_xBuilder->weld_metric_spin_button(
"colortomtr", FieldUnit::PERCENT))
65 , m_xGradientLB(
new SvxPresetListBox(m_xBuilder->weld_scrolled_window(
"gradientpresetlistwin",
true)))
66 , m_xMtrIncrement(m_xBuilder->weld_spin_button(
"incrementmtr"))
67 , m_xCbIncrement(m_xBuilder->weld_check_button(
"autoincrement"))
68 , m_xBtnAdd(m_xBuilder->weld_button(
"add"))
69 , m_xBtnModify(m_xBuilder->weld_button(
"modify"))
70 , m_xCtlPreview(
new weld::CustomWeld(*m_xBuilder,
"previewctl", m_aCtlPreview))
71 , m_xGradientLBWin(
new weld::CustomWeld(*m_xBuilder,
"gradientpresetlist", *m_xGradientLB))
74 m_xGradientLB->set_size_request(aSize.
Width(), aSize.
Height());
75 m_xCtlPreview->set_size_request(aSize.
Width(), aSize.
Height());
81 m_xMtrColorTo->set_value(100, FieldUnit::PERCENT);
82 m_xMtrColorFrom->set_value(100, FieldUnit::PERCENT);
87 m_aCtlPreview.SetAttributes(m_aXFillAttr.GetItemSet());
98 m_xLbGradientType->connect_changed( aLink2 );
101 m_xMtrCenterX->connect_value_changed( aLink );
102 m_xMtrCenterY->connect_value_changed( aLink );
103 m_xMtrAngle->connect_value_changed( aLink );
105 m_xMtrBorder->connect_value_changed( aLink );
107 m_xMtrColorFrom->connect_value_changed( aLink );
109 m_xLbColorFrom->SetSelectHdl( aLink3 );
110 m_xMtrColorTo->connect_value_changed( aLink );
111 m_xLbColorTo->SetSelectHdl( aLink3 );
113 m_xGradientLB->SetStyle(WB_FLATVALUESET | WB_NO_DIRECTSELECT | WB_TABSTOP);
116 m_aCtlPreview.EnableRTL(
false);
152 OUString aString =
CuiResId( RID_CUISTR_TABLE ) +
": ";
156 SAL_WARN_IF(
aURL.GetProtocol() == INetProtocol::NotValid,
"cui.tabpages",
"invalid URL" );
158 if (
aURL.getBase().getLength() > 18 )
160 aString += OUString::Concat(
aURL.getBase().subView( 0, 15 )) +
"...";
163 aString +=
aURL.getBase();
181 return DeactivateRC::LeavePage;
186 std::unique_ptr<XGradient> pXGradient;
201 static_cast<sal_uInt16
>(
m_xMtrCenterX->get_value(FieldUnit::NONE)),
202 static_cast<sal_uInt16
>(
m_xMtrCenterY->get_value(FieldUnit::NONE)),
203 static_cast<sal_uInt16
>(
m_xMtrBorder->get_value(FieldUnit::NONE)),
205 static_cast<sal_uInt16
>(
m_xMtrColorTo->get_value(FieldUnit::NONE)),
214 assert( pXGradient &&
"XGradient could not be created" );
235 return std::make_unique<SvxGradientTabPage>(pPage, pController, *rOutAttrs);
240 ModifiedHdl_Impl(&rListBox);
242 m_xGradientLB->SetNoSelection();
247 ModifiedHdl_Impl(&rListBox);
248 m_xGradientLB->SetNoSelection();
253 ModifiedHdl_Impl(&rBox);
254 m_xGradientLB->SetNoSelection();
259 ModifiedHdl_Impl(&rBox);
260 m_xGradientLB->SetNoSelection();
265 ModifiedHdl_Impl(&rSlider);
266 m_xGradientLB->SetNoSelection();
271 if (m_xCbIncrement->get_active())
273 m_xMtrIncrement->set_sensitive(
false);
277 m_xMtrIncrement->set_sensitive(
true);
279 ModifiedHdl_Impl(m_xMtrIncrement.get());
293 css::awt::GradientStyle eXGS =
static_cast<css::awt::GradientStyle
>(
m_xLbGradientType->get_active());
299 static_cast<sal_uInt16
>(
m_xMtrCenterX->get_value(FieldUnit::NONE)),
300 static_cast<sal_uInt16
>(
m_xMtrCenterY->get_value(FieldUnit::NONE)),
301 static_cast<sal_uInt16
>(
m_xMtrBorder->get_value(FieldUnit::NONE)),
303 static_cast<sal_uInt16
>(
m_xMtrColorTo->get_value(FieldUnit::NONE)),
323 OUString aNewName(
SvxResId( RID_SVXSTR_GRADIENT ) );
324 OUString aDesc(
CuiResId( RID_CUISTR_DESC_GRADIENT ) );
329 bool bValidGradientName =
false;
331 while( !bValidGradientName )
333 aName = aNewName +
" " + OUString::number( j++ );
334 bValidGradientName = (SearchGradientList(
aName) == -1);
339 sal_uInt16 nError = 1;
341 while (pDlg->Execute() ==
RET_OK)
343 pDlg->GetName(
aName );
345 bValidGradientName = (SearchGradientList(
aName) == -1);
347 if (bValidGradientName)
354 std::unique_ptr<weld::MessageDialog> xWarnBox(xBuilder->weld_message_dialog(
"DuplicateNameDialog"));
355 if (xWarnBox->run() !=
RET_OK)
362 XGradient aXGradient( m_xLbColorFrom->GetSelectEntryColor(),
363 m_xLbColorTo->GetSelectEntryColor(),
364 static_cast<css::awt::GradientStyle
>(m_xLbGradientType->get_active()),
365 Degree10(
static_cast<sal_Int16
>(m_xMtrAngle->get_value(FieldUnit::NONE) * 10)),
366 static_cast<sal_uInt16
>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
367 static_cast<sal_uInt16
>(m_xMtrCenterY->get_value(FieldUnit::NONE)),
368 static_cast<sal_uInt16
>(m_xMtrBorder->get_value(FieldUnit::NONE)),
369 static_cast<sal_uInt16
>(m_xMtrColorFrom->get_value(FieldUnit::NONE)),
370 static_cast<sal_uInt16
>(m_xMtrColorTo->get_value(FieldUnit::NONE)),
371 static_cast<sal_uInt16
>(m_xMtrIncrement->get_value()) );
373 m_pGradientList->Insert(std::make_unique<XGradientEntry>(aXGradient,
aName),
nCount);
375 sal_Int32
nId = m_xGradientLB->GetItemId(
nCount - 1);
376 BitmapEx aBitmap = m_pGradientList->GetBitmapForPreview(
nCount, m_xGradientLB->GetIconSize() );
378 m_xGradientLB->SelectItem(
nId + 1 );
379 m_xGradientLB->Resize();
381 *m_pnGradientListState |= ChangeType::MODIFIED;
383 ChangeGradientHdl_Impl();
387 if (m_pGradientList->Count())
388 m_xBtnModify->set_sensitive(
true);
394 sal_uInt16
nId = m_xGradientLB->GetSelectedItemId();
395 size_t nPos = m_xGradientLB->GetSelectItemPos();
400 OUString
aName( m_pGradientList->GetGradient(
static_cast<sal_uInt16
>(
nPos) )->GetName() );
402 XGradient aXGradient( m_xLbColorFrom->GetSelectEntryColor(),
403 m_xLbColorTo->GetSelectEntryColor(),
404 static_cast<css::awt::GradientStyle
>(m_xLbGradientType->get_active()),
405 Degree10(
static_cast<sal_Int16
>(m_xMtrAngle->get_value(FieldUnit::NONE) * 10)),
406 static_cast<sal_uInt16
>(m_xMtrCenterX->get_value(FieldUnit::NONE)),
407 static_cast<sal_uInt16
>(m_xMtrCenterY->get_value(FieldUnit::NONE)),
408 static_cast<sal_uInt16
>(m_xMtrBorder->get_value(FieldUnit::NONE)),
409 static_cast<sal_uInt16
>(m_xMtrColorFrom->get_value(FieldUnit::NONE)),
410 static_cast<sal_uInt16
>(m_xMtrColorTo->get_value(FieldUnit::NONE)),
411 static_cast<sal_uInt16
>(m_xMtrIncrement->get_value()) );
413 m_pGradientList->Replace(std::make_unique<XGradientEntry>(aXGradient,
aName),
nPos);
415 BitmapEx aBitmap = m_pGradientList->GetBitmapForPreview(
static_cast<sal_uInt16
>(
nPos), m_xGradientLB->GetIconSize() );
416 m_xGradientLB->RemoveItem(
nId );
417 m_xGradientLB->InsertItem(
nId,
Image(aBitmap),
aName,
static_cast<sal_uInt16
>(
nPos) );
418 m_xGradientLB->SelectItem(
nId );
420 *m_pnGradientListState |= ChangeType::MODIFIED;
425 sal_uInt16
nId = m_xGradientLB->GetSelectedItemId();
426 size_t nPos = m_xGradientLB->GetSelectItemPos();
431 std::unique_ptr<weld::MessageDialog> xQueryBox(xBuilder->weld_message_dialog(
"AskDelGradientDialog"));
432 if (xQueryBox->run() ==
RET_YES)
434 m_pGradientList->Remove(
nPos);
435 m_xGradientLB->RemoveItem(
nId );
436 nId = m_xGradientLB->GetItemId( 0 );
437 m_xGradientLB->SelectItem(
nId );
438 m_xGradientLB->Resize();
440 m_aCtlPreview.Invalidate();
442 ChangeGradientHdl_Impl();
444 *m_pnGradientListState |= ChangeType::MODIFIED;
448 if( !m_pGradientList->Count() )
449 m_xBtnModify->set_sensitive(
false);
454 sal_uInt16
nId = m_xGradientLB->GetSelectedItemId();
455 size_t nPos = m_xGradientLB->GetSelectItemPos();
460 OUString aDesc(
CuiResId( RID_CUISTR_DESC_GRADIENT ) );
461 OUString
aName( m_pGradientList->GetGradient(
nPos )->GetName() );
467 while( bLoop && pDlg->Execute() ==
RET_OK )
469 pDlg->GetName(
aName );
470 sal_Int32 nGradientPos = SearchGradientList(
aName);
471 bool bValidGradientName = (nGradientPos ==
static_cast<sal_Int32
>(
nPos) ) || (nGradientPos == -1);
473 if( bValidGradientName )
476 m_pGradientList->GetGradient(
nPos)->SetName(
aName);
478 m_xGradientLB->SetItemText(
nId,
aName );
479 m_xGradientLB->SelectItem(
nId );
481 *m_pnGradientListState |= ChangeType::MODIFIED;
486 std::unique_ptr<weld::MessageDialog> xBox(xBuilder->weld_message_dialog(
"DuplicateNameDialog"));
494 ChangeGradientHdl_Impl();
499 std::unique_ptr<XGradient> pGradient;
509 if( ( drawing::FillStyle_GRADIENT == pFillStyleItem->GetValue() ) &&
527 css::awt::GradientStyle eXGS = pGradient->GetGradientStyle();
528 sal_uInt16
nValue = pGradient->GetSteps();
541 sal::static_int_cast< sal_Int32 >( eXGS ) );
550 m_xMtrAngle->set_value(pGradient->GetAngle().get() / 10, FieldUnit::NONE);
552 m_xMtrBorder->set_value(pGradient->GetBorder(), FieldUnit::NONE);
554 m_xMtrCenterX->set_value(pGradient->GetXOffset(), FieldUnit::NONE);
555 m_xMtrCenterY->set_value(pGradient->GetYOffset(), FieldUnit::NONE);
556 m_xMtrColorFrom->set_value(pGradient->GetStartIntens(), FieldUnit::NONE);
557 m_xMtrColorTo->set_value(pGradient->GetEndIntens(), FieldUnit::NONE);
574 case css::awt::GradientStyle_LINEAR:
575 case css::awt::GradientStyle_AXIAL:
584 case css::awt::GradientStyle_RADIAL:
593 case css::awt::GradientStyle_ELLIPTICAL:
602 case css::awt::GradientStyle_SQUARE:
603 case css::awt::GradientStyle_RECT:
619 bool bValidGradientName =
true;
627 bValidGradientName =
false;
static std::unique_ptr< weld::Builder > CreateBuilder(weld::Widget *pParent, const OUString &rUIFile, bool bMobile=false, sal_uInt64 nLOKWindowId=0)
const T * GetItemIfSet(TypedWhichId< T > nWhich, bool bSrchInParent=true) const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
SfxOkDialogController * GetDialogController() const
sal_uInt16 GetWhich(sal_uInt16 nSlot, bool bDeep=true) const
constexpr tools::Long Height() const
constexpr tools::Long Width() const
virtual VclPtr< AbstractSvxNameDialog > CreateSvxNameDialog(weld::Window *pParent, const OUString &rName, const OUString &rDesc)=0
static SvxAbstractDialogFactory * Create()
const XColorListRef & GetNewColorList() const
std::unique_ptr< weld::SpinButton > m_xMtrIncrement
static std::unique_ptr< SfxTabPage > Create(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet *)
virtual void Reset(const SfxItemSet *) override
std::unique_ptr< ColorListBox > m_xLbColorFrom
std::unique_ptr< weld::MetricSpinButton > m_xMtrCenterX
virtual void ActivatePage(const SfxItemSet &rSet) override
std::unique_ptr< weld::CustomWeld > m_xGradientLBWin
std::unique_ptr< weld::Label > m_xFtAngle
std::unique_ptr< weld::MetricSpinButton > m_xMtrColorFrom
void SetControlState_Impl(css::awt::GradientStyle eXGS)
std::unique_ptr< weld::CheckButton > m_xCbIncrement
std::unique_ptr< weld::ComboBox > m_xLbGradientType
SvxXRectPreview m_aCtlPreview
void ChangeGradientHdl_Impl()
XFillAttrSetItem m_aXFillAttr
void ModifiedHdl_Impl(void const *)
virtual DeactivateRC DeactivatePage(SfxItemSet *pSet) override
std::unique_ptr< weld::Button > m_xBtnModify
std::unique_ptr< weld::CustomWeld > m_xCtlPreview
std::unique_ptr< ColorListBox > m_xLbColorTo
sal_Int32 SearchGradientList(std::u16string_view rGradientName)
std::unique_ptr< weld::Scale > m_xSliderAngle
std::unique_ptr< weld::Scale > m_xSliderBorder
XGradientListRef m_pGradientList
SvxGradientTabPage(weld::Container *pPage, weld::DialogController *pController, const SfxItemSet &rInAttrs)
virtual bool FillItemSet(SfxItemSet *) override
virtual ~SvxGradientTabPage() override
std::unique_ptr< SvxPresetListBox > m_xGradientLB
std::unique_ptr< weld::Label > m_xFtCenter
ChangeType * m_pnColorListState
XColorListRef m_pColorList
std::unique_ptr< weld::MetricSpinButton > m_xMtrColorTo
const SfxItemSet & m_rOutAttrs
std::unique_ptr< weld::MetricSpinButton > m_xMtrBorder
std::unique_ptr< weld::MetricSpinButton > m_xMtrCenterY
std::unique_ptr< weld::MetricSpinButton > m_xMtrAngle
void SetAttributes(const SfxItemSet &rItemSet)
const XGradient & GetGradientValue() const
OUString CuiResId(TranslateId aKey)
SVXCORE_DLLPUBLIC OUString SvxResId(TranslateId aId)
weld::Window * GetFrameWeld(const SfxFrame *pFrame)
Size SFX2_DLLPUBLIC getDrawPreviewOptimalSize(const OutputDevice &rReference)
#define LINK(Instance, Class, Member)
#define SAL_WARN_IF(condition, area, stream)
IMPL_LINK(SvxGradientTabPage, ModifiedListBoxHdl_Impl, weld::ComboBox &, rListBox, void)
#define DEFAULT_GRADIENTSTEP
IMPL_LINK_NOARG(SvxGradientTabPage, ChangeAutoStepHdl_Impl, weld::Toggleable &, void)
#define VALUESET_ITEM_NOTFOUND
constexpr OUStringLiteral PERCENT(u"Percent")
constexpr TypedWhichId< XFillStyleItem > XATTR_FILLSTYLE(XATTR_FILL_FIRST)
constexpr TypedWhichId< XFillGradientItem > XATTR_FILLGRADIENT(XATTR_FILL_FIRST+2)