SelectPopupDropdown.java revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser.input;
6
7import android.content.Context;
8import android.graphics.Rect;
9import android.view.View;
10import android.widget.AdapterView;
11import android.widget.PopupWindow;
12
13import org.chromium.content.browser.ContentViewCore;
14import org.chromium.content.browser.RenderCoordinates;
15import org.chromium.ui.DropdownAdapter;
16import org.chromium.ui.DropdownItem;
17import org.chromium.ui.DropdownPopupWindow;
18
19import java.util.List;
20
21/**
22 * Handles the dropdown popup for the <select> HTML tag support.
23 */
24public class SelectPopupDropdown implements SelectPopup {
25
26    private final ContentViewCore mContentViewCore;
27    private final Context mContext;
28    private final DropdownPopupWindow mDropdownPopupWindow;
29
30    private int mInitialSelection = -1;
31    private boolean mSelectionNotified;
32
33    public SelectPopupDropdown(ContentViewCore contentViewCore, List<SelectPopupItem> items,
34            Rect bounds, int[] selected) {
35        mContentViewCore = contentViewCore;
36        mContext = mContentViewCore.getContext();
37        mDropdownPopupWindow = new DropdownPopupWindow(mContext,
38                mContentViewCore.getViewAndroidDelegate());
39        mDropdownPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
40            @Override
41            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
42                notifySelection(new int[] {position});
43                hide();
44            }
45        });
46        if (selected.length > 0) {
47            mInitialSelection = selected[0];
48        }
49        DropdownItem[] dropdownItems = items.toArray(new DropdownItem[items.size()]);
50        mDropdownPopupWindow.setAdapter(new DropdownAdapter(mContext, dropdownItems, null));
51        RenderCoordinates renderCoordinates = mContentViewCore.getRenderCoordinates();
52        float anchorX = renderCoordinates.fromPixToDip(
53                renderCoordinates.fromLocalCssToPix(bounds.left));
54        float anchorY = renderCoordinates.fromPixToDip(
55                renderCoordinates.fromLocalCssToPix(bounds.top));
56        float anchorWidth = renderCoordinates.fromPixToDip(
57                renderCoordinates.fromLocalCssToPix(bounds.right)) - anchorX;
58        float anchorHeight = renderCoordinates.fromPixToDip(
59                renderCoordinates.fromLocalCssToPix(bounds.bottom)) - anchorY;
60        mDropdownPopupWindow.setAnchorRect(anchorX, anchorY, anchorWidth, anchorHeight);
61        mDropdownPopupWindow.setOnDismissListener(
62            new PopupWindow.OnDismissListener() {
63                @Override
64                public void onDismiss() {
65                    notifySelection(null);
66                }
67            });
68    }
69
70    private void notifySelection(int[] indicies) {
71        if (mSelectionNotified) return;
72        mContentViewCore.selectPopupMenuItems(indicies);
73        mSelectionNotified = true;
74    }
75
76    @Override
77    public void show() {
78        mDropdownPopupWindow.show();
79        if (mInitialSelection >= 0) {
80            mDropdownPopupWindow.getListView().setSelection(mInitialSelection);
81        }
82    }
83
84    @Override
85    public void hide() {
86        mDropdownPopupWindow.dismiss();
87        notifySelection(null);
88    }
89}
90