174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        tests/controls/styledtextctrltest.cpp
 | 
						|
// Purpose:     wxStyledTextCtrl unit test
 | 
						|
// Author:      New Pagodi
 | 
						|
// Created:     2019-03-10
 | 
						|
// Copyright:   (c) 2019 wxWidgets development team
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#include "testprec.h"
 | 
						|
 | 
						|
#if wxUSE_STC
 | 
						|
 | 
						|
#if defined(WXUSINGDLL)
 | 
						|
 | 
						|
#ifdef __BORLANDC__
 | 
						|
    #pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef WX_PRECOMP
 | 
						|
    #include "wx/app.h"
 | 
						|
#endif // WX_PRECOMP
 | 
						|
 | 
						|
#include "wx/stc/stc.h"
 | 
						|
#include "wx/uiaction.h"
 | 
						|
 | 
						|
#include "testwindow.h"
 | 
						|
 | 
						|
#if defined(__WXOSX_COCOA__) || defined(__WXMSW__) || defined(__WXGTK__)
 | 
						|
 | 
						|
class StcPopupWindowsTestCase
 | 
						|
{
 | 
						|
public:
 | 
						|
    StcPopupWindowsTestCase()
 | 
						|
        : m_stc(new wxStyledTextCtrl(wxTheApp->GetTopWindow(), wxID_ANY))
 | 
						|
    {
 | 
						|
        m_focusAlwaysRetained=true;
 | 
						|
        m_calltipClickReceived=false;
 | 
						|
 | 
						|
        m_stc->Bind(wxEVT_KILL_FOCUS,
 | 
						|
                    &StcPopupWindowsTestCase::OnKillSTCFocus, this);
 | 
						|
        m_stc->Bind(wxEVT_STC_CALLTIP_CLICK,
 | 
						|
                    &StcPopupWindowsTestCase::OnCallTipClick, this);
 | 
						|
    }
 | 
						|
 | 
						|
    ~StcPopupWindowsTestCase()
 | 
						|
    {
 | 
						|
        delete m_stc;
 | 
						|
    }
 | 
						|
 | 
						|
    void OnKillSTCFocus(wxFocusEvent& WXUNUSED(event))
 | 
						|
    {
 | 
						|
        m_focusAlwaysRetained=false;
 | 
						|
    }
 | 
						|
 | 
						|
    void OnCallTipClick(wxStyledTextEvent& WXUNUSED(event))
 | 
						|
    {
 | 
						|
        m_calltipClickReceived=true;
 | 
						|
    }
 | 
						|
 | 
						|
protected:
 | 
						|
    wxStyledTextCtrl* const m_stc;
 | 
						|
    bool m_focusAlwaysRetained;
 | 
						|
    bool m_calltipClickReceived;
 | 
						|
};
 | 
						|
 | 
						|
// This set of tests is used to verify that an autocompletion popup does not
 | 
						|
// take focus from its parent styled text control.
 | 
						|
TEST_CASE_METHOD(StcPopupWindowsTestCase,
 | 
						|
                 "wxStyledTextCtrl::AutoComp",
 | 
						|
                 "[wxStyledTextCtrl][focus]")
 | 
						|
{
 | 
						|
    m_stc->SetFocus();
 | 
						|
    m_focusAlwaysRetained = true;
 | 
						|
    m_stc->AutoCompShow(0,"ability able about above abroad absence absent");
 | 
						|
 | 
						|
#if wxUSE_UIACTIONSIMULATOR
 | 
						|
    // Pressing the tab key should cause the current entry in the list to be
 | 
						|
    // entered into the styled text control. However with GTK+, characters sent
 | 
						|
    // with the UI simulator seem to arrive too late, so select the current
 | 
						|
    // entry with a double click instead.
 | 
						|
 | 
						|
    wxUIActionSimulator sim;
 | 
						|
 | 
						|
#ifdef __WXGTK__
 | 
						|
    wxPoint zeroPosition = m_stc->PointFromPosition(0);
 | 
						|
    int textHt = m_stc->TextHeight(0);
 | 
						|
    int textWd = m_stc->TextWidth(0,"ability");
 | 
						|
    wxPoint autoCompPoint(zeroPosition.x + textWd/2,
 | 
						|
                            zeroPosition.y + textHt + textHt/2);
 | 
						|
    wxPoint scrnPoint = m_stc->ClientToScreen(autoCompPoint);
 | 
						|
    sim.MouseMove(scrnPoint);
 | 
						|
    sim.MouseDblClick();
 | 
						|
#else
 | 
						|
    sim.Char(WXK_TAB);
 | 
						|
#endif // __WXGTK__
 | 
						|
    ::wxYield();
 | 
						|
    CHECK( m_stc->GetText() == "ability" );
 | 
						|
#endif //wxUSE_UIACTIONSIMULATOR
 | 
						|
 | 
						|
    if ( m_stc->AutoCompActive() )
 | 
						|
        m_stc->AutoCompCancel();
 | 
						|
 | 
						|
    CHECK_FOCUS_IS( m_stc );
 | 
						|
 | 
						|
    // Unfortunately under GTK we do get focus loss events, at least sometimes
 | 
						|
    // (and actually more often than not, especially with GTK2, but this
 | 
						|
    // happens with GTK3 too).
 | 
						|
#ifndef __WXGTK__
 | 
						|
    CHECK( m_focusAlwaysRetained );
 | 
						|
#endif // !__WXGTK__
 | 
						|
}
 | 
						|
 | 
						|
// This test is used to verify that a call tip receives mouse clicks. However
 | 
						|
// the clicks do sent with the UI simulator do not seem to be received on 
 | 
						|
// cocoa for some reason, so skip the test there for now.
 | 
						|
#if !defined(__WXOSX_COCOA__)
 | 
						|
TEST_CASE_METHOD(StcPopupWindowsTestCase,
 | 
						|
                 "wxStyledTextCtrl::Calltip",
 | 
						|
                 "[wxStyledTextCtrl][focus]")
 | 
						|
{
 | 
						|
    m_stc->SetFocus();
 | 
						|
    m_calltipClickReceived = false;
 | 
						|
    m_focusAlwaysRetained = true;
 | 
						|
 | 
						|
    wxString calltipText = "This is a calltip.";
 | 
						|
    m_stc->CallTipShow(0,calltipText);
 | 
						|
 | 
						|
#if wxUSE_UIACTIONSIMULATOR
 | 
						|
    wxUIActionSimulator sim;
 | 
						|
    wxPoint zeroPosition = m_stc->PointFromPosition(0);
 | 
						|
    int textHt = m_stc->TextHeight(0);
 | 
						|
    int textWd = m_stc->TextWidth(0,calltipText);
 | 
						|
 | 
						|
    // zeroPosition is the top left of position 0 and the call tip should have
 | 
						|
    // roughly the same height as textHt (there seems to be some extra padding
 | 
						|
    // that makes it a little taller, but it's roughly the same height),
 | 
						|
    // so (zeroPosition.x+textWd/2,zeroPosition.y+textHt+textHt/2) should
 | 
						|
    // be the middle of the calltip.
 | 
						|
    wxPoint calltipMidPoint(zeroPosition.x + textWd/2,
 | 
						|
                            zeroPosition.y + textHt + textHt/2);
 | 
						|
    wxPoint scrnPoint = m_stc->ClientToScreen(calltipMidPoint);
 | 
						|
    sim.MouseMove(scrnPoint);
 | 
						|
    sim.MouseClick();
 | 
						|
    ::wxYield();
 | 
						|
 | 
						|
    CHECK( m_calltipClickReceived );
 | 
						|
#endif // wxUSE_UIACTIONSIMULATOR
 | 
						|
 | 
						|
    if ( m_stc->CallTipActive() )
 | 
						|
        m_stc->CallTipCancel();
 | 
						|
 | 
						|
    // Verify that clicking the call tip did not take focus from the STC.
 | 
						|
    //
 | 
						|
    // Unfortunately this test fails for unknown reasons under Xvfb (but only
 | 
						|
    // there).
 | 
						|
    if ( !IsRunningUnderXVFB() )
 | 
						|
        CHECK_FOCUS_IS( m_stc );
 | 
						|
 | 
						|
    // With wxGTK there is the same problem here as in the test above.
 | 
						|
#ifndef __WXGTK__
 | 
						|
    CHECK( m_focusAlwaysRetained );
 | 
						|
#endif // !__WXGTK__
 | 
						|
}
 | 
						|
 | 
						|
#endif // !defined(__WXOSX_COCOA__)
 | 
						|
 | 
						|
#endif // defined(__WXOSX_COCOA__) || defined(__WXMSW__) || defined(__WXGTK__)
 | 
						|
 | 
						|
#endif // WXUSINGDLL
 | 
						|
 | 
						|
#endif // wxUSE_STC
 | 
						|
 |