The calltip window and autocomplete window in wxSTC will now use a

wxPopupWindow if available so they can extend beyond the client area
of the STC if needed.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14077 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2002-02-09 00:40:42 +00:00
parent 8f3e7ecc5d
commit 769a9cb2b8
5 changed files with 208 additions and 36 deletions

View File

@@ -453,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 { class wxSTCListBox : public wxListBox {
public: public:
wxSTCListBox(wxWindow* parent, wxWindowID id) wxSTCListBox(wxWindow* parent, wxWindowID id)
: wxListBox(parent, id, wxDefaultPosition, wxDefaultSize, : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize,
0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER) // | wxLB_SORT ) 0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER)
{} {}
void OnFocus(wxFocusEvent& event) { void OnFocus(wxFocusEvent& event) {
@@ -474,6 +478,64 @@ BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
END_EVENT_TABLE() 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 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
class wxSTCListBoxWin : public wxSTCListBoxWinBase {
public:
wxSTCListBoxWin(wxWindow* parent, wxWindowID id)
: wxSTCListBoxWinBase(parent, param2) {
lb = new wxSTCListBox(this, id);
}
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() { ListBox::ListBox() {
} }
@@ -481,15 +543,15 @@ ListBox::~ListBox() {
} }
void ListBox::Create(Window &parent, int ctrlID) { void ListBox::Create(Window &parent, int ctrlID) {
id = new wxSTCListBox(parent.id, ctrlID); id = new wxSTCListBoxWin(parent.id, ctrlID);
} }
void ListBox::SetVisibleRows(int rows) { void ListBox::SetVisibleRows(int rows) {
desiredVisibleRows = rows; desiredVisibleRows = rows;
} }
PRectangle ListBox::GetDesiredRect() { PRectangle ListBox::GetDesiredRect() {
wxSize sz = ((wxListBox*)id)->GetBestSize(); wxSize sz = GETLB(id)->GetBestSize();
PRectangle rc; PRectangle rc;
rc.top = 0; rc.top = 0;
rc.left = 0; rc.left = 0;
@@ -507,34 +569,34 @@ void ListBox::SetAverageCharWidth(int width) {
} }
void ListBox::SetFont(Font &font) { void ListBox::SetFont(Font &font) {
Window::SetFont(font); GETLB(id)->SetFont(*font.GetID());
} }
void ListBox::Clear() { void ListBox::Clear() {
((wxListBox*)id)->Clear(); GETLB(id)->Clear();
} }
void ListBox::Append(char *s) { void ListBox::Append(char *s) {
((wxListBox*)id)->Append(s); GETLB(id)->Append(s);
} }
int ListBox::Length() { int ListBox::Length() {
return ((wxListBox*)id)->GetCount(); return GETLB(id)->GetCount();
} }
void ListBox::Select(int n) { void ListBox::Select(int n) {
((wxListBox*)id)->SetSelection(n); GETLB(id)->SetSelection(n);
#ifdef __WXGTK__ #ifdef __WXGTK__
if (n > 4) if (n > 4)
n = n - 4; n = n - 4;
else else
n = 1; n = 1;
((wxListBox*)id)->SetFirstItem(n); GETLB(id)->SetFirstItem(n);
#endif #endif
} }
int ListBox::GetSelection() { int ListBox::GetSelection() {
return ((wxListBox*)id)->GetSelection(); return GETLB(id)->GetSelection();
} }
int ListBox::Find(const char *prefix) { int ListBox::Find(const char *prefix) {
@@ -543,13 +605,12 @@ int ListBox::Find(const char *prefix) {
} }
void ListBox::GetValue(int n, char *value, int len) { 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); strncpy(value, text.c_str(), len);
value[len-1] = '\0'; value[len-1] = '\0';
} }
void ListBox::Sort() { void ListBox::Sort() {
// wxWindows keeps sorted so no need to sort
} }

View File

@@ -63,10 +63,19 @@ void wxSTCDropTarget::OnLeave() {
#endif #endif
class wxSTCCallTip : public wxWindow { #if wxUSE_POPUPWIN
#include <wx/popupwin.h>
#define wxSTCCallTipBase wxPopupWindow
#define param2 wxBORDER_NONE // popup's 2nd param is flags
#else
#define wxSTCCallTipBase wxWindow
#define param2 -1 // wxWindows 2nd param is ID
#endif
class wxSTCCallTip : public wxSTCCallTipBase {
public: public:
wxSTCCallTip(wxWindow* parent, int ID, CallTip* ct) wxSTCCallTip(wxWindow* parent, CallTip* ct)
: wxWindow(parent, ID) : wxSTCCallTipBase(parent, param2)
{ {
m_ct = ct; m_ct = ct;
} }
@@ -79,14 +88,28 @@ public:
surfaceWindow.Release(); surfaceWindow.Release();
} }
#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);
wxSTCCallTipBase::DoSetSize(x, y, width, height, sizeFlags);
}
#endif
private:
CallTip* m_ct; CallTip* m_ct;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
BEGIN_EVENT_TABLE(wxSTCCallTip, wxWindow) BEGIN_EVENT_TABLE(wxSTCCallTip, wxSTCCallTipBase)
EVT_PAINT(wxSTCCallTip::OnPaint) EVT_PAINT(wxSTCCallTip::OnPaint)
END_EVENT_TABLE() END_EVENT_TABLE()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// Constructor/Destructor // Constructor/Destructor
@@ -313,7 +336,7 @@ bool ScintillaWX::CanPaste() {
} }
void ScintillaWX::CreateCallTipWindow(PRectangle) { void ScintillaWX::CreateCallTipWindow(PRectangle) {
ct.wCallTip = new wxSTCCallTip(stc, -1, &ct); ct.wCallTip = new wxSTCCallTip(stc, &ct);
ct.wDraw = ct.wCallTip; ct.wDraw = ct.wCallTip;
} }

View File

@@ -453,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 { class wxSTCListBox : public wxListBox {
public: public:
wxSTCListBox(wxWindow* parent, wxWindowID id) wxSTCListBox(wxWindow* parent, wxWindowID id)
: wxListBox(parent, id, wxDefaultPosition, wxDefaultSize, : wxListBox(parent, id, wxDefaultPosition, wxDefaultSize,
0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER) // | wxLB_SORT ) 0, NULL, wxLB_SINGLE | wxSIMPLE_BORDER)
{} {}
void OnFocus(wxFocusEvent& event) { void OnFocus(wxFocusEvent& event) {
@@ -474,6 +478,64 @@ BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
END_EVENT_TABLE() 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 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
class wxSTCListBoxWin : public wxSTCListBoxWinBase {
public:
wxSTCListBoxWin(wxWindow* parent, wxWindowID id)
: wxSTCListBoxWinBase(parent, param2) {
lb = new wxSTCListBox(this, id);
}
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() { ListBox::ListBox() {
} }
@@ -481,15 +543,15 @@ ListBox::~ListBox() {
} }
void ListBox::Create(Window &parent, int ctrlID) { void ListBox::Create(Window &parent, int ctrlID) {
id = new wxSTCListBox(parent.id, ctrlID); id = new wxSTCListBoxWin(parent.id, ctrlID);
} }
void ListBox::SetVisibleRows(int rows) { void ListBox::SetVisibleRows(int rows) {
desiredVisibleRows = rows; desiredVisibleRows = rows;
} }
PRectangle ListBox::GetDesiredRect() { PRectangle ListBox::GetDesiredRect() {
wxSize sz = ((wxListBox*)id)->GetBestSize(); wxSize sz = GETLB(id)->GetBestSize();
PRectangle rc; PRectangle rc;
rc.top = 0; rc.top = 0;
rc.left = 0; rc.left = 0;
@@ -507,34 +569,34 @@ void ListBox::SetAverageCharWidth(int width) {
} }
void ListBox::SetFont(Font &font) { void ListBox::SetFont(Font &font) {
Window::SetFont(font); GETLB(id)->SetFont(*font.GetID());
} }
void ListBox::Clear() { void ListBox::Clear() {
((wxListBox*)id)->Clear(); GETLB(id)->Clear();
} }
void ListBox::Append(char *s) { void ListBox::Append(char *s) {
((wxListBox*)id)->Append(s); GETLB(id)->Append(s);
} }
int ListBox::Length() { int ListBox::Length() {
return ((wxListBox*)id)->GetCount(); return GETLB(id)->GetCount();
} }
void ListBox::Select(int n) { void ListBox::Select(int n) {
((wxListBox*)id)->SetSelection(n); GETLB(id)->SetSelection(n);
#ifdef __WXGTK__ #ifdef __WXGTK__
if (n > 4) if (n > 4)
n = n - 4; n = n - 4;
else else
n = 1; n = 1;
((wxListBox*)id)->SetFirstItem(n); GETLB(id)->SetFirstItem(n);
#endif #endif
} }
int ListBox::GetSelection() { int ListBox::GetSelection() {
return ((wxListBox*)id)->GetSelection(); return GETLB(id)->GetSelection();
} }
int ListBox::Find(const char *prefix) { int ListBox::Find(const char *prefix) {
@@ -543,13 +605,12 @@ int ListBox::Find(const char *prefix) {
} }
void ListBox::GetValue(int n, char *value, int len) { 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); strncpy(value, text.c_str(), len);
value[len-1] = '\0'; value[len-1] = '\0';
} }
void ListBox::Sort() { void ListBox::Sort() {
// wxWindows keeps sorted so no need to sort
} }

View File

@@ -63,10 +63,19 @@ void wxSTCDropTarget::OnLeave() {
#endif #endif
class wxSTCCallTip : public wxWindow { #if wxUSE_POPUPWIN
#include <wx/popupwin.h>
#define wxSTCCallTipBase wxPopupWindow
#define param2 wxBORDER_NONE // popup's 2nd param is flags
#else
#define wxSTCCallTipBase wxWindow
#define param2 -1 // wxWindows 2nd param is ID
#endif
class wxSTCCallTip : public wxSTCCallTipBase {
public: public:
wxSTCCallTip(wxWindow* parent, int ID, CallTip* ct) wxSTCCallTip(wxWindow* parent, CallTip* ct)
: wxWindow(parent, ID) : wxSTCCallTipBase(parent, param2)
{ {
m_ct = ct; m_ct = ct;
} }
@@ -79,14 +88,28 @@ public:
surfaceWindow.Release(); surfaceWindow.Release();
} }
#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);
wxSTCCallTipBase::DoSetSize(x, y, width, height, sizeFlags);
}
#endif
private:
CallTip* m_ct; CallTip* m_ct;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
BEGIN_EVENT_TABLE(wxSTCCallTip, wxWindow) BEGIN_EVENT_TABLE(wxSTCCallTip, wxSTCCallTipBase)
EVT_PAINT(wxSTCCallTip::OnPaint) EVT_PAINT(wxSTCCallTip::OnPaint)
END_EVENT_TABLE() END_EVENT_TABLE()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// Constructor/Destructor // Constructor/Destructor
@@ -313,7 +336,7 @@ bool ScintillaWX::CanPaste() {
} }
void ScintillaWX::CreateCallTipWindow(PRectangle) { void ScintillaWX::CreateCallTipWindow(PRectangle) {
ct.wCallTip = new wxSTCCallTip(stc, -1, &ct); ct.wCallTip = new wxSTCCallTip(stc, &ct);
ct.wDraw = ct.wCallTip; ct.wDraw = ct.wCallTip;
} }

View File

@@ -10,6 +10,10 @@ Added wxGenericDirCtrl.
Added wxMultiChoiceDialog. Added wxMultiChoiceDialog.
The calltip window and autocomplete window in wxSTC will now use a
wxPopupWindow if available so they can extend beyond the client area
of the STC if needed.
2.3.2.1 2.3.2.1