00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.gui.log;
00023
00024 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawextinfoListener;
00025 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawinfoListener;
00026 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireQueryListener;
00027 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00028 import com.realtime.crossfire.jxclient.server.crossfire.MessageTypes;
00029 import java.awt.Color;
00030 import org.jetbrains.annotations.NotNull;
00031
00036 public class MessageBufferUpdater {
00037
00041 public static final int NUM_COLORS = 13;
00042
00046 @NotNull
00047 private final Color[] colors = {
00048
00049 new Color(0x000000),
00050
00051 new Color(0x860F9F),
00052
00053 new Color(0x362589),
00054
00055 new Color(0xD80C1B),
00056
00057 new Color(0xAF0093),
00058
00059 new Color(0x2E00B7),
00060
00061 new Color(0xCF4507),
00062
00063 new Color(0x275A0F),
00064
00065 new Color(0x346B1A),
00066
00067 new Color(0x353535),
00068
00069 new Color(0x775716),
00070
00071 new Color(0x874200),
00072
00073 new Color(0x6C6E20),
00074 };
00075
00079 @NotNull
00080 private static final String[] COLOR_NAMES = {
00081 "black",
00082 "white",
00083 "navy blue",
00084 "red",
00085 "orange",
00086 "dodger blue",
00087 "dark orange",
00088 "sea green",
00089 "dark sea green",
00090 "grey",
00091 "brown sienna",
00092 "gold",
00093 "khaki",
00094 };
00095
00099 @NotNull
00100 private final CrossfireServerConnection crossfireServerConnection;
00101
00105 @NotNull
00106 private final Parser parser = new Parser();
00107
00111 @NotNull
00112 private final Color defaultColor;
00113
00117 @NotNull
00118 private final Buffer buffer;
00119
00123 private int types = ~0;
00124
00128 private boolean printMessageTypes = false;
00129
00133 @NotNull
00134 private final CrossfireQueryListener crossfireQueryListener = new CrossfireQueryListener() {
00135
00136 @Override
00137 public void commandQueryReceived(@NotNull final String prompt, final int queryType) {
00138 if (isTypeShown(MessageTypes.MSG_TYPE_QUERY)) {
00139 parser.parseWithoutMediaTags(addMessageTypePrefix(MessageTypes.MSG_TYPE_QUERY, 0, CrossfireDrawinfoListener.NDI_RED, prompt), findColor(CrossfireDrawinfoListener.NDI_RED), buffer);
00140 }
00141 }
00142
00143 };
00144
00149 @NotNull
00150 private final CrossfireDrawextinfoListener crossfireDrawextinfoListener = new CrossfireDrawextinfoListener() {
00151
00152 @Override
00153 public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
00154 if (type == MessageTypes.MSG_TYPE_QUERY
00155 || isTypeShown(type)) {
00156 final CharSequence messageWithPrefix = addMessageTypePrefix(type, subtype, color, message);
00157 if (type == MessageTypes.MSG_TYPE_COMMUNICATION) {
00158 parser.parseWithoutMediaTags(messageWithPrefix, findColor(color), buffer);
00159 } else {
00160 parser.parse(messageWithPrefix, findColor(color), buffer);
00161 }
00162 }
00163 }
00164
00165 @Override
00166 public void setDebugMode(final boolean printMessageTypes) {
00167 MessageBufferUpdater.this.printMessageTypes = printMessageTypes;
00168 }
00169
00170 };
00171
00176 @NotNull
00177 private final CrossfireDrawinfoListener crossfireDrawinfoListener = new CrossfireDrawinfoListener() {
00178
00179 @Override
00180 public void commandDrawinfoReceived(@NotNull final String text, final int type) {
00181
00182 final int messageType;
00183 switch (type) {
00184 case NDI_WHITE:
00185 case NDI_ORANGE:
00186 case NDI_BLUE:
00187 case NDI_RED:
00188 messageType = MessageTypes.MSG_TYPE_COMMUNICATION;
00189 break;
00190
00191 default:
00192 messageType = MessageTypes.MSG_TYPE_MISC;
00193 break;
00194 }
00195
00196 if (isTypeShown(messageType)) {
00197 parser.parseWithoutMediaTags(addMessageTypePrefix(messageType, 0, type, text), findColor(type), buffer);
00198 }
00199 }
00200
00201 };
00202
00210 public MessageBufferUpdater(@NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final Buffer buffer, @NotNull final Color defaultColor) {
00211 this.crossfireServerConnection = crossfireServerConnection;
00212 this.buffer = buffer;
00213 this.defaultColor = defaultColor;
00214 this.crossfireServerConnection.addCrossfireQueryListener(crossfireQueryListener);
00215 this.crossfireServerConnection.addCrossfireDrawextinfoListener(crossfireDrawextinfoListener);
00216 this.crossfireServerConnection.addCrossfireDrawinfoListener(crossfireDrawinfoListener);
00217 }
00218
00222 public void dispose() {
00223 crossfireServerConnection.removeCrossfireQueryListener(crossfireQueryListener);
00224 crossfireServerConnection.removeCrossfireDrawextinfoListener(crossfireDrawextinfoListener);
00225 crossfireServerConnection.removeCrossfireDrawinfoListener(crossfireDrawinfoListener);
00226 }
00227
00233 @NotNull
00234 private Color findColor(final int index) {
00235 try {
00236 return colors[index];
00237 } catch (final ArrayIndexOutOfBoundsException ignored) {
00238 return defaultColor;
00239 }
00240 }
00241
00247 @NotNull
00248 public static String getColorName(final int index) {
00249 try {
00250 return COLOR_NAMES[index];
00251 } catch (final ArrayIndexOutOfBoundsException ignored) {
00252 return "undefined";
00253 }
00254 }
00255
00261 public void setColor(final int index, @NotNull final Color color) {
00262 colors[index] = color;
00263 }
00264
00269 public void setTypes(final int types) {
00270 this.types = types;
00271 }
00272
00278 private boolean isTypeShown(final int type) {
00279 return type < 0 || type > 31 || (types&(1<<type)) != 0;
00280 }
00281
00291 private CharSequence addMessageTypePrefix(final int type, final int subtype, final int color, @NotNull final String message) {
00292 return printMessageTypes ? "(t="+MessageTypes.toString(type)+"/"+subtype+",c="+color+")"+message : message;
00293 }
00294
00295 }