/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.text.method; import com.android.internal.R; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.text.*; import android.view.LayoutInflater; import android.view.View.OnClickListener; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.GridView; /** * Dialog for choosing accented characters related to a base character. */ public class CharacterPickerDialog extends Dialog implements OnItemClickListener, OnClickListener { private View mView; private Editable mText; private String mOptions; private boolean mInsert; private LayoutInflater mInflater; private Button mCancelButton; /** * Creates a new CharacterPickerDialog that presents the specified * options for insertion or replacement (depending on * the sense of insert) into text. */ public CharacterPickerDialog(Context context, View view, Editable text, String options, boolean insert) { super(context, com.android.internal.R.style.Theme_Panel); mView = view; mText = text; mOptions = options; mInsert = insert; mInflater = LayoutInflater.from(context); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WindowManager.LayoutParams params = getWindow().getAttributes(); params.token = mView.getApplicationWindowToken(); params.type = params.TYPE_APPLICATION_ATTACHED_DIALOG; params.flags = params.flags | Window.FEATURE_NO_TITLE; setContentView(R.layout.character_picker); GridView grid = (GridView) findViewById(R.id.characterPicker); grid.setAdapter(new OptionsAdapter(getContext())); grid.setOnItemClickListener(this); mCancelButton = (Button) findViewById(R.id.cancel); mCancelButton.setOnClickListener(this); } /** * Handles clicks on the character buttons. */ public void onItemClick(AdapterView parent, View view, int position, long id) { String result = String.valueOf(mOptions.charAt(position)); replaceCharacterAndClose(result); } private void replaceCharacterAndClose(CharSequence replace) { int selEnd = Selection.getSelectionEnd(mText); if (mInsert || selEnd == 0) { mText.insert(selEnd, replace); } else { mText.replace(selEnd - 1, selEnd, replace); } dismiss(); } /** * Handles clicks on the Cancel button. */ public void onClick(View v) { if (v == mCancelButton) { dismiss(); } else if (v instanceof Button) { CharSequence result = ((Button) v).getText(); replaceCharacterAndClose(result); } } private class OptionsAdapter extends BaseAdapter { public OptionsAdapter(Context context) { super(); } public View getView(int position, View convertView, ViewGroup parent) { Button b = (Button) mInflater.inflate(R.layout.character_picker_button, null); b.setText(String.valueOf(mOptions.charAt(position))); b.setOnClickListener(CharacterPickerDialog.this); return b; } public final int getCount() { return mOptions.length(); } public final Object getItem(int position) { return String.valueOf(mOptions.charAt(position)); } public final long getItemId(int position) { return position; } } }