/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * */ #include "TableEditPanel.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace ::com::sun::star; namespace sw::sidebar { std::unique_ptr TableEditPanel::Create(weld::Widget* pParent, const css::uno::Reference& rxFrame, SfxBindings* pBindings) { if (pParent == nullptr) throw css::lang::IllegalArgumentException( u"no parent Window given to TableEditPanel::Create"_ustr, nullptr, 0); if (!rxFrame.is()) throw css::lang::IllegalArgumentException(u"no XFrame given to TableEditPanel::Create"_ustr, nullptr, 1); return std::make_unique(pParent, rxFrame, pBindings); } void TableEditPanel::NotifyItemUpdate(const sal_uInt16 nSID, const SfxItemState eState, const SfxPoolItem* pState) { switch (nSID) { case SID_ATTR_TABLE_ROW_HEIGHT: { bool bDisabled = eState == SfxItemState::DISABLED; m_aRowHeightEdit.set_sensitive(!bDisabled); if (pState && eState >= SfxItemState::DEFAULT) { const SfxUInt32Item* pItem = static_cast(pState); if (pItem) { tools::Long nNewHeight = pItem->GetValue(); nNewHeight = m_aRowHeightEdit.normalize(nNewHeight); m_aRowHeightEdit.set_value(nNewHeight, FieldUnit::TWIP); } } else if (eState != SfxItemState::DISABLED) m_aRowHeightEdit.set_text(u""_ustr); break; } case SID_ATTR_TABLE_COLUMN_WIDTH: { bool bDisabled = eState == SfxItemState::DISABLED; m_aColumnWidthEdit.set_sensitive(!bDisabled); if (pState && eState >= SfxItemState::DEFAULT) { const SfxUInt32Item* pItem = static_cast(pState); if (pItem) { tools::Long nNewWidth = pItem->GetValue(); nNewWidth = m_aColumnWidthEdit.normalize(nNewWidth); m_aColumnWidthEdit.set_value(nNewWidth, FieldUnit::TWIP); } } else if (eState != SfxItemState::DISABLED) m_aColumnWidthEdit.set_text(u""_ustr); break; } case SID_ATTR_TABLE_ALIGNMENT: if (pState && eState >= SfxItemState::DEFAULT) { const SfxUInt16Item* pItem = static_cast(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(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; } } } TableEditPanel::TableEditPanel(weld::Widget* pParent, const css::uno::Reference& rxFrame, SfxBindings* pBindings) : PanelLayout(pParent, u"TableEditPanel"_ustr, u"modules/swriter/ui/sidebartableedit.ui"_ustr) , m_pBindings(pBindings) , m_aRowHeightEdit(m_xBuilder->weld_metric_spin_button(u"rowheight"_ustr, FieldUnit::CM)) , m_aColumnWidthEdit(m_xBuilder->weld_metric_spin_button(u"columnwidth"_ustr, FieldUnit::CM)) , m_xInsert(m_xBuilder->weld_toolbar(u"insert"_ustr)) , m_xInsertDispatch(new ToolbarUnoDispatcher(*m_xInsert, *m_xBuilder, rxFrame)) , m_xSelect(m_xBuilder->weld_toolbar(u"select"_ustr)) , m_xSelectDispatch(new ToolbarUnoDispatcher(*m_xSelect, *m_xBuilder, rxFrame)) , m_xRowSizing(m_xBuilder->weld_toolbar(u"rowsizing"_ustr)) , m_xRowSizingDispatch(new ToolbarUnoDispatcher(*m_xRowSizing, *m_xBuilder, rxFrame)) , m_xColumnSizing(m_xBuilder->weld_toolbar(u"columnsizing"_ustr)) , m_xColumnSizingDispatch(new ToolbarUnoDispatcher(*m_xColumnSizing, *m_xBuilder, rxFrame)) , m_xDelete(m_xBuilder->weld_toolbar(u"delete"_ustr)) , m_xDeleteDispatch(new ToolbarUnoDispatcher(*m_xDelete, *m_xBuilder, rxFrame)) , m_xSplitMerge(m_xBuilder->weld_toolbar(u"split_merge"_ustr)) , m_xSplitMergeDispatch(new ToolbarUnoDispatcher(*m_xSplitMerge, *m_xBuilder, rxFrame)) , m_xAlignment(m_xBuilder->weld_combo_box(u"alignmentLB"_ustr)) , m_aLeftSpacingEdit(m_xBuilder->weld_metric_spin_button(u"leftspace"_ustr, FieldUnit::CM)) , m_aRightSpacingEdit(m_xBuilder->weld_metric_spin_button(u"rightspace"_ustr, FieldUnit::CM)) , m_xMisc(m_xBuilder->weld_toolbar(u"misc"_ustr)) , 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) , m_aInsertColumnsAfterController(FN_TABLE_INSERT_COL_AFTER, *pBindings, *this) , m_aDeleteRowsController(FN_TABLE_DELETE_ROW, *pBindings, *this) , m_aDeleteColumnsController(FN_TABLE_DELETE_COL, *pBindings, *this) , m_aDeleteTableController(FN_TABLE_DELETE_TABLE, *pBindings, *this) , m_aSetMinimalRowHeightController(SID_TABLE_MINIMAL_ROW_HEIGHT, *pBindings, *this) , m_aSetOptimalRowHeightController(FN_TABLE_OPTIMAL_HEIGHT, *pBindings, *this) , m_aDistributeRowsController(FN_TABLE_BALANCE_ROWS, *pBindings, *this) , m_aSetMinimalColumnWidthController(SID_TABLE_MINIMAL_COLUMN_WIDTH, *pBindings, *this) , m_aSetOptimalColumnWidthController(FN_TABLE_ADJUST_CELLS, *pBindings, *this) , m_aDistributeColumnsController(FN_TABLE_BALANCE_CELLS, *pBindings, *this) , m_aMergeCellsController(FN_TABLE_MERGE_CELLS, *pBindings, *this) { // tdf#130197 Give this toolbar a width as if it had 5 entries (the parent // grid has homogeneous width set so both columns will have the same // width). This will align this TableEditPanel's columns with // ParaPropertyPanel's columns padWidthForSidebar(*m_xSplitMerge, rxFrame); InitRowHeightToolitem(); InitColumnWidthToolitem(); InitAlignmentControls(); if (comphelper::LibreOfficeKit::isActive()) m_xMisc->set_item_visible(u".uno:InsertFormula"_ustr, false); } void TableEditPanel::InitRowHeightToolitem() { Link aLink = LINK(this, TableEditPanel, RowHeightMofiyHdl); m_aRowHeightEdit.connect_value_changed(aLink); FieldUnit eFieldUnit = SwModule::get()->GetUsrPref(false)->GetMetric(); m_aRowHeightEdit.SetFieldUnit(eFieldUnit); m_aRowHeightEdit.set_min(MINLAY, FieldUnit::TWIP); m_aRowHeightEdit.set_max(SAL_MAX_INT32, FieldUnit::TWIP); limitWidthForSidebar(m_aRowHeightEdit); } void TableEditPanel::InitColumnWidthToolitem() { Link aLink = LINK(this, TableEditPanel, ColumnWidthMofiyHdl); m_aColumnWidthEdit.connect_value_changed(aLink); FieldUnit eFieldUnit = SwModule::get()->GetUsrPref(false)->GetMetric(); m_aColumnWidthEdit.SetFieldUnit(eFieldUnit); m_aColumnWidthEdit.set_min(MINLAY, FieldUnit::TWIP); m_aColumnWidthEdit.set_max(SAL_MAX_INT32, FieldUnit::TWIP); 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 = SwModule::get()->GetUsrPref(false)->GetMetric(); m_aLeftSpacingEdit.SetFieldUnit(eFieldUnit); m_aRightSpacingEdit.SetFieldUnit(eFieldUnit); } TableEditPanel::~TableEditPanel() { m_xMiscDispatch.reset(); m_xMisc.reset(); m_xSplitMergeDispatch.reset(); m_xSplitMerge.reset(); m_xDeleteDispatch.reset(); m_xDelete.reset(); m_xColumnSizingDispatch.reset(); m_xColumnSizing.reset(); m_xRowSizingDispatch.reset(); m_xRowSizing.reset(); m_xSelectDispatch.reset(); m_xSelect.reset(); m_xInsertDispatch.reset(); m_xInsert.reset(); m_aRowHeightController.dispose(); m_aColumnWidthController.dispose(); m_aInsertRowsBeforeController.dispose(); m_aInsertRowsAfterController.dispose(); m_aInsertColumnsBeforeController.dispose(); m_aInsertColumnsAfterController.dispose(); m_aDeleteRowsController.dispose(); m_aDeleteColumnsController.dispose(); m_aDeleteTableController.dispose(); m_aSetMinimalRowHeightController.dispose(); m_aSetOptimalRowHeightController.dispose(); m_aDistributeRowsController.dispose(); m_aSetMinimalColumnWidthController.dispose(); m_aSetOptimalColumnWidthController.dispose(); m_aDistributeColumnsController.dispose(); 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( m_aRowHeightEdit.denormalize(m_aRowHeightEdit.get_value(FieldUnit::TWIP))); SfxUInt32Item aRowHeight(SID_ATTR_TABLE_ROW_HEIGHT); aRowHeight.SetValue(nNewHeight); m_pBindings->GetDispatcher()->ExecuteList(SID_ATTR_TABLE_ROW_HEIGHT, SfxCallMode::RECORD, { &aRowHeight }); } IMPL_LINK_NOARG(TableEditPanel, ColumnWidthMofiyHdl, weld::MetricSpinButton&, void) { SwTwips nNewWidth = static_cast( m_aColumnWidthEdit.denormalize(m_aColumnWidthEdit.get_value(FieldUnit::TWIP))); SfxUInt32Item aColumnWidth(SID_ATTR_TABLE_COLUMN_WIDTH); aColumnWidth.SetValue(nNewWidth); 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( m_aLeftSpacingEdit.denormalize(m_aLeftSpacingEdit.get_value(FieldUnit::TWIP))); SwTwips nRight = static_cast( 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: */