blob: f09837e3ba560a818091015a1292e0c95f8c94cc [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.content.browser.input;
import android.content.Context;
import android.graphics.Rect;
import android.view.View;
import android.widget.AdapterView;
import android.widget.PopupWindow;
import org.chromium.content.browser.ContentViewCore;
import org.chromium.content.browser.RenderCoordinates;
import org.chromium.ui.DropdownAdapter;
import org.chromium.ui.DropdownItem;
import org.chromium.ui.DropdownPopupWindow;
import java.util.List;
/**
* Handles the dropdown popup for the <select> HTML tag support.
*/
public class SelectPopupDropdown implements SelectPopup {
private final ContentViewCore mContentViewCore;
private final Context mContext;
private final DropdownPopupWindow mDropdownPopupWindow;
private int mInitialSelection = -1;
private boolean mSelectionNotified;
public SelectPopupDropdown(ContentViewCore contentViewCore, List<SelectPopupItem> items,
Rect bounds, int[] selected) {
mContentViewCore = contentViewCore;
mContext = mContentViewCore.getContext();
mDropdownPopupWindow = new DropdownPopupWindow(mContext,
mContentViewCore.getViewAndroidDelegate());
mDropdownPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
notifySelection(new int[] {position});
hide();
}
});
if (selected.length > 0) {
mInitialSelection = selected[0];
}
DropdownItem[] dropdownItems = items.toArray(new DropdownItem[items.size()]);
mDropdownPopupWindow.setAdapter(new DropdownAdapter(mContext, dropdownItems, null));
RenderCoordinates renderCoordinates = mContentViewCore.getRenderCoordinates();
float anchorX = renderCoordinates.fromPixToDip(
renderCoordinates.fromLocalCssToPix(bounds.left));
float anchorY = renderCoordinates.fromPixToDip(
renderCoordinates.fromLocalCssToPix(bounds.top));
float anchorWidth = renderCoordinates.fromPixToDip(
renderCoordinates.fromLocalCssToPix(bounds.right)) - anchorX;
float anchorHeight = renderCoordinates.fromPixToDip(
renderCoordinates.fromLocalCssToPix(bounds.bottom)) - anchorY;
mDropdownPopupWindow.setAnchorRect(anchorX, anchorY, anchorWidth, anchorHeight);
mDropdownPopupWindow.setOnDismissListener(
new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
notifySelection(null);
}
});
}
private void notifySelection(int[] indicies) {
if (mSelectionNotified) return;
mContentViewCore.selectPopupMenuItems(indicies);
mSelectionNotified = true;
}
@Override
public void show() {
mDropdownPopupWindow.show();
if (mInitialSelection >= 0) {
mDropdownPopupWindow.getListView().setSelection(mInitialSelection);
}
}
@Override
public void hide() {
mDropdownPopupWindow.dismiss();
notifySelection(null);
}
}