Index: content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java b/content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java |
deleted file mode 100644 |
index bd3a464f0098acd0e2bc63dd72ed9db708962152..0000000000000000000000000000000000000000 |
--- a/content/public/android/java/src/org/chromium/content/browser/input/InsertionHandleController.java |
+++ /dev/null |
@@ -1,332 +0,0 @@ |
-// Copyright 2012 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.ClipboardManager; |
-import android.content.Context; |
-import android.content.res.TypedArray; |
-import android.graphics.drawable.Drawable; |
-import android.view.Gravity; |
-import android.view.LayoutInflater; |
-import android.view.View; |
-import android.view.View.OnClickListener; |
-import android.view.ViewGroup; |
-import android.view.ViewGroup.LayoutParams; |
-import android.widget.PopupWindow; |
- |
-import com.google.common.annotations.VisibleForTesting; |
- |
-import org.chromium.content.browser.PositionObserver; |
- |
-/** |
- * CursorController for inserting text at the cursor position. |
- */ |
-public abstract class InsertionHandleController implements CursorController { |
- |
- /** The handle view, lazily created when first shown */ |
- private HandleView mHandle; |
- |
- /** The view over which the insertion handle should be shown */ |
- private final View mParent; |
- |
- /** True iff the insertion handle is currently showing */ |
- private boolean mIsShowing; |
- |
- /** True iff the insertion handle can be shown automatically when selection changes */ |
- private boolean mAllowAutomaticShowing; |
- |
- private final Context mContext; |
- |
- private final PositionObserver mPositionObserver; |
- |
- public InsertionHandleController(View parent, PositionObserver positionObserver) { |
- mParent = parent; |
- |
- mContext = parent.getContext(); |
- mPositionObserver = positionObserver; |
- } |
- |
- /** Allows the handle to be shown automatically when cursor position changes */ |
- public void allowAutomaticShowing() { |
- mAllowAutomaticShowing = true; |
- } |
- |
- /** Disallows the handle from being shown automatically when cursor position changes */ |
- public void hideAndDisallowAutomaticShowing() { |
- hide(); |
- mAllowAutomaticShowing = false; |
- } |
- |
- /** |
- * Shows the handle. |
- */ |
- public void showHandle() { |
- createHandleIfNeeded(); |
- showHandleIfNeeded(); |
- } |
- |
- void showPastePopup() { |
- if (mIsShowing) { |
- mHandle.showPastePopupWindow(); |
- } |
- } |
- |
- public void showHandleWithPastePopup() { |
- showHandle(); |
- showPastePopup(); |
- } |
- |
- /** |
- * @return whether the handle is being dragged. |
- */ |
- public boolean isDragging() { |
- return mHandle != null && mHandle.isDragging(); |
- } |
- |
- /** Shows the handle at the given coordinates, as long as automatic showing is allowed */ |
- public void onCursorPositionChanged() { |
- if (mAllowAutomaticShowing) { |
- showHandle(); |
- } |
- } |
- |
- /** |
- * Moves the handle so that it points at the given coordinates. |
- * @param x Handle x in physical pixels. |
- * @param y Handle y in physical pixels. |
- */ |
- public void setHandlePosition(float x, float y) { |
- mHandle.positionAt((int) x, (int) y); |
- } |
- |
- /** |
- * If the handle is not visible, sets its visibility to View.VISIBLE and begins fading it in. |
- */ |
- public void beginHandleFadeIn() { |
- mHandle.beginFadeIn(); |
- } |
- |
- /** |
- * Sets the handle to the given visibility. |
- */ |
- public void setHandleVisibility(int visibility) { |
- mHandle.setVisibility(visibility); |
- } |
- |
- int getHandleX() { |
- return mHandle.getAdjustedPositionX(); |
- } |
- |
- int getHandleY() { |
- return mHandle.getAdjustedPositionY(); |
- } |
- |
- @VisibleForTesting |
- public HandleView getHandleViewForTest() { |
- return mHandle; |
- } |
- |
- @Override |
- public void onTouchModeChanged(boolean isInTouchMode) { |
- if (!isInTouchMode) { |
- hide(); |
- } |
- } |
- |
- @Override |
- public void hide() { |
- if (mIsShowing) { |
- if (mHandle != null) mHandle.hide(); |
- mIsShowing = false; |
- } |
- } |
- |
- @Override |
- public boolean isShowing() { |
- return mIsShowing; |
- } |
- |
- @Override |
- public void beforeStartUpdatingPosition(HandleView handle) {} |
- |
- @Override |
- public void updatePosition(HandleView handle, int x, int y) { |
- setCursorPosition(x, y); |
- } |
- |
- /** |
- * The concrete implementation must cause the cursor position to move to the given |
- * coordinates and (possibly asynchronously) set the insertion handle position |
- * after the cursor position change is made via setHandlePosition. |
- * @param x |
- * @param y |
- */ |
- protected abstract void setCursorPosition(int x, int y); |
- |
- /** Pastes the contents of clipboard at the current insertion point */ |
- protected abstract void paste(); |
- |
- /** Returns the current line height in pixels */ |
- protected abstract int getLineHeight(); |
- |
- @Override |
- public void onDetached() {} |
- |
- boolean canPaste() { |
- return ((ClipboardManager) mContext.getSystemService( |
- Context.CLIPBOARD_SERVICE)).hasPrimaryClip(); |
- } |
- |
- private void createHandleIfNeeded() { |
- if (mHandle == null) { |
- mHandle = new HandleView(this, HandleView.CENTER, mParent, mPositionObserver); |
- } |
- } |
- |
- private void showHandleIfNeeded() { |
- if (!mIsShowing) { |
- mIsShowing = true; |
- mHandle.show(); |
- setHandleVisibility(HandleView.VISIBLE); |
- } |
- } |
- |
- /* |
- * This class is based on TextView.PastePopupMenu. |
- */ |
- class PastePopupMenu implements OnClickListener { |
- private final PopupWindow mContainer; |
- private int mPositionX; |
- private int mPositionY; |
- private final View[] mPasteViews; |
- private final int[] mPasteViewLayouts; |
- |
- public PastePopupMenu() { |
- mContainer = new PopupWindow(mContext, null, |
- android.R.attr.textSelectHandleWindowStyle); |
- mContainer.setSplitTouchEnabled(true); |
- mContainer.setClippingEnabled(false); |
- |
- mContainer.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); |
- mContainer.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); |
- |
- final int[] POPUP_LAYOUT_ATTRS = { |
- android.R.attr.textEditPasteWindowLayout, |
- android.R.attr.textEditNoPasteWindowLayout, |
- android.R.attr.textEditSidePasteWindowLayout, |
- android.R.attr.textEditSideNoPasteWindowLayout, |
- }; |
- |
- mPasteViews = new View[POPUP_LAYOUT_ATTRS.length]; |
- mPasteViewLayouts = new int[POPUP_LAYOUT_ATTRS.length]; |
- |
- TypedArray attrs = mContext.obtainStyledAttributes(POPUP_LAYOUT_ATTRS); |
- for (int i = 0; i < attrs.length(); ++i) { |
- mPasteViewLayouts[i] = attrs.getResourceId(attrs.getIndex(i), 0); |
- } |
- attrs.recycle(); |
- } |
- |
- private int viewIndex(boolean onTop) { |
- return (onTop ? 0 : 1 << 1) + (canPaste() ? 0 : 1 << 0); |
- } |
- |
- private void updateContent(boolean onTop) { |
- final int viewIndex = viewIndex(onTop); |
- View view = mPasteViews[viewIndex]; |
- |
- if (view == null) { |
- final int layout = mPasteViewLayouts[viewIndex]; |
- LayoutInflater inflater = (LayoutInflater) mContext. |
- getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
- if (inflater != null) { |
- view = inflater.inflate(layout, null); |
- } |
- |
- if (view == null) { |
- throw new IllegalArgumentException("Unable to inflate TextEdit paste window"); |
- } |
- |
- final int size = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); |
- view.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, |
- ViewGroup.LayoutParams.WRAP_CONTENT)); |
- view.measure(size, size); |
- |
- view.setOnClickListener(this); |
- |
- mPasteViews[viewIndex] = view; |
- } |
- |
- mContainer.setContentView(view); |
- } |
- |
- void show() { |
- updateContent(true); |
- positionAtCursor(); |
- } |
- |
- void hide() { |
- mContainer.dismiss(); |
- } |
- |
- boolean isShowing() { |
- return mContainer.isShowing(); |
- } |
- |
- @Override |
- public void onClick(View v) { |
- if (canPaste()) { |
- paste(); |
- } |
- hide(); |
- } |
- |
- void positionAtCursor() { |
- View contentView = mContainer.getContentView(); |
- int width = contentView.getMeasuredWidth(); |
- int height = contentView.getMeasuredHeight(); |
- |
- int lineHeight = getLineHeight(); |
- |
- mPositionX = (int) (mHandle.getAdjustedPositionX() - width / 2.0f); |
- mPositionY = mHandle.getAdjustedPositionY() - height - lineHeight; |
- |
- final int[] coords = new int[2]; |
- mParent.getLocationInWindow(coords); |
- coords[0] += mPositionX; |
- coords[1] += mPositionY; |
- |
- final int screenWidth = mContext.getResources().getDisplayMetrics().widthPixels; |
- if (coords[1] < 0) { |
- updateContent(false); |
- // Update dimensions from new view |
- contentView = mContainer.getContentView(); |
- width = contentView.getMeasuredWidth(); |
- height = contentView.getMeasuredHeight(); |
- |
- // Vertical clipping, move under edited line and to the side of insertion cursor |
- // TODO bottom clipping in case there is no system bar |
- coords[1] += height; |
- coords[1] += lineHeight; |
- |
- // Move to right hand side of insertion cursor by default. TODO RTL text. |
- final Drawable handle = mHandle.getDrawable(); |
- final int handleHalfWidth = handle.getIntrinsicWidth() / 2; |
- |
- if (mHandle.getAdjustedPositionX() + width < screenWidth) { |
- coords[0] += handleHalfWidth + width / 2; |
- } else { |
- coords[0] -= handleHalfWidth + width / 2; |
- } |
- } else { |
- // Horizontal clipping |
- coords[0] = Math.max(0, coords[0]); |
- coords[0] = Math.min(screenWidth - width, coords[0]); |
- } |
- |
- mContainer.showAtLocation(mParent, Gravity.NO_GRAVITY, coords[0], coords[1]); |
- } |
- } |
-} |