/*
 * Copyright (C) 2011 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.browser;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class NavTabView extends LinearLayout {

    private ViewGroup mContent;
    private Tab mTab;
    private ImageView mClose;
    private TextView mTitle;
    private View mTitleBar;
    ImageView mImage;
    private OnClickListener mClickListener;
    private boolean mHighlighted;

    public NavTabView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public NavTabView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public NavTabView(Context context) {
        super(context);
        init();
    }

    private void init() {
        LayoutInflater.from(mContext).inflate(R.layout.nav_tab_view, this);
        mContent = (ViewGroup) findViewById(R.id.main);
        mClose = (ImageView) findViewById(R.id.closetab);
        mTitle = (TextView) findViewById(R.id.title);
        mTitleBar = findViewById(R.id.titlebar);
        mImage = (ImageView) findViewById(R.id.tab_view);
    }

    protected boolean isClose(View v) {
        return v == mClose;
    }

    protected boolean isTitle(View v) {
        return v == mTitleBar;
    }

    protected boolean isWebView(View v) {
        return v == mImage;
    }

    private void setTitle() {
        if (mTab == null) return;
        if (mHighlighted) {
            mTitle.setText(mTab.getUrl());
        } else {
            String txt = mTab.getTitle();
            if (txt == null) {
                txt = mTab.getUrl();
            }
            mTitle.setText(txt);
        }
        if (mTab.isSnapshot()) {
            setTitleIcon(R.drawable.ic_history_holo_dark);
        } else if (mTab.isPrivateBrowsingEnabled()) {
            setTitleIcon(R.drawable.ic_incognito_holo_dark);
        } else {
            setTitleIcon(0);
        }
    }

    private void setTitleIcon(int id) {
        if (id == 0) {
            mTitle.setPadding(mTitle.getCompoundDrawablePadding(), 0, 0, 0);
        } else {
            mTitle.setPadding(0, 0, 0, 0);
        }
        mTitle.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0);
    }

    protected boolean isHighlighted() {
        return mHighlighted;
    }

    protected void setWebView(Tab tab) {
        mTab = tab;
        setTitle();
        Bitmap image = tab.getScreenshot();
        if (image != null) {
            mImage.setImageBitmap(image);
            if (tab != null) {
                mImage.setContentDescription(tab.getTitle());
            }
        }
    }

    @Override
    public void setOnClickListener(OnClickListener listener) {
        mClickListener = listener;
        mTitleBar.setOnClickListener(mClickListener);
        mClose.setOnClickListener(mClickListener);
        if (mImage != null) {
            mImage.setOnClickListener(mClickListener);
        }
    }

}
