Use a wxPopupWindow for the AutoComplete box too.
We don't need to artificially set the clipping region on wxGTK anymore. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33637 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -679,8 +679,13 @@ public:
|
|||||||
wxSTCListBox(wxWindow* parent, wxWindowID id,
|
wxSTCListBox(wxWindow* parent, wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size,
|
const wxPoint& pos, const wxSize& size,
|
||||||
long style)
|
long style)
|
||||||
: wxListView(parent, id, pos, size, style)
|
: wxListView()
|
||||||
{}
|
{
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
Hide(); // don't flicker as we move it around...
|
||||||
|
#endif
|
||||||
|
Create(parent, id, pos, size, style);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void OnFocus(wxFocusEvent& event) {
|
void OnFocus(wxFocusEvent& event) {
|
||||||
@@ -724,8 +729,138 @@ END_EVENT_TABLE()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if wxUSE_POPUPWIN //-----------------------------------
|
||||||
|
#include <wx/popupwin.h>
|
||||||
|
|
||||||
// A window to place the wxSTCListBox upon
|
|
||||||
|
//
|
||||||
|
// TODO: Refactor these two classes to have a common base (or a mix-in) to get
|
||||||
|
// rid of the code duplication. (Either that or convince somebody to
|
||||||
|
// implement wxPopupWindow for the Mac!!)
|
||||||
|
//
|
||||||
|
// In the meantime, be careful to duplicate any changes as needed...
|
||||||
|
//
|
||||||
|
|
||||||
|
// A popup window to place the wxSTCListBox upon
|
||||||
|
class wxSTCListBoxWin : public wxPopupWindow
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
wxListView* lv;
|
||||||
|
CallBackAction doubleClickAction;
|
||||||
|
void* doubleClickActionData;
|
||||||
|
public:
|
||||||
|
wxSTCListBoxWin(wxWindow* parent, wxWindowID id) :
|
||||||
|
wxPopupWindow(parent, wxBORDER_NONE)
|
||||||
|
{
|
||||||
|
SetBackgroundColour(*wxBLACK); // for our simple border
|
||||||
|
|
||||||
|
lv = new wxSTCListBox(parent, id, wxDefaultPosition, wxDefaultSize,
|
||||||
|
wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxBORDER_NONE);
|
||||||
|
lv->SetCursor(wxCursor(wxCURSOR_ARROW));
|
||||||
|
lv->InsertColumn(0, wxEmptyString);
|
||||||
|
lv->InsertColumn(1, wxEmptyString);
|
||||||
|
|
||||||
|
// NOTE: We need to fool the wxListView into thinking that it has the
|
||||||
|
// focus so it will use the normal selection colour and will look
|
||||||
|
// "right" to the user. But since the wxPopupWindow or its children
|
||||||
|
// can't receive focus then we have to pull a fast one and temporarily
|
||||||
|
// parent the listctrl on the STC window and then call SetFocus and
|
||||||
|
// then reparent it back to the popup.
|
||||||
|
lv->SetFocus();
|
||||||
|
lv->Reparent(this);
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
lv->Show();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set position in client coords
|
||||||
|
virtual void DoSetSize(int x, int y,
|
||||||
|
int width, int height,
|
||||||
|
int sizeFlags = wxSIZE_AUTO) {
|
||||||
|
if (x != wxDefaultCoord) {
|
||||||
|
GetParent()->ClientToScreen(&x, NULL);
|
||||||
|
}
|
||||||
|
if (y != wxDefaultCoord) {
|
||||||
|
GetParent()->ClientToScreen(NULL, &y);
|
||||||
|
}
|
||||||
|
wxPopupWindow::DoSetSize(x, y, width, height, sizeFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return position as if it were in client coords
|
||||||
|
virtual void DoGetPosition( int *x, int *y ) const {
|
||||||
|
int sx, sy;
|
||||||
|
wxPopupWindow::DoGetPosition(&sx, &sy);
|
||||||
|
GetParent()->ScreenToClient(&sx, &sy);
|
||||||
|
if (x) *x = sx;
|
||||||
|
if (y) *y = sy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Destroy() {
|
||||||
|
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) {
|
||||||
|
GetParent()->SetFocus();
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
class wxSTCListBoxWin : public wxWindow {
|
class wxSTCListBoxWin : public wxWindow {
|
||||||
private:
|
private:
|
||||||
wxListView* lv;
|
wxListView* lv;
|
||||||
@@ -827,6 +962,7 @@ BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxWindow)
|
|||||||
EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate)
|
EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#endif // wxUSE_POPUPWIN -----------------------------------
|
||||||
|
|
||||||
|
|
||||||
inline wxSTCListBoxWin* GETLBW(WindowID win) {
|
inline wxSTCListBoxWin* GETLBW(WindowID win) {
|
||||||
|
@@ -1010,28 +1010,25 @@ void ScintillaWX::DoScrollToColumn(int column) {
|
|||||||
HorizontalScrollTo(column * vs.spaceWidth);
|
HorizontalScrollTo(column * vs.spaceWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __WXGTK__
|
// wxGTK doesn't appear to need this explicit clipping code any longer, but I
|
||||||
void ScintillaWX::ClipChildren(wxDC& dc, PRectangle rect) {
|
// will leave it here commented out for a while just in case...
|
||||||
wxRegion rgn(wxRectFromPRectangle(rect));
|
void ScintillaWX::ClipChildren(wxDC& WXUNUSED(dc), PRectangle WXUNUSED(rect))
|
||||||
if (ac.Active()) {
|
{
|
||||||
wxRect childRect = ((wxWindow*)ac.lb->GetID())->GetRect();
|
// wxRegion rgn(wxRectFromPRectangle(rect));
|
||||||
rgn.Subtract(childRect);
|
// if (ac.Active()) {
|
||||||
}
|
// wxRect childRect = ((wxWindow*)ac.lb->GetID())->GetRect();
|
||||||
if (ct.inCallTipMode) {
|
// rgn.Subtract(childRect);
|
||||||
wxSTCCallTip* tip = (wxSTCCallTip*)ct.wCallTip.GetID();
|
// }
|
||||||
wxRect childRect = tip->GetRect();
|
// if (ct.inCallTipMode) {
|
||||||
#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
|
// wxSTCCallTip* tip = (wxSTCCallTip*)ct.wCallTip.GetID();
|
||||||
childRect.SetPosition(tip->GetMyPosition());
|
// wxRect childRect = tip->GetRect();
|
||||||
#endif
|
// #if wxUSE_POPUPWIN && wxSTC_USE_POPUP
|
||||||
rgn.Subtract(childRect);
|
// childRect.SetPosition(tip->GetMyPosition());
|
||||||
}
|
// #endif
|
||||||
|
// rgn.Subtract(childRect);
|
||||||
dc.SetClippingRegion(rgn);
|
// }
|
||||||
|
// dc.SetClippingRegion(rgn);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
void ScintillaWX::ClipChildren(wxDC& WXUNUSED(dc), PRectangle WXUNUSED(rect)) {
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void ScintillaWX::SetUseAntiAliasing(bool useAA) {
|
void ScintillaWX::SetUseAntiAliasing(bool useAA) {
|
||||||
|
@@ -679,8 +679,13 @@ public:
|
|||||||
wxSTCListBox(wxWindow* parent, wxWindowID id,
|
wxSTCListBox(wxWindow* parent, wxWindowID id,
|
||||||
const wxPoint& pos, const wxSize& size,
|
const wxPoint& pos, const wxSize& size,
|
||||||
long style)
|
long style)
|
||||||
: wxListView(parent, id, pos, size, style)
|
: wxListView()
|
||||||
{}
|
{
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
Hide(); // don't flicker as we move it around...
|
||||||
|
#endif
|
||||||
|
Create(parent, id, pos, size, style);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void OnFocus(wxFocusEvent& event) {
|
void OnFocus(wxFocusEvent& event) {
|
||||||
@@ -724,8 +729,138 @@ END_EVENT_TABLE()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if wxUSE_POPUPWIN //-----------------------------------
|
||||||
|
#include <wx/popupwin.h>
|
||||||
|
|
||||||
// A window to place the wxSTCListBox upon
|
|
||||||
|
//
|
||||||
|
// TODO: Refactor these two classes to have a common base (or a mix-in) to get
|
||||||
|
// rid of the code duplication. (Either that or convince somebody to
|
||||||
|
// implement wxPopupWindow for the Mac!!)
|
||||||
|
//
|
||||||
|
// In the meantime, be careful to duplicate any changes as needed...
|
||||||
|
//
|
||||||
|
|
||||||
|
// A popup window to place the wxSTCListBox upon
|
||||||
|
class wxSTCListBoxWin : public wxPopupWindow
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
wxListView* lv;
|
||||||
|
CallBackAction doubleClickAction;
|
||||||
|
void* doubleClickActionData;
|
||||||
|
public:
|
||||||
|
wxSTCListBoxWin(wxWindow* parent, wxWindowID id) :
|
||||||
|
wxPopupWindow(parent, wxBORDER_NONE)
|
||||||
|
{
|
||||||
|
SetBackgroundColour(*wxBLACK); // for our simple border
|
||||||
|
|
||||||
|
lv = new wxSTCListBox(parent, id, wxDefaultPosition, wxDefaultSize,
|
||||||
|
wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxBORDER_NONE);
|
||||||
|
lv->SetCursor(wxCursor(wxCURSOR_ARROW));
|
||||||
|
lv->InsertColumn(0, wxEmptyString);
|
||||||
|
lv->InsertColumn(1, wxEmptyString);
|
||||||
|
|
||||||
|
// NOTE: We need to fool the wxListView into thinking that it has the
|
||||||
|
// focus so it will use the normal selection colour and will look
|
||||||
|
// "right" to the user. But since the wxPopupWindow or its children
|
||||||
|
// can't receive focus then we have to pull a fast one and temporarily
|
||||||
|
// parent the listctrl on the STC window and then call SetFocus and
|
||||||
|
// then reparent it back to the popup.
|
||||||
|
lv->SetFocus();
|
||||||
|
lv->Reparent(this);
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
lv->Show();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set position in client coords
|
||||||
|
virtual void DoSetSize(int x, int y,
|
||||||
|
int width, int height,
|
||||||
|
int sizeFlags = wxSIZE_AUTO) {
|
||||||
|
if (x != wxDefaultCoord) {
|
||||||
|
GetParent()->ClientToScreen(&x, NULL);
|
||||||
|
}
|
||||||
|
if (y != wxDefaultCoord) {
|
||||||
|
GetParent()->ClientToScreen(NULL, &y);
|
||||||
|
}
|
||||||
|
wxPopupWindow::DoSetSize(x, y, width, height, sizeFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return position as if it were in client coords
|
||||||
|
virtual void DoGetPosition( int *x, int *y ) const {
|
||||||
|
int sx, sy;
|
||||||
|
wxPopupWindow::DoGetPosition(&sx, &sy);
|
||||||
|
GetParent()->ScreenToClient(&sx, &sy);
|
||||||
|
if (x) *x = sx;
|
||||||
|
if (y) *y = sy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Destroy() {
|
||||||
|
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) {
|
||||||
|
GetParent()->SetFocus();
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
class wxSTCListBoxWin : public wxWindow {
|
class wxSTCListBoxWin : public wxWindow {
|
||||||
private:
|
private:
|
||||||
wxListView* lv;
|
wxListView* lv;
|
||||||
@@ -827,6 +962,7 @@ BEGIN_EVENT_TABLE(wxSTCListBoxWin, wxWindow)
|
|||||||
EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate)
|
EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSTCListBoxWin::OnActivate)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
#endif // wxUSE_POPUPWIN -----------------------------------
|
||||||
|
|
||||||
|
|
||||||
inline wxSTCListBoxWin* GETLBW(WindowID win) {
|
inline wxSTCListBoxWin* GETLBW(WindowID win) {
|
||||||
|
@@ -1010,28 +1010,25 @@ void ScintillaWX::DoScrollToColumn(int column) {
|
|||||||
HorizontalScrollTo(column * vs.spaceWidth);
|
HorizontalScrollTo(column * vs.spaceWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __WXGTK__
|
// wxGTK doesn't appear to need this explicit clipping code any longer, but I
|
||||||
void ScintillaWX::ClipChildren(wxDC& dc, PRectangle rect) {
|
// will leave it here commented out for a while just in case...
|
||||||
wxRegion rgn(wxRectFromPRectangle(rect));
|
void ScintillaWX::ClipChildren(wxDC& WXUNUSED(dc), PRectangle WXUNUSED(rect))
|
||||||
if (ac.Active()) {
|
{
|
||||||
wxRect childRect = ((wxWindow*)ac.lb->GetID())->GetRect();
|
// wxRegion rgn(wxRectFromPRectangle(rect));
|
||||||
rgn.Subtract(childRect);
|
// if (ac.Active()) {
|
||||||
}
|
// wxRect childRect = ((wxWindow*)ac.lb->GetID())->GetRect();
|
||||||
if (ct.inCallTipMode) {
|
// rgn.Subtract(childRect);
|
||||||
wxSTCCallTip* tip = (wxSTCCallTip*)ct.wCallTip.GetID();
|
// }
|
||||||
wxRect childRect = tip->GetRect();
|
// if (ct.inCallTipMode) {
|
||||||
#if wxUSE_POPUPWIN && wxSTC_USE_POPUP
|
// wxSTCCallTip* tip = (wxSTCCallTip*)ct.wCallTip.GetID();
|
||||||
childRect.SetPosition(tip->GetMyPosition());
|
// wxRect childRect = tip->GetRect();
|
||||||
#endif
|
// #if wxUSE_POPUPWIN && wxSTC_USE_POPUP
|
||||||
rgn.Subtract(childRect);
|
// childRect.SetPosition(tip->GetMyPosition());
|
||||||
}
|
// #endif
|
||||||
|
// rgn.Subtract(childRect);
|
||||||
dc.SetClippingRegion(rgn);
|
// }
|
||||||
|
// dc.SetClippingRegion(rgn);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
void ScintillaWX::ClipChildren(wxDC& WXUNUSED(dc), PRectangle WXUNUSED(rect)) {
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void ScintillaWX::SetUseAntiAliasing(bool useAA) {
|
void ScintillaWX::SetUseAntiAliasing(bool useAA) {
|
||||||
|
Reference in New Issue
Block a user