|
|
|
|
@ -30,11 +30,16 @@ import android.content.SharedPreferences;
|
|
|
|
|
import android.graphics.Paint;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.preference.PreferenceManager;
|
|
|
|
|
import android.text.Html;
|
|
|
|
|
import android.text.Spannable;
|
|
|
|
|
import android.text.SpannableString;
|
|
|
|
|
import android.text.Spanned;
|
|
|
|
|
import android.text.TextUtils;
|
|
|
|
|
import android.text.format.DateUtils;
|
|
|
|
|
import android.text.style.BackgroundColorSpan;
|
|
|
|
|
import android.text.style.StrikethroughSpan;
|
|
|
|
|
import android.text.style.StyleSpan;
|
|
|
|
|
import android.text.style.UnderlineSpan;
|
|
|
|
|
import android.util.Log;
|
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
|
import android.view.Menu;
|
|
|
|
|
@ -298,7 +303,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
switchToListMode(mWorkingNote.getContent()); // 切换到列表模式
|
|
|
|
|
} else {
|
|
|
|
|
mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
|
|
|
|
|
// 加载富文本内容
|
|
|
|
|
String content = mWorkingNote.getContent();
|
|
|
|
|
CharSequence htmlContent = Html.fromHtml(content != null ? content : "");
|
|
|
|
|
mNoteEditor.setText(getHighlightQueryResult(htmlContent, mUserQuery));
|
|
|
|
|
mNoteEditor.setSelection(mNoteEditor.getText().length()); // 光标移到最后
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -643,6 +651,18 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
case R.id.menu_delete_remind:
|
|
|
|
|
mWorkingNote.setAlertDate(0, false); // 删除提醒
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_bold:
|
|
|
|
|
applyRichTextStyle(android.graphics.Typeface.BOLD);
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_italic:
|
|
|
|
|
applyRichTextStyle(android.graphics.Typeface.ITALIC);
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_underline:
|
|
|
|
|
applyUnderlineStyle();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.menu_strikethrough:
|
|
|
|
|
applyStrikethroughStyle();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
@ -846,9 +866,9 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
/**
|
|
|
|
|
* 获取高亮搜索结果的Spannable文本
|
|
|
|
|
*/
|
|
|
|
|
private Spannable getHighlightQueryResult(String fullText, String userQuery) {
|
|
|
|
|
private Spannable getHighlightQueryResult(CharSequence fullText, String userQuery) {
|
|
|
|
|
SpannableString spannable = new SpannableString(fullText == null ? "" : fullText);
|
|
|
|
|
if (!TextUtils.isEmpty(userQuery)) {
|
|
|
|
|
if (!TextUtils.isEmpty(userQuery) && !TextUtils.isEmpty(fullText)) {
|
|
|
|
|
mPattern = Pattern.compile(userQuery);
|
|
|
|
|
Matcher m = mPattern.matcher(fullText);
|
|
|
|
|
int start = 0;
|
|
|
|
|
@ -900,7 +920,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
// 设置编辑文本变化监听器
|
|
|
|
|
edit.setOnTextViewChangeListener(this);
|
|
|
|
|
edit.setIndex(index); // 设置索引
|
|
|
|
|
edit.setText(getHighlightQueryResult(item, mUserQuery)); // 设置文本(支持高亮)
|
|
|
|
|
// 列表模式下不使用富文本,直接设置文本
|
|
|
|
|
edit.setText(item); // 设置文本
|
|
|
|
|
return view;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -954,17 +975,22 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
if (!TextUtils.isEmpty(edit.getText())) {
|
|
|
|
|
// 根据复选框状态添加不同的标记
|
|
|
|
|
if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) {
|
|
|
|
|
sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n");
|
|
|
|
|
sb.append(TAG_CHECKED).append(" " ).append(edit.getText()).append("\n" );
|
|
|
|
|
hasChecked = true;
|
|
|
|
|
} else {
|
|
|
|
|
sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n");
|
|
|
|
|
sb.append(TAG_UNCHECKED).append(" " ).append(edit.getText()).append("\n" );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mWorkingNote.setWorkingText(sb.toString());
|
|
|
|
|
} else {
|
|
|
|
|
// 普通模式:直接获取编辑框文本
|
|
|
|
|
mWorkingNote.setWorkingText(mNoteEditor.getText().toString());
|
|
|
|
|
// 普通模式:将富文本转换为HTML格式保存
|
|
|
|
|
if (mNoteEditor.getText() instanceof Spanned) {
|
|
|
|
|
String htmlContent = Html.toHtml((Spanned) mNoteEditor.getText());
|
|
|
|
|
mWorkingNote.setWorkingText(htmlContent);
|
|
|
|
|
} else {
|
|
|
|
|
mWorkingNote.setWorkingText(mNoteEditor.getText().toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return hasChecked;
|
|
|
|
|
}
|
|
|
|
|
@ -986,6 +1012,152 @@ public class NoteEditActivity extends Activity implements OnClickListener,
|
|
|
|
|
return saved;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 应用富文本样式(粗体或斜体)
|
|
|
|
|
*/
|
|
|
|
|
private void applyRichTextStyle(int style) {
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
// 列表模式下,获取当前焦点的编辑框
|
|
|
|
|
for (int i = 0; i < mEditTextList.getChildCount(); i++) {
|
|
|
|
|
NoteEditText editText = (NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text);
|
|
|
|
|
if (editText.hasFocus()) {
|
|
|
|
|
applyStyleToEditText(editText, style);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 普通模式下,直接应用到主编辑框
|
|
|
|
|
applyStyleToEditText(mNoteEditor, style);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 应用下划线样式
|
|
|
|
|
*/
|
|
|
|
|
private void applyUnderlineStyle() {
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
// 列表模式下,获取当前焦点的编辑框
|
|
|
|
|
for (int i = 0; i < mEditTextList.getChildCount(); i++) {
|
|
|
|
|
NoteEditText editText = (NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text);
|
|
|
|
|
if (editText.hasFocus()) {
|
|
|
|
|
applyUnderlineToEditText(editText);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 普通模式下,直接应用到主编辑框
|
|
|
|
|
applyUnderlineToEditText(mNoteEditor);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 应用删除线样式
|
|
|
|
|
*/
|
|
|
|
|
private void applyStrikethroughStyle() {
|
|
|
|
|
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
|
|
|
|
|
// 列表模式下,获取当前焦点的编辑框
|
|
|
|
|
for (int i = 0; i < mEditTextList.getChildCount(); i++) {
|
|
|
|
|
NoteEditText editText = (NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text);
|
|
|
|
|
if (editText.hasFocus()) {
|
|
|
|
|
applyStrikethroughToEditText(editText);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 普通模式下,直接应用到主编辑框
|
|
|
|
|
applyStrikethroughToEditText(mNoteEditor);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 向EditText应用样式(粗体或斜体)
|
|
|
|
|
*/
|
|
|
|
|
private void applyStyleToEditText(EditText editText, int style) {
|
|
|
|
|
int start = editText.getSelectionStart();
|
|
|
|
|
int end = editText.getSelectionEnd();
|
|
|
|
|
|
|
|
|
|
if (start != end) {
|
|
|
|
|
SpannableString spannable = new SpannableString(editText.getText());
|
|
|
|
|
StyleSpan[] existingSpans = spannable.getSpans(start, end, StyleSpan.class);
|
|
|
|
|
|
|
|
|
|
// 检查是否已经应用了相同的样式
|
|
|
|
|
boolean hasStyle = false;
|
|
|
|
|
for (StyleSpan span : existingSpans) {
|
|
|
|
|
if (span.getStyle() == style) {
|
|
|
|
|
hasStyle = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasStyle) {
|
|
|
|
|
// 如果已经应用了相同的样式,则移除
|
|
|
|
|
for (StyleSpan span : existingSpans) {
|
|
|
|
|
if (span.getStyle() == style) {
|
|
|
|
|
spannable.removeSpan(span);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 如果没有应用相同的样式,则添加
|
|
|
|
|
spannable.setSpan(new StyleSpan(style), start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
editText.setText(spannable);
|
|
|
|
|
editText.setSelection(end);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 向EditText应用下划线样式
|
|
|
|
|
*/
|
|
|
|
|
private void applyUnderlineToEditText(EditText editText) {
|
|
|
|
|
int start = editText.getSelectionStart();
|
|
|
|
|
int end = editText.getSelectionEnd();
|
|
|
|
|
|
|
|
|
|
if (start != end) {
|
|
|
|
|
SpannableString spannable = new SpannableString(editText.getText());
|
|
|
|
|
UnderlineSpan[] existingSpans = spannable.getSpans(start, end, UnderlineSpan.class);
|
|
|
|
|
|
|
|
|
|
if (existingSpans.length > 0) {
|
|
|
|
|
// 如果已经应用了下划线,则移除
|
|
|
|
|
for (UnderlineSpan span : existingSpans) {
|
|
|
|
|
spannable.removeSpan(span);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 如果没有应用下划线,则添加
|
|
|
|
|
spannable.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
editText.setText(spannable);
|
|
|
|
|
editText.setSelection(end);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 向EditText应用删除线样式
|
|
|
|
|
*/
|
|
|
|
|
private void applyStrikethroughToEditText(EditText editText) {
|
|
|
|
|
int start = editText.getSelectionStart();
|
|
|
|
|
int end = editText.getSelectionEnd();
|
|
|
|
|
|
|
|
|
|
if (start != end) {
|
|
|
|
|
SpannableString spannable = new SpannableString(editText.getText());
|
|
|
|
|
StrikethroughSpan[] existingSpans = spannable.getSpans(start, end, StrikethroughSpan.class);
|
|
|
|
|
|
|
|
|
|
if (existingSpans.length > 0) {
|
|
|
|
|
// 如果已经应用了删除线,则移除
|
|
|
|
|
for (StrikethroughSpan span : existingSpans) {
|
|
|
|
|
spannable.removeSpan(span);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 如果没有应用删除线,则添加
|
|
|
|
|
spannable.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
editText.setText(spannable);
|
|
|
|
|
editText.setSelection(end);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发送到桌面(创建快捷方式)
|
|
|
|
|
*/
|
|
|
|
|
|