//----------------------------------------------------------------------------- NS_IMETHODIMP nsCaret::NotifySelectionChanged(nsIDOMDocument *, nsISelection *aDomSel, PRInt16 aReason) { if (aReason & nsISelectionListener::MOUSEUP_REASON)//this wont do return NS_OK; nsCOMPtr<nsISelection> domSel(do_QueryReferent(mDomSelectionWeak)); // The same caret is shared amongst the document and any text widgets it // may contain. This means that the caret could get notifications from // multiple selections. // // If this notification is for a selection that is not the one the // the caret is currently interested in (mDomSelectionWeak), then there // is nothing to do! if (domSel != aDomSel) return NS_OK; if (mVisible) { // Stop the caret from blinking in its previous location. StopBlinking(); // Start the caret blinking in the new location. StartBlinking(); } return NS_OK; }
//----------------------------------------------------------------------------- nsresult nsCaret::Init(nsIPresShell *inPresShell) { NS_ENSURE_ARG(inPresShell); mPresShell = do_GetWeakReference(inPresShell); // the presshell owns us, so no addref NS_ASSERTION(mPresShell, "Hey, pres shell should support weak refs"); // get nsILookAndFeel from the pres context, which has one cached. nsILookAndFeel *lookAndFeel = nsnull; nsPresContext *presContext = inPresShell->GetPresContext(); // XXX we should just do this nsILookAndFeel consultation every time // we need these values. mCaretWidthCSSPx = 1; mCaretAspectRatio = 0; if (presContext && (lookAndFeel = presContext->LookAndFeel())) { PRInt32 tempInt; float tempFloat; if (NS_SUCCEEDED(lookAndFeel->GetMetric(nsILookAndFeel::eMetric_CaretWidth, tempInt))) mCaretWidthCSSPx = (nscoord)tempInt; if (NS_SUCCEEDED(lookAndFeel->GetMetric(nsILookAndFeel::eMetricFloat_CaretAspectRatio, tempFloat))) mCaretAspectRatio = tempFloat; if (NS_SUCCEEDED(lookAndFeel->GetMetric(nsILookAndFeel::eMetric_CaretBlinkTime, tempInt))) mBlinkRate = (PRUint32)tempInt; if (NS_SUCCEEDED(lookAndFeel->GetMetric(nsILookAndFeel::eMetric_ShowCaretDuringSelection, tempInt))) mShowDuringSelection = tempInt ? PR_TRUE : PR_FALSE; } // get the selection from the pres shell, and set ourselves up as a selection // listener nsCOMPtr<nsISelectionController> selCon = do_QueryReferent(mPresShell); if (!selCon) return NS_ERROR_FAILURE; nsCOMPtr<nsISelection> domSelection; nsresult rv = selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(domSelection)); if (NS_FAILED(rv)) return rv; if (!domSelection) return NS_ERROR_FAILURE; nsCOMPtr<nsISelectionPrivate> privateSelection = do_QueryInterface(domSelection); if (privateSelection) privateSelection->AddSelectionListener(this); mDomSelectionWeak = do_GetWeakReference(domSelection); // set up the blink timer if (mVisible) { StartBlinking(); } #ifdef IBMBIDI mBidiUI = nsContentUtils::GetBoolPref("bidi.browser.ui"); #endif return NS_OK; }
//----------------------------------------------------------------------------- void nsCaret::SetCaretVisible(PRBool inMakeVisible) { mVisible = inMakeVisible; if (mVisible) { StartBlinking(); SetIgnoreUserModify(PR_TRUE); } else { StopBlinking(); SetIgnoreUserModify(PR_FALSE); } }
//----------------------------------------------------------------------------- nsresult nsCaret::SetCaretDOMSelection(nsISelection *aDOMSel) { NS_ENSURE_ARG_POINTER(aDOMSel); mDomSelectionWeak = do_GetWeakReference(aDOMSel); // weak reference to pres shell if (mVisible) { // Stop the caret from blinking in its previous location. StopBlinking(); // Start the caret blinking in the new location. StartBlinking(); } return NS_OK; }
void nsMenuFrame::Execute(nsGUIEvent *aEvent) { // flip "checked" state if we're a checkbox menu, or an un-checked radio menu PRBool needToFlipChecked = PR_FALSE; if (mType == eMenuType_Checkbox || (mType == eMenuType_Radio && !mChecked)) { needToFlipChecked = !mContent->AttrValueIs(kNameSpaceID_None, nsGkAtoms::autocheck, nsGkAtoms::_false, eCaseMatters); } nsCOMPtr<nsISound> sound(do_CreateInstance("@mozilla.org/sound;1")); if (sound) sound->PlayEventSound(nsISound::EVENT_MENU_EXECUTE); StartBlinking(aEvent, needToFlipChecked); }