package tc.oc.commons.core.chat;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import java.util.List;
/**
* An abstract component that disallows any modification, to be used as a base
* for custom component types that don't want other things messing with their
* formatting properties.
*
* This class overrides all the mutating methods in {@link BaseComponent} and
* throws {@link UnsupportedOperationException} from them. As such, any code
* that works with components that it did not create itself should not try to
* mutate them, because it may get passed one of these. This is probably a good
* policy in any case.
*
* This class also overrides all the format getters and delegates them directly
* to their "raw" equivalents. This is done because the superclass has a
* protected field called "parent" that is used to inherit formatting from the
* component that contains it. Obviously, this will not work with an immutable,
* shared component. The field is written to directly, and there is no way for
* a subclass to prevent it, so instead we just override all the methods that
* depend on the field and ignore it.
*
* This might break {@link #toLegacyText}, which expects components to know their
* own inherited properties, but otherwise shouldn't be a problem.
*/
public abstract class ImmutableComponent extends BaseComponent {
@Override
public BaseComponent duplicate() {
// Assume immutable components are shareable
return this;
}
@Override public ChatColor getColor() { return super.getColorRaw(); }
@Override public boolean isBold() { return super.isBoldRaw(); }
@Override public boolean isItalic() { return super.isItalicRaw(); }
@Override public boolean isUnderlined() { return super.isUnderlinedRaw(); }
@Override public boolean isStrikethrough() { return super.isStrikethroughRaw(); }
@Override public boolean isObfuscated() { return super.isObfuscatedRaw(); }
@Override public void setExtra(List<BaseComponent> components) { throwImmutable(); }
@Override public void addExtra(String text) { throwImmutable(); }
@Override public void addExtra(BaseComponent component) { throwImmutable(); }
@Override public void setColor(ChatColor color) { throwImmutable(); }
@Override public void setBold(Boolean bold) { throwImmutable(); }
@Override public void setItalic(Boolean italic) { throwImmutable(); }
@Override public void setUnderlined(Boolean underlined) { throwImmutable(); }
@Override public void setStrikethrough(Boolean strikethrough) { throwImmutable(); }
@Override public void setObfuscated(Boolean obfuscated) { throwImmutable(); }
@Override public void setClickEvent(ClickEvent clickEvent) { throwImmutable(); }
@Override public void setHoverEvent(HoverEvent hoverEvent) { throwImmutable(); }
protected void throwImmutable() {
throw new UnsupportedOperationException(getClass().getSimpleName() + " is immutable");
}
}