1*8af74909SZhong Yang // Scintilla source code edit control 2*8af74909SZhong Yang /** @file Platform.h 3*8af74909SZhong Yang ** Interface to platform facilities. Also includes some basic utilities. 4*8af74909SZhong Yang ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows. 5*8af74909SZhong Yang **/ 6*8af74909SZhong Yang // Copyright 1998-2009 by Neil Hodgson <[email protected]> 7*8af74909SZhong Yang // The License.txt file describes the conditions under which this software may be distributed. 8*8af74909SZhong Yang 9*8af74909SZhong Yang #ifndef PLATFORM_H 10*8af74909SZhong Yang #define PLATFORM_H 11*8af74909SZhong Yang 12*8af74909SZhong Yang // PLAT_GTK = GTK+ on Linux or Win32 13*8af74909SZhong Yang // PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32 14*8af74909SZhong Yang // PLAT_WIN = Win32 API on Win32 OS 15*8af74909SZhong Yang // PLAT_WX is wxWindows on any supported platform 16*8af74909SZhong Yang // PLAT_TK = Tcl/TK on Linux or Win32 17*8af74909SZhong Yang 18*8af74909SZhong Yang #define PLAT_GTK 0 19*8af74909SZhong Yang #define PLAT_GTK_WIN32 0 20*8af74909SZhong Yang #define PLAT_GTK_MACOSX 0 21*8af74909SZhong Yang #define PLAT_MACOSX 0 22*8af74909SZhong Yang #define PLAT_WIN 0 23*8af74909SZhong Yang #define PLAT_WX 0 24*8af74909SZhong Yang #define PLAT_QT 0 25*8af74909SZhong Yang #define PLAT_FOX 0 26*8af74909SZhong Yang #define PLAT_CURSES 0 27*8af74909SZhong Yang #define PLAT_TK 0 28*8af74909SZhong Yang #define PLAT_HAIKU 0 29*8af74909SZhong Yang 30*8af74909SZhong Yang #if defined(FOX) 31*8af74909SZhong Yang #undef PLAT_FOX 32*8af74909SZhong Yang #define PLAT_FOX 1 33*8af74909SZhong Yang 34*8af74909SZhong Yang #elif defined(__WX__) 35*8af74909SZhong Yang #undef PLAT_WX 36*8af74909SZhong Yang #define PLAT_WX 1 37*8af74909SZhong Yang 38*8af74909SZhong Yang #elif defined(CURSES) 39*8af74909SZhong Yang #undef PLAT_CURSES 40*8af74909SZhong Yang #define PLAT_CURSES 1 41*8af74909SZhong Yang 42*8af74909SZhong Yang #elif defined(__HAIKU__) 43*8af74909SZhong Yang #undef PLAT_HAIKU 44*8af74909SZhong Yang #define PLAT_HAIKU 1 45*8af74909SZhong Yang 46*8af74909SZhong Yang #elif defined(SCINTILLA_QT) 47*8af74909SZhong Yang #undef PLAT_QT 48*8af74909SZhong Yang #define PLAT_QT 1 49*8af74909SZhong Yang 50*8af74909SZhong Yang #elif defined(TK) 51*8af74909SZhong Yang #undef PLAT_TK 52*8af74909SZhong Yang #define PLAT_TK 1 53*8af74909SZhong Yang 54*8af74909SZhong Yang #elif defined(GTK) 55*8af74909SZhong Yang #undef PLAT_GTK 56*8af74909SZhong Yang #define PLAT_GTK 1 57*8af74909SZhong Yang 58*8af74909SZhong Yang #if defined(__WIN32__) || defined(_MSC_VER) 59*8af74909SZhong Yang #undef PLAT_GTK_WIN32 60*8af74909SZhong Yang #define PLAT_GTK_WIN32 1 61*8af74909SZhong Yang #endif 62*8af74909SZhong Yang 63*8af74909SZhong Yang #if defined(__APPLE__) 64*8af74909SZhong Yang #undef PLAT_GTK_MACOSX 65*8af74909SZhong Yang #define PLAT_GTK_MACOSX 1 66*8af74909SZhong Yang #endif 67*8af74909SZhong Yang 68*8af74909SZhong Yang #elif defined(__APPLE__) 69*8af74909SZhong Yang 70*8af74909SZhong Yang #undef PLAT_MACOSX 71*8af74909SZhong Yang #define PLAT_MACOSX 1 72*8af74909SZhong Yang 73*8af74909SZhong Yang #else 74*8af74909SZhong Yang #undef PLAT_WIN 75*8af74909SZhong Yang #define PLAT_WIN 1 76*8af74909SZhong Yang 77*8af74909SZhong Yang #endif 78*8af74909SZhong Yang 79*8af74909SZhong Yang namespace Scintilla { 80*8af74909SZhong Yang 81*8af74909SZhong Yang typedef float XYPOSITION; 82*8af74909SZhong Yang typedef double XYACCUMULATOR; 83*8af74909SZhong Yang 84*8af74909SZhong Yang // Underlying the implementation of the platform classes are platform specific types. 85*8af74909SZhong Yang // Sometimes these need to be passed around by client code so they are defined here 86*8af74909SZhong Yang 87*8af74909SZhong Yang typedef void *FontID; 88*8af74909SZhong Yang typedef void *SurfaceID; 89*8af74909SZhong Yang typedef void *WindowID; 90*8af74909SZhong Yang typedef void *MenuID; 91*8af74909SZhong Yang typedef void *TickerID; 92*8af74909SZhong Yang typedef void *Function; 93*8af74909SZhong Yang typedef void *IdlerID; 94*8af74909SZhong Yang 95*8af74909SZhong Yang /** 96*8af74909SZhong Yang * A geometric point class. 97*8af74909SZhong Yang * Point is similar to the Win32 POINT and GTK+ GdkPoint types. 98*8af74909SZhong Yang */ 99*8af74909SZhong Yang class Point { 100*8af74909SZhong Yang public: 101*8af74909SZhong Yang XYPOSITION x; 102*8af74909SZhong Yang XYPOSITION y; 103*8af74909SZhong Yang x(x_)104*8af74909SZhong Yang constexpr explicit Point(XYPOSITION x_=0, XYPOSITION y_=0) noexcept : x(x_), y(y_) { 105*8af74909SZhong Yang } 106*8af74909SZhong Yang FromInts(int x_,int y_)107*8af74909SZhong Yang static constexpr Point FromInts(int x_, int y_) noexcept { 108*8af74909SZhong Yang return Point(static_cast<XYPOSITION>(x_), static_cast<XYPOSITION>(y_)); 109*8af74909SZhong Yang } 110*8af74909SZhong Yang 111*8af74909SZhong Yang constexpr bool operator!=(Point other) const noexcept { 112*8af74909SZhong Yang return (x != other.x) || (y != other.y); 113*8af74909SZhong Yang } 114*8af74909SZhong Yang 115*8af74909SZhong Yang constexpr Point operator+(Point other) const noexcept { 116*8af74909SZhong Yang return Point(x + other.x, y + other.y); 117*8af74909SZhong Yang } 118*8af74909SZhong Yang 119*8af74909SZhong Yang constexpr Point operator-(Point other) const noexcept { 120*8af74909SZhong Yang return Point(x - other.x, y - other.y); 121*8af74909SZhong Yang } 122*8af74909SZhong Yang 123*8af74909SZhong Yang // Other automatically defined methods (assignment, copy constructor, destructor) are fine 124*8af74909SZhong Yang }; 125*8af74909SZhong Yang 126*8af74909SZhong Yang /** 127*8af74909SZhong Yang * A geometric rectangle class. 128*8af74909SZhong Yang * PRectangle is similar to Win32 RECT. 129*8af74909SZhong Yang * PRectangles contain their top and left sides, but not their right and bottom sides. 130*8af74909SZhong Yang */ 131*8af74909SZhong Yang class PRectangle { 132*8af74909SZhong Yang public: 133*8af74909SZhong Yang XYPOSITION left; 134*8af74909SZhong Yang XYPOSITION top; 135*8af74909SZhong Yang XYPOSITION right; 136*8af74909SZhong Yang XYPOSITION bottom; 137*8af74909SZhong Yang 138*8af74909SZhong Yang constexpr explicit PRectangle(XYPOSITION left_=0, XYPOSITION top_=0, XYPOSITION right_=0, XYPOSITION bottom_ = 0) noexcept : left(left_)139*8af74909SZhong Yang left(left_), top(top_), right(right_), bottom(bottom_) { 140*8af74909SZhong Yang } 141*8af74909SZhong Yang FromInts(int left_,int top_,int right_,int bottom_)142*8af74909SZhong Yang static constexpr PRectangle FromInts(int left_, int top_, int right_, int bottom_) noexcept { 143*8af74909SZhong Yang return PRectangle(static_cast<XYPOSITION>(left_), static_cast<XYPOSITION>(top_), 144*8af74909SZhong Yang static_cast<XYPOSITION>(right_), static_cast<XYPOSITION>(bottom_)); 145*8af74909SZhong Yang } 146*8af74909SZhong Yang 147*8af74909SZhong Yang // Other automatically defined methods (assignment, copy constructor, destructor) are fine 148*8af74909SZhong Yang 149*8af74909SZhong Yang constexpr bool operator==(const PRectangle &rc) const noexcept { 150*8af74909SZhong Yang return (rc.left == left) && (rc.right == right) && 151*8af74909SZhong Yang (rc.top == top) && (rc.bottom == bottom); 152*8af74909SZhong Yang } Contains(Point pt)153*8af74909SZhong Yang constexpr bool Contains(Point pt) const noexcept { 154*8af74909SZhong Yang return (pt.x >= left) && (pt.x <= right) && 155*8af74909SZhong Yang (pt.y >= top) && (pt.y <= bottom); 156*8af74909SZhong Yang } ContainsWholePixel(Point pt)157*8af74909SZhong Yang constexpr bool ContainsWholePixel(Point pt) const noexcept { 158*8af74909SZhong Yang // Does the rectangle contain all of the pixel to left/below the point 159*8af74909SZhong Yang return (pt.x >= left) && ((pt.x+1) <= right) && 160*8af74909SZhong Yang (pt.y >= top) && ((pt.y+1) <= bottom); 161*8af74909SZhong Yang } Contains(PRectangle rc)162*8af74909SZhong Yang constexpr bool Contains(PRectangle rc) const noexcept { 163*8af74909SZhong Yang return (rc.left >= left) && (rc.right <= right) && 164*8af74909SZhong Yang (rc.top >= top) && (rc.bottom <= bottom); 165*8af74909SZhong Yang } Intersects(PRectangle other)166*8af74909SZhong Yang constexpr bool Intersects(PRectangle other) const noexcept { 167*8af74909SZhong Yang return (right > other.left) && (left < other.right) && 168*8af74909SZhong Yang (bottom > other.top) && (top < other.bottom); 169*8af74909SZhong Yang } Move(XYPOSITION xDelta,XYPOSITION yDelta)170*8af74909SZhong Yang void Move(XYPOSITION xDelta, XYPOSITION yDelta) noexcept { 171*8af74909SZhong Yang left += xDelta; 172*8af74909SZhong Yang top += yDelta; 173*8af74909SZhong Yang right += xDelta; 174*8af74909SZhong Yang bottom += yDelta; 175*8af74909SZhong Yang } Width()176*8af74909SZhong Yang constexpr XYPOSITION Width() const noexcept { return right - left; } Height()177*8af74909SZhong Yang constexpr XYPOSITION Height() const noexcept { return bottom - top; } Empty()178*8af74909SZhong Yang constexpr bool Empty() const noexcept { 179*8af74909SZhong Yang return (Height() <= 0) || (Width() <= 0); 180*8af74909SZhong Yang } 181*8af74909SZhong Yang }; 182*8af74909SZhong Yang 183*8af74909SZhong Yang /** 184*8af74909SZhong Yang * Holds an RGB colour with 8 bits for each component. 185*8af74909SZhong Yang */ 186*8af74909SZhong Yang constexpr const float componentMaximum = 255.0f; 187*8af74909SZhong Yang class ColourDesired { 188*8af74909SZhong Yang int co; 189*8af74909SZhong Yang public: co(co_)190*8af74909SZhong Yang constexpr explicit ColourDesired(int co_=0) noexcept : co(co_) { 191*8af74909SZhong Yang } 192*8af74909SZhong Yang ColourDesired(unsigned int red,unsigned int green,unsigned int blue)193*8af74909SZhong Yang constexpr ColourDesired(unsigned int red, unsigned int green, unsigned int blue) noexcept : 194*8af74909SZhong Yang co(red | (green << 8) | (blue << 16)) { 195*8af74909SZhong Yang } 196*8af74909SZhong Yang 197*8af74909SZhong Yang constexpr bool operator==(const ColourDesired &other) const noexcept { 198*8af74909SZhong Yang return co == other.co; 199*8af74909SZhong Yang } 200*8af74909SZhong Yang AsInteger()201*8af74909SZhong Yang constexpr int AsInteger() const noexcept { 202*8af74909SZhong Yang return co; 203*8af74909SZhong Yang } 204*8af74909SZhong Yang 205*8af74909SZhong Yang // Red, green and blue values as bytes 0..255 GetRed()206*8af74909SZhong Yang constexpr unsigned char GetRed() const noexcept { 207*8af74909SZhong Yang return co & 0xff; 208*8af74909SZhong Yang } GetGreen()209*8af74909SZhong Yang constexpr unsigned char GetGreen() const noexcept { 210*8af74909SZhong Yang return (co >> 8) & 0xff; 211*8af74909SZhong Yang } GetBlue()212*8af74909SZhong Yang constexpr unsigned char GetBlue() const noexcept { 213*8af74909SZhong Yang return (co >> 16) & 0xff; 214*8af74909SZhong Yang } 215*8af74909SZhong Yang 216*8af74909SZhong Yang // Red, green and blue values as float 0..1.0 GetRedComponent()217*8af74909SZhong Yang constexpr float GetRedComponent() const noexcept { 218*8af74909SZhong Yang return GetRed() / componentMaximum; 219*8af74909SZhong Yang } GetGreenComponent()220*8af74909SZhong Yang constexpr float GetGreenComponent() const noexcept { 221*8af74909SZhong Yang return GetGreen() / componentMaximum; 222*8af74909SZhong Yang } GetBlueComponent()223*8af74909SZhong Yang constexpr float GetBlueComponent() const noexcept { 224*8af74909SZhong Yang return GetBlue() / componentMaximum; 225*8af74909SZhong Yang } 226*8af74909SZhong Yang }; 227*8af74909SZhong Yang 228*8af74909SZhong Yang /** 229*8af74909SZhong Yang * Holds an RGBA colour. 230*8af74909SZhong Yang */ 231*8af74909SZhong Yang class ColourAlpha : public ColourDesired { 232*8af74909SZhong Yang public: ColourDesired(co_)233*8af74909SZhong Yang constexpr explicit ColourAlpha(int co_ = 0) noexcept : ColourDesired(co_) { 234*8af74909SZhong Yang } 235*8af74909SZhong Yang ColourAlpha(unsigned int red,unsigned int green,unsigned int blue)236*8af74909SZhong Yang constexpr ColourAlpha(unsigned int red, unsigned int green, unsigned int blue) noexcept : 237*8af74909SZhong Yang ColourDesired(red | (green << 8) | (blue << 16)) { 238*8af74909SZhong Yang } 239*8af74909SZhong Yang ColourAlpha(unsigned int red,unsigned int green,unsigned int blue,unsigned int alpha)240*8af74909SZhong Yang constexpr ColourAlpha(unsigned int red, unsigned int green, unsigned int blue, unsigned int alpha) noexcept : 241*8af74909SZhong Yang ColourDesired(red | (green << 8) | (blue << 16) | (alpha << 24)) { 242*8af74909SZhong Yang } 243*8af74909SZhong Yang ColourAlpha(ColourDesired cd,unsigned int alpha)244*8af74909SZhong Yang constexpr ColourAlpha(ColourDesired cd, unsigned int alpha) noexcept : 245*8af74909SZhong Yang ColourDesired(cd.AsInteger() | (alpha << 24)) { 246*8af74909SZhong Yang } 247*8af74909SZhong Yang GetColour()248*8af74909SZhong Yang constexpr ColourDesired GetColour() const noexcept { 249*8af74909SZhong Yang return ColourDesired(AsInteger() & 0xffffff); 250*8af74909SZhong Yang } 251*8af74909SZhong Yang GetAlpha()252*8af74909SZhong Yang constexpr unsigned char GetAlpha() const noexcept { 253*8af74909SZhong Yang return (AsInteger() >> 24) & 0xff; 254*8af74909SZhong Yang } 255*8af74909SZhong Yang GetAlphaComponent()256*8af74909SZhong Yang constexpr float GetAlphaComponent() const noexcept { 257*8af74909SZhong Yang return GetAlpha() / componentMaximum; 258*8af74909SZhong Yang } 259*8af74909SZhong Yang MixedWith(ColourAlpha other)260*8af74909SZhong Yang constexpr ColourAlpha MixedWith(ColourAlpha other) const noexcept { 261*8af74909SZhong Yang const unsigned int red = (GetRed() + other.GetRed()) / 2; 262*8af74909SZhong Yang const unsigned int green = (GetGreen() + other.GetGreen()) / 2; 263*8af74909SZhong Yang const unsigned int blue = (GetBlue() + other.GetBlue()) / 2; 264*8af74909SZhong Yang const unsigned int alpha = (GetAlpha() + other.GetAlpha()) / 2; 265*8af74909SZhong Yang return ColourAlpha(red, green, blue, alpha); 266*8af74909SZhong Yang } 267*8af74909SZhong Yang }; 268*8af74909SZhong Yang 269*8af74909SZhong Yang /** 270*8af74909SZhong Yang * Holds an element of a gradient with an RGBA colour and a relative position. 271*8af74909SZhong Yang */ 272*8af74909SZhong Yang class ColourStop { 273*8af74909SZhong Yang public: 274*8af74909SZhong Yang float position; 275*8af74909SZhong Yang ColourAlpha colour; ColourStop(float position_,ColourAlpha colour_)276*8af74909SZhong Yang ColourStop(float position_, ColourAlpha colour_) noexcept : 277*8af74909SZhong Yang position(position_), colour(colour_) { 278*8af74909SZhong Yang } 279*8af74909SZhong Yang }; 280*8af74909SZhong Yang 281*8af74909SZhong Yang /** 282*8af74909SZhong Yang * Font management. 283*8af74909SZhong Yang */ 284*8af74909SZhong Yang 285*8af74909SZhong Yang struct FontParameters { 286*8af74909SZhong Yang const char *faceName; 287*8af74909SZhong Yang float size; 288*8af74909SZhong Yang int weight; 289*8af74909SZhong Yang bool italic; 290*8af74909SZhong Yang int extraFontFlag; 291*8af74909SZhong Yang int technology; 292*8af74909SZhong Yang int characterSet; 293*8af74909SZhong Yang 294*8af74909SZhong Yang FontParameters( 295*8af74909SZhong Yang const char *faceName_, 296*8af74909SZhong Yang float size_=10, 297*8af74909SZhong Yang int weight_=400, 298*8af74909SZhong Yang bool italic_=false, 299*8af74909SZhong Yang int extraFontFlag_=0, 300*8af74909SZhong Yang int technology_=0, 301*8af74909SZhong Yang int characterSet_=0) noexcept : 302*8af74909SZhong Yang faceNameFontParameters303*8af74909SZhong Yang faceName(faceName_), 304*8af74909SZhong Yang size(size_), 305*8af74909SZhong Yang weight(weight_), 306*8af74909SZhong Yang italic(italic_), 307*8af74909SZhong Yang extraFontFlag(extraFontFlag_), 308*8af74909SZhong Yang technology(technology_), 309*8af74909SZhong Yang characterSet(characterSet_) 310*8af74909SZhong Yang { 311*8af74909SZhong Yang } 312*8af74909SZhong Yang 313*8af74909SZhong Yang }; 314*8af74909SZhong Yang 315*8af74909SZhong Yang class Font { 316*8af74909SZhong Yang protected: 317*8af74909SZhong Yang FontID fid; 318*8af74909SZhong Yang public: 319*8af74909SZhong Yang Font() noexcept; 320*8af74909SZhong Yang // Deleted so Font objects can not be copied 321*8af74909SZhong Yang Font(const Font &) = delete; 322*8af74909SZhong Yang Font(Font &&) = delete; 323*8af74909SZhong Yang Font &operator=(const Font &) = delete; 324*8af74909SZhong Yang Font &operator=(Font &&) = delete; 325*8af74909SZhong Yang virtual ~Font(); 326*8af74909SZhong Yang 327*8af74909SZhong Yang virtual void Create(const FontParameters &fp); 328*8af74909SZhong Yang virtual void Release(); 329*8af74909SZhong Yang GetID()330*8af74909SZhong Yang FontID GetID() const noexcept { return fid; } 331*8af74909SZhong Yang // Alias another font - caller guarantees not to Release SetID(FontID fid_)332*8af74909SZhong Yang void SetID(FontID fid_) noexcept { fid = fid_; } 333*8af74909SZhong Yang friend class Surface; 334*8af74909SZhong Yang friend class SurfaceImpl; 335*8af74909SZhong Yang }; 336*8af74909SZhong Yang 337*8af74909SZhong Yang class IScreenLine { 338*8af74909SZhong Yang public: 339*8af74909SZhong Yang virtual std::string_view Text() const = 0; 340*8af74909SZhong Yang virtual size_t Length() const = 0; 341*8af74909SZhong Yang virtual size_t RepresentationCount() const = 0; 342*8af74909SZhong Yang virtual XYPOSITION Width() const = 0; 343*8af74909SZhong Yang virtual XYPOSITION Height() const = 0; 344*8af74909SZhong Yang virtual XYPOSITION TabWidth() const = 0; 345*8af74909SZhong Yang virtual XYPOSITION TabWidthMinimumPixels() const = 0; 346*8af74909SZhong Yang virtual const Font *FontOfPosition(size_t position) const = 0; 347*8af74909SZhong Yang virtual XYPOSITION RepresentationWidth(size_t position) const = 0; 348*8af74909SZhong Yang virtual XYPOSITION TabPositionAfter(XYPOSITION xPosition) const = 0; 349*8af74909SZhong Yang }; 350*8af74909SZhong Yang 351*8af74909SZhong Yang struct Interval { 352*8af74909SZhong Yang XYPOSITION left; 353*8af74909SZhong Yang XYPOSITION right; 354*8af74909SZhong Yang }; 355*8af74909SZhong Yang 356*8af74909SZhong Yang class IScreenLineLayout { 357*8af74909SZhong Yang public: 358*8af74909SZhong Yang virtual ~IScreenLineLayout() = default; 359*8af74909SZhong Yang virtual size_t PositionFromX(XYPOSITION xDistance, bool charPosition) = 0; 360*8af74909SZhong Yang virtual XYPOSITION XFromPosition(size_t caretPosition) = 0; 361*8af74909SZhong Yang virtual std::vector<Interval> FindRangeIntervals(size_t start, size_t end) = 0; 362*8af74909SZhong Yang }; 363*8af74909SZhong Yang 364*8af74909SZhong Yang /** 365*8af74909SZhong Yang * A surface abstracts a place to draw. 366*8af74909SZhong Yang */ 367*8af74909SZhong Yang class Surface { 368*8af74909SZhong Yang public: 369*8af74909SZhong Yang Surface() noexcept = default; 370*8af74909SZhong Yang Surface(const Surface &) = delete; 371*8af74909SZhong Yang Surface(Surface &&) = delete; 372*8af74909SZhong Yang Surface &operator=(const Surface &) = delete; 373*8af74909SZhong Yang Surface &operator=(Surface &&) = delete; ~Surface()374*8af74909SZhong Yang virtual ~Surface() {} 375*8af74909SZhong Yang static Surface *Allocate(int technology); 376*8af74909SZhong Yang 377*8af74909SZhong Yang virtual void Init(WindowID wid)=0; 378*8af74909SZhong Yang virtual void Init(SurfaceID sid, WindowID wid)=0; 379*8af74909SZhong Yang virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0; 380*8af74909SZhong Yang 381*8af74909SZhong Yang virtual void Release()=0; 382*8af74909SZhong Yang virtual bool Initialised()=0; 383*8af74909SZhong Yang virtual void PenColour(ColourDesired fore)=0; 384*8af74909SZhong Yang virtual int LogPixelsY()=0; 385*8af74909SZhong Yang virtual int DeviceHeightFont(int points)=0; 386*8af74909SZhong Yang virtual void MoveTo(int x_, int y_)=0; 387*8af74909SZhong Yang virtual void LineTo(int x_, int y_)=0; 388*8af74909SZhong Yang virtual void Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back)=0; 389*8af74909SZhong Yang virtual void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back)=0; 390*8af74909SZhong Yang virtual void FillRectangle(PRectangle rc, ColourDesired back)=0; 391*8af74909SZhong Yang virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0; 392*8af74909SZhong Yang virtual void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back)=0; 393*8af74909SZhong Yang virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill, 394*8af74909SZhong Yang ColourDesired outline, int alphaOutline, int flags)=0; 395*8af74909SZhong Yang enum class GradientOptions { leftToRight, topToBottom }; 396*8af74909SZhong Yang virtual void GradientRectangle(PRectangle rc, const std::vector<ColourStop> &stops, GradientOptions options)=0; 397*8af74909SZhong Yang virtual void DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) = 0; 398*8af74909SZhong Yang virtual void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back)=0; 399*8af74909SZhong Yang virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0; 400*8af74909SZhong Yang 401*8af74909SZhong Yang virtual std::unique_ptr<IScreenLineLayout> Layout(const IScreenLine *screenLine) = 0; 402*8af74909SZhong Yang 403*8af74909SZhong Yang virtual void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase, std::string_view text, ColourDesired fore, ColourDesired back) = 0; 404*8af74909SZhong Yang virtual void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase, std::string_view text, ColourDesired fore, ColourDesired back) = 0; 405*8af74909SZhong Yang virtual void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase, std::string_view text, ColourDesired fore) = 0; 406*8af74909SZhong Yang virtual void MeasureWidths(Font &font_, std::string_view text, XYPOSITION *positions) = 0; 407*8af74909SZhong Yang virtual XYPOSITION WidthText(Font &font_, std::string_view text) = 0; 408*8af74909SZhong Yang virtual XYPOSITION Ascent(Font &font_)=0; 409*8af74909SZhong Yang virtual XYPOSITION Descent(Font &font_)=0; 410*8af74909SZhong Yang virtual XYPOSITION InternalLeading(Font &font_)=0; 411*8af74909SZhong Yang virtual XYPOSITION Height(Font &font_)=0; 412*8af74909SZhong Yang virtual XYPOSITION AverageCharWidth(Font &font_)=0; 413*8af74909SZhong Yang 414*8af74909SZhong Yang virtual void SetClip(PRectangle rc)=0; 415*8af74909SZhong Yang virtual void FlushCachedState()=0; 416*8af74909SZhong Yang 417*8af74909SZhong Yang virtual void SetUnicodeMode(bool unicodeMode_)=0; 418*8af74909SZhong Yang virtual void SetDBCSMode(int codePage)=0; 419*8af74909SZhong Yang virtual void SetBidiR2L(bool bidiR2L_)=0; 420*8af74909SZhong Yang }; 421*8af74909SZhong Yang 422*8af74909SZhong Yang /** 423*8af74909SZhong Yang * Class to hide the details of window manipulation. 424*8af74909SZhong Yang * Does not own the window which will normally have a longer life than this object. 425*8af74909SZhong Yang */ 426*8af74909SZhong Yang class Window { 427*8af74909SZhong Yang protected: 428*8af74909SZhong Yang WindowID wid; 429*8af74909SZhong Yang public: Window()430*8af74909SZhong Yang Window() noexcept : wid(nullptr), cursorLast(cursorInvalid) { 431*8af74909SZhong Yang } 432*8af74909SZhong Yang Window(const Window &source) = delete; 433*8af74909SZhong Yang Window(Window &&) = delete; 434*8af74909SZhong Yang Window &operator=(WindowID wid_) noexcept { 435*8af74909SZhong Yang wid = wid_; 436*8af74909SZhong Yang cursorLast = cursorInvalid; 437*8af74909SZhong Yang return *this; 438*8af74909SZhong Yang } 439*8af74909SZhong Yang Window &operator=(const Window &) = delete; 440*8af74909SZhong Yang Window &operator=(Window &&) = delete; 441*8af74909SZhong Yang virtual ~Window(); GetID()442*8af74909SZhong Yang WindowID GetID() const noexcept { return wid; } Created()443*8af74909SZhong Yang bool Created() const noexcept { return wid != nullptr; } 444*8af74909SZhong Yang void Destroy(); 445*8af74909SZhong Yang PRectangle GetPosition() const; 446*8af74909SZhong Yang void SetPosition(PRectangle rc); 447*8af74909SZhong Yang void SetPositionRelative(PRectangle rc, const Window *relativeTo); 448*8af74909SZhong Yang PRectangle GetClientPosition() const; 449*8af74909SZhong Yang void Show(bool show=true); 450*8af74909SZhong Yang void InvalidateAll(); 451*8af74909SZhong Yang void InvalidateRectangle(PRectangle rc); 452*8af74909SZhong Yang virtual void SetFont(Font &font); 453*8af74909SZhong Yang enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand }; 454*8af74909SZhong Yang void SetCursor(Cursor curs); 455*8af74909SZhong Yang PRectangle GetMonitorRect(Point pt); 456*8af74909SZhong Yang private: 457*8af74909SZhong Yang Cursor cursorLast; 458*8af74909SZhong Yang }; 459*8af74909SZhong Yang 460*8af74909SZhong Yang /** 461*8af74909SZhong Yang * Listbox management. 462*8af74909SZhong Yang */ 463*8af74909SZhong Yang 464*8af74909SZhong Yang // ScintillaBase implements IListBoxDelegate to receive ListBoxEvents from a ListBox 465*8af74909SZhong Yang 466*8af74909SZhong Yang struct ListBoxEvent { 467*8af74909SZhong Yang enum class EventType { selectionChange, doubleClick } event; ListBoxEventListBoxEvent468*8af74909SZhong Yang ListBoxEvent(EventType event_) noexcept : event(event_) { 469*8af74909SZhong Yang } 470*8af74909SZhong Yang }; 471*8af74909SZhong Yang 472*8af74909SZhong Yang class IListBoxDelegate { 473*8af74909SZhong Yang public: 474*8af74909SZhong Yang virtual void ListNotify(ListBoxEvent *plbe)=0; 475*8af74909SZhong Yang }; 476*8af74909SZhong Yang 477*8af74909SZhong Yang class ListBox : public Window { 478*8af74909SZhong Yang public: 479*8af74909SZhong Yang ListBox() noexcept; 480*8af74909SZhong Yang ~ListBox() override; 481*8af74909SZhong Yang static ListBox *Allocate(); 482*8af74909SZhong Yang 483*8af74909SZhong Yang void SetFont(Font &font) override =0; 484*8af74909SZhong Yang virtual void Create(Window &parent, int ctrlID, Point location, int lineHeight_, bool unicodeMode_, int technology_)=0; 485*8af74909SZhong Yang virtual void SetAverageCharWidth(int width)=0; 486*8af74909SZhong Yang virtual void SetVisibleRows(int rows)=0; 487*8af74909SZhong Yang virtual int GetVisibleRows() const=0; 488*8af74909SZhong Yang virtual PRectangle GetDesiredRect()=0; 489*8af74909SZhong Yang virtual int CaretFromEdge()=0; 490*8af74909SZhong Yang virtual void Clear()=0; 491*8af74909SZhong Yang virtual void Append(char *s, int type = -1)=0; 492*8af74909SZhong Yang virtual int Length()=0; 493*8af74909SZhong Yang virtual void Select(int n)=0; 494*8af74909SZhong Yang virtual int GetSelection()=0; 495*8af74909SZhong Yang virtual int Find(const char *prefix)=0; 496*8af74909SZhong Yang virtual void GetValue(int n, char *value, int len)=0; 497*8af74909SZhong Yang virtual void RegisterImage(int type, const char *xpm_data)=0; 498*8af74909SZhong Yang virtual void RegisterRGBAImage(int type, int width, int height, const unsigned char *pixelsImage) = 0; 499*8af74909SZhong Yang virtual void ClearRegisteredImages()=0; 500*8af74909SZhong Yang virtual void SetDelegate(IListBoxDelegate *lbDelegate)=0; 501*8af74909SZhong Yang virtual void SetList(const char* list, char separator, char typesep)=0; 502*8af74909SZhong Yang }; 503*8af74909SZhong Yang 504*8af74909SZhong Yang /** 505*8af74909SZhong Yang * Menu management. 506*8af74909SZhong Yang */ 507*8af74909SZhong Yang class Menu { 508*8af74909SZhong Yang MenuID mid; 509*8af74909SZhong Yang public: 510*8af74909SZhong Yang Menu() noexcept; GetID()511*8af74909SZhong Yang MenuID GetID() const noexcept { return mid; } 512*8af74909SZhong Yang void CreatePopUp(); 513*8af74909SZhong Yang void Destroy(); 514*8af74909SZhong Yang void Show(Point pt, Window &w); 515*8af74909SZhong Yang }; 516*8af74909SZhong Yang 517*8af74909SZhong Yang /** 518*8af74909SZhong Yang * Dynamic Library (DLL/SO/...) loading 519*8af74909SZhong Yang */ 520*8af74909SZhong Yang class DynamicLibrary { 521*8af74909SZhong Yang public: 522*8af74909SZhong Yang virtual ~DynamicLibrary() = default; 523*8af74909SZhong Yang 524*8af74909SZhong Yang /// @return Pointer to function "name", or NULL on failure. 525*8af74909SZhong Yang virtual Function FindFunction(const char *name) = 0; 526*8af74909SZhong Yang 527*8af74909SZhong Yang /// @return true if the library was loaded successfully. 528*8af74909SZhong Yang virtual bool IsValid() = 0; 529*8af74909SZhong Yang 530*8af74909SZhong Yang /// @return An instance of a DynamicLibrary subclass with "modulePath" loaded. 531*8af74909SZhong Yang static DynamicLibrary *Load(const char *modulePath); 532*8af74909SZhong Yang }; 533*8af74909SZhong Yang 534*8af74909SZhong Yang #if defined(__clang__) 535*8af74909SZhong Yang # if __has_feature(attribute_analyzer_noreturn) 536*8af74909SZhong Yang # define CLANG_ANALYZER_NORETURN __attribute__((analyzer_noreturn)) 537*8af74909SZhong Yang # else 538*8af74909SZhong Yang # define CLANG_ANALYZER_NORETURN 539*8af74909SZhong Yang # endif 540*8af74909SZhong Yang #else 541*8af74909SZhong Yang # define CLANG_ANALYZER_NORETURN 542*8af74909SZhong Yang #endif 543*8af74909SZhong Yang 544*8af74909SZhong Yang /** 545*8af74909SZhong Yang * Platform class used to retrieve system wide parameters such as double click speed 546*8af74909SZhong Yang * and chrome colour. Not a creatable object, more of a module with several functions. 547*8af74909SZhong Yang */ 548*8af74909SZhong Yang class Platform { 549*8af74909SZhong Yang public: 550*8af74909SZhong Yang Platform() = default; 551*8af74909SZhong Yang Platform(const Platform &) = delete; 552*8af74909SZhong Yang Platform(Platform &&) = delete; 553*8af74909SZhong Yang Platform &operator=(const Platform &) = delete; 554*8af74909SZhong Yang Platform &operator=(Platform &&) = delete; 555*8af74909SZhong Yang ~Platform() = default; 556*8af74909SZhong Yang static ColourDesired Chrome(); 557*8af74909SZhong Yang static ColourDesired ChromeHighlight(); 558*8af74909SZhong Yang static const char *DefaultFont(); 559*8af74909SZhong Yang static int DefaultFontSize(); 560*8af74909SZhong Yang static unsigned int DoubleClickTime(); 561*8af74909SZhong Yang static void DebugDisplay(const char *s); LongFromTwoShorts(short a,short b)562*8af74909SZhong Yang static constexpr long LongFromTwoShorts(short a,short b) noexcept { 563*8af74909SZhong Yang return (a) | ((b) << 16); 564*8af74909SZhong Yang } 565*8af74909SZhong Yang 566*8af74909SZhong Yang static void DebugPrintf(const char *format, ...); 567*8af74909SZhong Yang static bool ShowAssertionPopUps(bool assertionPopUps_); 568*8af74909SZhong Yang static void Assert(const char *c, const char *file, int line) CLANG_ANALYZER_NORETURN; 569*8af74909SZhong Yang }; 570*8af74909SZhong Yang 571*8af74909SZhong Yang #ifdef NDEBUG 572*8af74909SZhong Yang #define PLATFORM_ASSERT(c) ((void)0) 573*8af74909SZhong Yang #else 574*8af74909SZhong Yang #define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Scintilla::Platform::Assert(#c, __FILE__, __LINE__)) 575*8af74909SZhong Yang #endif 576*8af74909SZhong Yang 577*8af74909SZhong Yang } 578*8af74909SZhong Yang 579*8af74909SZhong Yang #endif 580