X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b8b0e4022e105e102b5c7044638972a3fef38dc1..5c235ea098366cc737f5bc5ea6c67b4fa33981ee:/src/stc/PlatWX.cpp diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index 35a85e67ae..dda64f77b2 100644 --- a/src/stc/PlatWX.cpp +++ b/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) { @@ -452,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 | wxSIMPLE_BORDER | wxLB_SORT ) + 0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER) {} void OnFocus(wxFocusEvent& event) { @@ -464,10 +469,6 @@ public: event.Skip(); } -#if 0 // #ifdef __WXGTK__ - void DoSetFirstItem(int n); -#endif - private: DECLARE_EVENT_TABLE() }; @@ -478,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. -#if 0 // #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; +#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 - // terribly efficient - const gchar *vadjustment_key = "gtk-vadjustment"; - guint vadjustment_key_id = g_quark_from_static_string (vadjustment_key); +class wxSTCListBoxWin : public wxSTCListBoxWinBase { +public: + wxSTCListBoxWin(wxWindow* parent, wxWindowID id) + : wxSTCListBoxWinBase(parent, param2) { + lb = new wxSTCListBox(this, id); + } - GtkAdjustment *adjustment = - (GtkAdjustment*) gtk_object_get_data_by_id (GTK_OBJECT (m_list), vadjustment_key_id); - wxCHECK_RET( adjustment, wxT("invalid listbox code") ); + void OnSize(wxSizeEvent& event) { + lb->SetSize(GetSize()); + } + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } - GList *target = g_list_nth( m_list->children, n ); - wxCHECK_RET( target, wxT("invalid listbox index") ); + 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 - GtkWidget *item = GTK_WIDGET(target->data); - wxCHECK_RET( item, wxT("invalid listbox code") ); +private: + wxSTCListBox* lb; + DECLARE_EVENT_TABLE() +}; - // 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; - } +BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxSTCListBoxWinBase) + EVT_SIZE (wxSTCListBoxWin::OnSize) + EVT_SET_FOCUS (wxSTCListBoxWin::OnFocus) +END_EVENT_TABLE() - item = GTK_WIDGET(target->data); - } - gtk_adjustment_set_value(adjustment, - item->allocation.y + - nItemsBefore*item->allocation.height); -} -#endif +#define GETLB(win) (((wxSTCListBoxWin*)win)->GetLB()) +//---------------------------------------------------------------------- ListBox::ListBox() { } @@ -530,25 +543,24 @@ ListBox::~ListBox() { } void ListBox::Create(Window &parent, int ctrlID) { - id = new wxSTCListBox(parent.id, ctrlID); + id = new wxSTCListBoxWin(parent.id, ctrlID); } void ListBox::SetVisibleRows(int rows) { - desiredVisibleRows = 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 > 400) sz.x = 400; - if (sz.y > 150) // TODO: Use desiredVisibleRows?? - sz.y = 150; + if (sz.y > 160) // TODO: Use desiredVisibleRows?? + sz.y = 160; rc.right = sz.x; rc.bottom = sz.y; - return rc; } @@ -557,34 +569,34 @@ 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) { @@ -593,13 +605,12 @@ int ListBox::Find(const char *prefix) { } 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 } @@ -625,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()); }