]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixes in focus handling related to the AutoComplete window.
authorRobin Dunn <robin@alldunn.com>
Tue, 23 Sep 2003 23:42:41 +0000 (23:42 +0000)
committerRobin Dunn <robin@alldunn.com>
Tue, 23 Sep 2003 23:42:41 +0000 (23:42 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@23865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

contrib/src/stc/PlatWX.cpp
contrib/src/stc/ScintillaWX.cpp
contrib/src/stc/ScintillaWX.h
src/stc/PlatWX.cpp
src/stc/ScintillaWX.cpp
src/stc/ScintillaWX.h

index db2960ad5bf7690057e5b1b3937e0c1bb75298e8..4de8021ab35b572bdbb429e9e4112c86b4392170 100644 (file)
@@ -698,7 +698,7 @@ void Window::SetTitle(const char *s) {
 // Helper classes for ListBox
 
 
-// This is a simple subclass of wxLIstView that just resets focus to the
+// This is a simple subclass of wxListView that just resets focus to the
 // parent when it gets it.
 class wxSTCListBox : public wxListView {
 public:
@@ -713,12 +713,17 @@ public:
         event.Skip();
     }
 
+    void OnKillFocus(wxFocusEvent& event) {
+        // Do nothing.  Prevents base class from resetting the colors...
+    }
+
 private:
     DECLARE_EVENT_TABLE()
 };
 
 BEGIN_EVENT_TABLE(wxSTCListBox, wxListView)
     EVT_SET_FOCUS( wxSTCListBox::OnFocus)
+    EVT_KILL_FOCUS(wxSTCListBox::OnKillFocus)
 END_EVENT_TABLE()
 
 
@@ -741,6 +746,11 @@ public:
         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();
     }
 
index 73fd2d1f7512b3add4ee41f7d656d5dd0b0a464f..6acb7805d1a7996cc1e8831ecf9099f809d7442f 100644 (file)
@@ -136,6 +136,7 @@ END_EVENT_TABLE()
 
 ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
     capturedMouse = false;
+    focusEvent = false;
     wMain = win;
     stc   = win;
     wheelRotation = 0;
@@ -333,6 +334,18 @@ void ScintillaWX::NotifyParent(SCNotification scn) {
 }
 
 
+// This method is overloaded from ScintillaBase in order to prevent the
+// AutoComplete window from being destroyed when it gets the focus.  There is
+// a side effect that the AutoComp will also not be destroyed when switching
+// to another window, but I think that is okay.
+void ScintillaWX::CancelModes() {
+    if (! focusEvent)
+        AutoCompleteCancel();
+    ct.CallTipCancel();
+    Editor::CancelModes();
+}
+
+
 
 void ScintillaWX::Copy() {
     if (currentPos != anchor) {
@@ -606,11 +619,15 @@ void ScintillaWX::DoSize(int WXUNUSED(width), int WXUNUSED(height)) {
 }
 
 void ScintillaWX::DoLoseFocus(){
+    focusEvent = true;
     SetFocusState(false);
+    focusEvent = false;
 }
 
 void ScintillaWX::DoGainFocus(){
+    focusEvent = true;
     SetFocusState(true);
+    focusEvent = false;
 }
 
 void ScintillaWX::DoSysColourChange() {
index 2a6c5b5dbd92ea4f529051533682d23179b14b87..d0d383d50765f74b05c441fcced9f4fd685b2ee9 100644 (file)
@@ -124,6 +124,7 @@ public:
     virtual void NotifyChange();
     virtual void NotifyParent(SCNotification scn);
 
+    virtual void CancelModes();
 
     // Event delegates
     void DoPaint(wxDC* dc, wxRect rect);
@@ -164,6 +165,7 @@ public:
 
 private:
     bool                capturedMouse;
+    bool                focusEvent;
     wxStyledTextCtrl*   stc;
 
 #if wxUSE_DRAG_AND_DROP
index db2960ad5bf7690057e5b1b3937e0c1bb75298e8..4de8021ab35b572bdbb429e9e4112c86b4392170 100644 (file)
@@ -698,7 +698,7 @@ void Window::SetTitle(const char *s) {
 // Helper classes for ListBox
 
 
-// This is a simple subclass of wxLIstView that just resets focus to the
+// This is a simple subclass of wxListView that just resets focus to the
 // parent when it gets it.
 class wxSTCListBox : public wxListView {
 public:
@@ -713,12 +713,17 @@ public:
         event.Skip();
     }
 
+    void OnKillFocus(wxFocusEvent& event) {
+        // Do nothing.  Prevents base class from resetting the colors...
+    }
+
 private:
     DECLARE_EVENT_TABLE()
 };
 
 BEGIN_EVENT_TABLE(wxSTCListBox, wxListView)
     EVT_SET_FOCUS( wxSTCListBox::OnFocus)
+    EVT_KILL_FOCUS(wxSTCListBox::OnKillFocus)
 END_EVENT_TABLE()
 
 
@@ -741,6 +746,11 @@ public:
         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();
     }
 
index 73fd2d1f7512b3add4ee41f7d656d5dd0b0a464f..6acb7805d1a7996cc1e8831ecf9099f809d7442f 100644 (file)
@@ -136,6 +136,7 @@ END_EVENT_TABLE()
 
 ScintillaWX::ScintillaWX(wxStyledTextCtrl* win) {
     capturedMouse = false;
+    focusEvent = false;
     wMain = win;
     stc   = win;
     wheelRotation = 0;
@@ -333,6 +334,18 @@ void ScintillaWX::NotifyParent(SCNotification scn) {
 }
 
 
+// This method is overloaded from ScintillaBase in order to prevent the
+// AutoComplete window from being destroyed when it gets the focus.  There is
+// a side effect that the AutoComp will also not be destroyed when switching
+// to another window, but I think that is okay.
+void ScintillaWX::CancelModes() {
+    if (! focusEvent)
+        AutoCompleteCancel();
+    ct.CallTipCancel();
+    Editor::CancelModes();
+}
+
+
 
 void ScintillaWX::Copy() {
     if (currentPos != anchor) {
@@ -606,11 +619,15 @@ void ScintillaWX::DoSize(int WXUNUSED(width), int WXUNUSED(height)) {
 }
 
 void ScintillaWX::DoLoseFocus(){
+    focusEvent = true;
     SetFocusState(false);
+    focusEvent = false;
 }
 
 void ScintillaWX::DoGainFocus(){
+    focusEvent = true;
     SetFocusState(true);
+    focusEvent = false;
 }
 
 void ScintillaWX::DoSysColourChange() {
index 2a6c5b5dbd92ea4f529051533682d23179b14b87..d0d383d50765f74b05c441fcced9f4fd685b2ee9 100644 (file)
@@ -124,6 +124,7 @@ public:
     virtual void NotifyChange();
     virtual void NotifyParent(SCNotification scn);
 
+    virtual void CancelModes();
 
     // Event delegates
     void DoPaint(wxDC* dc, wxRect rect);
@@ -164,6 +165,7 @@ public:
 
 private:
     bool                capturedMouse;
+    bool                focusEvent;
     wxStyledTextCtrl*   stc;
 
 #if wxUSE_DRAG_AND_DROP