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.main;
00023
00024 import com.realtime.crossfire.jxclient.account.CharacterInformation;
00025 import com.realtime.crossfire.jxclient.account.CharacterModel;
00026 import com.realtime.crossfire.jxclient.gui.label.JXCWindowRenderer;
00027 import com.realtime.crossfire.jxclient.guistate.ClientSocketState;
00028 import com.realtime.crossfire.jxclient.guistate.GuiStateListener;
00029 import com.realtime.crossfire.jxclient.guistate.GuiStateManager;
00030 import com.realtime.crossfire.jxclient.queue.CommandQueue;
00031 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireAccountListener;
00032 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireQueryListener;
00033 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00034 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireUpdateItemListener;
00035 import com.realtime.crossfire.jxclient.server.crossfire.SentReplyListener;
00036 import com.realtime.crossfire.jxclient.settings.options.OptionManager;
00037 import com.realtime.crossfire.jxclient.skin.skin.JXCSkin;
00038 import com.realtime.crossfire.jxclient.skin.skin.JXCSkinException;
00039 import com.realtime.crossfire.jxclient.util.Resolution;
00040 import com.realtime.crossfire.jxclient.util.ResourceUtils;
00041 import com.realtime.crossfire.jxclient.window.DialogStateParser;
00042 import com.realtime.crossfire.jxclient.window.GuiManager;
00043 import com.realtime.crossfire.jxclient.window.JXCConnection;
00044 import com.realtime.crossfire.jxclient.window.KeyHandler;
00045 import java.awt.Dimension;
00046 import java.awt.Insets;
00047 import java.awt.event.ComponentEvent;
00048 import java.awt.event.ComponentListener;
00049 import java.awt.event.KeyEvent;
00050 import java.awt.event.KeyListener;
00051 import java.awt.event.WindowAdapter;
00052 import java.awt.event.WindowEvent;
00053 import java.awt.event.WindowFocusListener;
00054 import java.awt.event.WindowListener;
00055 import java.io.IOException;
00056 import javax.swing.JFrame;
00057 import javax.swing.WindowConstants;
00058 import org.jetbrains.annotations.NotNull;
00059 import org.jetbrains.annotations.Nullable;
00060
00066 public class JXCWindow {
00067
00071 public static final boolean DISABLE_START_GUI = true;
00072
00076 @NotNull
00077 private final Exiter exiter;
00078
00082 @NotNull
00083 private final GuiManager guiManager;
00084
00088 @NotNull
00089 private final CrossfireServerConnection server;
00090
00094 @NotNull
00095 private final CommandQueue commandQueue;
00096
00100 @NotNull
00101 private final JXCWindowRenderer windowRenderer;
00102
00106 @NotNull
00107 private final Object semaphoreDrawing = new Object();
00108
00112 @NotNull
00113 private final KeyHandler keyHandler;
00114
00118 @NotNull
00119 private final OptionManager optionManager;
00120
00124 @NotNull
00125 private final CharacterModel characterModel;
00126
00130 @NotNull
00131 private final JFrame frame = new JFrame("");
00132
00144 @NotNull
00145 private final WindowFocusListener windowFocusListener = new WindowAdapter() {
00146
00147 @Override
00148 public void windowLostFocus(final WindowEvent e) {
00149 keyHandler.reset();
00150 commandQueue.stopRunning();
00151 }
00152
00153 };
00154
00158 @NotNull
00159 private final CrossfireUpdateItemListener crossfireUpdateItemListener = new CrossfireUpdateItemListener() {
00160
00161 @Override
00162 public void delinvReceived(final int tag) {
00163
00164 }
00165
00166 @Override
00167 public void delitemReceived(@NotNull final int[] tags) {
00168
00169 }
00170
00171 @Override
00172 public void addItemReceived(final int location, final int tag, final int flags, final int weight, final int faceNum, @NotNull final String name, @NotNull final String namePl, final int anim, final int animSpeed, final int nrof, final int type) {
00173
00174 }
00175
00176 @Override
00177 public void playerReceived(final int tag, final int weight, final int faceNum, @NotNull final String name) {
00178 guiManager.playerReceived();
00179 }
00180
00181 @Override
00182 public void upditemReceived(final int flags, final int tag, final int valLocation, final int valFlags, final int valWeight, final int valFaceNum, @NotNull final String valName, @NotNull final String valNamePl, final int valAnim, final int valAnimSpeed, final int valNrof) {
00183
00184 }
00185
00186 };
00187
00191 @NotNull
00192 private final WindowListener windowListener = new WindowAdapter() {
00193
00194 @Override
00195 public void windowClosing(@NotNull final WindowEvent e) {
00196 if (!guiManager.openQuitDialog()) {
00197 exiter.terminate();
00198 }
00199 }
00200
00201 @Override
00202 public void windowClosed(@NotNull final WindowEvent e) {
00203 if (!frame.isVisible()) {
00204 exiter.terminate();
00205 }
00206 }
00207
00208 };
00209
00213 @NotNull
00214 private final KeyListener keyListener = new KeyListener() {
00215
00216 @Override
00217 public void keyTyped(@NotNull final KeyEvent e) {
00218
00219 }
00220
00221 @Override
00222 public void keyPressed(@NotNull final KeyEvent e) {
00223 synchronized (semaphoreDrawing) {
00224 keyHandler.keyPressed(e);
00225 }
00226 }
00227
00228 @Override
00229 public void keyReleased(@NotNull final KeyEvent e) {
00230 synchronized (semaphoreDrawing) {
00231 keyHandler.keyReleased(e);
00232 }
00233 }
00234
00235 };
00236
00241 @NotNull
00242 private final CrossfireQueryListener crossfireQueryListener = new CrossfireQueryListener() {
00243
00244 @Override
00245 public void commandQueryReceived(@NotNull final String prompt, final int queryType) {
00246 synchronized (semaphoreDrawing) {
00247 guiManager.openQueryDialog(prompt, queryType);
00248 }
00249 }
00250
00251 };
00252
00257 @NotNull
00258 private final GuiStateListener guiStateListener = new GuiStateListener() {
00259
00260 @Override
00261 public void start() {
00262 server.removeCrossfireQueryListener(crossfireQueryListener);
00263 server.removeCrossfireUpdateItemListener(crossfireUpdateItemListener);
00264 if (DISABLE_START_GUI) {
00265 exiter.terminate();
00266 }
00267 }
00268
00269 @Override
00270 public void metaserver() {
00271 server.removeCrossfireQueryListener(crossfireQueryListener);
00272 server.removeCrossfireUpdateItemListener(crossfireUpdateItemListener);
00273 }
00274
00275 @Override
00276 public void preConnecting(@NotNull final String serverInfo) {
00277
00278 }
00279
00280 @Override
00281 public void connecting(@NotNull final String serverInfo) {
00282 server.addCrossfireQueryListener(crossfireQueryListener);
00283 server.addCrossfireUpdateItemListener(crossfireUpdateItemListener);
00284 }
00285
00286 @Override
00287 public void connecting(@NotNull final ClientSocketState clientSocketState) {
00288
00289 }
00290
00291 @Override
00292 public void connected() {
00293
00294 }
00295
00296 @Override
00297 public void connectFailed(@NotNull final String reason) {
00298
00299 }
00300
00301 };
00302
00307 @NotNull
00308 private final SentReplyListener sentReplyListener = new SentReplyListener() {
00309
00310 @Override
00311 public void replySent() {
00312 guiManager.closeQueryDialog();
00313 }
00314
00315 };
00316
00320 @NotNull
00321 private final CrossfireAccountListener accountListener = new CrossfireAccountListener() {
00322
00323 @Override
00324 public void manageAccount() {
00325 guiManager.manageAccount();
00326 }
00327
00328 @Override
00329 public void addAccount(@NotNull final String name, @NotNull final String characterClass, @NotNull final String race, @NotNull final String face, @NotNull final String party, @NotNull final String map, final int level, final int faceNumber) {
00330 final CharacterInformation information = new CharacterInformation(name, characterClass, race, face, party, map, level, faceNumber);
00331 characterModel.add(information);
00332 }
00333
00334 @Override
00335 public void startAccountList(@NotNull final String accountName) {
00336 characterModel.begin();
00337 guiManager.setAccountName(accountName);
00338 }
00339
00340 @Override
00341 public void endAccountList() {
00342 characterModel.commit();
00343 guiManager.showCharacters();
00344 }
00345
00346 @Override
00347 public void startPlaying() {
00348 guiManager.hideAccountWindows();
00349 }
00350
00351 @Override
00352 public void selectCharacter(@NotNull final String accountName, @NotNull final String characterName) {
00353 guiManager.selectCharacter(accountName, characterName);
00354 }
00355
00356 };
00357
00371 public JXCWindow(@NotNull final Exiter exiter, @NotNull final CrossfireServerConnection server, @NotNull final OptionManager optionManager, @NotNull final GuiStateManager guiStateManager, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final CommandQueue commandQueue, @NotNull final GuiManager guiManager, @NotNull final KeyHandler keyHandler, @NotNull final CharacterModel characterModel, @NotNull final JXCConnection connection) {
00372 this.exiter = exiter;
00373 this.server = server;
00374 this.optionManager = optionManager;
00375 this.windowRenderer = windowRenderer;
00376 this.commandQueue = commandQueue;
00377 this.guiManager = guiManager;
00378 this.keyHandler = keyHandler;
00379 this.characterModel = characterModel;
00380 frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
00381 try {
00382 frame.setIconImage(ResourceUtils.loadImage(ResourceUtils.APPLICATION_ICON).getImage());
00383 } catch (final IOException ex) {
00384 System.err.println("Cannot find application icon: "+ex.getMessage());
00385 }
00386 frame.setFocusTraversalKeysEnabled(false);
00387 frame.addWindowFocusListener(windowFocusListener);
00388 frame.addWindowListener(windowListener);
00389 frame.addComponentListener(new ComponentListener() {
00390
00391 @Override
00392 public void componentResized(final ComponentEvent e) {
00393 final int width = frame.getContentPane().getWidth();
00394 final int height = frame.getContentPane().getHeight();
00395 guiManager.updateWindowSize(width, height);
00396 }
00397
00398 @Override
00399 public void componentMoved(final ComponentEvent e) {
00400
00401 }
00402
00403 @Override
00404 public void componentShown(final ComponentEvent e) {
00405
00406 }
00407
00408 @Override
00409 public void componentHidden(final ComponentEvent e) {
00410
00411 }
00412
00413 });
00414 server.addSentReplyListener(sentReplyListener);
00415 server.addCrossfireAccountListener(accountListener);
00416 guiStateManager.addGuiStateListener(guiStateListener);
00417 frame.addKeyListener(keyListener);
00418 connection.setFrame(frame);
00419 }
00420
00429 public void init(@Nullable final Resolution resolution, @NotNull final String skinName, final boolean fullScreen, @NotNull final SkinLoader skinLoader) {
00430 JXCSkin skin;
00431 try {
00432 skin = skinLoader.loadSkin(skinName);
00433 } catch (final JXCSkinException ex) {
00434 if (skinName.equals(Options.DEFAULT_SKIN)) {
00435 System.err.println("cannot load skin "+skinName+": "+ex.getMessage());
00436 System.exit(1);
00437 }
00438
00439 System.err.println("cannot load skin "+skinName+": "+ex.getMessage()+", trying default skin");
00440 try {
00441 skin = skinLoader.loadSkin(Options.DEFAULT_SKIN);
00442 } catch (final JXCSkinException ex2) {
00443 System.err.println("cannot load default skin "+Options.DEFAULT_SKIN+": "+ex2.getMessage());
00444 System.exit(1);
00445 throw new AssertionError();
00446 }
00447 }
00448 guiManager.unsetSkin();
00449 optionManager.loadOptions();
00450 keyHandler.setKeyBindings(skin.getDefaultKeyBindings());
00451
00452 final Resolution minResolution = skin.getMinResolution();
00453 final Dimension minSize = minResolution.asDimension();
00454 final Dimension maxSize = skin.getMaxResolution().asDimension();
00455 final Insets insets = frame.getInsets();
00456 minSize.width += insets.left+insets.right;
00457 minSize.height += insets.top+insets.bottom;
00458 maxSize.width += insets.left+insets.right;
00459 maxSize.height += insets.top+insets.bottom;
00460 frame.setMinimumSize(minSize);
00461 frame.setMaximumSize(maxSize);
00462
00463 if (!fullScreen || !windowRenderer.setFullScreenMode(frame, resolution)) {
00464 windowRenderer.setWindowMode(frame, resolution, minResolution, minSize.equals(maxSize));
00465 }
00466
00467 guiManager.setSkin(skin);
00468 guiManager.updateWindowSize(frame.getWidth(), frame.getHeight());
00469 DialogStateParser.load(skin, windowRenderer);
00470 }
00471
00475 public void term() {
00476 guiManager.term();
00477 optionManager.saveOptions();
00478 }
00479
00480 }