X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/48284cc7c4f8007917ae2f878cd2a76cce4fbf1f..644b283d6aa7740c0f4478945ca423279fe6d2da:/src/common/combocmn.cpp diff --git a/src/common/combocmn.cpp b/src/common/combocmn.cpp index 99c9a8bb7a..5df0a61af5 100644 --- a/src/common/combocmn.cpp +++ b/src/common/combocmn.cpp @@ -66,13 +66,6 @@ #define TEXTCTRL_TEXT_CENTERED 0 // 1 if text in textctrl is vertically centered #define FOCUS_RING 0 // No focus ring on wxMSW -#if !defined(__WXWINCE__) - // 1 if wxTextEntry::SetMargins() can be used to set the left margin - #define LEFT_MARGIN_CAN_BE_SET 1 -#else - #define LEFT_MARGIN_CAN_BE_SET 0 -#endif - //#undef wxUSE_POPUPWIN //#define wxUSE_POPUPWIN 0 @@ -97,13 +90,6 @@ #define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered #define FOCUS_RING 0 // No focus ring on wxGTK -#if GTK_CHECK_VERSION(2,10,0) - // 1 if wxTextEntry::SetMargins() can be used to set the left margin - #define LEFT_MARGIN_CAN_BE_SET 1 -#else - #define LEFT_MARGIN_CAN_BE_SET 0 -#endif - #elif defined(__WXMAC__) #define USE_TRANSIENT_POPUP 1 // Use wxPopupWindowTransient (preferred, if it works properly on platform) @@ -118,9 +104,6 @@ #undef COMBO_MARGIN #define COMBO_MARGIN FOCUS_RING -// 1 if wxTextEntry::SetMargins() can be used to set the left margin -#define LEFT_MARGIN_CAN_BE_SET 0 - #else #define USE_TRANSIENT_POPUP 0 // Use wxPopupWindowTransient (preferred, if it works properly on platform) @@ -130,9 +113,6 @@ #define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered #define FOCUS_RING 0 -// 1 if wxTextEntry::SetMargins() can be used to set the left margin -#define LEFT_MARGIN_CAN_BE_SET 0 - #endif @@ -311,7 +291,7 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) winFocused != m_combo->GetButton() // GTK (atleast) requires this ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); } event.Skip(); @@ -319,37 +299,37 @@ void wxComboFrameEventHandler::OnIdle( wxIdleEvent& event ) void wxComboFrameEventHandler::OnMenuEvent( wxMenuEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnMouseEvent( wxMouseEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnClose( wxCloseEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnActivate( wxActivateEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnResize( wxSizeEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } void wxComboFrameEventHandler::OnMove( wxMoveEvent& event ) { - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } @@ -433,7 +413,7 @@ void wxComboPopupWindow::OnDismiss() wxASSERT_MSG( combo->IsKindOf(CLASSINFO(wxComboCtrlBase)), wxT("parent might not be wxComboCtrl, but check IMPLEMENT_DYNAMIC_CLASS(2) macro for correctness") ); - combo->OnPopupDismiss(); + combo->OnPopupDismiss(true); } #endif // USES_WXPOPUPTRANSIENTWINDOW @@ -496,7 +476,7 @@ void wxComboPopupWindowEvtHandler::OnActivate( wxActivateEvent& event ) if ( !event.GetActive() ) { // Tell combo control that we are dismissed. - m_combo->HidePopup(); + m_combo->HidePopup(true); event.Skip(); } @@ -571,7 +551,7 @@ bool wxComboPopup::LazyCreate() void wxComboPopup::Dismiss() { - m_combo->HidePopup(); + m_combo->HidePopup(true); } // ---------------------------------------------------------------------------- @@ -1085,14 +1065,26 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust int customBorder = m_widthCustomBorder; if ( (m_text->GetWindowStyleFlag() & wxBORDER_MASK) == wxNO_BORDER ) { -#if LEFT_MARGIN_CAN_BE_SET - // Call SetMargins() on textctrl if LEFT_MARGIN_CAN_BE_SET == 1 - wxUnusedVar(textCtrlXAdjust); - m_text->SetMargins(0); - textCtrlXAdjust = 0; -#endif + int x; - // Centre textctrl + if ( !m_widthCustomPaint ) + { + // No special custom paint area - we can use 0 left margin + // with wxTextCtrl. + if ( m_text->SetMargins(0) ) + textCtrlXAdjust = 0; + x = m_tcArea.x + m_marginLeft + textCtrlXAdjust; + } + else + { + // 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 + + m_marginLeft + textCtrlXAdjust; + } + + // Centre textctrl vertically, if needed #if !TEXTCTRL_TEXT_CENTERED int tcSizeY = m_text->GetBestSize().y; int diff0 = sz.y - tcSizeY; @@ -1105,15 +1097,9 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust if ( y < customBorder ) y = customBorder; - int x = m_tcArea.x + m_widthCustomPaint + - m_marginLeft + textCtrlXAdjust; - m_text->SetSize(x, y, m_tcArea.width - m_tcArea.x - x, - /*m_tcArea.width - COMBO_MARGIN - - (textCtrlXAdjust + m_widthCustomPaint + - m_marginLeft),*/ -1 ); // Make sure textctrl doesn't exceed the bottom custom border @@ -1249,8 +1235,15 @@ bool wxComboCtrlBase::SetFont ( const wxFont& font ) if ( !wxControl::SetFont(font) ) return false; - if (m_text) + if ( m_text ) + { + // Without hiding the wxTextCtrl there would be some + // visible 'flicker' (at least on Windows XP). + m_text->Hide(); m_text->SetFont(font); + OnResize(); + m_text->Show(); + } return true; } @@ -1631,7 +1624,7 @@ bool wxComboCtrlBase::PreprocessMouseEvent( wxMouseEvent& event, if ( IsPopupWindowState(Visible) && ( evtType == wxEVT_LEFT_DOWN || evtType == wxEVT_RIGHT_DOWN ) ) { - HidePopup(); + HidePopup(true); return true; } } @@ -1659,7 +1652,7 @@ void wxComboCtrlBase::HandleNormalMouseEvent( wxMouseEvent& event ) #if USES_WXPOPUPWINDOW // Click here always hides the popup. if ( m_popupWinType == POPUPWIN_WXPOPUPWINDOW ) - HidePopup(); + HidePopup(true); #endif } else @@ -1736,13 +1729,9 @@ void wxComboCtrlBase::OnFocusEvent( wxFocusEvent& event ) { wxWindow* tc = GetTextCtrl(); if ( tc && tc != DoFindFocus() ) -#ifdef __WXMAC__ - m_resetFocus = true; -#else { tc->SetFocus(); } -#endif } Refresh(); @@ -1819,7 +1808,7 @@ void wxComboCtrlBase::CreatePopup() // Destroy popup window and the child control void wxComboCtrlBase::DestroyPopup() { - HidePopup(); + HidePopup(true); if ( m_popup ) m_popup->RemoveEventHandler(m_popupExtraHandler); @@ -1882,9 +1871,17 @@ void wxComboCtrlBase::OnButtonClick() // Derived classes can override this method for totally custom // popup action if ( !IsPopupWindowState(Visible) ) + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_DROPDOWN, GetId()); + event.SetEventObject(this); + HandleWindowEvent(event); + ShowPopup(); + } else - HidePopup(); + { + HidePopup(true); + } } void wxComboCtrlBase::ShowPopup() @@ -2103,7 +2100,7 @@ void wxComboCtrlBase::DoShowPopup( const wxRect& rect, int WXUNUSED(flags) ) Refresh(); } -void wxComboCtrlBase::OnPopupDismiss() +void wxComboCtrlBase::OnPopupDismiss(bool generateEvent) { // Just in case, avoid double dismiss if ( IsPopupWindowState(Hidden) ) @@ -2155,9 +2152,16 @@ void wxComboCtrlBase::OnPopupDismiss() Refresh(); SetFocus(); + + if ( generateEvent ) + { + wxCommandEvent event(wxEVT_COMMAND_COMBOBOX_CLOSEUP, GetId()); + event.SetEventObject(this); + HandleWindowEvent(event); + } } -void wxComboCtrlBase::HidePopup() +void wxComboCtrlBase::HidePopup(bool generateEvent) { // Should be able to call this without popup interface if ( IsPopupWindowState(Hidden) ) @@ -2169,7 +2173,7 @@ void wxComboCtrlBase::HidePopup() m_winPopup->Hide(); - OnPopupDismiss(); + OnPopupDismiss(generateEvent); } // ----------------------------------------------------------------------------