You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
17 KiB
239 lines
17 KiB
<html>
|
|
<head>
|
|
<title>NoteEditText.java</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<style type="text/css">
|
|
.s0 { color: #8c8c8c; font-style: italic;}
|
|
.s1 { color: #080808;}
|
|
.s2 { color: #0033b3;}
|
|
.s3 { color: #067d17;}
|
|
.s4 { color: #8c8c8c; font-style: italic;}
|
|
.s5 { color: #1750eb;}
|
|
</style>
|
|
</head>
|
|
<body bgcolor="#ffffff">
|
|
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
|
|
<tr><td><center>
|
|
<font face="Arial, Helvetica" color="#000000">
|
|
NoteEditText.java</font>
|
|
</center></td></tr></table>
|
|
<pre><span class="s0">/*
|
|
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
|
*
|
|
* 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.
|
|
*/</span>
|
|
|
|
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
|
|
|
|
<span class="s2">import </span><span class="s1">android.content.Context;</span>
|
|
<span class="s2">import </span><span class="s1">android.graphics.Rect;</span>
|
|
<span class="s2">import </span><span class="s1">android.text.Layout;</span>
|
|
<span class="s2">import </span><span class="s1">android.text.Selection;</span>
|
|
<span class="s2">import </span><span class="s1">android.text.Spanned;</span>
|
|
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
|
|
<span class="s2">import </span><span class="s1">android.text.style.URLSpan;</span>
|
|
<span class="s2">import </span><span class="s1">android.util.AttributeSet;</span>
|
|
<span class="s2">import </span><span class="s1">android.util.Log;</span>
|
|
<span class="s2">import </span><span class="s1">android.view.ContextMenu;</span>
|
|
<span class="s2">import </span><span class="s1">android.view.KeyEvent;</span>
|
|
<span class="s2">import </span><span class="s1">android.view.MenuItem;</span>
|
|
<span class="s2">import </span><span class="s1">android.view.MenuItem.OnMenuItemClickListener;</span>
|
|
<span class="s2">import </span><span class="s1">android.view.MotionEvent;</span>
|
|
<span class="s2">import </span><span class="s1">android.widget.EditText;</span>
|
|
|
|
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
|
|
|
|
<span class="s2">import </span><span class="s1">java.util.HashMap;</span>
|
|
<span class="s2">import </span><span class="s1">java.util.Map;</span>
|
|
|
|
<span class="s2">public class </span><span class="s1">NoteEditText </span><span class="s2">extends </span><span class="s1">EditText {</span>
|
|
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">"NoteEditText"</span><span class="s1">;</span>
|
|
<span class="s2">private int </span><span class="s1">mIndex;</span>
|
|
<span class="s2">private int </span><span class="s1">mSelectionStartBeforeDelete;</span>
|
|
|
|
<span class="s2">private static final </span><span class="s1">String SCHEME_TEL = </span><span class="s3">"tel:" </span><span class="s1">;</span>
|
|
<span class="s2">private static final </span><span class="s1">String SCHEME_HTTP = </span><span class="s3">"http:" </span><span class="s1">;</span>
|
|
<span class="s2">private static final </span><span class="s1">String SCHEME_EMAIL = </span><span class="s3">"mailto:" </span><span class="s1">;</span>
|
|
|
|
<span class="s2">private static final </span><span class="s1">Map<String, Integer> sSchemaActionResMap = </span><span class="s2">new </span><span class="s1">HashMap<String, Integer>();</span>
|
|
<span class="s2">static </span><span class="s1">{</span>
|
|
<span class="s1">sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel);</span>
|
|
<span class="s1">sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web);</span>
|
|
<span class="s1">sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email);</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s0">/**</span>
|
|
<span class="s0">* Call by the {</span><span class="s4">@link </span><span class="s0">NoteEditActivity} to delete or add edit text</span>
|
|
<span class="s0">*/</span>
|
|
<span class="s2">public interface </span><span class="s1">OnTextViewChangeListener {</span>
|
|
<span class="s0">/**</span>
|
|
<span class="s0">* Delete current edit text when {</span><span class="s4">@link </span><span class="s0">KeyEvent#KEYCODE_DEL} happens</span>
|
|
<span class="s0">* and the text is null</span>
|
|
<span class="s0">*/</span>
|
|
<span class="s2">void </span><span class="s1">onEditTextDelete(</span><span class="s2">int </span><span class="s1">index, String text);</span>
|
|
|
|
<span class="s0">/**</span>
|
|
<span class="s0">* Add edit text after current edit text when {</span><span class="s4">@link </span><span class="s0">KeyEvent#KEYCODE_ENTER}</span>
|
|
<span class="s0">* happen</span>
|
|
<span class="s0">*/</span>
|
|
<span class="s2">void </span><span class="s1">onEditTextEnter(</span><span class="s2">int </span><span class="s1">index, String text);</span>
|
|
|
|
<span class="s0">/**</span>
|
|
<span class="s0">* Hide or show item option when text change</span>
|
|
<span class="s0">*/</span>
|
|
<span class="s2">void </span><span class="s1">onTextChange(</span><span class="s2">int </span><span class="s1">index, </span><span class="s2">boolean </span><span class="s1">hasText);</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s2">private </span><span class="s1">OnTextViewChangeListener mOnTextViewChangeListener;</span>
|
|
|
|
<span class="s2">public </span><span class="s1">NoteEditText(Context context) {</span>
|
|
<span class="s2">super</span><span class="s1">(context, </span><span class="s2">null</span><span class="s1">);</span>
|
|
<span class="s1">mIndex = </span><span class="s5">0</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s2">public void </span><span class="s1">setIndex(</span><span class="s2">int </span><span class="s1">index) {</span>
|
|
<span class="s1">mIndex = index;</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s2">public void </span><span class="s1">setOnTextViewChangeListener(OnTextViewChangeListener listener) {</span>
|
|
<span class="s1">mOnTextViewChangeListener = listener;</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s2">public </span><span class="s1">NoteEditText(Context context, AttributeSet attrs) {</span>
|
|
<span class="s2">super</span><span class="s1">(context, attrs, android.R.attr.editTextStyle);</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s2">public </span><span class="s1">NoteEditText(Context context, AttributeSet attrs, </span><span class="s2">int </span><span class="s1">defStyle) {</span>
|
|
<span class="s2">super</span><span class="s1">(context, attrs, defStyle);</span>
|
|
<span class="s0">// TODO Auto-generated constructor stub</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s1">@Override</span>
|
|
<span class="s2">public boolean </span><span class="s1">onTouchEvent(MotionEvent event) {</span>
|
|
<span class="s2">switch </span><span class="s1">(event.getAction()) {</span>
|
|
<span class="s2">case </span><span class="s1">MotionEvent.ACTION_DOWN:</span>
|
|
|
|
<span class="s2">int </span><span class="s1">x = (</span><span class="s2">int</span><span class="s1">) event.getX();</span>
|
|
<span class="s2">int </span><span class="s1">y = (</span><span class="s2">int</span><span class="s1">) event.getY();</span>
|
|
<span class="s1">x -= getTotalPaddingLeft();</span>
|
|
<span class="s1">y -= getTotalPaddingTop();</span>
|
|
<span class="s1">x += getScrollX();</span>
|
|
<span class="s1">y += getScrollY();</span>
|
|
|
|
<span class="s1">Layout layout = getLayout();</span>
|
|
<span class="s2">int </span><span class="s1">line = layout.getLineForVertical(y);</span>
|
|
<span class="s2">int </span><span class="s1">off = layout.getOffsetForHorizontal(line, x);</span>
|
|
<span class="s1">Selection.setSelection(getText(), off);</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s2">return super</span><span class="s1">.onTouchEvent(event);</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s1">@Override</span>
|
|
<span class="s2">public boolean </span><span class="s1">onKeyDown(</span><span class="s2">int </span><span class="s1">keyCode, KeyEvent event) {</span>
|
|
<span class="s2">switch </span><span class="s1">(keyCode) {</span>
|
|
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_ENTER:</span>
|
|
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
|
|
<span class="s2">return false</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_DEL:</span>
|
|
<span class="s1">mSelectionStartBeforeDelete = getSelectionStart();</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s2">default</span><span class="s1">:</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
<span class="s2">return super</span><span class="s1">.onKeyDown(keyCode, event);</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s1">@Override</span>
|
|
<span class="s2">public boolean </span><span class="s1">onKeyUp(</span><span class="s2">int </span><span class="s1">keyCode, KeyEvent event) {</span>
|
|
<span class="s2">switch</span><span class="s1">(keyCode) {</span>
|
|
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_DEL:</span>
|
|
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
|
|
<span class="s2">if </span><span class="s1">(</span><span class="s5">0 </span><span class="s1">== mSelectionStartBeforeDelete && mIndex != </span><span class="s5">0</span><span class="s1">) {</span>
|
|
<span class="s1">mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString());</span>
|
|
<span class="s2">return true</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
|
|
<span class="s1">Log.d(TAG, </span><span class="s3">"OnTextViewChangeListener was not seted"</span><span class="s1">);</span>
|
|
<span class="s1">}</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_ENTER:</span>
|
|
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
|
|
<span class="s2">int </span><span class="s1">selectionStart = getSelectionStart();</span>
|
|
<span class="s1">String text = getText().subSequence(selectionStart, length()).toString();</span>
|
|
<span class="s1">setText(getText().subSequence(</span><span class="s5">0</span><span class="s1">, selectionStart));</span>
|
|
<span class="s1">mOnTextViewChangeListener.onEditTextEnter(mIndex + </span><span class="s5">1</span><span class="s1">, text);</span>
|
|
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
|
|
<span class="s1">Log.d(TAG, </span><span class="s3">"OnTextViewChangeListener was not seted"</span><span class="s1">);</span>
|
|
<span class="s1">}</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s2">default</span><span class="s1">:</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
<span class="s2">return super</span><span class="s1">.onKeyUp(keyCode, event);</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s1">@Override</span>
|
|
<span class="s2">protected void </span><span class="s1">onFocusChanged(</span><span class="s2">boolean </span><span class="s1">focused, </span><span class="s2">int </span><span class="s1">direction, Rect previouslyFocusedRect) {</span>
|
|
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
|
|
<span class="s2">if </span><span class="s1">(!focused && TextUtils.isEmpty(getText())) {</span>
|
|
<span class="s1">mOnTextViewChangeListener.onTextChange(mIndex, </span><span class="s2">false</span><span class="s1">);</span>
|
|
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
|
|
<span class="s1">mOnTextViewChangeListener.onTextChange(mIndex, </span><span class="s2">true</span><span class="s1">);</span>
|
|
<span class="s1">}</span>
|
|
<span class="s1">}</span>
|
|
<span class="s2">super</span><span class="s1">.onFocusChanged(focused, direction, previouslyFocusedRect);</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s1">@Override</span>
|
|
<span class="s2">protected void </span><span class="s1">onCreateContextMenu(ContextMenu menu) {</span>
|
|
<span class="s2">if </span><span class="s1">(getText() </span><span class="s2">instanceof </span><span class="s1">Spanned) {</span>
|
|
<span class="s2">int </span><span class="s1">selStart = getSelectionStart();</span>
|
|
<span class="s2">int </span><span class="s1">selEnd = getSelectionEnd();</span>
|
|
|
|
<span class="s2">int </span><span class="s1">min = Math.min(selStart, selEnd);</span>
|
|
<span class="s2">int </span><span class="s1">max = Math.max(selStart, selEnd);</span>
|
|
|
|
<span class="s2">final </span><span class="s1">URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.</span><span class="s2">class</span><span class="s1">);</span>
|
|
<span class="s2">if </span><span class="s1">(urls.length == </span><span class="s5">1</span><span class="s1">) {</span>
|
|
<span class="s2">int </span><span class="s1">defaultResId = </span><span class="s5">0</span><span class="s1">;</span>
|
|
<span class="s2">for</span><span class="s1">(String schema: sSchemaActionResMap.keySet()) {</span>
|
|
<span class="s2">if</span><span class="s1">(urls[</span><span class="s5">0</span><span class="s1">].getURL().indexOf(schema) >= </span><span class="s5">0</span><span class="s1">) {</span>
|
|
<span class="s1">defaultResId = sSchemaActionResMap.get(schema);</span>
|
|
<span class="s2">break</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s2">if </span><span class="s1">(defaultResId == </span><span class="s5">0</span><span class="s1">) {</span>
|
|
<span class="s1">defaultResId = R.string.note_link_other;</span>
|
|
<span class="s1">}</span>
|
|
|
|
<span class="s1">menu.add(</span><span class="s5">0</span><span class="s1">, </span><span class="s5">0</span><span class="s1">, </span><span class="s5">0</span><span class="s1">, defaultResId).setOnMenuItemClickListener(</span>
|
|
<span class="s2">new </span><span class="s1">OnMenuItemClickListener() {</span>
|
|
<span class="s2">public boolean </span><span class="s1">onMenuItemClick(MenuItem item) {</span>
|
|
<span class="s0">// goto a new intent</span>
|
|
<span class="s1">urls[</span><span class="s5">0</span><span class="s1">].onClick(NoteEditText.</span><span class="s2">this</span><span class="s1">);</span>
|
|
<span class="s2">return true</span><span class="s1">;</span>
|
|
<span class="s1">}</span>
|
|
<span class="s1">});</span>
|
|
<span class="s1">}</span>
|
|
<span class="s1">}</span>
|
|
<span class="s2">super</span><span class="s1">.onCreateContextMenu(menu);</span>
|
|
<span class="s1">}</span>
|
|
<span class="s1">}</span>
|
|
</pre>
|
|
</body>
|
|
</html> |