Recorrected calculation of client size in wxListCtrl.

Also added comments on why this is correct.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13381 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2002-01-05 15:58:52 +00:00
parent 8c23ed4e21
commit bf632eddcd

View File

@@ -3920,9 +3920,25 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
else else
iconSpacing = 0; iconSpacing = 0;
// Note that we do not call GetClientSize() here but
// GetSize() and substract the border size for sunken
// borders manually. This is technically incorrect,
// but we need to know the client area's size WITHOUT
// scrollbars here. Since we don't know if there are
// any scrollbars, we use GetSize() instead. Another
// solution would be to call SetScrollbars() here to
// remove the scrollbars and call GetClientSize() then,
// but this might result in flicker and - worse - will
// reset the scrollbars to 0 which is not good at all
// if you resize a dialog/window, but don't want to
// reset the window scrolling. RR.
// Furthermore, we actually do NOT subtract the border
// width as 2 pixels is just the extra space which we
// need around the actual content in the window. Other-
// wise the text would e.g. touch the upper border. RR.
int clientWidth, int clientWidth,
clientHeight; clientHeight;
GetClientSize( &clientWidth, &clientHeight ); GetSize( &clientWidth, &clientHeight );
if ( HasFlag(wxLC_REPORT) ) if ( HasFlag(wxLC_REPORT) )
{ {
@@ -3952,13 +3968,13 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
// fit into the window, we recalculate after subtracting an // fit into the window, we recalculate after subtracting an
// approximated 15 pt for the horizontal scrollbar // approximated 15 pt for the horizontal scrollbar
clientHeight -= 4; // sunken frame
int entireWidth = 0; int entireWidth = 0;
for (int tries = 0; tries < 2; tries++) for (int tries = 0; tries < 2; tries++)
{ {
entireWidth = 0; entireWidth = 0;
// Start at 2,2 so the text does not touch the border
int x = 2; int x = 2;
int y = 2; int y = 2;
int maxWidth = 0; int maxWidth = 0;
@@ -3971,7 +3987,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
currentlyVisibleLines++; currentlyVisibleLines++;
wxListLineData *line = GetLine(i); wxListLineData *line = GetLine(i);
line->CalculateSize( &dc, iconSpacing ); line->CalculateSize( &dc, iconSpacing );
line->SetPosition( x, y, clientWidth, iconSpacing ); line->SetPosition( x, y, clientWidth, iconSpacing ); // why clientWidth (FIXME)
wxSize sizeLine = GetLineSize(i); wxSize sizeLine = GetLineSize(i);
@@ -3983,7 +3999,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
m_linesPerPage = currentlyVisibleLines; m_linesPerPage = currentlyVisibleLines;
// assume that the size of the next one is the same... (FIXME) // assume that the size of the next one is the same... (FIXME)
if ( y + sizeLine.y - 6 >= clientHeight ) if ( y + sizeLine.y >= clientHeight )
{ {
currentlyVisibleLines = 0; currentlyVisibleLines = 0;
y = 2; y = 2;
@@ -3995,7 +4011,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
entireWidth += maxWidth; entireWidth += maxWidth;
if ((tries == 0) && (entireWidth > clientWidth)) if ((tries == 0) && (entireWidth > clientWidth))
{ {
clientHeight -= 15; // scrollbar height clientHeight -= 15; // guessed scrollbar height (FIXME)
m_linesPerPage = 0; m_linesPerPage = 0;
currentlyVisibleLines = 0; currentlyVisibleLines = 0;
break; break;