1616import android .view .ViewGroup ;
1717import android .view .WindowManager ;
1818import android .widget .AdapterView ;
19+ import android .widget .ListView ;
1920
2021import com .duy .common .DLog ;
2122import com .duy .ide .code .api .SuggestItem ;
2829import java .util .ArrayList ;
2930import java .util .List ;
3031
31- public class SuggestionEditor extends EditActionSupportEditor {
32+ public class SuggestionEditor extends EditActionSupportEditor implements AdapterView . OnItemClickListener {
3233
3334 private static final String TAG = "SuggestionEditor" ;
3435 private final Rect mTmpRect = new Rect ();
3536
3637 private SuggestionAdapter mAdapter ;
37- @ Nullable
38- private OnSuggestItemClickListener mOnSuggestItemClickListener ;
3938
4039 /**
4140 * Small popup window to display list suggestion
@@ -52,15 +51,7 @@ public void run() {
5251 onPopupChangePosition ();
5352 }
5453 };
55- private AdapterView .OnItemClickListener mSuggestClickListener
56- = new AdapterView .OnItemClickListener () {
57- @ Override
58- public void onItemClick (AdapterView <?> parent , View view , int position , long id ) {
59- if (mAdapter != null ) {
60- performCompletion (position );
61- }
62- }
63- };
54+
6455
6556 public SuggestionEditor (Context context ) {
6657 super (context );
@@ -80,11 +71,13 @@ public SuggestionEditor(Context context, AttributeSet attrs, int defStyleAttr) {
8071
8172 private void init (Context context , AttributeSet attrs , int defStyleAttr ) {
8273 mAdapter = new SuggestionAdapter (getContext (), new ArrayList <SuggestItem >());
83- mAdapter .setListener (mSuggestClickListener );
74+ // mAdapter.setListener(this );
8475
8576 mPopup = new ListPopupWindow (context , attrs , defStyleAttr , 0 );
8677 mPopup .setSoftInputMode (WindowManager .LayoutParams .SOFT_INPUT_ADJUST_RESIZE );
8778 mPopup .setAdapter (mAdapter );
79+ mAdapter .setListener (this );
80+
8881 if (getEditorTheme () != null ) {
8982 setThemeForPopup (getEditorTheme ());
9083 }
@@ -214,7 +207,11 @@ private void showDropDownImpl() {
214207 mPopup .setInputMethodMode (ListPopupWindow .INPUT_METHOD_NEEDED );
215208 }
216209 mPopup .show ();
217- mPopup .getListView ().setOverScrollMode (View .OVER_SCROLL_ALWAYS );
210+ ListView list = mPopup .getListView ();
211+ list .setOverScrollMode (View .OVER_SCROLL_ALWAYS );
212+ if (mAdapter .getCount () > 0 ) {
213+ list .setSelection (0 );
214+ }
218215 }
219216
220217
@@ -246,7 +243,6 @@ public void setSuggestData(@NonNull List<SuggestItem> data) {
246243
247244 @ Override
248245 public void setOnSuggestItemClickListener (@ Nullable OnSuggestItemClickListener listener ) {
249- this .mOnSuggestItemClickListener = listener ;
250246 }
251247
252248 /**
@@ -414,25 +410,57 @@ protected boolean setFrame(final int l, int t, final int r, int b) {
414410
415411 @ Override
416412 public boolean onKeyUp (int keyCode , KeyEvent event ) {
417- if (keyCode != KeyEvent .KEYCODE_TAB ) {
418- boolean consumed = mPopup .onKeyUp (keyCode , event );
419- if (consumed ) {
420- switch (keyCode ) {
421- // if the list accepts the key events and the key event
422- // was a click, the text view gets the selected item
423- // from the drop down as its content
424- case KeyEvent .KEYCODE_ENTER :
425- case KeyEvent .KEYCODE_DPAD_CENTER :
426- if (event .hasNoModifiers ()) {
427- performCompletion ();
428- }
429- return true ;
413+ if (isPopupShowing ()) {
414+ //editor support press tab to insert tab character
415+ if (keyCode != KeyEvent .KEYCODE_TAB ) {
416+ if (getSelectedItemPosition () >= 0 ) {
417+ switch (keyCode ) {
418+ // if the list accepts the key events and the key event
419+ // was a click, the text view gets the selected item
420+ // from the drop down as its content
421+ case KeyEvent .KEYCODE_ENTER :
422+ case KeyEvent .KEYCODE_DPAD_CENTER :
423+ if (event .hasNoModifiers ()) {
424+ performCompletion ();
425+ }
426+ return true ;
427+ }
430428 }
431429 }
432430 }
433431 return super .onKeyUp (keyCode , event );
434432 }
435433
434+ private int getSelectedItemPosition () {
435+ return mPopup .getListView ().getSelectedItemPosition ();
436+ }
437+
438+ @ Override
439+ public boolean onKeyDown (int keyCode , KeyEvent event ) {
440+ if (isPopupShowing ()) {
441+ if (keyCode == KeyEvent .KEYCODE_ENTER || keyCode == KeyEvent .KEYCODE_DPAD_CENTER ) {
442+ if (getSelectedItemPosition () >= 0 ) {
443+ //#onKeyUp will be perform completion
444+ return true ;
445+ }
446+ }
447+
448+ //editor support press tab to insert tab character
449+ if (keyCode != KeyEvent .KEYCODE_TAB && mPopup .isShowing ()) {
450+ if (mPopup .onKeyDown (keyCode , event )) {
451+ return true ;
452+ }
453+ }
454+ boolean handled = super .onKeyDown (keyCode , event );
455+ if (handled ) {
456+ clearListSelection ();
457+ }
458+ return handled ;
459+ } else {
460+ return super .onKeyDown (keyCode , event );
461+ }
462+ }
463+
436464 @ SuppressLint ("RestrictedApi" )
437465 private void performCompletion () {
438466 performCompletion (-1 );
@@ -459,22 +487,6 @@ private void performCompletion(int position) {
459487 }
460488 }
461489
462- @ Override
463- public boolean onKeyDown (int keyCode , KeyEvent event ) {
464- if (keyCode != KeyEvent .KEYCODE_TAB ) {
465- if (mPopup .onKeyDown (keyCode , event )) {
466- return true ;
467- }
468- }
469- boolean handled = super .onKeyDown (keyCode , event );
470-
471- if (handled && isPopupShowing ()) {
472- clearListSelection ();
473- }
474-
475- return handled ;
476- }
477-
478490 /**
479491 * <p>Clear the list selection. This may only be temporary, as user input will often bring
480492 * it back.
@@ -491,4 +503,9 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
491503 setSuggestEnable (mSuggestionEnable );
492504 }
493505 }
506+
507+ @ Override
508+ public void onItemClick (AdapterView <?> parent , View view , int position , long id ) {
509+ performCompletion (position );
510+ }
494511}
0 commit comments