Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
      3  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
      4  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
      5  *
      6  * This library is free software; you can redistribute it and/or
      7  * modify it under the terms of the GNU Library General Public
      8  * License as published by the Free Software Foundation; either
      9  * version 2 of the License, or (at your option) any later version.
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Library General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU Library General Public License
     17  * along with this library; see the file COPYING.LIB.  If not, write to
     18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     19  * Boston, MA 02110-1301, USA.
     20  *
     21  */
     22 
     23 #ifndef RenderTextControlSingleLine_h
     24 #define RenderTextControlSingleLine_h
     25 
     26 #include "core/html/HTMLInputElement.h"
     27 #include "core/rendering/RenderTextControl.h"
     28 
     29 namespace WebCore {
     30 
     31 class HTMLInputElement;
     32 
     33 class RenderTextControlSingleLine : public RenderTextControl {
     34 public:
     35     RenderTextControlSingleLine(HTMLInputElement*);
     36     virtual ~RenderTextControlSingleLine();
     37     // FIXME: Move create*Style() to their classes.
     38     virtual PassRefPtr<RenderStyle> createInnerTextStyle(const RenderStyle* startStyle) const;
     39     PassRefPtr<RenderStyle> createInnerBlockStyle(const RenderStyle* startStyle) const;
     40 
     41     void capsLockStateMayHaveChanged();
     42 
     43 protected:
     44     virtual void centerContainerIfNeeded(RenderBox*) const { }
     45     virtual LayoutUnit computeLogicalHeightLimit() const;
     46     HTMLElement* containerElement() const;
     47     HTMLElement* innerBlockElement() const;
     48     HTMLInputElement* inputElement() const;
     49     virtual void updateFromElement() OVERRIDE;
     50 
     51 private:
     52     virtual bool hasControlClip() const;
     53     virtual LayoutRect controlClipRect(const LayoutPoint&) const;
     54     virtual bool isTextField() const { return true; }
     55 
     56     virtual void paint(PaintInfo&, const LayoutPoint&);
     57     virtual void layout();
     58 
     59     virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE;
     60 
     61     virtual void autoscroll(const IntPoint&);
     62 
     63     // Subclassed to forward to our inner div.
     64     virtual int scrollLeft() const;
     65     virtual int scrollTop() const;
     66     virtual int scrollWidth() const;
     67     virtual int scrollHeight() const;
     68     virtual void setScrollLeft(int);
     69     virtual void setScrollTop(int);
     70     virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1, Node** stopNode = 0);
     71     virtual bool logicalScroll(ScrollLogicalDirection, ScrollGranularity, float multiplier = 1, Node** stopNode = 0);
     72 
     73     int textBlockWidth() const;
     74     virtual float getAvgCharWidth(AtomicString family);
     75     virtual LayoutUnit preferredContentLogicalWidth(float charWidth) const;
     76     virtual LayoutUnit computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const OVERRIDE;
     77 
     78     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     79 
     80     virtual RenderStyle* textBaseStyle() const;
     81 
     82     bool textShouldBeTruncated() const;
     83 
     84     HTMLElement* innerSpinButtonElement() const;
     85 
     86     bool m_shouldDrawCapsLockIndicator;
     87     LayoutUnit m_desiredInnerTextLogicalHeight;
     88 };
     89 
     90 inline HTMLElement* RenderTextControlSingleLine::containerElement() const
     91 {
     92     return inputElement()->containerElement();
     93 }
     94 
     95 inline HTMLElement* RenderTextControlSingleLine::innerBlockElement() const
     96 {
     97     return inputElement()->innerBlockElement();
     98 }
     99 
    100 inline RenderTextControlSingleLine* toRenderTextControlSingleLine(RenderObject* object)
    101 {
    102     ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isTextField());
    103     return static_cast<RenderTextControlSingleLine*>(object);
    104 }
    105 
    106 // This will catch anyone doing an unnecessary cast.
    107 void toRenderTextControlSingleLine(const RenderTextControlSingleLine*);
    108 
    109 // ----------------------------
    110 
    111 class RenderTextControlInnerBlock : public RenderBlock {
    112 public:
    113     RenderTextControlInnerBlock(Element* element) : RenderBlock(element) { }
    114     virtual int inlineBlockBaseline(LineDirectionMode direction) const OVERRIDE { return lastLineBoxBaseline(direction); }
    115 
    116 private:
    117     virtual bool hasLineIfEmpty() const { return true; }
    118 };
    119 
    120 }
    121 
    122 #endif
    123