+ void OnSize(wxSizeEvent& event) {
+ // resize the child
+ wxSize sz = GetSize();
+ sz.x -= 2;
+ sz.y -= 2;
+ lv->SetSize(1, 1, sz.x, sz.y);
+ // reset the column widths
+ lv->SetColumnWidth(0, IconWidth()+4);
+ lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) -
+ wxSystemSettings::GetMetric(wxSYS_VSCROLL_X));
+ event.Skip();
+ }
+
+ void OnActivate(wxListEvent& WXUNUSED(event)) {
+ doubleClickAction(doubleClickActionData);
+ }
+
+ wxListView* GetLB() { return lv; }
+
+private:
+ DECLARE_EVENT_TABLE()
+
+};
+
+BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxPopupWindow)
+ EVT_SET_FOCUS ( wxSTCListBoxWin::OnFocus)
+ EVT_SIZE ( wxSTCListBoxWin::OnSize)
+ EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate)
+END_EVENT_TABLE()
+
+
+
+#else // !wxUSE_POPUPWIN -----------------------------------
+
+// A normal window to place the wxSTCListBox upon, but make it behave as much
+// like a wxPopupWindow as possible
+class wxSTCListBoxWin : public wxFrame {
+private:
+ wxListView* lv;
+ CallBackAction doubleClickAction;
+ void* doubleClickActionData;
+public:
+ wxSTCListBoxWin(wxWindow* parent, wxWindowID id, Point location) :
+ wxFrame(parent, id, wxEmptyString, wxPoint(location.x, location.y), wxSize(0,0),
+ wxFRAME_NO_TASKBAR
+ | wxFRAME_FLOAT_ON_PARENT
+#ifdef __WXMAC__
+ | wxPOPUP_WINDOW
+ | wxNO_BORDER
+#else
+ | wxSIMPLE_BORDER
+#endif
+ )
+ {
+
+ lv = new wxSTCListBox(this, id, wxDefaultPosition, wxDefaultSize,
+ wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxNO_BORDER);
+ lv->SetCursor(wxCursor(wxCURSOR_ARROW));
+ lv->InsertColumn(0, wxEmptyString);
+ lv->InsertColumn(1, wxEmptyString);
+
+ // Eventhough we immediately reset the focus to the parent, this helps
+ // things to look right...
+ lv->SetFocus();
+
+ Hide();
+ }
+
+
+ // On OSX and (possibly others) there can still be pending
+ // messages/events for the list control when Scintilla wants to
+ // close it, so do a pending delete of it instead of destroying
+ // immediately.
+ bool Destroy()
+ {
+#ifdef __WXMAC__
+ // The bottom edge of this window is not getting properly
+ // refreshed upon deletion, so help it out...
+ wxWindow* p = GetParent();
+ wxRect r(GetPosition(), GetSize());
+ r.SetHeight(r.GetHeight()+1);
+ p->Refresh(false, &r);
+#endif
+ if ( !wxPendingDelete.Member(this) )
+ wxPendingDelete.Append(this);
+ return true;
+ }
+
+
+ int IconWidth()
+ {
+ wxImageList* il = lv->GetImageList(wxIMAGE_LIST_SMALL);
+ if (il != NULL) {
+ int w, h;
+ il->GetSize(0, w, h);
+ return w;
+ }
+ return 0;
+ }
+
+
+ void SetDoubleClickAction(CallBackAction action, void *data)
+ {
+ doubleClickAction = action;
+ doubleClickActionData = data;
+ }
+
+
+ void OnFocus(wxFocusEvent& event)
+ {
+ ActivateParent();
+ GetParent()->SetFocus();
+ event.Skip();
+ }
+
+ void OnSize(wxSizeEvent& event)
+ {
+ // resize the child
+ wxSize sz = GetClientSize();
+ lv->SetSize(sz);
+ // reset the column widths
+ lv->SetColumnWidth(0, IconWidth()+4);
+ lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) -
+ wxSystemSettings::GetMetric(wxSYS_VSCROLL_X));
+ event.Skip();
+ }
+
+ void ActivateParent()
+ {
+ // Although we're a frame, we always want the parent to be active, so
+ // raise it whenever we get shown, focused, etc.
+ wxTopLevelWindow *frame = wxDynamicCast(
+ wxGetTopLevelParent(GetParent()), wxTopLevelWindow);
+ if (frame)
+ frame->Raise();
+ }
+