]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/combocmn.cpp
Use the same logic for closing dialogs as for handling Escape key.
[wxWidgets.git] / src / common / combocmn.cpp
index 10e0da7dcdf0b0d017266aeaa975dd4f275741b5..6c4c8df14717ffe983a31c26fbf8aed089505d24 100644 (file)
 #define wxCC_GENERIC_TLW_IS_DIALOG
 #define wxComboCtrlGenericTLW   wxDialog
 
 #define wxCC_GENERIC_TLW_IS_DIALOG
 #define wxComboCtrlGenericTLW   wxDialog
 
-#include "wx/gtk/private.h"
+#if defined(__WXGTK20__)
+# include "wx/gtk/private.h"
+#else
+# include "wx/gtk1/private.h"
+#endif
 
 // NB: Let's not be afraid to use wxGTK's wxPopupTransientWindow as a
 //     'perfect' popup, as it can succesfully host child controls even in
 
 // NB: Let's not be afraid to use wxGTK's wxPopupTransientWindow as a
 //     'perfect' popup, as it can succesfully host child controls even in
@@ -221,6 +225,26 @@ enum
 #endif
 
 
 #endif
 
 
+// Returns true if given popup window type can be classified as perfect
+// on this platform.
+static inline bool IsPopupWinTypePerfect( wxByte popupWinType )
+{
+#if POPUPWIN_IS_PERFECT && TRANSIENT_POPUPWIN_IS_PERFECT
+    wxUnusedVar(popupWinType);
+    return true;
+#else
+    return ( popupWinType == POPUPWIN_GENERICTLW
+        #if POPUPWIN_IS_PERFECT
+             || popupWinType == POPUPWIN_WXPOPUPWINDOW 
+        #endif
+        #if TRANSIENT_POPUPWIN_IS_PERFECT
+             || popupWinType == POPUPWIN_WXPOPUPTRANSIENTWINDOW 
+        #endif
+            );
+#endif
+}
+
+
 //
 // ** TODO **
 // * wxComboPopupWindow for external use (ie. replace old wxUniv wxPopupComboWindow)
 //
 // ** TODO **
 // * wxComboPopupWindow for external use (ie. replace old wxUniv wxPopupComboWindow)
@@ -760,6 +784,12 @@ void wxComboPopupEvtHandler::OnMouseEvent( wxMouseEvent& event )
                 // block this one)
                 m_blockEventsToPopup = false;
                 event.Skip(false);
                 // block this one)
                 m_blockEventsToPopup = false;
                 event.Skip(false);
+
+                // Also, this button press was (probably) used to display
+                // the popup, so relay it back to the drop-down button
+                // (which supposedly originated it). This is necessary to
+                // refresh it properly.
+                relayToButton = true;
             }
         }
         else if ( m_blockEventsToPopup )
             }
         }
         else if ( m_blockEventsToPopup )
@@ -789,12 +819,14 @@ void wxComboPopupEvtHandler::OnMouseEvent( wxMouseEvent& event )
 
     if ( relayToButton )
     {
 
     if ( relayToButton )
     {
-        wxWindow* eventSink = m_combo;
         wxWindow* btn = m_combo->GetButton();
         if ( btn )
         wxWindow* btn = m_combo->GetButton();
         if ( btn )
-            eventSink = btn;
-
-        eventSink->GetEventHandler()->ProcessEvent(event);
+            btn->GetEventHandler()->ProcessEvent(event);
+        else
+            // Bypass the event handling mechanism. Using it would be
+            // confusing for the platform-specific wxComboCtrl
+            // implementations.
+            m_combo->HandleButtonMouseEvent(event, 0);
     }
 }
 
     }
 }
 
@@ -877,6 +909,7 @@ void wxComboCtrlBase::Init()
     m_extRight = 0;
     m_marginLeft = -1;
     m_iFlags = 0;
     m_extRight = 0;
     m_marginLeft = -1;
     m_iFlags = 0;
+    m_textCtrlStyle = 0;
     m_timeCanAcceptClick = 0;
 
     m_resetFocus = false;
     m_timeCanAcceptClick = 0;
 
     m_resetFocus = false;
@@ -940,7 +973,7 @@ wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator)
         // not used by the wxPropertyGrid and therefore the tab is processed by
         // looking at ancestors to see if they have wxTAB_TRAVERSAL. The
         // navigation event is then sent to the wrong window.
         // not used by the wxPropertyGrid and therefore the tab is processed by
         // looking at ancestors to see if they have wxTAB_TRAVERSAL. The
         // navigation event is then sent to the wrong window.
-        style |= wxTE_PROCESS_TAB;
+        style |= wxTE_PROCESS_TAB | m_textCtrlStyle;
 
         if ( HasFlag(wxTE_PROCESS_ENTER) )
             style |= wxTE_PROCESS_ENTER;
 
         if ( HasFlag(wxTE_PROCESS_ENTER) )
             style |= wxTE_PROCESS_ENTER;
@@ -2005,21 +2038,18 @@ void wxComboCtrlBase::DestroyPopup()
     if ( m_popup )
         m_popup->RemoveEventHandler(m_popupEvtHandler);
 
     if ( m_popup )
         m_popup->RemoveEventHandler(m_popupEvtHandler);
 
-    delete m_popupEvtHandler;
+    wxDELETE(m_popupEvtHandler);
 
 
-    delete m_popupInterface;
+    wxDELETE(m_popupInterface);
 
     if ( m_winPopup )
     {
         m_winPopup->RemoveEventHandler(m_popupWinEvtHandler);
 
     if ( m_winPopup )
     {
         m_winPopup->RemoveEventHandler(m_popupWinEvtHandler);
-        delete m_popupWinEvtHandler;
-        m_popupWinEvtHandler = NULL;
+        wxDELETE(m_popupWinEvtHandler);
         m_winPopup->Destroy();
         m_winPopup->Destroy();
+        m_winPopup = NULL;
     }
 
     }
 
-    m_popupEvtHandler = NULL;
-    m_popupInterface = NULL;
-    m_winPopup = NULL;
     m_popup = NULL;
 }
 
     m_popup = NULL;
 }
 
@@ -2280,6 +2310,13 @@ void wxComboCtrlBase::DoShowPopup( const wxRect& rect, int WXUNUSED(flags) )
             winPopup->Show();
 
         m_popupWinState = Visible;
             winPopup->Show();
 
         m_popupWinState = Visible;
+
+        // If popup window was a generic top-level window, or the
+        // wxPopupWindow implemenation on this platform is classified as
+        // perfect, then we should be able to safely set focus to the popup
+        // control.
+        if ( IsPopupWinTypePerfect(m_popupWinType) )
+            m_popup->SetFocus();
     }
     else if ( IsPopupWindowState(Hidden) )
     {
     }
     else if ( IsPopupWindowState(Hidden) )
     {
@@ -2510,6 +2547,14 @@ wxCoord wxComboCtrlBase::GetNativeTextIndent() const
     return DEFAULT_TEXT_INDENT;
 }
 
     return DEFAULT_TEXT_INDENT;
 }
 
+void wxComboCtrlBase::SetTextCtrlStyle( int style )
+{
+    m_textCtrlStyle = style;
+
+    if ( m_text )
+        m_text->SetWindowStyle(style);
+}
+
 // ----------------------------------------------------------------------------
 // methods forwarded to wxTextCtrl
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // methods forwarded to wxTextCtrl
 // ----------------------------------------------------------------------------