summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-12-21 14:15:59 +0000
committerCaolán McNamara <caolanm@redhat.com>2021-12-22 10:12:01 +0100
commit39a57fa8c047227060915534e64c4e90affa4b1a (patch)
treef022a7168e65674f2930b14787e8cabe964162c4 /sw
parenta3bc9dc51104d01ec203b8e2d5767dd055a42b58 (diff)
tdf#144862 explore alternatives to writer's on-screen glyph positioning
writer does glyph position adjusting to try and split the difference of the "printing" positions and "screen" positions. it seems to have been there from the initial import commit 84a3db80b4fd66c6854b3135b5f69b61fd828e62 Date: Mon Sep 18 23:08:29 2000 +0000 initial import we seem to sync with the printing positions after each whitespace so each initial glyph after whitespace is a stable position and is the 'printing' position while each following glyph is in a position which is somewhere between the 'printing' position and 'screen' position. Which leads to noticeably unstable positions of text during editing at various zoom levels and without a clear rationale for the heuristic. GlyphPositioningMode::Classic, the original mode which remains the default. GlyphPositioningMode::PreferLayout, takes the vcl provided print positions and just uses those unmodified for screen layout like editeng does. GlyphPositioningMode::ClassicInspired, which is similar to GlyphPositioningMode::Classic in using 'printing' positions for the start of runs, but using 'screen' positions for run content. GlyphPositioningMode::PreferReadability, replace the 'printing' positions with the screen-optimized positions for all content. use tools, options, writer, view, glyph positioning to change Change-Id: I6677af973268bc586d825c7fbf0b483aaf651ca0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127089 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/viewopt.hxx15
-rw-r--r--sw/source/core/txtnode/fntcache.cxx113
-rw-r--r--sw/source/ui/config/optpage.cxx3
-rw-r--r--sw/source/uibase/config/cfgitems.cxx6
-rw-r--r--sw/source/uibase/config/usrpref.cxx71
-rw-r--r--sw/source/uibase/config/viewopt.cxx3
-rw-r--r--sw/source/uibase/inc/cfgitems.hxx3
-rw-r--r--sw/source/uibase/inc/optpage.hxx1
-rw-r--r--sw/uiconfig/swriter/ui/viewoptionspage.ui70
9 files changed, 195 insertions, 90 deletions
diff --git a/sw/inc/viewopt.hxx b/sw/inc/viewopt.hxx
index e8a1c299b496..6c93602a85ae 100644
--- a/sw/inc/viewopt.hxx
+++ b/sw/inc/viewopt.hxx
@@ -126,6 +126,13 @@ namespace o3tl {
template<> struct typed_flags<ViewOptFlags> : is_typed_flags<ViewOptFlags, 0x01ff> {};
}
+enum class GlyphPositioningMode {
+ Classic,
+ ClassicInspired,
+ PreferLayout,
+ PreferReadability
+};
+
class SW_DLLPUBLIC SwViewOption
{
static Color s_aDocColor; // color of document boundaries
@@ -163,6 +170,7 @@ class SW_DLLPUBLIC SwViewOption
sal_uInt8 m_nPagePreviewRow; // Page Preview Row/Columns.
sal_uInt8 m_nPagePreviewCol; // Page Preview Row/Columns.
SwFillMode m_nShadowCursorFillMode; // FillMode for ShadowCursor.
+ GlyphPositioningMode m_eGlyphPositioningMode; // Positioning strategy for screen glyphs
bool m_bReadonly : 1; // Readonly-Doc.
bool m_bStarOneSetting : 1;// Prevent from UI automatics (no scrollbars in readonly documents).
bool m_bIsPagePreview : 1; // The preview mustn't print field/footnote/... shadings.
@@ -426,6 +434,12 @@ public:
void SetPrinting(bool b)
{ SetCore2Option(b, ViewOptCoreFlags2::Printing); }
+ GlyphPositioningMode GetGlyphPositioningMode() const
+ { return m_eGlyphPositioningMode; }
+
+ void SetGlyphPositioningMode(GlyphPositioningMode eMode)
+ { m_eGlyphPositioningMode = eMode; }
+
void SetCore2Option(bool b, ViewOptCoreFlags2 f)
{
if (b)
@@ -697,6 +711,7 @@ inline void SwViewOption::SetUIOptions( const SwViewOption& rVOpt )
m_nUIOptions = rVOpt.m_nUIOptions;
m_nTableDestination = rVOpt.m_nTableDestination;
m_nShadowCursorFillMode = rVOpt.m_nShadowCursorFillMode;
+ m_eGlyphPositioningMode = rVOpt.m_eGlyphPositioningMode;
}
// Helper function for checking HTML-capabilities.
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index e02b3aa52602..df213b9553e9 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -857,26 +857,64 @@ static void lcl_DrawLineForWrongListData(
namespace
{
- void AdjustKernArray(sal_Int32 i, tools::Long& rScrPos, sal_Unicode cChPrev, sal_Unicode nCh,
+ void AdjustKernArray(GlyphPositioningMode eGlyphPositioningMode, sal_Int32 i, tools::Long& rScrPos,
+ sal_Unicode cChPrev, sal_Unicode nCh,
const std::vector<sal_Int32>& rScrArray, std::vector<sal_Int32>& rKernArray,
int nMul)
{
tools::Long nScr = rScrArray[i] - rScrArray[i - 1];
- if (nCh == CH_BLANK)
- rScrPos = rKernArray[i - 1] + nScr;
- else
+ switch (eGlyphPositioningMode)
{
- if (cChPrev == CH_BLANK || cChPrev == '-')
+ case GlyphPositioningMode::PreferLayout:
rScrPos = rKernArray[i - 1] + nScr;
- else
+ // just accept the print layout positions, this is what editeng does
+ break;
+ case GlyphPositioningMode::PreferReadability:
{
+ // Overwrite KernArray with the screen-optimized glyph positions
+ rKernArray[i - 1] = rScrPos;
rScrPos += nScr;
+ break;
+ }
+ case GlyphPositioningMode::Classic:
+ {
+ if (nCh == CH_BLANK)
+ rScrPos = rKernArray[i - 1] + nScr;
+ else
+ {
+ if (cChPrev == CH_BLANK || cChPrev == '-')
+ rScrPos = rKernArray[i - 1] + nScr;
+ else
+ {
+ rScrPos += nScr;
- const int nDiv = nMul+1;
- rScrPos = (nMul * rScrPos + rKernArray[i]) / nDiv;
+ const int nDiv = nMul+1;
+ rScrPos = (nMul * rScrPos + rKernArray[i]) / nDiv;
+ }
+ }
+ rKernArray[i - 1] = rScrPos - nScr;
+ break;
+ }
+ case GlyphPositioningMode::ClassicInspired:
+ {
+ // use the print layout positions for blanks and the first glyph after a blank or -
+ // and use screen layout within a run of glyphs
+ const bool bSyncWithPrintLayout = nCh == CH_BLANK || cChPrev == CH_BLANK || cChPrev == '-';
+ if (bSyncWithPrintLayout)
+ {
+ // Leave KernArray untouched at its print layout position in this case
+ // sync ScreenPos to print layout position
+ rScrPos = rKernArray[i - 1] + nScr;
+ }
+ else
+ {
+ // Overwrite KernArray within the run to use screen-optimized glyph positions
+ rKernArray[i - 1] = rScrPos;
+ rScrPos += nScr;
+ }
+ break;
}
}
- rKernArray[i - 1] = rScrPos - nScr;
}
}
@@ -1689,6 +1727,8 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
}
else
{
+ GlyphPositioningMode eGlyphPositioningMode = rInf.GetShell()->GetViewOptions()->GetGlyphPositioningMode();
+
// In case of Pair Kerning the printer influence on the positioning
// grows
const int nMul = m_pPrtFont->GetKerning() != FontKerning::NONE ? 1 : 3;
@@ -1712,7 +1752,7 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
for (sal_Int32 i = 1; i < sal_Int32(nCnt); ++i, nKernSum += rInf.GetKern())
{
sal_Unicode nCh = rInf.GetText()[sal_Int32(rInf.GetIdx()) + i];
- AdjustKernArray(i, nScrPos, cChPrev, nCh, aScrArray, aKernArray, nMul);
+ AdjustKernArray(eGlyphPositioningMode, i, nScrPos, cChPrev, nCh, aScrArray, aKernArray, nMul);
// Apply SpaceSum
if (cChPrev == CH_BLANK)
@@ -2012,7 +2052,6 @@ Size SwFntObj::GetTextSize( SwDrawTextInfo& rInf )
CreateScrFont( *rInf.GetShell(), rInf.GetOut() );
if( !GetScrFont()->IsSameInstance( rInf.GetOut().GetFont() ) )
rInf.GetOut().SetFont( *m_pScrFont );
- tools::Long nScrPos;
m_pPrinter->GetTextArray(rInf.GetText(), &aKernArray,
sal_Int32(rInf.GetIdx()), sal_Int32(nLn));
@@ -2024,34 +2063,44 @@ Size SwFntObj::GetTextSize( SwDrawTextInfo& rInf )
rInf.SetKanaDiff( 0 );
if ( rInf.GetKanaDiff() )
- nScrPos = aKernArray[ sal_Int32(nLn) - 1 ];
+ {
+ aTextSize.setWidth(aKernArray[sal_Int32(nLn) - 1]);
+ }
else
{
- std::vector<sal_Int32> aScrArray;
- rInf.GetOut().GetTextArray( rInf.GetText(), &aScrArray,
- sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
- nScrPos = aScrArray[ 0 ];
- TextFrameIndex nCnt(rInf.GetText().getLength());
- if ( nCnt < rInf.GetIdx() )
- nCnt = TextFrameIndex(0); // assert???
+ GlyphPositioningMode eGlyphPositioningMode = rInf.GetShell()->GetViewOptions()->GetGlyphPositioningMode();
+ if (eGlyphPositioningMode == GlyphPositioningMode::PreferLayout)
+ {
+ aTextSize.setWidth(aKernArray[sal_Int32(nLn) - 1]);
+ }
else
- nCnt = nCnt - rInf.GetIdx();
- nCnt = std::min(nCnt, nLn);
- sal_Unicode nChPrev = rInf.GetText()[ sal_Int32(rInf.GetIdx()) ];
+ {
+ std::vector<sal_Int32> aScrArray;
+ rInf.GetOut().GetTextArray( rInf.GetText(), &aScrArray,
+ sal_Int32(rInf.GetIdx()), sal_Int32(rInf.GetLen()));
+ tools::Long nScrPos = aScrArray[ 0 ];
+ TextFrameIndex nCnt(rInf.GetText().getLength());
+ if ( nCnt < rInf.GetIdx() )
+ nCnt = TextFrameIndex(0); // assert???
+ else
+ nCnt = nCnt - rInf.GetIdx();
+ nCnt = std::min(nCnt, nLn);
+ sal_Unicode nChPrev = rInf.GetText()[ sal_Int32(rInf.GetIdx()) ];
- // In case of Pair Kerning the printer influence on the positioning
- // grows
- const int nMul = m_pPrtFont->GetKerning() != FontKerning::NONE ? 1 : 3;
+ // In case of Pair Kerning the printer influence on the positioning
+ // grows
+ const int nMul = m_pPrtFont->GetKerning() != FontKerning::NONE ? 1 : 3;
- for (sal_Int32 i = 1; i < sal_Int32(nCnt); i++)
- {
- sal_Unicode nCh = rInf.GetText()[sal_Int32(rInf.GetIdx()) + i];
- AdjustKernArray(i, nScrPos, nChPrev, nCh, aScrArray, aKernArray, nMul);
- nChPrev = nCh;
+ for (sal_Int32 i = 1; i < sal_Int32(nCnt); i++)
+ {
+ sal_Unicode nCh = rInf.GetText()[sal_Int32(rInf.GetIdx()) + i];
+ AdjustKernArray(eGlyphPositioningMode, i, nScrPos, nChPrev, nCh, aScrArray, aKernArray, nMul);
+ nChPrev = nCh;
+ }
+
+ aTextSize.setWidth( nScrPos );
}
}
-
- aTextSize.setWidth( nScrPos );
}
else
{
diff --git a/sw/source/ui/config/optpage.cxx b/sw/source/ui/config/optpage.cxx
index 30a3c4cac6e4..6cfe9b99d1c6 100644
--- a/sw/source/ui/config/optpage.cxx
+++ b/sw/source/ui/config/optpage.cxx
@@ -91,6 +91,7 @@ SwContentOptPage::SwContentOptPage(weld::Container* pPage, weld::DialogControlle
, m_xVRulerRightCBox(m_xBuilder->weld_check_button("vrulerright"))
, m_xVMetric(m_xBuilder->weld_combo_box("vrulercombobox"))
, m_xSmoothCBox(m_xBuilder->weld_check_button("smoothscroll"))
+ , m_xGlyphPosModeLB(m_xBuilder->weld_combo_box("glyphposmode"))
, m_xGrfCB(m_xBuilder->weld_check_button("graphics"))
, m_xTableCB(m_xBuilder->weld_check_button("tables"))
, m_xDrwCB(m_xBuilder->weld_check_button("drawings"))
@@ -219,6 +220,7 @@ void SwContentOptPage::Reset(const SfxItemSet* rSet)
m_xShowChangesInMargin->set_active(pElemAttr->m_bShowChangesInMargin);
m_xFieldHiddenCB->set_active( pElemAttr->m_bFieldHiddenText );
m_xFieldHiddenParaCB->set_active( pElemAttr->m_bShowHiddenPara );
+ m_xGlyphPosModeLB->set_active(static_cast<int>(pElemAttr->m_eGlyphPositioningMode));
}
m_xMetricLB->set_active(-1);
lcl_SelectMetricLB(*m_xMetricLB, SID_ATTR_METRIC, *rSet);
@@ -246,6 +248,7 @@ bool SwContentOptPage::FillItemSet(SfxItemSet* rSet)
aElem.m_bShowChangesInMargin = m_xShowChangesInMargin->get_active();
aElem.m_bFieldHiddenText = m_xFieldHiddenCB->get_active();
aElem.m_bShowHiddenPara = m_xFieldHiddenParaCB->get_active();
+ aElem.m_eGlyphPositioningMode = static_cast<GlyphPositioningMode>(m_xGlyphPosModeLB->get_active());
bool bRet = !pOldAttr || aElem != *pOldAttr;
if(bRet)
diff --git a/sw/source/uibase/config/cfgitems.cxx b/sw/source/uibase/config/cfgitems.cxx
index e32c86e14c52..39f4d43d63bf 100644
--- a/sw/source/uibase/config/cfgitems.cxx
+++ b/sw/source/uibase/config/cfgitems.cxx
@@ -104,6 +104,7 @@ SwElemItem::SwElemItem() :
m_bShowChangesInMargin =
m_bFieldHiddenText =
m_bShowHiddenPara = false;
+ m_eGlyphPositioningMode = GlyphPositioningMode::Classic;
}
SwElemItem::SwElemItem(const SwViewOption& rVOpt) :
@@ -123,6 +124,7 @@ SwElemItem::SwElemItem(const SwViewOption& rVOpt) :
m_bShowChangesInMargin = rVOpt.IsShowChangesInMargin();
m_bFieldHiddenText = rVOpt.IsShowHiddenField();
m_bShowHiddenPara = rVOpt.IsShowHiddenPara();
+ m_eGlyphPositioningMode = rVOpt.GetGlyphPositioningMode();
}
SwElemItem* SwElemItem::Clone( SfxItemPool* ) const
@@ -149,7 +151,8 @@ bool SwElemItem::operator==( const SfxPoolItem& rAttr ) const
m_bTreatSubOutlineLevelsAsContent == rItem.m_bTreatSubOutlineLevelsAsContent &&
m_bShowChangesInMargin == rItem.m_bShowChangesInMargin &&
m_bFieldHiddenText == rItem.m_bFieldHiddenText &&
- m_bShowHiddenPara == rItem.m_bShowHiddenPara);
+ m_bShowHiddenPara == rItem.m_bShowHiddenPara &&
+ m_eGlyphPositioningMode == rItem.m_eGlyphPositioningMode);
}
void SwElemItem::FillViewOptions( SwViewOption& rVOpt) const
@@ -169,6 +172,7 @@ void SwElemItem::FillViewOptions( SwViewOption& rVOpt) const
rVOpt.SetShowChangesInMargin( m_bShowChangesInMargin );
rVOpt.SetShowHiddenField(m_bFieldHiddenText );
rVOpt.SetShowHiddenPara(m_bShowHiddenPara );
+ rVOpt.SetGlyphPositioningMode(m_eGlyphPositioningMode);
}
// CTOR for empty Item
diff --git a/sw/source/uibase/config/usrpref.cxx b/sw/source/uibase/config/usrpref.cxx
index 0c759a78cf94..e0949660471d 100644
--- a/sw/source/uibase/config/usrpref.cxx
+++ b/sw/source/uibase/config/usrpref.cxx
@@ -259,20 +259,21 @@ Sequence<OUString> SwLayoutViewConfig::GetPropertyNames() const
"Window/HorizontalRulerUnit", // 6
"Window/VerticalRulerUnit", // 7
"Window/SmoothScroll", // 8
- "Zoom/Value", // 9
- "Zoom/Type", //10
- "Other/IsAlignMathObjectsToBaseline", //11
- "Other/MeasureUnit", //12
+ "Window/GlyphPositioningMode", // 9
+ "Zoom/Value", //10
+ "Zoom/Type", //11
+ "Other/IsAlignMathObjectsToBaseline", //12
+ "Other/MeasureUnit", //13
// below properties are not available in WriterWeb
- "Other/TabStop", //13
- "Window/IsVerticalRulerRight", //14
- "ViewLayout/Columns", //15
- "ViewLayout/BookMode", //16
- "Other/IsSquaredPageMode", //17
- "Other/ApplyCharUnit", //18
- "Window/ShowScrollBarTips" //19
+ "Other/TabStop", //14
+ "Window/IsVerticalRulerRight", //15
+ "ViewLayout/Columns", //16
+ "ViewLayout/BookMode", //17
+ "Other/IsSquaredPageMode", //18
+ "Other/ApplyCharUnit", //19
+ "Window/ShowScrollBarTips" //20
};
- const int nCount = m_bWeb ? 13 : 20;
+ const int nCount = m_bWeb ? 14 : 21;
Sequence<OUString> aNames(nCount);
OUString* pNames = aNames.getArray();
for(int i = 0; i < nCount; i++)
@@ -323,17 +324,18 @@ void SwLayoutViewConfig::ImplCommit()
rVal <<= static_cast<sal_Int32>(m_rParent.m_eVScrollMetric); // "Window/VerticalRulerUnit"
break;
case 8: rVal <<= m_rParent.IsSmoothScroll(); break; // "Window/SmoothScroll",
- case 9: rVal <<= static_cast<sal_Int32>(m_rParent.GetZoom()); break; // "Zoom/Value",
- case 10: rVal <<= static_cast<sal_Int32>(m_rParent.GetZoomType()); break; // "Zoom/Type",
- case 11: rVal <<= m_rParent.IsAlignMathObjectsToBaseline(); break; // "Other/IsAlignMathObjectsToBaseline"
- case 12: rVal <<= static_cast<sal_Int32>(m_rParent.GetMetric()); break; // "Other/MeasureUnit",
- case 13: rVal <<= m_rParent.GetDefTabInMm100(); break;// "Other/TabStop",
- case 14: rVal <<= m_rParent.IsVRulerRight(); break; // "Window/IsVerticalRulerRight",
- case 15: rVal <<= static_cast<sal_Int32>(m_rParent.GetViewLayoutColumns()); break; // "ViewLayout/Columns",
- case 16: rVal <<= m_rParent.IsViewLayoutBookMode(); break; // "ViewLayout/BookMode",
- case 17: rVal <<= m_rParent.IsSquaredPageMode(); break; // "Other/IsSquaredPageMode",
- case 18: rVal <<= m_rParent.IsApplyCharUnit(); break; // "Other/ApplyCharUnit",
- case 19: rVal <<= m_rParent.IsShowScrollBarTips(); break; // "Window/ShowScrollBarTips",
+ case 9: rVal <<= static_cast<sal_Int32>(m_rParent.GetGlyphPositioningMode()); break; // "Window/GlyphPositioningMode",
+ case 10: rVal <<= static_cast<sal_Int32>(m_rParent.GetZoom()); break; // "Zoom/Value",
+ case 11: rVal <<= static_cast<sal_Int32>(m_rParent.GetZoomType()); break; // "Zoom/Type",
+ case 12: rVal <<= m_rParent.IsAlignMathObjectsToBaseline(); break; // "Other/IsAlignMathObjectsToBaseline"
+ case 13: rVal <<= static_cast<sal_Int32>(m_rParent.GetMetric()); break; // "Other/MeasureUnit",
+ case 14: rVal <<= m_rParent.GetDefTabInMm100(); break;// "Other/TabStop",
+ case 15: rVal <<= m_rParent.IsVRulerRight(); break; // "Window/IsVerticalRulerRight",
+ case 16: rVal <<= static_cast<sal_Int32>(m_rParent.GetViewLayoutColumns()); break; // "ViewLayout/Columns",
+ case 17: rVal <<= m_rParent.IsViewLayoutBookMode(); break; // "ViewLayout/BookMode",
+ case 18: rVal <<= m_rParent.IsSquaredPageMode(); break; // "Other/IsSquaredPageMode",
+ case 19: rVal <<= m_rParent.IsApplyCharUnit(); break; // "Other/ApplyCharUnit",
+ case 20: rVal <<= m_rParent.IsShowScrollBarTips(); break; // "Window/ShowScrollBarTips",
}
}
PutProperties(aNames, aValues);
@@ -378,17 +380,18 @@ void SwLayoutViewConfig::Load()
}
break;
case 8: m_rParent.SetSmoothScroll(bSet); break;// "Window/SmoothScroll",
- case 9: m_rParent.SetZoom( static_cast< sal_uInt16 >(nInt32Val) ); break;// "Zoom/Value",
- case 10: m_rParent.SetZoomType( static_cast< SvxZoomType >(nInt32Val) ); break;// "Zoom/Type",
- case 11: m_rParent.SetAlignMathObjectsToBaseline(bSet, true); break;// "Other/IsAlignMathObjectsToBaseline"
- case 12: m_rParent.SetMetric(static_cast<FieldUnit>(nInt32Val), true); break;// "Other/MeasureUnit",
- case 13: m_rParent.SetDefTabInMm100(nInt32Val, true); break;// "Other/TabStop",
- case 14: m_rParent.SetVRulerRight(bSet); break;// "Window/IsVerticalRulerRight",
- case 15: m_rParent.SetViewLayoutColumns( o3tl::narrowing<sal_uInt16>(nInt32Val) ); break;// "ViewLayout/Columns",
- case 16: m_rParent.SetViewLayoutBookMode(bSet); break;// "ViewLayout/BookMode",
- case 17: m_rParent.SetDefaultPageMode(bSet,true); break;// "Other/IsSquaredPageMode",
- case 18: m_rParent.SetApplyCharUnit(bSet, true); break;// "Other/ApplyUserChar"
- case 19: m_rParent.SetShowScrollBarTips(bSet); break;// "Window/ShowScrollBarTips",
+ case 9: m_rParent.SetGlyphPositioningMode(static_cast<GlyphPositioningMode>(nInt32Val)); break;// "Window/GlyphPositioningMode",
+ case 10: m_rParent.SetZoom( static_cast< sal_uInt16 >(nInt32Val) ); break;// "Zoom/Value",
+ case 11: m_rParent.SetZoomType( static_cast< SvxZoomType >(nInt32Val) ); break;// "Zoom/Type",
+ case 12: m_rParent.SetAlignMathObjectsToBaseline(bSet, true); break;// "Other/IsAlignMathObjectsToBaseline"
+ case 13: m_rParent.SetMetric(static_cast<FieldUnit>(nInt32Val), true); break;// "Other/MeasureUnit",
+ case 14: m_rParent.SetDefTabInMm100(nInt32Val, true); break;// "Other/TabStop",
+ case 15: m_rParent.SetVRulerRight(bSet); break;// "Window/IsVerticalRulerRight",
+ case 16: m_rParent.SetViewLayoutColumns( o3tl::narrowing<sal_uInt16>(nInt32Val) ); break;// "ViewLayout/Columns",
+ case 17: m_rParent.SetViewLayoutBookMode(bSet); break;// "ViewLayout/BookMode",
+ case 18: m_rParent.SetDefaultPageMode(bSet,true); break;// "Other/IsSquaredPageMode",
+ case 19: m_rParent.SetApplyCharUnit(bSet, true); break;// "Other/ApplyUserChar"
+ case 20: m_rParent.SetShowScrollBarTips(bSet); break;// "Window/ShowScrollBarTips",
}
}
}
diff --git a/sw/source/uibase/config/viewopt.cxx b/sw/source/uibase/config/viewopt.cxx
index 66ea4daa05f4..12a7336f62ad 100644
--- a/sw/source/uibase/config/viewopt.cxx
+++ b/sw/source/uibase/config/viewopt.cxx
@@ -166,6 +166,7 @@ SwViewOption::SwViewOption() :
m_nPagePreviewRow( 1 ),
m_nPagePreviewCol( 2 ),
m_nShadowCursorFillMode( SwFillMode::Tab ),
+ m_eGlyphPositioningMode( GlyphPositioningMode::Classic ),
m_bReadonly(false),
m_bStarOneSetting(false),
m_bIsPagePreview(false),
@@ -253,6 +254,7 @@ SwViewOption::SwViewOption(const SwViewOption& rVOpt)
m_aRetouchColor = rVOpt.GetRetoucheColor();
m_sSymbolFont = rVOpt.m_sSymbolFont;
m_nShadowCursorFillMode = rVOpt.m_nShadowCursorFillMode;
+ m_eGlyphPositioningMode = rVOpt.m_eGlyphPositioningMode;
m_bStarOneSetting = rVOpt.m_bStarOneSetting;
mbBookView = rVOpt.mbBookView;
mbBrowseMode = rVOpt.mbBrowseMode;
@@ -295,6 +297,7 @@ SwViewOption& SwViewOption::operator=( const SwViewOption &rVOpt )
m_aRetouchColor = rVOpt.GetRetoucheColor();
m_sSymbolFont = rVOpt.m_sSymbolFont;
m_nShadowCursorFillMode = rVOpt.m_nShadowCursorFillMode;
+ m_eGlyphPositioningMode = rVOpt.m_eGlyphPositioningMode;
m_bStarOneSetting = rVOpt.m_bStarOneSetting;
mbBookView = rVOpt.mbBookView;
mbBrowseMode = rVOpt.mbBrowseMode;
diff --git a/sw/source/uibase/inc/cfgitems.hxx b/sw/source/uibase/inc/cfgitems.hxx
index 34ffa2d24e12..18ffc5c9b40b 100644
--- a/sw/source/uibase/inc/cfgitems.hxx
+++ b/sw/source/uibase/inc/cfgitems.hxx
@@ -35,6 +35,7 @@ class SwViewShell;
class SwViewOption;
class SwContentOptPage;
class SwShdwCursorOptionsTabPage;
+enum class GlyphPositioningMode;
enum class SwFillMode;
/// Item for settings dialog - document view
@@ -84,6 +85,8 @@ class SW_DLLPUBLIC SwElemItem final : public SfxPoolItem
bool m_bFieldHiddenText :1;
bool m_bShowHiddenPara :1;
+ GlyphPositioningMode m_eGlyphPositioningMode;
+
friend class SwContentOptPage;
public:
diff --git a/sw/source/uibase/inc/optpage.hxx b/sw/source/uibase/inc/optpage.hxx
index 99e24ed7f487..e7a6fe34b1fb 100644
--- a/sw/source/uibase/inc/optpage.hxx
+++ b/sw/source/uibase/inc/optpage.hxx
@@ -42,6 +42,7 @@ class SwContentOptPage final : public SfxTabPage
std::unique_ptr<weld::CheckButton> m_xVRulerRightCBox;
std::unique_ptr<weld::ComboBox> m_xVMetric;
std::unique_ptr<weld::CheckButton> m_xSmoothCBox;
+ std::unique_ptr<weld::ComboBox> m_xGlyphPosModeLB;
std::unique_ptr<weld::CheckButton> m_xGrfCB;
std::unique_ptr<weld::CheckButton> m_xTableCB;
diff --git a/sw/uiconfig/swriter/ui/viewoptionspage.ui b/sw/uiconfig/swriter/ui/viewoptionspage.ui
index 69dd85ed86ab..d8ca6ed7495c 100644
--- a/sw/uiconfig/swriter/ui/viewoptionspage.ui
+++ b/sw/uiconfig/swriter/ui/viewoptionspage.ui
@@ -357,7 +357,7 @@
<property name="label-xalign">0</property>
<property name="shadow-type">none</property>
<child>
- <!-- n-columns=1 n-rows=2 -->
+ <!-- n-columns=1 n-rows=3 -->
<object class="GtkGrid" id="grid4">
<property name="visible">True</property>
<property name="can-focus">False</property>
@@ -488,6 +488,50 @@
<property name="top-attach">0</property>
</packing>
</child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="glyphposlabel">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes" context="viewoptionspage|glyphposlabel">Glyph positioning:</property>
+ <property name="use-underline">True</property>
+ <property name="mnemonic-widget">glyphposmode</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="glyphposmode">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="active">0</property>
+ <items>
+ <item translatable="yes" context="viewoptionspage|glyphposmode">Classic</item>
+ <item translatable="yes" context="viewoptionspage|glyphposmode">ClassicInspired</item>
+ <item translatable="yes" context="viewoptionspage|glyphposmode">Layout</item>
+ <item translatable="yes" context="viewoptionspage|glyphposmode">Readability</item>
+ </items>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
+ </child>
</object>
</child>
<child type="label">
@@ -574,7 +618,7 @@
<property name="label-xalign">0</property>
<property name="shadow-type">none</property>
<child>
- <!-- n-columns=3 n-rows=3 -->
+ <!-- n-columns=1 n-rows=2 -->
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can-focus">False</property>
@@ -621,27 +665,6 @@
<property name="top-attach">1</property>
</packing>
</child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
</object>
</child>
<child type="label">
@@ -684,6 +707,7 @@
<widgets>
<widget name="vruler"/>
<widget name="hruler"/>
+ <widget name="glyphposlabel"/>
<widget name="measureunitlabel"/>
</widgets>
</object>