package magic.ui.widget.message;
import java.awt.Color;
import java.awt.Font;
import java.util.List;
import javax.swing.JComponent;
import magic.data.TextImages;
import magic.model.MagicMessage;
import magic.ui.MagicImages;
import magic.ui.FontsAndBorders;
import magic.utility.MagicSystem;
class TComponentBuilder {
private TComponentBuilder() {}
static final TComponent SPACE_COMPONENT = new EmptyComponent();
static final TComponent BREAK_COMPONENT = new EmptyComponent();
private static JComponent container;
private static Font defaultFont;
private static Color choiceColor;
private static Color interactiveColor;
private static List<TComponent> components;
static void buildTComponents(
final List<TComponent> components,
final String source,
final JComponent aContainer,
final Font aFont,
final Color aColor,
final Color interactiveColor) {
TComponentBuilder.components = components;
TComponentBuilder.container = aContainer;
TComponentBuilder.defaultFont = aFont;
TComponentBuilder.choiceColor = aColor;
TComponentBuilder.interactiveColor = interactiveColor;
final String msg = replaceWhitespace(source, " ") + ' ';
boolean isCardId = false;
boolean isTinyFont = false;
boolean isChoice = false;
String cardInfo = "";
int startIndex = 0;
for (int index = 0; index < msg.length(); index++) {
final char ch = msg.charAt(index);
//
// space
//
if (ch == ' ') {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
addTComponent(SPACE_COMPONENT);
startIndex = index + 1;
//
// new line
//
} else if (ch == '|') {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
addTComponent(BREAK_COMPONENT);
startIndex = index + 1;
//
// "{icon_image}"
//
} else if (ch == '{') {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
startIndex = index;
} else if (ch == '}') {
final String textPart = msg.substring(startIndex, index + 1);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
startIndex = index + 1;
//
// "(player_choice)"
//
} else if (ch == '(') {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
startIndex = index;
isTinyFont = true;
isChoice = true;
} else if (ch == ')') {
final String textPart = msg.substring(startIndex, index + 1);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
startIndex = index + 1;
isTinyFont = false;
isChoice = false;
//
// "[use_tiny_font]"
//
} else if (ch == '[') {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
startIndex = index + 1;
isTinyFont = true;
} else if (ch == ']') {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
startIndex = index + 1;
isTinyFont = false;
//
// "<card_name~MagicCard_id>"
//
} else if (ch == '<') {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
cardInfo = msg.substring(index + 1, msg.indexOf(">", index + 1));
startIndex = index + 1;
} else if (ch == '>') {
final String textPart = String.format(isCardId ? "#%s" : "%s", msg.substring(startIndex, index));
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
isCardId = false;
isTinyFont = isChoice;
cardInfo = "";
startIndex = index + 1;
} else if (ch == MagicMessage.CARD_ID_DELIMITER && !cardInfo.isEmpty()) {
final String textPart = msg.substring(startIndex, index);
addTComponent(textPart, isTinyFont, isChoice, cardInfo);
startIndex = index + 1;
// only display card id if running in dev mode.
if (MagicSystem.isDevMode()) {
isTinyFont = true;
isCardId = true;
} else {
startIndex = msg.indexOf(">", index + 1);
}
}
}
}
// whitespace = multiple spaces, tabs, line breaks, form feeds, etc.
private static String replaceWhitespace(final String text, final String replace) {
return text.replaceAll("\\s+", replace).trim();
}
private static void addTComponent(final TComponent component) {
if (component != null) {
components.add(component);
}
}
private static void addTComponent(String text, boolean isTinyFont, boolean isChoice, String aCardInfo) {
addTComponent(getTComponent(text, isTinyFont, isChoice ,aCardInfo));
}
private static TComponent getTComponent(final String text, boolean isTinyFont, boolean isChoice, String aCardInfo) {
if (text.isEmpty()) {
return null;
}
if (text.charAt(0) == '{' && TextImages.contains(text)) {
return new IconComponent(MagicImages.getIcon(TextImages.getIcon(text)));
}
return new TextComponent(
text,
container,
isTinyFont ? FontsAndBorders.FONT0 : defaultFont,
isChoice,
aCardInfo,
choiceColor,
TComponentBuilder.interactiveColor
);
}
}