blob: 38bf0e9472f9fee0eccc8125e0efd6c7c6280095 [file] [log] [blame]
/**
* Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
* (C) 2008 Torch Mobile Inc. All rights reserved.
* (http://www.torchmobile.com/)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#include "core/layout/LayoutTextControlMultiLine.h"
#include "core/html/HTMLTextAreaElement.h"
#include "core/layout/HitTestResult.h"
#include "core/layout/LayoutTheme.h"
namespace blink {
LayoutTextControlMultiLine::LayoutTextControlMultiLine(
HTMLTextAreaElement* element)
: LayoutTextControl(element) {
ASSERT(element);
}
LayoutTextControlMultiLine::~LayoutTextControlMultiLine() {}
bool LayoutTextControlMultiLine::nodeAtPoint(
HitTestResult& result,
const HitTestLocation& locationInContainer,
const LayoutPoint& accumulatedOffset,
HitTestAction hitTestAction) {
if (!LayoutTextControl::nodeAtPoint(result, locationInContainer,
accumulatedOffset, hitTestAction))
return false;
if (result.innerNode() == node() ||
result.innerNode() == innerEditorElement())
hitInnerEditorElement(result, locationInContainer.point(),
accumulatedOffset);
return true;
}
float LayoutTextControlMultiLine::getAvgCharWidth(
const AtomicString& family) const {
// Match the default system font to the width of MS Shell Dlg, the default
// font for textareas in Firefox, Safari Win and IE for some encodings (in
// IE, the default font is encoding specific). 1229 is the avgCharWidth
// value in the OS/2 table for Courier New.
if (LayoutTheme::theme().needsHackForTextControlWithFontFamily(family))
return scaleEmToUnits(1229);
return LayoutTextControl::getAvgCharWidth(family);
}
LayoutUnit LayoutTextControlMultiLine::preferredContentLogicalWidth(
float charWidth) const {
int factor = toHTMLTextAreaElement(node())->cols();
return static_cast<LayoutUnit>(ceilf(charWidth * factor)) +
scrollbarThickness();
}
LayoutUnit LayoutTextControlMultiLine::computeControlLogicalHeight(
LayoutUnit lineHeight,
LayoutUnit nonContentHeight) const {
return lineHeight * toHTMLTextAreaElement(node())->rows() + nonContentHeight;
}
int LayoutTextControlMultiLine::baselinePosition(
FontBaseline baselineType,
bool firstLine,
LineDirectionMode direction,
LinePositionMode linePositionMode) const {
return LayoutBox::baselinePosition(baselineType, firstLine, direction,
linePositionMode);
}
PassRefPtr<ComputedStyle> LayoutTextControlMultiLine::createInnerEditorStyle(
const ComputedStyle& startStyle) const {
RefPtr<ComputedStyle> textBlockStyle = ComputedStyle::create();
textBlockStyle->inheritFrom(startStyle);
adjustInnerEditorStyle(*textBlockStyle);
textBlockStyle->setDisplay(EDisplay::Block);
textBlockStyle->setUnique(true);
return textBlockStyle.release();
}
LayoutObject* LayoutTextControlMultiLine::layoutSpecialExcludedChild(
bool relayoutChildren,
SubtreeLayoutScope& layoutScope) {
LayoutObject* placeholderLayoutObject =
LayoutTextControl::layoutSpecialExcludedChild(relayoutChildren,
layoutScope);
if (!placeholderLayoutObject)
return nullptr;
if (!placeholderLayoutObject->isBox())
return placeholderLayoutObject;
LayoutBox* placeholderBox = toLayoutBox(placeholderLayoutObject);
placeholderBox->mutableStyleRef().setLogicalWidth(Length(
contentLogicalWidth() - placeholderBox->borderAndPaddingLogicalWidth(),
Fixed));
placeholderBox->layoutIfNeeded();
placeholderBox->setX(borderLeft() + paddingLeft());
placeholderBox->setY(borderTop() + paddingTop());
return placeholderLayoutObject;
}
} // namespace blink