From a2aa2d6a51d966d58bd4245c4a15cfbb8f956091 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 27 Jan 2023 08:53:52 +0100 Subject: [PATCH] Added style option to keep selection --- .../java/eu/faircode/email/StyleHelper.java | 107 ++++++++++++------ app/src/main/res/layout/include_style_bar.xml | 15 +++ .../main/res/menu/popup_style_settings.xml | 7 ++ app/src/main/res/values/strings.xml | 2 + 4 files changed, 96 insertions(+), 35 deletions(-) create mode 100644 app/src/main/res/menu/popup_style_settings.xml diff --git a/app/src/main/java/eu/faircode/email/StyleHelper.java b/app/src/main/java/eu/faircode/email/StyleHelper.java index 46a18a2dd2..ebcd78d293 100644 --- a/app/src/main/java/eu/faircode/email/StyleHelper.java +++ b/app/src/main/java/eu/faircode/email/StyleHelper.java @@ -119,7 +119,8 @@ public class StyleHelper { R.id.menu_style_spell_check, R.id.menu_style_password, R.id.menu_style_code, - R.id.menu_style_clear + R.id.menu_style_clear, + R.id.menu_style_settings }; private static final int group_style_size = 1; @@ -409,7 +410,9 @@ public class StyleHelper { itemId != R.id.menu_style_indentation && groupId != group_style_indentation && itemId != R.id.menu_style_blockquote && itemId != R.id.menu_style_insert_line && - itemId != R.id.menu_style_insert_answer) { + itemId != R.id.menu_style_insert_answer && + itemId != R.id.menu_style_spell_check && + itemId != R.id.menu_style_settings) { Pair word = getWord(etBody); if (word == null) return false; @@ -417,19 +420,22 @@ public class StyleHelper { end = word.second; } + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(etBody.getContext()); + boolean keep_selection = prefs.getBoolean("style_setting_keep_selection", false); + if (groupId < 0) { if (itemId == R.id.menu_bold || itemId == R.id.menu_italic) - return setBoldItalic(itemId, etBody, start, end, false); + return setBoldItalic(itemId, etBody, start, end, keep_selection); else if (itemId == R.id.menu_underline) - return setUnderline(etBody, start, end, false); + return setUnderline(etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_size) return selectSize(owner, anchor, etBody); else if (itemId == R.id.menu_style_background) - return selectBackground(etBody, start, end); + return selectBackground(etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_color) - return selectColor(etBody, start, end); + return selectColor(etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_font) - return selectFont(owner, anchor, etBody, start, end); + return selectFont(owner, anchor, etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_align) return selectAlignment(owner, anchor, etBody, start, end); else if (itemId == R.id.menu_style_list) @@ -441,17 +447,17 @@ public class StyleHelper { Pair block = StyleHelper.getParagraph(etBody, true); if (block == null) return false; - return StyleHelper.setBlockQuote(etBody, block.first, block.second, false); + return StyleHelper.setBlockQuote(etBody, block.first, block.second, keep_selection); } else - return setBlockQuote(etBody, start, end, false); + return setBlockQuote(etBody, start, end, keep_selection); } else if (itemId == R.id.menu_style_mark) - return setMark(etBody, start, end, false); + return setMark(etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_subscript) - return setSubscript(etBody, start, end, false); + return setSubscript(etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_superscript) - return setSuperscript(etBody, start, end, false); + return setSuperscript(etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_strikethrough) - return setStrikeThrough(etBody, start, end, false); + return setStrikeThrough(etBody, start, end, keep_selection); else if (itemId == R.id.menu_style_insert_line) return setLine(etBody, end); else if (itemId == R.id.menu_style_spell_check) @@ -460,15 +466,17 @@ public class StyleHelper { return setPassword(owner, etBody, start, end); else if (itemId == R.id.menu_style_code) { Log.breadcrumb("style", "action", "code"); - setSize(etBody, start, end, HtmlHelper.FONT_SMALL, false); - setFont(etBody, start, end, "monospace", false); + setSize(etBody, start, end, HtmlHelper.FONT_SMALL, keep_selection); + setFont(etBody, start, end, "monospace", keep_selection); return true; } else if (itemId == R.id.menu_link) return setLink(etBody, start, end, args); else if (itemId == R.id.menu_style_clear) - return clear(etBody, start, end, false); + return clear(etBody, start, end, keep_selection); else if (itemId == R.id.menu_clear) - return clearAll(etBody, start, end, false); + return clearAll(etBody, start, end, keep_selection); + else if (itemId == R.id.menu_style_settings) + return updateSettings(owner, etBody, anchor, start, end, keep_selection); } else { switch (groupId) { case group_style_size: { @@ -484,21 +492,21 @@ public class StyleHelper { else size = null; - return setSize(etBody, start, end, size, false); + return setSize(etBody, start, end, size, keep_selection); } case group_style_font_standard: case group_style_font_custom: - return setFont(etBody, start, end, (String) args[0], false); + return setFont(etBody, start, end, (String) args[0], keep_selection); case group_style_align: { if (start == end) { Pair block = StyleHelper.getParagraph(etBody, true); if (block == null) return false; - return setAlignment(itemId, etBody, block.first, block.second, false); + return setAlignment(itemId, etBody, block.first, block.second, keep_selection); } else - return setAlignment(itemId, etBody, start, end, false); + return setAlignment(itemId, etBody, start, end, keep_selection); } case group_style_list: { @@ -508,14 +516,14 @@ public class StyleHelper { if (p == null) return false; if (level) - return StyleHelper.setListLevel(itemId, etBody, p.first, p.second, false); + return StyleHelper.setListLevel(itemId, etBody, p.first, p.second, keep_selection); else - return StyleHelper.setList(itemId, etBody, p.first, p.second, false); + return StyleHelper.setList(itemId, etBody, p.first, p.second, keep_selection); } else { if (level) - return setListLevel(itemId, etBody, start, end, false); + return setListLevel(itemId, etBody, start, end, keep_selection); else - return setList(itemId, etBody, start, end, false); + return setList(itemId, etBody, start, end, keep_selection); } } @@ -524,9 +532,9 @@ public class StyleHelper { Pair block = StyleHelper.getParagraph(etBody, true); if (block == null) return false; - return StyleHelper.setIndentation(itemId, etBody, block.first, block.second, false); + return StyleHelper.setIndentation(itemId, etBody, block.first, block.second, keep_selection); } else - return setIndentation(itemId, etBody, start, end, false); + return setIndentation(itemId, etBody, start, end, keep_selection); } } } @@ -654,7 +662,7 @@ public class StyleHelper { return true; } - static boolean selectBackground(EditText etBody, int start, int end) { + static boolean selectBackground(EditText etBody, int start, int end, boolean select) { Log.breadcrumb("style", "action", "selectBackground"); Helper.hideKeyboard(etBody); @@ -673,13 +681,13 @@ public class StyleHelper { .setPositiveButton(android.R.string.ok, new ColorPickerClickListener() { @Override public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) { - setBackground(etBody, start, end, selectedColor, false); + setBackground(etBody, start, end, selectedColor, select); } }) .setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - setBackground(etBody, start, end, null, false); + setBackground(etBody, start, end, null, select); } }); @@ -714,7 +722,7 @@ public class StyleHelper { etBody.setSelection(select ? start : end, end); } - static boolean selectColor(EditText etBody, int start, int end) { + static boolean selectColor(EditText etBody, int start, int end, boolean select) { Log.breadcrumb("style", "action", "selectColor"); Helper.hideKeyboard(etBody); @@ -733,13 +741,13 @@ public class StyleHelper { .setPositiveButton(android.R.string.ok, new ColorPickerClickListener() { @Override public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) { - setColor(etBody, start, end, selectedColor, false); + setColor(etBody, start, end, selectedColor, select); } }) .setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - setColor(etBody, start, end, null, false); + setColor(etBody, start, end, null, select); } }); @@ -774,7 +782,7 @@ public class StyleHelper { etBody.setSelection(select ? start : end, end); } - static boolean selectFont(LifecycleOwner owner, View anchor, EditText etBody, int start, int end) { + static boolean selectFont(LifecycleOwner owner, View anchor, EditText etBody, int start, int end, boolean select) { Log.breadcrumb("style", "action", "selectFont"); Context context = anchor.getContext(); @@ -794,7 +802,7 @@ public class StyleHelper { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { - return setFont(etBody, start, end, item.getIntent().getStringExtra("face"), false); + return setFont(etBody, start, end, item.getIntent().getStringExtra("face"), select); } }); @@ -1434,7 +1442,36 @@ public class StyleHelper { etBody.setSelection(select ? start : end, end); return true; + } + + static boolean updateSettings(LifecycleOwner owner, EditText etBody, View anchor, int start, int end, boolean select) { + Log.breadcrumb("style", "action", "updateSettings"); + + Context context = anchor.getContext(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, owner, anchor); + popupMenu.inflate(R.menu.popup_style_settings); + + popupMenu.getMenu().findItem(R.id.menu_style_setting_keep_selection).setChecked(select); + + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + int itemId = item.getItemId(); + if (itemId == R.id.menu_style_setting_keep_selection) { + boolean keep = !item.isChecked(); + prefs.edit().putBoolean("style_setting_keep_selection", keep).apply(); + etBody.setSelection(keep ? start : end, end); + return true; + } else + return false; + } + }); + popupMenu.show(); + + return true; } static boolean splitSpan(Editable edit, int start, int end, int s, int e, int f, boolean extend, Object span1, Object span2) { diff --git a/app/src/main/res/layout/include_style_bar.xml b/app/src/main/res/layout/include_style_bar.xml index 3ac847a3a7..682b33412b 100644 --- a/app/src/main/res/layout/include_style_bar.xml +++ b/app/src/main/res/layout/include_style_bar.xml @@ -343,5 +343,20 @@ app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/twotone_format_clear_24" app:tint="@color/action_foreground" /> + + diff --git a/app/src/main/res/menu/popup_style_settings.xml b/app/src/main/res/menu/popup_style_settings.xml new file mode 100644 index 0000000000..58b3ebf63a --- /dev/null +++ b/app/src/main/res/menu/popup_style_settings.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 30808001a0..89bfa81368 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1536,6 +1536,8 @@ Protected content Text too long Clear formatting + Keep selection + Insert link Address Insert as an image