зеркало из https://github.com/mozilla/pjs.git
Bug 299748 On listbox, Sometimes, We cannot scroll the page to bottom by mouse wheel r+sr=roc, a=asa
This commit is contained in:
Родитель
bc1083033a
Коммит
1ffaf0e3af
|
@ -1722,21 +1722,11 @@ nsEventStateManager::DoScrollText(nsPresContext* aPresContext,
|
|||
scrollView->GetLineHeight(&lineHeight);
|
||||
|
||||
if (lineHeight != 0) {
|
||||
nscoord xPos, yPos;
|
||||
scrollView->GetScrollPosition(xPos, yPos);
|
||||
|
||||
if (aNumLines < 0) {
|
||||
passToParent = aScrollHorizontal ? (xPos <= 0) : (yPos <= 0);
|
||||
} else {
|
||||
nsSize scrolledSize;
|
||||
scrollView->GetContainerSize(&scrolledSize.width, &scrolledSize.height);
|
||||
|
||||
nsRect portRect = scrollView->View()->GetBounds();
|
||||
|
||||
passToParent = (aScrollHorizontal ?
|
||||
(xPos + portRect.width >= scrolledSize.width) :
|
||||
(yPos + portRect.height >= scrolledSize.height));
|
||||
}
|
||||
PRBool canScroll;
|
||||
nsresult rv = scrollView->CanScroll(aScrollHorizontal,
|
||||
(aNumLines > 0), canScroll);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
passToParent = !canScroll;
|
||||
|
||||
// Comboboxes need special care.
|
||||
nsIComboboxControlFrame* comboBox = nsnull;
|
||||
|
|
|
@ -175,6 +175,15 @@ public:
|
|||
*/
|
||||
NS_IMETHOD ScrollByWhole(PRBool aTop) = 0;
|
||||
|
||||
/**
|
||||
* Check the view can scroll from current offset.
|
||||
* @param aHorizontal If checking to Left or to Right, true. Otherwise, false.
|
||||
* @param aForward If checking to Right or Bottom, true. Otherwise, false.
|
||||
* @param aResult If the view can scroll, true. Otherwise, false.
|
||||
* @return error status
|
||||
*/
|
||||
NS_IMETHOD CanScroll(PRBool aHorizontal, PRBool aForward, PRBool &aResult) = 0;
|
||||
|
||||
/**
|
||||
* Returns the view as an nsIView*
|
||||
*/
|
||||
|
|
|
@ -468,6 +468,55 @@ NS_IMETHODIMP nsScrollPortView::ScrollByWhole(PRBool aTop)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsScrollPortView::CanScroll(PRBool aHorizontal,
|
||||
PRBool aForward,
|
||||
PRBool &aResult)
|
||||
{
|
||||
nscoord offset = aHorizontal ? mOffsetX : mOffsetY;
|
||||
|
||||
// Can scroll to Top or to Left?
|
||||
if (!aForward) {
|
||||
aResult = (offset > 0) ? PR_TRUE : PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsView* scrolledView = GetScrolledView();
|
||||
if (!scrolledView) {
|
||||
aResult = PR_FALSE;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsSize scrolledSize;
|
||||
scrolledView->GetDimensions(scrolledSize);
|
||||
|
||||
nsSize portSize;
|
||||
GetDimensions(portSize);
|
||||
|
||||
nsCOMPtr<nsIDeviceContext> dev;
|
||||
mViewManager->GetDeviceContext(*getter_AddRefs(dev));
|
||||
float t2p, p2t;
|
||||
t2p = dev->AppUnitsToDevUnits();
|
||||
p2t = dev->DevUnitsToAppUnits();
|
||||
|
||||
nscoord max;
|
||||
if (aHorizontal) {
|
||||
max = scrolledSize.width - portSize.width;
|
||||
// Round by pixel
|
||||
nscoord maxPx = NSTwipsToIntPixels(max, t2p);
|
||||
max = NSIntPixelsToTwips(maxPx, p2t);
|
||||
} else {
|
||||
max = scrolledSize.height - portSize.height;
|
||||
// Round by pixel
|
||||
nscoord maxPx = NSTwipsToIntPixels(max, t2p);
|
||||
max = NSIntPixelsToTwips(maxPx, p2t);
|
||||
}
|
||||
|
||||
// Can scroll to Bottom or to Right?
|
||||
aResult = (offset < max) ? PR_TRUE : PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool nsScrollPortView::CannotBitBlt(nsView* aScrolledView)
|
||||
{
|
||||
PRUint32 scrolledViewFlags = aScrolledView->GetViewFlags();
|
||||
|
@ -563,17 +612,13 @@ NS_IMETHODIMP nsScrollPortView::Paint(nsIRenderingContext& aRC, const nsIRegion&
|
|||
NS_IMETHODIMP nsScrollPortView::ScrollToImpl(nscoord aX, nscoord aY, PRUint32 aUpdateFlags)
|
||||
{
|
||||
PRInt32 dxPx = 0, dyPx = 0;
|
||||
|
||||
// convert to pixels
|
||||
nsIDeviceContext *dev;
|
||||
float t2p;
|
||||
float p2t;
|
||||
|
||||
mViewManager->GetDeviceContext(dev);
|
||||
t2p = dev->AppUnitsToDevUnits();
|
||||
// convert to pixels
|
||||
nsCOMPtr<nsIDeviceContext> dev;
|
||||
mViewManager->GetDeviceContext(*getter_AddRefs(dev));
|
||||
float t2p, p2t;
|
||||
t2p = dev->AppUnitsToDevUnits();
|
||||
p2t = dev->DevUnitsToAppUnits();
|
||||
|
||||
NS_RELEASE(dev);
|
||||
|
||||
// Update the scrolled view's position
|
||||
nsresult rv = ClampScrollValues(aX, aY, this);
|
||||
|
|
|
@ -77,7 +77,8 @@ public:
|
|||
NS_IMETHOD GetPageScrollDistances(nsSize *aDistances);
|
||||
NS_IMETHOD ScrollByPages(PRInt32 aNumPagesX, PRInt32 aNumPagesY);
|
||||
NS_IMETHOD ScrollByWhole(PRBool aTop);
|
||||
|
||||
NS_IMETHOD CanScroll(PRBool aHorizontal, PRBool aForward, PRBool &aResult);
|
||||
|
||||
NS_IMETHOD_(nsIView*) View();
|
||||
|
||||
NS_IMETHOD AddScrollPositionListener(nsIScrollPositionListener* aListener);
|
||||
|
|
Загрузка…
Ссылка в новой задаче