@ -72,18 +72,28 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern ;
import java.util.regex.Pattern ;
/ * *
* 笔 记 编 辑 活 动
* 负 责 处 理 笔 记 的 创 建 、 编 辑 和 预 览 功 能
* 实 现 了 笔 记 设 置 变 化 监 听 器 和 文 本 视 图 变 化 监 听 器 接 口
* /
public class NoteEditActivity extends Activity implements OnClickListener ,
public class NoteEditActivity extends Activity implements OnClickListener ,
NoteSettingChangedListener , OnTextViewChangeListener {
NoteSettingChangedListener , OnTextViewChangeListener {
/ * *
* 头 部 视 图 持 有 者 类
* 用 于 缓 存 头 部 视 图 的 控 件 引 用 , 提 高 性 能
* /
private class HeadViewHolder {
private class HeadViewHolder {
public TextView tvModified ;
public TextView tvModified ; // 最后修改时间文本视图
public ImageView ivAlertIcon ; // 提醒图标
public ImageView ivAlertIcon ;
public TextView tvAlertDate ; // 提醒日期文本视图
public ImageView ibSetBgColor ; // 设置背景颜色按钮
public TextView tvAlertDate ;
public ImageView ibSetBgColor ;
}
}
/ * *
* 背 景 选 择 器 按 钮 映 射
* 用 于 将 背 景 选 择 按 钮 ID 映 射 到 对 应 的 背 景 颜 色 常 量
* /
private static final Map < Integer , Integer > sBgSelectorBtnsMap = new HashMap < Integer , Integer > ( ) ;
private static final Map < Integer , Integer > sBgSelectorBtnsMap = new HashMap < Integer , Integer > ( ) ;
static {
static {
sBgSelectorBtnsMap . put ( R . id . iv_bg_yellow , ResourceParser . YELLOW ) ;
sBgSelectorBtnsMap . put ( R . id . iv_bg_yellow , ResourceParser . YELLOW ) ;
@ -93,6 +103,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
sBgSelectorBtnsMap . put ( R . id . iv_bg_white , ResourceParser . WHITE ) ;
sBgSelectorBtnsMap . put ( R . id . iv_bg_white , ResourceParser . WHITE ) ;
}
}
/ * *
* 背 景 选 择 器 选 中 状 态 映 射
* 用 于 将 背 景 颜 色 常 量 映 射 到 对 应 的 选 中 状 态 图 标 ID
* /
private static final Map < Integer , Integer > sBgSelectorSelectionMap = new HashMap < Integer , Integer > ( ) ;
private static final Map < Integer , Integer > sBgSelectorSelectionMap = new HashMap < Integer , Integer > ( ) ;
static {
static {
sBgSelectorSelectionMap . put ( ResourceParser . YELLOW , R . id . iv_bg_yellow_select ) ;
sBgSelectorSelectionMap . put ( ResourceParser . YELLOW , R . id . iv_bg_yellow_select ) ;
@ -102,6 +116,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
sBgSelectorSelectionMap . put ( ResourceParser . WHITE , R . id . iv_bg_white_select ) ;
sBgSelectorSelectionMap . put ( ResourceParser . WHITE , R . id . iv_bg_white_select ) ;
}
}
/ * *
* 字 体 大 小 按 钮 映 射
* 用 于 将 字 体 大 小 选 择 按 钮 ID 映 射 到 对 应 的 字 体 大 小 常 量
* /
private static final Map < Integer , Integer > sFontSizeBtnsMap = new HashMap < Integer , Integer > ( ) ;
private static final Map < Integer , Integer > sFontSizeBtnsMap = new HashMap < Integer , Integer > ( ) ;
static {
static {
sFontSizeBtnsMap . put ( R . id . ll_font_large , ResourceParser . TEXT_LARGE ) ;
sFontSizeBtnsMap . put ( R . id . ll_font_large , ResourceParser . TEXT_LARGE ) ;
@ -110,6 +128,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
sFontSizeBtnsMap . put ( R . id . ll_font_super , ResourceParser . TEXT_SUPER ) ;
sFontSizeBtnsMap . put ( R . id . ll_font_super , ResourceParser . TEXT_SUPER ) ;
}
}
/ * *
* 字 体 选 择 器 选 中 状 态 映 射
* 用 于 将 字 体 大 小 常 量 映 射 到 对 应 的 选 中 状 态 图 标 ID
* /
private static final Map < Integer , Integer > sFontSelectorSelectionMap = new HashMap < Integer , Integer > ( ) ;
private static final Map < Integer , Integer > sFontSelectorSelectionMap = new HashMap < Integer , Integer > ( ) ;
static {
static {
sFontSelectorSelectionMap . put ( ResourceParser . TEXT_LARGE , R . id . iv_large_select ) ;
sFontSelectorSelectionMap . put ( ResourceParser . TEXT_LARGE , R . id . iv_large_select ) ;
@ -118,52 +140,47 @@ public class NoteEditActivity extends Activity implements OnClickListener,
sFontSelectorSelectionMap . put ( ResourceParser . TEXT_SUPER , R . id . iv_super_select ) ;
sFontSelectorSelectionMap . put ( ResourceParser . TEXT_SUPER , R . id . iv_super_select ) ;
}
}
private static final String TAG = "NoteEditActivity" ;
private static final String TAG = "NoteEditActivity" ; // 日志标签
private HeadViewHolder mNoteHeaderHolder ;
private View mHeadViewPanel ;
private View mNoteBgColorSelector ;
private View mFontSizeSelector ;
private EditText mNoteEditor ;
private HeadViewHolder mNoteHeaderHolder ; // 头部视图持有者
private View mHeadViewPanel ; // 头部视图面板
private View mNoteBgColorSelector ; // 背景颜色选择器
private View mFontSizeSelector ; // 字体大小选择器
private EditText mNoteEditor ; // 笔记编辑器
private View mNoteEditorPanel ; // 笔记编辑器面板
private WorkingNote mWorkingNote ; // 工作笔记对象
private SharedPreferences mSharedPrefs ; // 共享偏好设置
private int mFontSizeId ; // 字体大小ID
private View mNoteEditorPanel ;
private static final String PREFERENCE_FONT_SIZE = "pref_font_size" ; // 字体大小偏好设置键
private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10 ; // 快捷图标标题最大长度
private WorkingNote mWorkingNote ;
public static final String TAG_CHECKED = String . valueOf ( '\u221A' ) ; // 已勾选标记
public static final String TAG_UNCHECKED = String . valueOf ( '\u25A1' ) ; // 未勾选标记
private SharedPreferences mSharedPrefs ;
private LinearLayout mEditTextList ; // 编辑文本列表(用于清单模式)
private int mFontSizeId ;
private String mUserQuery ; // 用户查询字符串
private Pattern mPattern ; // 正则表达式模式(用于高亮查询结果)
private static final String PREFERENCE_FONT_SIZE = "pref_font_size" ;
private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10 ;
public static final String TAG_CHECKED = String . valueOf ( '\u221A' ) ;
public static final String TAG_UNCHECKED = String . valueOf ( '\u25A1' ) ;
private LinearLayout mEditTextList ;
private String mUserQuery ;
private Pattern mPattern ;
/ * *
* 创 建 活 动 时 调 用
* @param savedInstanceState 保 存 的 实 例 状 态
* /
@Override
@Override
protected void onCreate ( Bundle savedInstanceState ) {
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState ) ;
super . onCreate ( savedInstanceState ) ;
this . setContentView ( R . layout . note_edit ) ;
this . setContentView ( R . layout . note_edit ) ; // 设置布局
// 如果没有保存的状态且无法初始化活动状态,则结束活动
if ( savedInstanceState = = null & & ! initActivityState ( getIntent ( ) ) ) {
if ( savedInstanceState = = null & & ! initActivityState ( getIntent ( ) ) ) {
finish ( ) ;
finish ( ) ;
return ;
return ;
}
}
initResources ( ) ;
initResources ( ) ; // 初始化资源
}
}
/ * *
/ * *
* 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
* /
* /
@Override
@Override
protected void onRestoreInstanceState ( Bundle savedInstanceState ) {
protected void onRestoreInstanceState ( Bundle savedInstanceState ) {
@ -179,6 +196,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
}
}
/ * *
* 初 始 化 活 动 状 态
* 根 据 传 入 的 意 图 设 置 工 作 笔 记 的 状 态
* @param intent 传 入 的 意 图
* @return 是 否 初 始 化 成 功
* /
private boolean initActivityState ( Intent intent ) {
private boolean initActivityState ( Intent intent ) {
/ * *
/ * *
* If the user specified the { @link Intent # ACTION_VIEW } but not provided with id ,
* If the user specified the { @link Intent # ACTION_VIEW } but not provided with id ,
@ -262,27 +285,44 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return true ;
return true ;
}
}
/ * *
* 活 动 恢 复 时 调 用
* /
@Override
@Override
protected void onResume ( ) {
protected void onResume ( ) {
super . onResume ( ) ;
super . onResume ( ) ;
initNoteScreen ( ) ;
initNoteScreen ( ) ; // 初始化笔记屏幕
}
}
/ * *
* 初 始 化 笔 记 屏 幕
* 设 置 笔 记 编 辑 器 的 文 本 外 观 、 内 容 和 选 择 模 式
* /
private void initNoteScreen ( ) {
private void initNoteScreen ( ) {
// 设置笔记编辑器的文本外观
mNoteEditor . setTextAppearance ( this , TextAppearanceResources
mNoteEditor . setTextAppearance ( this , TextAppearanceResources
. getTexAppearanceResource ( mFontSizeId ) ) ;
. getTexAppearanceResource ( mFontSizeId ) ) ;
// 根据笔记模式设置显示方式
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
switchToListMode ( mWorkingNote . getContent ( ) ) ;
switchToListMode ( mWorkingNote . getContent ( ) ) ; // 切换到清单模式
} else {
} else {
// 设置笔记内容并高亮查询结果
mNoteEditor . setText ( getHighlightQueryResult ( mWorkingNote . getContent ( ) , mUserQuery ) ) ;
mNoteEditor . setText ( getHighlightQueryResult ( mWorkingNote . getContent ( ) , mUserQuery ) ) ;
// 将光标定位到文本末尾
mNoteEditor . setSelection ( mNoteEditor . getText ( ) . length ( ) ) ;
mNoteEditor . setSelection ( mNoteEditor . getText ( ) . length ( ) ) ;
}
}
// 隐藏所有背景选择的选中状态
for ( Integer id : sBgSelectorSelectionMap . keySet ( ) ) {
for ( Integer id : sBgSelectorSelectionMap . keySet ( ) ) {
findViewById ( sBgSelectorSelectionMap . get ( id ) ) . setVisibility ( View . GONE ) ;
findViewById ( sBgSelectorSelectionMap . get ( id ) ) . setVisibility ( View . GONE ) ;
}
}
// 设置头部视图和编辑器面板的背景
mHeadViewPanel . setBackgroundResource ( mWorkingNote . getTitleBgResId ( ) ) ;
mHeadViewPanel . setBackgroundResource ( mWorkingNote . getTitleBgResId ( ) ) ;
mNoteEditorPanel . setBackgroundResource ( mWorkingNote . getBgColorResId ( ) ) ;
mNoteEditorPanel . setBackgroundResource ( mWorkingNote . getBgColorResId ( ) ) ;
// 设置最后修改时间
mNoteHeaderHolder . tvModified . setText ( DateUtils . formatDateTime ( this ,
mNoteHeaderHolder . tvModified . setText ( DateUtils . formatDateTime ( this ,
mWorkingNote . getModifiedDate ( ) , DateUtils . FORMAT_SHOW_DATE
mWorkingNote . getModifiedDate ( ) , DateUtils . FORMAT_SHOW_DATE
| DateUtils . FORMAT_NUMERIC_DATE | DateUtils . FORMAT_SHOW_TIME
| DateUtils . FORMAT_NUMERIC_DATE | DateUtils . FORMAT_SHOW_TIME
@ -292,9 +332,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
* TODO : Add the menu for setting alert . Currently disable it because the DateTimePicker
* TODO : Add the menu for setting alert . Currently disable it because the DateTimePicker
* is not ready
* is not ready
* /
* /
showAlertHeader ( ) ;
showAlertHeader ( ) ; // 显示提醒头部
}
}
/ * *
* 显 示 提 醒 头 部
* 根 据 笔 记 的 提 醒 设 置 显 示 或 隐 藏 提 醒 信 息
* /
private void showAlertHeader ( ) {
private void showAlertHeader ( ) {
if ( mWorkingNote . hasClockAlert ( ) ) {
if ( mWorkingNote . hasClockAlert ( ) ) {
long time = System . currentTimeMillis ( ) ;
long time = System . currentTimeMillis ( ) ;
@ -318,6 +362,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
initActivityState ( intent ) ;
initActivityState ( intent ) ;
}
}
/ * *
* 保 存 活 动 状 态
* @param outState 保 存 状 态 的 Bundle
* /
@Override
@Override
protected void onSaveInstanceState ( Bundle outState ) {
protected void onSaveInstanceState ( Bundle outState ) {
super . onSaveInstanceState ( outState ) ;
super . onSaveInstanceState ( outState ) ;
@ -333,6 +381,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
Log . d ( TAG , "Save working note id: " + mWorkingNote . getNoteId ( ) + " onSaveInstanceState" ) ;
Log . d ( TAG , "Save working note id: " + mWorkingNote . getNoteId ( ) + " onSaveInstanceState" ) ;
}
}
/ * *
* 分 发 触 摸 事 件
* 处 理 背 景 颜 色 选 择 器 和 字 体 大 小 选 择 器 的 点 击 外 部 关 闭 逻 辑
* @param ev 触 摸 事 件
* @return 是 否 消 费 了 事 件
* /
@Override
@Override
public boolean dispatchTouchEvent ( MotionEvent ev ) {
public boolean dispatchTouchEvent ( MotionEvent ev ) {
if ( mNoteBgColorSelector . getVisibility ( ) = = View . VISIBLE
if ( mNoteBgColorSelector . getVisibility ( ) = = View . VISIBLE
@ -349,6 +403,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return super . dispatchTouchEvent ( ev ) ;
return super . dispatchTouchEvent ( ev ) ;
}
}
/ * *
* 检 查 触 摸 事 件 是 否 在 视 图 范 围 内
* @param view 视 图 对 象
* @param ev 触 摸 事 件
* @return 是 否 在 范 围 内
* /
private boolean inRangeOfView ( View view , MotionEvent ev ) {
private boolean inRangeOfView ( View view , MotionEvent ev ) {
int [ ] location = new int [ 2 ] ;
int [ ] location = new int [ 2 ] ;
view . getLocationOnScreen ( location ) ;
view . getLocationOnScreen ( location ) ;
@ -363,6 +423,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return true ;
return true ;
}
}
/ * *
* 初 始 化 资 源
* 初 始 化 所 有 UI 控 件 和 资 源 引 用
* /
private void initResources ( ) {
private void initResources ( ) {
mHeadViewPanel = findViewById ( R . id . note_title ) ;
mHeadViewPanel = findViewById ( R . id . note_title ) ;
mNoteHeaderHolder = new HeadViewHolder ( ) ;
mNoteHeaderHolder = new HeadViewHolder ( ) ;
@ -374,18 +438,25 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteEditor = ( EditText ) findViewById ( R . id . note_edit_view ) ;
mNoteEditor = ( EditText ) findViewById ( R . id . note_edit_view ) ;
mNoteEditorPanel = findViewById ( R . id . sv_note_edit ) ;
mNoteEditorPanel = findViewById ( R . id . sv_note_edit ) ;
mNoteBgColorSelector = findViewById ( R . id . note_bg_color_selector ) ;
mNoteBgColorSelector = findViewById ( R . id . note_bg_color_selector ) ;
// 为所有背景选择按钮设置点击监听器
for ( int id : sBgSelectorBtnsMap . keySet ( ) ) {
for ( int id : sBgSelectorBtnsMap . keySet ( ) ) {
ImageView iv = ( ImageView ) findViewById ( id ) ;
ImageView iv = ( ImageView ) findViewById ( id ) ;
iv . setOnClickListener ( this ) ;
iv . setOnClickListener ( this ) ;
}
}
mFontSizeSelector = findViewById ( R . id . font_size_selector ) ;
mFontSizeSelector = findViewById ( R . id . font_size_selector ) ;
// 为所有字体大小选择按钮设置点击监听器
for ( int id : sFontSizeBtnsMap . keySet ( ) ) {
for ( int id : sFontSizeBtnsMap . keySet ( ) ) {
View view = findViewById ( id ) ;
View view = findViewById ( id ) ;
view . setOnClickListener ( this ) ;
view . setOnClickListener ( this ) ;
} ;
} ;
// 初始化共享偏好设置和字体大小
mSharedPrefs = PreferenceManager . getDefaultSharedPreferences ( this ) ;
mSharedPrefs = PreferenceManager . getDefaultSharedPreferences ( this ) ;
mFontSizeId = mSharedPrefs . getInt ( PREFERENCE_FONT_SIZE , ResourceParser . BG_DEFAULT_FONT_SIZE ) ;
mFontSizeId = mSharedPrefs . getInt ( PREFERENCE_FONT_SIZE , ResourceParser . BG_DEFAULT_FONT_SIZE ) ;
/ * *
/ * *
* HACKME : Fix bug of store the resource id in shared preference .
* HACKME : Fix bug of store the resource id in shared preference .
* The id may larger than the length of resources , in this case ,
* The id may larger than the length of resources , in this case ,
@ -394,9 +465,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
if ( mFontSizeId > = TextAppearanceResources . getResourcesSize ( ) ) {
if ( mFontSizeId > = TextAppearanceResources . getResourcesSize ( ) ) {
mFontSizeId = ResourceParser . BG_DEFAULT_FONT_SIZE ;
mFontSizeId = ResourceParser . BG_DEFAULT_FONT_SIZE ;
}
}
mEditTextList = ( LinearLayout ) findViewById ( R . id . note_edit_list ) ;
mEditTextList = ( LinearLayout ) findViewById ( R . id . note_edit_list ) ;
}
}
/ * *
* 活 动 暂 停 时 调 用
* 保 存 笔 记 并 清 除 设 置 状 态
* /
@Override
@Override
protected void onPause ( ) {
protected void onPause ( ) {
super . onPause ( ) ;
super . onPause ( ) ;
@ -406,8 +482,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
clearSettingState ( ) ;
clearSettingState ( ) ;
}
}
/ * *
* 更 新 小 部 件
* 更 新 与 当 前 笔 记 关 联 的 小 部 件 内 容
* /
private void updateWidget ( ) {
private void updateWidget ( ) {
Intent intent = new Intent ( AppWidgetManager . ACTION_APPWIDGET_UPDATE ) ;
Intent intent = new Intent ( AppWidgetManager . ACTION_APPWIDGET_UPDATE ) ;
// 根据小部件类型设置对应的小部件提供器
if ( mWorkingNote . getWidgetType ( ) = = Notes . TYPE_WIDGET_2X ) {
if ( mWorkingNote . getWidgetType ( ) = = Notes . TYPE_WIDGET_2X ) {
intent . setClass ( this , NoteWidgetProvider_2x . class ) ;
intent . setClass ( this , NoteWidgetProvider_2x . class ) ;
} else if ( mWorkingNote . getWidgetType ( ) = = Notes . TYPE_WIDGET_4X ) {
} else if ( mWorkingNote . getWidgetType ( ) = = Notes . TYPE_WIDGET_4X ) {
@ -421,26 +503,36 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mWorkingNote . getWidgetId ( )
mWorkingNote . getWidgetId ( )
} ) ;
} ) ;
sendBroadcast ( intent ) ;
sendBroadcast ( intent ) ; // 发送广播更新小部件
setResult ( RESULT_OK , intent ) ;
setResult ( RESULT_OK , intent ) ;
}
}
/ * *
* 点 击 事 件 处 理
* 处 理 各 种 UI 控 件 的 点 击 事 件
* @param v 被 点 击 的 视 图
* /
public void onClick ( View v ) {
public void onClick ( View v ) {
int id = v . getId ( ) ;
int id = v . getId ( ) ;
if ( id = = R . id . btn_set_bg_color ) {
if ( id = = R . id . btn_set_bg_color ) {
// 显示背景颜色选择器
mNoteBgColorSelector . setVisibility ( View . VISIBLE ) ;
mNoteBgColorSelector . setVisibility ( View . VISIBLE ) ;
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
- View . VISIBLE ) ;
View . VISIBLE ) ;
} else if ( sBgSelectorBtnsMap . containsKey ( id ) ) {
} else if ( sBgSelectorBtnsMap . containsKey ( id ) ) {
// 处理背景颜色选择
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
View . GONE ) ;
View . GONE ) ;
mWorkingNote . setBgColorId ( sBgSelectorBtnsMap . get ( id ) ) ;
mWorkingNote . setBgColorId ( sBgSelectorBtnsMap . get ( id ) ) ;
mNoteBgColorSelector . setVisibility ( View . GONE ) ;
mNoteBgColorSelector . setVisibility ( View . GONE ) ;
} else if ( sFontSizeBtnsMap . containsKey ( id ) ) {
} else if ( sFontSizeBtnsMap . containsKey ( id ) ) {
// 处理字体大小选择
findViewById ( sFontSelectorSelectionMap . get ( mFontSizeId ) ) . setVisibility ( View . GONE ) ;
findViewById ( sFontSelectorSelectionMap . get ( mFontSizeId ) ) . setVisibility ( View . GONE ) ;
mFontSizeId = sFontSizeBtnsMap . get ( id ) ;
mFontSizeId = sFontSizeBtnsMap . get ( id ) ;
mSharedPrefs . edit ( ) . putInt ( PREFERENCE_FONT_SIZE , mFontSizeId ) . commit ( ) ;
mSharedPrefs . edit ( ) . putInt ( PREFERENCE_FONT_SIZE , mFontSizeId ) . commit ( ) ;
findViewById ( sFontSelectorSelectionMap . get ( mFontSizeId ) ) . setVisibility ( View . VISIBLE ) ;
findViewById ( sFontSelectorSelectionMap . get ( mFontSizeId ) ) . setVisibility ( View . VISIBLE ) ;
// 根据当前模式更新字体大小
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
getWorkingText ( ) ;
getWorkingText ( ) ;
switchToListMode ( mWorkingNote . getContent ( ) ) ;
switchToListMode ( mWorkingNote . getContent ( ) ) ;
@ -452,6 +544,9 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
}
}
/ * *
* 按 下 返 回 键 时 调 用
* /
@Override
@Override
public void onBackPressed ( ) {
public void onBackPressed ( ) {
if ( clearSettingState ( ) ) {
if ( clearSettingState ( ) ) {
@ -462,6 +557,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
super . onBackPressed ( ) ;
super . onBackPressed ( ) ;
}
}
/ * *
* 清 除 设 置 状 态
* 隐 藏 所 有 设 置 面 板
* @return 是 否 有 设 置 面 板 被 隐 藏
* /
private boolean clearSettingState ( ) {
private boolean clearSettingState ( ) {
if ( mNoteBgColorSelector . getVisibility ( ) = = View . VISIBLE ) {
if ( mNoteBgColorSelector . getVisibility ( ) = = View . VISIBLE ) {
mNoteBgColorSelector . setVisibility ( View . GONE ) ;
mNoteBgColorSelector . setVisibility ( View . GONE ) ;
@ -473,6 +573,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return false ;
return false ;
}
}
/ * *
* 背 景 颜 色 改 变 时 调 用
* 实 现 NoteSettingChangedListener 接 口
* /
public void onBackgroundColorChanged ( ) {
public void onBackgroundColorChanged ( ) {
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
findViewById ( sBgSelectorSelectionMap . get ( mWorkingNote . getBgColorId ( ) ) ) . setVisibility (
View . VISIBLE ) ;
View . VISIBLE ) ;
@ -480,6 +584,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mHeadViewPanel . setBackgroundResource ( mWorkingNote . getTitleBgResId ( ) ) ;
mHeadViewPanel . setBackgroundResource ( mWorkingNote . getTitleBgResId ( ) ) ;
}
}
/ * *
* 准 备 菜 单 时 调 用
* @param menu 菜 单 对 象
* @return 是 否 准 备 成 功
* /
@Override
@Override
public boolean onPrepareOptionsMenu ( Menu menu ) {
public boolean onPrepareOptionsMenu ( Menu menu ) {
if ( isFinishing ( ) ) {
if ( isFinishing ( ) ) {
@ -505,13 +614,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return true ;
return true ;
}
}
/ * *
* 菜 单 项 选 择 处 理
* 处 理 各 种 菜 单 按 钮 的 点 击 事 件
* @param item 选 择 的 菜 单 项
* @return 是 否 处 理 了 该 事 件
* /
@Override
@Override
public boolean onOptionsItemSelected ( MenuItem item ) {
public boolean onOptionsItemSelected ( MenuItem item ) {
switch ( item . getItemId ( ) ) {
switch ( item . getItemId ( ) ) {
case R . id . menu_new_note :
case R . id . menu_new_note :
createNewNote ( ) ;
createNewNote ( ) ; // 创建新笔记
break ;
break ;
case R . id . menu_delete :
case R . id . menu_delete :
// 显示删除确认对话框
AlertDialog . Builder builder = new AlertDialog . Builder ( this ) ;
AlertDialog . Builder builder = new AlertDialog . Builder ( this ) ;
builder . setTitle ( getString ( R . string . alert_title_delete ) ) ;
builder . setTitle ( getString ( R . string . alert_title_delete ) ) ;
builder . setIcon ( android . R . drawable . ic_dialog_alert ) ;
builder . setIcon ( android . R . drawable . ic_dialog_alert ) ;
@ -519,7 +635,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
builder . setPositiveButton ( android . R . string . ok ,
builder . setPositiveButton ( android . R . string . ok ,
new DialogInterface . OnClickListener ( ) {
new DialogInterface . OnClickListener ( ) {
public void onClick ( DialogInterface dialog , int which ) {
public void onClick ( DialogInterface dialog , int which ) {
deleteCurrentNote ( ) ;
deleteCurrentNote ( ) ; // 删除当前笔记
finish ( ) ;
finish ( ) ;
}
}
} ) ;
} ) ;
@ -527,25 +643,27 @@ public class NoteEditActivity extends Activity implements OnClickListener,
builder . show ( ) ;
builder . show ( ) ;
break ;
break ;
case R . id . menu_font_size :
case R . id . menu_font_size :
// 显示字体大小选择器
mFontSizeSelector . setVisibility ( View . VISIBLE ) ;
mFontSizeSelector . setVisibility ( View . VISIBLE ) ;
findViewById ( sFontSelectorSelectionMap . get ( mFontSizeId ) ) . setVisibility ( View . VISIBLE ) ;
findViewById ( sFontSelectorSelectionMap . get ( mFontSizeId ) ) . setVisibility ( View . VISIBLE ) ;
break ;
break ;
case R . id . menu_list_mode :
case R . id . menu_list_mode :
// 切换笔记模式(普通模式/清单模式)
mWorkingNote . setCheckListMode ( mWorkingNote . getCheckListMode ( ) = = 0 ?
mWorkingNote . setCheckListMode ( mWorkingNote . getCheckListMode ( ) = = 0 ?
TextNote . MODE_CHECK_LIST : 0 ) ;
TextNote . MODE_CHECK_LIST : 0 ) ;
break ;
break ;
case R . id . menu_share :
case R . id . menu_share :
getWorkingText ( ) ;
getWorkingText ( ) ; // 获取当前工作文本
sendTo ( this , mWorkingNote . getContent ( ) ) ;
sendTo ( this , mWorkingNote . getContent ( ) ) ; // 分享笔记内容
break ;
break ;
case R . id . menu_send_to_desktop :
case R . id . menu_send_to_desktop :
sendToDesktop ( ) ;
sendToDesktop ( ) ; // 发送到桌面
break ;
break ;
case R . id . menu_alert :
case R . id . menu_alert :
setReminder ( ) ;
setReminder ( ) ; // 设置提醒
break ;
break ;
case R . id . menu_delete_remind :
case R . id . menu_delete_remind :
mWorkingNote . setAlertDate ( 0 , false ) ;
mWorkingNote . setAlertDate ( 0 , false ) ; // 删除提醒
break ;
break ;
default :
default :
break ;
break ;
@ -553,6 +671,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return true ;
return true ;
}
}
/ * *
* 设 置 提 醒
* 显 示 日 期 时 间 选 择 器 , 设 置 笔 记 的 提 醒 时 间
* /
private void setReminder ( ) {
private void setReminder ( ) {
DateTimePickerDialog d = new DateTimePickerDialog ( this , System . currentTimeMillis ( ) ) ;
DateTimePickerDialog d = new DateTimePickerDialog ( this , System . currentTimeMillis ( ) ) ;
d . setOnDateTimeSetListener ( new OnDateTimeSetListener ( ) {
d . setOnDateTimeSetListener ( new OnDateTimeSetListener ( ) {
@ -564,8 +686,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
/ * *
/ * *
* Share note to apps that support { @link Intent # ACTION_SEND } action
* 分 享 笔 记
* and { @text / plain } type
* 分 享 笔 记 内 容 到 支 持 { @link Intent # ACTION_SEND } 动 作 和 { @text / plain } 类 型 的 应 用
* @param context 上 下 文 对 象
* @param info 要 分 享 的 内 容
* /
* /
private void sendTo ( Context context , String info ) {
private void sendTo ( Context context , String info ) {
Intent intent = new Intent ( Intent . ACTION_SEND ) ;
Intent intent = new Intent ( Intent . ACTION_SEND ) ;
@ -574,11 +698,15 @@ public class NoteEditActivity extends Activity implements OnClickListener,
context . startActivity ( intent ) ;
context . startActivity ( intent ) ;
}
}
/ * *
* 创 建 新 笔 记
* 保 存 当 前 笔 记 并 创 建 一 个 新 的 笔 记
* /
private void createNewNote ( ) {
private void createNewNote ( ) {
// Firstly, save current editing notes
// 首先保存当前编辑的笔记
saveNote ( ) ;
saveNote ( ) ;
// For safety, start a new NoteEditActivity
// 为了安全起见,启动一个新的 NoteEditActivity
finish ( ) ;
finish ( ) ;
Intent intent = new Intent ( this , NoteEditActivity . class ) ;
Intent intent = new Intent ( this , NoteEditActivity . class ) ;
intent . setAction ( Intent . ACTION_INSERT_OR_EDIT ) ;
intent . setAction ( Intent . ACTION_INSERT_OR_EDIT ) ;
@ -586,6 +714,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
startActivity ( intent ) ;
startActivity ( intent ) ;
}
}
/ * *
* 删 除 当 前 笔 记
* 根 据 同 步 模 式 决 定 是 直 接 删 除 还 是 移 动 到 回 收 站
* /
private void deleteCurrentNote ( ) {
private void deleteCurrentNote ( ) {
if ( mWorkingNote . existInDatabase ( ) ) {
if ( mWorkingNote . existInDatabase ( ) ) {
HashSet < Long > ids = new HashSet < Long > ( ) ;
HashSet < Long > ids = new HashSet < Long > ( ) ;
@ -596,10 +728,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
Log . d ( TAG , "Wrong note id, should not happen" ) ;
Log . d ( TAG , "Wrong note id, should not happen" ) ;
}
}
if ( ! isSyncMode ( ) ) {
if ( ! isSyncMode ( ) ) {
// 非同步模式下直接删除
if ( ! DataUtils . batchDeleteNotes ( getContentResolver ( ) , ids ) ) {
if ( ! DataUtils . batchDeleteNotes ( getContentResolver ( ) , ids ) ) {
Log . e ( TAG , "Delete Note error" ) ;
Log . e ( TAG , "Delete Note error" ) ;
}
}
} else {
} else {
// 同步模式下移动到回收站
if ( ! DataUtils . batchMoveToFolder ( getContentResolver ( ) , ids , Notes . ID_TRASH_FOLER ) ) {
if ( ! DataUtils . batchMoveToFolder ( getContentResolver ( ) , ids , Notes . ID_TRASH_FOLER ) ) {
Log . e ( TAG , "Move notes to trash folder error, should not happens" ) ;
Log . e ( TAG , "Move notes to trash folder error, should not happens" ) ;
}
}
@ -608,10 +742,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mWorkingNote . markDeleted ( true ) ;
mWorkingNote . markDeleted ( true ) ;
}
}
/ * *
* 检 查 是 否 为 同 步 模 式
* @return 是 否 为 同 步 模 式
* /
private boolean isSyncMode ( ) {
private boolean isSyncMode ( ) {
return NotesPreferenceActivity . getSyncAccountName ( this ) . trim ( ) . length ( ) > 0 ;
return NotesPreferenceActivity . getSyncAccountName ( this ) . trim ( ) . length ( ) > 0 ;
}
}
/ * *
* 提 醒 时 间 改 变 时 调 用
* 实 现 NoteSettingChangedListener 接 口
* @param date 提 醒 时 间
* @param set 是 否 设 置 提 醒
* /
public void onClockAlertChanged ( long date , boolean set ) {
public void onClockAlertChanged ( long date , boolean set ) {
/ * *
/ * *
* User could set clock to an unsaved note , so before setting the
* User could set clock to an unsaved note , so before setting the
@ -642,10 +786,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
}
}
/ * *
* 小 部 件 改 变 时 调 用
* 实 现 NoteSettingChangedListener 接 口
* /
public void onWidgetChanged ( ) {
public void onWidgetChanged ( ) {
updateWidget ( ) ;
updateWidget ( ) ;
}
}
/ * *
* 编 辑 文 本 删 除 时 调 用
* 实 现 OnTextViewChangeListener 接 口
* @param index 删 除 的 索 引
* @param text 删 除 的 文 本
* /
public void onEditTextDelete ( int index , String text ) {
public void onEditTextDelete ( int index , String text ) {
int childCount = mEditTextList . getChildCount ( ) ;
int childCount = mEditTextList . getChildCount ( ) ;
if ( childCount = = 1 ) {
if ( childCount = = 1 ) {
@ -672,6 +826,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
edit . setSelection ( length ) ;
edit . setSelection ( length ) ;
}
}
/ * *
* 编 辑 文 本 回 车 时 调 用
* 实 现 OnTextViewChangeListener 接 口
* @param index 当 前 索 引
* @param text 文 本 内 容
* /
public void onEditTextEnter ( int index , String text ) {
public void onEditTextEnter ( int index , String text ) {
/ * *
/ * *
* Should not happen , check for debug
* Should not happen , check for debug
@ -691,30 +851,43 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
}
}
/ * *
* 切 换 到 清 单 模 式
* 将 普 通 文 本 模 式 转 换 为 清 单 模 式
* @param text 要 转 换 的 文 本 内 容
* /
private void switchToListMode ( String text ) {
private void switchToListMode ( String text ) {
mEditTextList . removeAllViews ( ) ;
mEditTextList . removeAllViews ( ) ; // 清空编辑文本列表
String [ ] items = text . split ( "\n" ) ;
String [ ] items = text . split ( "\n" ) ; // 按行分割文本
int index = 0 ;
int index = 0 ;
for ( String item : items ) {
for ( String item : items ) {
if ( ! TextUtils . isEmpty ( item ) ) {
if ( ! TextUtils . isEmpty ( item ) ) {
mEditTextList . addView ( getListItem ( item , index ) ) ;
mEditTextList . addView ( getListItem ( item , index ) ) ; // 添加列表项
index + + ;
index + + ;
}
}
}
}
mEditTextList . addView ( getListItem ( "" , index ) ) ;
mEditTextList . addView ( getListItem ( "" , index ) ) ; // 添加最后一个空列表项
mEditTextList . getChildAt ( index ) . findViewById ( R . id . et_edit_text ) . requestFocus ( ) ;
mEditTextList . getChildAt ( index ) . findViewById ( R . id . et_edit_text ) . requestFocus ( ) ; // 设置焦点
mNoteEditor . setVisibility ( View . GONE ) ;
mNoteEditor . setVisibility ( View . GONE ) ; // 隐藏普通编辑器
mEditTextList . setVisibility ( View . VISIBLE ) ;
mEditTextList . setVisibility ( View . VISIBLE ) ; // 显示清单编辑器
}
}
/ * *
* 获 取 高 亮 查 询 结 果
* 对 文 本 中 的 查 询 关 键 词 进 行 高 亮 处 理
* @param fullText 完 整 文 本
* @param userQuery 用 户 查 询 字 符 串
* @return 带 有 高 亮 效 果 的 文 本
* /
private Spannable getHighlightQueryResult ( String fullText , String userQuery ) {
private Spannable getHighlightQueryResult ( String fullText , String userQuery ) {
SpannableString spannable = new SpannableString ( fullText = = null ? "" : fullText ) ;
SpannableString spannable = new SpannableString ( fullText = = null ? "" : fullText ) ;
if ( ! TextUtils . isEmpty ( userQuery ) ) {
if ( ! TextUtils . isEmpty ( userQuery ) ) {
mPattern = Pattern . compile ( userQuery ) ;
mPattern = Pattern . compile ( userQuery ) ; // 编译正则表达式
Matcher m = mPattern . matcher ( fullText ) ;
Matcher m = mPattern . matcher ( fullText ) ; // 创建匹配器
int start = 0 ;
int start = 0 ;
while ( m . find ( start ) ) {
while ( m . find ( start ) ) {
// 设置高亮背景色
spannable . setSpan (
spannable . setSpan (
new BackgroundColorSpan ( this . getResources ( ) . getColor (
new BackgroundColorSpan ( this . getResources ( ) . getColor (
R . color . user_query_highlight ) ) , m . start ( ) , m . end ( ) ,
R . color . user_query_highlight ) ) , m . start ( ) , m . end ( ) ,
@ -725,10 +898,19 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return spannable ;
return spannable ;
}
}
/ * *
* 获 取 列 表 项 视 图
* 创 建 并 初 始 化 清 单 模 式 下 的 单 个 列 表 项 视 图
* @param item 列 表 项 文 本
* @param index 列 表 项 索 引
* @return 列 表 项 视 图
* /
private View getListItem ( String item , int index ) {
private View getListItem ( String item , int index ) {
View view = LayoutInflater . from ( this ) . inflate ( R . layout . note_edit_list_item , null ) ;
View view = LayoutInflater . from ( this ) . inflate ( R . layout . note_edit_list_item , null ) ;
final NoteEditText edit = ( NoteEditText ) view . findViewById ( R . id . et_edit_text ) ;
final NoteEditText edit = ( NoteEditText ) view . findViewById ( R . id . et_edit_text ) ;
edit . setTextAppearance ( this , TextAppearanceResources . getTexAppearanceResource ( mFontSizeId ) ) ;
edit . setTextAppearance ( this , TextAppearanceResources . getTexAppearanceResource ( mFontSizeId ) ) ;
// 设置复选框的选中状态变化监听器
CheckBox cb = ( ( CheckBox ) view . findViewById ( R . id . cb_edit_item ) ) ;
CheckBox cb = ( ( CheckBox ) view . findViewById ( R . id . cb_edit_item ) ) ;
cb . setOnCheckedChangeListener ( new OnCheckedChangeListener ( ) {
cb . setOnCheckedChangeListener ( new OnCheckedChangeListener ( ) {
public void onCheckedChanged ( CompoundButton buttonView , boolean isChecked ) {
public void onCheckedChanged ( CompoundButton buttonView , boolean isChecked ) {
@ -740,6 +922,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
} ) ;
} ) ;
// 处理已勾选和未勾选的标记
if ( item . startsWith ( TAG_CHECKED ) ) {
if ( item . startsWith ( TAG_CHECKED ) ) {
cb . setChecked ( true ) ;
cb . setChecked ( true ) ;
edit . setPaintFlags ( edit . getPaintFlags ( ) | Paint . STRIKE_THRU_TEXT_FLAG ) ;
edit . setPaintFlags ( edit . getPaintFlags ( ) | Paint . STRIKE_THRU_TEXT_FLAG ) ;
@ -756,6 +939,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return view ;
return view ;
}
}
/ * *
* 文 本 内 容 改 变 时 调 用
* 实 现 OnTextViewChangeListener 接 口
* @param index 当 前 索 引
* @param hasText 是 否 有 文 本 内 容
* /
public void onTextChange ( int index , boolean hasText ) {
public void onTextChange ( int index , boolean hasText ) {
if ( index > = mEditTextList . getChildCount ( ) ) {
if ( index > = mEditTextList . getChildCount ( ) ) {
Log . e ( TAG , "Wrong index, should not happen" ) ;
Log . e ( TAG , "Wrong index, should not happen" ) ;
@ -768,6 +957,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
}
}
/ * *
* 清 单 模 式 改 变 时 调 用
* 实 现 NoteSettingChangedListener 接 口
* @param oldMode 旧 模 式
* @param newMode 新 模 式
* /
public void onCheckListModeChanged ( int oldMode , int newMode ) {
public void onCheckListModeChanged ( int oldMode , int newMode ) {
if ( newMode = = TextNote . MODE_CHECK_LIST ) {
if ( newMode = = TextNote . MODE_CHECK_LIST ) {
switchToListMode ( mNoteEditor . getText ( ) . toString ( ) ) ;
switchToListMode ( mNoteEditor . getText ( ) . toString ( ) ) ;
@ -782,6 +977,11 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
}
}
/ * *
* 获 取 当 前 工 作 文 本
* 根 据 笔 记 模 式 获 取 当 前 编 辑 的 文 本 内 容
* @return 是 否 有 已 勾 选 的 项 目
* /
private boolean getWorkingText ( ) {
private boolean getWorkingText ( ) {
boolean hasChecked = false ;
boolean hasChecked = false ;
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
if ( mWorkingNote . getCheckListMode ( ) = = TextNote . MODE_CHECK_LIST ) {
@ -805,9 +1005,13 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return hasChecked ;
return hasChecked ;
}
}
/ * *
* 保 存 笔 记
* @return 是 否 保 存 成 功
* /
private boolean saveNote ( ) {
private boolean saveNote ( ) {
getWorkingText ( ) ;
getWorkingText ( ) ; // 获取当前工作文本
boolean saved = mWorkingNote . saveNote ( ) ;
boolean saved = mWorkingNote . saveNote ( ) ; // 保存笔记到数据库
if ( saved ) {
if ( saved ) {
/ * *
/ * *
* There are two modes from List view to edit view , open one note ,
* There are two modes from List view to edit view , open one note ,
@ -821,6 +1025,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return saved ;
return saved ;
}
}
/ * *
* 发 送 到 桌 面
* 在 桌 面 上 创 建 当 前 笔 记 的 快 捷 方 式
* /
private void sendToDesktop ( ) {
private void sendToDesktop ( ) {
/ * *
/ * *
* Before send message to home , we should make sure that current
* Before send message to home , we should make sure that current
@ -856,6 +1064,12 @@ public class NoteEditActivity extends Activity implements OnClickListener,
}
}
}
}
/ * *
* 创 建 快 捷 图 标 标 题
* 处 理 快 捷 图 标 标 题 , 移 除 标 记 并 限 制 长 度
* @param content 笔 记 内 容
* @return 快 捷 图 标 标 题
* /
private String makeShortcutIconTitle ( String content ) {
private String makeShortcutIconTitle ( String content ) {
content = content . replace ( TAG_CHECKED , "" ) ;
content = content . replace ( TAG_CHECKED , "" ) ;
content = content . replace ( TAG_UNCHECKED , "" ) ;
content = content . replace ( TAG_UNCHECKED , "" ) ;
@ -863,10 +1077,19 @@ public class NoteEditActivity extends Activity implements OnClickListener,
SHORTCUT_ICON_TITLE_MAX_LEN ) : content ;
SHORTCUT_ICON_TITLE_MAX_LEN ) : content ;
}
}
/ * *
* 显 示 短 时 间 提 示
* @param resId 提 示 文 本 资 源 ID
* /
private void showToast ( int resId ) {
private void showToast ( int resId ) {
showToast ( resId , Toast . LENGTH_SHORT ) ;
showToast ( resId , Toast . LENGTH_SHORT ) ;
}
}
/ * *
* 显 示 提 示
* @param resId 提 示 文 本 资 源 ID
* @param duration 提 示 持 续 时 间
* /
private void showToast ( int resId , int duration ) {
private void showToast ( int resId , int duration ) {
Toast . makeText ( this , resId , duration ) . show ( ) ;
Toast . makeText ( this , resId , duration ) . show ( ) ;
}
}