tdf#150100 sc import and UI: fix double cell border dialog
Hide "Hairline (0.05pt)", "Very thin (0.5pt)" and "Thin (0.75pt)"
predefined border types for Double cell borders, because it has a
minimum thickness 1.1pt, which means, we cannot allow to select them.
Also setting the Medium (1.5pt) predefined thickness to the border
width for Double borders as the thinnest possible predefined value.
TODO: tdf#146466: Inconsistent choices of borders between toolbar and sidebar
Change-Id: I46ccb206835a34a6dfaa39e63e614bb01bc6b02e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137441
Tested-by: Jenkins
Reviewed-by: Balazs Varga <balazs.varga.extern@allotropia.de>
(cherry picked from commit fe2d59a0730e60c0196baa46af12440afd343878)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137531
Reviewed-by: Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>
Tested-by: Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>
diff --git a/cui/source/inc/border.hxx b/cui/source/inc/border.hxx
index 2a3d14e..586b05f 100644
--- a/cui/source/inc/border.hxx
+++ b/cui/source/inc/border.hxx
@@ -178,7 +178,7 @@ private:
void FillPresetVS();
void FillShadowVS();
void FillValueSets();
void SetLineWidth(sal_Int64 nWidth);
void SetLineWidth(sal_Int64 nWidth, sal_Int32 nRemovedType = 0);
// Filler
void FillLineListBox_Impl();
diff --git a/cui/source/tabpages/border.cxx b/cui/source/tabpages/border.cxx
index 683dd77..38099a4 100644
--- a/cui/source/tabpages/border.cxx
+++ b/cui/source/tabpages/border.cxx
@@ -1242,8 +1242,12 @@ IMPL_LINK(SvxBorderTabPage, SelColHdl_Impl, ColorListBox&, rColorBox, void)
IMPL_LINK_NOARG(SvxBorderTabPage, ModifyWidthLBHdl_Impl, weld::ComboBox&, void)
{
sal_Int32 nPos = m_xLineWidthLB->get_active();
sal_Int32 nRemovedType = 0;
if (m_xLineWidthLB->get_values_changed_from_saved()) {
nRemovedType = m_aLineWidths.size() - m_xLineWidthLB->get_count();
}
SetLineWidth(m_aLineWidths[nPos]);
SetLineWidth(m_aLineWidths[nPos + nRemovedType], nRemovedType);
// Call the spinner handler to trigger all related modifications
ModifyWidthMFHdl_Impl(*m_xLineWidthMF);
@@ -1252,6 +1256,13 @@ IMPL_LINK_NOARG(SvxBorderTabPage, ModifyWidthLBHdl_Impl, weld::ComboBox&, void)
IMPL_LINK_NOARG(SvxBorderTabPage, ModifyWidthMFHdl_Impl, weld::MetricSpinButton&, void)
{
sal_Int64 nVal = m_xLineWidthMF->get_value(FieldUnit::NONE);
// for DOUBLE_THIN line style we cannot allow thinner line width then 1.10pt
if (m_xLbLineStyle->GetSelectEntryStyle() == SvxBorderLineStyle::DOUBLE_THIN)
m_xLineWidthMF->set_min(110, FieldUnit::NONE);
else
m_xLineWidthMF->set_min(5, FieldUnit::NONE);
nVal = static_cast<sal_Int64>(vcl::ConvertDoubleValue(
nVal,
m_xLineWidthMF->get_digits(),
@@ -1265,6 +1276,13 @@ IMPL_LINK_NOARG(SvxBorderTabPage, ModifyWidthMFHdl_Impl, weld::MetricSpinButton&
IMPL_LINK_NOARG(SvxBorderTabPage, SelStyleHdl_Impl, SvtLineListBox&, void)
{
sal_Int64 nOldWidth = m_xLineWidthMF->get_value(FieldUnit::NONE);
// for DOUBLE_THIN line style we cannot allow thinner line width then 1.10pt
if (m_xLbLineStyle->GetSelectEntryStyle() == SvxBorderLineStyle::DOUBLE_THIN)
m_xLineWidthMF->set_min(110, FieldUnit::NONE);
else
m_xLineWidthMF->set_min(5, FieldUnit::NONE);
nOldWidth = static_cast<sal_Int64>(vcl::ConvertDoubleValue(
nOldWidth,
m_xLineWidthMF->get_digits(),
@@ -1276,7 +1294,14 @@ IMPL_LINK_NOARG(SvxBorderTabPage, SelStyleHdl_Impl, SvtLineListBox&, void)
// auto change line-width if it doesn't correspond to minimal value
// let's change only in case when user has not changed the line-width into some custom value
const sal_Int64 nNewWidth = (nOldMinWidth == nOldWidth)? nNewMinWidth : nOldWidth;
sal_Int64 nNewWidth = (nOldMinWidth == nOldWidth) ? nNewMinWidth : nOldWidth;
// if we had selected a predefined border width under SvxBorderLineWidth::Medium set the Medium as default
// otherwise if we had a cusom border width under 1.10pt then set the spinner to the maximum allowed value for double border styles
bool bNewDoubleHairline = m_xLbLineStyle->GetSelectEntryStyle() == SvxBorderLineStyle::DOUBLE_THIN && !m_xLineWidthMF->get_visible() &&
(nOldWidth == SvxBorderLineWidth::Hairline || nOldWidth == SvxBorderLineWidth::VeryThin || nOldWidth == SvxBorderLineWidth::Thin);
if (bNewDoubleHairline && nNewWidth < SvxBorderLineWidth::Medium)
nNewWidth = SvxBorderLineWidth::Medium;
// set value inside edit box
if (nOldWidth != nNewWidth)
@@ -1289,6 +1314,26 @@ IMPL_LINK_NOARG(SvxBorderTabPage, SelStyleHdl_Impl, SvtLineListBox&, void)
SetLineWidth(nNewWidthPt);
}
if (m_xLbLineStyle->GetSelectEntryStyle() == SvxBorderLineStyle::DOUBLE_THIN)
{
for (size_t i = 0; i < 3; i++)
{
m_xLineWidthLB->save_values_by_id(OUString::number(i));
m_xLineWidthLB->remove_id(OUString::number(i));
}
if (m_xLineWidthLB->get_active_id().isEmpty())
m_xLineWidthLB->set_active_id("3");
}
else
{
if (m_xLineWidthLB->get_values_changed_from_saved())
{
for (size_t i = 0; i < 3; i++)
m_xLineWidthLB->append(i, OUString::number(i), m_xLineWidthLB->get_saved_values(i));
m_xLineWidthLB->removeSavedValues();
}
}
// set value inside style box
m_aFrameSel.SetStyleToSelection( nNewWidth,
m_xLbLineStyle->GetSelectEntryStyle() );
@@ -1413,7 +1458,7 @@ void SvxBorderTabPage::FillValueSets()
FillShadowVS();
}
void SvxBorderTabPage::SetLineWidth( sal_Int64 nWidth )
void SvxBorderTabPage::SetLineWidth( sal_Int64 nWidth, sal_Int32 nRemovedType )
{
if ( nWidth >= 0 )
m_xLineWidthMF->set_value( nWidth, FieldUnit::POINT );
@@ -1425,12 +1470,12 @@ void SvxBorderTabPage::SetLineWidth( sal_Int64 nWidth )
{
// Select predefined value in combobox
m_xLineWidthMF->hide();
m_xLineWidthLB->set_active(std::distance(m_aLineWidths.begin(), it));
m_xLineWidthLB->set_active(std::distance(m_aLineWidths.begin(), it) - nRemovedType);
}
else
{
// This is not one of predefined values. Show spinner
m_xLineWidthLB->set_active(m_aLineWidths.size()-1);
m_xLineWidthLB->set_active(m_aLineWidths.size() - nRemovedType -1);
m_xLineWidthMF->show();
}
}
diff --git a/cui/uiconfig/ui/borderpage.ui b/cui/uiconfig/ui/borderpage.ui
index 58d86f0..af57dbcb 100644
--- a/cui/uiconfig/ui/borderpage.ui
+++ b/cui/uiconfig/ui/borderpage.ui
@@ -280,13 +280,13 @@
<property name="can-focus">False</property>
<property name="hexpand">False</property>
<items>
<item translatable="yes" context="borderpage|linewidthlb">Hairline (0.05pt)</item>
<item translatable="yes" context="borderpage|linewidthlb">Very thin (0.5pt)</item>
<item translatable="yes" context="borderpage|linewidthlb">Thin (0.75pt)</item>
<item translatable="yes" context="borderpage|linewidthlb">Medium (1.5pt)</item>
<item translatable="yes" context="borderpage|linewidthlb">Thick (2.25pt)</item>
<item translatable="yes" context="borderpage|linewidthlb">Extra thick (4.5pt)</item>
<item translatable="yes" context="borderpage|linewidthlb">Custom</item>
<item id="0" translatable="yes" context="borderpage|linewidthlb">Hairline (0.05pt)</item>
<item id="1" translatable="yes" context="borderpage|linewidthlb">Very thin (0.5pt)</item>
<item id="2" translatable="yes" context="borderpage|linewidthlb">Thin (0.75pt)</item>
<item id="3" translatable="yes" context="borderpage|linewidthlb">Medium (1.5pt)</item>
<item id="4" translatable="yes" context="borderpage|linewidthlb">Thick (2.25pt)</item>
<item id="5" translatable="yes" context="borderpage|linewidthlb">Extra thick (4.5pt)</item>
<item id="6" translatable="yes" context="borderpage|linewidthlb">Custom</item>
</items>
<accessibility>
<relation type="labelled-by" target="label16"/>
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 83e6800..bf19525 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -695,6 +695,7 @@ class VCL_DLLPUBLIC ComboBox : virtual public Widget
{
private:
OUString m_sSavedValue;
std::vector<OUString> m_aSavedValues;
public:
// OUString is the id of the row, it may be null to measure the height of a generic line
@@ -746,6 +747,10 @@ public:
{
insert(-1, rStr, &rId, nullptr, &rImage);
}
void append(int pos, const OUString& rId, const OUString& rStr)
{
insert(pos, rStr, &rId, nullptr, nullptr);
}
virtual void insert_separator(int pos, const OUString& rId) = 0;
void append_separator(const OUString& rId) { insert_separator(-1, rId); }
@@ -822,8 +827,23 @@ public:
void connect_entry_activate(const Link<ComboBox&, bool>& rLink) { m_aEntryActivateHdl = rLink; }
void save_value() { m_sSavedValue = get_active_text(); }
void save_values_by_id(const OUString& rId)
{
m_aSavedValues.push_back(get_text(find_id(rId)));
}
OUString const& get_saved_value() const { return m_sSavedValue; }
OUString const& get_saved_values(int pos) const { return m_aSavedValues[pos]; }
bool get_value_changed_from_saved() const { return m_sSavedValue != get_active_text(); }
bool get_values_changed_from_saved() const
{
return !m_aSavedValues.empty()
&& std::find(m_aSavedValues.begin(), m_aSavedValues.end(), get_active_text())
== m_aSavedValues.end();
}
void removeSavedValues() { m_aSavedValues.clear(); }
// for custom rendering a row
void connect_custom_get_size(const Link<vcl::RenderContext&, Size>& rLink)
diff --git a/sc/qa/uitest/calc_tests/formatCells.py b/sc/qa/uitest/calc_tests/formatCells.py
index e258721..7397a9b 100644
--- a/sc/qa/uitest/calc_tests/formatCells.py
+++ b/sc/qa/uitest/calc_tests/formatCells.py
@@ -270,24 +270,25 @@ class formatCell(UITestCase):
# set line style to "double" (minimal width is taken)
xLineSet.executeAction("CHOOSE", mkPropertyValues({"POS": '16'}))
widthVal = get_state_as_dict(linewidthmf)["Text"]
self.assertEqual(widthVal, '0.75 pt')
# minimim predefined width is Medium (1.50 pt)
self.assertEqual(widthVal, '1.50 pt')
# set line style to "solid"
xLineSet.executeAction("CHOOSE", mkPropertyValues({"POS": "1"}))
widthVal = get_state_as_dict(linewidthmf)["Text"]
self.assertEqual(widthVal, '0.75 pt')
self.assertEqual(widthVal, '1.50 pt')
# make custom line width
linewidthmf.executeAction("UP", tuple())
linewidthmf.executeAction("UP", tuple())
linewidthmf.executeAction("UP", tuple())
widthVal = get_state_as_dict(linewidthmf)["Text"]
self.assertEqual(widthVal, '1.50 pt')
self.assertEqual(widthVal, '2.25 pt')
# set line style to "double" (minimal width is not taken)
xLineSet.executeAction("CHOOSE", mkPropertyValues({"POS": "8"}))
widthVal = get_state_as_dict(linewidthmf)["Text"]
self.assertEqual(widthVal, '1.50 pt')
self.assertEqual(widthVal, '2.25 pt')