void nsHTMLEditor::SetFinalSize(PRInt32 aX, PRInt32 aY) { if (!mResizedObject) { // paranoia return; } if (mActivatedHandle) { mActivatedHandle->RemoveAttribute(NS_LITERAL_STRING("_moz_activated")); mActivatedHandle = nsnull; } // we have now to set the new width and height of the resized object // we don't set the x and y position because we don't control that in // a normal HTML layout PRInt32 left = GetNewResizingX(aX, aY); PRInt32 top = GetNewResizingY(aX, aY); PRInt32 width = GetNewResizingWidth(aX, aY); PRInt32 height = GetNewResizingHeight(aX, aY); PRBool setWidth = !mResizedObjectIsAbsolutelyPositioned || (width != mResizedObjectWidth); PRBool setHeight = !mResizedObjectIsAbsolutelyPositioned || (height != mResizedObjectHeight); PRInt32 x, y; x = left - ((mResizedObjectIsAbsolutelyPositioned) ? mResizedObjectBorderLeft+mResizedObjectMarginLeft : 0); y = top - ((mResizedObjectIsAbsolutelyPositioned) ? mResizedObjectBorderTop+mResizedObjectMarginTop : 0); // we need to know if we're in a CSS-enabled editor or not PRBool useCSS; GetIsCSSEnabled(&useCSS); // we want one transaction only from a user's point of view nsAutoEditBatch batchIt(this); NS_NAMED_LITERAL_STRING(widthStr, "width"); NS_NAMED_LITERAL_STRING(heightStr, "height"); PRBool hasAttr = PR_FALSE; if (mResizedObjectIsAbsolutelyPositioned) { if (setHeight) mHTMLCSSUtils->SetCSSPropertyPixels(mResizedObject, nsEditProperty::cssTop, y, PR_FALSE); if (setWidth) mHTMLCSSUtils->SetCSSPropertyPixels(mResizedObject, nsEditProperty::cssLeft, x, PR_FALSE); } if (useCSS || mResizedObjectIsAbsolutelyPositioned) { if (setWidth && NS_SUCCEEDED(mResizedObject->HasAttribute(widthStr, &hasAttr)) && hasAttr) RemoveAttribute(mResizedObject, widthStr); hasAttr = PR_FALSE; if (setHeight && NS_SUCCEEDED(mResizedObject->HasAttribute(heightStr, &hasAttr)) && hasAttr) RemoveAttribute(mResizedObject, heightStr); if (setWidth) mHTMLCSSUtils->SetCSSPropertyPixels(mResizedObject, nsEditProperty::cssWidth, width, PR_FALSE); if (setHeight) mHTMLCSSUtils->SetCSSPropertyPixels(mResizedObject, nsEditProperty::cssHeight, height, PR_FALSE); } else { // we use HTML size and remove all equivalent CSS properties // we set the CSS width and height to remove it later, // triggering an immediate reflow; otherwise, we have problems // with asynchronous reflow if (setWidth) mHTMLCSSUtils->SetCSSPropertyPixels(mResizedObject, nsEditProperty::cssWidth, width, PR_FALSE); if (setHeight) mHTMLCSSUtils->SetCSSPropertyPixels(mResizedObject, nsEditProperty::cssHeight, height, PR_FALSE); if (setWidth) { nsAutoString w; w.AppendInt(width); SetAttribute(mResizedObject, widthStr, w); } if (setHeight) { nsAutoString h; h.AppendInt(height); SetAttribute(mResizedObject, heightStr, h); } if (setWidth) mHTMLCSSUtils->RemoveCSSProperty(mResizedObject, nsEditProperty::cssWidth, EmptyString(), PR_FALSE); if (setHeight) mHTMLCSSUtils->RemoveCSSProperty(mResizedObject, nsEditProperty::cssHeight, EmptyString(), PR_FALSE); } // finally notify the listeners if any PRInt32 listenersCount = objectResizeEventListeners.Count(); if (listenersCount) { nsCOMPtr<nsIHTMLObjectResizeListener> listener; PRInt32 index; for (index = 0; index < listenersCount; index++) { listener = objectResizeEventListeners[index]; listener->OnEndResizing(mResizedObject, mResizedObjectWidth, mResizedObjectHeight, width, height); } } // keep track of that size mResizedObjectWidth = width; mResizedObjectHeight = height; RefreshResizers(); }
void HTMLEditor::SetFinalSize(int32_t aX, int32_t aY) { if (!mResizedObject) { // paranoia return; } if (mActivatedHandle) { mActivatedHandle->UnsetAttr(kNameSpaceID_None, nsGkAtoms::_moz_activated, true); mActivatedHandle = nullptr; } // we have now to set the new width and height of the resized object // we don't set the x and y position because we don't control that in // a normal HTML layout int32_t left = GetNewResizingX(aX, aY); int32_t top = GetNewResizingY(aX, aY); int32_t width = GetNewResizingWidth(aX, aY); int32_t height = GetNewResizingHeight(aX, aY); bool setWidth = !mResizedObjectIsAbsolutelyPositioned || (width != mResizedObjectWidth); bool setHeight = !mResizedObjectIsAbsolutelyPositioned || (height != mResizedObjectHeight); int32_t x, y; x = left - ((mResizedObjectIsAbsolutelyPositioned) ? mResizedObjectBorderLeft+mResizedObjectMarginLeft : 0); y = top - ((mResizedObjectIsAbsolutelyPositioned) ? mResizedObjectBorderTop+mResizedObjectMarginTop : 0); // we want one transaction only from a user's point of view AutoEditBatch batchIt(this); if (mResizedObjectIsAbsolutelyPositioned) { if (setHeight) { mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::top, y); } if (setWidth) { mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::left, x); } } if (IsCSSEnabled() || mResizedObjectIsAbsolutelyPositioned) { if (setWidth && mResizedObject->HasAttr(kNameSpaceID_None, nsGkAtoms::width)) { RemoveAttribute(mResizedObject, nsGkAtoms::width); } if (setHeight && mResizedObject->HasAttr(kNameSpaceID_None, nsGkAtoms::height)) { RemoveAttribute(mResizedObject, nsGkAtoms::height); } if (setWidth) { mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::width, width); } if (setHeight) { mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::height, height); } } else { // we use HTML size and remove all equivalent CSS properties // we set the CSS width and height to remove it later, // triggering an immediate reflow; otherwise, we have problems // with asynchronous reflow if (setWidth) { mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::width, width); } if (setHeight) { mCSSEditUtils->SetCSSPropertyPixels(*mResizedObject, *nsGkAtoms::height, height); } if (setWidth) { nsAutoString w; w.AppendInt(width); SetAttribute(mResizedObject, nsGkAtoms::width, w); } if (setHeight) { nsAutoString h; h.AppendInt(height); SetAttribute(mResizedObject, nsGkAtoms::height, h); } if (setWidth) { mCSSEditUtils->RemoveCSSProperty(*mResizedObject, *nsGkAtoms::width, EmptyString()); } if (setHeight) { mCSSEditUtils->RemoveCSSProperty(*mResizedObject, *nsGkAtoms::height, EmptyString()); } } // keep track of that size mResizedObjectWidth = width; mResizedObjectHeight = height; RefreshResizers(); }
NS_IMETHODIMP nsHTMLEditor::MouseMove(nsIDOMEvent* aMouseEvent) { NS_NAMED_LITERAL_STRING(leftStr, "left"); NS_NAMED_LITERAL_STRING(topStr, "top"); if (mIsResizing) { // we are resizing and the mouse pointer's position has changed // we have to resdisplay the shadow nsCOMPtr<nsIDOMMouseEvent> mouseEvent ( do_QueryInterface(aMouseEvent) ); PRInt32 clientX, clientY; mouseEvent->GetClientX(&clientX); mouseEvent->GetClientY(&clientY); PRInt32 newX = GetNewResizingX(clientX, clientY); PRInt32 newY = GetNewResizingY(clientX, clientY); PRInt32 newWidth = GetNewResizingWidth(clientX, clientY); PRInt32 newHeight = GetNewResizingHeight(clientX, clientY); mHTMLCSSUtils->SetCSSPropertyPixels(mResizingShadow, leftStr, newX); mHTMLCSSUtils->SetCSSPropertyPixels(mResizingShadow, topStr, newY); mHTMLCSSUtils->SetCSSPropertyPixels(mResizingShadow, NS_LITERAL_STRING("width"), newWidth); mHTMLCSSUtils->SetCSSPropertyPixels(mResizingShadow, NS_LITERAL_STRING("height"), newHeight); return SetResizingInfoPosition(newX, newY, newWidth, newHeight); } if (mGrabberClicked) { nsCOMPtr<nsIDOMMouseEvent> mouseEvent ( do_QueryInterface(aMouseEvent) ); PRInt32 clientX, clientY; mouseEvent->GetClientX(&clientX); mouseEvent->GetClientY(&clientY); nsCOMPtr<nsILookAndFeel> look = do_GetService(kLookAndFeelCID); NS_ASSERTION(look, "Look and feel service must be implemented for this toolkit"); PRInt32 xThreshold=1, yThreshold=1; look->GetMetric(nsILookAndFeel::eMetric_DragThresholdX, xThreshold); look->GetMetric(nsILookAndFeel::eMetric_DragThresholdY, yThreshold); if (PR_ABS(clientX - mOriginalX ) * 2 >= xThreshold || PR_ABS(clientY - mOriginalY ) * 2 >= yThreshold) { mGrabberClicked = PR_FALSE; StartMoving(nsnull); } } if (mIsMoving) { nsCOMPtr<nsIDOMMouseEvent> mouseEvent ( do_QueryInterface(aMouseEvent) ); PRInt32 clientX, clientY; mouseEvent->GetClientX(&clientX); mouseEvent->GetClientY(&clientY); PRInt32 newX = mPositionedObjectX + clientX - mOriginalX; PRInt32 newY = mPositionedObjectY + clientY - mOriginalY; SnapToGrid(newX, newY); mHTMLCSSUtils->SetCSSPropertyPixels(mPositioningShadow, leftStr, newX); mHTMLCSSUtils->SetCSSPropertyPixels(mPositioningShadow, topStr, newY); } return NS_OK; }
nsresult HTMLEditor::MouseMove(nsIDOMMouseEvent* aMouseEvent) { MOZ_ASSERT(aMouseEvent); NS_NAMED_LITERAL_STRING(leftStr, "left"); NS_NAMED_LITERAL_STRING(topStr, "top"); if (mIsResizing) { // we are resizing and the mouse pointer's position has changed // we have to resdisplay the shadow int32_t clientX, clientY; aMouseEvent->GetClientX(&clientX); aMouseEvent->GetClientY(&clientY); int32_t newX = GetNewResizingX(clientX, clientY); int32_t newY = GetNewResizingY(clientX, clientY); int32_t newWidth = GetNewResizingWidth(clientX, clientY); int32_t newHeight = GetNewResizingHeight(clientX, clientY); mCSSEditUtils->SetCSSPropertyPixels(*mResizingShadow, *nsGkAtoms::left, newX); mCSSEditUtils->SetCSSPropertyPixels(*mResizingShadow, *nsGkAtoms::top, newY); mCSSEditUtils->SetCSSPropertyPixels(*mResizingShadow, *nsGkAtoms::width, newWidth); mCSSEditUtils->SetCSSPropertyPixels(*mResizingShadow, *nsGkAtoms::height, newHeight); return SetResizingInfoPosition(newX, newY, newWidth, newHeight); } if (mGrabberClicked) { int32_t clientX, clientY; aMouseEvent->GetClientX(&clientX); aMouseEvent->GetClientY(&clientY); int32_t xThreshold = LookAndFeel::GetInt(LookAndFeel::eIntID_DragThresholdX, 1); int32_t yThreshold = LookAndFeel::GetInt(LookAndFeel::eIntID_DragThresholdY, 1); if (DeprecatedAbs(clientX - mOriginalX) * 2 >= xThreshold || DeprecatedAbs(clientY - mOriginalY) * 2 >= yThreshold) { mGrabberClicked = false; StartMoving(nullptr); } } if (mIsMoving) { int32_t clientX, clientY; aMouseEvent->GetClientX(&clientX); aMouseEvent->GetClientY(&clientY); int32_t newX = mPositionedObjectX + clientX - mOriginalX; int32_t newY = mPositionedObjectY + clientY - mOriginalY; SnapToGrid(newX, newY); mCSSEditUtils->SetCSSPropertyPixels(*mPositioningShadow, *nsGkAtoms::left, newX); mCSSEditUtils->SetCSSPropertyPixels(*mPositioningShadow, *nsGkAtoms::top, newY); } return NS_OK; }