/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * 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 com.android.videoeditor.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

/**
 * The RelativeLayout which is the container for the timeline layout
 */
public class TimelineRelativeLayout extends RelativeLayout {
    // Instance variables
    private LayoutCallback mLayoutCallback;

    /**
     * Layout complete callback interface
     */
    public interface LayoutCallback {
        /**
         * This method is invoked when the layout completes after a call
         * to requestLayout(LayoutCallback)
         */
        public void onLayoutComplete();
    }

    public TimelineRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        setMotionEventSplittingEnabled(false);
    }

    public TimelineRelativeLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TimelineRelativeLayout(Context context) {
        this(context, null, 0);
    }

    /**
     * Request a layout and get a callback when the layout completes
     *
     * @param callback The layout callback
     */
    public void requestLayout(LayoutCallback callback) {
        mLayoutCallback = callback;

        requestLayout();
    }

    @Override
    public void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);

        if (mLayoutCallback != null) {
            mLayoutCallback.onLayoutComplete();
            mLayoutCallback = null;
        }
    }

    @Override
    public void setSelected(boolean selected) {
        final int childrenCount = getChildCount();
        for (int i = 0; i < childrenCount; i++) {
            final View childView = getChildAt(i);
            if (childView instanceof ViewGroup) {
                childView.setSelected(selected);
            }
        }
    }
}
