X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/29825f5fc4639b5aa86902cb4b1cd4fa07fb3593..fe62518e7c989b18653b9d07e19ba8a187f24cf1:/src/stc/PlatWX.cpp diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 095d031fb3..c92a71592d 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -21,6 +21,10 @@ #include +#if wxUSE_DISPLAY +#include "wx/display.h" +#endif + #include "wx/encconv.h" #include "wx/listctrl.h" #include "wx/mstream.h" @@ -28,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) { @@ -60,6 +67,14 @@ wxColour wxColourFromCA(const ColourAllocated& ca) { (unsigned char)cd.GetBlue()); } +wxColour wxColourFromCAandAlpha(const ColourAllocated& ca, int alpha) { + ColourDesired cd(ca.AsLong()); + return wxColour((unsigned char)cd.GetRed(), + (unsigned char)cd.GetGreen(), + (unsigned char)cd.GetBlue(), + (unsigned char)alpha); +} + //---------------------------------------------------------------------- Palette::Palette() { @@ -71,8 +86,7 @@ Palette::Palette() { Palette::~Palette() { Release(); - delete [] entries; - entries = 0; + wxDELETEA(entries); } void Palette::Release() { @@ -126,15 +140,16 @@ void Palette::Allocate(Window &) { //---------------------------------------------------------------------- Font::Font() { - id = 0; + fid = 0; ascent = 0; } Font::~Font() { } -void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic, bool extraFontFlag) { - +void Font::Create(const char *faceName, int characterSet, + int size, bool bold, bool italic, + int WXUNUSED(extraFontFlag)) { Release(); // The minus one is done because since Scintilla uses SC_SHARSET_DEFAULT @@ -154,15 +169,14 @@ void Font::Create(const char *faceName, int characterSet, int size, bool bold, b false, stc2wx(faceName), encoding); - font->SetNoAntiAliasing(!extraFontFlag); - id = font; + fid = font; } void Font::Release() { - if (id) - delete (wxFont*)id; - id = 0; + if (fid) + delete (wxFont*)fid; + fid = 0; } //---------------------------------------------------------------------- @@ -285,11 +299,11 @@ bool SurfaceImpl::Initialised() { void SurfaceImpl::PenColour(ColourAllocated fore) { - hdc->SetPen(wxPen(wxColourFromCA(fore), 1, wxSOLID)); + hdc->SetPen(wxPen(wxColourFromCA(fore))); } void SurfaceImpl::BrushColour(ColourAllocated back) { - hdc->SetBrush(wxBrush(wxColourFromCA(back), wxSOLID)); + hdc->SetBrush(wxBrush(wxColourFromCA(back))); } void SurfaceImpl::SetFont(Font &font_) { @@ -340,7 +354,7 @@ 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)); @@ -362,16 +376,25 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, ColourAllocated outline, int alphaOutline, int /*flags*/) { -#ifdef wxHAVE_RAW_BITMAP +#if wxUSE_GRAPHICS_CONTEXT + wxGCDC dc(*(wxMemoryDC*)hdc); + wxColour penColour(wxColourFromCAandAlpha(outline, alphaOutline)); + wxColour brushColour(wxColourFromCAandAlpha(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()); @@ -387,7 +410,7 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, p.Green() = wxPy_premultiply(green, alphaFill); p.Blue() = wxPy_premultiply(blue, alphaFill); p.Alpha() = alphaFill; - ++p; + ++p; } } @@ -401,12 +424,12 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, p.Red() = wxPy_premultiply(red, alphaOutline); p.Green() = wxPy_premultiply(green, alphaOutline); p.Blue() = wxPy_premultiply(blue, alphaOutline); - p.Alpha() = alphaOutline; + p.Alpha() = alphaOutline; p.MoveTo(pixData, x, r.height-1); p.Red() = wxPy_premultiply(red, alphaOutline); p.Green() = wxPy_premultiply(green, alphaOutline); p.Blue() = wxPy_premultiply(blue, alphaOutline); - p.Alpha() = alphaOutline; + p.Alpha() = alphaOutline; } for (y=0; yDrawBitmap(bmp, r.x, r.y, true); @@ -431,6 +454,7 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, wxUnusedVar(alphaOutline); RectangleDraw(rc, outline, fill); #endif +#endif } void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) { @@ -480,13 +504,13 @@ void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, int ybase, SetFont(font); hdc->SetTextForeground(wxColourFromCA(fore)); - hdc->SetBackgroundMode(wxTRANSPARENT); + 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); } @@ -521,7 +545,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)); @@ -622,26 +646,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) { @@ -649,30 +673,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: @@ -703,24 +727,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 @@ -783,16 +819,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 @@ -803,10 +830,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); @@ -881,11 +906,9 @@ 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(); + lv->SetSize(0, 0, sz.x, sz.y); // reset the column widths lv->SetColumnWidth(0, IconWidth()+4); lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) - @@ -913,6 +936,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 @@ -927,7 +951,7 @@ public: wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT #ifdef __WXMAC__ - | wxPOPUP_WINDOW + | wxPOPUP_WINDOW | wxNO_BORDER #else | wxSIMPLE_BORDER @@ -946,7 +970,7 @@ public: lv->SetFocus(); Hide(); - } + } // On OSX and (possibly others) there can still be pending @@ -1016,7 +1040,7 @@ public: if (frame) frame->Raise(); } - + virtual void DoSetSize(int x, int y, int width, int height, @@ -1119,19 +1143,13 @@ 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())); } @@ -1140,9 +1158,9 @@ void ListBoxImpl::Create(Window &parent, int ctrlID, Point location_, int lineHe 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); } @@ -1169,15 +1187,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; @@ -1199,12 +1217,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(); } @@ -1213,19 +1231,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() ) { @@ -1238,12 +1257,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(); } @@ -1253,13 +1272,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(); } @@ -1274,7 +1293,7 @@ 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'; } @@ -1303,21 +1322,15 @@ void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { } 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); } @@ -1333,22 +1346,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(); } @@ -1410,7 +1423,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); } @@ -1542,10 +1555,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); } @@ -1564,7 +1577,7 @@ const wxWX2MBbuf wx2stc(const wxString& str) 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!!