void ImageDocument::RestoreImage() { if (!mImageContent) { return; } // Keep image content alive while changing the attributes. nsCOMPtr<Element> imageContent = mImageContent; imageContent->UnsetAttr(kNameSpaceID_None, nsGkAtoms::width, true); imageContent->UnsetAttr(kNameSpaceID_None, nsGkAtoms::height, true); if (ImageIsOverflowing()) { if (!mImageIsOverflowingVertically) { SetModeClass(eOverflowingHorizontalOnly); } else { SetModeClass(eOverflowingVertical); } } else { SetModeClass(eNone); } mImageIsResized = false; UpdateTitleAndCharset(); }
nsresult ImageDocument::CheckOverflowing(bool changeState) { /* Create a scope so that the style context gets destroyed before we might * call RebuildStyleData. Also, holding onto pointers to the * presentation through style resolution is potentially dangerous. */ { nsIPresShell *shell = GetShell(); if (!shell) { return NS_OK; } nsPresContext *context = shell->GetPresContext(); nsRect visibleArea = context->GetVisibleArea(); mVisibleWidth = nsPresContext::AppUnitsToFloatCSSPixels(visibleArea.width); mVisibleHeight = nsPresContext::AppUnitsToFloatCSSPixels(visibleArea.height); } bool imageWasOverflowing = ImageIsOverflowing(); bool imageWasOverflowingVertically = mImageIsOverflowingVertically; mImageIsOverflowingHorizontally = mImageWidth > mVisibleWidth; mImageIsOverflowingVertically = mImageHeight > mVisibleHeight; bool windowBecameBigEnough = imageWasOverflowing && !ImageIsOverflowing(); bool verticalOverflowChanged = mImageIsOverflowingVertically != imageWasOverflowingVertically; if (changeState || mShouldResize || mFirstResize || windowBecameBigEnough || verticalOverflowChanged) { if (ImageIsOverflowing() && (changeState || mShouldResize)) { ShrinkToFit(); } else if (mImageIsResized || mFirstResize || windowBecameBigEnough) { RestoreImage(); } else if (!mImageIsResized && verticalOverflowChanged) { if (mImageIsOverflowingVertically) { SetModeClass(eOverflowingVertical); } else { SetModeClass(eOverflowingHorizontalOnly); } } } mFirstResize = false; return NS_OK; }
void ImageDocument::ToggleImageSize() { mShouldResize = true; if (mImageIsResized) { mShouldResize = false; ResetZoomLevel(); RestoreImage(); } else if (ImageIsOverflowing()) { ResetZoomLevel(); ShrinkToFit(); } }
NS_IMETHODIMP ImageDocument::HandleEvent(nsIDOMEvent* aEvent) { nsAutoString eventType; aEvent->GetType(eventType); if (eventType.EqualsLiteral("resize")) { CheckOverflowing(false); } else if (eventType.EqualsLiteral("click") && mClickResizingEnabled) { ResetZoomLevel(); mShouldResize = true; if (mImageIsResized) { int32_t x = 0, y = 0; nsCOMPtr<nsIDOMMouseEvent> event(do_QueryInterface(aEvent)); if (event) { event->GetClientX(&x); event->GetClientY(&y); int32_t left = 0, top = 0; nsCOMPtr<nsIDOMHTMLElement> htmlElement = do_QueryInterface(mImageContent); htmlElement->GetOffsetLeft(&left); htmlElement->GetOffsetTop(&top); x -= left; y -= top; } mShouldResize = false; RestoreImageTo(x, y); } else if (ImageIsOverflowing()) { ShrinkToFit(); } } else if (eventType.EqualsLiteral("load")) { UpdateSizeFromLayout(); } return NS_OK; }
NS_IMETHODIMP ImageDocument::GetImageIsOverflowing(bool* aImageIsOverflowing) { *aImageIsOverflowing = ImageIsOverflowing(); return NS_OK; }