1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License.
6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at
7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and
14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License.
15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpackage jp.co.omronsoft.openwnn;
18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.app.Activity;
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.app.AlertDialog;
21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.app.Dialog;
223feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawaimport android.content.DialogInterface;
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.content.Intent;
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.os.Bundle;
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.Editable;
26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.text.TextWatcher;
27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.util.Log;
28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.KeyEvent;
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.View;
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.view.Window;
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.Button;
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.EditText;
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.TextView;
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectimport android.widget.Toast;
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/**
373feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa * The abstract class for user dictionary's word editor.
383feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa *
39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * @author Copyright (C) 2009, OMRON SOFTWARE CO., LTD.  All Rights Reserved.
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectpublic abstract class UserDictionaryToolsEdit extends Activity implements View.OnClickListener {
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The class information for intent(Set this informations in the extend class) */
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected String  mListViewName;
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The class information for intent(Set this informations in the extend class) */
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected String  mPackageName;
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
47053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The operation mode (Unknown) */
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int STATE_UNKNOWN = 0;
49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The operation mode (Add the word) */
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int STATE_INSERT = 1;
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The operation mode (Edit the word) */
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int STATE_EDIT = 2;
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Maximum length of a word's string */
55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int MAX_TEXT_SIZE = 20;
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The error code (Already registered the same word) */
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int RETURN_SAME_WORD = -11;
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The focus view and pair view */
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static View sFocusingView = null;
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static View sFocusingPairView = null;
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** Widgets which constitute this screen of activity */
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private EditText mReadEditText;
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private EditText mCandidateEditText;
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private Button mEntryButton;
683feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa    private Button mCancelButton;
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The word information which contains the previous information */
71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private WnnWord mBeforeEditWnnWord;
72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The instance of word list activity */
73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private UserDictionaryToolsList mListInstance;
74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The constant for notifying dialog (Already exists the specified word) */
76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int DIALOG_CONTROL_WORDS_DUPLICATE = 0;
77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The constant for notifying dialog (The length of specified stroke or candidate exceeds the limit) */
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private static final int DIALOG_CONTROL_OVER_MAX_TEXT_SIZE = 1;
79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /** The operation mode of this activity */
81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private int mRequestState;
82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public UserDictionaryToolsEdit() {
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super();
88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Constructor
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  focusView      The information of view
94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  focusPairView  The information of pair of view
95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
967b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    public UserDictionaryToolsEdit(View focusView, View focusPairView) {
97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super();
98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        sFocusingView = focusView;
99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        sFocusingPairView = focusPairView;
100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Send the specified event to IME
104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param ev    The event object
1067b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @return      {@code true} if this event is processed.
107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected abstract boolean sendEventToIME(OpenWnnEvent ev);
109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1107b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see android.app.Activity#onCreate */
1117b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    @Override protected void onCreate(Bundle savedInstanceState) {
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        super.onCreate(savedInstanceState);
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1157b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* create view from XML layout */
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setContentView(R.layout.user_dictionary_tools_edit);
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1187b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* get widgets */
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mEntryButton = (Button)findViewById(R.id.addButton);
1203feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        mCancelButton = (Button)findViewById(R.id.cancelButton);
121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mReadEditText = (EditText)findViewById(R.id.editRead);
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandidateEditText = (EditText)findViewById(R.id.editCandidate);
1237b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1247b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* set the listener */
1257b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mEntryButton.setOnClickListener(this);
1263feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        mCancelButton.setOnClickListener(this);
1277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1287b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* initialize */
1297b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        mRequestState = STATE_UNKNOWN;
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mReadEditText.setSingleLine();
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandidateEditText.setSingleLine();
1327b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1337b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* get the request and do it */
1347b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        Intent intent = getIntent();
1357b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        String action = intent.getAction();
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (action.equals(Intent.ACTION_INSERT)) {
13777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            /* add a word */
138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mEntryButton.setEnabled(false);
139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mRequestState = STATE_INSERT;
140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else if (action.equals(Intent.ACTION_EDIT)) {
14177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            /* edit a word */
142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mEntryButton.setEnabled(true);
143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mReadEditText.setText(((TextView)sFocusingView).getText());
144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mCandidateEditText.setText(((TextView)sFocusingPairView).getText());
145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mRequestState = STATE_EDIT;
1467b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
1477b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            /* save the word's information before this edit */
1487b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mBeforeEditWnnWord = new WnnWord();
1497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mBeforeEditWnnWord.stroke = ((TextView)sFocusingView).getText().toString();
1507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            mBeforeEditWnnWord.candidate = ((TextView)sFocusingPairView).getText().toString();
151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
15277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            /* finish if it is unknown request */
153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Log.e("OpenWnn", "onCreate() : Invaled Get Intent. ID=" + intent);
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            finish();
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return;
156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,
159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                  R.layout.user_dictionary_tools_edit_header);
160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* set control buttons */
162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        setAddButtonControl();
163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
1667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see android.app.Activity#onKeyDown */
1677b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    @Override public boolean onKeyDown(int keyCode, KeyEvent event) {
1687b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        if (keyCode == KeyEvent.KEYCODE_BACK) {
1697b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa            /* go back to the word list view */
170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            screenTransition();
1710470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa            return true;
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
1730470b8581ba08779a7cc223c050e7b3556891f45Daisuke Miyakawa        return super.onKeyDown(keyCode, event);
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
1777b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Change the state of the "Add" button into the depending state of input area.
178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void setAddButtonControl() {
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
181e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* Text changed listener for the reading text */
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mReadEditText.addTextChangedListener(new TextWatcher() {
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void afterTextChanged(Editable s) {
184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void onTextChanged(CharSequence s, int start, int before, int count) {
188e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                /* Enable/disable the "Add" button */
18977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                if ((mReadEditText.getText().toString().length() != 0) &&
190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    (mCandidateEditText.getText().toString().length() != 0)) {
19177ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    mEntryButton.setEnabled(true);
192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
19377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                    mEntryButton.setEnabled(false);
194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        });
197e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* Text changed listener for the candidate text */
198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mCandidateEditText.addTextChangedListener(new TextWatcher() {
199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void afterTextChanged(Editable s) {
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            public void onTextChanged(CharSequence s, int start, int before, int count) {
204e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            	/* Enable/disable the "Add" button */
205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if ((mReadEditText.getText().toString().length() != 0) &&
206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    (mCandidateEditText.getText().toString().length() != 0)) {
207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mEntryButton.setEnabled(true);
208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    mEntryButton.setEnabled(false);
210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        });
213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
2167b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    /** @see android.view.View.OnClickListener */
217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    public void onClick(View v) {
2183feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
2193feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        mEntryButton.setEnabled(false);
2203feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa        mCancelButton.setEnabled(false);
2213feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa
22277ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa        switch (v.getId()) {
223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case R.id.addButton:
22477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                /* save the word */
225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                doSaveAction();
226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2277b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case R.id.cancelButton:
22977ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                /* cancel the edit */
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                doRevertAction();
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                break;
2327b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            default:
234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                Log.e("OpenWnn", "onClick: Get Invalid ButtonID. ID=" + v.getId());
235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                finish();
23677ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                return;
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Process the adding or editing action
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void doSaveAction() {
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (mRequestState) {
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case STATE_INSERT:
24777ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            /* register a word */
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (inputDataCheck(mReadEditText) && inputDataCheck(mCandidateEditText)) {
2497b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    String stroke = mReadEditText.getText().toString();
2507b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    String candidate = mCandidateEditText.getText().toString();
2517b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    if (addDictionary(stroke, candidate)) {
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        screenTransition();
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case STATE_EDIT:
25877ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa            /* edit a word (=delete the word selected & add the word edited) */
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (inputDataCheck(mReadEditText) && inputDataCheck(mCandidateEditText)) {
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                deleteDictionary(mBeforeEditWnnWord);
2617b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    String stroke = mReadEditText.getText().toString();
2627b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    String candidate = mCandidateEditText.getText().toString();
2637b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    if (addDictionary(stroke, candidate)) {
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        screenTransition();
2657b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                    } else {
2667b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa                        addDictionary(mBeforeEditWnnWord.stroke, mBeforeEditWnnWord.candidate);
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Log.e("OpenWnn", "doSaveAction: Invalid Add Status. Status=" + mRequestState);
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Process the cancel action
279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void doRevertAction() {
2817b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        /* go back to the words list */
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        screenTransition();
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
2867b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * Create the alert dialog for notifying the error
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  id        The dialog ID
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @return           The information of the dialog
290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
2917b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    @Override protected Dialog onCreateDialog(int id) {
2927b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        switch (id) {
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case DIALOG_CONTROL_WORDS_DUPLICATE:
29477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                /* there is the same word in the dictionary */
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return new AlertDialog.Builder(UserDictionaryToolsEdit.this)
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .setIcon(android.R.drawable.ic_dialog_alert)
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .setMessage(R.string.user_dictionary_words_duplication_message)
2983feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
2993feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                            public void onClick(DialogInterface dialog, int whichButton) {
3003feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                                mEntryButton.setEnabled(true);
3013feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                                mCancelButton.setEnabled(true);
3023feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                            }
3033feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        })
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .setCancelable(true)
305e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        .setOnCancelListener(new DialogInterface.OnCancelListener() {
306e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            public void onCancel(DialogInterface dialog) {
307e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                mEntryButton.setEnabled(true);
308e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                                mCancelButton.setEnabled(true);
309e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                            }
310e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa                        })
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .create();
3127b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa
313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            case DIALOG_CONTROL_OVER_MAX_TEXT_SIZE:
31477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                /* the length of the word exceeds the limit */
31577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa                return new AlertDialog.Builder(UserDictionaryToolsEdit.this)
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .setIcon(android.R.drawable.ic_dialog_alert)
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .setMessage(R.string.user_dictionary_over_max_text_size_message)
3183feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
3193feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                            public void onClick(DialogInterface dialog, int witchButton) {
3203feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                                mEntryButton.setEnabled(true);
3213feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                                mCancelButton.setEnabled(true);
3223feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                            }
3233feb3d26d59be1626c59b72654020179e2b2ebe0Daisuke Miyakawa                        })
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .setCancelable(true)
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        .create();
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return super.onCreateDialog(id);
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Add the word
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
33377ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param  stroke       The stroke of the word
33477ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @param  candidate    The string of the word
33577ffa9b0b986a2d70143f63cdaa8451bf1674f84Daisuke Miyakawa     * @return              {@code true} if success; {@code false} if fail.
336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
3377b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa    private boolean addDictionary(String stroke, String candidate) {
338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean ret;
339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
340e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* create WnnWord from the strings */
341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        WnnWord wnnWordAdd = new WnnWord();
3427b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        wnnWordAdd.stroke = stroke;
3437b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa        wnnWordAdd.candidate = candidate;
344e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* add word event */
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        OpenWnnEvent event = new OpenWnnEvent(OpenWnnEvent.ADD_WORD,
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                  WnnEngine.DICTIONARY_TYPE_USER,
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                  wnnWordAdd);
348e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* notify the event to IME */
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = sendEventToIME(event);
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (ret == false) {
351e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* get error code if the process in IME is failed */
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            int ret_code = event.errorCode;
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (ret_code == RETURN_SAME_WORD) {
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                showDialog(DIALOG_CONTROL_WORDS_DUPLICATE);
355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
357e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa            /* update the dictionary */
358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            mListInstance = createUserDictionaryToolsList();
359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Delete the word
365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param  word     The information of word
367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void deleteDictionary(WnnWord word) {
369e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* delete the word from the dictionary */
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        mListInstance = createUserDictionaryToolsList();
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        boolean deleted = mListInstance.deleteWord(word);
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (!deleted) {
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Toast.makeText(getApplicationContext(),
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                           R.string.user_dictionary_delete_fail,
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                           Toast.LENGTH_LONG).show();
376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Create the instance of UserDictionaryToolList object
381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    protected abstract UserDictionaryToolsList createUserDictionaryToolsList();
383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Check the input string
386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     *
387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * @param   v       The information of view
3887b3b414976b6b3d6d85459de79e843d5ab35ed06Daisuke Miyakawa     * @return          {@code true} if success; {@code false} if fail.
389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private boolean inputDataCheck(View v) {
391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
392e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* return false if the length of the string exceeds the limit. */
393f66e64c9108f64da8c301fe1830e3165eccac5ffDaisuke Miyakawa        if ((((TextView)v).getText().length()) > MAX_TEXT_SIZE) {
394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            showDialog(DIALOG_CONTROL_OVER_MAX_TEXT_SIZE);
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            Log.e("OpenWnn", "inputDataCheck() : over max string length.");
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return false;
397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return true;
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    /**
403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     * Transit the new state
404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     */
405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    private void screenTransition() {
406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        finish();
407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
408e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa        /* change to the word listing window */
409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        Intent intent = new Intent();
410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        intent.setClassName(mPackageName, mListViewName);
411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        startActivity(intent);
412e83971e4dafd53e9fb00386355afdbae7e00c0cfDaisuke Miyakawa
413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
416