aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/ScintillaDoc.html61
-rw-r--r--include/Scintilla.h2
-rw-r--r--include/Scintilla.iface8
-rw-r--r--src/CallTip.cxx92
-rw-r--r--src/CallTip.h26
-rw-r--r--src/ScintillaBase.cxx20
-rw-r--r--src/ViewStyle.cxx4
7 files changed, 164 insertions, 49 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index bc630f795..42314186a 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -38,7 +38,7 @@
<h1>Scintilla Documentation</h1>
- <p>Last edited 2/November/2005 NH</p>
+ <p>Last edited 4/February/2006 NH</p>
<p>There is <a class="jump" href="Design.html">an overview of the internal design of
Scintilla</a>.<br />
@@ -1915,14 +1915,25 @@ struct TextToFind {
</tr>
<tr>
+ <th align="left"><code>STYLE_CALLTIP</code></th>
+
+ <td>38</td>
+
+ <td> Call tips normally use the font attributes defined by <code>STYLE_DEFAULT</code>.
+ Use of <a class="message" href="#SCI_CALLTIPUSESTYLE"><code>SCI_CALLTIPUSESTYLE</code></a>
+ causes call tips to use this style instead. Only the font face name, font size,
+ foreground and background colours and character set attributes are used.</td>
+ </tr>
+
+ <tr>
<th align="left"><code>STYLE_LASTPREDEFINED</code></th>
<td>39</td>
<td>To make it easier for client code to discover the range of styles that are
predefined, this is set to the style number of the last predefined style. This is
- currently set to 39 and the last style with an identifier is 37, which reserves space for
- future predefined styles.</td>
+ currently set to 39 and the last style with an identifier is 38, which reserves space
+ for one future predefined style.</td>
</tr>
<tr>
@@ -3159,9 +3170,16 @@ struct TextToFind {
<h2 id="CallTips">Call tips</h2>
<p>Call tips are small windows displaying the arguments to a function and are displayed after
- the user has typed the name of the function. There is some interaction between call tips and
- autocompletion lists in that showing a call tip cancels any active autocompletion list, and
- vice versa.</p>
+ the user has typed the name of the function. They normally display characters using the font
+ facename, size and character set defined by
+ <code><a class="message" href="#StyleDefinition">STYLE_DEFAULT</a></code>. You can choose to
+ use <code><a class="message" href="#StyleDefinition">STYLE_CALLTIP</a></code> to define the
+ facename, size, foreground and background colours and character set with
+ <code><a class="message" href="#SCI_CALLTIPUSESTYLE">SCI_CALLTIPUSESTYLE</a></code>.
+ This also enables support for Tab characters.
+
+ There is some interaction between call tips and autocompletion lists in that showing a
+ call tip cancels any active autocompletion list, and vice versa.</p>
<p>Call tips can highlight part of the text within them. You could use this to highlight the
current argument to a function by counting the number of commas (or whatever separator your
@@ -3192,17 +3210,22 @@ struct TextToFind {
<a class="message" href="#SCI_CALLTIPSETBACK">SCI_CALLTIPSETBACK(int colour)</a><br />
<a class="message" href="#SCI_CALLTIPSETFORE">SCI_CALLTIPSETFORE(int colour)</a><br />
<a class="message" href="#SCI_CALLTIPSETFOREHLT">SCI_CALLTIPSETFOREHLT(int colour)</a><br />
+ <a class="message" href="#SCI_CALLTIPUSESTYLE">SCI_CALLTIPUSESTYLE(int tabsize)</a><br />
</code>
-
-
<p><b id="SCI_CALLTIPSHOW">SCI_CALLTIPSHOW(int posStart, const char *definition)</b><br />
This message starts the process by displaying the call tip window. If a call tip is already
active, this has no effect.<br />
<code>posStart</code> is the position in the document at which to align the call tip. The call
- tip text is aligned to start 1 line below this character.<br />
+ tip text is aligned to start 1 line below this character unless you have included up and/or
+ down arrows in the call tip text in which case the tip is aligned to the right-hand edge of
+ the rightmost arrow. The assumption is that you will start the text with something like
+ "\001 1 of 3 \002".<br />
<code>definition</code> is the call tip text. This can contain multiple lines separated by
- '\n' (Line Feed, ASCII code 10) characters.</p>
+ '\n' (Line Feed, ASCII code 10) characters. Do not include '\r' (Carriage Return, ASCII
+ code 13), as this will most likely print as an empty box. '\t' (Tab, ASCII code 9) is
+ supported if you set a tabsize with
+ <code><a class="message" href="#SCI_CALLTIPUSESTYLE">SCI_CALLTIPUSESTYLE</a></code>.<br /></p>
<p><b id="SCI_CALLTIPCANCEL">SCI_CALLTIPCANCEL</b><br />
This message cancels any displayed call tip. Scintilla will also cancel call tips for you if
@@ -3233,14 +3256,24 @@ struct TextToFind {
<p><b id="SCI_CALLTIPSETBACK">SCI_CALLTIPSETBACK(int colour)</b><br />
The background colour of call tips can be set with this message; the default colour is white.
- It is not a good idea to set a dark colour as the background as the unselected text is drawn in
- mid gray and the selected text in a dark blue.</p>
+ It is not a good idea to set a dark colour as the background as the default colour for normal
+ calltip text is mid gray and the defaultcolour for highlighted text is dark blue. This also
+ sets the background colour of <code>STYLE_CALLTIP</code>.</p>
<p><b id="SCI_CALLTIPSETFORE">SCI_CALLTIPSETFORE(int colour)</b><br />
- The colour of call tip text can be set with this message; the default colour is mid gray.</p>
+ The colour of call tip text can be set with this message; the default colour is mid gray.
+ This also sets the foreground colour of <code>STYLE_CALLTIP</code>.</p>
<p><b id="SCI_CALLTIPSETFOREHLT">SCI_CALLTIPSETFOREHLT(int colour)</b><br />
- The colour of highlighted call tip text can be set with this message; the default colour is dark blue.</p>
+ The colour of highlighted call tip text can be set with this message; the default colour
+ is dark blue.</p>
+
+ <p><b id="SCI_CALLTIPUSESTYLE">SCI_CALLTIPUSESTYLE(int tabsize)</b><br />
+ This message changes the style used for call tips from <code>STYLE_DEFAULT</code> to
+ <code>STYLE_CALLTIP</code> and sets a tab size in screen pixels. If <code>tabsize</code> is
+ less than 1, Tab characters are not treated specially. Once this call has been used, the
+ call tip foreground and background colours are also taken from the style.</p>
+
<h2 id="KeyboardCommands">Keyboard commands</h2>
diff --git a/include/Scintilla.h b/include/Scintilla.h
index b4ed329f7..29ffdb23d 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -154,6 +154,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define STYLE_BRACEBAD 35
#define STYLE_CONTROLCHAR 36
#define STYLE_INDENTGUIDE 37
+#define STYLE_CALLTIP 38
#define STYLE_LASTPREDEFINED 39
#define STYLE_MAX 127
#define SC_CHARSET_ANSI 0
@@ -358,6 +359,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCI_CALLTIPSETBACK 2205
#define SCI_CALLTIPSETFORE 2206
#define SCI_CALLTIPSETFOREHLT 2207
+#define SCI_CALLTIPUSESTYLE 2212
#define SCI_VISIBLEFROMDOCLINE 2220
#define SCI_DOCLINEFROMVISIBLE 2221
#define SCI_WRAPCOUNT 2235
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 9a3a94d77..ecb366530 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -344,8 +344,8 @@ set void SetMarginSensitiveN=2246(int margin, bool sensitive)
# Retrieve the mouse click sensitivity of a margin.
get bool GetMarginSensitiveN=2247(int margin,)
-# Styles in range 32..37 are predefined for parts of the UI and are not used as normal styles.
-# Styles 38 and 39 are for future use.
+# Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles.
+# Style 39 is for future use.
enu StylesCommon=STYLE_
val STYLE_DEFAULT=32
val STYLE_LINENUMBER=33
@@ -353,6 +353,7 @@ val STYLE_BRACELIGHT=34
val STYLE_BRACEBAD=35
val STYLE_CONTROLCHAR=36
val STYLE_INDENTGUIDE=37
+val STYLE_CALLTIP=38
val STYLE_LASTPREDEFINED=39
val STYLE_MAX=127
@@ -919,6 +920,9 @@ set void CallTipSetFore=2206(colour fore,)
# Set the foreground colour for the highlighted part of the call tip.
set void CallTipSetForeHlt=2207(colour fore,)
+# Enable use of STYLE_CALLTIP and set call tip tab size in pixels.
+set void CallTipUseStyle=2212(int tabSize,)
+
# Find the display line of a document line taking hidden lines into account.
fun int VisibleFromDocLine=2220(int line,)
diff --git a/src/CallTip.cxx b/src/CallTip.cxx
index 80fd55d7b..f7a458313 100644
--- a/src/CallTip.cxx
+++ b/src/CallTip.cxx
@@ -13,6 +13,9 @@
#include "Scintilla.h"
#include "CallTip.h"
+static const int insetX = 5; // text inset in x from calltip border
+const int widthArrow = 14;
+
CallTip::CallTip() {
wCallTip = 0;
inCallTipMode = false;
@@ -23,6 +26,8 @@ CallTip::CallTip() {
lineHeight = 1;
startHighlight = 0;
endHighlight = 0;
+ tabSize = 0;
+ useStyleCallTip = false; // for backwards compatibility
colourBG.desired = ColourDesired(0xff, 0xff, 0xff);
colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80);
@@ -38,8 +43,6 @@ CallTip::~CallTip() {
val = 0;
}
-const int widthArrow = 14;
-
void CallTip::RefreshColourPalette(Palette &pal, bool want) {
pal.WantFind(colourBG, want);
pal.WantFind(colourUnSel, want);
@@ -48,19 +51,42 @@ void CallTip::RefreshColourPalette(Palette &pal, bool want) {
pal.WantFind(colourLight, want);
}
+// Although this test includes 0, we should never see a \0 character.
static bool IsArrowCharacter(char ch) {
return (ch == 0) || (ch == '\001') || (ch == '\002');
}
+// We ignore tabs unless a tab width has been set.
+bool CallTip::IsTabCharacter(char ch) {
+ return (tabSize > 0) && (ch == '\t');
+}
+
+int CallTip::NextTabPos(int x) {
+ if (tabSize > 0) { // paranoia... not called unless this is true
+ x -= insetX; // position relative to text
+ x = (x + tabSize) / tabSize; // tab "number"
+ return tabSize*x + insetX; // position of next tab
+ } else {
+ return x + 1; // arbitrary
+ }
+}
+
+// Draw a section of the call tip that does not include \n in one colour.
+// The text may include up to numEnds tabs or arrow characters.
void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
int posStart, int posEnd, int ytext, PRectangle rcClient,
bool highlight, bool draw) {
s += posStart;
int len = posEnd - posStart;
+
+ // Divide the text into sections that are all text, or that are
+ // single arrows or single tab characters (if tabSize > 0).
int maxEnd = 0;
- int ends[10];
+ const int numEnds = 10;
+ int ends[numEnds + 2];
for (int i=0;i<len;i++) {
- if (IsArrowCharacter(s[i])) {
+ if ((maxEnd < numEnds) &&
+ (IsArrowCharacter(s[i]) || IsTabCharacter(s[i])) ) {
if (i > 0)
ends[maxEnd++] = i;
ends[maxEnd++] = i+1;
@@ -73,20 +99,19 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
int endSeg = ends[seg];
if (endSeg > startSeg) {
if (IsArrowCharacter(s[startSeg])) {
- xEnd = x + widthArrow;
- offsetMain = xEnd;
+ bool upArrow = s[startSeg] == '\001';
rcClient.left = x;
- rcClient.right = xEnd;
+ rcClient.right = rcClient.left + widthArrow;
if (draw) {
const int halfWidth = widthArrow / 2 - 3;
- const int centreX = x + widthArrow / 2 - 1;
+ const int centreX = rcClient.left + widthArrow / 2 - 1;
const int centreY = (rcClient.top + rcClient.bottom) / 2;
surface->FillRectangle(rcClient, colourBG.allocated);
- PRectangle rcClientInner(rcClient.left+1, rcClient.top+1, rcClient.right-2, rcClient.bottom-1);
+ PRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1,
+ rcClient.right - 2, rcClient.bottom - 1);
surface->FillRectangle(rcClientInner, colourUnSel.allocated);
- if (s[startSeg] == '\001') {
- // Up arrow
+ if (upArrow) { // Up arrow
Point pts[] = {
Point(centreX - halfWidth, centreY + halfWidth / 2),
Point(centreX + halfWidth, centreY + halfWidth / 2),
@@ -94,8 +119,7 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
};
surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]),
colourBG.allocated, colourBG.allocated);
- } else {
- // Down arrow
+ } else { // Down arrow
Point pts[] = {
Point(centreX - halfWidth, centreY - halfWidth / 2),
Point(centreX + halfWidth, centreY - halfWidth / 2),
@@ -105,20 +129,23 @@ void CallTip::DrawChunk(Surface *surface, int &x, const char *s,
colourBG.allocated, colourBG.allocated);
}
}
- if (s[startSeg] == '\001') {
+ xEnd = rcClient.right;
+ offsetMain = xEnd;
+ if (upArrow) {
rectUp = rcClient;
- } else if (s[startSeg] == '\002') {
+ } else {
rectDown = rcClient;
}
+ } else if (IsTabCharacter(s[startSeg])) {
+ xEnd = NextTabPos(x);
} else {
- xEnd = x + surface->WidthText(font, s+startSeg, endSeg - startSeg);
+ xEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg);
if (draw) {
rcClient.left = x;
rcClient.right = xEnd;
- surface->DrawTextNoClip(rcClient, font, ytext,
+ surface->DrawTextTransparent(rcClient, font, ytext,
s+startSeg, endSeg - startSeg,
- highlight ? colourSel.allocated : colourUnSel.allocated,
- colourBG.allocated);
+ highlight ? colourSel.allocated : colourUnSel.allocated);
}
}
x = xEnd;
@@ -160,7 +187,7 @@ int CallTip::PaintContents(Surface *surfaceWindow, bool draw) {
thisEndHighlight -= chunkOffset;
rcClient.top = ytext - ascent - 1;
- int x = 5;
+ int x = insetX; // start each line at this inset
DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight,
ytext, rcClient, false, draw);
@@ -187,7 +214,7 @@ void CallTip::PaintCT(Surface *surfaceWindow) {
surfaceWindow->FillRectangle(rcClient, colourBG.allocated);
- offsetMain = 5;
+ offsetMain = insetX; // initial alignment assuming no arrows
PaintContents(surfaceWindow, true);
// Draw a raised border around the edges of the window
@@ -238,14 +265,17 @@ PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn,
const char *look = val;
rectUp = PRectangle(0,0,0,0);
rectDown = PRectangle(0,0,0,0);
- offsetMain = 5;
- int width = PaintContents(surfaceMeasure, false) + 5;
+ offsetMain = insetX; // changed to right edge of any arrows
+ int width = PaintContents(surfaceMeasure, false) + insetX;
while ((newline = strchr(look, '\n')) != NULL) {
look = newline + 1;
numLines++;
}
lineHeight = surfaceMeasure->Height(font);
- // Extra line for border and an empty line at top and bottom
+
+ // Extra line for border and an empty line at top and bottom. The returned
+ // rectangle is aligned to the right edge of the last arrow encountered in
+ // the tip text, else to the tip text left edge.
int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2;
delete surfaceMeasure;
return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height);
@@ -268,3 +298,17 @@ void CallTip::SetHighlight(int start, int end) {
}
}
}
+
+// Set the tab size (sizes > 0 enable the use of tabs). This also enables the
+// use of the STYLE_CALLTIP.
+void CallTip::SetTabSize(int tabSz) {
+ tabSize = tabSz;
+ useStyleCallTip = true;
+}
+
+// It might be better to have two access functions for this and to use
+// them for all settings of colours.
+void CallTip::SetForeBack(const ColourPair &fore, const ColourPair &back) {
+ colourBG = back;
+ colourUnSel = fore;
+}
diff --git a/src/CallTip.h b/src/CallTip.h
index 53eec832a..9848a10af 100644
--- a/src/CallTip.h
+++ b/src/CallTip.h
@@ -11,14 +11,17 @@
/**
*/
class CallTip {
- int startHighlight;
- int endHighlight;
+ int startHighlight; // character offset to start and...
+ int endHighlight; // ...end of highlighted text
char *val;
Font font;
- PRectangle rectUp;
- PRectangle rectDown;
- int lineHeight;
- int offsetMain;
+ PRectangle rectUp; // rectangle of last up angle in the tip
+ PRectangle rectDown; // rectangle of last down arrow in the tip
+ int lineHeight; // vertical line spacing
+ int offsetMain; // The alignment point of the call tip
+ int tabSize; // Tab size in pixels, <=0 no TAB expand
+ bool useStyleCallTip; // if true, STYLE_CALLTIP should be used
+
// Private so CallTip objects can not be copied
CallTip(const CallTip &) {}
CallTip &operator=(const CallTip &) { return *this; }
@@ -26,6 +29,8 @@ class CallTip {
int posStart, int posEnd, int ytext, PRectangle rcClient,
bool highlight, bool draw);
int PaintContents(Surface *surfaceWindow, bool draw);
+ bool IsTabCharacter(char c);
+ int NextTabPos(int x);
public:
Window wCallTip;
@@ -60,6 +65,15 @@ public:
/// Set a range of characters to be displayed in a highlight style.
/// Commonly used to highlight the current parameter.
void SetHighlight(int start, int end);
+
+ /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand.
+ void SetTabSize(int tabSz);
+
+ /// Used to determine which STYLE_xxxx to use for call tip information
+ bool UseStyleCallTip() const { return useStyleCallTip;}
+
+ // Modify foreground and background colours
+ void SetForeBack(const ColourPair &fore, const ColourPair &back);
};
#endif
diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx
index 6be8b74b5..0ca5002a7 100644
--- a/src/ScintillaBase.cxx
+++ b/src/ScintillaBase.cxx
@@ -368,12 +368,19 @@ int ScintillaBase::AutoCompleteGetCurrent() {
void ScintillaBase::CallTipShow(Point pt, const char *defn) {
AutoCompleteCancel();
pt.y += vs.lineHeight;
+ // If container knows about STYLE_CALLTIP then use it in place of the
+ // STYLE_DEFAULT for the face name, size and character set. Also use it
+ // for the foreground and background colour.
+ int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT;
+ if (ct.UseStyleCallTip()) {
+ ct.SetForeBack(vs.styles[STYLE_CALLTIP].fore, vs.styles[STYLE_CALLTIP].back);
+ }
PRectangle rc = ct.CallTipStart(currentPos, pt,
defn,
- vs.styles[STYLE_DEFAULT].fontName,
- vs.styles[STYLE_DEFAULT].sizeZoomed,
+ vs.styles[ctStyle].fontName,
+ vs.styles[ctStyle].sizeZoomed,
CodePage(),
- vs.styles[STYLE_DEFAULT].characterSet,
+ vs.styles[ctStyle].characterSet,
wMain);
// If the call-tip window would be out of the client
// space, adjust so it displays above the text.
@@ -624,11 +631,13 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
case SCI_CALLTIPSETBACK:
ct.colourBG = ColourDesired(wParam);
+ vs.styles[STYLE_CALLTIP].fore = ct.colourBG;
InvalidateStyleRedraw();
break;
case SCI_CALLTIPSETFORE:
ct.colourUnSel = ColourDesired(wParam);
+ vs.styles[STYLE_CALLTIP].fore = ct.colourUnSel;
InvalidateStyleRedraw();
break;
@@ -637,6 +646,11 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara
InvalidateStyleRedraw();
break;
+ case SCI_CALLTIPUSESTYLE:
+ ct.SetTabSize((int)wParam);
+ InvalidateStyleRedraw();
+ break;
+
case SCI_USEPOPUP:
displayPopupMenu = wParam != 0;
break;
diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx
index c52f1e472..fe519905b 100644
--- a/src/ViewStyle.cxx
+++ b/src/ViewStyle.cxx
@@ -278,6 +278,10 @@ void ViewStyle::ClearStyles() {
}
}
styles[STYLE_LINENUMBER].back.desired = Platform::Chrome();
+
+ // Set call tip fore/back to match the values previously set for call tips
+ styles[STYLE_CALLTIP].back.desired = ColourDesired(0xff, 0xff, 0xff);
+ styles[STYLE_CALLTIP].fore.desired = ColourDesired(0x80, 0x80, 0x80);
}
void ViewStyle::SetStyleFontName(int styleIndex, const char *name) {