mirror of https://github.com/M66B/FairEmail.git
Ensure paragraph for block quotes
This commit is contained in:
parent
e9cf1d6edc
commit
c5ca100680
|
@ -131,7 +131,7 @@ public class StyleHelper {
|
||||||
case R.id.group_style_font:
|
case R.id.group_style_font:
|
||||||
return setFont(item);
|
return setFont(item);
|
||||||
case R.id.group_style_blockquote:
|
case R.id.group_style_blockquote:
|
||||||
return setBlockquote(item);
|
return setBlockQuote(item);
|
||||||
case R.id.group_style_strikethrough:
|
case R.id.group_style_strikethrough:
|
||||||
return setStrikethrough(item);
|
return setStrikethrough(item);
|
||||||
case R.id.group_style_clear:
|
case R.id.group_style_clear:
|
||||||
|
@ -308,13 +308,17 @@ public class StyleHelper {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean setBlockquote(MenuItem item) {
|
private boolean setBlockQuote(MenuItem item) {
|
||||||
Context context = etBody.getContext();
|
Context context = etBody.getContext();
|
||||||
|
|
||||||
int colorPrimary = Helper.resolveColor(context, R.attr.colorPrimary);
|
int colorPrimary = Helper.resolveColor(context, R.attr.colorPrimary);
|
||||||
int dp3 = Helper.dp2pixels(context, 3);
|
int dp3 = Helper.dp2pixels(context, 3);
|
||||||
int dp6 = Helper.dp2pixels(context, 6);
|
int dp6 = Helper.dp2pixels(context, 6);
|
||||||
|
|
||||||
|
Pair<Integer, Integer> paragraph = ensureParagraph(t, s, e);
|
||||||
|
int start = paragraph.first;
|
||||||
|
int end = paragraph.second;
|
||||||
|
|
||||||
QuoteSpan[] spans = t.getSpans(s, e, QuoteSpan.class);
|
QuoteSpan[] spans = t.getSpans(s, e, QuoteSpan.class);
|
||||||
for (QuoteSpan span : spans)
|
for (QuoteSpan span : spans)
|
||||||
t.removeSpan(span);
|
t.removeSpan(span);
|
||||||
|
@ -324,10 +328,10 @@ public class StyleHelper {
|
||||||
q = new QuoteSpan(colorPrimary);
|
q = new QuoteSpan(colorPrimary);
|
||||||
else
|
else
|
||||||
q = new QuoteSpan(colorPrimary, dp3, dp6);
|
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.setText(t);
|
||||||
etBody.setSelection(s, e);
|
etBody.setSelection(start, end);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -367,41 +371,6 @@ public class StyleHelper {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Pair<Integer, Integer> 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();
|
popupMenu.show();
|
||||||
|
@ -463,11 +432,47 @@ public class StyleHelper {
|
||||||
if (span instanceof CharacterStyle)
|
if (span instanceof CharacterStyle)
|
||||||
ss.setSpan(CharacterStyle.wrap((CharacterStyle) span), start, end, flags);
|
ss.setSpan(CharacterStyle.wrap((CharacterStyle) span), start, end, flags);
|
||||||
else if (span instanceof QuoteSpan) {
|
else if (span instanceof QuoteSpan) {
|
||||||
ParagraphStyle p = (ParagraphStyle) span;
|
ParagraphStyle ps = (ParagraphStyle) span;
|
||||||
ss.setSpan(clone(span, p.getClass(), context), start, end, flags);
|
Pair<Integer, Integer> p = ensureParagraph(ss, start, end);
|
||||||
|
ss.setSpan(clone(span, ps.getClass(), context), p.first, p.second, flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static private Pair<Integer, Integer> 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 extends ParagraphStyle> T clone(Object span, Class<T> type, Context context) {
|
static <T extends ParagraphStyle> T clone(Object span, Class<T> type, Context context) {
|
||||||
if (QuoteSpan.class.isAssignableFrom(type)) {
|
if (QuoteSpan.class.isAssignableFrom(type)) {
|
||||||
QuoteSpan q = (QuoteSpan) span;
|
QuoteSpan q = (QuoteSpan) span;
|
||||||
|
|
Loading…
Reference in New Issue