X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/67879c5b4197a9ec278a24b44806b896d61982b4..0015757fecd9eca06336af8c10e900589c34cbea:/src/stc/PlatWX.cpp diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index ab2cb5c06a..af67c0cdaa 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -4,9 +4,27 @@ // Robin Dunn // The License.txt file describes the conditions under which this software may be distributed. +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_STC + +#ifndef WX_PRECOMP + #include "wx/menu.h" + #include "wx/dcmemory.h" + #include "wx/settings.h" +#endif // WX_PRECOMP + #include -#include "wx/wx.h" +#if wxUSE_DISPLAY +#include "wx/display.h" +#endif + #include "wx/encconv.h" #include "wx/listctrl.h" #include "wx/mstream.h" @@ -14,14 +32,17 @@ #include "wx/imaglist.h" #include "wx/tokenzr.h" -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP #include "wx/rawbmp.h" #endif +#if wxUSE_GRAPHICS_CONTEXT +#include "wx/dcgraph.h" +#endif #include "Platform.h" #include "PlatWX.h" #include "wx/stc/stc.h" - +#include "wx/stc/private.h" Point Point::FromLong(long lpoint) { @@ -39,116 +60,65 @@ PRectangle PRectangleFromwxRect(wxRect rc) { rc.GetRight()+1, rc.GetBottom()+1); } -wxColour wxColourFromCA(const ColourAllocated& ca) { - ColourDesired cd(ca.AsLong()); +wxColour wxColourFromCD(ColourDesired& cd) { return wxColour((unsigned char)cd.GetRed(), (unsigned char)cd.GetGreen(), (unsigned char)cd.GetBlue()); } -//---------------------------------------------------------------------- - -Palette::Palette() { - used = 0; - allowRealization = false; - size = 100; - entries = new ColourPair[size]; -} - -Palette::~Palette() { - Release(); - delete [] entries; - entries = 0; -} - -void Palette::Release() { - used = 0; - delete [] entries; - size = 100; - entries = new ColourPair[size]; -} - -// 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 Palette::WantFind(ColourPair &cp, bool want) { - if (want) { - for (int i=0; i < used; i++) { - if (entries[i].desired == cp.desired) - return; - } - - if (used >= size) { - int sizeNew = size * 2; - ColourPair *entriesNew = new ColourPair[sizeNew]; - for (int j=0; jSetNoAntiAliasing(!extraFontFlag); - id = font; + wxFontWeight weight; + if (fp.weight <= 300) + weight = wxFONTWEIGHT_LIGHT; + else if (fp.weight >= 700) + weight = wxFONTWEIGHT_BOLD; + else + weight = wxFONTWEIGHT_NORMAL; + + wxFont* font = new wxFont(fp.size, + wxFONTFAMILY_DEFAULT, + fp.italic ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL, + weight, + false, + stc2wx(fp.faceName), + encoding); + fid = font; } void Font::Release() { - if (id) - delete (wxFont*)id; - id = 0; + if (fid) + delete (wxFont*)fid; + fid = 0; } //---------------------------------------------------------------------- @@ -172,42 +142,43 @@ public: virtual void Release(); virtual bool Initialised(); - virtual void PenColour(ColourAllocated fore); + virtual void PenColour(ColourDesired fore); virtual int LogPixelsY(); virtual int DeviceHeightFont(int points); virtual void MoveTo(int x_, int y_); virtual void LineTo(int x_, int y_); - virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back); - virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back); - virtual void FillRectangle(PRectangle rc, ColourAllocated back); + virtual void Polygon(Point *pts, int npts, ColourDesired fore, ColourDesired back); + virtual void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back); + virtual void FillRectangle(PRectangle rc, ColourDesired back); virtual void FillRectangle(PRectangle rc, Surface &surfacePattern); - virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back); - virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, - ColourAllocated outline, int alphaOutline, int flags); - virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back); + virtual void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back); + virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill, + ColourDesired outline, int alphaOutline, int flags); + virtual void DrawRGBAImage(PRectangle rc, int width, int height, + const unsigned char *pixelsImage); + virtual void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back); virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource); - virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); - virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); - virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore); - virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions); - virtual int WidthText(Font &font_, const char *s, int len); - virtual int WidthChar(Font &font_, char ch); - virtual int Ascent(Font &font_); - virtual int Descent(Font &font_); - virtual int InternalLeading(Font &font_); - virtual int ExternalLeading(Font &font_); - virtual int Height(Font &font_); - virtual int AverageCharWidth(Font &font_); - - virtual int SetPalette(Palette *pal, bool inBackGround); + virtual void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back); + virtual void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back); + virtual void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore); + virtual void MeasureWidths(Font &font_, const char *s, int len, XYPOSITION *positions); + virtual XYPOSITION WidthText(Font &font_, const char *s, int len); + virtual XYPOSITION WidthChar(Font &font_, char ch); + virtual XYPOSITION Ascent(Font &font_); + virtual XYPOSITION Descent(Font &font_); + virtual XYPOSITION InternalLeading(Font &font_); + virtual XYPOSITION ExternalLeading(Font &font_); + virtual XYPOSITION Height(Font &font_); + virtual XYPOSITION AverageCharWidth(Font &font_); + virtual void SetClip(PRectangle rc); virtual void FlushCachedState(); virtual void SetUnicodeMode(bool unicodeMode_); virtual void SetDBCSMode(int codePage); - void BrushColour(ColourAllocated back); + void BrushColour(ColourDesired back); void SetFont(Font &font_); }; @@ -270,12 +241,12 @@ bool SurfaceImpl::Initialised() { } -void SurfaceImpl::PenColour(ColourAllocated fore) { - hdc->SetPen(wxPen(wxColourFromCA(fore), 1, wxSOLID)); +void SurfaceImpl::PenColour(ColourDesired fore) { + hdc->SetPen(wxPen(wxColourFromCD(fore))); } -void SurfaceImpl::BrushColour(ColourAllocated back) { - hdc->SetBrush(wxBrush(wxColourFromCA(back), wxSOLID)); +void SurfaceImpl::BrushColour(ColourDesired back) { + hdc->SetBrush(wxBrush(wxColourFromCD(back))); } void SurfaceImpl::SetFont(Font &font_) { @@ -303,19 +274,26 @@ void SurfaceImpl::LineTo(int x_, int y_) { y = y_; } -void SurfaceImpl::Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back) { +void SurfaceImpl::Polygon(Point *pts, int npts, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); - hdc->DrawPolygon(npts, (wxPoint*)pts); + wxPoint *p = new wxPoint[npts]; + + for (int i=0; iDrawPolygon(npts, p); + delete [] p; } -void SurfaceImpl::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) { +void SurfaceImpl::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); hdc->DrawRectangle(wxRectFromPRectangle(rc)); } -void SurfaceImpl::FillRectangle(PRectangle rc, ColourAllocated back) { +void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back) { BrushColour(back); hdc->SetPen(*wxTRANSPARENT_PEN); hdc->DrawRectangle(wxRectFromPRectangle(rc)); @@ -326,88 +304,102 @@ void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) { if (((SurfaceImpl&)surfacePattern).bitmap) br = wxBrush(*((SurfaceImpl&)surfacePattern).bitmap); else // Something is wrong so display in red - br = wxBrush(*wxRED, wxSOLID); + br = wxBrush(*wxRED); hdc->SetPen(*wxTRANSPARENT_PEN); hdc->SetBrush(br); hdc->DrawRectangle(wxRectFromPRectangle(rc)); } -void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back) { +void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4); } -#ifdef __WXMSW__ +#if defined(__WXMSW__) || defined(__WXMAC__) #define wxPy_premultiply(p, a) ((p) * (a) / 0xff) #else #define wxPy_premultiply(p, a) (p) #endif void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, - ColourAllocated fill, int alphaFill, - ColourAllocated outline, int alphaOutline, + ColourDesired fill, int alphaFill, + ColourDesired outline, int alphaOutline, int /*flags*/) { -#ifdef wxHAVE_RAW_BITMAP +#if wxUSE_GRAPHICS_CONTEXT + wxGCDC dc(*(wxMemoryDC*)hdc); + wxColour penColour(wxColourFromCDandAlpha(outline, alphaOutline)); + wxColour brushColour(wxColourFromCDandAlpha(fill, alphaFill)); + dc.SetPen(wxPen(penColour)); + dc.SetBrush(wxBrush(brushColour)); + dc.DrawRoundedRectangle(wxRectFromPRectangle(rc), cornerSize); + return; +#else + +#ifdef wxHAS_RAW_BITMAP // TODO: do something with cornerSize wxUnusedVar(cornerSize); - + int x, y; wxRect r = wxRectFromPRectangle(rc); wxBitmap bmp(r.width, r.height, 32); - wxAlphaPixelData pixData(bmp); - pixData.UseAlpha(); - // Set the fill pixels - ColourDesired cdf(fill.AsLong()); - int red = cdf.GetRed(); - int green = cdf.GetGreen(); - int blue = cdf.GetBlue(); + // This block is needed to ensure that the changes done to the bitmap via + // pixel data object are committed before the bitmap is drawn. + { + wxAlphaPixelData pixData(bmp); + + // Set the fill pixels + ColourDesired cdf(fill.AsLong()); + int red = cdf.GetRed(); + int green = cdf.GetGreen(); + int blue = cdf.GetBlue(); + + wxAlphaPixelData::Iterator p(pixData); + for (y=0; yDrawBitmap(bmp, r.x, r.y, true); @@ -417,9 +409,49 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, wxUnusedVar(alphaOutline); RectangleDraw(rc, outline, fill); #endif +#endif } -void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) { +#ifdef wxHAS_RAW_BITMAP +wxBitmap BitmapFromRGBAImage(int width, int height, const unsigned char *pixelsImage) +{ + int x, y; + wxBitmap bmp(width, height, 32); + wxAlphaPixelData pixData(bmp); + + wxAlphaPixelData::Iterator p(pixData); + for (y=0; yDrawBitmap(bmp, r.x, r.y, true); +#endif +} + + +void SurfaceImpl::Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); hdc->DrawEllipse(wxRectFromPRectangle(rc)); @@ -432,12 +464,12 @@ void SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource) { from.x, from.y, wxCOPY); } -void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase, +void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, XYPOSITION ybase, const char *s, int len, - ColourAllocated fore, ColourAllocated back) { + ColourDesired fore, ColourDesired back) { SetFont(font); - hdc->SetTextForeground(wxColourFromCA(fore)); - hdc->SetTextBackground(wxColourFromCA(back)); + hdc->SetTextForeground(wxColourFromCD(fore)); + hdc->SetTextBackground(wxColourFromCD(back)); FillRectangle(rc, back); // ybase is where the baseline should be, but wxWin uses the upper left @@ -445,12 +477,12 @@ void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase, hdc->DrawText(stc2wx(s, len), rc.left, ybase - font.ascent); } -void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase, +void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, XYPOSITION ybase, const char *s, int len, - ColourAllocated fore, ColourAllocated back) { + ColourDesired fore, ColourDesired back) { SetFont(font); - hdc->SetTextForeground(wxColourFromCA(fore)); - hdc->SetTextBackground(wxColourFromCA(back)); + hdc->SetTextForeground(wxColourFromCD(fore)); + hdc->SetTextBackground(wxColourFromCD(back)); FillRectangle(rc, back); hdc->SetClippingRegion(wxRectFromPRectangle(rc)); @@ -460,23 +492,23 @@ void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase, } -void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, int ybase, +void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, XYPOSITION ybase, const char *s, int len, - ColourAllocated fore) { + ColourDesired fore) { SetFont(font); - hdc->SetTextForeground(wxColourFromCA(fore)); - hdc->SetBackgroundMode(wxTRANSPARENT); + hdc->SetTextForeground(wxColourFromCD(fore)); + hdc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); // ybase is where the baseline should be, but wxWin uses the upper left // corner, so I need to calculate the real position for the text... hdc->DrawText(stc2wx(s, len), rc.left, ybase - font.ascent); - hdc->SetBackgroundMode(wxSOLID); + hdc->SetBackgroundMode(wxBRUSHSTYLE_SOLID); } -void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) { +void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, XYPOSITION *positions) { wxString str = stc2wx(s, len); wxArrayInt tpos; @@ -507,7 +539,7 @@ void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positio #else // If not unicode then just use the widths we have -#if wxUSE_STL +#if wxUSE_STD_CONTAINERS std::copy(tpos.begin(), tpos.end(), positions); #else memcpy(positions, tpos.begin(), len * sizeof(int)); @@ -516,7 +548,7 @@ void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positio } -int SurfaceImpl::WidthText(Font &font, const char *s, int len) { +XYPOSITION SurfaceImpl::WidthText(Font &font, const char *s, int len) { SetFont(font); int w; int h; @@ -526,7 +558,7 @@ int SurfaceImpl::WidthText(Font &font, const char *s, int len) { } -int SurfaceImpl::WidthChar(Font &font, char ch) { +XYPOSITION SurfaceImpl::WidthChar(Font &font, char ch) { SetFont(font); int w; int h; @@ -538,7 +570,7 @@ int SurfaceImpl::WidthChar(Font &font, char ch) { #define EXTENT_TEST wxT(" `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") -int SurfaceImpl::Ascent(Font &font) { +XYPOSITION SurfaceImpl::Ascent(Font &font) { SetFont(font); int w, h, d, e; hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); @@ -546,38 +578,34 @@ int SurfaceImpl::Ascent(Font &font) { return font.ascent; } -int SurfaceImpl::Descent(Font &font) { +XYPOSITION SurfaceImpl::Descent(Font &font) { SetFont(font); int w, h, d, e; hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); return d; } -int SurfaceImpl::InternalLeading(Font &WXUNUSED(font)) { +XYPOSITION SurfaceImpl::InternalLeading(Font &WXUNUSED(font)) { return 0; } -int SurfaceImpl::ExternalLeading(Font &font) { +XYPOSITION SurfaceImpl::ExternalLeading(Font &font) { SetFont(font); int w, h, d, e; hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); return e; } -int SurfaceImpl::Height(Font &font) { +XYPOSITION SurfaceImpl::Height(Font &font) { SetFont(font); return hdc->GetCharHeight() + 1; } -int SurfaceImpl::AverageCharWidth(Font &font) { +XYPOSITION SurfaceImpl::AverageCharWidth(Font &font) { SetFont(font); return hdc->GetCharWidth(); } -int SurfaceImpl::SetPalette(Palette *WXUNUSED(pal), bool WXUNUSED(inBackGround)) { - return 0; -} - void SurfaceImpl::SetClip(PRectangle rc) { hdc->SetClippingRegion(wxRectFromPRectangle(rc)); } @@ -594,7 +622,7 @@ void SurfaceImpl::SetDBCSMode(int WXUNUSED(codePage)) { } -Surface *Surface::Allocate() { +Surface *Surface::Allocate(int WXUNUSED(technology)) { return new SurfaceImpl; } @@ -608,26 +636,26 @@ Window::~Window() { } void Window::Destroy() { - if (id) { + if (wid) { Show(false); - GETWIN(id)->Destroy(); + GETWIN(wid)->Destroy(); } - id = 0; + wid = 0; } bool Window::HasFocus() { - return wxWindow::FindFocus() == GETWIN(id); + return wxWindow::FindFocus() == GETWIN(wid); } PRectangle Window::GetPosition() { - if (! id) return PRectangle(); - wxRect rc(GETWIN(id)->GetPosition(), GETWIN(id)->GetSize()); + if (! wid) return PRectangle(); + wxRect rc(GETWIN(wid)->GetPosition(), GETWIN(wid)->GetSize()); return PRectangleFromwxRect(rc); } void Window::SetPosition(PRectangle rc) { wxRect r = wxRectFromPRectangle(rc); - GETWIN(id)->SetSize(r); + GETWIN(wid)->SetSize(r); } void Window::SetPositionRelative(PRectangle rc, Window) { @@ -635,30 +663,30 @@ void Window::SetPositionRelative(PRectangle rc, Window) { } PRectangle Window::GetClientPosition() { - if (! id) return PRectangle(); - wxSize sz = GETWIN(id)->GetClientSize(); + if (! wid) return PRectangle(); + wxSize sz = GETWIN(wid)->GetClientSize(); return PRectangle(0, 0, sz.x, sz.y); } void Window::Show(bool show) { - GETWIN(id)->Show(show); + GETWIN(wid)->Show(show); } void Window::InvalidateAll() { - GETWIN(id)->Refresh(false); + GETWIN(wid)->Refresh(false); } void Window::InvalidateRectangle(PRectangle rc) { wxRect r = wxRectFromPRectangle(rc); - GETWIN(id)->Refresh(false, &r); + GETWIN(wid)->Refresh(false, &r); } void Window::SetFont(Font &font) { - GETWIN(id)->SetFont(*((wxFont*)font.GetID())); + GETWIN(wid)->SetFont(*((wxFont*)font.GetID())); } void Window::SetCursor(Cursor curs) { - int cursorId; + wxStockCursor cursorId; switch (curs) { case cursorText: @@ -689,24 +717,36 @@ void Window::SetCursor(Cursor curs) { cursorId = wxCURSOR_ARROW; break; } -#ifdef __WXMOTIF__ - wxCursor wc = wxStockCursor(cursorId) ; -#else - wxCursor wc = wxCursor(cursorId) ; -#endif - if(curs != cursorLast) - { - GETWIN(id)->SetCursor(wc); - cursorLast = curs; - } + + wxCursor wc = wxCursor(cursorId); + if(curs != cursorLast) + { + GETWIN(wid)->SetCursor(wc); + cursorLast = curs; + } } void Window::SetTitle(const char *s) { - GETWIN(id)->SetLabel(stc2wx(s)); + GETWIN(wid)->SetLabel(stc2wx(s)); } +// Returns rectangle of monitor pt is on +PRectangle Window::GetMonitorRect(Point pt) { + wxRect rect; + if (! wid) return PRectangle(); +#if wxUSE_DISPLAY + // Get the display the point is found on + int n = wxDisplay::GetFromPoint(wxPoint(pt.x, pt.y)); + wxDisplay dpy(n == wxNOT_FOUND ? 0 : n); + rect = dpy.GetGeometry(); +#else + wxUnusedVar(pt); +#endif + return PRectangleFromwxRect(rect); +} + //---------------------------------------------------------------------- // Helper classes for ListBox @@ -769,16 +809,7 @@ END_EVENT_TABLE() #if wxUSE_POPUPWIN //----------------------------------- -#include - - -// -// TODO: Refactor these two classes to have a common base (or a mix-in) to get -// rid of the code duplication. (Either that or convince somebody to -// implement wxPopupWindow for the Mac!!) -// -// In the meantime, be careful to duplicate any changes as needed... -// +#include "wx/popupwin.h" // A popup window to place the wxSTCListBox upon class wxSTCListBoxWin : public wxPopupWindow @@ -789,10 +820,8 @@ private: void* doubleClickActionData; public: wxSTCListBoxWin(wxWindow* parent, wxWindowID id, Point WXUNUSED(location)) : - wxPopupWindow(parent, wxBORDER_NONE) + wxPopupWindow(parent, wxBORDER_SIMPLE) { - - SetBackgroundColour(*wxBLACK); // for our simple border lv = new wxSTCListBox(parent, id, wxPoint(-50,-50), wxDefaultSize, wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxBORDER_NONE); @@ -810,6 +839,10 @@ public: lv->Reparent(this); #ifdef __WXMSW__ lv->Show(); +#endif +#if defined(__WXOSX_COCOA__) || defined(__WXGTK__) + // This color will end up being our border + SetBackgroundColour(wxColour(0xC0, 0xC0, 0xC0)); #endif } @@ -867,14 +900,22 @@ public: } void OnSize(wxSizeEvent& event) { - // resize the child - wxSize sz = GetSize(); - sz.x -= 2; - sz.y -= 2; - lv->SetSize(1, 1, sz.x, sz.y); + // resize the child to fill the popup + wxSize sz = GetClientSize(); + int x, y, w, h; + x = y = 0; + w = sz.x; + h = sz.y; +#if defined(__WXOSX_COCOA__) || defined(__WXGTK__) + // make room for the parent's bg color to show, to act as a border + x = y = 1; + w -= 2; + h -= 2; +#endif + lv->SetSize(x, y, w, h); // reset the column widths lv->SetColumnWidth(0, IconWidth()+4); - lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) - + lv->SetColumnWidth(1, w - 2 - lv->GetColumnWidth(0) - wxSystemSettings::GetMetric(wxSYS_VSCROLL_X)); event.Skip(); } @@ -899,6 +940,7 @@ END_EVENT_TABLE() #else // !wxUSE_POPUPWIN ----------------------------------- +#include "wx/frame.h" // A normal window to place the wxSTCListBox upon, but make it behave as much // like a wxPopupWindow as possible @@ -913,7 +955,7 @@ public: wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT #ifdef __WXMAC__ - | wxPOPUP_WINDOW + | wxPOPUP_WINDOW | wxNO_BORDER #else | wxSIMPLE_BORDER @@ -932,7 +974,7 @@ public: lv->SetFocus(); Hide(); - } + } // On OSX and (possibly others) there can still be pending @@ -1002,7 +1044,7 @@ public: if (frame) frame->Raise(); } - + virtual void DoSetSize(int x, int y, int width, int height, @@ -1074,9 +1116,10 @@ private: public: ListBoxImpl(); ~ListBoxImpl(); + static ListBox *Allocate(); virtual void SetFont(Font &font); - virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_); + virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_, int technology_); virtual void SetAverageCharWidth(int width); virtual void SetVisibleRows(int rows); virtual int GetVisibleRows() const; @@ -1091,6 +1134,8 @@ public: virtual int Find(const char *prefix); virtual void GetValue(int n, char *value, int len); virtual void RegisterImage(int type, const char *xpm_data); + void RegisterImageHelper(int type, wxBitmap& bmp); + virtual void RegisterRGBAImage(int type, int width, int height, const unsigned char *pixelsImage); virtual void ClearRegisteredImages(); virtual void SetDoubleClickAction(CallBackAction, void *); virtual void SetList(const char* list, char separator, char typesep); @@ -1105,30 +1150,24 @@ ListBoxImpl::ListBoxImpl() } ListBoxImpl::~ListBoxImpl() { - if (imgList) { - delete imgList; - imgList = NULL; - } - if (imgTypeMap) { - delete imgTypeMap; - imgTypeMap = NULL; - } + wxDELETE(imgList); + wxDELETE(imgTypeMap); } void ListBoxImpl::SetFont(Font &font) { - GETLB(id)->SetFont(*((wxFont*)font.GetID())); + GETLB(wid)->SetFont(*((wxFont*)font.GetID())); } -void ListBoxImpl::Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_) { +void ListBoxImpl::Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_, int WXUNUSED(technology_)) { location = location_; lineHeight = lineHeight_; unicodeMode = unicodeMode_; maxStrWidth = 0; - id = new wxSTCListBoxWin(GETWIN(parent.GetID()), ctrlID, location); + wid = new wxSTCListBoxWin(GETWIN(parent.GetID()), ctrlID, location); if (imgList != NULL) - GETLB(id)->SetImageList(imgList, wxIMAGE_LIST_SMALL); + GETLB(wid)->SetImageList(imgList, wxIMAGE_LIST_SMALL); } @@ -1155,15 +1194,15 @@ PRectangle ListBoxImpl::GetDesiredRect() { // give it a default if there are no lines, and/or add a bit more if (maxw == 0) maxw = 100; maxw += aveCharWidth * 3 + - GETLBW(id)->IconWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); + GETLBW(wid)->IconWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); if (maxw > 350) maxw = 350; // estimate a desired height - int count = GETLB(id)->GetItemCount(); + int count = GETLB(wid)->GetItemCount(); if (count) { wxRect rect; - GETLB(id)->GetItemRect(0, rect); + GETLB(wid)->GetItemRect(0, rect); maxh = count * rect.GetHeight(); if (maxh > 140) // TODO: Use desiredVisibleRows?? maxh = 140; @@ -1185,12 +1224,12 @@ PRectangle ListBoxImpl::GetDesiredRect() { int ListBoxImpl::CaretFromEdge() { - return 4 + GETLBW(id)->IconWidth(); + return 4 + GETLBW(wid)->IconWidth(); } void ListBoxImpl::Clear() { - GETLB(id)->DeleteAllItems(); + GETLB(wid)->DeleteAllItems(); } @@ -1199,19 +1238,20 @@ void ListBoxImpl::Append(char *s, int type) { } void ListBoxImpl::Append(const wxString& text, int type) { - long count = GETLB(id)->GetItemCount(); - long itemID = GETLB(id)->InsertItem(count, wxEmptyString); - GETLB(id)->SetItem(itemID, 1, text); + long count = GETLB(wid)->GetItemCount(); + long itemID = GETLB(wid)->InsertItem(count, wxEmptyString); + long idx = -1; + GETLB(wid)->SetItem(itemID, 1, text); maxStrWidth = wxMax(maxStrWidth, text.length()); if (type != -1) { wxCHECK_RET(imgTypeMap, wxT("Unexpected NULL imgTypeMap")); - long idx = imgTypeMap->Item(type); - GETLB(id)->SetItemImage(itemID, idx, idx); + idx = imgTypeMap->Item(type); } + GETLB(wid)->SetItemImage(itemID, idx, idx); } void ListBoxImpl::SetList(const char* list, char separator, char typesep) { - GETLB(id)->Freeze(); + GETLB(wid)->Freeze(); Clear(); wxStringTokenizer tkzr(stc2wx(list), (wxChar)separator); while ( tkzr.HasMoreTokens() ) { @@ -1224,12 +1264,12 @@ void ListBoxImpl::SetList(const char* list, char separator, char typesep) { } Append(token, (int)type); } - GETLB(id)->Thaw(); + GETLB(wid)->Thaw(); } int ListBoxImpl::Length() { - return GETLB(id)->GetItemCount(); + return GETLB(wid)->GetItemCount(); } @@ -1239,13 +1279,13 @@ void ListBoxImpl::Select(int n) { n = 0; select = false; } - GETLB(id)->EnsureVisible(n); - GETLB(id)->Select(n, select); + GETLB(wid)->EnsureVisible(n); + GETLB(wid)->Select(n, select); } int ListBoxImpl::GetSelection() { - return GETLB(id)->GetFirstSelected(); + return GETLB(wid)->GetFirstSelected(); } @@ -1260,17 +1300,13 @@ void ListBoxImpl::GetValue(int n, char *value, int len) { item.SetId(n); item.SetColumn(1); item.SetMask(wxLIST_MASK_TEXT); - GETLB(id)->GetItem(item); + GETLB(wid)->GetItem(item); strncpy(value, wx2stc(item.GetText()), len); value[len-1] = '\0'; } - -void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { - wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1); - wxImage img(stream, wxBITMAP_TYPE_XPM); - wxBitmap bmp(img); - +void ListBoxImpl::RegisterImageHelper(int type, wxBitmap& bmp) +{ if (! imgList) { // assumes all images are the same size imgList = new wxImageList(bmp.GetWidth(), bmp.GetHeight(), true); @@ -1288,22 +1324,34 @@ void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { itm[type] = idx; } +void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { + wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1); + wxImage img(stream, wxBITMAP_TYPE_XPM); + wxBitmap bmp(img); + RegisterImageHelper(type, bmp); +} + + +void ListBoxImpl::RegisterRGBAImage(int type, int width, int height, + const unsigned char *pixelsImage) +{ +#ifdef wxHAS_RAW_BITMAP + wxBitmap bmp = BitmapFromRGBAImage(width, height, pixelsImage); + RegisterImageHelper(type, bmp); +#endif +} + + void ListBoxImpl::ClearRegisteredImages() { - if (imgList) { - delete imgList; - imgList = NULL; - } - if (imgTypeMap) { - delete imgTypeMap; - imgTypeMap = NULL; - } - if (id) - GETLB(id)->SetImageList(NULL, wxIMAGE_LIST_SMALL); + wxDELETE(imgList); + wxDELETE(imgTypeMap); + if (wid) + GETLB(wid)->SetImageList(NULL, wxIMAGE_LIST_SMALL); } void ListBoxImpl::SetDoubleClickAction(CallBackAction action, void *data) { - GETLBW(id)->SetDoubleClickAction(action, data); + GETLBW(wid)->SetDoubleClickAction(action, data); } @@ -1319,22 +1367,22 @@ ListBox *ListBox::Allocate() { //---------------------------------------------------------------------- -Menu::Menu() : id(0) { +Menu::Menu() : mid(0) { } void Menu::CreatePopUp() { Destroy(); - id = new wxMenu(); + mid = new wxMenu(); } void Menu::Destroy() { - if (id) - delete (wxMenu*)id; - id = 0; + if (mid) + delete (wxMenu*)mid; + mid = 0; } void Menu::Show(Point pt, Window &w) { - GETWIN(w.GetID())->PopupMenu((wxMenu*)id, pt.x - 4, pt.y); + GETWIN(w.GetID())->PopupMenu((wxMenu*)mid, pt.x - 4, pt.y); Destroy(); } @@ -1396,7 +1444,7 @@ long Platform::SendScintillaPointer(WindowID w, void *lParam) { wxStyledTextCtrl* stc = (wxStyledTextCtrl*)w; - return stc->SendMsg(msg, wParam, (long)lParam); + return stc->SendMsg(msg, wParam, (wxIntPtr)lParam); } @@ -1434,6 +1482,8 @@ void Platform::DebugPrintf(const char *format, ...) { vsprintf(buffer,format,pArguments); va_end(pArguments); Platform::DebugDisplay(buffer); +#else + wxUnusedVar(format); #endif } @@ -1526,10 +1576,10 @@ wxString stc2wx(const char* str, size_t len) if (!len) return wxEmptyString; - size_t wclen = UCS2Length(str, len); + size_t wclen = UTF16Length(str, len); wxWCharBuffer buffer(wclen+1); - size_t actualLen = UCS2FromUTF8(str, len, buffer.data(), wclen+1); + size_t actualLen = UTF16FromUTF8(str, len, buffer.data(), wclen+1); return wxString(buffer.data(), actualLen); } @@ -1541,14 +1591,14 @@ wxString stc2wx(const char* str) } -const wxWX2MBbuf wx2stc(const wxString& str) +wxWX2MBbuf wx2stc(const wxString& str) { const wchar_t* wcstr = str.c_str(); size_t wclen = str.length(); size_t len = UTF8Length(wcstr, wclen); wxCharBuffer buffer(len+1); - UTF8FromUCS2(wcstr, wclen, buffer.data(), len); + UTF8FromUTF16(wcstr, wclen, buffer.data(), len); // TODO check NULL termination!! @@ -1556,3 +1606,5 @@ const wxWX2MBbuf wx2stc(const wxString& str) } #endif + +#endif // wxUSE_STC