diff options
author | Neil <nyamatongwe@gmail.com> | 2017-12-19 15:00:40 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2017-12-19 15:00:40 +1100 |
commit | 01c48f98e5557089fc7501394f905a5b15fde9c0 (patch) | |
tree | d1508bcbcf021f45ec37a14ed7c238b3e98ce58a | |
parent | 13e07ac896114885b16ca0a48fa0751579ba681e (diff) | |
download | scintilla-mirror-01c48f98e5557089fc7501394f905a5b15fde9c0.tar.gz |
Start of bidirectional code - implement SCI_SETBIDIRECTIONAL.
-rw-r--r-- | doc/ScintillaDoc.html | 29 | ||||
-rw-r--r-- | include/Scintilla.h | 7 | ||||
-rw-r--r-- | include/Scintilla.iface | 13 | ||||
-rw-r--r-- | src/EditModel.cxx | 1 | ||||
-rw-r--r-- | src/EditModel.h | 2 | ||||
-rw-r--r-- | src/Editor.cxx | 7 | ||||
-rw-r--r-- | win32/ScintillaWin.cxx | 11 |
7 files changed, 65 insertions, 5 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index 90c5745e2..1e71bafbd 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -119,7 +119,7 @@ <h1>Scintilla Documentation</h1> - <p>Last edited 11 August 2017 NH</p> + <p>Last edited 10 January 2018 NH</p> <p>There is <a class="jump" href="Design.html">an overview of the internal design of Scintilla</a>.<br /> @@ -3594,6 +3594,10 @@ struct Sci_TextToFind { <a class="message" href="#SCI_GETCODEPAGE">SCI_GETCODEPAGE → int</a><br /> <a class="message" href="#SCI_SETIMEINTERACTION">SCI_SETIMEINTERACTION(int imeInteraction)</a><br /> <a class="message" href="#SCI_GETIMEINTERACTION">SCI_GETIMEINTERACTION → int</a><br /> +<div class="provisional"> + <a class="message" href="#SCI_SETBIDIRECTIONAL"><span class="provisional">SCI_SETBIDIRECTIONAL(int bidirectional)</span></a><br /> + <a class="message" href="#SCI_GETBIDIRECTIONAL">SCI_GETBIDIRECTIONAL → int</a><br /> +</div> <a class="message" href="#SCI_GRABFOCUS">SCI_GRABFOCUS</a><br /> <a class="message" href="#SCI_SETFOCUS">SCI_SETFOCUS(bool focus)</a><br /> <a class="message" href="#SCI_GETFOCUS">SCI_GETFOCUS → bool</a><br /> @@ -3718,6 +3722,27 @@ struct Sci_TextToFind { and the inline behaviour with <code>SCI_SETIMEINTERACTION(SC_IME_INLINE)</code>. Scintilla may ignore this call in some cases. For example, the inline behaviour might only be supported for some languages.</p> +<div class="provisional"> + <a href="#ProvisionalMessages">These bidirectional features are not yet implemented and the API is provisional</a><br /> + <p><b id="SCI_SETBIDIRECTIONAL">SCI_SETBIDIRECTIONAL(int bidirectional)</b><br /> + <b id="SCI_GETBIDIRECTIONAL">SCI_GETBIDIRECTIONAL → int</b><br /> + 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 + <code>SCI_SETBIDIRECTIONAL(SC_BIDIRECTIONAL_L2R)</code> (1) which chooses left to right as the default direction or + <code>SCI_SETBIDIRECTIONAL(SC_BIDIRECTIONAL_R2L)</code> (2) for default right to left. + This should be done after setting the technology to <code>SC_TECHNOLOGY_DIRECTWRITE</code>, + <code>SC_TECHNOLOGY_DIRECTWRITERETAIN</code>, or + <code>SC_TECHNOLOGY_DIRECTWRITEDC</code>.</p> + <p>If the call succeeded <code>SCI_GETBIDIRECTIONAL</code> will return the same value otherwise + <code>SC_BIDIRECTIONAL_DISABLED</code> (0) is returned. + </p> +</div> + <p><b id="SCI_GRABFOCUS">SCI_GRABFOCUS</b><br /> <b id="SCI_SETFOCUS">SCI_SETFOCUS(bool focus)</b><br /> <b id="SCI_GETFOCUS">SCI_GETFOCUS → bool</b><br /> @@ -8073,8 +8098,6 @@ for line = lineStart to lineEnd do SCI_ENSUREVISIBLE(line) next <p>Provisional features are displayed in this document with <span class="provisional">a distinctive background colour</span>.</p> - <p>There are currently no provisional messages or values.</p> - <p>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 <code>SCI_DISABLE_PROVISIONAL</code> defined.</p> diff --git a/include/Scintilla.h b/include/Scintilla.h index 25649302e..74ec5b91a 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -1103,6 +1103,13 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, #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 --git a/include/Scintilla.iface b/include/Scintilla.iface index 04de613a5..bb00ed634 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -4861,10 +4861,19 @@ evt void AutoCCompleted=2030(string text, int position, int ch, CompletionMethod 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. - 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 --git a/src/EditModel.cxx b/src/EditModel.cxx index 7dfd90e37..0e00bcfe0 100644 --- a/src/EditModel.cxx +++ b/src/EditModel.cxx @@ -63,6 +63,7 @@ EditModel::EditModel() { highlightGuideColumn = 0; primarySelection = true; imeInteraction = imeWindowed; + bidirectional = Bidirectional::bidiDisabled; foldFlags = 0; foldDisplayTextStyle = SC_FOLDDISPLAYTEXT_HIDDEN; hotspot = Range(Sci::invalidPosition); diff --git a/src/EditModel.h b/src/EditModel.h index 773309d45..6e4919bd5 100644 --- a/src/EditModel.h +++ b/src/EditModel.h @@ -38,6 +38,8 @@ public: enum IMEInteraction { imeWindowed, imeInline } imeInteraction; + enum class Bidirectional { bidiDisabled, bidiL2R, bidiR2L } bidirectional; + int foldFlags; int foldDisplayTextStyle; ContractionState cs; diff --git a/src/Editor.cxx b/src/Editor.cxx index d45a8684c..36af34685 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -6736,6 +6736,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { 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<sptr_t>(bidirectional); + // Marker definition and setting case SCI_MARKERDEFINE: if (wParam <= MARKER_MAX) { diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx index 2d2fc266c..45b091546 100644 --- a/win32/ScintillaWin.cxx +++ b/win32/ScintillaWin.cxx @@ -1744,6 +1744,17 @@ sptr_t ScintillaWin::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam } 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<EditModel::Bidirectional>(wParam); + } + // Invalidate all cached information including layout. + DropGraphics(true); + InvalidateStyleRedraw(); + break; + #ifdef SCI_LEXER case SCI_LOADLEXERLIBRARY: LexerManager::GetInstance()->Load(reinterpret_cast<const char *>(lParam)); |