}
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) {
}
+//----------------------------------------------------------------------
+// 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) {
event.Skip();
}
-#if 0 // #ifdef __WXGTK__
- void DoSetFirstItem(int n);
-#endif
-
private:
DECLARE_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 <wx/popupwin.h>
+#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() {
}
}
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;
- printf("SetVisibleRows: %d\n", rows);
+ desiredVisibleRows = rows;
}
PRectangle ListBox::GetDesiredRect() {
- wxSize sz = ((wxListBox*)id)->GetBestSize();
- printf("GetDesiredRect: %d, %d\n", sz.x, sz.y);
+ wxSize sz = GETLB(id)->GetBestSize();
PRectangle rc;
rc.top = 0;
rc.left = 0;
if (sz.x > 400)
sz.x = 400;
- if (sz.y > 150)
- sz.y = 150;
+ if (sz.y > 160) // TODO: Use desiredVisibleRows??
+ sz.y = 160;
rc.right = sz.x;
rc.bottom = sz.y;
-
return rc;
}
}
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
}
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());
}