]> git.saurik.com Git - wxWidgets.git/commitdiff
The calltip window and autocomplete window in wxSTC will now use a
authorRobin Dunn <robin@alldunn.com>
Sat, 9 Feb 2002 00:40:42 +0000 (00:40 +0000)
committerRobin Dunn <robin@alldunn.com>
Sat, 9 Feb 2002 00:40:42 +0000 (00:40 +0000)
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

contrib/src/stc/PlatWX.cpp
contrib/src/stc/ScintillaWX.cpp
src/stc/PlatWX.cpp
src/stc/ScintillaWX.cpp
wxPython/CHANGES.txt

index a57756bc9ce10fe308c7a614c67ec5f6b471c63e..dda64f77b22c786aa979b04956232e4025d4e94f 100644 (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 {
 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) {
@@ -474,6 +478,64 @@ BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
 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() {
 }
 
@@ -481,15 +543,15 @@ 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;
@@ -507,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) {
@@ -543,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
 }
 
 
index 6630a7d59c334eef737a4df417265b1d3e9bff13..da83a4212ca6d890cfc40652ca30672c03026bf4 100644 (file)
@@ -63,10 +63,19 @@ void  wxSTCDropTarget::OnLeave() {
 #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:
-    wxSTCCallTip(wxWindow* parent, int ID, CallTip* ct)
-        : wxWindow(parent, ID)
+    wxSTCCallTip(wxWindow* parent, CallTip* ct)
+        : wxSTCCallTipBase(parent, param2)
         {
             m_ct = ct;
         }
@@ -79,14 +88,28 @@ public:
         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;
     DECLARE_EVENT_TABLE()
 };
 
-BEGIN_EVENT_TABLE(wxSTCCallTip, wxWindow)
+BEGIN_EVENT_TABLE(wxSTCCallTip, wxSTCCallTipBase)
     EVT_PAINT(wxSTCCallTip::OnPaint)
 END_EVENT_TABLE()
 
+
 //----------------------------------------------------------------------
 // Constructor/Destructor
 
@@ -313,7 +336,7 @@ bool ScintillaWX::CanPaste() {
 }
 
 void ScintillaWX::CreateCallTipWindow(PRectangle) {
-    ct.wCallTip = new wxSTCCallTip(stc, -1, &ct);
+    ct.wCallTip = new wxSTCCallTip(stc, &ct);
     ct.wDraw = ct.wCallTip;
 }
 
index a57756bc9ce10fe308c7a614c67ec5f6b471c63e..dda64f77b22c786aa979b04956232e4025d4e94f 100644 (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 {
 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) {
@@ -474,6 +478,64 @@ BEGIN_EVENT_TABLE(wxSTCListBox, wxListBox)
 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() {
 }
 
@@ -481,15 +543,15 @@ 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;
@@ -507,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) {
@@ -543,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
 }
 
 
index 6630a7d59c334eef737a4df417265b1d3e9bff13..da83a4212ca6d890cfc40652ca30672c03026bf4 100644 (file)
@@ -63,10 +63,19 @@ void  wxSTCDropTarget::OnLeave() {
 #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:
-    wxSTCCallTip(wxWindow* parent, int ID, CallTip* ct)
-        : wxWindow(parent, ID)
+    wxSTCCallTip(wxWindow* parent, CallTip* ct)
+        : wxSTCCallTipBase(parent, param2)
         {
             m_ct = ct;
         }
@@ -79,14 +88,28 @@ public:
         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;
     DECLARE_EVENT_TABLE()
 };
 
-BEGIN_EVENT_TABLE(wxSTCCallTip, wxWindow)
+BEGIN_EVENT_TABLE(wxSTCCallTip, wxSTCCallTipBase)
     EVT_PAINT(wxSTCCallTip::OnPaint)
 END_EVENT_TABLE()
 
+
 //----------------------------------------------------------------------
 // Constructor/Destructor
 
@@ -313,7 +336,7 @@ bool ScintillaWX::CanPaste() {
 }
 
 void ScintillaWX::CreateCallTipWindow(PRectangle) {
-    ct.wCallTip = new wxSTCCallTip(stc, -1, &ct);
+    ct.wCallTip = new wxSTCCallTip(stc, &ct);
     ct.wDraw = ct.wCallTip;
 }
 
index e51d37deacb063761ca3ad6545de0e6d3646431b..110a9a021b3b7d90c6cd1569d2f034e1e936e142 100644 (file)
@@ -10,6 +10,10 @@ Added wxGenericDirCtrl.
 
 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