/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.wicket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponentPanel;
import org.apache.wicket.markup.html.form.ListMultipleChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
/**
* Form component to edit a List<String> that makes up the keywords field of
* various catalog objects.
*/
@SuppressWarnings("serial")
public class KeywordsEditor extends FormComponentPanel {
ListMultipleChoice choices;
TextField newKeyword;
/**
* Creates a new keywords editor.
* @param id
* @param keywords The module should return a non null collection of strings.
*/
public KeywordsEditor(String id, final IModel keywords) {
super(id, keywords);
choices = new ListMultipleChoice("keywords", new Model(), new ArrayList((List) keywords.getObject()));
choices.setOutputMarkupId(true);
add(choices);
add(removeKeywordsButton());
newKeyword = new TextField("newKeyword", new Model());
newKeyword.setOutputMarkupId(true);
add(newKeyword);
add(addKeywordsButton());
}
private AjaxButton addKeywordsButton() {
AjaxButton button = new AjaxButton("addKeyword") {
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
List choiceList = choices.getChoices();
choiceList.add(newKeyword.getInput());
choices.setChoices(choiceList);
newKeyword.setModelObject(null);
newKeyword.modelChanged();
target.addComponent(newKeyword);
target.addComponent(choices);
}
};
button.setDefaultFormProcessing(false);
return button;
}
private AjaxButton removeKeywordsButton() {
AjaxButton button = new AjaxButton("removeKeywords") {
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
List selection = (List) choices.getModelObject();
List keywords = choices.getChoices();
for (Iterator it = selection.iterator(); it.hasNext();) {
String selected = (String) it.next();
keywords.remove(selected);
}
choices.setChoices(keywords);
choices.modelChanged();
target.addComponent(choices);
}
};
// button.setDefaultFormProcessing(false);
return button;
}
@Override
protected void onBeforeRender() {
super.onBeforeRender();
updateFields();
}
private void updateFields() {
choices.setChoices(getModel());
}
@Override
protected void convertInput() {
setConvertedInput(choices.getChoices());
}
}