/**
*
*/
package org.appfuse.webapp.client.ui.users.editUser;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.appfuse.webapp.client.proxies.RoleProxy;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.CheckboxCell;
import com.google.gwt.cell.client.CompositeCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.HasCell;
import com.google.gwt.dom.client.Element;
import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.IsEditor;
import com.google.gwt.editor.client.LeafValueEditor;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.cellview.client.CellList;
import com.google.gwt.user.client.ui.CheckBox;
/**
* @author ivangsa
*
*/
public class RolesListBox extends CellList<RoleProxy> implements Editor<Set<RoleProxy>>, IsEditor<LeafValueEditor<Set<RoleProxy>>>, LeafValueEditor<Set<RoleProxy>> {
private final RoleCheckboxCell roleCheckboxCell;
public RolesListBox() {
this(new RoleCheckboxCell());
setSelectionModel(null);
}
private RolesListBox(RoleCheckboxCell roleCheckboxCell) {
super(new RoleCell(Arrays.asList(roleCheckboxCell, new RoleNameCell())));
this.roleCheckboxCell = roleCheckboxCell;
}
@Override
public LeafValueEditor<Set<RoleProxy>> asEditor() {
return this;
}
@Override
public void setValue(Set<RoleProxy> value) {
roleCheckboxCell.setRolesSet(value);
this.redraw();
}
@Override
public Set<RoleProxy> getValue() {
return roleCheckboxCell.getRolesSet();
}
public void setReadonly(boolean readonly) {
roleCheckboxCell.setReadonly(readonly);
}
}
class RoleCell extends CompositeCell<RoleProxy> {
public RoleCell(List<HasCell<RoleProxy, ?>> hasCells) {
super(hasCells);
}
@Override
public void render(Context context, RoleProxy value, SafeHtmlBuilder sb) {
sb.appendHtmlConstant("<table><tbody><tr>");
super.render(context, value, sb);
sb.appendHtmlConstant("</tr></tbody></table>");
}
@Override
protected Element getContainerElement(Element parent) {
// Return the first TR element in the table.
return parent.getFirstChildElement().getFirstChildElement().getFirstChildElement();
}
@Override
protected <X> void render(Context context, RoleProxy value, SafeHtmlBuilder sb, HasCell<RoleProxy, X> hasCell) {
Cell<X> cell = hasCell.getCell();
sb.appendHtmlConstant("<td>");
cell.render(context, hasCell.getValue(value), sb);
sb.appendHtmlConstant("</td>");
}
}
class RoleCheckboxCell implements HasCell<RoleProxy, Boolean> {
private boolean readonly = false;
private final Set<RoleProxy> rolesSet = new HashSet<RoleProxy>();
private final CheckboxCell cell = new CheckboxCell(true, true);
private final AbstractCell<Boolean> readonlyCell = new AbstractCell<Boolean>() {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, Boolean value, SafeHtmlBuilder sb) {
CheckBox checkBox = new CheckBox();
checkBox.setValue(value);
checkBox.setEnabled(false);
sb.append(SafeHtmlUtils.fromTrustedString(checkBox.toString()));
}
};
public Cell<Boolean> getCell() {
if (readonly) {
return readonlyCell;
} else {
return cell;
}
}
public FieldUpdater<RoleProxy, Boolean> getFieldUpdater() {
if (readonly) {
return null;
} else {
return new FieldUpdater<RoleProxy, Boolean>() {
@Override
public void update(int index, RoleProxy role, Boolean checked) {
if (checked) {
rolesSet.add(role);
} else {
remove(role);
}
}
};
}
}
public void setReadonly(boolean readonly) {
this.readonly = readonly;
}
public Boolean getValue(RoleProxy role) {
return contains(role);
}
public Set<RoleProxy> getRolesSet() {
return rolesSet;
}
public void setRolesSet(Set<RoleProxy> rolesSet) {
this.rolesSet.clear();
if (rolesSet != null) {
this.rolesSet.addAll(rolesSet);
}
}
private void remove(RoleProxy role) {
for (RoleProxy roleProxy : rolesSet) {
if (roleProxy.getId().equals(role.getId())) {
rolesSet.remove(roleProxy);
return;
}
}
}
private boolean contains(RoleProxy role) {
for (RoleProxy roleProxy : rolesSet) {
if (roleProxy.getId().equals(role.getId())) {
return true;
}
}
return false;
}
}
class RoleNameCell implements HasCell<RoleProxy, RoleProxy> {
private Cell<RoleProxy> roleNameCell = new AbstractCell<RoleProxy>() {
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, RoleProxy value, SafeHtmlBuilder sb) {
sb.append(SafeHtmlUtils.fromString(value.getName()));
}
};
public Cell<RoleProxy> getCell() {
return roleNameCell;
}
public FieldUpdater<RoleProxy, RoleProxy> getFieldUpdater() {
return null;
}
public RoleProxy getValue(RoleProxy object) {
return object;
}
}