Added knowledge of virtual size to wx(Scrolled)Windows, they can now

manage their own scrollbars with the help of a sizer or other user
clues (SetVirtualSizeHints) without the need for an ancillary container.
Added SetSizerAndFit convenience method.
SetSizer now enables/disables AutoLayout automagically.
Logic bugfix for scrollsub sample.
Syntax bugfix in parser.y.
Compiler warning fix in textctrl.cpp.

 Modified Files:
    docs/latex/wx/scrolwin.tex docs/latex/wx/sizer.tex
    docs/latex/wx/window.tex include/wx/scrolwin.h
    include/wx/sizer.h include/wx/window.h
    include/wx/generic/scrolwin.h include/wx/gtk/scrolwin.h
    samples/scrollsub/scrollsub.cpp src/common/parser.y
    src/common/sizer.cpp src/common/wincmn.cpp
    src/generic/scrlwing.cpp src/gtk/scrolwin.cpp
    src/msw/textctrl.cpp


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15210 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Ron Lee
2002-04-19 22:12:38 +00:00
parent 1d0edc0f73
commit 566d84a7c3
17 changed files with 601 additions and 309 deletions

View File

@@ -2,7 +2,7 @@
// Name: gtk/scrolwin.cpp
// Purpose: wxScrolledWindow implementation
// Author: Julian Smart
// Modified by:
// Modified by: Ron Lee
// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
@@ -202,8 +202,6 @@ void wxScrolledWindow::Init()
m_yScrollingEnabled = TRUE;
m_xScrollPosition = 0;
m_yScrollPosition = 0;
m_xScrollLines = 0;
m_yScrollLines = 0;
m_xScrollLinesPerPage = 0;
m_yScrollLinesPerPage = 0;
m_targetWindow = (wxWindow*) NULL;
@@ -323,51 +321,47 @@ bool wxScrolledWindow::Create(wxWindow *parent,
// setting scrolling parameters
// ----------------------------------------------------------------------------
void wxScrolledWindow::DoSetVirtualSize( int x, int y )
{
wxPanel::DoSetVirtualSize( x, y );
AdjustScrollbars();
}
/*
* pixelsPerUnitX/pixelsPerUnitY: number of pixels per unit (e.g. pixels per text line)
* noUnitsX/noUnitsY: : no. units per scrollbar
*/
void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
int noUnitsX, int noUnitsY,
int xPos, int yPos, bool noRefresh )
void wxScrolledWindow::SetScrollbars( int pixelsPerUnitX, int pixelsPerUnitY,
int noUnitsX, int noUnitsY,
int xPos, int yPos, bool noRefresh )
{
int old_x = m_xScrollPixelsPerLine * m_xScrollPosition;
int old_y = m_yScrollPixelsPerLine * m_yScrollPosition;
m_xScrollPixelsPerLine = pixelsPerUnitX;
m_yScrollPixelsPerLine = pixelsPerUnitY;
m_xScrollLines = noUnitsX;
m_yScrollLines = noUnitsY;
m_xScrollPosition = xPos;
m_yScrollPosition = yPos;
m_hAdjust->lower = 0.0;
m_hAdjust->upper = noUnitsX;
m_hAdjust->value = xPos;
m_hAdjust->step_increment = 1.0;
m_hAdjust->page_increment = 2.0;
m_hAdjust->value = m_xScrollPosition = xPos;
m_vAdjust->value = m_yScrollPosition = yPos;
m_vAdjust->lower = 0.0;
m_vAdjust->upper = noUnitsY;
m_vAdjust->value = yPos;
m_vAdjust->step_increment = 1.0;
m_vAdjust->page_increment = 2.0;
AdjustScrollbars();
m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
if (!noRefresh)
{
int new_x = m_xScrollPixelsPerLine * m_xScrollPosition;
int new_y = m_yScrollPixelsPerLine * m_yScrollPosition;
m_targetWindow->ScrollWindow( old_x-new_x, old_y-new_y );
m_targetWindow->ScrollWindow( old_x - new_x, old_y - new_y );
}
}
void wxScrolledWindow::AdjustScrollbars()
{
int w, h;
int vw, vh;
m_targetWindow->GetClientSize( &w, &h );
m_targetWindow->GetVirtualSize( &vw, &vh );
if (m_xScrollPixelsPerLine == 0)
{
@@ -376,21 +370,18 @@ void wxScrolledWindow::AdjustScrollbars()
}
else
{
m_hAdjust->upper = vw / m_xScrollPixelsPerLine;
m_hAdjust->page_size = (w / m_xScrollPixelsPerLine);
int max = (int)(m_hAdjust->upper - m_hAdjust->page_size + 0.5);
if (max < 0) max = 0;
int x_pos = m_xScrollPosition;
if (x_pos > max) x_pos = max;
if (x_pos < 0) x_pos = 0;
// If the scrollbar hits the right side, move the window
// right to keep it from over extending.
int old_x = m_xScrollPosition;
m_xScrollPosition = x_pos;
m_hAdjust->value = x_pos;
if (x_pos != old_x)
m_targetWindow->ScrollWindow( (old_x-m_xScrollPosition)*m_xScrollPixelsPerLine, 0 );
if( m_hAdjust->value + m_hAdjust->page_size > m_hAdjust->upper )
{
m_hAdjust->value = m_hAdjust->upper - m_hAdjust->page_size;
m_targetWindow->ScrollWindow( (m_xScrollPosition - m_hAdjust->value) * m_xScrollPixelsPerLine, 0 );
m_xScrollPosition = (int)m_hAdjust->value;
}
}
if (m_yScrollPixelsPerLine == 0)
@@ -400,21 +391,15 @@ void wxScrolledWindow::AdjustScrollbars()
}
else
{
m_vAdjust->upper = vh / m_yScrollPixelsPerLine;
m_vAdjust->page_size = (h / m_yScrollPixelsPerLine);
int max = (int)(m_vAdjust->upper - m_vAdjust->page_size + 0.5);
if (max < 0) max = 0;
int y_pos = m_yScrollPosition;
if (y_pos > max) y_pos = max;
if (y_pos < 0) y_pos = 0;
int old_y = m_yScrollPosition;
m_yScrollPosition = y_pos;
m_vAdjust->value = y_pos;
if (y_pos != old_y)
m_targetWindow->ScrollWindow( 0, (old_y-m_yScrollPosition)*m_yScrollPixelsPerLine );
if( m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper )
{
m_vAdjust->value = m_vAdjust->upper - m_vAdjust->page_size;
m_targetWindow->ScrollWindow( 0, (m_yScrollPosition - m_vAdjust->value) * m_yScrollPixelsPerLine );
m_yScrollPosition = (int)m_vAdjust->value;
}
}
m_xScrollLinesPerPage = (int)(m_hAdjust->page_size + 0.5);
@@ -424,6 +409,7 @@ void wxScrolledWindow::AdjustScrollbars()
gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" );
}
// ----------------------------------------------------------------------------
// target window handling
// ----------------------------------------------------------------------------
@@ -447,6 +433,22 @@ void wxScrolledWindow::PrepareDC(wxDC& dc)
-m_yScrollPosition * m_yScrollPixelsPerLine );
}
void wxScrolledWindow::SetScrollRate( int xstep, int ystep )
{
int old_x = m_xScrollPixelsPerLine * m_xScrollPosition;
int old_y = m_yScrollPixelsPerLine * m_yScrollPosition;
m_xScrollPixelsPerLine = xstep;
m_yScrollPixelsPerLine = ystep;
int new_x = m_xScrollPixelsPerLine * m_xScrollPosition;
int new_y = m_yScrollPixelsPerLine * m_yScrollPosition;
m_targetWindow->ScrollWindow( old_x - new_x, old_y - new_y );
AdjustScrollbars();
}
void wxScrolledWindow::GetScrollPixelsPerUnit (int *x_unit, int *y_unit) const
{
if ( x_unit )
@@ -516,8 +518,7 @@ void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
void wxScrolledWindow::Scroll( int x_pos, int y_pos )
{
if (!m_targetWindow)
return;
wxASSERT_MSG( m_targetWindow != 0, _T("No target window") );
if (((x_pos == -1) || (x_pos == m_xScrollPosition)) &&
((y_pos == -1) || (y_pos == m_yScrollPosition))) return;
@@ -565,8 +566,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
void wxScrolledWindow::GtkVScroll( float value, unsigned int scroll_type )
{
if (!m_targetWindow)
return;
wxASSERT_MSG( m_targetWindow != 0, _T("No target window") );
if (m_yScrollPixelsPerLine == 0)
return;
@@ -585,8 +585,7 @@ void wxScrolledWindow::GtkVScroll( float value, unsigned int scroll_type )
void wxScrolledWindow::GtkHScroll( float value, unsigned int scroll_type )
{
if (!m_targetWindow)
return;
wxASSERT_MSG( m_targetWindow != 0, _T("No target window") );
if (m_xScrollPixelsPerLine == 0)
return;
@@ -609,28 +608,6 @@ void wxScrolledWindow::EnableScrolling (bool x_scroll, bool y_scroll)
m_yScrollingEnabled = y_scroll;
}
void wxScrolledWindow::GetVirtualSize (int *x, int *y) const
{
wxSize sz(0, 0);
if (m_targetWindow)
sz = m_targetWindow->GetClientSize();
if ( x )
{
if (m_xScrollPixelsPerLine == 0)
*x = sz.x;
else
*x = m_xScrollPixelsPerLine * m_xScrollLines;
}
if ( y )
{
if (m_yScrollPixelsPerLine == 0)
*y = sz.y;
else
*y = m_yScrollPixelsPerLine * m_yScrollLines;
}
}
// Where the current view starts from
void wxScrolledWindow::GetViewStart (int *x, int *y) const
{
@@ -672,9 +649,9 @@ int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event)
if (event.GetEventType() == wxEVT_SCROLLWIN_BOTTOM)
{
if (orient == wxHORIZONTAL)
nScrollInc = m_xScrollLines - m_xScrollPosition;
nScrollInc = GetVirtualSize().GetWidth() / m_xScrollPixelsPerLine - m_xScrollPosition;
else
nScrollInc = m_yScrollLines - m_yScrollPosition;
nScrollInc = GetVirtualSize().GetHeight() / m_yScrollPixelsPerLine - m_yScrollPosition;
} else
if (event.GetEventType() == wxEVT_SCROLLWIN_LINEUP)
{
@@ -813,12 +790,13 @@ void wxScrolledWindow::GtkVDisconnectEvent()
(GtkSignalFunc) gtk_scrolled_window_vscroll_callback, (gpointer) this );
}
bool wxScrolledWindow::Layout()
{
if (GetSizer())
if (GetSizer() && m_targetWindow == this)
{
// Take into account the virtual size and scrolled position of the window
// If we're the scroll target, take into account the
// virtual size and scrolled position of the window.
int x, y, w, h;
CalcScrolledPosition(0,0, &x,&y);
GetVirtualSize(&w, &h);
@@ -836,12 +814,15 @@ bool wxScrolledWindow::Layout()
// Default OnSize resets scrollbars, if any
void wxScrolledWindow::OnSize(wxSizeEvent& WXUNUSED(event))
{
if( m_targetWindow != this )
m_targetWindow->SetVirtualSize( m_targetWindow->GetClientSize() );
SetVirtualSize( GetClientSize() );
#if wxUSE_CONSTRAINTS
if (GetAutoLayout())
Layout();
#endif
AdjustScrollbars();
}
// This calls OnDraw, having adjusted the origin according to the current
@@ -955,3 +936,5 @@ void wxScrolledWindow::OnChar(wxKeyEvent& event)
}
}
// vi:sts=4:sw=4:et