X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9968ba85be146ad4f282cfdc6ce72b68897fbb10..012a01fc1ea0f4c870eaf66bb332617affa5abd0:/contrib/src/stc/PlatWX.cpp diff --git a/contrib/src/stc/PlatWX.cpp b/contrib/src/stc/PlatWX.cpp index 29535072a7..dda64f77b2 100644 --- a/contrib/src/stc/PlatWX.cpp +++ b/contrib/src/stc/PlatWX.cpp @@ -25,7 +25,8 @@ wxRect wxRectFromPRectangle(PRectangle prc) { } PRectangle PRectangleFromwxRect(wxRect rc) { - return PRectangle(rc.GetLeft(), rc.GetTop(), rc.GetRight(), rc.GetBottom()); + return PRectangle(rc.GetLeft(), rc.GetTop(), + rc.GetRight()+1, rc.GetBottom()+1); } Colour::Colour(long lcol) { @@ -174,6 +175,8 @@ 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); } @@ -450,11 +453,15 @@ void Window::SetTitle(const char *s) { } +//---------------------------------------------------------------------- +// Helper classes for ListBox + +// A wxListBox that gives focus to its parent if it gets it. class wxSTCListBox : public wxListBox { public: wxSTCListBox(wxWindow* parent, wxWindowID id) : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize, - 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER) + 0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER) {} void OnFocus(wxFocusEvent& event) { @@ -462,10 +469,6 @@ public: event.Skip(); } -#ifdef __WXGTK__ - void DoSetFirstItem(int n); -#endif - private: DECLARE_EVENT_TABLE() }; @@ -476,50 +479,62 @@ END_EVENT_TABLE() +// A window to place the listbox upon. If wxPopupWindow is supported then +// that will be used so the listbox can extend beyond the client area of the +// wxSTC if needed. -#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; - } +#if wxUSE_POPUPWIN +#include +#define wxSTCListBoxWinBase wxPopupWindow +#define param2 wxBORDER_NONE // popup's 2nd param is flags +#else +#define wxSTCListBoxWinBase wxWindow +#define param2 -1 // wxWindows 2nd param is ID +#endif - item = GTK_WIDGET(target->data); +class wxSTCListBoxWin : public wxSTCListBoxWinBase { +public: + wxSTCListBoxWin(wxWindow* parent, wxWindowID id) + : wxSTCListBoxWinBase(parent, param2) { + lb = new wxSTCListBox(this, id); } - gtk_adjustment_set_value(adjustment, - item->allocation.y + - nItemsBefore*item->allocation.height); -} + void OnSize(wxSizeEvent& event) { + lb->SetSize(GetSize()); + } + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + + wxListBox* GetLB() { return lb; } + +#if wxUSE_POPUPWIN + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO) { + if (x != -1) + GetParent()->ClientToScreen(&x, NULL); + if (y != -1) + GetParent()->ClientToScreen(NULL, &y); + wxSTCListBoxWinBase::DoSetSize(x, y, width, height, sizeFlags); + } #endif +private: + wxSTCListBox* lb; + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxSTCListBoxWinBase) + EVT_SIZE (wxSTCListBoxWin::OnSize) + EVT_SET_FOCUS (wxSTCListBoxWin::OnFocus) +END_EVENT_TABLE() + + +#define GETLB(win) (((wxSTCListBoxWin*)win)->GetLB()) + +//---------------------------------------------------------------------- ListBox::ListBox() { } @@ -528,23 +543,24 @@ ListBox::~ListBox() { } void ListBox::Create(Window &parent, int ctrlID) { - id = new wxSTCListBox(parent.id, ctrlID); -// id = new wxListBox(parent.id, ctrlID, wxDefaultPosition, wxDefaultSize, -// 0, NULL, wxLB_SINGLE | wxLB_SORT | wxSIMPLE_BORDER); + id = new wxSTCListBoxWin(parent.id, ctrlID); +} + +void ListBox::SetVisibleRows(int rows) { + desiredVisibleRows = rows; } PRectangle ListBox::GetDesiredRect() { - wxSize sz = ((wxListBox*)id)->GetBestSize(); + wxSize sz = GETLB(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; + 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; } @@ -553,55 +569,48 @@ void ListBox::SetAverageCharWidth(int width) { } void ListBox::SetFont(Font &font) { - Window::SetFont(font); + GETLB(id)->SetFont(*font.GetID()); } void ListBox::Clear() { - ((wxListBox*)id)->Clear(); + GETLB(id)->Clear(); } void ListBox::Append(char *s) { - ((wxListBox*)id)->Append(s); + GETLB(id)->Append(s); } int ListBox::Length() { - return ((wxListBox*)id)->GetCount(); + return GETLB(id)->GetCount(); } void ListBox::Select(int n) { - ((wxListBox*)id)->SetSelection(n); + GETLB(id)->SetSelection(n); #ifdef __WXGTK__ if (n > 4) n = n - 4; else n = 1; - ((wxListBox*)id)->SetFirstItem(n); + GETLB(id)->SetFirstItem(n); #endif } int ListBox::GetSelection() { - return ((wxListBox*)id)->GetSelection(); + return GETLB(id)->GetSelection(); } int ListBox::Find(const char *prefix) { - if (prefix) { - for (int x=0; x < ((wxListBox*)id)->GetCount(); x++) { - wxString text = ((wxListBox*)id)->GetString(x); - if (text.StartsWith(prefix)) - return x; - } - } + // No longer used return -1; } void ListBox::GetValue(int n, char *value, int len) { - wxString text = ((wxListBox*)id)->GetString(n); + wxString text = GETLB(id)->GetString(n); strncpy(value, text.c_str(), len); value[len-1] = '\0'; } void ListBox::Sort() { - // wxWindows keeps sorted so no need to sort } @@ -627,13 +636,13 @@ void Menu::Show(Point pt, Window &w) { Colour Platform::Chrome() { wxColour c; - c = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); return Colour(c.Red(), c.Green(), c.Blue()); } Colour Platform::ChromeHighlight() { wxColour c; - c = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHIGHLIGHT); + c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT); return Colour(c.Red(), c.Green(), c.Blue()); }