123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #include "nsFormControlFrame.h"
- #include "nsGkAtoms.h"
- #include "nsLayoutUtils.h"
- #include "nsIDOMHTMLInputElement.h"
- #include "mozilla/EventStateManager.h"
- #include "mozilla/LookAndFeel.h"
- #include "nsDeviceContext.h"
- #include "nsIContent.h"
- using namespace mozilla;
- //#define FCF_NOISY
- nsFormControlFrame::nsFormControlFrame(nsStyleContext* aContext)
- : nsAtomicContainerFrame(aContext)
- {
- }
- nsFormControlFrame::~nsFormControlFrame()
- {
- }
- nsIAtom*
- nsFormControlFrame::GetType() const
- {
- return nsGkAtoms::formControlFrame;
- }
- void
- nsFormControlFrame::DestroyFrom(nsIFrame* aDestructRoot)
- {
- // Unregister the access key registered in reflow
- nsFormControlFrame::RegUnRegAccessKey(static_cast<nsIFrame*>(this), false);
- nsAtomicContainerFrame::DestroyFrom(aDestructRoot);
- }
- NS_QUERYFRAME_HEAD(nsFormControlFrame)
- NS_QUERYFRAME_ENTRY(nsIFormControlFrame)
- NS_QUERYFRAME_TAIL_INHERITING(nsAtomicContainerFrame)
- /* virtual */ nscoord
- nsFormControlFrame::GetMinISize(nsRenderingContext *aRenderingContext)
- {
- nscoord result;
- DISPLAY_MIN_WIDTH(this, result);
- result = GetIntrinsicISize();
- return result;
- }
- /* virtual */ nscoord
- nsFormControlFrame::GetPrefISize(nsRenderingContext *aRenderingContext)
- {
- nscoord result;
- DISPLAY_PREF_WIDTH(this, result);
- result = GetIntrinsicISize();
- return result;
- }
- /* virtual */
- LogicalSize
- nsFormControlFrame::ComputeAutoSize(nsRenderingContext* aRenderingContext,
- WritingMode aWM,
- const LogicalSize& aCBSize,
- nscoord aAvailableISize,
- const LogicalSize& aMargin,
- const LogicalSize& aBorder,
- const LogicalSize& aPadding,
- ComputeSizeFlags aFlags)
- {
- const WritingMode wm = GetWritingMode();
- LogicalSize result(wm, GetIntrinsicISize(), GetIntrinsicBSize());
- return result.ConvertTo(aWM, wm);
- }
- nscoord
- nsFormControlFrame::GetIntrinsicISize()
- {
- // Provide a reasonable default for sites that use an "auto" height.
- // Note that if you change this, you should change the values in forms.css
- // as well. This is the 13px default width minus the 2px default border.
- return nsPresContext::CSSPixelsToAppUnits(13 - 2 * 2);
- }
- nscoord
- nsFormControlFrame::GetIntrinsicBSize()
- {
- // Provide a reasonable default for sites that use an "auto" height.
- // Note that if you change this, you should change the values in forms.css
- // as well. This is the 13px default width minus the 2px default border.
- return nsPresContext::CSSPixelsToAppUnits(13 - 2 * 2);
- }
- nscoord
- nsFormControlFrame::GetLogicalBaseline(WritingMode aWritingMode) const
- {
- NS_ASSERTION(!NS_SUBTREE_DIRTY(this),
- "frame must not be dirty");
- // Treat radio buttons and checkboxes as having an intrinsic baseline
- // at the block-end of the control (use the block-end content edge rather
- // than the margin edge).
- // For "inverted" lines (typically in writing-mode:vertical-lr), use the
- // block-start end instead.
- return aWritingMode.IsLineInverted()
- ? GetLogicalUsedBorderAndPadding(aWritingMode).BStart(aWritingMode)
- : BSize(aWritingMode) -
- GetLogicalUsedBorderAndPadding(aWritingMode).BEnd(aWritingMode);
- }
- void
- nsFormControlFrame::Reflow(nsPresContext* aPresContext,
- ReflowOutput& aDesiredSize,
- const ReflowInput& aReflowInput,
- nsReflowStatus& aStatus)
- {
- MarkInReflow();
- DO_GLOBAL_REFLOW_COUNT("nsFormControlFrame");
- DISPLAY_REFLOW(aPresContext, this, aReflowInput, aDesiredSize, aStatus);
- NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS,
- ("enter nsFormControlFrame::Reflow: aMaxSize=%d,%d",
- aReflowInput.AvailableWidth(), aReflowInput.AvailableHeight()));
- if (mState & NS_FRAME_FIRST_REFLOW) {
- RegUnRegAccessKey(static_cast<nsIFrame*>(this), true);
- }
- aStatus = NS_FRAME_COMPLETE;
- aDesiredSize.SetSize(aReflowInput.GetWritingMode(),
- aReflowInput.ComputedSizeWithBorderPadding());
- if (nsLayoutUtils::FontSizeInflationEnabled(aPresContext)) {
- float inflation = nsLayoutUtils::FontSizeInflationFor(this);
- aDesiredSize.Width() *= inflation;
- aDesiredSize.Height() *= inflation;
- }
- NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS,
- ("exit nsFormControlFrame::Reflow: size=%d,%d",
- aDesiredSize.Width(), aDesiredSize.Height()));
- NS_FRAME_SET_TRUNCATION(aStatus, aReflowInput, aDesiredSize);
- aDesiredSize.SetOverflowAreasToDesiredBounds();
- FinishAndStoreOverflow(&aDesiredSize);
- }
- nsresult
- nsFormControlFrame::RegUnRegAccessKey(nsIFrame * aFrame, bool aDoReg)
- {
- NS_ENSURE_ARG_POINTER(aFrame);
-
- nsPresContext* presContext = aFrame->PresContext();
-
- NS_ASSERTION(presContext, "aPresContext is NULL in RegUnRegAccessKey!");
- nsAutoString accessKey;
- nsIContent* content = aFrame->GetContent();
- content->GetAttr(kNameSpaceID_None, nsGkAtoms::accesskey, accessKey);
- if (!accessKey.IsEmpty()) {
- EventStateManager* stateManager = presContext->EventStateManager();
- if (aDoReg) {
- stateManager->RegisterAccessKey(content, (uint32_t)accessKey.First());
- } else {
- stateManager->UnregisterAccessKey(content, (uint32_t)accessKey.First());
- }
- return NS_OK;
- }
- return NS_ERROR_FAILURE;
- }
- void
- nsFormControlFrame::SetFocus(bool aOn, bool aRepaint)
- {
- }
- nsresult
- nsFormControlFrame::HandleEvent(nsPresContext* aPresContext,
- WidgetGUIEvent* aEvent,
- nsEventStatus* aEventStatus)
- {
- // Check for user-input:none style
- const nsStyleUserInterface* uiStyle = StyleUserInterface();
- if (uiStyle->mUserInput == StyleUserInput::None ||
- uiStyle->mUserInput == StyleUserInput::Disabled) {
- return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
- }
- return NS_OK;
- }
- void
- nsFormControlFrame::GetCurrentCheckState(bool *aState)
- {
- nsCOMPtr<nsIDOMHTMLInputElement> inputElement = do_QueryInterface(mContent);
- if (inputElement) {
- inputElement->GetChecked(aState);
- }
- }
- nsresult
- nsFormControlFrame::SetFormProperty(nsIAtom* aName, const nsAString& aValue)
- {
- return NS_OK;
- }
- // static
- nsRect
- nsFormControlFrame::GetUsableScreenRect(nsPresContext* aPresContext)
- {
- nsRect screen;
- nsDeviceContext *context = aPresContext->DeviceContext();
- int32_t dropdownCanOverlapOSBar =
- LookAndFeel::GetInt(LookAndFeel::eIntID_MenusCanOverlapOSBar, 0);
- if ( dropdownCanOverlapOSBar )
- context->GetRect(screen);
- else
- context->GetClientRect(screen);
- return screen;
- }
|