diff options
-rw-r--r-- | cui/source/inc/numpages.hxx | 12 | ||||
-rw-r--r-- | cui/source/tabpages/numpages.cxx | 41 | ||||
-rw-r--r-- | cui/uiconfig/ui/pickbulletpage.ui | 25 | ||||
-rw-r--r-- | include/svx/numvset.hxx | 38 | ||||
-rw-r--r-- | include/vcl/customweld.hxx | 1 | ||||
-rw-r--r-- | svx/source/dialog/svxbmpnumvalueset.cxx | 330 |
6 files changed, 417 insertions, 30 deletions
diff --git a/cui/source/inc/numpages.hxx b/cui/source/inc/numpages.hxx index cac9a110959c..2d22a18b8076 100644 --- a/cui/source/inc/numpages.hxx +++ b/cui/source/inc/numpages.hxx @@ -37,6 +37,7 @@ #define MN_GALLERY_ENTRY 100 +class NumValueSet; class SvxColorListBox; class SvxNumRule; class SvxBmpNumValueSet; @@ -121,7 +122,6 @@ class SvxBulletPickTabPage final : public SfxTabPage using TabPage::ActivatePage; using TabPage::DeactivatePage; - VclPtr<SvxNumValueSet> m_pExamplesVS; std::unique_ptr<SvxNumRule> pActNum; std::unique_ptr<SvxNumRule> pSaveNum; sal_uInt16 nActNumLvl; @@ -131,11 +131,13 @@ class SvxBulletPickTabPage final : public SfxTabPage OUString sBulletCharFormatName; - DECL_LINK(NumSelectHdl_Impl, ValueSet*, void); - DECL_LINK(DoubleClickHdl_Impl, ValueSet*, void); + std::unique_ptr<NumValueSet> m_xExamplesVS; + std::unique_ptr<weld::CustomWeld> m_xExamplesVSWin; + + DECL_LINK(NumSelectHdl_Impl, SvtValueSet*, void); + DECL_LINK(DoubleClickHdl_Impl, SvtValueSet*, void); public: - SvxBulletPickTabPage(vcl::Window* pParent, - const SfxItemSet& rSet); + SvxBulletPickTabPage(TabPageParent pParent, const SfxItemSet& rSet); virtual ~SvxBulletPickTabPage() override; virtual void dispose() override; diff --git a/cui/source/tabpages/numpages.cxx b/cui/source/tabpages/numpages.cxx index 6f5445084751..aa40c183bc51 100644 --- a/cui/source/tabpages/numpages.cxx +++ b/cui/source/tabpages/numpages.cxx @@ -357,19 +357,19 @@ IMPL_LINK_NOARG(SvxSingleNumPickTabPage, DoubleClickHdl_Impl, ValueSet*, void) } -SvxBulletPickTabPage::SvxBulletPickTabPage(vcl::Window* pParent, - const SfxItemSet& rSet) - : SfxTabPage(pParent, "PickBulletPage", "cui/ui/pickbulletpage.ui", &rSet) +SvxBulletPickTabPage::SvxBulletPickTabPage(TabPageParent pParent, const SfxItemSet& rSet) + : SfxTabPage(pParent, "cui/ui/pickbulletpage.ui", "PickBulletPage", &rSet) , nActNumLvl(SAL_MAX_UINT16) , bModified(false) , bPreset(false) , nNumItemId(SID_ATTR_NUMBERING_RULE) + , m_xExamplesVS(new NumValueSet) + , m_xExamplesVSWin(new weld::CustomWeld(*m_xBuilder, "valueset", *m_xExamplesVS)) { SetExchangeSupport(); - get(m_pExamplesVS, "valueset"); - m_pExamplesVS->init(NumberingPageType::BULLET); - m_pExamplesVS->SetSelectHdl(LINK(this, SvxBulletPickTabPage, NumSelectHdl_Impl)); - m_pExamplesVS->SetDoubleClickHdl(LINK(this, SvxBulletPickTabPage, DoubleClickHdl_Impl)); + m_xExamplesVS->init(NumberingPageType::BULLET); + m_xExamplesVS->SetSelectHdl(LINK(this, SvxBulletPickTabPage, NumSelectHdl_Impl)); + m_xExamplesVS->SetDoubleClickHdl(LINK(this, SvxBulletPickTabPage, DoubleClickHdl_Impl)); } SvxBulletPickTabPage::~SvxBulletPickTabPage() @@ -379,16 +379,15 @@ SvxBulletPickTabPage::~SvxBulletPickTabPage() void SvxBulletPickTabPage::dispose() { - pActNum.reset(); - pSaveNum.reset(); - m_pExamplesVS.clear(); + m_xExamplesVSWin.reset(); + m_xExamplesVS.reset(); SfxTabPage::dispose(); } -VclPtr<SfxTabPage> SvxBulletPickTabPage::Create( TabPageParent pParent, - const SfxItemSet* rAttrSet) +VclPtr<SfxTabPage> SvxBulletPickTabPage::Create(TabPageParent pParent, + const SfxItemSet* rAttrSet) { - return VclPtr<SvxBulletPickTabPage>::Create(pParent.pParent, *rAttrSet); + return VclPtr<SvxBulletPickTabPage>::Create(pParent, *rAttrSet); } bool SvxBulletPickTabPage::FillItemSet( SfxItemSet* rSet ) @@ -422,13 +421,13 @@ void SvxBulletPickTabPage::ActivatePage(const SfxItemSet& rSet) if(pActNum && *pSaveNum != *pActNum) { *pActNum = *pSaveNum; - m_pExamplesVS->SetNoSelection(); + m_xExamplesVS->SetNoSelection(); } if(pActNum && (!lcl_IsNumFmtSet(pActNum.get(), nActNumLvl) || bIsPreset)) { - m_pExamplesVS->SelectItem(1); - NumSelectHdl_Impl(m_pExamplesVS); + m_xExamplesVS->SelectItem(1); + NumSelectHdl_Impl(m_xExamplesVS.get()); bPreset = true; } bPreset |= bIsPreset; @@ -468,13 +467,13 @@ void SvxBulletPickTabPage::Reset( const SfxItemSet* rSet ) *pActNum = *pSaveNum; } -IMPL_LINK_NOARG(SvxBulletPickTabPage, NumSelectHdl_Impl, ValueSet*, void) +IMPL_LINK_NOARG(SvxBulletPickTabPage, NumSelectHdl_Impl, SvtValueSet*, void) { if(pActNum) { bPreset = false; bModified = true; - sal_Unicode cChar = aBulletTypes[m_pExamplesVS->GetSelectedItemId() - 1]; + sal_Unicode cChar = aBulletTypes[m_xExamplesVS->GetSelectedItemId() - 1]; const vcl::Font& rActBulletFont = lcl_GetDefaultBulletFont(); sal_uInt16 nMask = 1; @@ -498,15 +497,13 @@ IMPL_LINK_NOARG(SvxBulletPickTabPage, NumSelectHdl_Impl, ValueSet*, void) } } - -IMPL_LINK_NOARG(SvxBulletPickTabPage, DoubleClickHdl_Impl, ValueSet*, void) +IMPL_LINK_NOARG(SvxBulletPickTabPage, DoubleClickHdl_Impl, SvtValueSet*, void) { - NumSelectHdl_Impl(m_pExamplesVS); + NumSelectHdl_Impl(m_xExamplesVS.get()); PushButton& rOk = GetTabDialog()->GetOKButton(); rOk.GetClickHdl().Call(&rOk); } - void SvxBulletPickTabPage::PageCreated(const SfxAllItemSet& aSet) { const SfxStringItem* pBulletCharFmt = aSet.GetItem<SfxStringItem>(SID_BULLET_CHAR_FMT, false); diff --git a/cui/uiconfig/ui/pickbulletpage.ui b/cui/uiconfig/ui/pickbulletpage.ui index da2a1dae0198..8070ff6fbd46 100644 --- a/cui/uiconfig/ui/pickbulletpage.ui +++ b/cui/uiconfig/ui/pickbulletpage.ui @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> <interface domain="cui"> - <!-- interface-requires gtk+ 3.0 --> + <requires lib="gtk+" version="3.0"/> <object class="GtkFrame" id="PickBulletPage"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -18,11 +19,29 @@ <property name="top_padding">6</property> <property name="left_padding">12</property> <child> - <object class="svxlo-SvxNumValueSet" id="valueset"> + <object class="GtkScrolledWindow" id="valuesetwin"> <property name="visible">True</property> - <property name="can_focus">False</property> + <property name="can_focus">True</property> <property name="hexpand">True</property> <property name="vexpand">True</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkViewport"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkDrawingArea" id="valueset"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + </object> + </child> + </object> + </child> </object> </child> </object> diff --git a/include/svx/numvset.hxx b/include/svx/numvset.hxx index 63eae7cd77c1..e01e9aa171a1 100644 --- a/include/svx/numvset.hxx +++ b/include/svx/numvset.hxx @@ -88,6 +88,44 @@ public: const css::lang::Locale& rLocale); }; +class SVX_DLLPUBLIC NumValueSet : public SvtValueSet +{ + NumberingPageType ePageType; + tools::Rectangle aOrgRect; + VclPtr<VirtualDevice> pVDev; + + css::uno::Reference<css::text::XNumberingFormatter> xFormatter; + css::lang::Locale aLocale; + + css::uno::Sequence< + css::uno::Sequence< + css::beans::PropertyValue> > aNumSettings; + + css::uno::Sequence< + css::uno::Reference< + css::container::XIndexAccess> > aOutlineSettings; + +public: + NumValueSet(); + void init(NumberingPageType eType); + virtual ~NumValueSet() override; + + virtual void UserDraw( const UserDrawEvent& rUDEvt ) override; + + void SetNumberingSettings( + const css::uno::Sequence< + css::uno::Sequence<css::beans::PropertyValue> >& aNum, + css::uno::Reference<css::text::XNumberingFormatter> const & xFormatter, + const css::lang::Locale& rLocale ); + + void SetOutlineNumberingSettings( + css::uno::Sequence< + css::uno::Reference<css::container::XIndexAccess> > const & rOutline, + css::uno::Reference<css::text::XNumberingFormatter> const & xFormatter, + const css::lang::Locale& rLocale); +}; + + class SVX_DLLPUBLIC SvxBmpNumValueSet final : public SvxNumValueSet { Idle aFormatIdle; diff --git a/include/vcl/customweld.hxx b/include/vcl/customweld.hxx index 167b5b97b32e..f2d079958d93 100644 --- a/include/vcl/customweld.hxx +++ b/include/vcl/customweld.hxx @@ -65,6 +65,7 @@ public: void CaptureMouse() { m_pDrawingArea->grab_add(); } bool IsMouseCaptured() const { return m_pDrawingArea->has_grab(); } void EnableRTL(bool bEnable) { m_pDrawingArea->set_direction(bEnable); } + bool IsRTLEnabled() const { return m_pDrawingArea->get_direction(); } void ReleaseMouse() { m_pDrawingArea->grab_remove(); } void SetHelpId(const OString& rHelpId) { m_pDrawingArea->set_help_id(rHelpId); } void SetAccessibleName(const OUString& rName) { m_pDrawingArea->set_accessible_name(rName); } diff --git a/svx/source/dialog/svxbmpnumvalueset.cxx b/svx/source/dialog/svxbmpnumvalueset.cxx index 877e5a6cdd39..aae13f758f9c 100644 --- a/svx/source/dialog/svxbmpnumvalueset.cxx +++ b/svx/source/dialog/svxbmpnumvalueset.cxx @@ -485,6 +485,336 @@ void SvxNumValueSet::SetOutlineNumberingSettings( } } +void NumValueSet::UserDraw( const UserDrawEvent& rUDEvt ) +{ + static const sal_uInt16 aLinesArr[] = + { + 15, 10, + 20, 30, + 25, 50, + 30, 70, + 35, 90, // up to here line positions + 5, 10, // character positions + 10, 30, + 15, 50, + 20, 70, + 25, 90, + }; + + const Color aBackColor(COL_WHITE); + const Color aTextColor(COL_BLACK); + + vcl::RenderContext* pDev = rUDEvt.GetRenderContext(); + tools::Rectangle aRect = rUDEvt.GetRect(); + sal_uInt16 nItemId = rUDEvt.GetItemId(); + + long nRectWidth = aRect.GetWidth(); + long nRectHeight = aRect.GetHeight(); + Size aRectSize(nRectWidth, aRect.GetHeight()); + Point aBLPos = aRect.TopLeft(); + vcl::Font aOldFont = pDev->GetFont(); + Color aOldColor = pDev->GetLineColor(); + pDev->SetLineColor(aTextColor); + vcl::Font aFont(OutputDevice::GetDefaultFont( + DefaultFontType::UI_SANS, MsLangId::getSystemLanguage(), GetDefaultFontFlags::OnlyOne)); + + Size aSize = aFont.GetFontSize(); + + vcl::Font aRuleFont( lcl_GetDefaultBulletFont() ); + aSize.setHeight( nRectHeight/6 ); + aRuleFont.SetFontSize(aSize); + aRuleFont.SetColor(aTextColor); + aRuleFont.SetFillColor(aBackColor); + if(ePageType == NumberingPageType::BULLET) + aFont = aRuleFont; + else if(ePageType == NumberingPageType::OUTLINE) + { + aSize.setHeight( nRectHeight/8 ); + } + aFont.SetColor(aTextColor); + aFont.SetFillColor(aBackColor); + aFont.SetFontSize( aSize ); + pDev->SetFont(aFont); + + if(!pVDev) + { + // The lines are only one time in the virtual device, only the outline + // page is currently done + pVDev = VclPtr<VirtualDevice>::Create(*pDev); + pVDev->SetMapMode(pDev->GetMapMode()); + pVDev->EnableRTL( IsRTLEnabled() ); + pVDev->SetOutputSize( aRectSize ); + aOrgRect = aRect; + pVDev->SetFillColor( aBackColor ); + pVDev->SetLineColor(COL_LIGHTGRAY); + // Draw line only once + if(ePageType != NumberingPageType::OUTLINE) + { + Point aStart(aBLPos.X() + nRectWidth *25 / 100,0); + Point aEnd(aBLPos.X() + nRectWidth * 9 / 10,0); + for( sal_uInt16 i = 11; i < 100; i += 33) + { + aStart.setY( aBLPos.Y() + nRectHeight * i / 100 ); + aEnd.setY( aStart.Y() ); + pVDev->DrawLine(aStart, aEnd); + aStart.setY( aBLPos.Y() + nRectHeight * (i + 11) / 100 ); + aEnd.setY( aStart.Y() ); + pVDev->DrawLine(aStart, aEnd); + } + } + } + pDev->DrawOutDev( aRect.TopLeft(), aRectSize, + aOrgRect.TopLeft(), aRectSize, + *pVDev ); + // Now comes the text + const OUString sValue("Value"); + if( NumberingPageType::SINGLENUM == ePageType || + NumberingPageType::BULLET == ePageType ) + { + Point aStart(aBLPos.X() + nRectWidth / 9,0); + for( sal_uInt16 i = 0; i < 3; i++ ) + { + sal_uInt16 nY = 11 + i * 33; + aStart.setY( aBLPos.Y() + nRectHeight * nY / 100 ); + OUString sText; + if(ePageType == NumberingPageType::BULLET) + { + sText = OUString( aBulletTypes[nItemId - 1] ); + aStart.AdjustY( -(pDev->GetTextHeight()/2) ); + aStart.setX( aBLPos.X() + 5 ); + } + else + { + if(xFormatter.is() && aNumSettings.getLength() > nItemId - 1) + { + Sequence<PropertyValue> aLevel = aNumSettings.getConstArray()[nItemId - 1]; + try + { + aLevel.realloc(aLevel.getLength() + 1); + PropertyValue& rValue = aLevel.getArray()[aLevel.getLength() - 1]; + rValue.Name = sValue; + rValue.Value <<= static_cast<sal_Int32>(i + 1); + sText = xFormatter->makeNumberingString( aLevel, aLocale ); + } + catch(Exception&) + { + OSL_FAIL("Exception in DefaultNumberingProvider::makeNumberingString"); + } + } + // start just next to the left edge + aStart.setX( aBLPos.X() + 2 ); + aStart.AdjustY( -(pDev->GetTextHeight()/2) ); + } + pDev->DrawText(aStart, sText); + } + } + else if(NumberingPageType::OUTLINE == ePageType ) + { + // Outline numbering has to be painted into the virtual device + // to get correct lines + // has to be made again + pVDev->SetLineColor(aBackColor); + pVDev->DrawRect(aOrgRect); + long nStartX = aOrgRect.TopLeft().X(); + long nStartY = aOrgRect.TopLeft().Y(); + + if(xFormatter.is() && aOutlineSettings.getLength() > nItemId - 1) + { + Reference<XIndexAccess> xLevel = aOutlineSettings.getArray()[nItemId - 1]; + try + { + OUString sLevelTexts[5]; + OUString sFontNames[5]; + OUString sBulletChars[5]; + sal_Int16 aNumberingTypes[5]; + OUString sPrefixes[5]; + OUString sSuffixes[5]; + sal_Int16 aParentNumberings[5]; + + sal_Int32 nLevelCount = xLevel->getCount(); + if(nLevelCount > 5) + nLevelCount = 5; + for( sal_Int32 i = 0; i < nLevelCount && i < 5; i++) + { + long nTop = nStartY + nRectHeight * (aLinesArr[2 * i + 11])/100 ; + Point aLeft(nStartX + nRectWidth * (aLinesArr[2 * i + 10])/ 100, nTop ); + + Any aLevelAny = xLevel->getByIndex(i); + Sequence<PropertyValue> aLevel; + aLevelAny >>= aLevel; + const PropertyValue* pValues = aLevel.getConstArray(); + aNumberingTypes[i] = 0; + aParentNumberings[i] = 0; + for(sal_Int32 nProperty = 0; nProperty < aLevel.getLength() - 1; nProperty++) + { + if ( pValues[nProperty].Name == "NumberingType" ) + pValues[nProperty].Value >>= aNumberingTypes[i]; + else if ( pValues[nProperty].Name == "BulletFontName" ) + pValues[nProperty].Value >>= sFontNames[i]; + else if ( pValues[nProperty].Name == "BulletChar" ) + pValues[nProperty].Value >>= sBulletChars[i]; + else if ( pValues[nProperty].Name == "Prefix" ) + pValues[nProperty].Value >>= sPrefixes[i]; + else if ( pValues[nProperty].Name == "Suffix" ) + pValues[nProperty].Value >>= sSuffixes[i]; + else if ( pValues[nProperty].Name == "ParentNumbering" ) + pValues[nProperty].Value >>= aParentNumberings[i]; + } + Sequence< PropertyValue > aProperties(2); + PropertyValue* pProperties = aProperties.getArray(); + pProperties[0].Name = "NumberingType"; + pProperties[0].Value <<= aNumberingTypes[i]; + pProperties[1].Name = "Value"; + pProperties[1].Value <<= sal_Int32(1); + try + { + sLevelTexts[i] = xFormatter->makeNumberingString( aProperties, aLocale ); + } + catch(Exception&) + { + OSL_FAIL("Exception in DefaultNumberingProvider::makeNumberingString"); + } + + aLeft.AdjustY( -(pDev->GetTextHeight()/2) ); + if(!sPrefixes[i].isEmpty() && + sPrefixes[i] != " ") + { + pVDev->SetFont(aFont); + pVDev->DrawText(aLeft, sPrefixes[i]); + aLeft.AdjustX(pDev->GetTextWidth(sPrefixes[i]) ); + } + if(aParentNumberings[i]) + { + //insert old numberings here + sal_Int32 nStartLevel = std::min(static_cast<sal_Int32>(aParentNumberings[i]), i); + for(sal_Int32 nParentLevel = i - nStartLevel; nParentLevel < i; nParentLevel++) + { + OUString sTmp(sLevelTexts[nParentLevel]); + sTmp += "."; + lcl_PaintLevel(pVDev, + aNumberingTypes[nParentLevel], + sBulletChars[nParentLevel], + sTmp, + sFontNames[nParentLevel], + aLeft, + aRuleFont, + aFont); + } + } + lcl_PaintLevel(pVDev, + aNumberingTypes[i], + sBulletChars[i], + sLevelTexts[i], + sFontNames[i], + aLeft, + aRuleFont, + aFont); + if(!sSuffixes[i].isEmpty() && + !sSuffixes[i].startsWith(" ")) + { + pVDev->SetFont(aFont); + pVDev->DrawText(aLeft, sSuffixes[i]); + aLeft.AdjustX(pDev->GetTextWidth(sSuffixes[i]) ); + } + + long nLineTop = nStartY + nRectHeight * aLinesArr[2 * i + 1]/100 ; + Point aLineLeft(aLeft.X(), nLineTop ); + Point aLineRight(nStartX + nRectWidth * 90 /100, nLineTop ); + pVDev->SetLineColor(COL_LIGHTGRAY); + pVDev->DrawLine(aLineLeft, aLineRight); + } + + } +#ifdef DBG_UTIL + catch(Exception&) + { + static bool bAssert = false; + if(!bAssert) + { + OSL_FAIL("exception in ::UserDraw"); + bAssert = true; + } + } +#else + catch(Exception&) + { + } +#endif + } + pDev->DrawOutDev( aRect.TopLeft(), aRectSize, + aOrgRect.TopLeft(), aRectSize, + *pVDev ); + } + + pDev->SetFont(aOldFont); + pDev->SetLineColor(aOldColor); +} + +NumValueSet::NumValueSet() + : SvtValueSet(nullptr) + , ePageType(NumberingPageType::BULLET) + , pVDev(nullptr) +{ +} + +void NumValueSet::init(NumberingPageType eType) +{ + ePageType = eType; + pVDev = nullptr; + + SetColCount( 4 ); + SetLineCount( 2 ); + SetStyle( GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER ); + if(NumberingPageType::BULLET == eType) + { + for ( sal_uInt16 i = 0; i < 8; i++ ) + { + InsertItem( i + 1, i ); + SetItemText(i + 1, SvxResId(RID_SVXSTR_BULLET_DESCRIPTIONS[i])); + } + } +} + +NumValueSet::~NumValueSet() +{ +} + +void NumValueSet::SetNumberingSettings( + const Sequence<Sequence<PropertyValue> >& aNum, + Reference<XNumberingFormatter> const & xFormat, + const Locale& rLocale ) +{ + aNumSettings = aNum; + xFormatter = xFormat; + aLocale = rLocale; + if(aNum.getLength() > 8) + SetStyle( GetStyle()|WB_VSCROLL); + for ( sal_Int32 i = 0; i < aNum.getLength(); i++ ) + { + InsertItem( i + 1, i ); + if( i < 8 ) + SetItemText(i + 1, SvxResId(RID_SVXSTR_SINGLENUM_DESCRIPTIONS[i])); + } +} + +void NumValueSet::SetOutlineNumberingSettings( + Sequence<Reference<XIndexAccess> > const & rOutline, + Reference<XNumberingFormatter> const & xFormat, + const Locale& rLocale) +{ + aOutlineSettings = rOutline; + xFormatter = xFormat; + aLocale = rLocale; + if(aOutlineSettings.getLength() > 8) + SetStyle( GetStyle() | WB_VSCROLL ); + for ( sal_Int32 i = 0; i < aOutlineSettings.getLength(); i++ ) + { + InsertItem( i + 1, i ); + if( i < 8 ) + SetItemText(i + 1, SvxResId(RID_SVXSTR_OUTLINENUM_DESCRIPTIONS[i])); + } +} + SvxBmpNumValueSet::SvxBmpNumValueSet(vcl::Window* pParent, WinBits nWinBits) : SvxNumValueSet(pParent, nWinBits) , aFormatIdle("SvxBmpNumValueSet FormatIdle") |