aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2021-07-17 14:54:31 +1000
committerNeil <nyamatongwe@gmail.com>2021-07-17 14:54:31 +1000
commitad0162453e48fb729d1793eca40ac137e1e3451e (patch)
tree158e0126b95245ca178531dcba45e4ffc5dcdde5
parent9aa05526ca323258c4879520093a0fe27826d53c (diff)
downloadscintilla-mirror-ad0162453e48fb729d1793eca40ac137e1e3451e.tar.gz
Add SCI_AUTOCSETOPTIONS to allow choosing a non-resizeable autocompletion list
on Win32. This also avoids a header rectangle above the list.
-rw-r--r--call/ScintillaCall.cxx8
-rw-r--r--doc/ScintillaDoc.html40
-rw-r--r--doc/ScintillaHistory.html5
-rw-r--r--include/Scintilla.h4
-rw-r--r--include/Scintilla.iface12
-rw-r--r--include/ScintillaCall.h2
-rw-r--r--include/ScintillaMessages.h2
-rw-r--r--include/ScintillaTypes.h5
-rw-r--r--src/AutoComplete.cxx4
-rw-r--r--src/AutoComplete.h4
-rw-r--r--src/Platform.h1
-rw-r--r--src/ScintillaBase.cxx16
-rw-r--r--win32/PlatWin.cxx12
13 files changed, 103 insertions, 12 deletions
diff --git a/call/ScintillaCall.cxx b/call/ScintillaCall.cxx
index bec5ccfed..23de3f004 100644
--- a/call/ScintillaCall.cxx
+++ b/call/ScintillaCall.cxx
@@ -936,6 +936,14 @@ bool ScintillaCall::AutoCGetAutoHide() {
return Call(Message::AutoCGetAutoHide);
}
+void ScintillaCall::AutoCSetOptions(Scintilla::AutoCompleteOption options) {
+ Call(Message::AutoCSetOptions, static_cast<uintptr_t>(options));
+}
+
+AutoCompleteOption ScintillaCall::AutoCGetOptions() {
+ return static_cast<Scintilla::AutoCompleteOption>(Call(Message::AutoCGetOptions));
+}
+
void ScintillaCall::AutoCSetDropRestOfWord(bool dropRestOfWord) {
Call(Message::AutoCSetDropRestOfWord, dropRestOfWord);
}
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index 03fe95ea9..531fca5aa 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -128,7 +128,7 @@
<h1>Scintilla Documentation</h1>
- <p>Last edited 25 June 2021 NH</p>
+ <p>Last edited 17 July 2021 NH</p>
<p style="background:#90F0C0">Scintilla 5 has moved the lexers from Scintilla into a new
<a href="Lexilla.html">Lexilla</a> project.<br />
@@ -5741,6 +5741,8 @@ struct Sci_TextToFind {
<a class="message" href="#SCI_AUTOCSETDROPRESTOFWORD">SCI_AUTOCSETDROPRESTOFWORD(bool
dropRestOfWord)</a><br />
<a class="message" href="#SCI_AUTOCGETDROPRESTOFWORD">SCI_AUTOCGETDROPRESTOFWORD &rarr; bool</a><br />
+ <a class="message" href="#SCI_AUTOCSETOPTIONS">SCI_AUTOCSETOPTIONS(int options)</a><br />
+ <a class="message" href="#SCI_AUTOCGETOPTIONS">SCI_AUTOCGETOPTIONS &rarr; int</a><br />
<a class="message" href="#SCI_REGISTERIMAGE">SCI_REGISTERIMAGE(int type, const char *xpmData)</a><br />
<a class="message" href="#SCI_REGISTERRGBAIMAGE">SCI_REGISTERRGBAIMAGE(int type, const char *pixels)</a><br />
<a class="message" href="#SCI_CLEARREGISTEREDIMAGES">SCI_CLEARREGISTEREDIMAGES</a><br />
@@ -5887,6 +5889,42 @@ struct Sci_TextToFind {
When an item is selected, any word characters following the caret are first erased if
<code class="parameter">dropRestOfWord</code> is set <code>true</code>. The default is <code>false</code>.</p>
+ <p><b id="SCI_AUTOCSETOPTIONS">SCI_AUTOCSETOPTIONS(int options)</b><br />
+ <b id="SCI_AUTOCGETOPTIONS">SCI_AUTOCGETOPTIONS &rarr; int</b><br />
+ Set options for autocompletion from the following list.</p>
+
+ <table class="standard" summary="Autocompletion options">
+ <tbody>
+ <tr>
+ <th align="left">Symbol</th>
+
+ <th>Value</th>
+
+ <th align="left">Purpose</th>
+ </tr>
+ </tbody>
+
+ <tbody valign="top">
+ <tr>
+ <td align="left"><code>SC_AUTOCOMPLETE_NORMAL</code></td>
+
+ <td align="center">0</td>
+
+ <td>Display autocompletion using default settings.</td>
+ </tr>
+
+ <tr>
+ <td align="left"><code>SC_AUTOCOMPLETE_FIXED_SIZE</code></td>
+
+ <td align="center">1</td>
+
+ <td>On Win32 only, use a fixed size list instead of one that can be resized by the user.
+ This also avoids a header rectangle above the list.</td>
+ </tr>
+
+ </tbody>
+ </table>
+
<p>
<b id="SCI_REGISTERIMAGE">SCI_REGISTERIMAGE(int type, const char *xpmData)</b><br />
<b id="SCI_REGISTERRGBAIMAGE">SCI_REGISTERRGBAIMAGE(int type, const char *pixels)</b><br />
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index 84710410d..8fddafc03 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -590,6 +590,11 @@
<a href="https://sourceforge.net/p/scintilla/feature-requests/1370/">Feature #1370</a>.
</li>
<li>
+ Add SCI_AUTOCSETOPTIONS to allow choosing a non-resizeable autocompletion list
+ on Win32.
+ <a href="https://sourceforge.net/p/scintilla/feature-requests/1284/">Feature #1284</a>.
+ </li>
+ <li>
On Win32, when technology is changed, buffering is set to a reasonable value for the technology:
on for GDI and off for Direct2D as Direct2D performs its own buffering.
<a href="https://sourceforge.net/p/scintilla/feature-requests/1400/">Feature #1400</a>.
diff --git a/include/Scintilla.h b/include/Scintilla.h
index 088abc0d8..97fbd3be0 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -405,6 +405,10 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP
#define SCI_USERLISTSHOW 2117
#define SCI_AUTOCSETAUTOHIDE 2118
#define SCI_AUTOCGETAUTOHIDE 2119
+#define SC_AUTOCOMPLETE_NORMAL 0
+#define SC_AUTOCOMPLETE_FIXED_SIZE 1
+#define SCI_AUTOCSETOPTIONS 2638
+#define SCI_AUTOCGETOPTIONS 2639
#define SCI_AUTOCSETDROPRESTOFWORD 2270
#define SCI_AUTOCGETDROPRESTOFWORD 2271
#define SCI_REGISTERIMAGE 2405
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index b59cda663..cc7dedf36 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -1009,6 +1009,18 @@ set void AutoCSetAutoHide=2118(bool autoHide,)
# Retrieve whether or not autocompletion is hidden automatically when nothing matches.
get bool AutoCGetAutoHide=2119(,)
+# Define option flags for autocompletion lists
+enu AutoCompleteOption=SC_AUTOCOMPLETE_
+val SC_AUTOCOMPLETE_NORMAL=0
+# Win32 specific:
+val SC_AUTOCOMPLETE_FIXED_SIZE=1
+
+# Set autocompletion options.
+set void AutoCSetOptions=2638(AutoCompleteOption options,)
+
+# Retrieve autocompletion options.
+get AutoCompleteOption AutoCGetOptions=2639(,)
+
# Set whether or not autocompletion deletes any word characters
# after the inserted text upon completion.
set void AutoCSetDropRestOfWord=2270(bool dropRestOfWord,)
diff --git a/include/ScintillaCall.h b/include/ScintillaCall.h
index e0cfdd052..098b9ec1d 100644
--- a/include/ScintillaCall.h
+++ b/include/ScintillaCall.h
@@ -274,6 +274,8 @@ public:
void UserListShow(int listType, const char *itemList);
void AutoCSetAutoHide(bool autoHide);
bool AutoCGetAutoHide();
+ void AutoCSetOptions(Scintilla::AutoCompleteOption options);
+ Scintilla::AutoCompleteOption AutoCGetOptions();
void AutoCSetDropRestOfWord(bool dropRestOfWord);
bool AutoCGetDropRestOfWord();
void RegisterImage(int type, const char *xpmData);
diff --git a/include/ScintillaMessages.h b/include/ScintillaMessages.h
index a0c641a39..9293a5a6b 100644
--- a/include/ScintillaMessages.h
+++ b/include/ScintillaMessages.h
@@ -210,6 +210,8 @@ enum class Message {
UserListShow = 2117,
AutoCSetAutoHide = 2118,
AutoCGetAutoHide = 2119,
+ AutoCSetOptions = 2638,
+ AutoCGetOptions = 2639,
AutoCSetDropRestOfWord = 2270,
AutoCGetDropRestOfWord = 2271,
RegisterImage = 2405,
diff --git a/include/ScintillaTypes.h b/include/ScintillaTypes.h
index ca0a07527..830ccadba 100644
--- a/include/ScintillaTypes.h
+++ b/include/ScintillaTypes.h
@@ -230,6 +230,11 @@ enum class IndicFlag {
ValueFore = 1,
};
+enum class AutoCompleteOption {
+ Normal = 0,
+ FixedSize = 1,
+};
+
enum class IndentView {
None = 0,
Real = 1,
diff --git a/src/AutoComplete.cxx b/src/AutoComplete.cxx
index fec0f20e9..87077e92a 100644
--- a/src/AutoComplete.cxx
+++ b/src/AutoComplete.cxx
@@ -39,6 +39,7 @@ AutoComplete::AutoComplete() :
typesep('?'),
ignoreCase(false),
chooseSingle(false),
+ options(AutoCompleteOption::Normal),
posStart(0),
startLen(0),
cancelAtStartPos(true),
@@ -63,10 +64,11 @@ bool AutoComplete::Active() const noexcept {
void AutoComplete::Start(Window &parent, int ctrlID,
Sci::Position position, Point location, Sci::Position startLen_,
- int lineHeight, bool unicodeMode, Technology technology) {
+ int lineHeight, bool unicodeMode, Technology technology, ListOptions listOptions) {
if (active) {
Cancel();
}
+ lb->SetOptions(listOptions);
lb->Create(parent, ctrlID, location, lineHeight, unicodeMode, technology);
lb->Clear();
active = true;
diff --git a/src/AutoComplete.h b/src/AutoComplete.h
index c46530771..fa8f57287 100644
--- a/src/AutoComplete.h
+++ b/src/AutoComplete.h
@@ -25,6 +25,7 @@ public:
bool ignoreCase;
bool chooseSingle;
+ AutoCompleteOption options;
std::unique_ptr<ListBox> lb;
Sci::Position posStart;
Sci::Position startLen;
@@ -49,7 +50,8 @@ public:
/// Display the auto completion list positioned to be near a character position
void Start(Window &parent, int ctrlID, Sci::Position position, Point location,
- Sci::Position startLen_, int lineHeight, bool unicodeMode, Scintilla::Technology technology);
+ Sci::Position startLen_, int lineHeight, bool unicodeMode, Scintilla::Technology technology,
+ ListOptions listOptions);
/// The stop chars are characters which, when typed, cause the auto completion list to disappear
void SetStopChars(const char *stopChars_);
diff --git a/src/Platform.h b/src/Platform.h
index 10c63dd23..ce04d9b22 100644
--- a/src/Platform.h
+++ b/src/Platform.h
@@ -313,6 +313,7 @@ struct ListOptions {
std::optional<ColourRGBA> back;
std::optional<ColourRGBA> foreSelected;
std::optional<ColourRGBA> backSelected;
+ AutoCompleteOption options=AutoCompleteOption::Normal;
};
class ListBox : public Window {
diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx
index 0adca2f6f..238299734 100644
--- a/src/ScintillaBase.cxx
+++ b/src/ScintillaBase.cxx
@@ -257,16 +257,17 @@ void ScintillaBase::AutoCompleteStart(Sci::Position lenEntered, const char *list
return;
}
}
- ac.Start(wMain, idAutoComplete, sel.MainCaret(), PointMainCaret(),
- lenEntered, vs.lineHeight, IsUnicodeMode(), technology);
ListOptions options{
vs.ElementColour(Element::List),
vs.ElementColour(Element::ListBack),
vs.ElementColour(Element::ListSelected),
- vs.ElementColour(Element::ListSelectedBack)
+ vs.ElementColour(Element::ListSelectedBack),
+ ac.options,
};
- ac.lb->SetOptions(options);
+
+ ac.Start(wMain, idAutoComplete, sel.MainCaret(), PointMainCaret(),
+ lenEntered, vs.lineHeight, IsUnicodeMode(), technology, options);
const PRectangle rcClient = GetClientRectangle();
Point pt = LocationFromPosition(sel.MainCaret() - lenEntered);
@@ -942,6 +943,13 @@ sptr_t ScintillaBase::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) {
case Message::AutoCGetAutoHide:
return ac.autoHide;
+ case Message::AutoCSetOptions:
+ ac.options = static_cast<AutoCompleteOption>(wParam);
+ break;
+
+ case Message::AutoCGetOptions:
+ return static_cast<sptr_t>(ac.options);
+
case Message::AutoCSetDropRestOfWord:
ac.dropRestOfWord = wParam != 0;
break;
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index 371edc957..3e966b4d3 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -2932,10 +2932,11 @@ class ListBoxX : public ListBox {
Point location; // Caret location at which the list is opened
int wheelDelta; // mouse wheel residue
ListOptions options;
+ DWORD frameStyle = WS_THICKFRAME;
HWND GetHWND() const noexcept;
void AppendListItem(const char *text, const char *numword);
- static void AdjustWindowRect(PRectangle *rc, UINT dpi) noexcept;
+ void AdjustWindowRect(PRectangle *rc, UINT dpiAdjust) const noexcept;
int ItemHeight() const;
int MinClientWidth() const noexcept;
int TextOffset() const;
@@ -3014,7 +3015,7 @@ void ListBoxX::Create(Window &parent_, int ctrlID_, Point location_, int lineHei
// Window created as popup so not clipped within parent client area
wid = ::CreateWindowEx(
WS_EX_WINDOWEDGE, ListBoxX_ClassName, TEXT(""),
- WS_POPUP | WS_THICKFRAME,
+ WS_POPUP | frameStyle,
100,100, 150,80, hwndParent,
NULL,
hinstanceParent,
@@ -3318,14 +3319,15 @@ void ListBoxX::SetList(const char *list, char separator, char typesep) {
void ListBoxX::SetOptions(ListOptions options_) {
options = options_;
+ frameStyle = FlagSet(options.options, AutoCompleteOption::FixedSize) ? WS_BORDER : WS_THICKFRAME;
}
-void ListBoxX::AdjustWindowRect(PRectangle *rc, UINT dpi) noexcept {
+void ListBoxX::AdjustWindowRect(PRectangle *rc, UINT dpiAdjust) const noexcept {
RECT rcw = RectFromPRectangle(*rc);
if (fnAdjustWindowRectExForDpi) {
- fnAdjustWindowRectExForDpi(&rcw, WS_THICKFRAME, false, WS_EX_WINDOWEDGE, dpi);
+ fnAdjustWindowRectExForDpi(&rcw, frameStyle, false, WS_EX_WINDOWEDGE, dpiAdjust);
} else {
- ::AdjustWindowRectEx(&rcw, WS_THICKFRAME, false, WS_EX_WINDOWEDGE);
+ ::AdjustWindowRectEx(&rcw, frameStyle, false, WS_EX_WINDOWEDGE);
}
*rc = PRectangle::FromInts(rcw.left, rcw.top, rcw.right, rcw.bottom);
}