layout/forms/nsGfxCheckboxControlFrame.cpp

Wed, 31 Dec 2014 13:27:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 13:27:57 +0100
branch
TOR_BUG_3246
changeset 6
8bccb770b82d
permissions
-rw-r--r--

Ignore runtime configuration files generated during quality assurance.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "nsGfxCheckboxControlFrame.h"
     7 #include "nsIContent.h"
     8 #include "nsCOMPtr.h"
     9 #include "nsRenderingContext.h"
    10 #include "nsIDOMHTMLInputElement.h"
    11 #include "nsDisplayList.h"
    12 #include <algorithm>
    14 using namespace mozilla;
    16 static void
    17 PaintCheckMark(nsIFrame* aFrame,
    18                nsRenderingContext* aCtx,
    19                const nsRect& aDirtyRect,
    20                nsPoint aPt)
    21 {
    22   nsRect rect(aPt, aFrame->GetSize());
    23   rect.Deflate(aFrame->GetUsedBorderAndPadding());
    25   // Points come from the coordinates on a 7X7 unit box centered at 0,0
    26   const int32_t checkPolygonX[] = { -3, -1,  3,  3, -1, -3 };
    27   const int32_t checkPolygonY[] = { -1,  1, -3, -1,  3,  1 };
    28   const int32_t checkNumPoints = sizeof(checkPolygonX) / sizeof(int32_t);
    29   const int32_t checkSize      = 9; // 2 units of padding on either side
    30                                     // of the 7x7 unit checkmark
    32   // Scale the checkmark based on the smallest dimension
    33   nscoord paintScale = std::min(rect.width, rect.height) / checkSize;
    34   nsPoint paintCenter(rect.x + rect.width  / 2,
    35                       rect.y + rect.height / 2);
    37   nsPoint paintPolygon[checkNumPoints];
    38   // Convert checkmark for screen rendering
    39   for (int32_t polyIndex = 0; polyIndex < checkNumPoints; polyIndex++) {
    40     paintPolygon[polyIndex] = paintCenter +
    41                               nsPoint(checkPolygonX[polyIndex] * paintScale,
    42                                       checkPolygonY[polyIndex] * paintScale);
    43   }
    45   aCtx->SetColor(aFrame->StyleColor()->mColor);
    46   aCtx->FillPolygon(paintPolygon, checkNumPoints);
    47 }
    49 static void
    50 PaintIndeterminateMark(nsIFrame* aFrame,
    51                        nsRenderingContext* aCtx,
    52                        const nsRect& aDirtyRect,
    53                        nsPoint aPt)
    54 {
    55   nsRect rect(aPt, aFrame->GetSize());
    56   rect.Deflate(aFrame->GetUsedBorderAndPadding());
    58   rect.y += (rect.height - rect.height/4) / 2;
    59   rect.height /= 4;
    61   aCtx->SetColor(aFrame->StyleColor()->mColor);
    62   aCtx->FillRect(rect);
    63 }
    65 //------------------------------------------------------------
    66 nsIFrame*
    67 NS_NewGfxCheckboxControlFrame(nsIPresShell* aPresShell,
    68                               nsStyleContext* aContext)
    69 {
    70   return new (aPresShell) nsGfxCheckboxControlFrame(aContext);
    71 }
    73 NS_IMPL_FRAMEARENA_HELPERS(nsGfxCheckboxControlFrame)
    76 //------------------------------------------------------------
    77 // Initialize GFX-rendered state
    78 nsGfxCheckboxControlFrame::nsGfxCheckboxControlFrame(nsStyleContext* aContext)
    79 : nsFormControlFrame(aContext)
    80 {
    81 }
    83 nsGfxCheckboxControlFrame::~nsGfxCheckboxControlFrame()
    84 {
    85 }
    87 #ifdef ACCESSIBILITY
    88 a11y::AccType
    89 nsGfxCheckboxControlFrame::AccessibleType()
    90 {
    91   return a11y::eHTMLCheckboxType;
    92 }
    93 #endif
    95 //------------------------------------------------------------
    96 void
    97 nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder*   aBuilder,
    98                                             const nsRect&           aDirtyRect,
    99                                             const nsDisplayListSet& aLists)
   100 {
   101   nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists);
   103   // Get current checked state through content model.
   104   if ((!IsChecked() && !IsIndeterminate()) || !IsVisibleForPainting(aBuilder))
   105     return;   // we're not checked or not visible, nothing to paint.
   107   if (IsThemed())
   108     return; // No need to paint the checkmark. The theme will do it.
   110   aLists.Content()->AppendNewToTop(new (aBuilder)
   111     nsDisplayGeneric(aBuilder, this,
   112                      IsIndeterminate()
   113                      ? PaintIndeterminateMark : PaintCheckMark,
   114                      "CheckedCheckbox",
   115                      nsDisplayItem::TYPE_CHECKED_CHECKBOX));
   116 }
   118 //------------------------------------------------------------
   119 bool
   120 nsGfxCheckboxControlFrame::IsChecked()
   121 {
   122   nsCOMPtr<nsIDOMHTMLInputElement> elem(do_QueryInterface(mContent));
   123   bool retval = false;
   124   elem->GetChecked(&retval);
   125   return retval;
   126 }
   128 bool
   129 nsGfxCheckboxControlFrame::IsIndeterminate()
   130 {
   131   nsCOMPtr<nsIDOMHTMLInputElement> elem(do_QueryInterface(mContent));
   132   bool retval = false;
   133   elem->GetIndeterminate(&retval);
   134   return retval;
   135 }

mercurial