configure.ac                                |    2 
 include/svx/relfld.hxx                      |    1 
 sw/inc/cmdid.h                              |    5 
 sw/inc/strings.hrc                          |    7 +
 sw/sdi/_tabsh.sdi                           |   20 +++
 sw/sdi/swriter.sdi                          |   50 +++++++++
 sw/source/uibase/shells/tabsh.cxx           |  144 +++++++++++++++++++++++++++
 sw/source/uibase/sidebar/TableEditPanel.cxx |  147 +++++++++++++++++++++++++++-
 sw/source/uibase/sidebar/TableEditPanel.hxx |   11 ++
 sw/uiconfig/swriter/ui/sidebartableedit.ui  |  115 +++++++++++++++++++++
 10 files changed, 493 insertions(+), 9 deletions(-)

New commits:
commit 828d2637fd3120bfd342b41548caf9c55fc0f603
Author:     Oliver Specht <oliver.spe...@cib.de>
AuthorDate: Tue Jan 30 17:07:46 2024 +0100
Commit:     Gabor Kelemen <gabor.kelemen.ext...@allotropia.de>
CommitDate: Mon Feb 12 18:17:18 2024 +0100

    tdf#159662 Add table alignment and left/right spacing to sidebar in Writer
    
    Change-Id: I12d898f21ca8c7d581aaa1c587c5b6434a35f516
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162769
    Tested-by: Jenkins
    Reviewed-by: Gabor Kelemen <gabor.kelemen.ext...@allotropia.de>

diff --git a/include/svx/relfld.hxx b/include/svx/relfld.hxx
index 8bc4c05580ec..85cec451cb94 100644
--- a/include/svx/relfld.hxx
+++ b/include/svx/relfld.hxx
@@ -46,6 +46,7 @@ public:
     void            EnableNegativeMode() {bNegativeEnabled = true;}
 
     void set_sensitive(bool sensitive) { 
m_xSpinButton->set_sensitive(sensitive); }
+    bool get_sensitive() const { return m_xSpinButton->get_sensitive(); }
     void set_value(int nValue, FieldUnit eValueUnit) { 
m_xSpinButton->set_value(nValue, eValueUnit); }
     int get_value(FieldUnit eDestUnit) const { return 
m_xSpinButton->get_value(eDestUnit); }
     int get_min(FieldUnit eValueUnit) const { return 
m_xSpinButton->get_min(eValueUnit); }
diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index 4773f173d603..e8521380c62c 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -520,7 +520,10 @@ class SwUINumRuleItem;
 #define FN_FORMAT_APPLY_DEFAULT             (FN_FORMAT2 + 157)
 #define FN_FORMAT_APPLY_TEXTBODY            (FN_FORMAT2 + 158)
 #define FN_REMOVE_DIRECT_CHAR_FORMATS       (FN_FORMAT2 + 159)
-//free (160)
+#define SID_ATTR_TABLE_ALIGNMENT            (FN_FORMAT2 + 160)
+#define SID_ATTR_TABLE_LEFT_SPACE           (FN_FORMAT2 + 161)
+#define SID_ATTR_TABLE_RIGHT_SPACE          (FN_FORMAT2 + 162)
+//free (163 except 194 already used above)
 
 // Region: Extras
 #define FN_LINE_NUMBERING_DLG       (FN_EXTRA + 2 )   /* */
diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc
index 8f3eadcab6d8..b3e9a9370bfc 100644
--- a/sw/inc/strings.hrc
+++ b/sw/inc/strings.hrc
@@ -1492,6 +1492,13 @@
 #define STR_COMPAT_OPT_USEVARIABLEWIDTHNBSP     
NC_("STR_COMPAT_OPT_USEVARIABLEWIDTHNBSP", "Render non-breaking spaces (NBSP) 
as standard-space-width (off for fixed size)")
 #define STR_COMPAT_OPT_NOGAPAFTERNOTENUMBER     
NC_("STR_COMPAT_OPT_NOGAPAFTERNOTENUMBER", "Do not add an extra space after 
number in footnotes / endnotes with hanging first line")
 
+#define STR_TABLE_PANEL_ALIGN_AUTO              
NC_("sidebartableedit|alignautolabel", "Automatic")
+#define STR_TABLE_PANEL_ALIGN_LEFT              
NC_("sidebartableedit|alignleftlabel", "Left")
+#define STR_TABLE_PANEL_ALIGN_FROM_LEFT         
NC_("sidebartableedit|alignfromleftlabel", "From left")
+#define STR_TABLE_PANEL_ALIGN_RIGHT             
NC_("sidebartableedit|alignrightlabel", "Right")
+#define STR_TABLE_PANEL_ALIGN_CENTER            
NC_("sidebartableedit|aligncenterlabel", "Center")
+#define STR_TABLE_PANEL_ALIGN_MANUAL            
NC_("sidebartableedit|alignmanuallabel", "Manual")
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/sdi/_tabsh.sdi b/sw/sdi/_tabsh.sdi
index e4b6b9a2dd6c..7596d2c29bda 100644
--- a/sw/sdi/_tabsh.sdi
+++ b/sw/sdi/_tabsh.sdi
@@ -446,5 +446,25 @@ interface BaseTextTable
         StateMethod = GetState ;
         DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
     ]
+
+    SID_ATTR_TABLE_ALIGNMENT
+    [
+        ExecMethod = Execute ;
+        StateMethod = GetState ;
+        DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
+    ]
+
+    SID_ATTR_TABLE_LEFT_SPACE
+    [
+        StateMethod = GetState ;
+        DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
+    ]
+
+    SID_ATTR_TABLE_RIGHT_SPACE
+    [
+        StateMethod = GetState ;
+        DisableFlags="SfxDisableFlags::SwOnProtectedCursor";
+    ]
+
 }
 
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index 861d5ccec21a..16d939a8903d 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -8693,6 +8693,56 @@ SfxUInt32Item TableColumWidth SID_ATTR_TABLE_COLUMN_WIDTH
     GroupId = SfxGroupId::Table;
 ]
 
+SfxUInt32Item TableAlignment SID_ATTR_TABLE_ALIGNMENT
+(SfxInt32Item TableLeftSpace SID_ATTR_TABLE_LEFT_SPACE, SfxInt32Item 
TableRightSpace SID_ATTR_TABLE_RIGHT_SPACE)
+[
+    AutoUpdate = TRUE,
+    FastCall = FALSE,
+    ReadOnlyDoc = FALSE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+
+    AccelConfig = FALSE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = FALSE,
+    GroupId = SfxGroupId::Table;
+]
+
+SfxInt32Item TableLeftSpace SID_ATTR_TABLE_LEFT_SPACE
+[
+    AutoUpdate = FALSE,
+    FastCall = TRUE,
+    ReadOnlyDoc = FALSE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = FALSE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = FALSE,
+    GroupId = SfxGroupId::Table;
+]
+
+SfxInt32Item TableRightSpace SID_ATTR_TABLE_RIGHT_SPACE
+[
+    AutoUpdate = FALSE,
+    FastCall = TRUE,
+    ReadOnlyDoc = FALSE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = FALSE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = FALSE,
+    GroupId = SfxGroupId::Table;
+]
+
 SfxVoidItem OutlineLevelsShown FN_OUTLINE_LEVELS_SHOWN
 ()
 [
diff --git a/sw/source/uibase/shells/tabsh.cxx 
b/sw/source/uibase/shells/tabsh.cxx
index 8b1280dcbab7..492cd041d081 100644
--- a/sw/source/uibase/shells/tabsh.cxx
+++ b/sw/source/uibase/shells/tabsh.cxx
@@ -232,8 +232,7 @@ static std::shared_ptr<SwTableRep> lcl_TableParamToItemSet( 
SfxItemSet& rSet, Sw
     SvxLRSpaceItem aLRSpace( pFormat->GetLRSpace() );
     SwTwips nLeft = aLRSpace.GetLeft();
     SwTwips nRight = aLRSpace.GetRight();
-    SwTwips nDiff = pRep->GetSpace() - nRight - nLeft - nWidth;
-    if(nAlign != text::HoriOrientation::FULL && std::abs(nDiff) > 2)
+    if(nAlign != text::HoriOrientation::FULL)
     {
         SwTwips nLR = pRep->GetSpace() - nWidth;
         switch ( nAlign )
@@ -1223,6 +1222,96 @@ void SwTableShell::Execute(SfxRequest &rReq)
             }
             return;
         }
+        case SID_ATTR_TABLE_ALIGNMENT:
+        {
+            const SfxUInt16Item* pAlignItem = 
rReq.GetArg<SfxUInt16Item>(SID_ATTR_TABLE_ALIGNMENT);
+            if (pAlignItem && pAlignItem->GetValue() <= 
text::HoriOrientation::LEFT_AND_WIDTH)
+            {
+                SfxItemSetFixed<RES_FRMATR_BEGIN, RES_FRMATR_END - 1> aSet( 
GetPool());
+                rSh.StartUndo(SwUndoId::TABLE_ATTR);
+                SwFormatHoriOrient aAttr( 0, pAlignItem->GetValue());
+
+                const SfxInt32Item* pLeftItem = 
rReq.GetArg<SfxInt32Item>(SID_ATTR_TABLE_LEFT_SPACE);
+                const SfxInt32Item* pRightItem = 
rReq.GetArg<SfxInt32Item>(SID_ATTR_TABLE_RIGHT_SPACE);
+
+                SvxLRSpaceItem aLRSpace( RES_LR_SPACE );
+                SwTwips nLeft = pLeftItem ? pLeftItem->GetValue() : 0;
+                SwTwips nRight = pRightItem ? pRightItem->GetValue() : 0;
+                SwTabCols aTabCols;
+                rSh.GetTabCols(aTabCols);
+                tools::Long nSpace = aTabCols.GetRightMax();
+                SwTwips nWidth = nSpace;
+                switch (pAlignItem->GetValue())
+                {
+                    case text::HoriOrientation::LEFT:
+                        if (MINLAY < nSpace - nRight)
+                            nWidth = nSpace - nRight;
+                        else
+                        {
+                            nWidth = MINLAY;
+                            nRight = nSpace - MINLAY;
+                        }
+                        nLeft = 0;
+                        break;
+                    case text::HoriOrientation::RIGHT:
+                        if (MINLAY < nSpace - nLeft)
+                            nWidth = nSpace - nLeft;
+                        else
+                        {
+                            nWidth = MINLAY;
+                            nLeft = nSpace - MINLAY;
+                        }
+                        nRight = 0;
+                        break;
+                    case text::HoriOrientation::LEFT_AND_WIDTH:
+                        // width doesn't change
+                        nRight = 0;
+                        nLeft = std::min(nLeft, nSpace);
+                        break;
+                    case text::HoriOrientation::FULL:
+                        nLeft = nRight = 0;
+                        break;
+                    case text::HoriOrientation::CENTER:
+                        if (MINLAY < nSpace - 2 * nLeft)
+                            nWidth = nSpace - 2 * nLeft;
+                        else
+                        {
+                            nWidth = MINLAY;
+                            nLeft = nRight = (nSpace - MINLAY) / 2;
+                        }
+                        break;
+                    case text::HoriOrientation::NONE:
+                        if (MINLAY < nSpace - nLeft - nRight)
+                            nWidth = nSpace - nLeft - nRight;
+                        else
+                        {
+                            nWidth = MINLAY;
+                            //TODO: keep the previous value - if possible and 
reduce the 'new one' only
+                            nLeft = nRight = (nSpace - MINLAY) / 2;
+                        }
+                        break;
+                    default:
+                        break;
+                }
+                SwFormatFrameSize aSz( SwFrameSize::Variable, nWidth );
+                aSet.Put(aSz);
+
+                aLRSpace.SetLeft(nLeft);
+                aLRSpace.SetRight(nRight);
+                aSet.Put( aLRSpace );
+
+                aSet.Put( aAttr );
+                rSh.SetTableAttr( aSet );
+                rSh.EndUndo(SwUndoId::TABLE_ATTR);
+                static sal_uInt16 aInva[] =
+                                {   SID_ATTR_TABLE_LEFT_SPACE,
+                                    SID_ATTR_TABLE_RIGHT_SPACE,
+                                    0
+                                };
+                GetView().GetViewFrame().GetBindings().Invalidate( aInva );
+            }
+            return;
+        }
         default:
             bMore = true;
     }
@@ -1569,6 +1658,57 @@ void SwTableShell::GetState(SfxItemSet &rSet)
 
                 break;
             }
+            case SID_ATTR_TABLE_ALIGNMENT:
+            {
+                const sal_uInt16 nAlign = 
pFormat->GetHoriOrient().GetHoriOrient();
+                rSet.Put(SfxUInt16Item(nSlot, nAlign));
+                break;
+            }
+            case SID_ATTR_TABLE_LEFT_SPACE:
+            case SID_ATTR_TABLE_RIGHT_SPACE:
+            {
+                SwTabCols aTabCols;
+                rSh.GetTabCols(aTabCols);
+                tools::Long nSpace = aTabCols.GetRightMax();
+                SvxLRSpaceItem aLRSpace(pFormat->GetLRSpace());
+                SwTwips nLeft = aLRSpace.GetLeft();
+                SwTwips nRight = aLRSpace.GetRight();
+
+                sal_uInt16 nPercent = 0;
+                auto nWidth = ::GetTableWidth(pFormat, aTabCols, &nPercent, 
&rSh );
+                // The table width is wrong for relative values.
+                if (nPercent)
+                    nWidth = nSpace * nPercent / 100;
+                const sal_uInt16 nAlign = 
pFormat->GetHoriOrient().GetHoriOrient();
+                if(nAlign != text::HoriOrientation::FULL )
+                {
+                    SwTwips nLR = nSpace - nWidth;
+                    switch ( nAlign )
+                    {
+                        case text::HoriOrientation::CENTER:
+                            nLeft = nRight = nLR / 2;
+                            break;
+                        case text::HoriOrientation::LEFT:
+                            nRight = nLR;
+                            nLeft = 0;
+                            break;
+                        case text::HoriOrientation::RIGHT:
+                            nLeft = nLR;
+                            nRight = 0;
+                            break;
+                        case text::HoriOrientation::LEFT_AND_WIDTH:
+                            nRight = nLR - nLeft;
+                            break;
+                        case text::HoriOrientation::NONE:
+                            if(!nPercent)
+                                nWidth = nSpace - nLeft - nRight;
+                            break;
+                    }
+                }
+                rSet.Put(SfxInt32Item(SID_ATTR_TABLE_LEFT_SPACE, nLeft));
+                rSet.Put(SfxInt32Item(SID_ATTR_TABLE_RIGHT_SPACE, nRight));
+                break;
+            }
         }
         nSlot = aIter.NextWhich();
     }
diff --git a/sw/source/uibase/sidebar/TableEditPanel.cxx 
b/sw/source/uibase/sidebar/TableEditPanel.cxx
index 61dcd2d4e52a..1022804cbbf0 100644
--- a/sw/source/uibase/sidebar/TableEditPanel.cxx
+++ b/sw/source/uibase/sidebar/TableEditPanel.cxx
@@ -12,6 +12,7 @@
 #include <sal/config.h>
 #include <swtypes.hxx>
 #include <cmdid.h>
+#include <strings.hrc>
 #include <svl/intitem.hxx>
 #include <sfx2/bindings.hxx>
 #include <sfx2/dispatch.hxx>
@@ -21,7 +22,9 @@
 #include <comphelper/lok.hxx>
 
 #include <com/sun/star/lang/IllegalArgumentException.hpp>
+#include <com/sun/star/text/HoriOrientation.hpp>
 
+using namespace ::com::sun::star;
 namespace sw::sidebar
 {
 std::unique_ptr<PanelLayout>
@@ -84,6 +87,42 @@ void TableEditPanel::NotifyItemUpdate(const sal_uInt16 nSID, 
const SfxItemState
 
             break;
         }
+        case SID_ATTR_TABLE_ALIGNMENT:
+            if (pState && eState >= SfxItemState::DEFAULT)
+            {
+                const SfxUInt16Item* pItem = static_cast<const 
SfxUInt16Item*>(pState);
+                if (pItem)
+                {
+                    sal_uInt16 nAlignment = pItem->GetValue();
+                    m_xAlignment->set_active_id(OUString::number(nAlignment));
+                    EnableLeftRight(nAlignment);
+                }
+            }
+            break;
+        case SID_ATTR_TABLE_LEFT_SPACE:
+        case SID_ATTR_TABLE_RIGHT_SPACE:
+        {
+            if (pState && eState >= SfxItemState::DEFAULT)
+            {
+                const SfxInt32Item* pItem = static_cast<const 
SfxInt32Item*>(pState);
+                if (pItem)
+                {
+                    if (SID_ATTR_TABLE_LEFT_SPACE == nSID)
+                    {
+                        m_aLeftSpacingEdit.set_value(
+                            m_aLeftSpacingEdit.normalize(pItem->GetValue()), 
FieldUnit::TWIP);
+                        m_aLeftSpacingEdit.save_value();
+                    }
+                    else
+                    {
+                        m_aRightSpacingEdit.set_value(
+                            m_aRightSpacingEdit.normalize(pItem->GetValue()), 
FieldUnit::TWIP);
+                        m_aRightSpacingEdit.save_value();
+                    }
+                }
+            }
+            break;
+        }
     }
 }
 
@@ -106,10 +145,16 @@ TableEditPanel::TableEditPanel(weld::Widget* pParent,
     , m_xDeleteDispatch(new ToolbarUnoDispatcher(*m_xDelete, *m_xBuilder, 
rxFrame))
     , m_xSplitMerge(m_xBuilder->weld_toolbar("split_merge"))
     , m_xSplitMergeDispatch(new ToolbarUnoDispatcher(*m_xSplitMerge, 
*m_xBuilder, rxFrame))
+    , m_xAlignment(m_xBuilder->weld_combo_box("alignmentLB"))
+    , m_aLeftSpacingEdit(m_xBuilder->weld_metric_spin_button("leftspace", 
FieldUnit::CM))
+    , m_aRightSpacingEdit(m_xBuilder->weld_metric_spin_button("rightspace", 
FieldUnit::CM))
     , m_xMisc(m_xBuilder->weld_toolbar("misc"))
     , m_xMiscDispatch(new ToolbarUnoDispatcher(*m_xMisc, *m_xBuilder, rxFrame))
     , m_aRowHeightController(SID_ATTR_TABLE_ROW_HEIGHT, *pBindings, *this)
     , m_aColumnWidthController(SID_ATTR_TABLE_COLUMN_WIDTH, *pBindings, *this)
+    , m_aAlignmentController(SID_ATTR_TABLE_ALIGNMENT, *pBindings, *this)
+    , m_aLeftSpacingController(SID_ATTR_TABLE_LEFT_SPACE, *pBindings, *this)
+    , m_aRightSpacingController(SID_ATTR_TABLE_RIGHT_SPACE, *pBindings, *this)
     , m_aInsertRowsBeforeController(FN_TABLE_INSERT_ROW_BEFORE, *pBindings, 
*this)
     , m_aInsertRowsAfterController(FN_TABLE_INSERT_ROW_AFTER, *pBindings, 
*this)
     , m_aInsertColumnsBeforeController(FN_TABLE_INSERT_COL_BEFORE, *pBindings, 
*this)
@@ -133,7 +178,7 @@ TableEditPanel::TableEditPanel(weld::Widget* pParent,
 
     InitRowHeightToolitem();
     InitColumnWidthToolitem();
-
+    InitAlignmentControls();
     if (comphelper::LibreOfficeKit::isActive())
         m_xMisc->set_item_visible(".uno:InsertFormula", false);
 }
@@ -166,6 +211,29 @@ void TableEditPanel::InitColumnWidthToolitem()
     limitWidthForSidebar(m_aColumnWidthEdit);
 }
 
+void TableEditPanel::InitAlignmentControls()
+{
+    m_xAlignment->connect_changed(LINK(this, TableEditPanel, AlignmentHdl));
+    m_aLeftSpacingEdit.connect_value_changed(LINK(this, TableEditPanel, 
SpacingHdl));
+    m_aRightSpacingEdit.connect_value_changed(LINK(this, TableEditPanel, 
SpacingHdl));
+    m_xAlignment->append(OUString::number(text::HoriOrientation::FULL),
+                         SwResId(STR_TABLE_PANEL_ALIGN_AUTO));
+    m_xAlignment->append(OUString::number(text::HoriOrientation::LEFT),
+                         SwResId(STR_TABLE_PANEL_ALIGN_LEFT));
+    
m_xAlignment->append(OUString::number(text::HoriOrientation::LEFT_AND_WIDTH),
+                         SwResId(STR_TABLE_PANEL_ALIGN_FROM_LEFT));
+    m_xAlignment->append(OUString::number(text::HoriOrientation::RIGHT),
+                         SwResId(STR_TABLE_PANEL_ALIGN_RIGHT));
+    m_xAlignment->append(OUString::number(text::HoriOrientation::CENTER),
+                         SwResId(STR_TABLE_PANEL_ALIGN_CENTER));
+    m_xAlignment->append(OUString::number(text::HoriOrientation::NONE),
+                         SwResId(STR_TABLE_PANEL_ALIGN_MANUAL));
+
+    FieldUnit eFieldUnit = SW_MOD()->GetUsrPref(false)->GetMetric();
+    m_aLeftSpacingEdit.SetFieldUnit(eFieldUnit);
+    m_aRightSpacingEdit.SetFieldUnit(eFieldUnit);
+}
+
 TableEditPanel::~TableEditPanel()
 {
     m_xMiscDispatch.reset();
@@ -207,6 +275,33 @@ TableEditPanel::~TableEditPanel()
     m_aMergeCellsController.dispose();
 }
 
+void TableEditPanel::EnableLeftRight(sal_uInt16 nAlignment)
+{
+    bool enableLeft = true;
+    bool enableRight = true;
+    switch (nAlignment)
+    {
+        case text::HoriOrientation::FULL:
+            enableLeft = false;
+            enableRight = false;
+            break;
+        case text::HoriOrientation::LEFT:
+            enableLeft = false;
+            break;
+        case text::HoriOrientation::CENTER:
+        case text::HoriOrientation::RIGHT:
+            enableRight = false;
+            break;
+        case text::HoriOrientation::LEFT_AND_WIDTH:
+            enableRight = false;
+            break;
+        default:
+            break;
+    }
+    m_aLeftSpacingEdit.set_sensitive(enableLeft);
+    m_aRightSpacingEdit.set_sensitive(enableRight);
+}
+
 IMPL_LINK_NOARG(TableEditPanel, RowHeightMofiyHdl, weld::MetricSpinButton&, 
void)
 {
     SwTwips nNewHeight = static_cast<SwTwips>(
@@ -228,6 +323,56 @@ IMPL_LINK_NOARG(TableEditPanel, ColumnWidthMofiyHdl, 
weld::MetricSpinButton&, vo
     m_pBindings->GetDispatcher()->ExecuteList(SID_ATTR_TABLE_COLUMN_WIDTH, 
SfxCallMode::RECORD,
                                               { &aColumnWidth });
 }
+
+IMPL_LINK_NOARG(TableEditPanel, AlignmentHdl, weld::ComboBox&, void) { 
AlignmentModify(true); }
+
+IMPL_LINK(TableEditPanel, SpacingHdl, weld::MetricSpinButton&, rField, void)
+{
+    if (!rField.get_value_changed_from_saved())
+        return;
+    rField.save_value();
+    AlignmentModify(false);
+}
+
+void TableEditPanel::AlignmentModify(bool alignmentChanged)
+{
+    sal_uInt16 nAlign = m_xAlignment->get_active_id().toUInt32();
+    SwTwips nLeft = static_cast<SwTwips>(
+        
m_aLeftSpacingEdit.denormalize(m_aLeftSpacingEdit.get_value(FieldUnit::TWIP)));
+    SwTwips nRight = static_cast<SwTwips>(
+        
m_aRightSpacingEdit.denormalize(m_aRightSpacingEdit.get_value(FieldUnit::TWIP)));
+    if (alignmentChanged)
+    {
+        EnableLeftRight(nAlign);
+        switch (nAlign)
+        {
+            case text::HoriOrientation::CENTER:
+                nLeft = nRight = (nLeft + nRight) / 2;
+                break;
+            case text::HoriOrientation::LEFT:
+                nRight = nLeft + nRight;
+                nLeft = 0;
+                break;
+            case text::HoriOrientation::RIGHT:
+                nLeft = nLeft + nRight;
+                nRight = 0;
+                break;
+            default:
+                if (!m_aLeftSpacingEdit.get_sensitive())
+                    nLeft = 0;
+                if (!m_aRightSpacingEdit.get_sensitive())
+                    nRight = 0;
+                break;
+        }
+    }
+
+    SfxUInt16Item aAlign(SID_ATTR_TABLE_ALIGNMENT, nAlign);
+    SfxInt32Item aLeft(SID_ATTR_TABLE_LEFT_SPACE, nLeft);
+    SfxInt32Item aRight(SID_ATTR_TABLE_RIGHT_SPACE, nRight);
+    m_pBindings->GetDispatcher()->ExecuteList(SID_ATTR_TABLE_ALIGNMENT, 
SfxCallMode::RECORD,
+                                              { &aAlign, &aLeft, &aRight });
+}
+
 } // end of namespace ::sw::sidebar
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/sidebar/TableEditPanel.hxx 
b/sw/source/uibase/sidebar/TableEditPanel.hxx
index 140de8653896..8aee8b4cea6d 100644
--- a/sw/source/uibase/sidebar/TableEditPanel.hxx
+++ b/sw/source/uibase/sidebar/TableEditPanel.hxx
@@ -39,6 +39,9 @@ public:
 private:
     void InitRowHeightToolitem();
     void InitColumnWidthToolitem();
+    void InitAlignmentControls();
+    void EnableLeftRight(sal_uInt16 nAlignment);
+    void AlignmentModify(bool alignmentChanged);
 
     SfxBindings* m_pBindings;
 
@@ -56,11 +59,17 @@ private:
     std::unique_ptr<ToolbarUnoDispatcher> m_xDeleteDispatch;
     std::unique_ptr<weld::Toolbar> m_xSplitMerge;
     std::unique_ptr<ToolbarUnoDispatcher> m_xSplitMergeDispatch;
+    std::unique_ptr<weld::ComboBox> m_xAlignment;
+    SvxRelativeField m_aLeftSpacingEdit;
+    SvxRelativeField m_aRightSpacingEdit;
     std::unique_ptr<weld::Toolbar> m_xMisc;
     std::unique_ptr<ToolbarUnoDispatcher> m_xMiscDispatch;
 
     ::sfx2::sidebar::ControllerItem m_aRowHeightController;
     ::sfx2::sidebar::ControllerItem m_aColumnWidthController;
+    ::sfx2::sidebar::ControllerItem m_aAlignmentController;
+    ::sfx2::sidebar::ControllerItem m_aLeftSpacingController;
+    ::sfx2::sidebar::ControllerItem m_aRightSpacingController;
     ::sfx2::sidebar::ControllerItem m_aInsertRowsBeforeController;
     ::sfx2::sidebar::ControllerItem m_aInsertRowsAfterController;
     ::sfx2::sidebar::ControllerItem m_aInsertColumnsBeforeController;
@@ -78,6 +87,8 @@ private:
 
     DECL_LINK(RowHeightMofiyHdl, weld::MetricSpinButton&, void);
     DECL_LINK(ColumnWidthMofiyHdl, weld::MetricSpinButton&, void);
+    DECL_LINK(AlignmentHdl, weld::ComboBox&, void);
+    DECL_LINK(SpacingHdl, weld::MetricSpinButton&, void);
 };
 
 } // end of namespace sw::sidebar
diff --git a/sw/uiconfig/swriter/ui/sidebartableedit.ui 
b/sw/uiconfig/swriter/ui/sidebartableedit.ui
index 55c4a839ef30..e3a50c34321e 100644
--- a/sw/uiconfig/swriter/ui/sidebartableedit.ui
+++ b/sw/uiconfig/swriter/ui/sidebartableedit.ui
@@ -12,12 +12,24 @@
     <property name="step-increment">1</property>
     <property name="page-increment">10</property>
   </object>
+  <object class="GtkAdjustment" id="adjustment3">
+    <property name="lower">-99.98999999999999</property>
+    <property name="upper">99.98999999999999</property>
+    <property name="step-increment">0.05</property>
+    <property name="page-increment">1</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment4">
+    <property name="lower">-99.98999999999999</property>
+    <property name="upper">99.98999999999999</property>
+    <property name="step-increment">0.05</property>
+    <property name="page-increment">1</property>
+  </object>
   <!-- n-columns=1 n-rows=1 -->
   <object class="GtkGrid" id="TableEditPanel">
     <property name="visible">True</property>
     <property name="can-focus">False</property>
     <child>
-      <!-- n-columns=2 n-rows=10 -->
+      <!-- n-columns=2 n-rows=14 -->
       <object class="GtkGrid" id="grid1">
         <property name="visible">True</property>
         <property name="can-focus">False</property>
@@ -452,6 +464,95 @@
             <property name="top-attach">3</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkLabel" id="align_label">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="label" translatable="yes" 
context="sidebartableedit|align_label">Alignment:</property>
+            <property name="use-underline">True</property>
+            <property name="mnemonic-widget">alignmentLB</property>
+            <property name="xalign">0</property>
+          </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">9</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkComboBoxText" id="alignmentLB">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="tooltip-text" translatable="yes" 
context="sidebartableedit|alignmentLB|tooltip_text">Set the alignment options 
for the selected table.</property>
+            <property name="hexpand">True</property>
+          </object>
+          <packing>
+            <property name="left-attach">1</property>
+            <property name="top-attach">9</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="leftspace_label">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="label" translatable="yes" 
context="sidebartableedit|leftspace_label">Left spacing:</property>
+            <property name="use-underline">True</property>
+            <property name="mnemonic-widget">leftspace</property>
+            <property name="xalign">0</property>
+          </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">10</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="rightspace_label">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="label" translatable="yes" 
context="sidebartableedit|align_label">Right spacing:</property>
+            <property name="use-underline">True</property>
+            <property name="mnemonic-widget">rightspace</property>
+            <property name="xalign">0</property>
+          </object>
+          <packing>
+            <property name="left-attach">1</property>
+            <property name="top-attach">10</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkSpinButton" id="leftspace">
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="tooltip-text" translatable="yes" 
context="sidebatableedit|leftspace|tooltip_text">Left Spacing</property>
+            <property name="hexpand">True</property>
+            <property name="text">0</property>
+            <property name="truncate-multiline">True</property>
+            <property name="adjustment">adjustment3</property>
+            <property name="digits">2</property>
+          </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">11</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkSpinButton" id="rightspace">
+            <property name="visible">True</property>
+            <property name="can-focus">True</property>
+            <property name="tooltip-text" translatable="yes" 
context="sidebatableedit|rightspace|tooltip_text">Right Spacing</property>
+            <property name="hexpand">True</property>
+            <property name="text">0</property>
+            <property name="truncate-multiline">True</property>
+            <property name="adjustment">adjustment4</property>
+            <property name="digits">2</property>
+          </object>
+          <packing>
+            <property name="left-attach">1</property>
+            <property name="top-attach">11</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkToolbar" id="misc">
             <property name="visible">True</property>
@@ -496,7 +597,7 @@
           </object>
           <packing>
             <property name="left-attach">1</property>
-            <property name="top-attach">9</property>
+            <property name="top-attach">13</property>
           </packing>
         </child>
         <child>
@@ -510,7 +611,7 @@
           </object>
           <packing>
             <property name="left-attach">0</property>
-            <property name="top-attach">9</property>
+            <property name="top-attach">13</property>
           </packing>
         </child>
         <child>
@@ -520,10 +621,16 @@
           </object>
           <packing>
             <property name="left-attach">0</property>
-            <property name="top-attach">8</property>
+            <property name="top-attach">12</property>
             <property name="width">2</property>
           </packing>
         </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
       </object>
       <packing>
         <property name="left-attach">0</property>
commit e42b2827b5d392479791632877fc00b6add0307d
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Mon Feb 12 10:38:03 2024 +0100
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Mon Feb 12 18:17:15 2024 +0100

    kf6: Add missing include path to fix build
    
    Many thanks to Andreas Sturmlechner for pointing
    this out on #libreoffice-dev on 2024-02-12:
    
    > [10:27] <asturm> michaelweghorn: I also had to apply a trivial
    >                  openmandriva patch to get it to build in the first place,
    >                  
https://github.com/gentoo/gentoo/blob/master/app-office/libreoffice/files/libreoffice-24.2-kf6-buildfix.patch
    
    Change-Id: If86220e258336d84ffc30fd5da0f5d99dda59aff
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163237
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/configure.ac b/configure.ac
index e6c35380e91d..6440f1f734dc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -13499,7 +13499,7 @@ then
         AC_MSG_ERROR([KF6 libraries not found.  Please specify the root of 
your KF6 installation by exporting KF6DIR before running "configure".])
     fi
 
-    KF6_CFLAGS="-I$kf6_incdir -I$kf6_incdir/KCoreAddons -I$kf6_incdir/KI18n 
-I$kf6_incdir/KConfigCore -I$kf6_incdir/KWindowSystem -I$kf6_incdir/KIO 
-I$kf6_incdir/KIOCore -I$kf6_incdir/KIOWidgets -I$kf6_incdir/KIOFileWidgets 
-I$qt6_incdir -I$qt6_incdir/QtCore -I$qt6_incdir/QtGui -I$qt6_incdir/QtWidgets 
-I$qt6_incdir/QtNetwork -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT 
-DQT_NO_VERSION_TAGGING"
+    KF6_CFLAGS="-I$kf6_incdir -I$kf6_incdir/KCoreAddons -I$kf6_incdir/KI18n 
-I$kf6_incdir/KConfig -I$kf6_incdir/KConfigCore -I$kf6_incdir/KWindowSystem 
-I$kf6_incdir/KIO -I$kf6_incdir/KIOCore -I$kf6_incdir/KIOWidgets 
-I$kf6_incdir/KIOFileWidgets -I$qt6_incdir -I$qt6_incdir/QtCore 
-I$qt6_incdir/QtGui -I$qt6_incdir/QtWidgets -I$qt6_incdir/QtNetwork 
-DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT -DQT_NO_VERSION_TAGGING"
     KF6_LIBS="-L$kf6_libdir -lKF6CoreAddons -lKF6I18n -lKF6ConfigCore 
-lKF6WindowSystem -lKF6KIOCore -lKF6KIOWidgets -lKF6KIOFileWidgets 
-L$qt6_libdir -lQt6Core -lQt6Gui -lQt6Widgets -lQt6Network"
     KF6_CFLAGS=$(printf '%s' "$KF6_CFLAGS" | sed -e "s/-I/${ISYSTEM?}/g")
 

Reply via email to