| |
| #--------------------------------------------------------------------------------- |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| #--------------------------------------------------------------------------------- |
| |
| canvasAvailable = null |
| highlighterClass = null |
| currentHighlighterElement = null |
| |
| #------------------------------------------------------------------------------- |
| module.exports = class ElementHighlighter |
| |
| #--------------------------------------------------------------------------- |
| @create: -> |
| highlighterClass ?= require('./ElementHighlighterDivs2') |
| |
| new highlighterClass() |
| |
| #--------------------------------------------------------------------------- |
| constructor: -> |
| @hElement = @createHighlighterElement() |
| @hElement.__weinreHighlighter = true |
| @hElement.style.display = "none" |
| @hElement.style.zIndex = 10 * 1000 * 1000 |
| |
| if currentHighlighterElement |
| document.body.removeChild currentHighlighterElement |
| |
| currentHighlighterElement = @hElement |
| |
| document.body.appendChild @hElement |
| |
| #--------------------------------------------------------------------------- |
| on: (element) -> |
| return if null == element |
| return unless element.nodeType == Node.ELEMENT_NODE |
| |
| @redraw getMetricsForElement(element) |
| |
| @hElement.style.display = "block" |
| |
| #--------------------------------------------------------------------------- |
| off: -> |
| @hElement.style.display = "none" |
| |
| #------------------------------------------------------------------------------- |
| getMetricsForElement = (element) -> |
| metrics = {} |
| |
| left = 0 |
| top = 0 |
| el = element |
| |
| loop |
| left += el.offsetLeft |
| top += el.offsetTop |
| break unless el = el.offsetParent |
| |
| metrics.x = left |
| metrics.y = top |
| |
| cStyle = document.defaultView.getComputedStyle(element) |
| |
| metrics.width = element.offsetWidth |
| metrics.height = element.offsetHeight |
| metrics.marginLeft = fromPx(cStyle["margin-left"]) |
| metrics.marginRight = fromPx(cStyle["margin-right"]) |
| metrics.marginTop = fromPx(cStyle["margin-top"]) |
| metrics.marginBottom = fromPx(cStyle["margin-bottom"]) |
| metrics.borderLeft = fromPx(cStyle["border-left-width"]) |
| metrics.borderRight = fromPx(cStyle["border-right-width"]) |
| metrics.borderTop = fromPx(cStyle["border-top-width"]) |
| metrics.borderBottom = fromPx(cStyle["border-bottom-width"]) |
| metrics.paddingLeft = fromPx(cStyle["padding-left"]) |
| metrics.paddingRight = fromPx(cStyle["padding-right"]) |
| metrics.paddingTop = fromPx(cStyle["padding-top"]) |
| metrics.paddingBottom = fromPx(cStyle["padding-bottom"]) |
| |
| metrics.x -= metrics.marginLeft |
| metrics.y -= metrics.marginTop |
| |
| metrics |
| |
| #------------------------------------------------------------------------------- |
| fromPx = (string) -> |
| parseInt string.replace(/px$/, "") |
| |
| #------------------------------------------------------------------------------- |
| supportsCanvas = () -> |
| element = document.createElement('canvas') |
| return false unless element.getContext |
| return true if element.getContext('2d') |
| return false |
| |
| #------------------------------------------------------------------------------- |
| require("../common/MethodNamer").setNamesForClass(module.exports) |