mirror of https://github.com/NekoX-Dev/NekoX.git
183 lines
5.3 KiB
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);
|
|
}
|
|
}
|