NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/TextStyleSpan.java

183 lines
5.3 KiB
Java

/*
* This is the source code of Telegram for Android v. 5.x.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2018.
*/
package org.telegram.ui.Components;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
public class TextStyleSpan extends MetricAffectingSpan {
private int textSize;
private int color;
private TextStyleRun style;
public static class TextStyleRun {
public int flags;
public int start;
public int end;
public TLRPC.MessageEntity urlEntity;
public TextStyleRun() {
}
public TextStyleRun(TextStyleRun run) {
flags = run.flags;
start = run.start;
end = run.end;
urlEntity = run.urlEntity;
}
public void merge(TextStyleRun run) {
flags |= run.flags;
if (urlEntity == null && run.urlEntity != null) {
urlEntity = run.urlEntity;
}
}
public void replace(TextStyleRun run) {
flags = run.flags;
urlEntity = run.urlEntity;
}
public void applyStyle(TextPaint p) {
Typeface typeface = getTypeface();
if (typeface != null) {
p.setTypeface(typeface);
}
if ((flags & FLAG_STYLE_UNDERLINE) != 0) {
p.setFlags(p.getFlags() | Paint.UNDERLINE_TEXT_FLAG);
} else {
p.setFlags(p.getFlags() &~ Paint.UNDERLINE_TEXT_FLAG);
}
if ((flags & FLAG_STYLE_STRIKE) != 0) {
p.setFlags(p.getFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
p.setFlags(p.getFlags() &~ Paint.STRIKE_THRU_TEXT_FLAG);
}
if ((flags & FLAG_STYLE_SPOILER_REVEALED) != 0) {
p.bgColor = Theme.getColor(Theme.key_chats_archivePullDownBackground);
}
}
public Typeface getTypeface() {
if ((flags & FLAG_STYLE_MONO) != 0 || (flags & FLAG_STYLE_QUOTE) != 0) {
return Typeface.MONOSPACE;
} else if ((flags & FLAG_STYLE_BOLD) != 0 && (flags & FLAG_STYLE_ITALIC) != 0) {
return AndroidUtilities.getTypeface("fonts/rmediumitalic.ttf");
} else if ((flags & FLAG_STYLE_BOLD) != 0) {
return AndroidUtilities.getTypeface("fonts/rmedium.ttf");
} else if ((flags & FLAG_STYLE_ITALIC) != 0) {
return AndroidUtilities.getTypeface("fonts/ritalic.ttf");
} else {
return null;
}
}
}
public final static int FLAG_STYLE_BOLD = 1;
public final static int FLAG_STYLE_ITALIC = 2;
public final static int FLAG_STYLE_MONO = 4;
public final static int FLAG_STYLE_STRIKE = 8;
public final static int FLAG_STYLE_UNDERLINE = 16;
public final static int FLAG_STYLE_QUOTE = 32;
public final static int FLAG_STYLE_MENTION = 64;
public final static int FLAG_STYLE_URL = 128;
public final static int FLAG_STYLE_SPOILER = 256;
public final static int FLAG_STYLE_SPOILER_REVEALED = 512;
public TextStyleSpan(TextStyleRun run) {
this(run, 0, 0);
}
public TextStyleSpan(TextStyleRun run, int size) {
this(run, size, 0);
}
public TextStyleSpan(TextStyleRun run, int size, int textColor) {
style = run;
if (size > 0) {
textSize = size;
}
color = textColor;
}
public int getStyleFlags() {
return style.flags;
}
public TextStyleRun getTextStyleRun() {
return style;
}
public Typeface getTypeface() {
return style.getTypeface();
}
public void setColor(int value) {
color = value;
}
public boolean isSpoiler() {
return (style.flags & FLAG_STYLE_SPOILER) > 0;
}
public void setSpoilerRevealed(boolean b) {
if (b)
style.flags |= FLAG_STYLE_SPOILER_REVEALED;
else style.flags &= ~FLAG_STYLE_SPOILER_REVEALED;
}
public boolean isMono() {
return style.getTypeface() == Typeface.MONOSPACE;
}
public boolean isBold() {
return style.getTypeface() == AndroidUtilities.getTypeface("fonts/rmedium.ttf");
}
public boolean isItalic() {
return style.getTypeface() == AndroidUtilities.getTypeface("fonts/ritalic.ttf");
}
public boolean isBoldItalic() {
return style.getTypeface() == AndroidUtilities.getTypeface("fonts/rmediumitalic.ttf");
}
@Override
public void updateMeasureState(TextPaint p) {
if (textSize != 0) {
p.setTextSize(textSize);
}
p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
style.applyStyle(p);
}
@Override
public void updateDrawState(TextPaint p) {
if (textSize != 0) {
p.setTextSize(textSize);
}
if (color != 0) {
p.setColor(color);
}
p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
style.applyStyle(p);
}
}