diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:30:52 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:30:52 -0800 |
commit | 8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2 (patch) | |
tree | 11425ea0b299d6fb89c6d3618a22d97d5bf68d0f /WebCore/html/HTMLAreaElement.cpp | |
parent | 648161bb0edfc3d43db63caed5cc5213bc6cb78f (diff) | |
download | external_webkit-8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2.zip external_webkit-8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2.tar.gz external_webkit-8e35f3cfc7fba1d1c829dc557ebad6409cbe16a2.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'WebCore/html/HTMLAreaElement.cpp')
-rw-r--r-- | WebCore/html/HTMLAreaElement.cpp | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/WebCore/html/HTMLAreaElement.cpp b/WebCore/html/HTMLAreaElement.cpp new file mode 100644 index 0000000..a865122 --- /dev/null +++ b/WebCore/html/HTMLAreaElement.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (C) 1999 Lars Knoll (knoll@kde.org) + * (C) 1999 Antti Koivisto (koivisto@kde.org) + * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. + * + * 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 "config.h" +#include "HTMLAreaElement.h" + +#include "Document.h" +#include "FloatRect.h" +#include "HTMLNames.h" +#include "HitTestResult.h" +#include "Length.h" +#include "RenderObject.h" + +using namespace std; + +namespace WebCore { + +using namespace HTMLNames; + +HTMLAreaElement::HTMLAreaElement(Document *doc) + : HTMLAnchorElement(areaTag, doc) + , m_coords(0) + , m_coordsLen(0) + , m_lastSize(-1, -1) + , m_shape(Unknown) +{ +} + +HTMLAreaElement::~HTMLAreaElement() +{ + delete [] m_coords; +} + +void HTMLAreaElement::parseMappedAttribute(MappedAttribute *attr) +{ + if (attr->name() == shapeAttr) { + if (equalIgnoringCase(attr->value(), "default")) + m_shape = Default; + else if (equalIgnoringCase(attr->value(), "circle")) + m_shape = Circle; + else if (equalIgnoringCase(attr->value(), "poly")) + m_shape = Poly; + else if (equalIgnoringCase(attr->value(), "rect")) + m_shape = Rect; + } else if (attr->name() == coordsAttr) { + delete [] m_coords; + m_coords = newCoordsArray(attr->value().string(), m_coordsLen); + } else if (attr->name() == altAttr || attr->name() == accesskeyAttr) { + // Do nothing. + } else + HTMLAnchorElement::parseMappedAttribute(attr); +} + +bool HTMLAreaElement::mapMouseEvent(int x, int y, const IntSize& size, HitTestResult& result) +{ + if (m_lastSize != size) { + region = getRegion(size); + m_lastSize = size; + } + + if (!region.contains(IntPoint(x, y))) + return false; + + result.setInnerNode(this); + result.setURLElement(this); + return true; +} + +IntRect HTMLAreaElement::getRect(RenderObject* obj) const +{ + int dx, dy; + obj->absolutePosition(dx, dy); + Path p = getRegion(m_lastSize); + p.translate(IntSize(dx, dy)); + return enclosingIntRect(p.boundingRect()); +} + +Path HTMLAreaElement::getRegion(const IntSize& size) const +{ + if (!m_coords && m_shape != Default) + return Path(); + + int width = size.width(); + int height = size.height(); + + // If element omits the shape attribute, select shape based on number of coordinates. + Shape shape = m_shape; + if (shape == Unknown) { + if (m_coordsLen == 3) + shape = Circle; + else if (m_coordsLen == 4) + shape = Rect; + else if (m_coordsLen >= 6) + shape = Poly; + } + + Path path; + switch (shape) { + case Poly: + if (m_coordsLen >= 6) { + int numPoints = m_coordsLen / 2; + path.moveTo(FloatPoint(m_coords[0].calcMinValue(width), m_coords[1].calcMinValue(height))); + for (int i = 1; i < numPoints; ++i) + path.addLineTo(FloatPoint(m_coords[i * 2].calcMinValue(width), m_coords[i * 2 + 1].calcMinValue(height))); + path.closeSubpath(); + } + break; + case Circle: + if (m_coordsLen >= 3) { + Length radius = m_coords[2]; + int r = min(radius.calcMinValue(width), radius.calcMinValue(height)); + path.addEllipse(FloatRect(m_coords[0].calcMinValue(width) - r, m_coords[1].calcMinValue(height) - r, 2 * r, 2 * r)); + } + break; + case Rect: + if (m_coordsLen >= 4) { + int x0 = m_coords[0].calcMinValue(width); + int y0 = m_coords[1].calcMinValue(height); + int x1 = m_coords[2].calcMinValue(width); + int y1 = m_coords[3].calcMinValue(height); + path.addRect(FloatRect(x0, y0, x1 - x0, y1 - y0)); + } + break; + case Default: + path.addRect(FloatRect(0, 0, width, height)); + break; + case Unknown: + break; + } + + return path; +} + +String HTMLAreaElement::accessKey() const +{ + return getAttribute(accesskeyAttr); +} + +void HTMLAreaElement::setAccessKey(const String& value) +{ + setAttribute(accesskeyAttr, value); +} + +String HTMLAreaElement::alt() const +{ + return getAttribute(altAttr); +} + +void HTMLAreaElement::setAlt(const String& value) +{ + setAttribute(altAttr, value); +} + +String HTMLAreaElement::coords() const +{ + return getAttribute(coordsAttr); +} + +void HTMLAreaElement::setCoords(const String& value) +{ + setAttribute(coordsAttr, value); +} + +KURL HTMLAreaElement::href() const +{ + return document()->completeURL(getAttribute(hrefAttr)); +} + +void HTMLAreaElement::setHref(const String& value) +{ + setAttribute(hrefAttr, value); +} + +bool HTMLAreaElement::noHref() const +{ + return !getAttribute(nohrefAttr).isNull(); +} + +void HTMLAreaElement::setNoHref(bool noHref) +{ + setAttribute(nohrefAttr, noHref ? "" : 0); +} + +String HTMLAreaElement::shape() const +{ + return getAttribute(shapeAttr); +} + +void HTMLAreaElement::setShape(const String& value) +{ + setAttribute(shapeAttr, value); +} + +bool HTMLAreaElement::isFocusable() const +{ + return HTMLElement::isFocusable(); +} + +String HTMLAreaElement::target() const +{ + return getAttribute(targetAttr); +} + +void HTMLAreaElement::setTarget(const String& value) +{ + setAttribute(targetAttr, value); +} + +} |