sw/source/ui/table/instable.cxx | 59 +++++++++++++++++++++++----------- sw/source/uibase/inc/instable.hxx | 7 ++-- sw/uiconfig/swriter/ui/inserttable.ui | 17 ++++++++- 3 files changed, 58 insertions(+), 25 deletions(-)
New commits: commit 3f8d9566cdf278d3412207aa15ac5a8c6a3757b4 Author: Anshu <anshukhar...@gmail.com> AuthorDate: Tue Nov 10 03:46:47 2020 +0530 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Thu Nov 19 20:10:53 2020 +0100 tdf#134779 Warning generated if the table size exceeds a particular limit Change-Id: I2ee23c7b3f5638b48323a76535e7a3b5141d1ad0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105501 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/sw/source/ui/table/instable.cxx b/sw/source/ui/table/instable.cxx index 3ca34f37b313..b700b85d53fc 100644 --- a/sw/source/ui/table/instable.cxx +++ b/sw/source/ui/table/instable.cxx @@ -25,7 +25,6 @@ #include <viewopt.hxx> #include <comphelper/lok.hxx> -#define ROW_COL_PROD 16384 void SwInsTableDlg::GetValues( OUString& rName, sal_uInt16& rRow, sal_uInt16& rCol, SwInsertTableOptions& rInsTableOpts, OUString& rAutoName, @@ -33,8 +32,8 @@ void SwInsTableDlg::GetValues( OUString& rName, sal_uInt16& rRow, sal_uInt16& rC { SwInsertTableFlags nInsMode = SwInsertTableFlags::NONE; rName = m_xNameEdit->get_text(); - rRow = m_xRowNF->get_value(); - rCol = m_xColNF->get_value(); + rRow = m_xRowSpinButton->get_value(); + rCol = m_xColSpinButton->get_value(); if (m_xHeaderCB->get_active()) nInsMode |= SwInsertTableFlags::Headline; @@ -66,8 +65,9 @@ SwInsTableDlg::SwInsTableDlg(SwView& rView) , pTAutoFormat(nullptr) , nEnteredValRepeatHeaderNF(-1) , m_xNameEdit(m_xBuilder->weld_entry("nameedit")) - , m_xColNF(m_xBuilder->weld_spin_button("colspin")) - , m_xRowNF(m_xBuilder->weld_spin_button("rowspin")) + , m_xWarning(m_xBuilder->weld_label("lbwarning")) + , m_xColSpinButton(m_xBuilder->weld_spin_button("colspin")) + , m_xRowSpinButton(m_xBuilder->weld_spin_button("rowspin")) , m_xHeaderCB(m_xBuilder->weld_check_button("headercb")) , m_xRepeatHeaderCB(m_xBuilder->weld_check_button("repeatcb")) , m_xRepeatHeaderNF(m_xBuilder->weld_spin_button("repeatheaderspin")) @@ -89,11 +89,8 @@ SwInsTableDlg::SwInsTableDlg(SwView& rView) m_xNameEdit->connect_insert_text(LINK(this, SwInsTableDlg, TextFilterHdl)); m_xNameEdit->set_text(pShell->GetUniqueTableName()); m_xNameEdit->connect_changed(LINK(this, SwInsTableDlg, ModifyName)); - m_xColNF->connect_value_changed(LINK(this, SwInsTableDlg, ModifyRowCol)); - m_xRowNF->connect_value_changed(LINK(this, SwInsTableDlg, ModifyRowCol)); - - m_xRowNF->set_max(ROW_COL_PROD/m_xColNF->get_value()); - m_xColNF->set_max(ROW_COL_PROD/m_xRowNF->get_value()); + m_xRowSpinButton->connect_changed(LINK(this, SwInsTableDlg, ModifyRowCol)); + m_xColSpinButton->connect_changed(LINK(this, SwInsTableDlg, ModifyRowCol)); m_xInsertBtn->connect_clicked(LINK(this, SwInsTableDlg, OKHdl)); @@ -116,7 +113,7 @@ SwInsTableDlg::SwInsTableDlg(SwView& rView) RepeatHeaderCheckBoxHdl(*m_xRepeatHeaderCB); CheckBoxHdl(*m_xHeaderCB); - sal_Int64 nMax = m_xRowNF->get_value(); + sal_Int64 nMax = m_xRowSpinButton->get_value(); if( nMax <= 1 ) nMax = 1; else @@ -124,6 +121,7 @@ SwInsTableDlg::SwInsTableDlg(SwView& rView) m_xRepeatHeaderNF->set_max( nMax ); InitAutoTableFormat(); + m_xWarning->set_label_type(weld::LabelType::Warning); } void SwInsTableDlg::InitAutoTableFormat() @@ -227,21 +225,44 @@ IMPL_LINK( SwInsTableDlg, ModifyName, weld::Entry&, rEdit, void ) m_xInsertBtn->set_sensitive(pShell->GetTableStyle(sTableName) == nullptr); } -IMPL_LINK( SwInsTableDlg, ModifyRowCol, weld::SpinButton&, rEdit, void ) +// We use weld::Entry's "changed" notification here, not weld::SpinButton's "value_changed", because +// the latter only fires after the control looses focus; so the notification would not fire during +// typing a big number, so that user typing it and immediately clicking "Insert" would not see the +// warning. +// Since the notification is called in weld::Entry context, we can only rely on what's available for +// used weld::Entry's notification; specifically, we have to call spin buttons' get_text() instead +// of get_value(), because the latter is not guaranteed to return an up-to-date value at this point +// (depends on vcl plugin used). +IMPL_LINK( SwInsTableDlg, ModifyRowCol, weld::Entry&, rEdit, void ) { - if(&rEdit == m_xColNF.get()) + sal_Int64 nRow = m_xRowSpinButton->get_text().toInt64(); + sal_Int64 nCol = m_xColSpinButton->get_text().toInt64(); + if (nRow > 255) + { + m_xRowSpinButton->set_message_type(weld::EntryMessageType::Warning); + m_xWarning->set_visible(true); + } + else + { + m_xRowSpinButton->set_message_type(weld::EntryMessageType::Normal); + } + if (nCol > 63) { - sal_Int64 nCol = m_xColNF->get_value(); - if(!nCol) - nCol = 1; - m_xRowNF->set_max(ROW_COL_PROD/nCol); + m_xColSpinButton->set_message_type(weld::EntryMessageType::Warning); + m_xWarning->set_visible(true); } else { - sal_Int64 nRow = m_xRowNF->get_value(); + m_xColSpinButton->set_message_type(weld::EntryMessageType::Normal); + } + if (nRow <= 255 && nCol <= 63) + { + m_xWarning->set_visible(false); + } + if (&rEdit != m_xColSpinButton.get()) + { if(!nRow) nRow = 1; - m_xColNF->set_max(ROW_COL_PROD/nRow); // adjust depending NF for repeated rows sal_Int64 nMax = ( nRow == 1 )? 1 : nRow - 1 ; diff --git a/sw/source/uibase/inc/instable.hxx b/sw/source/uibase/inc/instable.hxx index 05c02af5c2a8..3070dcccbd54 100644 --- a/sw/source/uibase/inc/instable.hxx +++ b/sw/source/uibase/inc/instable.hxx @@ -48,8 +48,9 @@ class SwInsTableDlg : public SfxDialogController AutoFormatPreview m_aWndPreview; std::unique_ptr<weld::Entry> m_xNameEdit; - std::unique_ptr<weld::SpinButton> m_xColNF; - std::unique_ptr<weld::SpinButton> m_xRowNF; + std::unique_ptr<weld::Label> m_xWarning; + std::unique_ptr<weld::SpinButton> m_xColSpinButton; + std::unique_ptr<weld::SpinButton> m_xRowSpinButton; std::unique_ptr<weld::CheckButton> m_xHeaderCB; std::unique_ptr<weld::CheckButton> m_xRepeatHeaderCB; std::unique_ptr<weld::SpinButton> m_xRepeatHeaderNF; @@ -68,7 +69,7 @@ class SwInsTableDlg : public SfxDialogController DECL_LINK(TextFilterHdl, OUString&, bool); DECL_LINK(SelFormatHdl, weld::TreeView&, void); DECL_LINK(ModifyName, weld::Entry&, void); - DECL_LINK(ModifyRowCol, weld::SpinButton&, void); + DECL_LINK(ModifyRowCol, weld::Entry&, void); DECL_LINK(OKHdl, weld::Button&, void); DECL_LINK(CheckBoxHdl, weld::ToggleButton&, void); DECL_LINK(RepeatHeaderCheckBoxHdl, weld::ToggleButton&, void); diff --git a/sw/uiconfig/swriter/ui/inserttable.ui b/sw/uiconfig/swriter/ui/inserttable.ui index d59e4757a6bf..3e5bd06258ea 100644 --- a/sw/uiconfig/swriter/ui/inserttable.ui +++ b/sw/uiconfig/swriter/ui/inserttable.ui @@ -4,14 +4,14 @@ <requires lib="gtk+" version="3.20"/> <object class="GtkAdjustment" id="adjustment1"> <property name="lower">1</property> - <property name="upper">99</property> + <property name="upper">2000000</property> <property name="value">2</property> <property name="step_increment">1</property> <property name="page_increment">10</property> </object> <object class="GtkAdjustment" id="adjustment2"> <property name="lower">1</property> - <property name="upper">99</property> + <property name="upper">2000000</property> <property name="value">2</property> <property name="step_increment">1</property> <property name="page_increment">10</property> @@ -238,7 +238,18 @@ <property name="left_attach">3</property> <property name="top_attach">1</property> </packing> - </child> + </child> + <child> + <object class="GtkLabel" id="lbwarning"> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="inserttable|lbwarning">Warning : Large tables may adversely affect performance and compatibility</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + <property name="width">4</property> + </packing> + </child> </object> </child> </object> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits