# 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_SETBIDIRECTIONAL(int bidirectional)
+ SCI_GETBIDIRECTIONAL → 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 = 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 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));