X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88b780d9f9c19ad3c6eca915d7df74c3549fa204..17271c793e0d938dc4a189b540b6438ce1839230:/src/stc/PlatWX.cpp diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 0dbd3d5ea7..65d7de1b45 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -4,17 +4,23 @@ // Robin Dunn // The License.txt file describes the conditions under which this software may be distributed. +#include #include "Platform.h" #include "wx/stc/stc.h" + +#ifdef __WXGTK__ +#include +#endif + Point Point::FromLong(long lpoint) { - return Point(lpoint & 0xFFFF, lpoint >> 32); + return Point(lpoint & 0xFFFF, lpoint >> 16); } wxRect wxRectFromPRectangle(PRectangle prc) { wxRect rc(prc.left, prc.top, - prc.right-prc.left+1, prc.bottom-prc.top+1); + prc.right-prc.left, prc.bottom-prc.top); return rc; } @@ -105,14 +111,17 @@ Font::Font() { Font::~Font() { } -void Font::Create(const char *faceName, int size, bool bold, bool italic) { +void Font::Create(const char *faceName, int characterSet, int size, bool bold, bool italic) { + // TODO: what to do about the characterSet? + Release(); id = new wxFont(size, wxDEFAULT, italic ? wxITALIC : wxNORMAL, bold ? wxBOLD : wxNORMAL, false, - faceName); + faceName, + wxFONTENCODING_DEFAULT); } @@ -154,22 +163,21 @@ void Surface::Init() { Release(); hdc = new wxMemoryDC(); hdcOwned = true; - // **** ::SetTextAlign(hdc, TA_BASELINE); } void Surface::Init(SurfaceID hdc_) { Release(); hdc = hdc_; - // **** ::SetTextAlign(hdc, TA_BASELINE); } void Surface::InitPixMap(int width, int height, Surface *surface_) { Release(); hdc = new wxMemoryDC(surface_->hdc); hdcOwned = true; + if (width < 1) width = 1; + if (height < 1) height = 1; bitmap = new wxBitmap(width, height); ((wxMemoryDC*)hdc)->SelectObject(*bitmap); - // **** ::SetTextAlign(hdc, TA_BASELINE); } void Surface::PenColour(Colour fore) { @@ -181,13 +189,21 @@ void Surface::BrushColor(Colour back) { } void Surface::SetFont(Font &font_) { - hdc->SetFont(*font_.GetID()); + if (font_.GetID()) { + hdc->SetFont(*font_.GetID()); + } } int Surface::LogPixelsY() { return hdc->GetPPI().y; } + +int Surface::DeviceHeightFont(int points) { + return points; +} + + void Surface::MoveTo(int x_, int y_) { x = x_; y = y_; @@ -232,7 +248,7 @@ void Surface::FillRectangle(PRectangle rc, Surface &surfacePattern) { void Surface::RoundedRectangle(PRectangle rc, Colour fore, Colour back) { PenColour(fore); BrushColor(back); - hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 8); + hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4); } void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) { @@ -242,7 +258,8 @@ void Surface::Ellipse(PRectangle rc, Colour fore, Colour back) { } void Surface::Copy(PRectangle rc, Point from, Surface &surfaceSource) { - hdc->Blit(rc.left, rc.top, rc.Width(), rc.Height(), + wxRect r = wxRectFromPRectangle(rc); + hdc->Blit(r.x, r.y, r.width, r.height, surfaceSource.hdc, from.x, from.y, wxCOPY); } @@ -337,14 +354,15 @@ int Surface::AverageCharWidth(Font &font) { } int Surface::SetPalette(Palette *pal, bool inBackGround) { - return 0; // **** figure out what to do with palettes... + return 0; } void Surface::SetClip(PRectangle rc) { hdc->SetClippingRegion(wxRectFromPRectangle(rc)); } - +void Surface::FlushCachedState() { +} Window::~Window() { } @@ -365,7 +383,8 @@ PRectangle Window::GetPosition() { } void Window::SetPosition(PRectangle rc) { - id->SetSize(rc.left, rc.top, rc.Width(), rc.Height()); + wxRect r = wxRectFromPRectangle(rc); + id->SetSize(r); } void Window::SetPositionRelative(PRectangle rc, Window) { @@ -374,7 +393,7 @@ void Window::SetPositionRelative(PRectangle rc, Window) { PRectangle Window::GetClientPosition() { wxSize sz = id->GetClientSize(); - return PRectangle(0, 0, sz.x - 1, sz.y - 1); + return PRectangle(0, 0, sz.x, sz.y); } void Window::Show(bool show) { @@ -386,7 +405,8 @@ void Window::InvalidateAll() { } void Window::InvalidateRectangle(PRectangle rc) { - id->Refresh(false, &wxRectFromPRectangle(rc)); + wxRect r = wxRectFromPRectangle(rc); + id->Refresh(false, &r); } void Window::SetFont(Font &font) { @@ -432,6 +452,26 @@ void Window::SetTitle(const char *s) { } +class wxSTCListBox : public wxListBox { +public: + wxSTCListBox(wxWindow* parent, wxWindowID id) + : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize, + 0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER) // | wxLB_SORT ) + {} + + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + +private: + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox) + EVT_SET_FOCUS(wxSTCListBox::OnFocus) +END_EVENT_TABLE() + ListBox::ListBox() { } @@ -440,8 +480,33 @@ ListBox::~ListBox() { } void ListBox::Create(Window &parent, int ctrlID) { - id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize, - 0, NULL, wxLB_SINGLE | wxLB_SORT); + id = new wxSTCListBox(parent.id, ctrlID); +} + +void ListBox::SetVisibleRows(int rows) { + desiredVisibleRows = rows; +} + +PRectangle ListBox::GetDesiredRect() { + wxSize sz = ((wxListBox*)id)->GetBestSize(); + PRectangle rc; + rc.top = 0; + rc.left = 0; + if (sz.x > 400) + sz.x = 400; + if (sz.y > 160) // TODO: Use desiredVisibleRows?? + sz.y = 160; + rc.right = sz.x; + rc.bottom = sz.y; + return rc; +} + +void ListBox::SetAverageCharWidth(int width) { + aveCharWidth = width; +} + +void ListBox::SetFont(Font &font) { + Window::SetFont(font); } void ListBox::Clear() { @@ -453,11 +518,18 @@ void ListBox::Append(char *s) { } int ListBox::Length() { - return ((wxListBox*)id)->Number(); + return ((wxListBox*)id)->GetCount(); } void ListBox::Select(int n) { ((wxListBox*)id)->SetSelection(n); +#ifdef __WXGTK__ + if (n > 4) + n = n - 4; + else + n = 1; + ((wxListBox*)id)->SetFirstItem(n); +#endif } int ListBox::GetSelection() { @@ -465,7 +537,8 @@ int ListBox::GetSelection() { } int ListBox::Find(const char *prefix) { - return ((wxListBox*)id)->FindString(prefix); + // No longer used + return -1; } void ListBox::GetValue(int n, char *value, int len) { @@ -570,6 +643,36 @@ void Platform::DebugPrintf(const char *format, ...) { #endif } + +static bool assertionPopUps = true; + +bool Platform::ShowAssertionPopUps(bool assertionPopUps_) { + bool ret = assertionPopUps; + assertionPopUps = assertionPopUps_; + return ret; +} + +void Platform::Assert(const char *c, const char *file, int line) { + char buffer[2000]; + sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line); + if (assertionPopUps) { + int idButton = wxMessageBox(buffer, "Assertion failure", + wxICON_HAND | wxOK); +// if (idButton == IDRETRY) { +// ::DebugBreak(); +// } else if (idButton == IDIGNORE) { +// // all OK +// } else { +// abort(); +// } + } else { + strcat(buffer, "\r\n"); + Platform::DebugDisplay(buffer); + abort(); + } +} + + int Platform::Clamp(int val, int minVal, int maxVal) { if (val > maxVal) val = maxVal;