完整版提交 #32

Merged
p6vxzahlf merged 1 commits from wangyijia_branch into master 2 months ago

@ -16,7 +16,9 @@
package net.micode.notes.ui; package net.micode.notes.ui;
import android.app.Activity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.PendingIntent; import android.app.PendingIntent;
@ -120,7 +122,7 @@ import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
public class NoteEditActivity extends Activity implements OnClickListener, public class NoteEditActivity extends AppCompatActivity implements OnClickListener,
NoteSettingChangedListener, OnTextViewChangeListener, OnSelectionChangeListener { NoteSettingChangedListener, OnTextViewChangeListener, OnSelectionChangeListener {
private class HeadViewHolder { private class HeadViewHolder {
public TextView tvModified; public TextView tvModified;
@ -366,6 +368,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
private HeadViewHolder mNoteHeaderHolder; private HeadViewHolder mNoteHeaderHolder;
private TextView mTvEmotion;
private View mHeadViewPanel; private View mHeadViewPanel;
private View mNoteBgColorSelector; private View mNoteBgColorSelector;
@ -449,6 +453,35 @@ public class NoteEditActivity extends Activity implements OnClickListener,
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);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_edit);
if (toolbar != null) {
// ensure toolbar title is visible and matches theme
try {
toolbar.setTitleTextColor(ContextCompat.getColor(this, android.R.color.white));
} catch (Exception ignored) {}
toolbar.setVisibility(View.VISIBLE);
toolbar.bringToFront();
toolbar.setTitle(R.string.app_name);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
// try to ensure overflow icon visible
try {
toolbar.setOverflowIcon(ContextCompat.getDrawable(this, android.R.drawable.ic_menu_more));
} catch (Exception ignored) {}
try {
toolbar.inflateMenu(R.menu.note_edit);
} catch (Exception e) {
// fail silently if menu resource not found
}
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return NoteEditActivity.this.onOptionsItemSelected(item);
}
});
}
if (savedInstanceState == null && !initActivityState(getIntent())) { if (savedInstanceState == null && !initActivityState(getIntent())) {
finish(); finish();
@ -1283,20 +1316,48 @@ public class NoteEditActivity extends Activity implements OnClickListener,
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);
} }
if (mWorkingNote.hasClockAlert()) { if (mWorkingNote.hasClockAlert()) {
menu.findItem(R.id.menu_alert).setVisible(false); MenuItem alertItem = menu.findItem(R.id.menu_alert);
if (alertItem != null) {
alertItem.setVisible(false);
}
} else { } else {
menu.findItem(R.id.menu_delete_remind).setVisible(false); MenuItem deleteRemindItem = menu.findItem(R.id.menu_delete_remind);
if (deleteRemindItem != null) {
deleteRemindItem.setVisible(false);
}
} }
// 习惯相关菜单处理 // 习惯相关菜单处理
boolean isHabit = mWorkingNote.isHabit(); boolean isHabit = mWorkingNote.isHabit();
menu.findItem(R.id.menu_set_habit).setVisible(!isHabit); MenuItem setHabitItem = menu.findItem(R.id.menu_set_habit);
menu.findItem(R.id.menu_habit_settings).setVisible(isHabit); if (setHabitItem != null) {
menu.findItem(R.id.menu_stop_habit).setVisible(isHabit); setHabitItem.setVisible(!isHabit);
}
MenuItem habitSettingsItem = menu.findItem(R.id.menu_habit_settings);
if (habitSettingsItem != null) {
habitSettingsItem.setVisible(isHabit);
}
MenuItem stopHabitItem = menu.findItem(R.id.menu_stop_habit);
if (stopHabitItem != null) {
stopHabitItem.setVisible(isHabit);
}
// pinned menu
MenuItem pinItem = menu.findItem(R.id.menu_pin);
if (pinItem != null) {
if (mWorkingNote.isPinned()) {
pinItem.setTitle(R.string.menu_unpin);
} else {
pinItem.setTitle(R.string.menu_pin);
}
}
return true; return true;
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.menu_new_note://新建笔记 case R.id.menu_new_note://新建笔记
createNewNote(); createNewNote();
@ -1345,6 +1406,18 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mWorkingNote.setHabit(true, ""); mWorkingNote.setHabit(true, "");
showHabitConfigDialog(); showHabitConfigDialog();
break; break;
case R.id.menu_pin:
boolean newState = !mWorkingNote.isPinned();
mWorkingNote.setPinned(newState);
mWorkingNote.saveNote();
setResult(RESULT_OK);
invalidateOptionsMenu();
if (newState) {
Toast.makeText(this, R.string.pinned_label, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, R.string.menu_unpin, Toast.LENGTH_SHORT).show();
}
break;
case R.id.menu_habit_settings: case R.id.menu_habit_settings:
// 显示习惯设置对话框 // 显示习惯设置对话框
showHabitConfigDialog(); showHabitConfigDialog();
@ -1378,6 +1451,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mImageInsertHelper.startPickImage(); mImageInsertHelper.startPickImage();
} }
break; break;
default: default:
break; break;
} }
@ -1634,27 +1708,30 @@ public class NoteEditActivity extends Activity implements OnClickListener,
focused.findViewById(R.id.et_edit_text).requestFocus(); focused.findViewById(R.id.et_edit_text).requestFocus();
} else { } else {
// 普通模式下,直接显示翻译结果 // 普通模式下,直接显示翻译结果
SpannableString spannable = new SpannableString(result); // 构建 HTML 格式的字符串,使用 <span> 标签来设置翻译结果的颜色
StringBuilder htmlBuilder = new StringBuilder();
// 分析文本结构:原文和翻译交替出现 // 分析文本结构:原文和翻译交替出现
// 格式原文1\n翻译1\n原文2\n翻译2\n... // 格式原文1\n翻译1\n原文2\n翻译2\n...
String[] lines = result.split("\n"); String[] lines = result.split("\n");
int currentPosition = 0;
boolean isTranslation = false; boolean isTranslation = false;
for (String line : lines) { for (String line : lines) {
if (!TextUtils.isEmpty(line)) { if (!TextUtils.isEmpty(line)) {
if (isTranslation) { if (isTranslation) {
// 设置翻译结果为浅灰色 // 设置翻译结果为浅灰色
int start = currentPosition; htmlBuilder.append("<span style=\"color:#999999;\">");
int end = currentPosition + line.length(); htmlBuilder.append(line);
spannable.setSpan(new ForegroundColorSpan(Color.parseColor("#999999")), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); htmlBuilder.append("</span>");
} else {
// 原文保持默认颜色
htmlBuilder.append(line);
} }
isTranslation = !isTranslation; isTranslation = !isTranslation;
} }
currentPosition += line.length() + 1; // +1 for newline htmlBuilder.append("<br>");
} }
mNoteEditor.setHtml(spannable.toString()); mNoteEditor.setHtml(htmlBuilder.toString());
// scroll to first translation // scroll to first translation
// RichEditor doesn't support setSelection method, so we skip this // RichEditor doesn't support setSelection method, so we skip this
} }
@ -1809,6 +1886,27 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteEditor.setVisibility(View.GONE);//隐藏编辑框 mNoteEditor.setVisibility(View.GONE);//隐藏编辑框
mEditTextList.setVisibility(View.VISIBLE); mEditTextList.setVisibility(View.VISIBLE);
// 更新列表模式下的字符统计
updateListModeCharCount();
}
// 更新列表模式下的字符统计
private void updateListModeCharCount() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mEditTextList.getChildCount(); i++) {
View child = mEditTextList.getChildAt(i);
EditText et = (EditText) child.findViewById(R.id.et_edit_text);
if (et != null) {
String text = et.getText().toString();
if (!TextUtils.isEmpty(text)) {
sb.append(text).append("\n");
}
}
}
String listText = sb.toString();
int charCount = calcVisibleCharCount(listText);
mNoteHeaderHolder.tvCharNum.setText("字符数:" + charCount);
} }
private Spannable getHighlightQueryResult(String fullText, String userQuery) { private Spannable getHighlightQueryResult(String fullText, String userQuery) {
@ -1906,6 +2004,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} else { } else {
edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);//清除删除线效果 edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);//清除删除线效果
} }
// 复选框状态变化时也更新字符统计
updateListModeCharCount();
} }
}); });
@ -1922,6 +2022,20 @@ public class NoteEditActivity extends Activity implements OnClickListener,
edit.setOnTextViewChangeListener(this); edit.setOnTextViewChangeListener(this);
//新增选区变化回调接口设置 //新增选区变化回调接口设置
edit.setOnSelectionChangeListener(this); edit.setOnSelectionChangeListener(this);
// 添加文本变化监听器,用于更新字符统计
edit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 更新列表模式下的字符统计
updateListModeCharCount();
}
@Override
public void afterTextChanged(Editable s) {}
});
edit.setIndex(index); edit.setIndex(index);
edit.setText(getHighlightQueryResult(item, mUserQuery)); edit.setText(getHighlightQueryResult(item, mUserQuery));
return view; return view;

Loading…
Cancel
Save