]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/combocmn.cpp
Fail instead of crashing in wxGTK wxCursor::CloneGDIRefData().
[wxWidgets.git] / src / common / combocmn.cpp
index a256b660c403c4feea64b344d275572d01589c12..e87b7df0d8aad5d3387c28d8f07362eb6501140f 100644 (file)
 #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
@@ -231,10 +235,10 @@ static inline bool IsPopupWinTypePerfect( wxByte popupWinType )
 #else
     return ( popupWinType == POPUPWIN_GENERICTLW
         #if POPUPWIN_IS_PERFECT
-             || popupWinType == POPUPWIN_WXPOPUPWINDOW 
+             || popupWinType == POPUPWIN_WXPOPUPWINDOW
         #endif
         #if TRANSIENT_POPUPWIN_IS_PERFECT
-             || popupWinType == POPUPWIN_WXPOPUPTRANSIENTWINDOW 
+             || popupWinType == POPUPWIN_WXPOPUPTRANSIENTWINDOW
         #endif
             );
 #endif
@@ -669,7 +673,8 @@ void wxComboBoxExtraInputHandler::OnFocus(wxFocusEvent& event)
     //     wxEVT_SET_FOCUSes (since m_text->SetFocus is called
     //     from combo's focus event handler), they should be quite
     //     harmless.
-    wxFocusEvent evt2(event.GetEventType(),m_combo->GetId());
+    wxFocusEvent evt2(event);
+    evt2.SetId(m_combo->GetId());
     evt2.SetEventObject(m_combo);
     m_combo->GetEventHandler()->ProcessEvent(evt2);
 
@@ -905,6 +910,7 @@ void wxComboCtrlBase::Init()
     m_extRight = 0;
     m_marginLeft = -1;
     m_iFlags = 0;
+    m_textCtrlStyle = 0;
     m_timeCanAcceptClick = 0;
 
     m_resetFocus = false;
@@ -968,7 +974,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.
-        style |= wxTE_PROCESS_TAB;
+        style |= wxTE_PROCESS_TAB | m_textCtrlStyle;
 
         if ( HasFlag(wxTE_PROCESS_ENTER) )
             style |= wxTE_PROCESS_ENTER;
@@ -1197,7 +1203,7 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust
             // There is special custom paint area - it is better to
             // use some margin with the wxTextCtrl.
             m_text->SetMargins(m_marginLeft);
-            x = m_tcArea.x + m_widthCustomPaint + 
+            x = m_tcArea.x + m_widthCustomPaint +
                 m_marginLeft + textCtrlXAdjust;
         }
 
@@ -2033,21 +2039,18 @@ void wxComboCtrlBase::DestroyPopup()
     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);
-        delete m_popupWinEvtHandler;
-        m_popupWinEvtHandler = NULL;
+        wxDELETE(m_popupWinEvtHandler);
         m_winPopup->Destroy();
+        m_winPopup = NULL;
     }
 
-    m_popupEvtHandler = NULL;
-    m_popupInterface = NULL;
-    m_winPopup = NULL;
     m_popup = NULL;
 }
 
@@ -2090,17 +2093,24 @@ void wxComboCtrlBase::OnButtonClick()
 {
     // Derived classes can override this method for totally custom
     // popup action
-    if ( !IsPopupWindowState(Visible) )
+    switch ( GetPopupWindowState() )
     {
-        wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId());
-        event.SetEventObject(this);
-        HandleWindowEvent(event);
+        case Hidden:
+        {
+            wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId());
+            event.SetEventObject(this);
+            HandleWindowEvent(event);
 
-        ShowPopup();
-    }
-    else
-    {
-        HidePopup(true);
+            ShowPopup();
+            break;
+        }
+
+        case Animating:
+        case Visible:
+        {
+            HidePopup(true);
+            break;
+        }
     }
 }
 
@@ -2545,6 +2555,14 @@ wxCoord wxComboCtrlBase::GetNativeTextIndent() const
     return DEFAULT_TEXT_INDENT;
 }
 
+void wxComboCtrlBase::SetTextCtrlStyle( int style )
+{
+    m_textCtrlStyle = style;
+
+    if ( m_text )
+        m_text->SetWindowStyle(style);
+}
+
 // ----------------------------------------------------------------------------
 // methods forwarded to wxTextCtrl
 // ----------------------------------------------------------------------------