/**
 * Copyright 2011 Kjetil Ørbekk
 *
 * 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. See accompanying LICENSE file.
 */

package com.github.binding.android;

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

import com.github.binding.Property;
import com.github.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) {
        BindingLayoutInflater inflater = getBindingLayoutInflater();
        View v = inflater.inflate(id, null);
        bindings.putAll(inflater.getBoundProperties());
        return v;
    }
    
    public void setBoundContentView(int id) {
        setContentView(createBoundView(id));
    }
    
    private BindingLayoutInflater getBindingLayoutInflater() {
        LayoutInflater inflater = getLayoutInflater().cloneInContext(this);
        BindingFactory factory = new BindingFactory(propertyProviderFactory, inflater);
        inflater.setFactory(factory);
        
        return new BindingLayoutInflater(inflater, factory);
    }
    
    @SuppressWarnings("unchecked")
    protected void bind(String propertyXmlName, Property property) {
        if (bindings.get(propertyXmlName) == null) {
            throw new RuntimeException("Could not bind " + propertyXmlName +
                    ": Binding not found.");
        }
        
        Property source = bindings.get(propertyXmlName);
        source.bind(property);
        property.bind(source);
    }
    
    @SuppressWarnings("unchecked")
    protected void bind(String propertyXmlName, Property property, Object constantValue) {
        if (bindings.get(propertyXmlName) == null) {
            throw new RuntimeException("Could not bind " + propertyXmlName +
                    ": Binding not found.");
        }
        
        Property source = bindings.get(propertyXmlName);
        source.bind().to(property).withConstantValue(constantValue).build();
        property.bind().to(source).withConstantValue(constantValue);
    }       
}

@@ -2626,32 +2626,33 @@
 uppressWarnings(
+%7B
 %22unchecked%22)%0A   
@@ -2638,32 +2638,45 @@
 ngs(%7B%22unchecked%22
+, %22rawtypes%22%7D
 )%0A    protected 
@@ -3047,548 +3047,13 @@
 e);%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 
     

Change BindingActivity.bind().