/** * 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.brixcms.plugin.site.page.tile.admin; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.SubmitLink; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.validation.IValidatable; import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.ValidationError; import org.brixcms.Brix; import org.brixcms.jcr.wrapper.BrixNode; import org.brixcms.plugin.site.page.AbstractContainer; import org.brixcms.plugin.site.page.global.GlobalContainerNode; import org.brixcms.plugin.site.page.tile.Tile; import org.brixcms.web.ContainerFeedbackPanel; import org.brixcms.web.generic.BrixGenericFragment; import org.brixcms.web.util.validators.NodeNameValidator; public abstract class NewTileFragment extends BrixGenericFragment<BrixNode> { private String newTileId; private String newTileTypeName; private Component newTileEditor; public NewTileFragment(String id, String fragmentId, MarkupContainer markupContainer, final IModel<BrixNode> nodeModel) { super(id, fragmentId, markupContainer, nodeModel); final Form<Void> form = new Form<Void>("form"); add(form); form.add(new ContainerFeedbackPanel("feedback", form)); final FormComponent<String> tileId; form.add(tileId = new TextField<String>("tileId", new PropertyModel<String>(this, "newTileId"))); tileId.setRequired(true).add(new NewTileIdValidator()).add(NodeNameValidator.getInstance()).setOutputMarkupId(true); IModel<List<? extends String>> idSuggestionModel = new LoadableDetachableModel<List<? extends String>>() { @Override protected List<? extends String> load() { List<String> res = new ArrayList<String>(); Collection<String> ids = ((AbstractContainer) NewTileFragment.this.getModelObject()).getTileIDs(); res.addAll(ids); return res; } }; final DropDownChoice<String> idSuggestion; form.add(idSuggestion = new DropDownChoice<String>("idSuggestion", new Model<String>(), idSuggestionModel) { @Override public boolean isVisible() { return NewTileFragment.this.getModelObject() instanceof GlobalContainerNode == false; } }); idSuggestion.add(new AjaxFormComponentUpdatingBehavior("change") { @Override protected void onUpdate(AjaxRequestTarget target) { tileId.setModelObject(idSuggestion.getModelObject()); idSuggestion.setModelObject(null); target.add(tileId); target.add(idSuggestion); target.focusComponent(tileId); } }); idSuggestion.setNullValid(true); form.add(new DropDownChoice<String>("tileType", new PropertyModel<String>(this, "newTileTypeName"), new TileTypeNamesModel(), new TileTypeNameRenderer()) { private static final long serialVersionUID = 1L; @Override protected boolean wantOnSelectionChangedNotifications() { return true; } @Override protected void onSelectionChanged(String tileTypeName) { ; if (tileTypeName == null) { EmptyPanel ep = new EmptyPanel(newTileEditor.getId()); newTileEditor.replaceWith(ep); newTileEditor = ep; } else { final Brix brix = NewTileFragment.this.getModelObject().getBrix(); final Tile tile = Tile.Helper.getTileOfType(tileTypeName, brix); TileEditorPanel ed = tile.newEditor(newTileEditor.getId(), nodeModel); newTileEditor.replaceWith(ed); newTileEditor = ed; } } }.setRequired(true)); newTileEditor = new EmptyPanel("tile-editor"); form.add(newTileEditor); form.add(new SubmitLink("add") { @Override public void onSubmit() { onAddTile(newTileId, newTileTypeName); } }); } protected abstract void onAddTile(String tileId, String ntileTypeName); public TileEditorPanel getEditor() { if (newTileEditor instanceof TileEditorPanel) { return (TileEditorPanel) newTileEditor; } else { return null; } } private AbstractContainer getTileContainer() { return (AbstractContainer) getModelObject(); } class NewTileIdValidator implements IValidator { public void validate(IValidatable validatable) { final String tileId = (String) validatable.getValue(); if (getTileContainer().tiles().getTile(tileId) != null) { validatable.error(new ValidationError().addKey("tileExists")); } } } class TileTypeNamesModel extends LoadableDetachableModel<List<? extends String>> { @Override protected List<? extends String> load() { final Collection<Tile> tiles = Tile.Helper.getTiles(NewTileFragment.this.getModelObject().getBrix()); List<String> choices = new ArrayList<String>(tiles.size()); for (Tile tile : tiles) { choices.add(tile.getTypeName()); } return choices; } } class TileTypeNameRenderer extends ChoiceRenderer<String> { public Object getDisplayValue(String type) { return Tile.Helper.getTileOfType(type, getModelObject().getBrix()).getDisplayName(); } public String getIdValue(String object, int index) { return object; } } }