1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  */
10 
11 #include "TableEditPanel.hxx"
12 #include <sal/config.h>
13 #include <swtypes.hxx>
14 #include <cmdid.h>
15 #include <svl/intitem.hxx>
16 #include <sfx2/bindings.hxx>
17 #include <sfx2/dispatch.hxx>
18 #include <svx/dlgctrl.hxx>
19 #include <swmodule.hxx>
20 #include <usrpref.hxx>
21 #include <comphelper/lok.hxx>
22 
23 #include <com/sun/star/lang/IllegalArgumentException.hpp>
24 
25 namespace sw::sidebar
26 {
27 std::unique_ptr<PanelLayout>
Create(weld::Widget * pParent,const css::uno::Reference<css::frame::XFrame> & rxFrame,SfxBindings * pBindings)28 TableEditPanel::Create(weld::Widget* pParent,
29                        const css::uno::Reference<css::frame::XFrame>& rxFrame,
30                        SfxBindings* pBindings)
31 {
32     if (pParent == nullptr)
33         throw css::lang::IllegalArgumentException(
34             "no parent Window given to TableEditPanel::Create", nullptr, 0);
35     if (!rxFrame.is())
36         throw css::lang::IllegalArgumentException("no XFrame given to TableEditPanel::Create",
37                                                   nullptr, 1);
38 
39     return std::make_unique<TableEditPanel>(pParent, rxFrame, pBindings);
40 }
41 
NotifyItemUpdate(const sal_uInt16 nSID,const SfxItemState eState,const SfxPoolItem * pState)42 void TableEditPanel::NotifyItemUpdate(const sal_uInt16 nSID, const SfxItemState eState,
43                                       const SfxPoolItem* pState)
44 {
45     switch (nSID)
46     {
47         case SID_ATTR_TABLE_ROW_HEIGHT:
48         {
49             bool bDisabled = eState == SfxItemState::DISABLED;
50             m_xRowHeightEdit->set_sensitive(!bDisabled);
51 
52             if (pState && eState >= SfxItemState::DEFAULT)
53             {
54                 const SfxUInt32Item* pItem = static_cast<const SfxUInt32Item*>(pState);
55                 if (pItem)
56                 {
57                     tools::Long nNewHeight = pItem->GetValue();
58                     nNewHeight = m_xRowHeightEdit->normalize(nNewHeight);
59                     m_xRowHeightEdit->set_value(nNewHeight, FieldUnit::TWIP);
60                 }
61             }
62             else if (eState != SfxItemState::DISABLED)
63                 m_xRowHeightEdit->set_text("");
64 
65             break;
66         }
67         case SID_ATTR_TABLE_COLUMN_WIDTH:
68         {
69             bool bDisabled = eState == SfxItemState::DISABLED;
70             m_xColumnWidthEdit->set_sensitive(!bDisabled);
71 
72             if (pState && eState >= SfxItemState::DEFAULT)
73             {
74                 const SfxUInt32Item* pItem = static_cast<const SfxUInt32Item*>(pState);
75                 if (pItem)
76                 {
77                     tools::Long nNewWidth = pItem->GetValue();
78                     nNewWidth = m_xColumnWidthEdit->normalize(nNewWidth);
79                     m_xColumnWidthEdit->set_value(nNewWidth, FieldUnit::TWIP);
80                 }
81             }
82             else if (eState != SfxItemState::DISABLED)
83                 m_xColumnWidthEdit->set_text("");
84 
85             break;
86         }
87     }
88 }
89 
TableEditPanel(weld::Widget * pParent,const css::uno::Reference<css::frame::XFrame> & rxFrame,SfxBindings * pBindings)90 TableEditPanel::TableEditPanel(weld::Widget* pParent,
91                                const css::uno::Reference<css::frame::XFrame>& rxFrame,
92                                SfxBindings* pBindings)
93     : PanelLayout(pParent, "TableEditPanel", "modules/swriter/ui/sidebartableedit.ui")
94     , m_pBindings(pBindings)
95     , m_xRowHeightEdit(
96           new SvxRelativeField(m_xBuilder->weld_metric_spin_button("rowheight", FieldUnit::CM)))
97     , m_xColumnWidthEdit(
98           new SvxRelativeField(m_xBuilder->weld_metric_spin_button("columnwidth", FieldUnit::CM)))
99     , m_xInsert(m_xBuilder->weld_toolbar("insert"))
100     , m_xInsertDispatch(new ToolbarUnoDispatcher(*m_xInsert, *m_xBuilder, rxFrame))
101     , m_xSelect(m_xBuilder->weld_toolbar("select"))
102     , m_xSelectDispatch(new ToolbarUnoDispatcher(*m_xSelect, *m_xBuilder, rxFrame))
103     , m_xRowSizing(m_xBuilder->weld_toolbar("rowsizing"))
104     , m_xRowSizingDispatch(new ToolbarUnoDispatcher(*m_xRowSizing, *m_xBuilder, rxFrame))
105     , m_xColumnSizing(m_xBuilder->weld_toolbar("columnsizing"))
106     , m_xColumnSizingDispatch(new ToolbarUnoDispatcher(*m_xColumnSizing, *m_xBuilder, rxFrame))
107     , m_xDelete(m_xBuilder->weld_toolbar("delete"))
108     , m_xDeleteDispatch(new ToolbarUnoDispatcher(*m_xDelete, *m_xBuilder, rxFrame))
109     , m_xSplitMerge(m_xBuilder->weld_toolbar("split_merge"))
110     , m_xSplitMergeDispatch(new ToolbarUnoDispatcher(*m_xSplitMerge, *m_xBuilder, rxFrame))
111     , m_xMisc(m_xBuilder->weld_toolbar("misc"))
112     , m_xMiscDispatch(new ToolbarUnoDispatcher(*m_xMisc, *m_xBuilder, rxFrame))
113     , m_aRowHeightController(SID_ATTR_TABLE_ROW_HEIGHT, *pBindings, *this)
114     , m_aColumnWidthController(SID_ATTR_TABLE_COLUMN_WIDTH, *pBindings, *this)
115     , m_aInsertRowsBeforeController(FN_TABLE_INSERT_ROW_BEFORE, *pBindings, *this)
116     , m_aInsertRowsAfterController(FN_TABLE_INSERT_ROW_AFTER, *pBindings, *this)
117     , m_aInsertColumnsBeforeController(FN_TABLE_INSERT_COL_BEFORE, *pBindings, *this)
118     , m_aInsertColumnsAfterController(FN_TABLE_INSERT_COL_AFTER, *pBindings, *this)
119     , m_aDeleteRowsController(FN_TABLE_DELETE_ROW, *pBindings, *this)
120     , m_aDeleteColumnsController(FN_TABLE_DELETE_COL, *pBindings, *this)
121     , m_aDeleteTableController(FN_TABLE_DELETE_TABLE, *pBindings, *this)
122     , m_aSetMinimalRowHeightController(SID_TABLE_MINIMAL_ROW_HEIGHT, *pBindings, *this)
123     , m_aSetOptimalRowHeightController(FN_TABLE_OPTIMAL_HEIGHT, *pBindings, *this)
124     , m_aDistributeRowsController(FN_TABLE_BALANCE_ROWS, *pBindings, *this)
125     , m_aSetMinimalColumnWidthController(SID_TABLE_MINIMAL_COLUMN_WIDTH, *pBindings, *this)
126     , m_aSetOptimalColumnWidthController(FN_TABLE_ADJUST_CELLS, *pBindings, *this)
127     , m_aDistributeColumnsController(FN_TABLE_BALANCE_CELLS, *pBindings, *this)
128     , m_aMergeCellsController(FN_TABLE_MERGE_CELLS, *pBindings, *this)
129 {
130     // tdf#130197 Give this toolbar a width as if it had 5 entries (the parent
131     // grid has homogeneous width set so both columns will have the same
132     // width). This will align this TableEditPanel's columns with
133     // ParaPropertyPanel's columns
134     padWidthForSidebar(*m_xSplitMerge, rxFrame);
135 
136     InitRowHeightToolitem();
137     InitColumnWidthToolitem();
138 
139     if (comphelper::LibreOfficeKit::isActive())
140         m_xMisc->set_item_visible(".uno:InsertFormula", false);
141 }
142 
InitRowHeightToolitem()143 void TableEditPanel::InitRowHeightToolitem()
144 {
145     Link<weld::MetricSpinButton&, void> aLink = LINK(this, TableEditPanel, RowHeightMofiyHdl);
146     m_xRowHeightEdit->connect_value_changed(aLink);
147 
148     FieldUnit eFieldUnit = SW_MOD()->GetUsrPref(false)->GetMetric();
149     m_xRowHeightEdit->SetFieldUnit(eFieldUnit);
150 
151     m_xRowHeightEdit->set_min(MINLAY, FieldUnit::TWIP);
152     m_xRowHeightEdit->set_max(SAL_MAX_INT32, FieldUnit::TWIP);
153 
154     limitWidthForSidebar(*m_xRowHeightEdit);
155 }
156 
InitColumnWidthToolitem()157 void TableEditPanel::InitColumnWidthToolitem()
158 {
159     Link<weld::MetricSpinButton&, void> aLink = LINK(this, TableEditPanel, ColumnWidthMofiyHdl);
160     m_xColumnWidthEdit->connect_value_changed(aLink);
161 
162     FieldUnit eFieldUnit = SW_MOD()->GetUsrPref(false)->GetMetric();
163     m_xColumnWidthEdit->SetFieldUnit(eFieldUnit);
164 
165     m_xColumnWidthEdit->set_min(MINLAY, FieldUnit::TWIP);
166     m_xColumnWidthEdit->set_max(SAL_MAX_INT32, FieldUnit::TWIP);
167 
168     limitWidthForSidebar(*m_xColumnWidthEdit);
169 }
170 
~TableEditPanel()171 TableEditPanel::~TableEditPanel()
172 {
173     m_xRowHeightEdit.reset();
174     m_xColumnWidthEdit.reset();
175 
176     m_xMiscDispatch.reset();
177     m_xMisc.reset();
178 
179     m_xSplitMergeDispatch.reset();
180     m_xSplitMerge.reset();
181 
182     m_xDeleteDispatch.reset();
183     m_xDelete.reset();
184 
185     m_xColumnSizingDispatch.reset();
186     m_xColumnSizing.reset();
187 
188     m_xRowSizingDispatch.reset();
189     m_xRowSizing.reset();
190 
191     m_xSelectDispatch.reset();
192     m_xSelect.reset();
193 
194     m_xInsertDispatch.reset();
195     m_xInsert.reset();
196 
197     m_aRowHeightController.dispose();
198     m_aColumnWidthController.dispose();
199     m_aInsertRowsBeforeController.dispose();
200     m_aInsertRowsAfterController.dispose();
201     m_aInsertColumnsBeforeController.dispose();
202     m_aInsertColumnsAfterController.dispose();
203     m_aDeleteRowsController.dispose();
204     m_aDeleteColumnsController.dispose();
205     m_aDeleteTableController.dispose();
206     m_aSetMinimalRowHeightController.dispose();
207     m_aSetOptimalRowHeightController.dispose();
208     m_aDistributeRowsController.dispose();
209     m_aSetMinimalColumnWidthController.dispose();
210     m_aSetOptimalColumnWidthController.dispose();
211     m_aDistributeColumnsController.dispose();
212     m_aMergeCellsController.dispose();
213 }
214 
IMPL_LINK_NOARG(TableEditPanel,RowHeightMofiyHdl,weld::MetricSpinButton &,void)215 IMPL_LINK_NOARG(TableEditPanel, RowHeightMofiyHdl, weld::MetricSpinButton&, void)
216 {
217     SwTwips nNewHeight = static_cast<SwTwips>(
218         m_xRowHeightEdit->denormalize(m_xRowHeightEdit->get_value(FieldUnit::TWIP)));
219     SfxUInt32Item aRowHeight(SID_ATTR_TABLE_ROW_HEIGHT);
220     aRowHeight.SetValue(nNewHeight);
221 
222     m_pBindings->GetDispatcher()->ExecuteList(SID_ATTR_TABLE_ROW_HEIGHT, SfxCallMode::RECORD,
223                                               { &aRowHeight });
224 }
225 
IMPL_LINK_NOARG(TableEditPanel,ColumnWidthMofiyHdl,weld::MetricSpinButton &,void)226 IMPL_LINK_NOARG(TableEditPanel, ColumnWidthMofiyHdl, weld::MetricSpinButton&, void)
227 {
228     SwTwips nNewWidth = static_cast<SwTwips>(
229         m_xColumnWidthEdit->denormalize(m_xColumnWidthEdit->get_value(FieldUnit::TWIP)));
230     SfxUInt32Item aColumnWidth(SID_ATTR_TABLE_COLUMN_WIDTH);
231     aColumnWidth.SetValue(nNewWidth);
232 
233     m_pBindings->GetDispatcher()->ExecuteList(SID_ATTR_TABLE_COLUMN_WIDTH, SfxCallMode::RECORD,
234                                               { &aColumnWidth });
235 }
236 } // end of namespace ::sw::sidebar
237 
238 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
239