Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/LibreOffice/sw/source/uibase/sidebar/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 15 kB image not shown  

Quelle  TableEditPanel.cxx   Sprache: C

 
/* -*- 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 <sal/config.h>
#include <swtypes.hxx>
#include <cmdid.h>
#include <strings.hrc>
#include <svl/intitem.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <svx/dlgctrl.hxx>
#include <swmodule.hxx>
#include <usrpref.hxx>
#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>
TableEditPanel::Create(weld::Widget* pParent,
                       const css::uno::Reference<css::frame::XFrame>& 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<TableEditPanel>(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<const SfxUInt32Item*>(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<const SfxUInt32Item*>(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<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;
        }
    }
}

TableEditPanel::TableEditPanel(weld::Widget* pParent,
                               const css::uno::Reference<css::frame::XFrame>& 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<weld::MetricSpinButton&, void> 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<weld::MetricSpinButton&, void> 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<SwTwips>(
        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<SwTwips>(
        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<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: */

Messung V0.5
C=93 H=94 G=93

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.