diff options
author | nyamatongwe <unknown> | 2000-03-08 01:38:23 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2000-03-08 01:38:23 +0000 |
commit | 7fbd8e2a34d2f5084ce26ad95d7c70ae4de6a233 (patch) | |
tree | 83eec8af8ccee95c3f5a3f4185c1ae2cda3cd4db /src/CallTip.cxx | |
parent | 8eba2a95b6aa25489c28eabfcd54e0389de78899 (diff) | |
download | scintilla-mirror-7fbd8e2a34d2f5084ce26ad95d7c70ae4de6a233.tar.gz |
Initial revision
Diffstat (limited to 'src/CallTip.cxx')
-rw-r--r-- | src/CallTip.cxx | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/CallTip.cxx b/src/CallTip.cxx new file mode 100644 index 000000000..ad6740208 --- /dev/null +++ b/src/CallTip.cxx @@ -0,0 +1,168 @@ +// Scintilla source code edit control +// CallTip.cxx - code for displaying call tips +// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#include <stdlib.h> +#include <string.h> + +#include "Platform.h" + +#include "CallTip.h" + +CallTip::CallTip() { + wCallTip = 0; + inCallTipMode = false; + posStartCallTip = 0; + val = 0; + startHighlight = 0; + endHighlight = 0; + + colourBG.desired = Colour(0xff, 0xff, 0xff); + colourUnSel.desired = Colour(0x80, 0x80, 0x80); + colourSel.desired = Colour(0, 0, 0x80); + colourShade.desired = Colour(0, 0, 0); + colourLight.desired = Colour(0xc0, 0xc0, 0xc0); +} + +CallTip::~CallTip() { + wCallTip.Destroy(); + delete []val; + val = 0; +} + +void CallTip::RefreshColourPalette(Palette &pal, bool want) { + pal.WantFind(colourBG, want); + pal.WantFind(colourUnSel, want); + pal.WantFind(colourSel, want); + pal.WantFind(colourShade, want); + pal.WantFind(colourLight, want); +} + +void CallTip::PaintCT(Surface *surfaceWindow) { + if (!val) + return; + PRectangle rcClientPos = wCallTip.GetClientPosition(); + PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left, + rcClientPos.bottom - rcClientPos.top); + PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1); + + surfaceWindow->FillRectangle(rcClient, colourBG.allocated); + // To make a nice small call tip window, it is only sized to fit most normal characters without accents + int lineHeight = surfaceWindow->Height(font); + int ascent = surfaceWindow->Ascent(font) - surfaceWindow->InternalLeading(font); + + // For each line... + // Draw the definition in three parts: before highlight, highlighted, after highlight + int ytext = rcClient.top + ascent + 1; + char *chunkVal = val; + bool moreChunks = true; + while (moreChunks) { + char *chunkEnd = strchr(chunkVal, '\n'); + if (chunkEnd == NULL) { + chunkEnd = chunkVal + strlen(chunkVal); + moreChunks = false; + } + int chunkOffset = chunkVal - val; + int chunkLength = chunkEnd - chunkVal; + int chunkEndOffset = chunkOffset + chunkLength; + int thisStartHighlight = Platform::Maximum(startHighlight, chunkOffset); + thisStartHighlight = Platform::Minimum(thisStartHighlight, chunkEndOffset); + thisStartHighlight -= chunkOffset; + int thisEndHighlight = Platform::Maximum(endHighlight, chunkOffset); + thisEndHighlight = Platform::Minimum(thisEndHighlight, chunkEndOffset); + thisEndHighlight -= chunkOffset; + int x = 5; + int xEnd = x + surfaceWindow->WidthText(font, chunkVal, thisStartHighlight); + rcClient.left = x; + rcClient.top = ytext - ascent - 1; + rcClient.right = xEnd; + surfaceWindow->DrawText(rcClient, font, ytext, + chunkVal, thisStartHighlight, + colourUnSel.allocated, colourBG.allocated); + x = xEnd; + + xEnd = x + surfaceWindow->WidthText(font, chunkVal + thisStartHighlight, + thisEndHighlight - thisStartHighlight); + rcClient.top = ytext; + rcClient.left = x; + rcClient.right = xEnd; + surfaceWindow->DrawText(rcClient, font, ytext, + chunkVal + thisStartHighlight, thisEndHighlight - thisStartHighlight, + colourSel.allocated, colourBG.allocated); + x = xEnd; + + xEnd = x + surfaceWindow->WidthText(font, chunkVal + thisEndHighlight, + chunkLength - thisEndHighlight); + rcClient.left = x; + rcClient.right = xEnd; + surfaceWindow->DrawText(rcClient, font, ytext, + chunkVal + thisEndHighlight, chunkLength - thisEndHighlight, + colourUnSel.allocated, colourBG.allocated); + chunkVal = chunkEnd + 1; + ytext += lineHeight; + } + // Draw a raised border around the edges of the window + surfaceWindow->MoveTo(0, rcClientSize.bottom - 1); + surfaceWindow->PenColour(colourShade.allocated); + surfaceWindow->LineTo(rcClientSize.right - 1, rcClientSize.bottom - 1); + surfaceWindow->LineTo(rcClientSize.right - 1, 0); + surfaceWindow->PenColour(colourLight.allocated); + surfaceWindow->LineTo(0, 0); + surfaceWindow->LineTo(0, rcClientSize.bottom - 1); +} + +PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn, + const char *faceName, int size) { + Surface surfaceMeasure; + surfaceMeasure.Init(); + int deviceHeight = (size * surfaceMeasure.LogPixelsY()) / 72; + font.Create(faceName, deviceHeight); + if (val) + delete []val; + val = new char[strlen(defn) + 1]; + if (!val) + return PRectangle(); + strcpy(val, defn); + startHighlight = 0; + endHighlight = 0; + inCallTipMode = true; + posStartCallTip = pos; + // Look for multiple lines in the text + // Only support \n here - simply means container must avoid \r! + int width = 0; + int numLines = 1; + const char *newline; + const char *look = val; + while ((newline = strchr(look, '\n')) != NULL) { + int thisWidth = surfaceMeasure.WidthText(font, look, newline - look); + width = Platform::Maximum(width, thisWidth); + look = newline + 1; + numLines++; + } + int lastWidth = surfaceMeasure.WidthText(font, look, strlen(look)); + width = Platform::Maximum(width, lastWidth) + 10; + int lineHeight = surfaceMeasure.Height(font); + // Extra line for border and an empty line at top and bottom + int height = lineHeight * numLines - surfaceMeasure.InternalLeading(font) + 2 + 2; + return PRectangle(pt.x -5, pt.y + lineHeight + 1, pt.x + width - 5, pt.y + lineHeight + 1 + height); +} + + +void CallTip::CallTipCancel() { + inCallTipMode = false; + if (wCallTip.Created()) { + wCallTip.Destroy(); + } +} + +void CallTip::SetHighlight(int start, int end) { + // Avoid flashing by checking something has really changed + if ((start != startHighlight) || (end != endHighlight)) { + startHighlight = start; + endHighlight = end; + if (wCallTip.Created()) { + wCallTip.InvalidateAll(); + } + } +} |