blob: f0fba8e455dbc53487e3bcbc221625354588f8fb [file] [log] [blame]
/*
* Copyright 2008 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.user.client.impl;
import com.google.gwt.dom.client.Element;
import com.google.gwt.user.client.ui.UIObject;
import java.util.ArrayList;
import java.util.Iterator;
/**
* Creates a mapping from elements to their associated ui objects.
*
* @param <T> the type that the element is mapped to
*/
public class ElementMapperImpl<T extends UIObject> {
private static class FreeNode {
int index;
ElementMapperImpl.FreeNode next;
public FreeNode(int index, ElementMapperImpl.FreeNode next) {
this.index = index;
this.next = next;
}
}
private static native void clearIndex(Element elem) /*-{
elem["__uiObjectID"] = null;
}-*/;
private static native int getIndex(Element elem) /*-{
var index = elem["__uiObjectID"];
return (index == null) ? -1 : index;
}-*/;
private static native void setIndex(Element elem, int index) /*-{
elem["__uiObjectID"] = index;
}-*/;
private ElementMapperImpl.FreeNode freeList = null;
private final ArrayList<T> uiObjectList = new ArrayList<T>();
/**
* Returns the uiObject associated with the given element.
*
* @param elem uiObject's element
* @return the uiObject
*/
public T get(Element elem) {
int index = getIndex(elem);
if (index < 0) {
return null;
}
return uiObjectList.get(index);
}
/**
* Gets the list of ui objects contained in this element mapper.
*
* @return the list of ui objects
*/
public ArrayList<T> getObjectList() {
return uiObjectList;
}
/**
* Creates an iterator from the ui objects stored within.
*
* @return an iterator of the ui objects indexed by this element mapper.
*/
public Iterator<T> iterator() {
return uiObjectList.iterator();
}
/**
* Adds the MappedType.
*
* @param uiObject uiObject to add
*/
public void put(T uiObject) {
int index;
if (freeList == null) {
index = uiObjectList.size();
uiObjectList.add(uiObject);
} else {
index = freeList.index;
uiObjectList.set(index, uiObject);
freeList = freeList.next;
}
setIndex(uiObject.getElement(), index);
}
/**
* Remove the uiObject associated with the given element.
*
* @param elem the uiObject's element
*/
public void removeByElement(Element elem) {
int index = getIndex(elem);
removeImpl(elem, index);
}
private void removeImpl(Element elem, int index) {
clearIndex(elem);
uiObjectList.set(index, null);
freeList = new FreeNode(index, freeList);
}
}