All pastes #327901 Raw Copy code Copy link Edit

Miscellany

public unlisted java v1 · immutable
#327901 ·published 2007-01-25 11:03 UTC
rendered paste body
package com.sas.jobindsats.ui.palette.component;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.Iterator;import java.util.List;import wicket.Component;import wicket.markup.html.form.HiddenField;import wicket.markup.html.form.IChoiceRenderer;import wicket.model.AbstractModel;import wicket.util.string.Strings;import com.sas.jobindsats.ui.palette.Palette;/** * Component to keep track of selections on the html side. Also used for * encoding and decoding those selections between html and java. *  * @author Igor Vaynberg ( ivaynberg ) */public class Recorder extends HiddenField {	private static final long serialVersionUID = 1L;	private static final String[] EMPTY_IDS = new String[0];	private final String seperator = "#";	/** conviniently maintained array of selected ids */	private String[] ids;	/** parent palette object */	private Palette palette;	/**	 * @return parent Palette object	 */	public Palette getPalette() {		return palette;	}	/**	 * @param id	 *            component id	 * @param palette	 *            parent palette object	 */	public Recorder(String id, Palette palette) {		super(id);		this.palette = palette;		// BELOW ENSURES THAT IDS ARE NOT NULL		reCreateModel();		AbstractModel model = new AbstractModel() {			public Object getObject(Component component) {				StringBuffer modelStringBuffer = new StringBuffer();				for (int i = 0; ids.length > i; i++) {					modelStringBuffer.append(ids[i]);					if (i + 1 < ids.length) {						modelStringBuffer.append(seperator);					}				}				// set model and update ids array				String modelString = modelStringBuffer.toString();				return modelString;			}			public void setObject(Component component, Object object) {				updateIds((String) object);			};		};		setModel(model);	}	protected void onValid() {		super.onValid();		updateIds();	}	/**	 * @return iterator over selected choices	 */	public Iterator getSelectedChoices() {		IChoiceRenderer renderer = getPalette().getChoiceRenderer();		if (ids.length == 0) {			return Collections.EMPTY_LIST.iterator();		}		List selected = new ArrayList(ids.length);		for (int i = 0; i < ids.length; i++) {			Iterator it = getPalette().getChoices().iterator();			while (it.hasNext()) {				final Object choice = it.next();				if (renderer.getIdValue(choice, 0).equals(ids[i])) {					selected.add(choice);					break;				}			}		}		return selected.iterator();	}	/**	 * @return iterator over unselected choices	 */	public Iterator getUnselectedChoices() {		IChoiceRenderer renderer = getPalette().getChoiceRenderer();		Collection choices = getPalette().getChoices();		if (choices.size() - ids.length == 0) {			return Collections.EMPTY_LIST.iterator();		}		List unselected = new ArrayList(Math				.max(1, choices.size() - ids.length));		Iterator it = choices.iterator();		while (it.hasNext()) {			final Object choice = it.next();			final String choiceId = renderer.getIdValue(choice, 0);			boolean selected = false;			for (int i = 0; i < ids.length; i++) {				if (ids[i].equals(choiceId)) {					selected = true;					break;				}			}			if (!selected) {				unselected.add(choice);			}		}		return unselected.iterator();	}	protected void onInvalid() {		super.onInvalid();		updateIds();	}	private void updateIds() {		updateIds(getValue());	}	public void updateIds(String value) {		if (Strings.isEmpty(value)) {			ids = EMPTY_IDS;		} else {			ids = value.split(seperator);		}	}	public void reCreateModel() {		// construct the model string based on selection collection		IChoiceRenderer renderer = getPalette().getChoiceRenderer();		StringBuffer modelStringBuffer = new StringBuffer();		Iterator selection = ((Collection) getPalette().getModelObject())				.iterator();		while (selection.hasNext()) {			modelStringBuffer.append(renderer.getIdValue(selection.next(), 0));			if (selection.hasNext()) {				modelStringBuffer.append(seperator);			}		}		// Get values from modelstringbuffer		String modelString = modelStringBuffer.toString();		// Only add if not already added		String[] local = getValue().split(seperator);		for (int i = 0; local.length > i; i++) {			if (modelString.indexOf(local[i]) == -1) {				modelString += seperator + local[i];			}		}		updateIds(modelString);	}}