# HG changeset patch
# User Neil
# Date 1513656040 -39600
# Node ID 73343682cbda0937c5427ee45ea6c9104d97ac1e
# Parent 5246ca55cf2443dbd6d37bc6dfede6d5f3a14a36
Start of bidirectional code - implement SCI_SETBIDIRECTIONAL.
diff -r 5246ca55cf24 -r 73343682cbda doc/ScintillaDoc.html
--- a/doc/ScintillaDoc.html Wed Jan 10 10:04:03 2018 +1100
+++ b/doc/ScintillaDoc.html Tue Dec 19 15:00:40 2017 +1100
@@ -119,7 +119,7 @@
Scintilla Documentation
- Last edited 11 August 2017 NH
+ Last edited 10 January 2018 NH
There is an overview of the internal design of
Scintilla.
@@ -3594,6 +3594,10 @@
SCI_GETCODEPAGE → int
SCI_SETIMEINTERACTION(int imeInteraction)
SCI_GETIMEINTERACTION → int
+
SCI_GRABFOCUS
SCI_SETFOCUS(bool focus)
SCI_GETFOCUS → bool
@@ -3718,6 +3722,27 @@
and the inline behaviour with SCI_SETIMEINTERACTION(SC_IME_INLINE)
.
Scintilla may ignore this call in some cases. For example, the inline behaviour might only be supported for some languages.
+
+
These bidirectional features are not yet implemented and the API is provisional
+
SCI_SETBIDIRECTIONAL(int bidirectional)
+ SCI_GETBIDIRECTIONAL → int
+ Some languages, like Arabic and Hebrew, are written from right to left instead of from left to right as English is.
+ Documents that use multiple languages may contain both directions and this is termed "bidirectional".
+ The default text direction may be right to left or left to right.
+ Scintilla only correctly displays bidirectional text on some platforms and there can be additional processing and storage
+ costs to this.
+ Currently, bidirectional text only works on Win32 using DirectWrite.
+ As some applications may not want to pay the costs, bidirectional support must be explicitly enabled by calling
+ SCI_SETBIDIRECTIONAL(SC_BIDIRECTIONAL_L2R)
(1) which chooses left to right as the default direction or
+ SCI_SETBIDIRECTIONAL(SC_BIDIRECTIONAL_R2L)
(2) for default right to left.
+ This should be done after setting the technology to SC_TECHNOLOGY_DIRECTWRITE
,
+ SC_TECHNOLOGY_DIRECTWRITERETAIN
, or
+ SC_TECHNOLOGY_DIRECTWRITEDC
.
+
If the call succeeded SCI_GETBIDIRECTIONAL
will return the same value otherwise
+ SC_BIDIRECTIONAL_DISABLED
(0) is returned.
+
+
+
SCI_GRABFOCUS
SCI_SETFOCUS(bool focus)
SCI_GETFOCUS → bool
@@ -8073,8 +8098,6 @@
Provisional features are displayed in this document with a distinctive background colour.
- There are currently no provisional messages or values.
-
Some developers may want to only use features that are stable and have graduated from
provisional status. To avoid using provisional messages compile with the symbol
SCI_DISABLE_PROVISIONAL
defined.
diff -r 5246ca55cf24 -r 73343682cbda include/Scintilla.h
--- a/include/Scintilla.h Wed Jan 10 10:04:03 2018 +1100
+++ b/include/Scintilla.h Tue Dec 19 15:00:40 2017 +1100
@@ -1103,6 +1103,13 @@
#define SCN_AUTOCCOMPLETED 2030
#define SCN_MARGINRIGHTCLICK 2031
#define SCN_AUTOCSELECTIONCHANGE 2032
+#ifndef SCI_DISABLE_PROVISIONAL
+#define SC_BIDIRECTIONAL_DISABLED 0
+#define SC_BIDIRECTIONAL_L2R 1
+#define SC_BIDIRECTIONAL_R2L 2
+#define SCI_GETBIDIRECTIONAL 2708
+#define SCI_SETBIDIRECTIONAL 2709
+#endif
/* --Autogenerated -- end of section automatically generated from Scintilla.iface */
/* These structures are defined to be exactly the same shape as the Win32
diff -r 5246ca55cf24 -r 73343682cbda include/Scintilla.iface
--- a/include/Scintilla.iface Wed Jan 10 10:04:03 2018 +1100
+++ b/include/Scintilla.iface Tue Dec 19 15:00:40 2017 +1100
@@ -4861,10 +4861,19 @@
evt void MarginRightClick=2031(int modifiers, int position, int margin)
evt void AutoCSelectionChange=2032(int listType, string text, int position)
-# There are no provisional APIs currently, but some arguments to SCI_SETTECHNOLOGY are provisional.
-
cat Provisional
+enu Bidirectional=SC_BIDIRECTIONAL_
+val SC_BIDIRECTIONAL_DISABLED=0
+val SC_BIDIRECTIONAL_L2R=1
+val SC_BIDIRECTIONAL_R2L=2
+
+# Retrieve bidirectional text display state.
+get int GetBidirectional=2708(,)
+
+# Set bidirectional text display state.
+set void SetBidirectional=2709(int bidirectional,)
+
cat Deprecated
# Divide each styling byte into lexical class bits (default: 5) and indicator
diff -r 5246ca55cf24 -r 73343682cbda src/EditModel.cxx
--- a/src/EditModel.cxx Wed Jan 10 10:04:03 2018 +1100
+++ b/src/EditModel.cxx Tue Dec 19 15:00:40 2017 +1100
@@ -63,6 +63,7 @@
highlightGuideColumn = 0;
primarySelection = true;
imeInteraction = imeWindowed;
+ bidirectional = Bidirectional::bidiDisabled;
foldFlags = 0;
foldDisplayTextStyle = SC_FOLDDISPLAYTEXT_HIDDEN;
hotspot = Range(Sci::invalidPosition);
diff -r 5246ca55cf24 -r 73343682cbda src/EditModel.h
--- a/src/EditModel.h Wed Jan 10 10:04:03 2018 +1100
+++ b/src/EditModel.h Tue Dec 19 15:00:40 2017 +1100
@@ -38,6 +38,8 @@
enum IMEInteraction { imeWindowed, imeInline } imeInteraction;
+ enum class Bidirectional { bidiDisabled, bidiL2R, bidiR2L } bidirectional;
+
int foldFlags;
int foldDisplayTextStyle;
ContractionState cs;
diff -r 5246ca55cf24 -r 73343682cbda src/Editor.cxx
--- a/src/Editor.cxx Wed Jan 10 10:04:03 2018 +1100
+++ b/src/Editor.cxx Tue Dec 19 15:00:40 2017 +1100
@@ -6736,6 +6736,13 @@
case SCI_GETIMEINTERACTION:
return imeInteraction;
+ case SCI_SETBIDIRECTIONAL:
+ // SCI_SETBIDIRECTIONAL is implemented on platform subclasses if they support bidirectional text.
+ break;
+
+ case SCI_GETBIDIRECTIONAL:
+ return static_cast(bidirectional);
+
// Marker definition and setting
case SCI_MARKERDEFINE:
if (wParam <= MARKER_MAX) {
diff -r 5246ca55cf24 -r 73343682cbda win32/ScintillaWin.cxx
--- a/win32/ScintillaWin.cxx Wed Jan 10 10:04:03 2018 +1100
+++ b/win32/ScintillaWin.cxx Tue Dec 19 15:00:40 2017 +1100
@@ -1744,6 +1744,17 @@
}
break;
+ case SCI_SETBIDIRECTIONAL:
+ if (technology == SC_TECHNOLOGY_DEFAULT) {
+ bidirectional = EditModel::Bidirectional::bidiDisabled;
+ } else if ((wParam >= SC_BIDIRECTIONAL_DISABLED) && (wParam <= SC_BIDIRECTIONAL_R2L)) {
+ bidirectional = static_cast(wParam);
+ }
+ // Invalidate all cached information including layout.
+ DropGraphics(true);
+ InvalidateStyleRedraw();
+ break;
+
#ifdef SCI_LEXER
case SCI_LOADLEXERLIBRARY:
LexerManager::GetInstance()->Load(reinterpret_cast(lParam));