1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.text.method;
18 
19 import android.app.Dialog;
20 import android.content.Context;
21 import android.os.Bundle;
22 import android.text.Editable;
23 import android.text.Selection;
24 import android.view.LayoutInflater;
25 import android.view.View;
26 import android.view.View.OnClickListener;
27 import android.view.ViewGroup;
28 import android.view.Window;
29 import android.view.WindowManager;
30 import android.widget.AdapterView;
31 import android.widget.AdapterView.OnItemClickListener;
32 import android.widget.BaseAdapter;
33 import android.widget.Button;
34 import android.widget.GridView;
35 
36 import com.android.internal.R;
37 
38 /**
39  * Dialog for choosing accented characters related to a base character.
40  */
41 public class CharacterPickerDialog extends Dialog
42         implements OnItemClickListener, OnClickListener {
43     private View mView;
44     private Editable mText;
45     private String mOptions;
46     private boolean mInsert;
47     private LayoutInflater mInflater;
48     private Button mCancelButton;
49 
50     /**
51      * Creates a new CharacterPickerDialog that presents the specified
52      * <code>options</code> for insertion or replacement (depending on
53      * the sense of <code>insert</code>) into <code>text</code>.
54      */
CharacterPickerDialog(Context context, View view, Editable text, String options, boolean insert)55     public CharacterPickerDialog(Context context, View view,
56                                  Editable text, String options,
57                                  boolean insert) {
58         super(context, com.android.internal.R.style.Theme_Panel);
59 
60         mView = view;
61         mText = text;
62         mOptions = options;
63         mInsert = insert;
64         mInflater = LayoutInflater.from(context);
65     }
66 
67     @Override
onCreate(Bundle savedInstanceState)68     protected void onCreate(Bundle savedInstanceState) {
69         super.onCreate(savedInstanceState);
70 
71         WindowManager.LayoutParams params = getWindow().getAttributes();
72         params.token = mView.getApplicationWindowToken();
73         params.type = params.TYPE_APPLICATION_ATTACHED_DIALOG;
74         params.flags = params.flags | Window.FEATURE_NO_TITLE;
75 
76         setContentView(R.layout.character_picker);
77 
78         GridView grid = (GridView) findViewById(R.id.characterPicker);
79         grid.setAdapter(new OptionsAdapter(getContext()));
80         grid.setOnItemClickListener(this);
81 
82         mCancelButton = (Button) findViewById(R.id.cancel);
83         mCancelButton.setOnClickListener(this);
84     }
85 
86     /**
87      * Handles clicks on the character buttons.
88      */
onItemClick(AdapterView parent, View view, int position, long id)89     public void onItemClick(AdapterView parent, View view, int position, long id) {
90         String result = String.valueOf(mOptions.charAt(position));
91         replaceCharacterAndClose(result);
92     }
93 
replaceCharacterAndClose(CharSequence replace)94     private void replaceCharacterAndClose(CharSequence replace) {
95         int selEnd = Selection.getSelectionEnd(mText);
96         if (mInsert || selEnd == 0) {
97             mText.insert(selEnd, replace);
98         } else {
99             mText.replace(selEnd - 1, selEnd, replace);
100         }
101 
102         dismiss();
103     }
104 
105     /**
106      * Handles clicks on the Cancel button.
107      */
onClick(View v)108     public void onClick(View v) {
109         if (v == mCancelButton) {
110             dismiss();
111         } else if (v instanceof Button) {
112             CharSequence result = ((Button) v).getText();
113             replaceCharacterAndClose(result);
114         }
115     }
116 
117     private class OptionsAdapter extends BaseAdapter {
118 
OptionsAdapter(Context context)119         public OptionsAdapter(Context context) {
120             super();
121         }
122 
getView(int position, View convertView, ViewGroup parent)123         public View getView(int position, View convertView, ViewGroup parent) {
124             Button b = (Button)
125                 mInflater.inflate(R.layout.character_picker_button, null);
126             b.setText(String.valueOf(mOptions.charAt(position)));
127             b.setOnClickListener(CharacterPickerDialog.this);
128             return b;
129         }
130 
getCount()131         public final int getCount() {
132             return mOptions.length();
133         }
134 
getItem(int position)135         public final Object getItem(int position) {
136             return String.valueOf(mOptions.charAt(position));
137         }
138 
getItemId(int position)139         public final long getItemId(int position) {
140             return position;
141         }
142     }
143 }
144