diff --git a/app/src/main/java/eu/faircode/email/StyleHelper.java b/app/src/main/java/eu/faircode/email/StyleHelper.java index 95582f415b..b6b080d871 100644 --- a/app/src/main/java/eu/faircode/email/StyleHelper.java +++ b/app/src/main/java/eu/faircode/email/StyleHelper.java @@ -131,7 +131,7 @@ public class StyleHelper { case R.id.group_style_font: return setFont(item); case R.id.group_style_blockquote: - return setBlockquote(item); + return setBlockQuote(item); case R.id.group_style_strikethrough: return setStrikethrough(item); case R.id.group_style_clear: @@ -308,13 +308,17 @@ public class StyleHelper { return true; } - private boolean setBlockquote(MenuItem item) { + private boolean setBlockQuote(MenuItem item) { Context context = etBody.getContext(); int colorPrimary = Helper.resolveColor(context, R.attr.colorPrimary); int dp3 = Helper.dp2pixels(context, 3); int dp6 = Helper.dp2pixels(context, 6); + Pair paragraph = ensureParagraph(t, s, e); + int start = paragraph.first; + int end = paragraph.second; + QuoteSpan[] spans = t.getSpans(s, e, QuoteSpan.class); for (QuoteSpan span : spans) t.removeSpan(span); @@ -324,10 +328,10 @@ public class StyleHelper { q = new QuoteSpan(colorPrimary); else q = new QuoteSpan(colorPrimary, dp3, dp6); - t.setSpan(q, s, e, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + t.setSpan(q, start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); etBody.setText(t); - etBody.setSelection(s, e); + etBody.setSelection(start, end); return true; } @@ -367,41 +371,6 @@ public class StyleHelper { return true; } - - private Pair ensureParagraph(SpannableStringBuilder t, int s, int e) { - int start = s; - int end = e; - - // Expand selection at start - while (start > 0 && t.charAt(start - 1) != '\n') - start--; - - // Expand selection at end - while (end > 0 && end < t.length() && t.charAt(end - 1) != '\n') - end++; - - // Nothing to do - if (start == end) - return null; - - // Create paragraph at start - if (start == 0 && t.charAt(start) != '\n') { - t.insert(0, "\n"); - start++; - end++; - } - - // Create paragraph at end - if (end == t.length() && t.charAt(end - 1) != '\n') { - t.append("\n"); - end++; - } - - if (end == t.length()) - t.append("\n"); // workaround Android bug - - return new Pair(start, end); - } }); popupMenu.show(); @@ -463,11 +432,47 @@ public class StyleHelper { if (span instanceof CharacterStyle) ss.setSpan(CharacterStyle.wrap((CharacterStyle) span), start, end, flags); else if (span instanceof QuoteSpan) { - ParagraphStyle p = (ParagraphStyle) span; - ss.setSpan(clone(span, p.getClass(), context), start, end, flags); + ParagraphStyle ps = (ParagraphStyle) span; + Pair p = ensureParagraph(ss, start, end); + ss.setSpan(clone(span, ps.getClass(), context), p.first, p.second, flags); } } + static private Pair ensureParagraph(SpannableStringBuilder t, int s, int e) { + int start = s; + int end = e; + + // Expand selection at start + while (start > 0 && t.charAt(start - 1) != '\n') + start--; + + // Expand selection at end + while (end > 0 && end < t.length() && t.charAt(end - 1) != '\n') + end++; + + // Nothing to do + if (start == end) + return null; + + // Create paragraph at start + if (start == 0 && t.charAt(start) != '\n') { + t.insert(0, "\n"); + start++; + end++; + } + + // Create paragraph at end + if (end == t.length() && t.charAt(end - 1) != '\n') { + t.append("\n"); + end++; + } + + if (end == t.length()) + t.append("\n"); // workaround Android bug + + return new Pair(start, end); + } + static T clone(Object span, Class type, Context context) { if (QuoteSpan.class.isAssignableFrom(type)) { QuoteSpan q = (QuoteSpan) span;