Added style option to keep selection

pull/212/head
M66B 3 years ago
parent 63e49f06ed
commit a2aa2d6a51

@ -119,7 +119,8 @@ public class StyleHelper {
R.id.menu_style_spell_check, R.id.menu_style_spell_check,
R.id.menu_style_password, R.id.menu_style_password,
R.id.menu_style_code, 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; 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_indentation && groupId != group_style_indentation &&
itemId != R.id.menu_style_blockquote && itemId != R.id.menu_style_blockquote &&
itemId != R.id.menu_style_insert_line && 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<Integer, Integer> word = getWord(etBody); Pair<Integer, Integer> word = getWord(etBody);
if (word == null) if (word == null)
return false; return false;
@ -417,19 +420,22 @@ public class StyleHelper {
end = word.second; end = word.second;
} }
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(etBody.getContext());
boolean keep_selection = prefs.getBoolean("style_setting_keep_selection", false);
if (groupId < 0) { if (groupId < 0) {
if (itemId == R.id.menu_bold || itemId == R.id.menu_italic) 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) 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) else if (itemId == R.id.menu_style_size)
return selectSize(owner, anchor, etBody); return selectSize(owner, anchor, etBody);
else if (itemId == R.id.menu_style_background) 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) 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) 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) else if (itemId == R.id.menu_style_align)
return selectAlignment(owner, anchor, etBody, start, end); return selectAlignment(owner, anchor, etBody, start, end);
else if (itemId == R.id.menu_style_list) else if (itemId == R.id.menu_style_list)
@ -441,17 +447,17 @@ public class StyleHelper {
Pair<Integer, Integer> block = StyleHelper.getParagraph(etBody, true); Pair<Integer, Integer> block = StyleHelper.getParagraph(etBody, true);
if (block == null) if (block == null)
return false; return false;
return StyleHelper.setBlockQuote(etBody, block.first, block.second, false); return StyleHelper.setBlockQuote(etBody, block.first, block.second, keep_selection);
} else } else
return setBlockQuote(etBody, start, end, false); return setBlockQuote(etBody, start, end, keep_selection);
} else if (itemId == R.id.menu_style_mark) } 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) 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) 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) 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) else if (itemId == R.id.menu_style_insert_line)
return setLine(etBody, end); return setLine(etBody, end);
else if (itemId == R.id.menu_style_spell_check) else if (itemId == R.id.menu_style_spell_check)
@ -460,15 +466,17 @@ public class StyleHelper {
return setPassword(owner, etBody, start, end); return setPassword(owner, etBody, start, end);
else if (itemId == R.id.menu_style_code) { else if (itemId == R.id.menu_style_code) {
Log.breadcrumb("style", "action", "code"); Log.breadcrumb("style", "action", "code");
setSize(etBody, start, end, HtmlHelper.FONT_SMALL, false); setSize(etBody, start, end, HtmlHelper.FONT_SMALL, keep_selection);
setFont(etBody, start, end, "monospace", false); setFont(etBody, start, end, "monospace", keep_selection);
return true; return true;
} else if (itemId == R.id.menu_link) } else if (itemId == R.id.menu_link)
return setLink(etBody, start, end, args); return setLink(etBody, start, end, args);
else if (itemId == R.id.menu_style_clear) 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) 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 { } else {
switch (groupId) { switch (groupId) {
case group_style_size: { case group_style_size: {
@ -484,21 +492,21 @@ public class StyleHelper {
else else
size = null; 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_standard:
case group_style_font_custom: 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: { case group_style_align: {
if (start == end) { if (start == end) {
Pair<Integer, Integer> block = StyleHelper.getParagraph(etBody, true); Pair<Integer, Integer> block = StyleHelper.getParagraph(etBody, true);
if (block == null) if (block == null)
return false; return false;
return setAlignment(itemId, etBody, block.first, block.second, false); return setAlignment(itemId, etBody, block.first, block.second, keep_selection);
} else } else
return setAlignment(itemId, etBody, start, end, false); return setAlignment(itemId, etBody, start, end, keep_selection);
} }
case group_style_list: { case group_style_list: {
@ -508,14 +516,14 @@ public class StyleHelper {
if (p == null) if (p == null)
return false; return false;
if (level) if (level)
return StyleHelper.setListLevel(itemId, etBody, p.first, p.second, false); return StyleHelper.setListLevel(itemId, etBody, p.first, p.second, keep_selection);
else else
return StyleHelper.setList(itemId, etBody, p.first, p.second, false); return StyleHelper.setList(itemId, etBody, p.first, p.second, keep_selection);
} else { } else {
if (level) if (level)
return setListLevel(itemId, etBody, start, end, false); return setListLevel(itemId, etBody, start, end, keep_selection);
else else
return setList(itemId, etBody, start, end, false); return setList(itemId, etBody, start, end, keep_selection);
} }
} }
@ -524,9 +532,9 @@ public class StyleHelper {
Pair<Integer, Integer> block = StyleHelper.getParagraph(etBody, true); Pair<Integer, Integer> block = StyleHelper.getParagraph(etBody, true);
if (block == null) if (block == null)
return false; return false;
return StyleHelper.setIndentation(itemId, etBody, block.first, block.second, false); return StyleHelper.setIndentation(itemId, etBody, block.first, block.second, keep_selection);
} else } 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; 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"); Log.breadcrumb("style", "action", "selectBackground");
Helper.hideKeyboard(etBody); Helper.hideKeyboard(etBody);
@ -673,13 +681,13 @@ public class StyleHelper {
.setPositiveButton(android.R.string.ok, new ColorPickerClickListener() { .setPositiveButton(android.R.string.ok, new ColorPickerClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) { 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() { .setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { 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); 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"); Log.breadcrumb("style", "action", "selectColor");
Helper.hideKeyboard(etBody); Helper.hideKeyboard(etBody);
@ -733,13 +741,13 @@ public class StyleHelper {
.setPositiveButton(android.R.string.ok, new ColorPickerClickListener() { .setPositiveButton(android.R.string.ok, new ColorPickerClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int selectedColor, Integer[] allColors) { 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() { .setNegativeButton(R.string.title_reset, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { 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); 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"); Log.breadcrumb("style", "action", "selectFont");
Context context = anchor.getContext(); Context context = anchor.getContext();
@ -794,7 +802,7 @@ public class StyleHelper {
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override @Override
public boolean onMenuItemClick(MenuItem item) { 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); etBody.setSelection(select ? start : end, end);
return true; 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) { static boolean splitSpan(Editable edit, int start, int end, int s, int e, int f, boolean extend, Object span1, Object span2) {

@ -343,5 +343,20 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/twotone_format_clear_24" app:srcCompat="@drawable/twotone_format_clear_24"
app:tint="@color/action_foreground" /> app:tint="@color/action_foreground" />
<ImageButton
android:id="@+id/menu_style_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/menu_setup"
android:paddingHorizontal="12dp"
android:paddingVertical="6dp"
android:scaleType="fitCenter"
android:tooltipText="@string/menu_setup"
app:layout_constraintStart_toEndOf="@id/menu_style_clear"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/twotone_settings_24"
app:tint="@color/action_foreground" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</HorizontalScrollView> </HorizontalScrollView>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_style_setting_keep_selection"
android:checkable="true"
android:title="@string/title_style_setting_keep_selection" />
</menu>

@ -1536,6 +1536,8 @@
<string name="title_style_protected">Protected content</string> <string name="title_style_protected">Protected content</string>
<string name="title_style_protect_size">Text too long</string> <string name="title_style_protect_size">Text too long</string>
<string name="title_style_clear">Clear formatting</string> <string name="title_style_clear">Clear formatting</string>
<string name="title_style_setting_keep_selection">Keep selection</string>
<string name="title_style_link">Insert link</string> <string name="title_style_link">Insert link</string>
<string name="title_style_link_address">Address</string> <string name="title_style_link_address">Address</string>
<string name="title_style_link_image">Insert as an image</string> <string name="title_style_link_image">Insert as an image</string>

Loading…
Cancel
Save