blob: 12e156414b95b0dc631b675026ee9741de539ac0 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed 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.
*/
package com.google.gwt.dom.client;
/**
* IE9 based implementation of {@link com.google.gwt.dom.client.DOMImplStandardBase}.
*/
class DOMImplIE9 extends DOMImplStandardBase {
@Override
public int getAbsoluteLeft(Element elem) {
double left = getBoundingClientRectLeft(elem) + getDocumentScrollLeftImpl();
if (isRTL(elem)) { // in RTL, account for the scroll bar shift if present
left += getParentOffsetDelta(elem);
}
return toInt32(left);
}
@Override
public int getAbsoluteTop(Element elem) {
return toInt32(getBoundingClientRectTop(elem) + getDocumentScrollTopImpl());
}
/**
* Coerce numeric values a string. In IE, some values can be stored as numeric
* types.
*/
@Override
public native String getNumericStyleProperty(Style style, String name) /*-{
return typeof(style[name]) == "number" ? "" + style[name] : style[name];
}-*/;
@Override
public int getScrollLeft(Document doc) {
return toInt32(getDocumentScrollLeftImpl());
}
@Override
public int getScrollLeft(Element elem) {
int left = toInt32(getScrollLeftImpl(elem));
if (isRTL(elem)) {
left = -left;
}
return left;
}
@Override
public int getScrollTop(Document doc) {
return toInt32(getDocumentScrollTopImpl());
}
@Override
public native int getTabIndex(Element elem) /*-{
return elem.tabIndex < 65535 ? elem.tabIndex : -(elem.tabIndex % 65535) - 1;
}-*/;
@Override
public boolean isOrHasChild(Node parent, Node child) {
// IE9 still behaves like IE8 for this method
return DOMImplTrident.isOrHasChildImpl(parent, child);
}
@Override
public native void selectRemoveOption(SelectElement select, int index) /*-{
try {
// IE9 throws if elem at index is an optgroup
select.remove(index);
} catch(e) {
select.removeChild(select.childNodes[index]);
}
}-*/;
@Override
public void setScrollLeft(Element elem, int left) {
if (isRTL(elem)) {
left = -left;
}
setScrollLeftImpl(elem, left);
}
private native double getBoundingClientRectLeft(Element elem) /*-{
// getBoundingClientRect() throws a JS exception if the elem is not attached
// to the document, so we wrap it in a try/catch block
try {
return elem.getBoundingClientRect().left;
} catch (e) {
// if not attached return 0
return 0;
}
}-*/;
private native double getBoundingClientRectTop(Element elem) /*-{
// getBoundingClientRect() throws a JS exception if the elem is not attached
// to the document, so we wrap it in a try/catch block
try {
return elem.getBoundingClientRect().top;
} catch (e) {
// if not attached return 0
return 0;
}
}-*/;
private native double getDocumentScrollLeftImpl() /*-{
return $wnd.pageXOffset;
}-*/;
private native double getDocumentScrollTopImpl() /*-{
return $wnd.pageYOffset;
}-*/;
private native double getParentOffsetDelta(Element elem) /*-{
var offsetParent = elem.offsetParent;
if (offsetParent) {
return offsetParent.offsetWidth - offsetParent.clientWidth;
}
return 0;
}-*/;
private native double getScrollLeftImpl(Element elem) /*-{
return elem.scrollLeft || 0;
}-*/;
private native void setScrollLeftImpl(Element elem, int left) /*-{
elem.scrollLeft = left;
}-*/;
}