// Scintilla source code edit control
-// Platform.h - interface to platform facilities
-// Also includes some basic utilities
-// Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows
-// Copyright 1998-2000 by Neil Hodgson <neilh@scintilla.org>
+/** @file Platform.h
+ ** Interface to platform facilities. Also includes some basic utilities.
+ ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows.
+ **/
+// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#ifndef PLATFORM_H
#define PLATFORM_H
-// PLAT_GTK = GTK+ on Linux, PLAT_WIN = Win32 API on Win32 OS
+// PLAT_GTK = GTK+ on Linux or Win32
+// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32
+// PLAT_WIN = Win32 API on Win32 OS
// PLAT_WX is wxWindows on any supported platform
-// Could also have PLAT_GTKWIN = GTK+ on Win32 OS in future
#define PLAT_GTK 0
+#define PLAT_GTK_WIN32 0
#define PLAT_WIN 0
#define PLAT_WX 0
#undef PLAT_GTK
#define PLAT_GTK 1
+#ifdef _MSC_VER
+#undef PLAT_GTK_WIN32
+#define PLAT_GTK_WIN32 1
+#endif
+
#else
#undef PLAT_WIN
#define PLAT_WIN 1
// Include the main header for each platform
#if PLAT_GTK
+#ifdef _MSC_VER
+#pragma warning(disable: 4505 4514 4710 4800)
+#endif
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#endif
#define _WIN32_WINNT 0x0400 // Otherwise some required stuff gets ifdef'd out
// Vassili Bourdo: shut up annoying Visual C++ warnings:
#ifdef _MSC_VER
-#pragma warning(disable: 4800 4244 4309)
+#pragma warning(disable: 4244 4309 4710 4800)
#endif
#include <windows.h>
+#include <commctrl.h>
#include <richedit.h>
#endif
#include <wx/wx.h>
#endif
+#define ColourID scColourID
+#define FontID scFontID
+#define SurfaceID scSurfaceID
+#define WindowID scWindowID
+#define MenuID scMenuID
+#define Point scPoint
+#define PRectangle scPRectangle
+#define Colour scColour
+#define ColourPair scColourPair
+#define Window scWindow
+#define Palette scPalette
+#define Font scFont
+#define Surface scSurface
+#define Window scWindow
+#define ListBox scListBox
+#define Menu scMenu
+#define Platform scPlatform
+#define TextRange scTextRange
+#define KeyMap scKeyMap
+#define Style scStyle
+
+
// Underlying the implementation of the platform classes are platform specific types.
// Sometimes these need to be passed around by client code so they are defined here
typedef wxMenu* MenuID;
#endif
-#if PLAT_GTK || PLAT_WX
-#define SHIFT_PRESSED 1
-#define LEFT_CTRL_PRESSED 2
-#define LEFT_ALT_PRESSED 4
-#endif
-
-// Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably
-
+/**
+ * A geometric point class.
+ * Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably.
+ */
class Point {
public:
int x;
int y;
-
+
Point(int x_=0, int y_=0) : x(x_), y(y_) {
}
// Other automatically defined methods (assignment, copy constructor, destructor) are fine
-
+
static Point FromLong(long lpoint);
};
-// PRectangle is exactly the same as the Win32 RECT so can be used interchangeably
-// PRectangles contain their top and left sides, but not their right and bottom sides
+/**
+ * A geometric rectangle class.
+ * PRectangle is exactly the same as the Win32 RECT so can be used interchangeably.
+ * PRectangles contain their top and left sides, but not their right and bottom sides.
+ */
class PRectangle {
public:
int left;
// Other automatically defined methods (assignment, copy constructor, destructor) are fine
+ bool operator==(PRectangle &rc) {
+ return (rc.left == left) && (rc.right == right) &&
+ (rc.top == top) && (rc.bottom == bottom);
+ }
bool Contains(Point pt) {
return (pt.x >= left) && (pt.x <= right) &&
(pt.y >= top) && (pt.y <= bottom);
PRectangle PRectangleFromwxRect(wxRect rc);
#endif
+/**
+ * A colour class.
+ */
class Colour {
ColourID co;
public:
unsigned int GetRed();
unsigned int GetGreen();
unsigned int GetBlue();
-
+
friend class Surface;
friend class Palette;
};
-// Colour pairs hold a desired colour and the colour that the graphics engine
-// allocates to approximate the desired colour.
-// To make palette management more automatic, ColourPairs could register at
-// construction time with a palette management object.
+/**
+ * Colour pairs hold a desired colour and the colour that the graphics engine
+ * allocates to approximate the desired colour.
+ * To make palette management more automatic, ColourPairs could register at
+ * construction time with a palette management object.
+ */
struct ColourPair {
Colour desired;
Colour allocated;
class Window; // Forward declaration for Palette
+/**
+ * Colour palette management.
+ */
class Palette {
int used;
enum {numEntries = 100};
#endif
public:
bool allowRealization;
-
+
Palette();
~Palette();
void Release();
-
- // This method either adds a colour to the list of wanted colours (want==true)
- // or retrieves the allocated colour back to the ColourPair.
- // This is one method to make it easier to keep the code for wanting and retrieving in sync.
+
+ /**
+ * This method either adds a colour to the list of wanted colours (want==true)
+ * or retrieves the allocated colour back to the ColourPair.
+ * This is one method to make it easier to keep the code for wanting and retrieving in sync.
+ */
void WantFind(ColourPair &cp, bool want);
void Allocate(Window &w);
-
+
friend class Surface;
};
+/**
+ * Font management.
+ */
class Font {
+protected:
FontID id;
#if PLAT_WX
int ascent;
Font &operator=(const Font &) { id=0; return *this; }
public:
Font();
- ~Font();
+ virtual ~Font();
- void Create(const char *faceName, int size, bool bold=false, bool italic=false);
- void Release();
+ virtual void Create(const char *faceName, int characterSet, int size, bool bold, bool italic);
+ virtual void Release();
FontID GetID() { return id; }
+ // Alias another font - caller guarantees not to Release
+ void SetID(FontID id_) { id = id_; }
friend class Surface;
};
-// A surface abstracts a place to draw
+/**
+ * A surface abstracts a place to draw.
+ */
class Surface {
private:
+ bool unicodeMode;
#if PLAT_GTK
GdkDrawable *drawable;
GdkGC *gc;
public:
Surface();
~Surface();
-
+
void Init();
void Init(SurfaceID hdc_);
void InitPixMap(int width, int height, Surface *surface_);
bool Initialised();
void PenColour(Colour fore);
int LogPixelsY();
+ int DeviceHeightFont(int points);
void MoveTo(int x_, int y_);
void LineTo(int x_, int y_);
void Polygon(Point *pts, int npts, Colour fore, Colour back);
int ExternalLeading(Font &font_);
int Height(Font &font_);
int AverageCharWidth(Font &font_);
-
+
int SetPalette(Palette *pal, bool inBackGround);
void SetClip(PRectangle rc);
+ void FlushCachedState();
+
+ void SetUnicodeMode(bool unicodeMode_) {
+ unicodeMode=unicodeMode_;
+ }
};
-// Class to hide the details of window manipulation
-// Does not own the window which will normally have a longer life than this object
+/**
+ * Class to hide the details of window manipulation.
+ * Does not own the window which will normally have a longer life than this object.
+ */
class Window {
friend class ListBox;
protected:
WindowID id;
public:
Window() : id(0) {}
+ Window(const Window &source) : id(source.id) {}
virtual ~Window();
Window &operator=(WindowID id_) {
id = id_;
void Show(bool show=true);
void InvalidateAll();
void InvalidateRectangle(PRectangle rc);
- void SetFont(Font &font);
+ virtual void SetFont(Font &font);
enum Cursor { cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow };
void SetCursor(Cursor curs);
void SetTitle(const char *s);
#endif
};
+/**
+ * Listbox management.
+ */
class ListBox : public Window {
#if PLAT_GTK
WindowID list;
WindowID scroller;
int current;
#endif
+ int desiredVisibleRows;
+ unsigned int maxItemCharacters;
+ unsigned int aveCharWidth;
public:
ListBox();
virtual ~ListBox();
- ListBox &operator=(WindowID id_) {
- id = id_;
- return *this;
- }
void Create(Window &parent, int ctrlID);
+ virtual void SetFont(Font &font);
+ void SetAverageCharWidth(int width);
+ void SetVisibleRows(int rows);
+ PRectangle GetDesiredRect();
void Clear();
void Append(char *s);
int Length();
void Sort();
};
+/**
+ * Menu management.
+ */
class Menu {
MenuID id;
public:
void Show(Point pt, Window &w);
};
-// Platform class used to retrieve system wide parameters such as double click speed
-// and chrome colour. Not a creatable object, more of a module with several functions.
+/**
+ * Platform class used to retrieve system wide parameters such as double click speed
+ * and chrome colour. Not a creatable object, more of a module with several functions.
+ */
class Platform {
// Private so Platform objects can not be copied
Platform(const Platform &) {}
static bool IsKeyDown(int key);
static long SendScintilla(
WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0);
-
+
// These are utility functions not really tied to a platform
static int Minimum(int a, int b);
static int Maximum(int a, int b);
+ // Next three assume 16 bit shorts and 32 bit longs
+ static long LongFromTwoShorts(short a,short b) {
+ return (a) | ((b) << 16);
+ }
+ static short HighShortFromLong(long x) {
+ return static_cast<short>(x >> 16);
+ }
+ static short LowShortFromLong(long x) {
+ return static_cast<short>(x & 0xffff);
+ }
static void DebugPrintf(const char *format, ...);
+ static bool ShowAssertionPopUps(bool assertionPopUps_);
+ static void Assert(const char *c, const char *file, int line);
static int Clamp(int val, int minVal, int maxVal);
};
+#ifdef NDEBUG
+#define PLATFORM_ASSERT(c) ((void)0)
+#else
+#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__))
+#endif
+
#endif