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.window;
00023
00024 import com.realtime.crossfire.jxclient.guistate.ClientSocketState;
00025 import com.realtime.crossfire.jxclient.guistate.GuiStateListener;
00026 import com.realtime.crossfire.jxclient.guistate.GuiStateManager;
00027 import com.realtime.crossfire.jxclient.server.crossfire.CrossfirePickupListener;
00028 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00029 import com.realtime.crossfire.jxclient.settings.Settings;
00030 import com.realtime.crossfire.jxclient.settings.options.Pickup;
00031 import com.realtime.crossfire.jxclient.shortcuts.Shortcuts;
00032 import com.realtime.crossfire.jxclient.util.NumberParser;
00033 import java.awt.Frame;
00034 import org.jetbrains.annotations.NotNull;
00035 import org.jetbrains.annotations.Nullable;
00036
00037 public class JXCConnection {
00038
00042 private static final int DEFAULT_CROSSFIRE_PORT = 13327;
00043
00047 @NotNull
00048 private static final String TITLE_PREFIX = "jxclient";
00049
00053 @NotNull
00054 private final KeybindingsManager keybindingsManager;
00055
00059 @NotNull
00060 private final Shortcuts shortcuts;
00061
00065 @NotNull
00066 private final Settings settings;
00067
00071 @Nullable
00072 private Frame frame = null;
00073
00077 @NotNull
00078 private final Pickup characterPickup;
00079
00084 @NotNull
00085 private final CrossfireServerConnection server;
00086
00090 @Nullable
00091 private String hostname = null;
00092
00096 private int port = 0;
00097
00102 @Nullable
00103 private String character = null;
00104
00109 @NotNull
00110 private final GuiStateListener guiStateListener = new GuiStateListener() {
00111
00112 @Override
00113 public void start() {
00114 disconnect("display start screen");
00115 }
00116
00117 @Override
00118 public void metaserver() {
00119 disconnect("display metaserver screen");
00120 }
00121
00122 @Override
00123 public void preConnecting(@NotNull final String serverInfo) {
00124
00125 }
00126
00127 @Override
00128 public void connecting(@NotNull final String serverInfo) {
00129 connect();
00130 }
00131
00132 @Override
00133 public void connecting(@NotNull final ClientSocketState clientSocketState) {
00134
00135 }
00136
00137 @Override
00138 public void connected() {
00139
00140 }
00141
00142 @Override
00143 public void connectFailed(@NotNull final String reason) {
00144
00145 }
00146
00147 };
00148
00152 @NotNull
00153 private final CrossfirePickupListener crossfirePickupListener = new CrossfirePickupListener() {
00154
00155 @Override
00156 public void pickupChanged(final int pickupOptions) {
00157 characterPickup.updatePickupMode(pickupOptions, false);
00158 }
00159
00160 };
00161
00171 public JXCConnection(@NotNull final KeybindingsManager keybindingsManager, @NotNull final Shortcuts shortcuts, @NotNull final Settings settings, @NotNull final Pickup characterPickup, @NotNull final CrossfireServerConnection server, @NotNull final GuiStateManager guiStateManager) {
00172 this.keybindingsManager = keybindingsManager;
00173 this.shortcuts = shortcuts;
00174 this.settings = settings;
00175 this.characterPickup = characterPickup;
00176 this.server = server;
00177 guiStateManager.addGuiStateListener(guiStateListener);
00178 }
00179
00184 public void setFrame(@Nullable final Frame frame) {
00185 this.frame = frame;
00186 updateTitle();
00187 }
00188
00193 @Nullable
00194 public String getHostname() {
00195 return hostname;
00196 }
00197
00202 public int getPort() {
00203 return port;
00204 }
00205
00211 public void setCharacter(@Nullable final String character) {
00212 if (this.character == null ? character == null : this.character.equals(character)) {
00213 return;
00214 }
00215
00216 keybindingsManager.unloadPerCharacterBindings();
00217 ShortcutsLoader.saveShortcuts(shortcuts);
00218
00219 if (hostname != null && this.character != null) {
00220 server.removeCrossfirePickupListener(crossfirePickupListener);
00221 final long pickupMode = characterPickup.getPickupMode();
00222 if (pickupMode == Pickup.PU_NOTHING) {
00223 settings.remove("pickup_"+hostname+"_"+this.character);
00224 } else {
00225 settings.putLong("pickup_"+hostname+"_"+this.character, pickupMode, "The character's pickup mode.");
00226 }
00227 }
00228
00229 this.character = character;
00230 updateTitle();
00231
00232 if (hostname != null && character != null) {
00233 keybindingsManager.loadPerCharacterBindings(hostname, character);
00234 assert hostname != null;
00235 ShortcutsLoader.loadShortcuts(shortcuts, hostname, character);
00236 characterPickup.updatePickupMode(settings.getLong("pickup_"+hostname+"_"+character, Pickup.PU_NOTHING), true);
00237 server.addCrossfirePickupListener(crossfirePickupListener);
00238 }
00239 }
00240
00244 private void updateTitle() {
00245 if (frame == null) {
00246 return;
00247 }
00248 final String title;
00249 if (hostname == null) {
00250 title = TITLE_PREFIX;
00251 } else if (character == null) {
00252 title = TITLE_PREFIX+" - "+hostname;
00253 } else {
00254 title = TITLE_PREFIX+" - "+hostname+" - "+character;
00255 }
00256 frame.setTitle(title);
00257 }
00258
00263 public void setHost(@Nullable final String serverInfo) {
00264 @Nullable final String newHostname;
00265 final int newPort;
00266 if (serverInfo == null) {
00267 newHostname = null;
00268 newPort = 0;
00269 } else {
00270 settings.putString("server", serverInfo, "The server last connected to.");
00271 final String[] tmp = serverInfo.split(":", 2);
00272 newHostname = tmp[0];
00273 newPort = tmp.length < 2 ? DEFAULT_CROSSFIRE_PORT : NumberParser.parseInt(tmp[1], DEFAULT_CROSSFIRE_PORT, 1, 65535);
00274 }
00275
00276 if ((hostname == null ? newHostname == null : hostname.equals(newHostname)) && port == newPort) {
00277 return;
00278 }
00279
00280 setCharacter(null);
00281 hostname = newHostname;
00282 port = newPort;
00283 updateTitle();
00284 }
00285
00290 private void disconnect(@NotNull final String reason) {
00291 server.disconnect(reason);
00292 setHost(null);
00293 }
00294
00298 private void connect() {
00299 assert hostname != null;
00300 server.connect(hostname, port);
00301 }
00302
00303 }