cui/source/inc/chardlg.hxx      |    9 ++++-
 cui/source/tabpages/chardlg.cxx |   67 +++++++++++++++++++++++++++++-----------
 2 files changed, 57 insertions(+), 19 deletions(-)

New commits:
commit 4b4f5eecc6ebb4a67a21ed60f07910f3c11f2db3
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Tue Aug 25 13:53:46 2020 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Tue Aug 25 16:51:16 2020 +0200

    tdf#127802 support tristate for hidden/unhidden text
    
    Change-Id: I9a8ad72ae3ee45ac2521e662b17d3d22d98aa055
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101325
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/cui/source/inc/chardlg.hxx b/cui/source/inc/chardlg.hxx
index e84ea0f162fa..fe8255c34d17 100644
--- a/cui/source/inc/chardlg.hxx
+++ b/cui/source/inc/chardlg.hxx
@@ -167,6 +167,11 @@ private:
     Color                      m_aOrigFontColor;
     sal_uInt16                 m_nHtmlMode;
 
+    weld::TriStateEnabled m_aOutlineState;
+    weld::TriStateEnabled m_aShadowState;
+    weld::TriStateEnabled m_aHiddenState;
+    weld::TriStateEnabled m_aIndividualWordsState;
+
     std::unique_ptr<weld::Label> m_xFontColorFT;
     std::unique_ptr<ColorListBox> m_xFontColorLB;
     std::unique_ptr<weld::Label> m_xFontTransparencyFT;
@@ -202,8 +207,10 @@ private:
 
     void SelectHdl_Impl(const weld::ComboBox*);
     DECL_LINK(SelectListBoxHdl_Impl, weld::ComboBox&, void);
+    DECL_LINK(OutlineBtnClickHdl, weld::ToggleButton&, void);
+    DECL_LINK(ShadowBtnClickHdl, weld::ToggleButton&, void);
+    DECL_LINK(HiddenBtnClickHdl, weld::ToggleButton&, void);
     DECL_LINK(CbClickHdl_Impl, weld::ToggleButton&, void);
-    DECL_LINK(TristClickHdl_Impl, weld::ToggleButton&, void);
     DECL_LINK(ColorBoxSelectHdl_Impl, ColorListBox&, void);
     DECL_LINK(ModifyFontTransparencyHdl_Impl, weld::MetricSpinButton&, void);
 
diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx
index 8c7cef3cb816..0b498f43a935 100644
--- a/cui/source/tabpages/chardlg.cxx
+++ b/cui/source/tabpages/chardlg.cxx
@@ -1408,10 +1408,10 @@ void SvxCharEffectsPage::Initialize()
 
     m_xEffectsLB->set_active( 0 );
 
+    m_xHiddenBtn->connect_toggled(LINK(this, SvxCharEffectsPage, 
HiddenBtnClickHdl));
     m_xIndividualWordsBtn->connect_toggled(LINK(this, SvxCharEffectsPage, 
CbClickHdl_Impl));
-    Link<weld::ToggleButton&,void> aLink2 = LINK(this, SvxCharEffectsPage, 
TristClickHdl_Impl);
-    m_xOutlineBtn->connect_toggled(aLink2);
-    m_xShadowBtn->connect_toggled(aLink2);
+    m_xOutlineBtn->connect_toggled(LINK(this, SvxCharEffectsPage, 
OutlineBtnClickHdl));
+    m_xShadowBtn->connect_toggled(LINK(this, SvxCharEffectsPage, 
ShadowBtnClickHdl));
 
     if ( !SvtLanguageOptions().IsAsianTypographyEnabled() )
     {
@@ -1487,7 +1487,7 @@ void SvxCharEffectsPage::UpdatePreview_Impl()
         rCTLFont.SetCaseMap( eCaps == SvxCaseMap::SmallCaps ? 
SvxCaseMap::NotMapped : eCaps );
     }
 
-    bool bWordLine = m_xIndividualWordsBtn->get_active();
+    bool bWordLine = StateToAttr( m_xIndividualWordsBtn->get_state() );
     rFont.SetWordLineMode( bWordLine );
     rCJKFont.SetWordLineMode( bWordLine );
     rCTLFont.SetWordLineMode( bWordLine );
@@ -1643,13 +1643,10 @@ void SvxCharEffectsPage::SelectHdl_Impl(const 
weld::ComboBox* pBox)
     UpdatePreview_Impl();
 }
 
-IMPL_LINK_NOARG(SvxCharEffectsPage, CbClickHdl_Impl, weld::ToggleButton&, void)
+IMPL_LINK(SvxCharEffectsPage, CbClickHdl_Impl, weld::ToggleButton&, rToggle, 
void)
 {
+    m_aIndividualWordsState.ButtonToggled(rToggle);
     UpdatePreview_Impl();
-}
-
-IMPL_LINK_NOARG(SvxCharEffectsPage, TristClickHdl_Impl, weld::ToggleButton&, 
void)
-{
     UpdatePreview_Impl();
 }
 
@@ -1805,15 +1802,18 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
     switch ( eState )
     {
         case SfxItemState::UNKNOWN:
+            m_aIndividualWordsState.bTriStateEnabled = false;
             m_xIndividualWordsBtn->hide();
             break;
 
         case SfxItemState::DISABLED:
         case SfxItemState::READONLY:
+            m_aIndividualWordsState.bTriStateEnabled = false;
             m_xIndividualWordsBtn->set_sensitive(false);
             break;
 
         case SfxItemState::DONTCARE:
+            m_aIndividualWordsState.bTriStateEnabled = true;
             m_xIndividualWordsBtn->set_state( TRISTATE_INDET );
             break;
 
@@ -1825,6 +1825,7 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
             rCJKFont.SetWordLineMode( rItem.GetValue() );
             rCTLFont.SetWordLineMode( rItem.GetValue() );
 
+            m_aIndividualWordsState.bTriStateEnabled = false;
             m_xIndividualWordsBtn->set_active(rItem.GetValue());
             m_xIndividualWordsBtn->set_sensitive(bEnable);
             break;
@@ -1939,15 +1940,18 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
     switch ( eState )
     {
         case SfxItemState::UNKNOWN:
+            m_aOutlineState.bTriStateEnabled = false;
             m_xOutlineBtn->hide();
             break;
 
         case SfxItemState::DISABLED:
         case SfxItemState::READONLY:
+            m_aOutlineState.bTriStateEnabled = false;
             m_xOutlineBtn->set_sensitive(false);
             break;
 
         case SfxItemState::DONTCARE:
+            m_aOutlineState.bTriStateEnabled = true;
             m_xOutlineBtn->set_state(TRISTATE_INDET);
             break;
 
@@ -1955,6 +1959,7 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
         case SfxItemState::SET:
         {
             const SvxContourItem& rItem = static_cast<const 
SvxContourItem&>(rSet->Get( nWhich ));
+            m_aOutlineState.bTriStateEnabled = false;
             m_xOutlineBtn->set_state(static_cast<TriState>(rItem.GetValue()));
             break;
         }
@@ -1967,15 +1972,18 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
     switch ( eState )
     {
         case SfxItemState::UNKNOWN:
+            m_aShadowState.bTriStateEnabled = false;
             m_xShadowBtn->hide();
             break;
 
         case SfxItemState::DISABLED:
         case SfxItemState::READONLY:
+            m_aShadowState.bTriStateEnabled = false;
             m_xShadowBtn->set_sensitive(false);
             break;
 
         case SfxItemState::DONTCARE:
+            m_aShadowState.bTriStateEnabled = true;
             m_xShadowBtn->set_state( TRISTATE_INDET );
             break;
 
@@ -1983,6 +1991,7 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
         case SfxItemState::SET:
         {
             const SvxShadowedItem& rItem = static_cast<const 
SvxShadowedItem&>(rSet->Get( nWhich ));
+            m_aShadowState.bTriStateEnabled = false;
             m_xShadowBtn->set_state( static_cast<TriState>(rItem.GetValue()) );
             break;
         }
@@ -1995,15 +2004,18 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
     switch ( eState )
     {
         case SfxItemState::UNKNOWN:
+            m_aHiddenState.bTriStateEnabled = false;
             m_xHiddenBtn->hide();
             break;
 
         case SfxItemState::DISABLED:
         case SfxItemState::READONLY:
+            m_aHiddenState.bTriStateEnabled = false;
             m_xHiddenBtn->set_sensitive(false);
             break;
 
         case SfxItemState::DONTCARE:
+            m_aHiddenState.bTriStateEnabled = true;
             m_xHiddenBtn->set_state(TRISTATE_INDET);
             break;
 
@@ -2011,6 +2023,7 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
         case SfxItemState::SET:
         {
             const SvxCharHiddenItem& rItem = static_cast<const 
SvxCharHiddenItem&>(rSet->Get( nWhich ));
+            m_aHiddenState.bTriStateEnabled = false;
             m_xHiddenBtn->set_state(static_cast<TriState>(rItem.GetValue()));
             break;
         }
@@ -2026,6 +2039,23 @@ void SvxCharEffectsPage::Reset( const SfxItemSet* rSet )
     ChangesApplied();
 }
 
+IMPL_LINK(SvxCharEffectsPage, HiddenBtnClickHdl, weld::ToggleButton&, rToggle, 
void)
+{
+    m_aHiddenState.ButtonToggled(rToggle);
+}
+
+IMPL_LINK(SvxCharEffectsPage, OutlineBtnClickHdl, weld::ToggleButton&, 
rToggle, void)
+{
+    m_aOutlineState.ButtonToggled(rToggle);
+    UpdatePreview_Impl();
+}
+
+IMPL_LINK(SvxCharEffectsPage, ShadowBtnClickHdl, weld::ToggleButton&, rToggle, 
void)
+{
+    m_aShadowState.ButtonToggled(rToggle);
+    UpdatePreview_Impl();
+}
+
 void SvxCharEffectsPage::ChangesApplied()
 {
     m_xUnderlineLB->save_value();
@@ -2149,23 +2179,26 @@ bool SvxCharEffectsPage::FillItemSet( SfxItemSet* rSet )
     bChanged = true;
 
     // Individual words
+    const SfxItemSet* pExampleSet = GetDialogExampleSet();
     nWhich = GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
     pOld = GetOldItem( *rSet, SID_ATTR_CHAR_WORDLINEMODE );
+    TriState eState = m_xIndividualWordsBtn->get_state();
+    const SfxPoolItem* pItem;
 
     if ( pOld )
     {
         const SvxWordLineModeItem& rItem = *static_cast<const 
SvxWordLineModeItem*>(pOld);
-        if ( rItem.GetValue() == m_xIndividualWordsBtn->get_active() )
+        if ( rItem.GetValue() == StateToAttr( eState ) && 
m_xIndividualWordsBtn->get_saved_state() == eState )
             bChanged = false;
     }
 
-    if ( rOldSet.GetItemState( nWhich ) == SfxItemState::DONTCARE &&
-         ! m_xIndividualWordsBtn->get_state_changed_from_saved() )
-        bChanged = false;
+    if ( !bChanged && pExampleSet && pExampleSet->GetItemState( nWhich, false, 
&pItem ) == SfxItemState::SET &&
+         !StateToAttr( eState ) && static_cast<const 
SvxWordLineModeItem*>(pItem)->GetValue() )
+        bChanged = true;
 
-    if ( bChanged )
+    if ( bChanged && eState != TRISTATE_INDET )
     {
-        rSet->Put( SvxWordLineModeItem( m_xIndividualWordsBtn->get_active(), 
nWhich ) );
+        rSet->Put( SvxWordLineModeItem( StateToAttr( eState ), nWhich ) );
         bModified = true;
     }
     else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
@@ -2258,11 +2291,9 @@ bool SvxCharEffectsPage::FillItemSet( SfxItemSet* rSet )
     }
 
     // Outline
-    const SfxItemSet* pExampleSet = GetDialogExampleSet();
     nWhich = GetWhich( SID_ATTR_CHAR_CONTOUR );
     pOld = GetOldItem( *rSet, SID_ATTR_CHAR_CONTOUR );
-    TriState eState = m_xOutlineBtn->get_state();
-    const SfxPoolItem* pItem;
+    eState = m_xOutlineBtn->get_state();
 
     if ( pOld )
     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to