/**
 * Licensed to the Austrian Association for Software Tool Integration (AASTI)
 * under one or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information regarding copyright
 * ownership. The AASTI licenses this file to you 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.openengsb.ui.common.editor.fields;

import java.util.List;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.SimpleFormComponentLabel;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.validation.IValidator;
import org.openengsb.core.api.descriptor.AttributeDefinition;
import org.openengsb.ui.common.editor.ModelFacade;
import org.openengsb.ui.common.model.LocalizableStringModel;

/**
 * Field intended for editing a property in a bean (e.g. a service).
 */
@SuppressWarnings("serial")
public abstract class AbstractField<T> extends Panel {
    private IModel<String> model;
    private AttributeDefinition attribute;
    private IValidator<T> validator;
    private boolean editable;

    public AbstractField(String id, IModel<String> model, AttributeDefinition attribute, IValidator<T> validator,
            boolean editable) {
        super(id);
        this.model = model;
        this.attribute = attribute;
        this.validator = validator;
        this.editable = editable;
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();
        ModelFacade<T> component = createFormComponent(attribute, model);

        List<Component> helpComponents = component.getHelpComponents();
        if (helpComponents != null) {
            for (Component child : helpComponents) {
                add(child);
            }
        }
        FormComponent<T> mainComponent = component.getMainComponent();
        mainComponent.setOutputMarkupId(true);
        mainComponent.setMarkupId(attribute.getId());
        // editable is always set to true
        mainComponent.setEnabled(editable);
        if (validator != null) {
            mainComponent.add(validator);
        }
        mainComponent.setRequired(attribute.isRequired());
        mainComponent.setLabel(new LocalizableStringModel(this, attribute.getName()));
        SimpleFormComponentLabel label = new SimpleFormComponentLabel("name", mainComponent);
        label.add(new SimpleAttributeModifier("for", attribute.getId()));
        if (attribute.isRequired()) {
            label.add(new SimpleAttributeModifier("class", "required"));
        }
        add(label);
        add(mainComponent);
        addTooltip(attribute);
    }

    public AbstractField(String id, IModel<String> model, AttributeDefinition attribute, IValidator<T> validator) {
        this(id, model, attribute, validator, true);
    }

    private void addTooltip(AttributeDefinition attribute) {
        Image tooltip = new Image("tooltip", new PackageResourceReference(AbstractField.class, "balloon.png"));
        if (attribute.hasDescription()) {
            tooltip.add(new AttributeModifier("title", new LocalizableStringModel(this, attribute
                .getDescription())));
        } else {
            tooltip.setVisible(false);
        }
        add(tooltip);
    }

    protected abstract ModelFacade<T> createFormComponent(AttributeDefinition attribute, IModel<String> model);
}

@@ -979,67 +979,8 @@
 nt;%0A
-import org.apache.wicket.behavior.SimpleAttributeModifier;%0A
 impo
@@ -3108,34 +3108,24 @@
   label.add(
-new Simple
 AttributeMod
@@ -3129,16 +3129,24 @@
 Modifier
+.replace
 (%22for%22, 
@@ -3226,26 +3226,16 @@
 bel.add(
-new Simple
 Attribut
@@ -3243,16 +3243,24 @@
 Modifier
+.replace
 (%22class%22

replace usage of deprecated SimpleAttributeModifier