X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..496beb3fc0244c36bdb0e37055aa868012b52a23:/src/stc/PlatWX.cpp diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 5045e6d506..29535072a7 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -9,13 +9,18 @@ #include "Platform.h" #include "wx/stc/stc.h" + +#ifdef __WXGTK__ +#include +#endif + Point Point::FromLong(long lpoint) { 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; } @@ -107,6 +112,8 @@ Font::~Font() { } 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, @@ -156,22 +163,19 @@ 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; - bitmap = new wxBitmap(width, height+1); + bitmap = new wxBitmap(width, height); ((wxMemoryDC*)hdc)->SelectObject(*bitmap); - // **** ::SetTextAlign(hdc, TA_BASELINE); } void Surface::PenColour(Colour fore) { @@ -183,12 +187,7 @@ void Surface::BrushColor(Colour back) { } void Surface::SetFont(Font &font_) { - - // I think the following check is valid. - // It eliminates a crash for me. -- eric@sourcegear.com - - if (font_.GetID()) - { + if (font_.GetID()) { hdc->SetFont(*font_.GetID()); } } @@ -199,7 +198,7 @@ int Surface::LogPixelsY() { int Surface::DeviceHeightFont(int points) { - return points * LogPixelsY() / 72; + return points; } @@ -353,7 +352,7 @@ 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) { @@ -361,9 +360,6 @@ void Surface::SetClip(PRectangle rc) { } void Surface::FlushCachedState() { - // TODO Is there anything we need to do here? eric@sourcegear.com - // TODO I had to add this method when I merged new Scintilla code - // TODO from Neil. } Window::~Window() { @@ -395,7 +391,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) { @@ -454,6 +450,76 @@ 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 | wxLB_SORT | wxSIMPLE_BORDER) + {} + + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + +#ifdef __WXGTK__ + void DoSetFirstItem(int n); +#endif + +private: + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox) + EVT_SET_FOCUS(wxSTCListBox::OnFocus) +END_EVENT_TABLE() + + + + +#ifdef __WXGTK__ + // This can be removed after 2.2.2 I think +void wxSTCListBox::DoSetFirstItem( int n ) +{ + wxCHECK_RET( m_list, wxT("invalid listbox") ); + + if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (m_list)) + return; + + // terribly efficient + const gchar *vadjustment_key = "gtk-vadjustment"; + guint vadjustment_key_id = g_quark_from_static_string (vadjustment_key); + + GtkAdjustment *adjustment = + (GtkAdjustment*) gtk_object_get_data_by_id (GTK_OBJECT (m_list), vadjustment_key_id); + wxCHECK_RET( adjustment, wxT("invalid listbox code") ); + + GList *target = g_list_nth( m_list->children, n ); + wxCHECK_RET( target, wxT("invalid listbox index") ); + + GtkWidget *item = GTK_WIDGET(target->data); + wxCHECK_RET( item, wxT("invalid listbox code") ); + + // find the last item before this one which is already realized + size_t nItemsBefore; + for ( nItemsBefore = 0; item && (item->allocation.y == -1); nItemsBefore++ ) + { + target = target->prev; + if ( !target ) + { + // nothing we can do if there are no allocated items yet + return; + } + + item = GTK_WIDGET(target->data); + } + + gtk_adjustment_set_value(adjustment, + item->allocation.y + + nItemsBefore*item->allocation.height); +} +#endif + ListBox::ListBox() { } @@ -462,8 +528,32 @@ 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); +// id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize, +// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER); +} + +PRectangle ListBox::GetDesiredRect() { + wxSize sz = ((wxListBox*)id)->GetBestSize(); + PRectangle rc; + rc.top = 0; + rc.left = 0; + if (sz.x > 150) // TODO: A better way to determine these max sizes + sz.x = 150; + if (sz.y > 100) + sz.y = 100; + 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() { @@ -475,11 +565,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() { @@ -487,10 +584,12 @@ int ListBox::GetSelection() { } int ListBox::Find(const char *prefix) { - for (int x=0; x < ((wxListBox*)id)->Number(); x++) { - wxString text = ((wxListBox*)id)->GetString(x); - if (text.StartsWith(prefix)) - return x; + if (prefix) { + for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) { + wxString text = ((wxListBox*)id)->GetString(x); + if (text.StartsWith(prefix)) + return x; + } } return -1; } @@ -597,6 +696,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;