зеркало из https://github.com/mozilla/gecko-dev.git
Make sure to not have our columns extending under the right-hand scrollbar.
Bug 306990, patch by Nate Nielsen <nielsen@memberwebs.com>, r=jan, r+sr=roc
This commit is contained in:
Родитель
3672441dd3
Коммит
57c1459ccd
|
@ -1348,7 +1348,8 @@ nsTreeBodyFrame::GetCellAt(nscoord aX, nscoord aY, PRInt32* aRow,
|
||||||
// Determine the column hit.
|
// Determine the column hit.
|
||||||
for (nsTreeColumn* currCol = mColumns->GetFirstColumn(); currCol;
|
for (nsTreeColumn* currCol = mColumns->GetFirstColumn(); currCol;
|
||||||
currCol = currCol->GetNext()) {
|
currCol = currCol->GetNext()) {
|
||||||
nsRect cellRect(currCol->GetX(), mInnerBox.y+mRowHeight*(*aRow-mTopRowIndex), currCol->GetWidth(), mRowHeight);
|
nsRect cellRect;
|
||||||
|
CalcColumnRect(cellRect, currCol, mInnerBox.y+mRowHeight*(*aRow-mTopRowIndex), mRowHeight);
|
||||||
if (!OffsetForHorzScroll(cellRect, PR_TRUE))
|
if (!OffsetForHorzScroll(cellRect, PR_TRUE))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -1969,22 +1970,25 @@ void nsTreeBodyFrame::CalcInnerBox()
|
||||||
nscoord
|
nscoord
|
||||||
nsTreeBodyFrame::CalcHorzWidth()
|
nsTreeBodyFrame::CalcHorzWidth()
|
||||||
{
|
{
|
||||||
// If no horz scrolling periphery is present, then just
|
nscoord width = 0;
|
||||||
// return the width of the main box
|
nscoord height;
|
||||||
|
|
||||||
if (!EnsureScrollable(PR_TRUE)) {
|
|
||||||
CalcInnerBox();
|
|
||||||
return mInnerBox.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We calculate this from the scrollable view, so that it
|
// We calculate this from the scrollable view, so that it
|
||||||
// properly covers all contingencies of what could be
|
// properly covers all contingencies of what could be
|
||||||
// scrollable (columns, body, etc...)
|
// scrollable (columns, body, etc...)
|
||||||
|
|
||||||
nscoord height;
|
if (EnsureScrollable(PR_TRUE)) {
|
||||||
nscoord width;
|
|
||||||
if (NS_FAILED (mColScrollView->GetContainerSize(&width, &height)))
|
if (NS_FAILED (mColScrollView->GetContainerSize(&width, &height)))
|
||||||
width = 0;
|
width = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no horz scrolling periphery is present, then just
|
||||||
|
// return the width of the main box
|
||||||
|
if (width == 0) {
|
||||||
|
CalcInnerBox();
|
||||||
|
width = mInnerBox.width;
|
||||||
|
}
|
||||||
|
|
||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2249,7 +2253,8 @@ nsTreeBodyFrame::Paint(nsPresContext* aPresContext,
|
||||||
currCol = currCol->GetNext()) {
|
currCol = currCol->GetNext()) {
|
||||||
// Don't paint hidden columns.
|
// Don't paint hidden columns.
|
||||||
if (currCol->GetWidth()) {
|
if (currCol->GetWidth()) {
|
||||||
nsRect colRect(currCol->GetX(), mInnerBox.y, currCol->GetWidth(), mInnerBox.height);
|
nsRect colRect;
|
||||||
|
CalcColumnRect(colRect, currCol, mInnerBox.y, mInnerBox.height);
|
||||||
if (OffsetForHorzScroll(colRect, PR_FALSE)) {
|
if (OffsetForHorzScroll(colRect, PR_FALSE)) {
|
||||||
nsRect dirtyRect;
|
nsRect dirtyRect;
|
||||||
if (dirtyRect.IntersectRect(aDirtyRect, colRect)) {
|
if (dirtyRect.IntersectRect(aDirtyRect, colRect)) {
|
||||||
|
@ -2386,7 +2391,8 @@ nsTreeBodyFrame::PaintRow(PRInt32 aRowIndex,
|
||||||
nsTreeColumn* primaryCol = mColumns->GetPrimaryColumn();
|
nsTreeColumn* primaryCol = mColumns->GetPrimaryColumn();
|
||||||
if (primaryCol) {
|
if (primaryCol) {
|
||||||
// Paint the primary cell.
|
// Paint the primary cell.
|
||||||
nsRect cellRect(primaryCol->GetX(), rowRect.y, primaryCol->GetWidth(), rowRect.height);
|
nsRect cellRect;
|
||||||
|
CalcColumnRect(cellRect, primaryCol, rowRect.y, rowRect.height);
|
||||||
if (OffsetForHorzScroll(cellRect, PR_FALSE)) {
|
if (OffsetForHorzScroll(cellRect, PR_FALSE)) {
|
||||||
nsRect dirtyRect;
|
nsRect dirtyRect;
|
||||||
if (dirtyRect.IntersectRect(aDirtyRect, cellRect))
|
if (dirtyRect.IntersectRect(aDirtyRect, cellRect))
|
||||||
|
@ -2427,7 +2433,8 @@ nsTreeBodyFrame::PaintRow(PRInt32 aRowIndex,
|
||||||
currCol = currCol->GetNext()) {
|
currCol = currCol->GetNext()) {
|
||||||
// Don't paint cells in hidden columns.
|
// Don't paint cells in hidden columns.
|
||||||
if (currCol->GetWidth()) {
|
if (currCol->GetWidth()) {
|
||||||
nsRect cellRect(currCol->GetX(), rowRect.y, currCol->GetWidth(), rowRect.height);
|
nsRect cellRect;
|
||||||
|
CalcColumnRect(cellRect, currCol, rowRect.y, rowRect.height);
|
||||||
if (OffsetForHorzScroll(cellRect, PR_FALSE)) {
|
if (OffsetForHorzScroll(cellRect, PR_FALSE)) {
|
||||||
nsRect dirtyRect;
|
nsRect dirtyRect;
|
||||||
nscoord dummy;
|
nscoord dummy;
|
||||||
|
@ -3655,6 +3662,36 @@ nsTreeBodyFrame::ClearStyleAndImageCaches()
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsTreeBodyFrame::CalcColumnRect(nsRect& rect, nsTreeColumn* aCol, nscoord y, nscoord height)
|
||||||
|
{
|
||||||
|
rect.x = aCol->GetX();
|
||||||
|
rect.y = y;
|
||||||
|
rect.width = aCol->GetWidth();
|
||||||
|
rect.height = height;
|
||||||
|
|
||||||
|
if (aCol->GetNext())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The treecolpicker and scrollbar:
|
||||||
|
// - Might not be the same width (usually)
|
||||||
|
// - Either one or the other may be visible.
|
||||||
|
//
|
||||||
|
// The uptake of this is the width of the last column doesn't necessarily
|
||||||
|
// match the width of the last treecol element. We adjust for that here.
|
||||||
|
|
||||||
|
if (!EnsureScrollable(PR_TRUE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
nsRect bounds = mColScrollView->View()->GetBounds();
|
||||||
|
if (bounds.width == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nscoord diff = bounds.width - mInnerBox.width;
|
||||||
|
if (diff > 0)
|
||||||
|
rect.width = PR_MAX(0, rect.width - diff);
|
||||||
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsTreeBodyFrame::OffsetForHorzScroll(nsRect& rect, PRBool clip)
|
nsTreeBodyFrame::OffsetForHorzScroll(nsRect& rect, PRBool clip)
|
||||||
{
|
{
|
||||||
|
|
|
@ -290,6 +290,10 @@ protected:
|
||||||
// after projecting both onto the horizontal coordinate axis.
|
// after projecting both onto the horizontal coordinate axis.
|
||||||
PRBool OffsetForHorzScroll(nsRect& rect, PRBool clip);
|
PRBool OffsetForHorzScroll(nsRect& rect, PRBool clip);
|
||||||
|
|
||||||
|
// Fills in rect with column args and x/width coords. Does some extra
|
||||||
|
// calculations for the last column
|
||||||
|
void CalcColumnRect(nsRect& rect, nsTreeColumn* aCol, nscoord y, nscoord height);
|
||||||
|
|
||||||
PRBool CanAutoScroll(PRInt32 aRowIndex);
|
PRBool CanAutoScroll(PRInt32 aRowIndex);
|
||||||
|
|
||||||
// Calc the row and above/below/on status given where the mouse currently is hovering.
|
// Calc the row and above/below/on status given where the mouse currently is hovering.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче