diff --git a/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp b/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp index a11ef21c13d..36a5e7df181 100644 --- a/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp +++ b/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.cpp @@ -621,14 +621,15 @@ nsTreeBodyFrame::InvalidateColumn(nsITreeColumn* aCol) if (mUpdateBatchNest) return NS_OK; - nsTreeColumn* col = NS_STATIC_CAST(nsTreeColumn*, aCol); - if (col) { - nsRect columnRect(col->GetX(), mInnerBox.y, col->GetWidth(), mInnerBox.height); + nsTreeColumn* col = GetColumnImpl(aCol); + if (!col) + return NS_ERROR_INVALID_ARG; - // When false then column is out of view - if (OffsetForHorzScroll(columnRect, PR_TRUE)) - nsIFrame::Invalidate(columnRect, PR_FALSE); - } + nsRect columnRect(col->GetX(), mInnerBox.y, col->GetWidth(), mInnerBox.height); + + // When false then column is out of view + if (OffsetForHorzScroll(columnRect, PR_TRUE)) + nsIFrame::Invalidate(columnRect, PR_FALSE); return NS_OK; } @@ -665,13 +666,14 @@ nsTreeBodyFrame::InvalidateCell(PRInt32 aIndex, nsITreeColumn* aCol) if (aIndex < 0 || aIndex > mPageLength) return NS_OK; - nsTreeColumn* col = NS_STATIC_CAST(nsTreeColumn*, aCol); - if (col) { - nscoord yPos = mInnerBox.y+mRowHeight*aIndex; - nsRect cellRect(col->GetX(), yPos, col->GetWidth(), mRowHeight); - if (OffsetForHorzScroll(cellRect, PR_TRUE)) - nsIFrame::Invalidate(cellRect, PR_FALSE); - } + nsTreeColumn* col = GetColumnImpl(aCol); + if (!col) + return NS_ERROR_INVALID_ARG; + + nscoord yPos = mInnerBox.y+mRowHeight*aIndex; + nsRect cellRect(col->GetX(), yPos, col->GetWidth(), mRowHeight); + if (OffsetForHorzScroll(cellRect, PR_TRUE)) + nsIFrame::Invalidate(cellRect, PR_FALSE); return NS_OK; } @@ -707,24 +709,25 @@ nsTreeBodyFrame::InvalidateColumnRange(PRInt32 aStart, PRInt32 aEnd, nsITreeColu if (mUpdateBatchNest) return NS_OK; - nsTreeColumn* col = NS_STATIC_CAST(nsTreeColumn*, aCol); - if (col) { - if (aStart == aEnd) - return InvalidateCell(aStart, col); + nsTreeColumn* col = GetColumnImpl(aCol); + if (!col) + return NS_ERROR_INVALID_ARG; - PRInt32 last = GetLastVisibleRow(); - if (aStart > aEnd || aEnd < mTopRowIndex || aStart > last) - return NS_OK; + if (aStart == aEnd) + return InvalidateCell(aStart, col); - if (aStart < mTopRowIndex) - aStart = mTopRowIndex; + PRInt32 last = GetLastVisibleRow(); + if (aStart > aEnd || aEnd < mTopRowIndex || aStart > last) + return NS_OK; - if (aEnd > last) - aEnd = last; + if (aStart < mTopRowIndex) + aStart = mTopRowIndex; - nsRect rangeRect(col->GetX(), mInnerBox.y+mRowHeight*(aStart-mTopRowIndex), col->GetWidth(), mRowHeight*(aEnd-aStart+1)); - nsIFrame::Invalidate(rangeRect, PR_FALSE); - } + if (aEnd > last) + aEnd = last; + + nsRect rangeRect(col->GetX(), mInnerBox.y+mRowHeight*(aStart-mTopRowIndex), col->GetWidth(), mRowHeight*(aEnd-aStart+1)); + nsIFrame::Invalidate(rangeRect, PR_FALSE); return NS_OK; } @@ -1627,9 +1630,9 @@ nsTreeBodyFrame::IsCellCropped(PRInt32 aRow, nsITreeColumn* aCol, PRBool *_retva nsCOMPtr rc; GetPresContext()->PresShell()->CreateRenderingContext(this, getter_AddRefs(rc)); - nsTreeColumn* col = NS_STATIC_CAST(nsTreeColumn*, aCol); + nsTreeColumn* col = GetColumnImpl(aCol); if (!col) - return NS_ERROR_FAILURE; + return NS_ERROR_INVALID_ARG; GetCellWidth(aRow, col, rc, desiredSize, currentSize); *_retval = desiredSize > currentSize; @@ -3642,15 +3645,14 @@ nsresult nsTreeBodyFrame::EnsureRowIsVisibleInternal(const ScrollParts& aParts, NS_IMETHODIMP nsTreeBodyFrame::EnsureCellIsVisible(PRInt32 aRow, nsITreeColumn* aCol) { - if (!aCol) - return NS_ERROR_INVALID_POINTER; + nsTreeColumn* col = GetColumnImpl(aCol); + if (!col) + return NS_ERROR_INVALID_ARG; ScrollParts parts = GetScrollParts(); nscoord result = -1; - nsTreeColumn* col = NS_STATIC_CAST(nsTreeColumn*, aCol); - nscoord columnPos = col->GetX(); nscoord columnWidth = col->GetWidth(); @@ -3688,10 +3690,9 @@ NS_IMETHODIMP nsTreeBodyFrame::ScrollToColumn(nsITreeColumn* aCol) nsresult nsTreeBodyFrame::ScrollToColumnInternal(const ScrollParts& aParts, nsITreeColumn* aCol) { - if(!aCol) - return NS_ERROR_INVALID_POINTER; - - nsTreeColumn* col = NS_STATIC_CAST(nsTreeColumn*, aCol); + nsTreeColumn* col = GetColumnImpl(aCol); + if (!col) + return NS_ERROR_INVALID_ARG; return ScrollHorzInternal(aParts, col->GetX()); } diff --git a/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.h b/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.h index 93b6ed7b27e..bc808695d2b 100644 --- a/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.h +++ b/mozilla/layout/xul/base/src/tree/src/nsTreeBodyFrame.h @@ -69,6 +69,8 @@ struct nsTreeImageCacheEntry nsCOMPtr listener; }; +static NS_DEFINE_CID(kTreeColumnImplCID, NS_TREECOLUMN_IMPL_CID); + // The actual frame that paints the cells and rows. class nsTreeBodyFrame : public nsLeafBoxFrame, public nsITreeBoxObject, @@ -354,6 +356,16 @@ protected: InvalidateRow(aRow + aOrientation); }; + nsTreeColumn* GetColumnImpl(nsITreeColumn* aUnknownCol) { + if (!aUnknownCol) + return nsnull; + + nsRefPtr col; + nsresult rv = aUnknownCol->QueryInterface(kTreeColumnImplCID, + getter_AddRefs(col)); + return NS_SUCCEEDED(rv) ? col : nsnull; + } + // Create a new timer. This method is used to delay various actions like // opening/closing folders or tree scrolling. // aID is type of the action, aFunc is the function to be called when diff --git a/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.cpp b/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.cpp index 619d25e873f..8654c343208 100644 --- a/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.cpp +++ b/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.cpp @@ -49,6 +49,8 @@ #include "nsINodeInfo.h" #include "nsContentUtils.h" +static NS_DEFINE_CID(kTreeColumnImplCID, NS_TREECOLUMN_IMPL_CID); + // Column class that caches all the info about our column. nsTreeColumn::nsTreeColumn(nsTreeColumns* aColumns, nsIFrame* aFrame) : mFrame(aFrame), @@ -72,6 +74,9 @@ NS_INTERFACE_MAP_BEGIN(nsTreeColumn) NS_INTERFACE_MAP_ENTRY(nsITreeColumn) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_ENTRY_DOM_CLASSINFO(TreeColumn) + if (aIID.Equals(kTreeColumnImplCID)) + foundInterface = NS_STATIC_CAST(nsITreeColumn*, this); + else NS_INTERFACE_MAP_END NS_IMPL_ADDREF(nsTreeColumn) diff --git a/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.h b/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.h index 04388b1ef7a..2342a6992b4 100644 --- a/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.h +++ b/mozilla/layout/xul/base/src/tree/src/nsTreeColumns.h @@ -116,6 +116,14 @@ private: nsTreeColumn* mPrevious; }; +#define NS_TREECOLUMN_IMPL_CID \ +{ /* 02cd1963-4b5d-4a6c-9223-814d3ade93a3 */ \ + 0x02cd1963, \ + 0x4b5d, \ + 0x4a6c, \ + {0x92, 0x23, 0x81, 0x4d, 0x3a, 0xde, 0x93, 0xa3} \ +} + class nsTreeColumns : public nsITreeColumns { public: nsTreeColumns(nsITreeBoxObject* aTree);