Home | History | Annotate | Download | only in rendering
      1 /**
      2  * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
      3  *           (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Library General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Library General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Library General Public License
     16  * along with this library; see the file COPYING.LIB.  If not, write to
     17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18  * Boston, MA 02110-1301, USA.
     19  *
     20  */
     21 
     22 #include "config.h"
     23 #include "core/rendering/RenderTextControlMultiLine.h"
     24 
     25 #include "core/html/HTMLTextAreaElement.h"
     26 #include "core/rendering/HitTestResult.h"
     27 
     28 namespace blink {
     29 
     30 RenderTextControlMultiLine::RenderTextControlMultiLine(HTMLTextAreaElement* element)
     31     : RenderTextControl(element)
     32 {
     33     ASSERT(element);
     34 }
     35 
     36 RenderTextControlMultiLine::~RenderTextControlMultiLine()
     37 {
     38 }
     39 
     40 bool RenderTextControlMultiLine::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
     41 {
     42     if (!RenderTextControl::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, hitTestAction))
     43         return false;
     44 
     45     if (result.innerNode() == node() || result.innerNode() == innerEditorElement())
     46         hitInnerEditorElement(result, locationInContainer.point(), accumulatedOffset);
     47 
     48     return true;
     49 }
     50 
     51 float RenderTextControlMultiLine::getAvgCharWidth(AtomicString family)
     52 {
     53     // Since Lucida Grande is the default font, we want this to match the width
     54     // of Courier New, the default font for textareas in IE, Firefox and Safari Win.
     55     // 1229 is the avgCharWidth value in the OS/2 table for Courier New.
     56     if (family == "Lucida Grande")
     57         return scaleEmToUnits(1229);
     58 
     59     return RenderTextControl::getAvgCharWidth(family);
     60 }
     61 
     62 LayoutUnit RenderTextControlMultiLine::preferredContentLogicalWidth(float charWidth) const
     63 {
     64     int factor = toHTMLTextAreaElement(node())->cols();
     65     return static_cast<LayoutUnit>(ceilf(charWidth * factor)) + scrollbarThickness();
     66 }
     67 
     68 LayoutUnit RenderTextControlMultiLine::computeControlLogicalHeight(LayoutUnit lineHeight, LayoutUnit nonContentHeight) const
     69 {
     70     return lineHeight * toHTMLTextAreaElement(node())->rows() + nonContentHeight;
     71 }
     72 
     73 int RenderTextControlMultiLine::baselinePosition(FontBaseline baselineType, bool firstLine, LineDirectionMode direction, LinePositionMode linePositionMode) const
     74 {
     75     return RenderBox::baselinePosition(baselineType, firstLine, direction, linePositionMode);
     76 }
     77 
     78 PassRefPtr<RenderStyle> RenderTextControlMultiLine::createInnerEditorStyle(const RenderStyle* startStyle) const
     79 {
     80     RefPtr<RenderStyle> textBlockStyle = RenderStyle::create();
     81     textBlockStyle->inheritFrom(startStyle);
     82     adjustInnerEditorStyle(textBlockStyle.get());
     83     textBlockStyle->setDisplay(BLOCK);
     84     textBlockStyle->setUnique();
     85 
     86     return textBlockStyle.release();
     87 }
     88 
     89 RenderObject* RenderTextControlMultiLine::layoutSpecialExcludedChild(bool relayoutChildren, SubtreeLayoutScope& layoutScope)
     90 {
     91     RenderObject* placeholderRenderer = RenderTextControl::layoutSpecialExcludedChild(relayoutChildren, layoutScope);
     92     if (!placeholderRenderer)
     93         return 0;
     94     if (!placeholderRenderer->isBox())
     95         return placeholderRenderer;
     96     RenderBox* placeholderBox = toRenderBox(placeholderRenderer);
     97     placeholderBox->style()->setLogicalWidth(Length(contentLogicalWidth() - placeholderBox->borderAndPaddingLogicalWidth(), Fixed));
     98     placeholderBox->layoutIfNeeded();
     99     placeholderBox->setX(borderLeft() + paddingLeft());
    100     placeholderBox->setY(borderTop() + paddingTop());
    101     return placeholderRenderer;
    102 }
    103 
    104 }
    105