Ensure that scrollbars are shown in scrolled popup in the popup sample.

Don't call SetScrollbars(), this is overridden by sizer logic later. Instead,
add a sufficiently big window to the popup and make fix the size of the popup
itself to be smaller to ensure that the scrollbars do show.

Closes #14900.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73319 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-12-29 21:53:09 +00:00
parent ef68861e11
commit b7bd58d09a

View File

@ -66,7 +66,7 @@ enum
class SimpleTransientPopup: public wxPopupTransientWindow
{
public:
SimpleTransientPopup( wxWindow *parent );
SimpleTransientPopup( wxWindow *parent, bool scrolled );
virtual ~SimpleTransientPopup();
// wxPopupTransientWindow virtual methods are all overridden to log them
@ -75,8 +75,6 @@ public:
virtual bool ProcessLeftDown(wxMouseEvent& event);
virtual bool Show( bool show = true );
wxScrolledWindow* GetChild() { return m_panel; }
private:
wxScrolledWindow *m_panel;
wxButton *m_button;
@ -110,7 +108,7 @@ BEGIN_EVENT_TABLE(SimpleTransientPopup,wxPopupTransientWindow)
EVT_SPINCTRL( Minimal_PopupSpinctrl, SimpleTransientPopup::OnSpinCtrl )
END_EVENT_TABLE()
SimpleTransientPopup::SimpleTransientPopup( wxWindow *parent )
SimpleTransientPopup::SimpleTransientPopup( wxWindow *parent, bool scrolled )
:wxPopupTransientWindow( parent )
{
m_panel = new wxScrolledWindow( this, wxID_ANY );
@ -142,9 +140,30 @@ SimpleTransientPopup::SimpleTransientPopup( wxWindow *parent )
topSizer->Add( m_spinCtrl, 0, wxALL, 5 );
topSizer->Add( m_mouseText, 0, wxCENTRE|wxALL, 5 );
if ( scrolled )
{
// Add a big window to ensure that scrollbars are shown when we set the
// panel size to a lesser size below.
topSizer->Add(new wxPanel(m_panel, wxID_ANY, wxDefaultPosition,
wxSize(600, 900)));
}
m_panel->SetSizer( topSizer );
topSizer->Fit(m_panel);
topSizer->Fit(this);
if ( scrolled )
{
// Set the fixed size to ensure that the scrollbars are shown.
m_panel->SetSize(300, 300);
// And also actually enable them.
m_panel->SetScrollRate(10, 10);
}
else
{
// Use the fitting size for the panel if we don't need scrollbars.
topSizer->Fit(m_panel);
}
SetClientSize(m_panel->GetSize());
}
SimpleTransientPopup::~SimpleTransientPopup()
@ -389,7 +408,7 @@ void MyFrame::OnStartSimplePopup(wxCommandEvent& event)
{
wxLogMessage( wxT("================================================") );
delete m_simplePopup;
m_simplePopup = new SimpleTransientPopup( this );
m_simplePopup = new SimpleTransientPopup( this, false );
wxWindow *btn = (wxWindow*) event.GetEventObject();
wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
wxSize sz = btn->GetSize();
@ -402,8 +421,7 @@ void MyFrame::OnStartScrolledPopup(wxCommandEvent& event)
{
wxLogMessage( wxT("================================================") );
delete m_scrolledPopup;
m_scrolledPopup = new SimpleTransientPopup( this );
m_scrolledPopup->GetChild()->SetScrollbars(1, 1, 1000, 1000);
m_scrolledPopup = new SimpleTransientPopup( this, true );
wxWindow *btn = (wxWindow*) event.GetEventObject();
wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
wxSize sz = btn->GetSize();
@ -466,7 +484,7 @@ void MyDialog::OnStartSimplePopup(wxCommandEvent& event)
{
wxLogMessage( wxT("================================================") );
delete m_simplePopup;
m_simplePopup = new SimpleTransientPopup( this );
m_simplePopup = new SimpleTransientPopup( this, false );
wxWindow *btn = (wxWindow*) event.GetEventObject();
wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
wxSize sz = btn->GetSize();
@ -479,8 +497,7 @@ void MyDialog::OnStartScrolledPopup(wxCommandEvent& event)
{
wxLogMessage( wxT("================================================") );
delete m_scrolledPopup;
m_scrolledPopup = new SimpleTransientPopup( this );
m_scrolledPopup->GetChild()->SetScrollbars(1, 1, 1000, 1000);
m_scrolledPopup = new SimpleTransientPopup( this, true );
wxWindow *btn = (wxWindow*) event.GetEventObject();
wxPoint pos = btn->ClientToScreen( wxPoint(0,0) );
wxSize sz = btn->GetSize();