@ -92,6 +92,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private static final Map < Integer , Integer > sBgSelectorBtnsMap = new HashMap < Integer , Integer > ( ) ;
static {
sBgSelectorBtnsMap . put ( R . id . iv_bg_yellow , ResourceParser . YELLOW ) ; // 黄色背景按钮
sBgSelectorBtnsMap . put ( R . id . iv_bg_red , ResourceParser . RED ) ; // 红色背景按钮
@ -101,6 +102,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private static final Map < Integer , Integer > sBgSelectorSelectionMap = new HashMap < Integer , Integer > ( ) ;
static {
sBgSelectorSelectionMap . put ( ResourceParser . YELLOW , R . id . iv_bg_yellow_select ) ; // 选择的黄色背景按钮
sBgSelectorSelectionMap . put ( ResourceParser . RED , R . id . iv_bg_red_select ) ; // 选择的红色背景按钮
@ -110,6 +112,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private static final Map < Integer , Integer > sFontSizeBtnsMap = new HashMap < Integer , Integer > ( ) ;
static {
sFontSizeBtnsMap . put ( R . id . ll_font_large , ResourceParser . TEXT_LARGE ) ; // 大号字体按钮
sFontSizeBtnsMap . put ( R . id . ll_font_small , ResourceParser . TEXT_SMALL ) ; // 小号字体按钮
@ -118,6 +121,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private static final Map < Integer , Integer > sFontSelectorSelectionMap = new HashMap < Integer , Integer > ( ) ;
static {
sFontSelectorSelectionMap . put ( ResourceParser . TEXT_LARGE , R . id . iv_large_select ) ; // 选择的大号字体按钮
sFontSelectorSelectionMap . put ( ResourceParser . TEXT_SMALL , R . id . iv_small_select ) ; // 选择的小号字体按钮
@ -157,6 +161,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private Pattern mPattern ; // 模式
private EditText editText ; // 编辑框
private TextView textView ; // 文本视图
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState ) ;
@ -169,7 +174,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
initResources ( ) ;
count ( ) ;
}
private void count ( ) {
private void count ( ) {
mNoteEditor . addTextChangedListener ( new TextWatcher ( ) {
int currentLength = 0 ;
@ -186,6 +192,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
} ) ;
}
/ * *
* Current activity may be killed when the memory is low . Once it is killed , for another time
* user load this activity , we should restore the former state
@ -239,7 +246,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
getWindow ( ) . setSoftInputMode (
WindowManager . LayoutParams . SOFT_INPUT_STATE_HIDDEN
| WindowManager . LayoutParams . SOFT_INPUT_ADJUST_RESIZE ) ;
} else if ( TextUtils . equals ( Intent . ACTION_INSERT_OR_EDIT , intent . getAction ( ) ) ) {
} else if ( TextUtils . equals ( Intent . ACTION_INSERT_OR_EDIT , intent . getAction ( ) ) ) {
// New note
long folderId = intent . getLongExtra ( Notes . INTENT_EXTRA_FOLDER_ID , 0 ) ;
int widgetId = intent . getIntExtra ( Notes . INTENT_EXTRA_WIDGET_ID ,
@ -280,11 +287,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
| WindowManager . LayoutParams . SOFT_INPUT_STATE_VISIBLE ) ;
} else {
Log . e ( TAG , "Intent not specified action, should not support" ) ;
finish ( ) ;
finish ( ) ; // 初始化状态失败, 结束当前Activity
return false ;
}
mWorkingNote . setOnSettingStatusChangedListener ( this ) ;
return true ;
return true ; // 输出日志信息, 表示正在从被销毁的Activity中进行恢复
}
@Override
@ -293,21 +300,25 @@ public class NoteEditActivity extends Activity implements OnClickListener,
initNoteScreen ( ) ;
}
private void initNoteScreen ( ) {
private void initNoteScreen ( ) { // 设置文本样式为指定字体大小
mNoteEditor . setTextAppearance ( this , TextAppearanceResources
. getTexAppearanceResource ( mFontSizeId ) ) ;
// 根据笔记的模式切换到对应的列表模式或文本模式
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
switchToListMode ( mWorkingNote . getContent ( ) ) ;
} else {
} else { // 设置笔记编辑器的文本内容,并高亮显示搜索结果
mNoteEditor . setText ( getHighlightQueryResult ( mWorkingNote . getContent ( ) , mUserQuery ) ) ;
// 将光标移动到文本末尾
mNoteEditor . setSelection ( mNoteEditor . getText ( ) . length ( ) ) ;
}
// 隐藏所有背景选择器选中状态的视图
for ( Integer id : sBgSelectorSelectionMap . keySet ( ) ) {
findViewById ( sBgSelectorSelectionMap . get ( id ) ) . setVisibility ( View . GONE ) ;
}
// 设置标题栏和笔记编辑区域的背景资源
mHeadViewPanel . setBackgroundResource ( mWorkingNote . getTitleBgResId ( ) ) ;
mNoteEditorPanel . setBackgroundResource ( mWorkingNote . getBgColorResId ( ) ) ;
// 设置修改时间文本
mNoteHeaderHolder . tvModified . setText ( DateUtils . formatDateTime ( this ,
mWorkingNote . getModifiedDate ( ) , DateUtils . FORMAT_SHOW_DATE
| DateUtils . FORMAT_NUMERIC_DATE | DateUtils . FORMAT_SHOW_TIME
@ -323,18 +334,19 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private void showAlertHeader ( ) {
if ( mWorkingNote . hasClockAlert ( ) ) {
long time = System . currentTimeMillis ( ) ;
if ( time > mWorkingNote . getAlertDate ( ) ) {
if ( time > mWorkingNote . getAlertDate ( ) ) { // 如果提醒时间已过期,则显示"提醒已过期"文本
mNoteHeaderHolder . tvAlertDate . setText ( R . string . note_alert_expired ) ;
} else {
} else { // 显示相对时间,例如"2分钟前"
mNoteHeaderHolder . tvAlertDate . setText ( DateUtils . getRelativeTimeSpanString (
mWorkingNote . getAlertDate ( ) , time , DateUtils . MINUTE_IN_MILLIS ) ) ;
}
} // 显示提醒时间文本和提醒图标
mNoteHeaderHolder . tvAlertDate . setVisibility ( View . VISIBLE ) ;
mNoteHeaderHolder . ivAlertIcon . setVisibility ( View . VISIBLE ) ;
} else {
} else { // 隐藏提醒时间文本和提醒图标
mNoteHeaderHolder . tvAlertDate . setVisibility ( View . GONE ) ;
mNoteHeaderHolder . ivAlertIcon . setVisibility ( View . GONE ) ;
} ;
}
;
}
@Override
@ -359,23 +371,23 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
@Override
public boolean dispatchTouchEvent ( MotionEvent ev ) {
public boolean dispatchTouchEvent ( MotionEvent ev ) { // 如果背景颜色选择器可见且触摸事件不在其范围内,则隐藏背景颜色选择器
if ( mNoteBgColorSelector . getVisibility ( ) = = View . VISIBLE
& & ! inRangeOfView ( mNoteBgColorSelector , ev ) ) {
mNoteBgColorSelector . setVisibility ( View . GONE ) ;
return true ;
}
// 如果字体大小选择器可见且触摸事件不在其范围内,则隐藏字体大小选择器
if ( mFontSizeSelector . getVisibility ( ) = = View . VISIBLE
& & ! inRangeOfView ( mFontSizeSelector , ev ) ) {
mFontSizeSelector . setVisibility ( View . GONE ) ;
return true ;
}
} // 调用父类的dispatchTouchEvent方法处理触摸事件
return super . dispatchTouchEvent ( ev ) ;
}
private boolean inRangeOfView ( View view , MotionEvent ev ) {
int [ ] location = new int [ 2 ] ;
int [ ] location = new int [ 2 ] ;
view . getLocationOnScreen ( location ) ;
int x = location [ 0 ] ;
int y = location [ 1 ] ;
@ -383,8 +395,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
| | ev . getX ( ) > ( x + view . getWidth ( ) )
| | ev . getY ( ) < y
| | ev . getY ( ) > ( y + view . getHeight ( ) ) ) {
return false ;
}
return false ;
}
return true ;
}
@ -394,10 +406,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteHeaderHolder . tvModified = ( TextView ) findViewById ( R . id . tv_modified_date ) ;
mNoteHeaderHolder . ivAlertIcon = ( ImageView ) findViewById ( R . id . iv_alert_icon ) ;
mNoteHeaderHolder . tvAlertDate = ( TextView ) findViewById ( R . id . tv_alert_date ) ;
// 初始化编辑器和文本计数器
mNoteHeaderHolder . editText = ( EditText ) findViewById ( R . id . note_edit_view ) ;
mNoteHeaderHolder . textView = ( TextView ) findViewById ( R . id . text_num ) ;
// 初始化背景颜色选择器按钮和点击事件
mNoteHeaderHolder . ibSetBgColor = ( ImageView ) findViewById ( R . id . btn_set_bg_color ) ;
mNoteHeaderHolder . ibSetBgColor . setOnClickListener ( this ) ;
mNoteEditor = ( EditText ) findViewById ( R . id . note_edit_view ) ;
@ -407,12 +419,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
ImageView iv = ( ImageView ) findViewById ( id ) ;
iv . setOnClickListener ( this ) ;
}
// 初始化字体大小选择器和点击事件
mFontSizeSelector = findViewById ( R . id . font_size_selector ) ;
for ( int id : sFontSizeBtnsMap . keySet ( ) ) {
View view = findViewById ( id ) ;
view . setOnClickListener ( this ) ;
} ;
}
;
// 初始化SharedPreferences和字体大小
mSharedPrefs = PreferenceManager . getDefaultSharedPreferences ( this ) ;
mFontSizeId = mSharedPrefs . getInt ( PREFERENCE_FONT_SIZE , ResourceParser . BG_DEFAULT_FONT_SIZE ) ;
/ * *
@ -420,36 +434,42 @@ public class NoteEditActivity extends Activity implements OnClickListener,
* The id may larger than the length of resources , in this case ,
* return the { @link ResourceParser # BG_DEFAULT_FONT_SIZE }
* /
if ( mFontSizeId > = TextAppearanceResources . getResourcesSize ( ) ) {
if ( mFontSizeId > = TextAppearanceResources . getResourcesSize ( ) ) {
mFontSizeId = ResourceParser . BG_DEFAULT_FONT_SIZE ;
}
// 初始化编辑器列表
mEditTextList = ( LinearLayout ) findViewById ( R . id . note_edit_list ) ;
}
@Override
protected void onPause ( ) {
super . onPause ( ) ;
if ( saveNote ( ) ) {
if ( saveNote ( ) ) {
Log . d ( TAG , "Note data was saved with length:" + mWorkingNote . getContent ( ) . length ( ) ) ;
}
clearSettingState ( ) ;
}
private void updateWidget ( ) {
// 创建更新小部件的意图
Intent intent = new Intent ( AppWidgetManager . ACTION_APPWIDGET_UPDATE ) ;
// 根据笔记的小部件类型设置对应的小部件提供者类
if ( mWorkingNote . getWidgetType ( ) = = Notes . TYPE_WIDGET_2X ) {
intent . setClass ( this , NoteWidgetProvider_2x . class ) ;
} else if ( mWorkingNote . getWidgetType ( ) = = Notes . TYPE_WIDGET_4X ) {
intent . setClass ( this , NoteWidgetProvider_4x . class ) ;
} else {
Log . e ( TAG , "Uns pported widget type") ;
Log . e ( TAG , "Uns u pported widget type") ;
return ;
}
intent . putExtra ( AppWidgetManager . EXTRA_APPWIDGET_IDS , new int [ ] {
mWorkingNote . getWidgetId ( )
// 将当前笔记的小部件ID作为额外参数传递给意图
intent . putExtra ( AppWidgetManager . EXTRA_APPWIDGET_IDS , new int [ ] {
mWorkingNote . getWidgetId ( )
} ) ;
// 发送广播,通知小部件进行更新
sendBroadcast ( intent ) ;
setResult ( RESULT_OK , intent ) ;
}
@ -457,14 +477,16 @@ public class NoteEditActivity extends Activity implements OnClickListener,
public void onClick ( View v ) {
int id = v . getId ( ) ;
if ( id = = R . id . btn_set_bg_color ) {
// 显示背景颜色选择器,并显示当前笔记的背景颜色选中状态
mNoteBgColorSelector . setVisibility ( View . VISIBLE ) ;
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility ( View . VISIBLE ) ;
} else if ( sBgSelectorBtnsMap . containsKey ( id ) ) {
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
View . GONE ) ;
// 隐藏当前笔记的背景颜色选中状态, 并设置新的背景颜色ID
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility ( View . GONE ) ;
mWorkingNote . setBgColorId ( sBgSelectorBtnsMap . get ( id ) ) ;
mNoteBgColorSelector . setVisibility ( View . GONE ) ;
} else if ( sFontSizeBtnsMap . containsKey ( id ) ) {
// 切换字体大小,并更新编辑器的文本样式
findViewById ( sFontSelectorSelectionMap . get ( mFontSizeId ) ) . setVisibility ( View . GONE ) ;
mFontSizeId = sFontSizeBtnsMap . get ( id ) ;
mSharedPrefs . edit ( ) . putInt ( PREFERENCE_FONT_SIZE , mFontSizeId ) . commit ( ) ;
@ -473,16 +495,16 @@ public class NoteEditActivity extends Activity implements OnClickListener,
getWorkingText ( ) ;
switchToListMode ( mWorkingNote . getContent ( ) ) ;
} else {
mNoteEditor . setTextAppearance ( this ,
TextAppearanceResources . getTexAppearanceResource ( mFontSizeId ) ) ;
mNoteEditor . setTextAppearance ( this , TextAppearanceResources . getTexAppearanceResource ( mFontSizeId ) ) ;
}
mFontSizeSelector . setVisibility ( View . GONE ) ;
}
}
@Override
public void onBackPressed ( ) {
if ( clearSettingState ( ) ) {
if ( clearSettingState ( ) ) {
return ;
}
@ -491,10 +513,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private boolean clearSettingState ( ) {
// 如果背景颜色选择器可见,则隐藏它
if ( mNoteBgColorSelector . getVisibility ( ) = = View . VISIBLE ) {
mNoteBgColorSelector . setVisibility ( View . GONE ) ;
return true ;
} else if ( mFontSizeSelector . getVisibility ( ) = = View . VISIBLE ) {
}
// 如果字体大小选择器可见,则隐藏它
else if ( mFontSizeSelector . getVisibility ( ) = = View . VISIBLE ) {
mFontSizeSelector . setVisibility ( View . GONE ) ;
return true ;
}
@ -502,29 +527,35 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
public void onBackgroundColorChanged ( ) {
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
View . VISIBLE ) ;
// 显示当前笔记的背景颜色选中状态,并更新编辑器和标题栏的背景资源
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility ( View . VISIBLE ) ;
mNoteEditorPanel . setBackgroundResource ( mWorkingNote . getBgColorResId ( ) ) ;
mHeadViewPanel . setBackgroundResource ( mWorkingNote . getTitleBgResId ( ) ) ;
}
@Override
public boolean onPrepareOptionsMenu ( Menu menu ) {
// 如果Activity即将关闭, 则返回true
if ( isFinishing ( ) ) {
return true ;
}
// 清除设置状态
clearSettingState ( ) ;
// 清除菜单项
menu . clear ( ) ;
// 根据笔记所属文件夹的不同,加载不同的菜单资源
if ( mWorkingNote . getFolderId ( ) = = Notes . ID_CALL_RECORD_FOLDER ) {
getMenuInflater ( ) . inflate ( R . menu . call_note_edit , menu ) ;
} else {
getMenuInflater ( ) . inflate ( R . menu . note_edit , menu ) ;
}
// 根据笔记的模式,设置列表模式菜单项的标题
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
menu . findItem ( R . id . menu_list_mode ) . setTitle ( R . string . menu_normal_mode ) ;
} else {
menu . findItem ( R . id . menu_list_mode ) . setTitle ( R . string . menu_list_mode ) ;
}
// 根据笔记是否设置了提醒,显示或隐藏相应的菜单项
if ( mWorkingNote . hasClockAlert ( ) ) {
menu . findItem ( R . id . menu_alert ) . setVisible ( false ) ;
} else {
@ -533,6 +564,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return true ;
}
@Override
public boolean onOptionsItemSelected ( MenuItem item ) {
/ * *
@ -589,7 +621,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
DateTimePickerDialog d = new DateTimePickerDialog ( this , System . currentTimeMillis ( ) ) ;
d . setOnDateTimeSetListener ( new OnDateTimeSetListener ( ) {
public void OnDateTimeSet ( AlertDialog dialog , long date ) {
mWorkingNote . setAlertDate ( date , true ) ;
mWorkingNote . setAlertDate ( date , true ) ;
}
} ) ;
d . show ( ) ;
@ -626,6 +658,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private void deleteCurrentNote ( ) {
// 如果当前笔记存在于数据库中
if ( mWorkingNote . existInDatabase ( ) ) {
HashSet < Long > ids = new HashSet < Long > ( ) ;
long id = mWorkingNote . getNoteId ( ) ;
@ -634,28 +667,30 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else {
Log . d ( TAG , "Wrong note id, should not happen" ) ;
}
// 如果不是同步模式
if ( ! isSyncMode ( ) ) {
// 批量删除笔记
if ( ! DataUtils . batchDeleteNotes ( getContentResolver ( ) , ids ) ) {
Log . e ( TAG , "Delete Note error" ) ;
}
} else {
// 批量将笔记移动到垃圾箱文件夹
if ( ! DataUtils . batchMoveToFolder ( getContentResolver ( ) , ids , Notes . ID_TRASH_FOLER ) ) {
Log . e ( TAG , "Move notes to trash folder error, should not happens" ) ;
}
}
}
// 标记当前笔记为已删除
mWorkingNote . markDeleted ( true ) ;
}
private boolean isSyncMode ( ) {
// 判断是否为同步模式
return NotesPreferenceActivity . getSyncAccountName ( this ) . trim ( ) . length ( ) > 0 ;
}
public void onClockAlertChanged ( long date , boolean set ) {
/ * *
* User could set clock to an unsaved note , so before setting the
* alert clock , we should save the note first
* /
// 如果当前笔记不存在于数据库中,则先保存笔记
if ( ! mWorkingNote . existInDatabase ( ) ) {
saveNote ( ) ;
}
@ -665,45 +700,45 @@ public class NoteEditActivity extends Activity implements OnClickListener,
PendingIntent pendingIntent = PendingIntent . getBroadcast ( this , 0 , intent , 0 ) ;
AlarmManager alarmManager = ( ( AlarmManager ) getSystemService ( ALARM_SERVICE ) ) ;
showAlertHeader ( ) ;
if ( ! set ) {
if ( ! set ) {
// 取消闹钟提醒
alarmManager . cancel ( pendingIntent ) ;
} else {
// 设置闹钟提醒
alarmManager . set ( AlarmManager . RTC_WAKEUP , date , pendingIntent ) ;
}
} else {
/ * *
* There is the condition that user has input nothing ( the note is
* not worthy saving ) , we have no note id , remind the user that he
* should input something
* /
// 如果没有笔记ID, 则提示用户输入内容
Log . e ( TAG , "Clock alert setting error" ) ;
showToast ( R . string . error_note_empty_for_clock ) ;
}
}
public void onWidgetChanged ( ) {
// 更新小部件
updateWidget ( ) ;
}
public void onEditTextDelete ( int index , String text ) {
int childCount = mEditTextList . getChildCount ( ) ;
// 如果只有一个编辑文本,则不执行删除操作
if ( childCount = = 1 ) {
return ;
}
// 更新后续编辑文本的索引
for ( int i = index + 1 ; i < childCount ; i + + ) {
( ( NoteEditText ) mEditTextList . getChildAt ( i ) . findViewById ( R . id . et_edit_text ) )
. setIndex ( i - 1 ) ;
}
// 移除指定索引处的编辑文本
mEditTextList . removeViewAt ( index ) ;
NoteEditText edit = null ;
if ( index = = 0 ) {
edit = ( NoteEditText ) mEditTextList . getChildAt ( 0 ) . findViewById (
R . id . et_edit_text ) ;
if ( index = = 0 ) {
edit = ( NoteEditText ) mEditTextList . getChildAt ( 0 ) . findViewById ( R . id . et_edit_text ) ;
} else {
edit = ( NoteEditText ) mEditTextList . getChildAt ( index - 1 ) . findViewById (
R . id . et_edit_text ) ;
edit = ( NoteEditText ) mEditTextList . getChildAt ( index - 1 ) . findViewById ( R . id . et_edit_text ) ;
}
int length = edit . length ( ) ;
edit . append ( text ) ;
@ -712,13 +747,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
public void onEditTextEnter ( int index , String text ) {
/ * *
* Should not happen , check for debug
* /
if ( index > mEditTextList . getChildCount ( ) ) {
Log . e ( TAG , "Index out of mEditTextList boundrary, should not happen" ) ;
// 调试时不应该发生的情况,检查索引是否超出范围
if ( index > mEditTextList . getChildCount ( ) ) {
Log . e ( TAG , "Index out of mEditTextList boundary, should not happen" ) ;
}
// 在指定索引处添加编辑文本
View view = getListItem ( text , index ) ;
mEditTextList . addView ( view , index ) ;
NoteEditText edit = ( NoteEditText ) view . findViewById ( R . id . et_edit_text ) ;
@ -731,18 +765,23 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private void switchToListMode ( String text ) {
// 清空编辑文本列表
mEditTextList . removeAllViews ( ) ;
// 将文本按换行符分割为多个条目
String [ ] items = text . split ( "\n" ) ;
int index = 0 ;
for ( String item : items ) {
if ( ! TextUtils . isEmpty ( item ) ) {
if ( ! TextUtils . isEmpty ( item ) ) {
// 添加每个条目的编辑文本
mEditTextList . addView ( getListItem ( item , index ) ) ;
index + + ;
}
}
// 添加一个空的编辑文本作为新的条目
mEditTextList . addView ( getListItem ( "" , index ) ) ;
mEditTextList . getChildAt ( index ) . findViewById ( R . id . et_edit_text ) . requestFocus ( ) ;
// 隐藏笔记编辑器,显示编辑文本列表
mNoteEditor . setVisibility ( View . GONE ) ;
mEditTextList . setVisibility ( View . VISIBLE ) ;
}
@ -754,6 +793,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
Matcher m = mPattern . matcher ( fullText ) ;
int start = 0 ;
while ( m . find ( start ) ) {
// 设置匹配到的文本背景色高亮
spannable . setSpan (
new BackgroundColorSpan ( this . getResources ( ) . getColor (
R . color . user_query_highlight ) ) , m . start ( ) , m . end ( ) ,
@ -765,12 +805,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
private View getListItem ( String item , int index ) {
// 加载编辑文本列表项的布局
View view = LayoutInflater . from ( this ) . inflate ( R . layout . note_edit_list_item , null ) ;
final NoteEditText edit = ( NoteEditText ) view . findViewById ( R . id . et_edit_text ) ;
edit . setTextAppearance ( this , TextAppearanceResources . getTexAppearanceResource ( mFontSizeId ) ) ;
CheckBox cb = ( ( CheckBox ) view . findViewById ( R . id . cb_edit_item ) ) ;
cb . setOnCheckedChangeListener ( new OnCheckedChangeListener ( ) {
public void onCheckedChanged ( CompoundButton buttonView , boolean isChecked ) {
// 根据复选框的选中状态设置编辑文本的文本样式
if ( isChecked ) {
edit . setPaintFlags ( edit . getPaintFlags ( ) | Paint . STRIKE_THRU_TEXT_FLAG ) ;
} else {
@ -780,10 +822,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} ) ;
if ( item . startsWith ( TAG_CHECKED ) ) {
// 如果条目以"[x] "开头,则设置复选框为选中状态,并添加删除线样式
cb . setChecked ( true ) ;
edit . setPaintFlags ( edit . getPaintFlags ( ) | Paint . STRIKE_THRU_TEXT_FLAG ) ;
item = item . substring ( TAG_CHECKED . length ( ) , item . length ( ) ) . trim ( ) ;
} else if ( item . startsWith ( TAG_UNCHECKED ) ) {
// 如果条目以"[ ] "开头,则设置复选框为未选中状态,并移除删除线样式
cb . setChecked ( false ) ;
edit . setPaintFlags ( Paint . ANTI_ALIAS_FLAG | Paint . DEV_KERN_TEXT_FLAG ) ;
item = item . substring ( TAG_UNCHECKED . length ( ) , item . length ( ) ) . trim ( ) ;
@ -795,12 +839,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return view ;
}
public void onTextChange ( int index , boolean hasText ) {
if ( index > = mEditTextList . getChildCount ( ) ) {
Log . e ( TAG , "Wrong index, should not happen" ) ;
return ;
}
if ( hasText ) {
if ( hasText ) {
mEditTextList . getChildAt ( index ) . findViewById ( R . id . cb_edit_item ) . setVisibility ( View . VISIBLE ) ;
} else {
mEditTextList . getChildAt ( index ) . findViewById ( R . id . cb_edit_item ) . setVisibility ( View . GONE ) ;
@ -823,6 +868,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private boolean getWorkingText ( ) {
boolean hasChecked = false ;
// 如果当前笔记是列表模式
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
StringBuilder sb = new StringBuilder ( ) ;
for ( int i = 0 ; i < mEditTextList . getChildCount ( ) ; i + + ) {
@ -830,47 +876,44 @@ public class NoteEditActivity extends Activity implements OnClickListener,
NoteEditText edit = ( NoteEditText ) view . findViewById ( R . id . et_edit_text ) ;
if ( ! TextUtils . isEmpty ( edit . getText ( ) ) ) {
if ( ( ( CheckBox ) view . findViewById ( R . id . cb_edit_item ) ) . isChecked ( ) ) {
// 如果编辑文本的复选框被选中,则添加"[x] "前缀
sb . append ( TAG_CHECKED ) . append ( " " ) . append ( edit . getText ( ) ) . append ( "\n" ) ;
hasChecked = true ;
} else {
// 如果编辑文本的复选框未选中,则添加"[ ] "前缀
sb . append ( TAG_UNCHECKED ) . append ( " " ) . append ( edit . getText ( ) ) . append ( "\n" ) ;
}
}
}
// 设置当前笔记的工作文本为列表模式的文本
mWorkingNote . setWorkingText ( sb . toString ( ) ) ;
} else {
// 设置当前笔记的工作文本为普通模式的文本
mWorkingNote . setWorkingText ( mNoteEditor . getText ( ) . toString ( ) ) ;
}
return hasChecked ;
}
private boolean saveNote ( ) {
// 获取当前笔记的工作文本
getWorkingText ( ) ;
// 保存当前笔记
boolean saved = mWorkingNote . saveNote ( ) ;
if ( saved ) {
/ * *
* There are two modes from List view to edit view , open one note ,
* create / edit a node . Opening node requires to the original
* position in the list when back from edit view , while creating a
* new node requires to the top of the list . This code
* { @link # RESULT_OK } is used to identify the create / edit state
* /
// 设置结果为RESULT_OK, 用于标识创建/编辑状态
setResult ( RESULT_OK ) ;
}
return saved ;
}
private void sendToDesktop ( ) {
/ * *
* Before send message to home , we should make sure that current
* editing note is exists in databases . So , for new note , firstly
* save it
* /
// 如果当前编辑的笔记不存在于数据库中,则先保存笔记
if ( ! mWorkingNote . existInDatabase ( ) ) {
saveNote ( ) ;
}
if ( mWorkingNote . getNoteId ( ) > 0 ) {
// 创建发送到桌面的快捷方式
Intent sender = new Intent ( ) ;
Intent shortcutIntent = new Intent ( this , NoteEditActivity . class ) ;
shortcutIntent . setAction ( Intent . ACTION_VIEW ) ;
@ -885,17 +928,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
showToast ( R . string . info_note_enter_desktop ) ;
sendBroadcast ( sender ) ;
} else {
/ * *
* There is the condition that user has input nothing ( the note is
* not worthy saving ) , we have no note id , remind the user that he
* should input something
* /
// 如果没有笔记ID, 则提示用户输入内容
Log . e ( TAG , "Send to desktop error" ) ;
showToast ( R . string . error_note_empty_for_send_to_desktop ) ;
}
}
private String makeShortcutIconTitle ( String content ) {
// 去除文本中的"[x] "和"[ ] "前缀,作为快捷方式的标题
content = content . replace ( TAG_CHECKED , "" ) ;
content = content . replace ( TAG_UNCHECKED , "" ) ;
return content . length ( ) > SHORTCUT_ICON_TITLE_MAX_LEN ? content . substring ( 0 ,
@ -909,6 +949,4 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private void showToast ( int resId , int duration ) {
Toast . makeText ( this , resId , duration ) . show ( ) ;
}
}