}}
-\membersection{wxWindow::GetPureVirtualSize}\label{wxwindowgetpurevirtualsize}
-
-\constfunc{wxSize}{GetPureVirtualSize}{\void}
-
-This gets the virtual size of the window in pixels as it has been set
-by \helpref{SetVirtualSize}{wxwindowsetvirtualsize}.
-
-\helpref{GetSize}{wxwindowgetsize},\rtfsp
-\helpref{GetClientSize}{wxwindowgetclientsize},\rtfsp
-\helpref{GetVirtualSize}{wxwindowgetvirtualsize}
-
-
\membersection{wxWindow::GetRect}\label{wxwindowgetrect}
\constfunc{virtual wxRect}{GetRect}{\void}
\constfunc{wxSize}{GetVirtualSize}{\void}
-This gets the virtual size of the window in pixels as it has been set
-by \helpref{SetVirtualSize}{wxwindowsetvirtualsize} or the size of the
-client area, if it is larger. Use
-\helpref{GetPureVirtualSize}{wxwindowgetpurevirtualsize} if you want
-to get the actual virtual height independent of the client size.
+This gets the virtual size of the window in pixels. By default it
+returns the client size of the window, but after a call to
+\helpref{SetVirtualSize}{wxwindowsetvirtualsize} it will return
+that size.
\wxheading{Parameters}
// Override these methods for windows that have a virtual size
// independent of their client size. eg. the virtual area of a
- // wxScrolledWindow. Default is to return m_virtualSize unless
- // the client size is bigger.
+ // wxScrolledWindow.
virtual void DoSetVirtualSize( int x, int y );
virtual wxSize DoGetVirtualSize() const;
-
- // Really return just m_virtualSize, nothing else
-
- wxSize GetPureVirtualSize() const { return m_virtualSize; }
-
// Return the largest of ClientSize and BestSize (as determined
// by a sizer, interior children, or other means)
wxSize wxWindowBase::DoGetVirtualSize() const
{
- wxSize s( GetClientSize() );
+ if (m_virtualSize == wxDefaultSize)
+ return GetClientSize();
- return wxSize( wxMax( m_virtualSize.GetWidth(), s.GetWidth() ),
- wxMax( m_virtualSize.GetHeight(), s.GetHeight() ) );
+ return m_virtualSize;
}
// ----------------------------------------------------------------------------
{
if (m_xScrollPixelsPerLine > 0)
{
- int w, h;
- GetTargetSize(&w, &h);
-
- int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine;
- int noPositions = (int) ( ((nMaxWidth - w)/(double)m_xScrollPixelsPerLine) + 0.5 );
- if (noPositions < 0)
- noPositions = 0;
-
- if ( (m_xScrollPosition + nScrollInc) < 0 )
- nScrollInc = -m_xScrollPosition; // As -ve as we can go
- else if ( (m_xScrollPosition + nScrollInc) > noPositions )
- nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go
+ if ( m_xScrollPosition + nScrollInc < 0 )
+ {
+ // As -ve as we can go
+ nScrollInc = -m_xScrollPosition;
+ }
+ else // check for the other bound
+ {
+ const int posMax = m_xScrollLines - m_xScrollLinesPerPage;
+ if ( m_xScrollPosition + nScrollInc > posMax )
+ {
+ // As +ve as we can go
+ nScrollInc = posMax - m_xScrollPosition;
+ }
+ }
}
else
m_targetWindow->Refresh(true, GetScrollRect());
{
GetTargetSize(&w, 0);
- if (m_xScrollPixelsPerLine == 0)
+ // scroll lines per page: if 0, no scrolling is needed
+ int linesPerPage;
+
+ if ( m_xScrollPixelsPerLine == 0 )
{
+ // scrolling is disabled
m_xScrollLines = 0;
m_xScrollPosition = 0;
- m_win->SetScrollbar (wxHORIZONTAL, 0, 0, 0, false);
+ linesPerPage = 0;
}
- else
+ else // might need scrolling
{
- int vVirt = m_targetWindow->GetVirtualSize().GetWidth();
- m_xScrollLines = vVirt / m_xScrollPixelsPerLine;
+ // Round up integer division to catch any "leftover" client space.
+ const int wVirt = m_targetWindow->GetVirtualSize().GetWidth();
+ m_xScrollLines = (wVirt + m_xScrollPixelsPerLine - 1) / m_xScrollPixelsPerLine;
// Calculate page size i.e. number of scroll units you get on the
- // current client window
- int noPagePositions = (int) ( (w/(double)m_xScrollPixelsPerLine) + 0.5 );
- if (noPagePositions < 1) noPagePositions = 1;
- if ( noPagePositions > m_xScrollLines )
- noPagePositions = m_xScrollLines;
-
- // Correct position if greater than extent of canvas minus
- // the visible portion of it or if below zero
- m_xScrollPosition = wxMin( m_xScrollLines - noPagePositions, m_xScrollPosition);
- m_xScrollPosition = wxMax( 0, m_xScrollPosition );
-
- m_win->SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines);
- // The amount by which we scroll when paging
- SetScrollPageSize(wxHORIZONTAL, noPagePositions);
+ // current client window.
+ linesPerPage = w / m_xScrollPixelsPerLine;
+
+ // Special case. When client and virtual size are very close but
+ // the client is big enough, kill scrollbar.
+ if ((linesPerPage < m_xScrollLines) && (w >= wVirt)) ++linesPerPage;
+
+ if (linesPerPage >= m_xScrollLines)
+ {
+ // we're big enough to not need scrolling
+ linesPerPage =
+ m_xScrollLines =
+ m_xScrollPosition = 0;
+ }
+ else // we do need a scrollbar
+ {
+ if ( linesPerPage < 1 )
+ linesPerPage = 1;
+
+ // Correct position if greater than extent of canvas minus
+ // the visible portion of it or if below zero
+ const int posMax = m_xScrollLines - linesPerPage;
+ if ( m_xScrollPosition > posMax )
+ m_xScrollPosition = posMax;
+ else if ( m_xScrollPosition < 0 )
+ m_xScrollPosition = 0;
+ }
}
- GetTargetSize(0, &h);
+ m_win->SetScrollbar(wxHORIZONTAL, m_xScrollPosition,
+ linesPerPage, m_xScrollLines);
- // scroll lines per page: if 0, no scrolling is needed
- int linesPerPage;
+ // The amount by which we scroll when paging
+ SetScrollPageSize(wxHORIZONTAL, linesPerPage);
+
+ GetTargetSize(0, &h);
if ( m_yScrollPixelsPerLine == 0 )
{
}
else // might need scrolling
{
- int hVirt = m_targetWindow->GetVirtualSize().GetHeight();
- m_yScrollLines = hVirt / m_yScrollPixelsPerLine;
+ // Round up integer division to catch any "leftover" client space.
+ const int hVirt = m_targetWindow->GetVirtualSize().GetHeight();
+ m_yScrollLines = ( hVirt + m_yScrollPixelsPerLine - 1 ) / m_yScrollPixelsPerLine;
// Calculate page size i.e. number of scroll units you get on the
- // current client window
+ // current client window.
linesPerPage = h / m_yScrollPixelsPerLine;
- if ( linesPerPage >= m_yScrollLines )
+
+ // Special case. When client and virtual size are very close but
+ // the client is big enough, kill scrollbar.
+ if ((linesPerPage < m_yScrollLines) && (h >= hVirt)) ++linesPerPage;
+
+ if (linesPerPage >= m_yScrollLines)
{
// we're big enough to not need scrolling
linesPerPage =
// Setting hints here should arguably be deprecated, but without it
// a sizer might override this manual scrollbar setting in old code.
- m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
+ // m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
m_targetWindow->SetVirtualSize( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
m_targetWindow->GetClientSize( &w, &h );
m_targetWindow->GetVirtualSize( &vw, &vh );
-
+
if (m_xScrollPixelsPerLine == 0)
{
m_hAdjust->upper = 1.0;
}
else
{
- m_hAdjust->upper = vw / m_xScrollPixelsPerLine;
+ m_hAdjust->upper = (vw+m_xScrollPixelsPerLine-1) / m_xScrollPixelsPerLine;
+ m_hAdjust->page_size = w / m_xScrollPixelsPerLine;
m_hAdjust->page_increment = w / m_xScrollPixelsPerLine;
- m_hAdjust->page_size = m_hAdjust->page_increment;
+ // Special case. When client and virtual size are very close but
+ // the client is big enough, kill scrollbar.
+
+ if ((m_hAdjust->page_size < m_hAdjust->upper) && (w >= vw))
+ m_hAdjust->page_size += 1.0;
+
// If the scrollbar hits the right side, move the window
// right to keep it from over extending.
}
else
{
- m_vAdjust->upper = vh / m_yScrollPixelsPerLine;
+ m_vAdjust->upper = (vh+m_yScrollPixelsPerLine-1) / m_yScrollPixelsPerLine;
+ m_vAdjust->page_size = h / m_yScrollPixelsPerLine;
m_vAdjust->page_increment = h / m_yScrollPixelsPerLine;
- m_vAdjust->page_size = m_vAdjust->page_increment;
+
+ if ((m_vAdjust->page_size < m_vAdjust->upper) && (h >= vh))
+ m_vAdjust->page_size += 1.0;
if ((m_vAdjust->value != 0.0) && (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper))
{
// Setting hints here should arguably be deprecated, but without it
// a sizer might override this manual scrollbar setting in old code.
- m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
+ // m_targetWindow->SetVirtualSizeHints( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
m_targetWindow->SetVirtualSize( noUnitsX * pixelsPerUnitX, noUnitsY * pixelsPerUnitY );
m_targetWindow->GetClientSize( &w, &h );
m_targetWindow->GetVirtualSize( &vw, &vh );
-
+
if (m_xScrollPixelsPerLine == 0)
{
m_hAdjust->upper = 1.0;
}
else
{
- m_hAdjust->upper = vw / m_xScrollPixelsPerLine;
+ m_hAdjust->upper = (vw+m_xScrollPixelsPerLine-1) / m_xScrollPixelsPerLine;
+ m_hAdjust->page_size = w / m_xScrollPixelsPerLine;
m_hAdjust->page_increment = w / m_xScrollPixelsPerLine;
- m_hAdjust->page_size = m_hAdjust->page_increment;
+ // Special case. When client and virtual size are very close but
+ // the client is big enough, kill scrollbar.
+
+ if ((m_hAdjust->page_size < m_hAdjust->upper) && (w >= vw))
+ m_hAdjust->page_size += 1.0;
+
// If the scrollbar hits the right side, move the window
// right to keep it from over extending.
}
else
{
- m_vAdjust->upper = vh / m_yScrollPixelsPerLine;
+ m_vAdjust->upper = (vh+m_yScrollPixelsPerLine-1) / m_yScrollPixelsPerLine;
+ m_vAdjust->page_size = h / m_yScrollPixelsPerLine;
m_vAdjust->page_increment = h / m_yScrollPixelsPerLine;
- m_vAdjust->page_size = m_vAdjust->page_increment;
+
+ if ((m_vAdjust->page_size < m_vAdjust->upper) && (h >= vh))
+ m_vAdjust->page_size += 1.0;
if ((m_vAdjust->value != 0.0) && (m_vAdjust->value + m_vAdjust->page_size > m_vAdjust->upper))
{