/*
* #!
* Ontopoly Editor
* #-
* Copyright (C) 2001 - 2013 The Ontopia Project
* #-
* 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 ontopoly.components;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import ontopoly.model.Topic;
import ontopoly.models.RoleFieldModel;
import ontopoly.models.TopicModel;
import ontopoly.utils.TopicComparator;
import org.apache.wicket.Response;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AbstractAutoCompleteRenderer;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;
public abstract class AssociationFieldAutoCompleteTextField extends Panel {
static final TopicConverter TOPIC_CONVERTER = new TopicConverter();
static final class TopicConverter implements IConverter {
public Object convertToObject(String value, Locale locale) {
if (value != null) {
String[] split = value.split("::");
String topicMapId = split[0];
String topicId = split[1];
return new TopicModel<Topic>(topicMapId, topicId).getTopic();
} else {
return null;
}
}
public String convertToString(Object value, Locale locale) {
return convertToString(value);
}
public String convertToString(Object value) {
Topic topic = (Topic)value;
return topic.getTopicMap().getId() + "::" + topic.getId();
}
}
protected AutoCompleteTextField<Topic> textField;
public AssociationFieldAutoCompleteTextField(String id, IModel<Topic> model, final RoleFieldModel valueFieldModel) {
super(id);
AutoCompleteSettings opts = new AutoCompleteSettings();
opts.setCssClassName("ontopoly-autocompleter");
opts.setAdjustInputWidth(false);
opts.setPreselect(true);
this.textField = new AutoCompleteTextField<Topic>("autoComplete", model, Topic.class, new AbstractAutoCompleteRenderer<Topic>() {
@Override
protected String getTextValue(Topic o) {
return TOPIC_CONVERTER.convertToString(o);
}
@Override
protected void renderChoice(Topic o, Response response, String criteria) {
response.write(o.getName());
}}, opts) {
@Override
public IConverter getConverter(Class<?> type) {
if (Topic.class.equals(type)) {
return new TopicConverter();
} else {
return super.getConverter(type);
}
}
@Override
protected Iterator<Topic> getChoices(String input) {
List<Topic> result = new ArrayList<Topic>(valueFieldModel.getRoleField().searchAllowedPlayers(input));
filterPlayers(result);
Collections.sort(result, TopicComparator.INSTANCE);
return result.iterator();
}
@Override
protected void onModelChanged() {
super.onModelChanged();
Topic topic = getModelObject();
if (topic != null) {
AssociationFieldAutoCompleteTextField.this.onTopicSelected(topic);
}
}
};
add(textField);
}
protected abstract void filterPlayers(List<Topic> players);
protected AutoCompleteTextField<Topic> getTextField() {
return textField;
}
protected abstract void onTopicSelected(Topic topic);
}