/*
* Copyright 2009-2013 Hippo B.V. (http://www.onehippo.com)
*
* 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.onehippo.taxonomy.plugin;
import org.apache.cxf.common.util.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.util.value.IValueMap;
import org.hippoecm.frontend.dialog.AbstractDialog;
import org.hippoecm.repository.api.StringCodec;
import org.onehippo.taxonomy.api.Taxonomy;
import org.onehippo.taxonomy.plugin.api.KeyCodec;
public abstract class NewCategoryDialog extends AbstractDialog<Taxonomy> {
private static final long serialVersionUID = 1L;
private String key;
private String name;
private String pathKey;
public NewCategoryDialog(final IModel<Taxonomy> taxonomyModel, final String pathKey) {
super(taxonomyModel);
this.name = "new category";
this.pathKey = pathKey;
this.key = createKey();
add(new AttributeAppender("class", new Model<String>("hippo-editor"), " "));
final FormComponent<String> keyField = new TextField<String>("key", new IModel<String>() {
private static final long serialVersionUID = 1L;
public String getObject() {
return getKey();
}
public void setObject(String object) {
key = object;
}
public void detach() {
}
});
keyField.setModelObject(key);
keyField.add(new SimpleAttributeModifier("readonly", "readonly"));
keyField.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
}
});
keyField.setOutputMarkupId(true);
add(keyField);
final FormComponent<String> nameField = new TextField<String>("name", new IModel<String>() {
private static final long serialVersionUID = 1L;
public String getObject() {
return name;
}
public void setObject(String object) {
name = object;
}
public void detach() {
}
});
nameField.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
keyField.setModelObject(createKey());
target.addComponent(keyField);
}
});
add(nameField);
}
private String createKey() {
StringBuilder fullPath =
new StringBuilder(pathKey != null && !StringUtils.isEmpty(pathKey) ? pathKey : "");
if (name != null && !StringUtils.isEmpty(name)) {
fullPath.append(KeyCodec.encode(name));
}
return fullPath.toString().replaceAll("/", ".");
}
protected String getKey() {
if (key != null) {
return key;
}
if (name == null) {
return null;
}
String encoded = useKeyUrlEncoding() ? getNodeNameCodec().encode(name) : KeyCodec.encode(name);
String myKey = encoded;
int index = 0;
Taxonomy taxonomy = getModelObject();
// make sure we have unique keys:
while (taxonomy.getCategoryByKey(myKey) != null) {
myKey = encoded + '_' + (++index);
}
return myKey;
}
protected String getName() {
return name;
}
@Override
public IValueMap getProperties() {
return SMALL;
}
public IModel<String> getTitle() {
return new StringResourceModel("new-category", this, null);
}
/**
* Get the CMS's URL friendly node name encoder
*/
protected abstract StringCodec getNodeNameCodec();
/**
*
* Check if we should use ULR ending
*
* @return true if using url encoding
*/
protected abstract boolean useKeyUrlEncoding();
}