nsresult nsHTMLEditor::StartResizing(nsIDOMElement *aHandle) { // First 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->OnStartResizing(mResizedObject); } } mIsResizing = PR_TRUE; mActivatedHandle = aHandle; mActivatedHandle->SetAttribute(NS_LITERAL_STRING("_moz_activated"), NS_LITERAL_STRING("true")); // do we want to preserve ratio or not? PRBool preserveRatio = nsHTMLEditUtils::IsImage(mResizedObject); nsresult result; nsCOMPtr<nsIPrefBranch> prefBranch = do_GetService(NS_PREFSERVICE_CONTRACTID, &result); if (NS_SUCCEEDED(result) && prefBranch && preserveRatio) { result = prefBranch->GetBoolPref("editor.resizing.preserve_ratio", &preserveRatio); if (NS_FAILED(result)) { // just in case Anvil does not update its prefs file // and because it really does not make sense to me to allow free // resizing on corners without a modifier key preserveRatio = PR_TRUE; } } // the way we change the position/size of the shadow depends on // the handle nsAutoString locationStr; aHandle->GetAttribute(NS_LITERAL_STRING("anonlocation"), locationStr); if (locationStr.Equals(kTopLeft)) { SetResizeIncrements(1, 1, -1, -1, preserveRatio); } else if (locationStr.Equals(kTop)) { SetResizeIncrements(0, 1, 0, -1, PR_FALSE); } else if (locationStr.Equals(kTopRight)) { SetResizeIncrements(0, 1, 1, -1, preserveRatio); } else if (locationStr.Equals(kLeft)) { SetResizeIncrements(1, 0, -1, 0, PR_FALSE); } else if (locationStr.Equals(kRight)) { SetResizeIncrements(0, 0, 1, 0, PR_FALSE); } else if (locationStr.Equals(kBottomLeft)) { SetResizeIncrements(1, 0, -1, 1, preserveRatio); } else if (locationStr.Equals(kBottom)) { SetResizeIncrements(0, 0, 0, 1, PR_FALSE); } else if (locationStr.Equals(kBottomRight)) { SetResizeIncrements(0, 0, 1, 1, preserveRatio); } // make the shadow appear mResizingShadow->RemoveAttribute(NS_LITERAL_STRING("class")); // position it mHTMLCSSUtils->SetCSSPropertyPixels(mResizingShadow, NS_LITERAL_STRING("width"), mResizedObjectWidth); mHTMLCSSUtils->SetCSSPropertyPixels(mResizingShadow, NS_LITERAL_STRING("height"), mResizedObjectHeight); // add a mouse move listener to the editor if (!mMouseMotionListenerP) { mMouseMotionListenerP = new ResizerMouseMotionListener(this); if (!mMouseMotionListenerP) { return NS_ERROR_OUT_OF_MEMORY; } nsCOMPtr<nsPIDOMEventTarget> piTarget = GetPIDOMEventTarget(); nsCOMPtr<nsIDOMEventTarget> target = do_QueryInterface(piTarget); NS_ENSURE_TRUE(target, NS_ERROR_FAILURE); result = target->AddEventListener(NS_LITERAL_STRING("mousemove"), mMouseMotionListenerP, PR_TRUE); NS_ASSERTION(NS_SUCCEEDED(result), "failed to register mouse motion listener"); } return result; }
nsresult HTMLEditor::StartResizing(nsIDOMElement* aHandle) { mIsResizing = true; mActivatedHandle = do_QueryInterface(aHandle); NS_ENSURE_STATE(mActivatedHandle || !aHandle); mActivatedHandle->SetAttr(kNameSpaceID_None, nsGkAtoms::_moz_activated, NS_LITERAL_STRING("true"), true); // do we want to preserve ratio or not? bool preserveRatio = HTMLEditUtils::IsImage(mResizedObject) && Preferences::GetBool("editor.resizing.preserve_ratio", true); // the way we change the position/size of the shadow depends on // the handle nsAutoString locationStr; aHandle->GetAttribute(NS_LITERAL_STRING("anonlocation"), locationStr); if (locationStr.Equals(kTopLeft)) { SetResizeIncrements(1, 1, -1, -1, preserveRatio); } else if (locationStr.Equals(kTop)) { SetResizeIncrements(0, 1, 0, -1, false); } else if (locationStr.Equals(kTopRight)) { SetResizeIncrements(0, 1, 1, -1, preserveRatio); } else if (locationStr.Equals(kLeft)) { SetResizeIncrements(1, 0, -1, 0, false); } else if (locationStr.Equals(kRight)) { SetResizeIncrements(0, 0, 1, 0, false); } else if (locationStr.Equals(kBottomLeft)) { SetResizeIncrements(1, 0, -1, 1, preserveRatio); } else if (locationStr.Equals(kBottom)) { SetResizeIncrements(0, 0, 0, 1, false); } else if (locationStr.Equals(kBottomRight)) { SetResizeIncrements(0, 0, 1, 1, preserveRatio); } // make the shadow appear mResizingShadow->UnsetAttr(kNameSpaceID_None, nsGkAtoms::_class, true); // position it mCSSEditUtils->SetCSSPropertyPixels(*mResizingShadow, *nsGkAtoms::width, mResizedObjectWidth); mCSSEditUtils->SetCSSPropertyPixels(*mResizingShadow, *nsGkAtoms::height, mResizedObjectHeight); // add a mouse move listener to the editor nsresult result = NS_OK; if (!mMouseMotionListenerP) { mMouseMotionListenerP = new ResizerMouseMotionListener(*this); if (!mMouseMotionListenerP) { return NS_ERROR_OUT_OF_MEMORY; } nsCOMPtr<nsIDOMEventTarget> target = GetDOMEventTarget(); NS_ENSURE_TRUE(target, NS_ERROR_FAILURE); result = target->AddEventListener(NS_LITERAL_STRING("mousemove"), mMouseMotionListenerP, true); NS_ASSERTION(NS_SUCCEEDED(result), "failed to register mouse motion listener"); } return result; }