package org.ripple.power.ui.projector.core.graphics.component; import java.awt.Color; import java.awt.Image; import org.ripple.power.ui.graphics.LFont; import org.ripple.power.ui.graphics.LGraphics; import org.ripple.power.ui.graphics.LImage; import org.ripple.power.ui.graphics.geom.Vector2D; import org.ripple.power.ui.projector.core.LRelease; import org.ripple.power.utils.StringUtils; public class Print implements LRelease { private char[] showMessages; private int iconWidth; private Color fontColor = Color.white; private int interceptMaxString; private int interceptCount; private int messageLength = 10; private String messages; private boolean onComplete, newLine, visible, isClose; private StringBuffer messageBuffer = new StringBuffer(messageLength); private int width, height, leftOffset, topOffset, next, messageCount; private float alpha; private int size, wait, tmp_left, left, fontSize, fontHeight; private Vector2D vector; private LImage creeseIcon; private boolean isEnglish, isLeft, isWait, isCache; private LFont deffont; public Print(Vector2D vector, LFont font, int width, int height) { this("", font, vector, width, height); } public Print(String context, LFont font, Vector2D vector, int width, int height) { this.setMessage(context, font); this.deffont = font; this.vector = vector; this.width = width; this.height = height; this.wait = 0; this.isCache = false; this.isWait = false; } public void setMessage(String context, LFont font) { setMessage(context, font, false); } public void setMessage(String context, LFont font, boolean isComplete) { this.wait = 0; this.deffont = font; this.visible = false; this.showMessages = new char[] { '\0' }; this.interceptMaxString = 0; this.next = 0; this.messageCount = 0; this.interceptCount = 0; this.size = 0; this.tmp_left = 0; this.left = 0; this.fontSize = 0; this.fontHeight = 0; this.messages = context; this.next = context.length(); this.onComplete = false; this.newLine = false; this.messageCount = 0; this.messageBuffer.delete(0, messageBuffer.length()); if (isComplete) { this.complete(); } this.visible = true; } public String getMessage() { return messages; } private Color getColor(char flagName) { if ('r' == flagName || 'R' == flagName) { return Color.red; } if ('b' == flagName || 'B' == flagName) { return Color.black; } if ('l' == flagName || 'L' == flagName) { return Color.blue; } if ('g' == flagName || 'G' == flagName) { return Color.green; } if ('o' == flagName || 'O' == flagName) { return Color.orange; } if ('y' == flagName || 'Y' == flagName) { return Color.yellow; } else { return null; } } public void draw(LGraphics g) { draw(g, Color.white); } private void drawMessage(LGraphics g, Color old) { if (!visible) { return; } if (isClose) { return; } synchronized (showMessages) { this.size = showMessages.length; this.fontSize = isEnglish ? deffont.getSize() / 2 + 2 : deffont .getSize(); this.fontHeight = deffont.getHeight(); this.tmp_left = isLeft ? 0 : (width - (fontSize * messageLength)) / 2 - (int) (fontSize * 1.5); this.left = tmp_left; int index = 0, offset = 0, font = 0, tmp_font = 0; int fontSizeDouble = fontSize * 2; char charString; g.setAntiAlias(true); for (int i = 0; i < size; i++) { charString = showMessages[i]; if (interceptCount < interceptMaxString) { interceptCount++; g.setColor(fontColor); continue; } else { interceptMaxString = 0; interceptCount = 0; } if (showMessages[i] == 'n' && showMessages[i > 0 ? i - 1 : 0] == '\\') { index = 0; left = tmp_left; offset++; continue; } else if (charString == '\n') { index = 0; left = tmp_left; offset++; continue; } else if (charString == '<') { Color color = getColor(showMessages[i < size - 1 ? i + 1 : i]); if (color != null) { interceptMaxString = 1; fontColor = color; } continue; } else if (showMessages[i > 0 ? i - 1 : i] == '<' && getColor(charString) != null) { continue; } else if (charString == '/') { if (showMessages[i < size - 1 ? i + 1 : i] == '>') { interceptMaxString = 1; fontColor = old; } continue; } else if (index > messageLength) { index = 0; left = tmp_left; offset++; newLine = false; } else if (charString == '\\') { continue; } String mes = String.valueOf(charString); tmp_font = deffont.charWidth(charString); if (Character.isLetter(charString)) { if (tmp_font < fontSize) { font = fontSize; } else { font = tmp_font; } } else { font = fontSize; } left += font; if (!isEnglish) { if (font <= 10 && StringUtils.isSingle(charString)) { left += 12; } } if (i != size - 1) { g.drawString(mes, (int) (vector.x + left + leftOffset), (int) ((offset * fontHeight) + vector.y + fontSizeDouble + topOffset)); } else if (!newLine && !onComplete) { g.drawImage( creeseIcon, (int) (vector.x + left + leftOffset + iconWidth), (int) ((offset * fontHeight) + vector.y + fontSize + topOffset)); } index++; } g.setAntiAlias(false); if (messageCount == next) { onComplete = true; } } } public void draw(LGraphics g, Color old) { if (!visible) { return; } alpha = g.getAlpha(); if (alpha != 1) { g.setAlpha(1.0f); } drawMessage(g, old); if (alpha != 1) { g.setAlpha(alpha); } } public void setX(int x) { vector.setX(x); } public void setY(int y) { vector.setY(y); } public int getX() { return vector.x(); } public int getY() { return vector.y(); } public void complete() { synchronized (showMessages) { this.onComplete = true; this.messageCount = messages.length(); this.next = messageCount; this.showMessages = (messages + "_").toCharArray(); this.size = showMessages.length; } } public boolean isComplete() { if (isWait) { if (onComplete) { wait++; } return onComplete && wait > 100; } return onComplete; } public boolean next() { synchronized (messageBuffer) { if (!onComplete) { if (messageCount == next) { onComplete = true; return false; } if (messageBuffer.length() > 0) { messageBuffer.delete(messageBuffer.length() - 1, messageBuffer.length()); } this.messageBuffer.append(messages.charAt(messageCount)); this.messageBuffer.append("_"); this.showMessages = messageBuffer.toString().toCharArray(); this.size = showMessages.length; this.messageCount++; } else { return false; } return true; } } public LImage getCreeseIcon() { return creeseIcon; } public void setCreeseIcon(Image icon) { setCreeseIcon(new LImage(icon)); } public void setCreeseIcon(LImage icon) { if (this.creeseIcon != null) { creeseIcon.dispose(); creeseIcon = null; } this.creeseIcon = icon; if (icon == null) { return; } this.iconWidth = icon.getWidth(); } public int getMessageLength() { return messageLength; } public void setMessageLength(int messageLength) { this.messageLength = messageLength; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getLeftOffset() { return leftOffset; } public void setLeftOffset(int leftOffset) { this.leftOffset = leftOffset; } public int getTopOffset() { return topOffset; } public void setTopOffset(int topOffset) { this.topOffset = topOffset; } public boolean isEnglish() { return isEnglish; } public void setEnglish(boolean isEnglish) { this.isEnglish = isEnglish; } public boolean isVisible() { return visible; } public void setVisible(boolean visible) { this.visible = visible; } public boolean isLeft() { return isLeft; } public void setLeft(boolean isLeft) { this.isLeft = isLeft; } public boolean isWait() { return isWait; } public void setWait(boolean isWait) { this.isWait = isWait; } public boolean isTextCache() { return isCache; } public void setTextCache(boolean isCache) { this.isCache = isCache; } public void dispose() { isClose = true; } }