/* 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.riotfamily.pages.riot.form; import org.riotfamily.components.model.Content; import org.riotfamily.forms.BeanEditor; import org.riotfamily.forms.CompositeElement; import org.riotfamily.forms.Editor; import org.riotfamily.forms.EditorBinder; import org.riotfamily.forms.ElementFactory; import org.riotfamily.forms.Form; import org.riotfamily.forms.MapEditorBinder; import org.riotfamily.forms.element.NestedForm; import org.riotfamily.forms.event.ChangeEvent; import org.riotfamily.forms.event.ChangeListener; import org.riotfamily.forms.factory.FormFactory; import org.riotfamily.forms.factory.FormRepository; import org.riotfamily.pages.config.PageType; /** * @author Felix Gnass [fgnass at neteye dot de] * @since 7.0 */ public class PagePropertiesEditor extends CompositeElement implements Editor, BeanEditor, ChangeListener { private FormRepository repository; private Form form; private NestedForm currentForm; private Object initialValue; private EditorBinder binder; public PagePropertiesEditor(FormRepository repository, Form form, PageType pageType) { this.repository = repository; this.form = form; this.binder = new MapEditorBinder(Content.class); this.currentForm = new PropertiesForm(pageType); addComponent(currentForm); } @Override public String getLabel() { return null; } // ----------------------------------------------------------------- // Implementation of the Editor interface // ----------------------------------------------------------------- public Object getValue() { return currentForm.getValue(); } public void setValue(Object value) { initialValue = value; currentForm.setValue(value); } // ----------------------------------------------------------------- // Implementation of the BeanEditor interface // ----------------------------------------------------------------- public Editor getEditor(String property) { return currentForm.getEditor(property); } public void bind(Editor editor, String property) { throw new UnsupportedOperationException(); } public void setBeanClass(Class<?> beanClass) { throw new UnsupportedOperationException(); } // ----------------------------------------------------------------- // Implementation of the ChangeListener interface // ----------------------------------------------------------------- public void valueChanged(ChangeEvent event) { PageType pageType = (PageType) event.getNewValue(); removeComponent(currentForm); currentForm = new PropertiesForm(pageType); addComponent(currentForm); getFormListener().elementChanged(this); currentForm.setValue(initialValue); } private class PropertiesForm extends NestedForm { public PropertiesForm(PageType pageType) { setRequired(true); setEditorBinder(binder); setStyleClass(pageType.getForm()); addPagePropertyElements("page"); addPagePropertyElements(pageType.getForm()); } private void addPagePropertyElements(String id) { if (repository.containsForm(id)) { FormFactory factory = repository.getFormFactory(id); for (ElementFactory ef : factory.getChildFactories()) { addElement(ef.createElement(this, form, true)); } } } } }