171 lines
5.1 KiB
C++
171 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)
|
|
|
|
|
|
#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
|
|
|