package no.ntnu.capgeminitest.binding.android;

import java.util.HashMap;
import java.util.Map;

import no.ntnu.capgeminitest.binding.Property;
import no.ntnu.capgeminitest.binding.android.propertyprovider.PropertyProviderFactory;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public abstract class BindingActivity extends Activity {
    
    private Map<String, Property<?>> bindings = new HashMap<String, Property<?>>();
    
    public class BindingLayoutInflater {
        private LayoutInflater inflater;
        private BindingFactory bindingFactory;
        
        public BindingLayoutInflater(LayoutInflater inflater, BindingFactory bindingFactory) {
            this.inflater = inflater;
            this.bindingFactory = bindingFactory;
        }
        
        public View inflate(int resource, ViewGroup root) {
            return inflater.inflate(resource, root);
        }
        
        public Map<String, Property<?>> getBoundProperties() {
            return bindingFactory.getBoundProperties();
        }
    }
    
    private PropertyProviderFactory propertyProviderFactory =
            PropertyProviderFactory.getDefaultFactory();
    
    /**
     * Set content view from a layout resource.
     * 
     * This is the
     */
    public View createBoundView(int id, Map<String, Property<?>> bindings) {
        BindingLayoutInflater inflater = getBindingLayoutInflater();
        View v = inflater.inflate(id, null);
        bindings.putAll(inflater.getBoundProperties());
        return v;
    }
    
    public void setBoundContentView(int id, Map<String, Property<?>> bindings) {
        setContentView(createBoundView(id, bindings));
    }
    
    private BindingLayoutInflater getBindingLayoutInflater() {
        LayoutInflater inflater = getLayoutInflater().cloneInContext(this);
        BindingFactory factory = new BindingFactory(propertyProviderFactory, inflater);
        inflater.setFactory(factory);
        
        return new BindingLayoutInflater(inflater, factory);
    }
}

@@ -1367,47 +1367,12 @@
 t id
-, Map%3CString, Property%3C?%3E%3E bindings
 ) %7B%0A
+
     
@@ -1612,43 +1612,8 @@
 t id
-, Map%3CString, Property%3C?%3E%3E bindings
 ) %7B%0A
@@ -1657,18 +1657,8 @@
 w(id
-, bindings
 ));%0A
@@ -2003,16 +2003,985 @@
 ctory);%0A
-
     %7D%0A
+    %0A    @SuppressWarnings(%22unchecked%22)%0A    protected void bind(String propertyXmlName, Property property) %7B%0A        if (bindings.get(propertyXmlName) == null) %7B%0A            throw new RuntimeException(%22Could not bind %22 + propertyXmlName +%0A                    %22: Binding not found.%22);%0A        %7D%0A        %0A        Property source = bindings.get(propertyXmlName);%0A        source.bind(property);%0A        property.bind(source);%0A    %7D%0A    %0A    @SuppressWarnings(%22unchecked%22)%0A    protected void bind(String propertyXmlName, Property property, Object constantValue) %7B%0A        if (bindings.get(propertyXmlName) == null) %7B%0A            throw new RuntimeException(%22Could not bind %22 + propertyXmlName +%0A                    %22: Binding not found.%22);%0A        %7D%0A        %0A        Property source = bindings.get(propertyXmlName);%0A        source.bind().to(property).withConstantValue(constantValue).build();%0A        property.bind().to(source).withConstantValue(constantValue);%0A    %7D       %0A
 %7D%0A

Add stuff to BindingActivity.