cui/source/inc/paragrph.hxx      |    1 +
 cui/source/tabpages/paragrph.cxx |   24 +++++++++++++++++++++++-
 cui/uiconfig/ui/textflowpage.ui  |   20 ++++++++++++++++++++
 3 files changed, 44 insertions(+), 1 deletion(-)

New commits:
commit 698b38a18f5f70fd8d50968bc50951aba7085175
Author:     László Németh <[email protected]>
AuthorDate: Mon Mar 3 18:56:30 2025 +0100
Commit:     László Németh <[email protected]>
CommitDate: Tue Mar 4 08:49:54 2025 +0100

    tdf#165354 sw cui: implement HyphenationKeepLine – part 3
    
    Add check box "Move Line" to the Hyphenate Across section
    of the Text Flow paragraph settings.
    
    Note: this is the MSO interoperability option of MS Word
    Layout Option "Use Word 2013 rules for hyphenation between
    pages and columns".
    
    "Move Line" is sensitive only if Hyphenate Across Column,
    Page or Spread are disabled (MS Word Layout Option "Allow
    hyphenation between pages or columns").
    
    Default value of HyphenationKeepLine is true, i.e. if "Move
    Line" is disabled. Enabling Hyphenation Across Spread not only
    grays out "Move Line", but disables it, too, to force the default
    value, which may be better for interoperability and typography,
    too (see description of commit 3e02ffb76c484a05cdc140d8a10bc3d993fe8320).
    
    Follow-up to commit f8b9cd8fd13897094a014ad06df406f0c78adc62
    "tdf#165354 sw xmloff: implement HyphenationKeepLine – part 2"
    and commit 3e02ffb76c484a05cdc140d8a10bc3d993fe8320
    "tdf#i165354 sw offapi DOCX: implement HyphenationKeepLine – part 1".
    
    Change-Id: Ibc4f3b904bfe1a676195d166a334910c12760ddd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182446
    Tested-by: Jenkins
    Reviewed-by: László Németh <[email protected]>

diff --git a/cui/source/inc/paragrph.hxx b/cui/source/inc/paragrph.hxx
index 3a1ef5d455ad..e8806dcdac7c 100644
--- a/cui/source/inc/paragrph.hxx
+++ b/cui/source/inc/paragrph.hxx
@@ -277,6 +277,7 @@ private:
     std::unique_ptr<weld::CheckButton> m_xAcrossColumnBox;
     std::unique_ptr<weld::CheckButton> m_xAcrossPageBox;
     std::unique_ptr<weld::CheckButton> m_xAcrossSpreadBox;
+    std::unique_ptr<weld::CheckButton> m_xAcrossMoveLineBox;
 
     void HyphenClickHdl();
     void PageNumBoxClickHdl();
diff --git a/cui/source/tabpages/paragrph.cxx b/cui/source/tabpages/paragrph.cxx
index ea8b6a4def38..501ee10d4f72 100644
--- a/cui/source/tabpages/paragrph.cxx
+++ b/cui/source/tabpages/paragrph.cxx
@@ -1659,6 +1659,7 @@ bool SvxExtParagraphTabPage::FillItemSet( SfxItemSet* 
rOutSet )
     if ( m_xHyphenBox->get_state_changed_from_saved() ||
          m_xHyphenNoCapsBox->get_state_changed_from_saved() ||
          m_xHyphenNoLastWordBox->get_state_changed_from_saved() ||
+         m_xAcrossMoveLineBox->get_state_changed_from_saved() ||
          m_xExtHyphenBeforeBox->get_value_changed_from_saved() ||
          m_xExtHyphenAfterBox->get_value_changed_from_saved() ||
          m_xExtCompoundHyphenBeforeBox->get_value_changed_from_saved() ||
@@ -1675,6 +1676,7 @@ bool SvxExtParagraphTabPage::FillItemSet( SfxItemSet* 
rOutSet )
         aHyphen.SetHyphen( eHyphenState == TRISTATE_TRUE );
         aHyphen.SetNoCapsHyphenation(m_xHyphenNoCapsBox->get_state() != 
TRISTATE_TRUE);
         aHyphen.SetNoLastWordHyphenation(m_xHyphenNoLastWordBox->get_state() 
!= TRISTATE_TRUE);
+        aHyphen.SetKeepLine(m_xAcrossMoveLineBox->get_state() != 
TRISTATE_TRUE);
 
         if ( eHyphenState == TRISTATE_TRUE )
         {
@@ -1934,7 +1936,6 @@ void SvxExtParagraphTabPage::Reset( const SfxItemSet* 
rSet )
         m_xHyphenBox->set_state(bIsHyphen ? TRISTATE_TRUE : TRISTATE_FALSE);
         m_xHyphenNoCapsBox->set_state(rHyphen.IsNoCapsHyphenation() ? 
TRISTATE_FALSE : TRISTATE_TRUE);
         m_xHyphenNoLastWordBox->set_state(rHyphen.IsNoLastWordHyphenation() ? 
TRISTATE_FALSE : TRISTATE_TRUE);
-
         m_xExtHyphenBeforeBox->set_value(rHyphen.GetMinLead());
         m_xExtHyphenAfterBox->set_value(rHyphen.GetMinTrail());
         m_xExtCompoundHyphenBeforeBox->set_value(rHyphen.GetCompoundMinLead());
@@ -1946,6 +1947,8 @@ void SvxExtParagraphTabPage::Reset( const SfxItemSet* 
rSet )
         m_xAcrossColumnBox->set_state(!rHyphen.IsKeep() || 
rHyphen.GetKeepType() < 3 ? TRISTATE_TRUE : TRISTATE_FALSE);
         m_xAcrossPageBox->set_state(!rHyphen.IsKeep() || rHyphen.GetKeepType() 
< 2 ? TRISTATE_TRUE : TRISTATE_FALSE);
         m_xAcrossSpreadBox->set_state(!rHyphen.IsKeep() || 
rHyphen.GetKeepType() == 0 ? TRISTATE_TRUE : TRISTATE_FALSE);
+        // always disable MoveLine, if hyphenation is forbidden across spreads
+        m_xAcrossMoveLineBox->set_state( m_xAcrossSpreadBox->get_state() == 
TRISTATE_TRUE || rHyphen.IsKeepLine() ? TRISTATE_FALSE : TRISTATE_TRUE);
         aAcrossParagraphState.bTriStateEnabled = false;
         aAcrossColumnState.bTriStateEnabled = false;
         aAcrossPageState.bTriStateEnabled = false;
@@ -1956,6 +1959,7 @@ void SvxExtParagraphTabPage::Reset( const SfxItemSet* 
rSet )
         m_xHyphenBox->set_state(TRISTATE_INDET);
         m_xHyphenNoCapsBox->set_state(TRISTATE_INDET);
         m_xHyphenNoLastWordBox->set_state(TRISTATE_INDET);
+        m_xAcrossMoveLineBox->set_state(TRISTATE_INDET);
     }
     bool bEnable = bItemAvailable && bIsHyphen;
     m_xHyphenNoCapsBox->set_sensitive(bEnable);
@@ -1977,6 +1981,9 @@ void SvxExtParagraphTabPage::Reset( const SfxItemSet* 
rSet )
     m_xAcrossColumnBox->set_sensitive(bEnable);
     m_xAcrossPageBox->set_sensitive(bEnable);
     m_xAcrossSpreadBox->set_sensitive(bEnable);
+    // always gray out MoveLine, if hyphenation is forbidden across spreads
+    bool bAcrossSpread = m_xAcrossSpreadBox->get_state() == TRISTATE_TRUE;
+    m_xAcrossMoveLineBox->set_sensitive( bEnable && !bAcrossSpread );
 
     switch (rSet->GetItemState(SID_ATTR_PARA_PAGENUM))
     {
@@ -2233,6 +2240,7 @@ void SvxExtParagraphTabPage::ChangesApplied()
     m_xHyphenBox->save_state();
     m_xHyphenNoCapsBox->save_state();
     m_xHyphenNoLastWordBox->save_state();
+    m_xAcrossMoveLineBox->save_state();
     m_xExtHyphenBeforeBox->save_value();
     m_xExtHyphenAfterBox->save_value();
     m_xExtCompoundHyphenBeforeBox->save_value();
@@ -2324,6 +2332,7 @@ 
SvxExtParagraphTabPage::SvxExtParagraphTabPage(weld::Container* pPage, weld::Dia
     , 
m_xAcrossColumnBox(m_xBuilder->weld_check_button(u"checkAcrossColumn"_ustr))
     , m_xAcrossPageBox(m_xBuilder->weld_check_button(u"checkAcrossPage"_ustr))
     , 
m_xAcrossSpreadBox(m_xBuilder->weld_check_button(u"checkAcrossSpread"_ustr))
+    , 
m_xAcrossMoveLineBox(m_xBuilder->weld_check_button(u"checkMoveLine"_ustr))
 {
     // this page needs ExchangeSupport
     SetExchangeSupport();
@@ -2370,6 +2379,7 @@ 
SvxExtParagraphTabPage::SvxExtParagraphTabPage(weld::Container* pPage, weld::Dia
     m_xHyphenBox->set_sensitive(false);
     m_xHyphenNoCapsBox->set_sensitive(false);
     m_xHyphenNoLastWordBox->set_sensitive(false);
+    m_xAcrossMoveLineBox->set_sensitive(false);
     m_xBeforeText->set_sensitive(false);
     m_xExtHyphenBeforeBox->set_sensitive(false);
     m_xAfterText->set_sensitive(false);
@@ -2531,6 +2541,8 @@ void SvxExtParagraphTabPage::HyphenClickHdl()
     m_xAcrossColumnBox->set_sensitive(bEnable);
     m_xAcrossPageBox->set_sensitive(bEnable);
     m_xAcrossSpreadBox->set_sensitive(bEnable);
+    // only sensitive, if the hyphenation is disabled accross spreads
+    m_xAcrossMoveLineBox->set_sensitive( m_xAcrossSpreadBox->get_state() != 
TRISTATE_TRUE );
     m_xHyphenBox->set_state(bEnable ? TRISTATE_TRUE : TRISTATE_FALSE);
 }
 
@@ -2640,6 +2652,7 @@ IMPL_LINK(SvxExtParagraphTabPage, 
AcrossParagraphHdl_Impl, weld::Toggleable&, rT
         m_xAcrossColumnBox->set_state( TRISTATE_FALSE );
         m_xAcrossPageBox->set_state( TRISTATE_FALSE );
         m_xAcrossSpreadBox->set_state( TRISTATE_FALSE );
+        m_xAcrossMoveLineBox->set_sensitive( true );
     }
 }
 
@@ -2650,6 +2663,7 @@ IMPL_LINK(SvxExtParagraphTabPage, AcrossColumnHdl_Impl, 
weld::Toggleable&, rTogg
     {
         m_xAcrossPageBox->set_state( TRISTATE_FALSE );
         m_xAcrossSpreadBox->set_state( TRISTATE_FALSE );
+        m_xAcrossMoveLineBox->set_sensitive( true );
     }
     else
         m_xAcrossParagraphBox->set_state( TRISTATE_TRUE );
@@ -2664,7 +2678,10 @@ IMPL_LINK(SvxExtParagraphTabPage, AcrossPageHdl_Impl, 
weld::Toggleable&, rToggle
         m_xAcrossColumnBox->set_state( TRISTATE_TRUE );
     }
     else
+    {
         m_xAcrossSpreadBox->set_state( TRISTATE_FALSE );
+        m_xAcrossMoveLineBox->set_sensitive( true );
+    }
 }
 
 IMPL_LINK(SvxExtParagraphTabPage, AcrossSpreadHdl_Impl, weld::Toggleable&, 
rToggle, void)
@@ -2676,6 +2693,11 @@ IMPL_LINK(SvxExtParagraphTabPage, AcrossSpreadHdl_Impl, 
weld::Toggleable&, rTogg
         m_xAcrossColumnBox->set_state( TRISTATE_TRUE );
         m_xAcrossPageBox->set_state( TRISTATE_TRUE );
     }
+    // only sensitive, if the hyphenation is disabled accross spreads
+    bool bAcrossSpread = m_xAcrossSpreadBox->get_state() == TRISTATE_TRUE;
+    m_xAcrossMoveLineBox->set_sensitive( !bAcrossSpread );
+    if ( bAcrossSpread )
+        m_xAcrossMoveLineBox->set_state( TRISTATE_FALSE );
 }
 
 SvxAsianTabPage::SvxAsianTabPage(weld::Container* pPage, 
weld::DialogController* pController, const SfxItemSet& rSet)
diff --git a/cui/uiconfig/ui/textflowpage.ui b/cui/uiconfig/ui/textflowpage.ui
index cbfa4fc69e1a..6434b4096035 100644
--- a/cui/uiconfig/ui/textflowpage.ui
+++ b/cui/uiconfig/ui/textflowpage.ui
@@ -469,6 +469,26 @@
                     <property name="top-attach">3</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkCheckButton" id="checkMoveLine">
+                    <property name="label" translatable="yes" 
context="textflowpage|checkMoveLine">Move Line</property>
+                    <property name="visible">True</property>
+                    <property name="can-focus">True</property>
+                    <property name="receives-default">False</property>
+                    <property name="use-underline">True</property>
+                    <property name="inconsistent">True</property>
+                    <property name="draw-indicator">True</property>
+                    <child internal-child="accessible">
+                      <object class="AtkObject" id="checkMoveLine-atkobject">
+                        <property name="AtkObject::accessible-description" 
translatable="yes" context="textflowpage|extended_tip|checkMoveLine">Deselect 
this check box, if you don't want to move the entire hyphenated line to the 
next text block.</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="left-attach">1</property>
+                    <property name="top-attach">3</property>
+                  </packing>
+                </child>
               </object>
               <packing>
                 <property name="left-attach">0</property>

Reply via email to