ActiveTabsPage.java revision 22ac16eab0b62d24a99fc360f2ccea14837f4127
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.browser;
18
19import android.content.Context;
20import android.graphics.Bitmap;
21import android.util.AttributeSet;
22import android.view.KeyEvent;
23import android.view.LayoutInflater;
24import android.view.View;
25import android.view.ViewGroup;
26import android.widget.AdapterView;
27import android.widget.BaseAdapter;
28import android.widget.ImageView;
29import android.widget.LinearLayout;
30import android.widget.ListView;
31import android.widget.TextView;
32
33public class ActiveTabsPage extends LinearLayout {
34    private final BrowserActivity   mBrowserActivity;
35    private final LayoutInflater    mFactory;
36    private final TabControl        mControl;
37    private final TabsListAdapter   mAdapter;
38    private final ListView          mListView;
39
40    public ActiveTabsPage(BrowserActivity context, TabControl control) {
41        super(context);
42        mBrowserActivity = context;
43        mControl = control;
44        mFactory = LayoutInflater.from(context);
45        mFactory.inflate(R.layout.active_tabs, this);
46        mListView = (ListView) findViewById(R.id.list);
47        mAdapter = new TabsListAdapter();
48        mListView.setAdapter(mAdapter);
49        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
50                public void onItemClick(AdapterView<?> parent, View view,
51                        int position, long id) {
52                    if (mControl.canCreateNewTab()) {
53                        position--;
54                    }
55                    boolean needToAttach = false;
56                    if (position == -1) {
57                        // Create a new tab
58                        mBrowserActivity.openTabToHomePage();
59                    } else {
60                        // Open the corresponding tab
61                        // If the tab is the current one, switchToTab will
62                        // do nothing and return, so we need to make sure
63                        // it gets attached back to its mContentView in
64                        // removeActiveTabPage
65                        needToAttach = !mBrowserActivity.switchToTab(position);
66                    }
67                    mBrowserActivity.removeActiveTabPage(needToAttach);
68                }
69        });
70    }
71
72    /**
73     * Special class to hold the close drawable.  Its sole purpose is to allow
74     * the parent to be pressed without being pressed itself.  This way the line
75     * of a tab can be pressed, but the close button itself is not.
76     */
77    private static class CloseHolder extends ImageView {
78        public CloseHolder(Context context, AttributeSet attrs) {
79            super(context, attrs);
80        }
81
82        @Override
83        public void setPressed(boolean pressed) {
84            // If the parent is pressed, do not set to pressed.
85            if (pressed && ((View) getParent()).isPressed()) {
86                return;
87            }
88            super.setPressed(pressed);
89        }
90    }
91
92    private class TabsListAdapter extends BaseAdapter {
93        public int getCount() {
94            int count = mControl.getTabCount();
95            if (mControl.canCreateNewTab()) {
96                count++;
97            }
98            return count;
99        }
100        public Object getItem(int position) {
101            return null;
102        }
103        public long getItemId(int position) {
104            return position;
105        }
106        public int getViewTypeCount() {
107            return 2;
108        }
109        public int getItemViewType(int position) {
110            if (mControl.canCreateNewTab()) {
111                position--;
112            }
113            // Do not recycle the "add new tab" item.
114            return position == -1 ? IGNORE_ITEM_VIEW_TYPE : 1;
115        }
116        public View getView(int position, View convertView, ViewGroup parent) {
117            final int tabCount = mControl.getTabCount();
118            if (mControl.canCreateNewTab()) {
119                position--;
120            }
121
122            if (convertView == null) {
123                convertView = mFactory.inflate(position == -1 ?
124                        R.layout.tab_view_add_tab : R.layout.tab_view, null);
125            }
126
127            if (position != -1) {
128                TextView title =
129                        (TextView) convertView.findViewById(R.id.title);
130                TextView url = (TextView) convertView.findViewById(R.id.url);
131                ImageView favicon =
132                        (ImageView) convertView.findViewById(R.id.favicon);
133                View close = convertView.findViewById(R.id.close);
134                Tab tab = mControl.getTab(position);
135                tab.populatePickerData();
136                title.setText(tab.getTitle());
137                url.setText(tab.getUrl());
138                Bitmap icon = tab.getFavicon();
139                if (icon != null) {
140                    favicon.setImageBitmap(icon);
141                } else {
142                    favicon.setImageResource(R.drawable.app_web_browser_sm);
143                }
144                final int closePosition = position;
145                close.setOnClickListener(new View.OnClickListener() {
146                        public void onClick(View v) {
147                            mBrowserActivity.closeTab(
148                                    mControl.getTab(closePosition));
149                            if (tabCount == 1) {
150                                mBrowserActivity.openTabToHomePage();
151                                mBrowserActivity.removeActiveTabPage(false);
152                            } else {
153                                mListView.setAdapter(mAdapter);
154                            }
155                        }
156                });
157            }
158            return convertView;
159        }
160    }
161}
162