
org.gwt.advanced.client.datamodel.ComboBoxDataModel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of advanced-gwt Show documentation
Show all versions of advanced-gwt Show documentation
The set of useful GWT components
/*
* Copyright 2008-2012 Sergey Skladchikov
*
* 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 org.gwt.advanced.client.datamodel;
import com.google.gwt.core.client.GWT;
import java.util.*;
/**
* This is an implementation of the data model interface for the ComboBox widget.
*
* @author Sergey Skladchikov
* @since 1.2.0
*/
public class ComboBoxDataModel implements ListDataModel {
/** a list of item IDs where each item is instance of String
*/
private List itemIds = new ArrayList();
/** a map of items where each item is pair of String
ID and Object
value */
private Map items = new HashMap();
/** a selected item ID */
private String selectedId;
/** {@link org.gwt.advanced.client.datamodel.ListModelListener}s */
private List listeners = new ArrayList();
/** {@inheritDoc} */
public void add(String id, Object item) {
addInternally(id, item);
fireEvent(new ListModelEvent(this, id, getItemIds().indexOf(id), ListModelEvent.ADD_ITEM));
}
/** {@inheritDoc} */
public void add(int index, String id, Object item) {
List ids = getItemIds();
index = getValidIndex(index);
if (!ids.contains(id))
ids.add(index, id);
add(id, item);
}
/** {@inheritDoc} */
@Override
public void add(Map items) {
if (items == null) {
return;
}
Map itemIndexes = new LinkedHashMap();
for (Map.Entry entry : items.entrySet()) {
addInternally(entry.getKey(), entry.getValue());
itemIndexes.put(entry.getKey(), getItemIds().indexOf(entry.getKey()));
}
fireEvent(new ListModelEvent(this, itemIndexes, ListModelEvent.ADD_ITEM));
}
/** {@inheritDoc} */
public Object get(String id) {
return getItems().get(id);
}
/** {@inheritDoc} */
public Object get(int index) {
if (isIndexValid(index))
return get(getItemIds().get(index));
else
return null;
}
/** {@inheritDoc} */
public void remove(String... ids) {
Map itemIndexes = new LinkedHashMap();
for (String id : ids) {
int index = removeInternally(id);
itemIndexes.put(id, index);
}
fireEvent(new ListModelEvent(this, itemIndexes, ListModelEvent.REMOVE_ITEM));
}
/** {@inheritDoc} */
public void remove(int... indexes) {
Map itemIndexes = new LinkedHashMap();
for (int index : indexes) {
if (isIndexValid(index)) {
String id = getItemIds().get(index);
removeInternally(id);
itemIndexes.put(id, index);
}
}
fireEvent(new ListModelEvent(this, itemIndexes, ListModelEvent.REMOVE_ITEM));
}
/** {@inheritDoc} */
public String getSelectedId() {
return selectedId;
}
/** {@inheritDoc} */
public int getSelectedIndex() {
return getItemIds().indexOf(getSelectedId());
}
/** {@inheritDoc} */
public Object getSelected() {
return getItems().get(getSelectedId());
}
/** {@inheritDoc} */
public void setSelectedId(String id) {
this.selectedId = id;
fireEvent(new ListModelEvent(this, id, getSelectedIndex(), ListModelEvent.SELECT_ITEM));
}
/** {@inheritDoc} */
public void setSelectedIndex(int index) {
if (index < 0) {
selectedId = null;
return;
}
List ids = getItemIds();
if (ids.size() > 0)
setSelectedId(ids.get(index));
}
/** {@inheritDoc} */
public void clear() {
getItemIds().clear();
fireEvent(new ListModelEvent(this, ListModelEvent.CLEAN));
}
/** {@inheritDoc} */
public boolean isEmpty() {
return getItemIds().isEmpty();
}
/** {@inheritDoc} */
public int getCount() {
return getItemIds().size();
}
/**
* This method registers a list data model listener.
*
* @param listener is a listener to be invoked on any event.
*/
@Override
public void addListModelListener(ListModelListener listener) {
removeListModelListener(listener);
listeners.add(listener);
}
/**
* This method unregisters the specified listener.
*
* @param listener is a listener to be unregistered.
*/
@Override
public void removeListModelListener(ListModelListener listener) {
listeners.remove(listener);
}
/**
* This method fires the specified event and invokes the listeners.
*
* @param event is an event to fire.
*/
protected void fireEvent(ListModelEvent event) {
for (ListModelListener listener : listeners) {
try {
listener.onModelEvent(event);
} catch (Throwable t) {
GWT.log("Unknown listener error", t);
}
}
}
/**
* Adds a new item into the list without firing an event.
*
* @param id is an item ID to add.
* @param item is an item itself.
*/
protected void addInternally(String id, Object item) {
List ids = getItemIds();
if (!ids.contains(id))
ids.add(id);
getItems().put(id, item);
}
/**
* This method removes one item without sending any event.
*
* @param id is an ID of the item to remove.
* @return an index of the item that was removed.
*/
protected int removeInternally(String id) {
int index = getItemIds().indexOf(id);
getItemIds().remove(id);
getItems().remove(id);
return index;
}
/**
* Getter for property 'itemIds'.
*
* @return Value for property 'itemIds'.
*/
protected List getItemIds() {
return itemIds;
}
/**
* Getter for property 'items'.
*
* @return Value for property 'items'.
*/
protected Map getItems() {
return items;
}
/**
* This method checks whether the specified index is valid.
*
* @param index is an index value to check.
* @return true
if the index is valid.
*/
protected boolean isIndexValid(int index) {
return getItemIds().size() > index && index >= 0;
}
/**
* This method calculates a valid index value taking into account the following rule:
* if the index < 0, it returns 0;
* if the index > then {@link #getItemIds()} size, it returns {@link #getItemIds()} size.
*
* @param invalidIndex is an index.
* @return a valid index value.
*/
protected int getValidIndex(int invalidIndex) {
List ids = getItemIds();
if (invalidIndex < 0)
invalidIndex = 0;
if (invalidIndex > ids.size())
invalidIndex = ids.size();
return invalidIndex;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy