Crossfire JXClient, Trunk
MessageBufferUpdater.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.gui.log;
24 
31 import java.awt.Color;
32 import org.jetbrains.annotations.NotNull;
33 
38 public class MessageBufferUpdater {
39 
43  public static final int NUM_COLORS = 13;
44 
48  @NotNull
49  private final Color @NotNull [] colors = { //
50  new Color(0x000000), // black
51  new Color(0xB000D5), // white
52  new Color(0x362589), // navy blue
53  new Color(0xD80C1B), // red
54  new Color(0x92440A), // orange
55  new Color(0xBF580B), // dodger blue
56  new Color(0x914F1E), // dark orange
57  new Color(0x275A0F), // sea green
58  new Color(0x346B1A), // dark sea green
59  new Color(0x353535), // grey
60  new Color(0x775716), // brown sienna
61  new Color(0x999B26), // gold
62  new Color(0x6C6E20), // khaki
63  };
64 
68  @NotNull
69  private static final String @NotNull [] COLOR_NAMES = { //
70  "black", //
71  "white", //
72  "navy blue", //
73  "red", //
74  "orange", //
75  "dodger blue", //
76  "dark orange", //
77  "sea green", //
78  "dark sea green", //
79  "grey", //
80  "brown sienna", //
81  "gold", //
82  "khaki", //
83  };
84 
88  @NotNull
90 
94  @NotNull
95  private final Parser parser;
96 
100  @NotNull
101  private final Color defaultColor;
102 
106  @NotNull
107  private final Buffer buffer;
108 
112  @NotNull
113  @SuppressWarnings("ZeroLengthArrayAllocation")
114  private MessageTypes types = new MessageTypes(false, new int[0]);
115 
119  private boolean printMessageTypes;
120 
124  @NotNull
126 
127  @Override
128  public void commandQueryReceived(@NotNull final String prompt, final int queryType) {
131  }
132  }
133 
134  };
135 
140  @NotNull
142 
143  @Override
144  public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
145  if (types.isTypeShown(type, subtype)) {
146  final CharSequence messageWithPrefix = addMessageTypePrefix(type, subtype, color, message);
147  if (type == MessageType.MSG_TYPE_COMMUNICATION) {
148  //noinspection ConstantValueVariableUse
149  parser.parseWithoutMediaTags(messageWithPrefix, type, subtype, findColor(color), buffer);
150  } else {
151  parser.parse(messageWithPrefix, type, subtype, findColor(color), buffer);
152  }
153  }
154  }
155 
156  @Override
157  public void setDebugMode(final boolean printMessageTypes) {
159  }
160 
161  };
162 
167  @NotNull
169 
170  @Override
171  public void commandDrawinfoReceived(@NotNull final String text, final int type) {
172  // guess category from message color
173  final int messageType = switch (type) {
174  case NDI_WHITE, NDI_ORANGE, NDI_BLUE, NDI_RED -> MessageType.MSG_TYPE_COMMUNICATION;
175  default -> MessageType.MSG_TYPE_MISC;
176  };
177 
178  if (types.isTypeShown(messageType, MessageType.MSG_SUBTYPE_NONE)) {
179  parser.parseWithoutMediaTags(addMessageTypePrefix(messageType, 0, type, text), messageType, MessageType.MSG_SUBTYPE_NONE, findColor(type), buffer);
180  }
181  }
182 
183  };
184 
193  public MessageBufferUpdater(@NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final Buffer buffer, @NotNull final Color defaultColor, @NotNull final Color selectionColor) {
194  this.crossfireServerConnection = crossfireServerConnection;
195  this.buffer = buffer;
196  parser = new Parser(selectionColor);
197  this.defaultColor = defaultColor;
198  this.crossfireServerConnection.addCrossfireQueryListener(crossfireQueryListener);
199  this.crossfireServerConnection.addCrossfireDrawextinfoListener(crossfireDrawextinfoListener);
200  this.crossfireServerConnection.addCrossfireDrawinfoListener(crossfireDrawinfoListener);
201  }
202 
206  public void dispose() {
210  }
211 
217  @NotNull
218  private Color findColor(final int index) {
219  try {
220  return colors[index];
221  } catch (final ArrayIndexOutOfBoundsException ignored) {
222  return defaultColor;
223  }
224  }
225 
231  @NotNull
232  public static String getColorName(final int index) {
233  try {
234  return COLOR_NAMES[index];
235  } catch (final ArrayIndexOutOfBoundsException ignored) {
236  return "undefined";
237  }
238  }
239 
245  public void setColor(final int index, @NotNull final Color color) {
246  colors[index] = color;
247  }
248 
253  public void setTypes(@NotNull final MessageTypes types) {
254  this.types = types;
255  }
256 
266  @NotNull
267  private CharSequence addMessageTypePrefix(final int type, final int subtype, final int color, @NotNull final CharSequence message) {
268  return printMessageTypes ? "(t="+MessageType.toString(type, subtype)+"/"+subtype+",c="+color+")"+message : message;
269  }
270 
271 }
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.getColorName
static String getColorName(final int index)
Returns the name of a color index.
Definition: MessageBufferUpdater.java:232
com.realtime.crossfire.jxclient.protocol.MessageType.MSG_SUBTYPE_NONE
static final int MSG_SUBTYPE_NONE
Definition: MessageType.java:143
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.NUM_COLORS
static final int NUM_COLORS
The number of supported colors.
Definition: MessageBufferUpdater.java:43
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.crossfireServerConnection
final CrossfireServerConnection crossfireServerConnection
The CrossfireServerConnection to monitor.
Definition: MessageBufferUpdater.java:89
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection.removeCrossfireDrawextinfoListener
void removeCrossfireDrawextinfoListener(@NotNull CrossfireDrawextinfoListener listener)
Removes the given listener from the list of objects listening to the drawextinfo S->C messages.
com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawinfoListener
Interface for listeners interested in drawinfo messages received from the Crossfire server.
Definition: CrossfireDrawinfoListener.java:33
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.MessageBufferUpdater
MessageBufferUpdater(@NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final Buffer buffer, @NotNull final Color defaultColor, @NotNull final Color selectionColor)
Creates a new instance.
Definition: MessageBufferUpdater.java:193
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.protocol.MessageType.MSG_SUBTYPE_JXCLIENT_QUERY
static final int MSG_SUBTYPE_JXCLIENT_QUERY
A query message has been received.
Definition: MessageType.java:474
com.realtime.crossfire.jxclient.protocol.MessageType.MSG_TYPE_JXCLIENT
static final int MSG_TYPE_JXCLIENT
Internally used drawextinfo message type: a message has been generated by the client.
Definition: MessageType.java:136
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.dispose
void dispose()
Releases resources.
Definition: MessageBufferUpdater.java:206
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection.removeCrossfireQueryListener
void removeCrossfireQueryListener(@NotNull CrossfireQueryListener listener)
Removes the given listener from the list of objects listening to the query S->C messages.
com.realtime.crossfire.jxclient.protocol.MessageTypes
A set of message types or type/subtypes.
Definition: MessageTypes.java:31
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection.removeCrossfireDrawinfoListener
void removeCrossfireDrawinfoListener(@NotNull CrossfireDrawinfoListener listener)
Removes the given listener from the list of objects listening to the drawinfo S->C messages.
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection
Adds encoding/decoding of crossfire protocol packets to a ServerConnection.
Definition: CrossfireServerConnection.java:37
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater
Adds drawinfo, drawextinfo, and query messages to a Buffer instance.
Definition: MessageBufferUpdater.java:38
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.buffer
final Buffer buffer
The buffer to update.
Definition: MessageBufferUpdater.java:107
com.realtime.crossfire.jxclient.gui.log.Parser
Parser for parsing drawextinfo messages received from a Crossfire server to update a Buffer instance.
Definition: Parser.java:40
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.defaultColor
final Color defaultColor
The color to use for invalid colors indices.
Definition: MessageBufferUpdater.java:101
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.findColor
Color findColor(final int index)
Converts a Crossfire color index to a Color instance.
Definition: MessageBufferUpdater.java:218
com.realtime.crossfire.jxclient.protocol.MessageType
Encapsulates the message type numbers for drawextinfo messages.
Definition: MessageType.java:33
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.types
MessageTypes types
The types to show.
Definition: MessageBufferUpdater.java:114
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.addMessageTypePrefix
CharSequence addMessageTypePrefix(final int type, final int subtype, final int color, @NotNull final CharSequence message)
Adds a message type prefix to a message if printMessageTypes is set.
Definition: MessageBufferUpdater.java:267
com.realtime.crossfire.jxclient.protocol.MessageType.toString
static String toString(final int type, final int subtype)
Returns a string representation of a message type.
Definition: MessageType.java:793
com.realtime.crossfire.jxclient.protocol
Definition: MagicMap.java:23
com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawinfoListener.NDI_RED
int NDI_RED
A message color.
Definition: CrossfireDrawinfoListener.java:53
com.realtime.crossfire.jxclient.protocol.MessageType.MSG_TYPE_MISC
static final int MSG_TYPE_MISC
drawextinfo message type: message that does not fit in any other category.
Definition: MessageType.java:125
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.crossfireQueryListener
final CrossfireQueryListener crossfireQueryListener
The CrossfireQueryListener registered to receive query commands.
Definition: MessageBufferUpdater.java:125
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.crossfireDrawextinfoListener
final CrossfireDrawextinfoListener crossfireDrawextinfoListener
The CrossfireDrawextinfoListener registered to receive drawextinfo commands.
Definition: MessageBufferUpdater.java:141
com.realtime.crossfire.jxclient.gui.log.Parser.parse
void parse(@NotNull final CharSequence text, final int type, final int subtype, @NotNull final Color defaultColor, @NotNull final Buffer buffer)
Parses a text message.
Definition: Parser.java:138
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.crossfireDrawinfoListener
final CrossfireDrawinfoListener crossfireDrawinfoListener
The CrossfireDrawinfoListener registered to receive drawinfo commands.
Definition: MessageBufferUpdater.java:168
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.setTypes
void setTypes(@NotNull final MessageTypes types)
Sets the message types to show.
Definition: MessageBufferUpdater.java:253
com.realtime.crossfire.jxclient.gui.log.Buffer
Manages the contents of the contents of a log window.
Definition: Buffer.java:41
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.setColor
void setColor(final int index, @NotNull final Color color)
Sets a color mapping.
Definition: MessageBufferUpdater.java:245
com.realtime.crossfire.jxclient.server.crossfire.CrossfireQueryListener
Interface for listeners interested in query messages received from the Crossfire server.
Definition: CrossfireQueryListener.java:33
com.realtime.crossfire.jxclient.protocol.MessageTypes.isTypeShown
boolean isTypeShown(final int type, final int subtype)
Returns whether a message type should be shown.
Definition: MessageTypes.java:61
com.realtime.crossfire.jxclient.server.crossfire
Definition: AbstractCrossfireServerConnection.java:23
com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawextinfoListener
Interface for listeners interested in drawextinfo messages received from the Crossfire server.
Definition: CrossfireDrawextinfoListener.java:33
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.parser
final Parser parser
The Parser instance for parsing drawextinfo messages.
Definition: MessageBufferUpdater.java:95
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.colors
final Color[] colors
Maps color index to color.
Definition: MessageBufferUpdater.java:49
com.realtime.crossfire
com.realtime
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.COLOR_NAMES
static final String[] COLOR_NAMES
The colors names corresponding to colors.
Definition: MessageBufferUpdater.java:69
com
com.realtime.crossfire.jxclient.gui.log.Parser.parseWithoutMediaTags
void parseWithoutMediaTags(@NotNull final CharSequence text, final int type, final int subtype, @NotNull final Color color, @NotNull final Buffer buffer)
Parses a plain text message without media tags.
Definition: Parser.java:154
com.realtime.crossfire.jxclient.gui.log.MessageBufferUpdater.printMessageTypes
boolean printMessageTypes
Whether message types are included in the buffer output.
Definition: MessageBufferUpdater.java:119
com.realtime.crossfire.jxclient.protocol.MessageType.MSG_TYPE_COMMUNICATION
static final int MSG_TYPE_COMMUNICATION
drawextinfo message type: communication between players.
Definition: MessageType.java:109