5package org.qtproject.qt.android;
7import android.app.Activity;
8import android.graphics.Point;
9import android.util.Log;
10import android.view.View;
11import android.view.ViewGroup;
12import android.view.ViewTreeObserver;
13import android.widget.PopupWindow;
16class EditPopupMenu
implements ViewTreeObserver.OnPreDrawListener, View.OnLayoutChangeListener,
17 View.OnAttachStateChangeListener, EditContextView.OnClickListener
19 private final EditContextView m_view;
20 private final QtEditText m_editText;
22 private PopupWindow m_popup =
null;
23 private final Activity m_activity;
26 private int m_buttons;
27 private ViewTreeObserver m_observer;
29 EditPopupMenu(QtEditText editText)
31 m_activity = (Activity) editText.getContext();
32 m_view =
new EditContextView(m_activity,
this);
33 m_view.addOnLayoutChangeListener(
this);
35 m_editText = editText;
36 m_editText.addOnAttachStateChangeListener(
this);
40 public void onViewAttachedToWindow(View
view)
42 m_observer =
view.getViewTreeObserver();
43 m_observer.addOnPreDrawListener(
this);
47 public void onViewDetachedFromWindow(View
view)
50 if (m_observer !=
null && m_observer.isAlive())
51 m_observer.removeOnPreDrawListener(
this);
56 private void initOverlay()
61 m_popup =
new PopupWindow(m_activity,
null, android.R.attr.textSelectHandleWindowStyle);
62 m_popup.setSplitTouchEnabled(
true);
63 m_popup.setClippingEnabled(
false);
64 m_popup.setContentView(m_view);
65 m_popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
66 m_popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
70 void setPosition(
final int x,
final int y,
final int buttons)
74 m_view.updateButtons(buttons);
75 Point viewSize = m_view.getCalculatedSize();
77 final int[] layoutLocation =
new int[2];
82 View positioningView = (View) m_editText.getParent();
83 if (positioningView ==
null)
84 positioningView = m_editText;
85 positioningView.getLocationOnScreen(layoutLocation);
88 final int[] activityLocation =
new int[2];
89 final int[] activityLocationInWindow =
new int[2];
90 m_activity.getWindow().getDecorView().getLocationOnScreen(activityLocation);
91 m_activity.getWindow().getDecorView().getLocationInWindow(activityLocationInWindow);
93 int x2 =
x + layoutLocation[0] - activityLocation[0];
94 int y2 =
y + layoutLocation[1] + (activityLocationInWindow[1] - activityLocation[1]);
96 x2 -= viewSize.x / 2 ;
100 y2 = m_editText.getSelectionHandleBottom();
104 QtLayout parentLayout = (QtLayout) m_editText.getParent();
105 parentLayout.requestLayout();
106 }
catch (ClassCastException e) {
107 Log.w(QtNative.QtTAG,
"QtEditText " + m_editText +
" parent is not a QtLayout, " +
108 "requestLayout() skipped");
109 }
catch (NullPointerException e) {
110 Log.w(QtNative.QtTAG,
"QtEditText " + m_editText +
" does not have a parent, " +
111 "requestLayout() skipped");
115 if (positioningView.getWidth() <
x + viewSize.x / 2)
116 x2 = positioningView.getWidth() - viewSize.x;
121 if (m_popup.isShowing())
122 m_popup.update(
x2,
y2, -1, -1);
124 m_popup.showAtLocation(positioningView, 0,
x2,
y2);
132 if (m_popup !=
null) {
139 public boolean onPreDraw() {
143 if (m_popup !=
null && m_popup.isShowing())
144 setPosition(m_posX, m_posY, m_buttons);
151 int oldLeft,
int oldTop,
int oldRight,
int oldBottom)
154 m_popup !=
null && m_popup.isShowing())
155 setPosition(m_posX, m_posY, m_buttons);
159 public void contextButtonClicked(
int buttonId) {
161 case android.R.string.cut:
162 QtInputConnection.QtNativeInputConnection.cut();
164 case android.R.string.copy:
165 QtInputConnection.QtNativeInputConnection.copy();
167 case android.R.string.paste:
168 QtInputConnection.QtNativeInputConnection.paste();
170 case android.R.string.selectAll:
171 QtInputConnection.QtNativeInputConnection.selectAll();
GLint GLint GLint GLint GLint x
GLdouble GLdouble GLdouble GLdouble top
GLsizei const GLfloat * v
GLfixed GLfixed GLfixed y2