Files
wxWidgets/tests/controls/styledtextctrltest.cpp
New Pagodi 7b0c7495e3 Add gui test for STC popup items
With wxSTC, popup autocompletion lists and call tips need to be able to
show their information and respond to mouse clicks, but should never
take focus from their parent STC. This test verifies that these popups
function in this manner.
2019-03-20 17:07:39 -05:00

158 lines
4.6 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 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"
#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( m_stc->HasFocus() );
CHECK( m_focusAlwaysRetained );
}
// 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.
CHECK( m_stc->HasFocus() );
CHECK( m_focusAlwaysRetained );
}
#endif // !defined(__WXOSX_COCOA__)
#endif // defined(__WXOSX_COCOA__) || defined(__WXMSW__) || defined(__WXGTK__)
#endif // WXUSINGDLL
#endif // wxUSE_STC