/* | |
* 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.user.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); | |
} | |
} |