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.gui.commandlist.CommandList;
00025 import com.realtime.crossfire.jxclient.gui.gui.Gui;
00026 import com.realtime.crossfire.jxclient.gui.gui.RendererGuiState;
00027 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00028 import com.realtime.crossfire.jxclient.gui.label.AbstractLabel;
00029 import com.realtime.crossfire.jxclient.gui.label.JXCWindowRenderer;
00030 import com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl;
00031 import com.realtime.crossfire.jxclient.gui.list.GUICharacterList;
00032 import com.realtime.crossfire.jxclient.gui.log.GUILabelLog;
00033 import com.realtime.crossfire.jxclient.gui.textinput.GUIText;
00034 import com.realtime.crossfire.jxclient.gui.textinput.NoSuchCommandException;
00035 import com.realtime.crossfire.jxclient.guistate.ClientSocketState;
00036 import com.realtime.crossfire.jxclient.guistate.GuiStateListener;
00037 import com.realtime.crossfire.jxclient.guistate.GuiStateManager;
00038 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawextinfoListener;
00039 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireFailureListener;
00040 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireQueryListener;
00041 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00042 import com.realtime.crossfire.jxclient.server.crossfire.MessageTypes;
00043 import com.realtime.crossfire.jxclient.settings.Settings;
00044 import com.realtime.crossfire.jxclient.skin.skin.GuiFactory;
00045 import com.realtime.crossfire.jxclient.skin.skin.JXCSkin;
00046 import com.realtime.crossfire.jxclient.skin.skin.JXCSkinException;
00047 import org.jetbrains.annotations.NotNull;
00048 import org.jetbrains.annotations.Nullable;
00049
00054 public class GuiManager {
00055
00059 @Nullable
00060 private JXCSkin skin = null;
00061
00065 @NotNull
00066 private final JXCWindowRenderer windowRenderer;
00067
00071 @NotNull
00072 private final GuiFactory guiFactory;
00073
00077 @Nullable
00078 private Gui queryDialog;
00079
00083 @Nullable
00084 private Gui keybindDialog;
00085
00089 @NotNull
00090 private final KeybindingsManager keybindingsManager;
00091
00096 @Nullable
00097 private Gui dialogQuit = null;
00098
00103 @Nullable
00104 private Gui dialogDisconnect = null;
00105
00110 @Nullable
00111 private Gui dialogConnect = null;
00112
00117 @Nullable
00118 private AbstractLabel dialogConnectLabel = null;
00119
00123 private boolean currentQueryDialogIsNamePrompt = false;
00124
00128 @NotNull
00129 private final TooltipManagerImpl tooltipManager;
00130
00134 @NotNull
00135 private final Settings settings;
00136
00140 @NotNull
00141 private final JXCConnection connection;
00142
00146 @NotNull
00147 private final CrossfireServerConnection server;
00148
00152 @NotNull
00153 private final CrossfireDrawextinfoListener crossfireDrawextinfoListener = new CrossfireDrawextinfoListener() {
00154
00155 @Override
00156 public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
00157 if (skin == null) {
00158 throw new IllegalStateException();
00159 }
00160
00161 @Nullable final Gui dialog;
00162 String effectiveMessage = message;
00163 switch (type) {
00164 case MessageTypes.MSG_TYPE_BOOK:
00165 dialog = skin.getDialogBook(1);
00166 final AbstractLabel title = dialog.getFirstElementEndingWith(AbstractLabel.class, "_title");
00167 if (title != null) {
00168 final String[] tmp = message.split("\n", 2);
00169 title.setText(tmp[0]);
00170 effectiveMessage = tmp.length >= 2 ? tmp[1] : "";
00171 }
00172 break;
00173
00174 case MessageTypes.MSG_TYPE_CARD:
00175 case MessageTypes.MSG_TYPE_PAPER:
00176 case MessageTypes.MSG_TYPE_SIGN:
00177 case MessageTypes.MSG_TYPE_MONUMENT:
00178 case MessageTypes.MSG_TYPE_DIALOG:
00179 dialog = null;
00180 break;
00181
00182 case MessageTypes.MSG_TYPE_MOTD:
00183
00184
00185
00186
00187 dialog = null;
00188 break;
00189
00190 case MessageTypes.MSG_TYPE_ADMIN:
00191 case MessageTypes.MSG_TYPE_SHOP:
00192 case MessageTypes.MSG_TYPE_COMMAND:
00193 case MessageTypes.MSG_TYPE_ATTRIBUTE:
00194 case MessageTypes.MSG_TYPE_SKILL:
00195 case MessageTypes.MSG_TYPE_APPLY:
00196 case MessageTypes.MSG_TYPE_ATTACK:
00197 case MessageTypes.MSG_TYPE_COMMUNICATION:
00198 case MessageTypes.MSG_TYPE_SPELL:
00199 case MessageTypes.MSG_TYPE_ITEM:
00200 case MessageTypes.MSG_TYPE_MISC:
00201 case MessageTypes.MSG_TYPE_VICTIM:
00202 dialog = null;
00203 break;
00204
00205 default:
00206 dialog = null;
00207 break;
00208 }
00209
00210 if (dialog == null) {
00211 return;
00212 }
00213
00214 final AbstractLabel label = dialog.getFirstElementNotEndingWith(AbstractLabel.class, "_title");
00215 if (label != null) {
00216 label.setText(effectiveMessage);
00217 } else {
00218 final GUILabelLog log = dialog.getFirstElement(GUILabelLog.class);
00219 if (log != null) {
00220 log.updateText(effectiveMessage);
00221 }
00222 }
00223 openDialog(dialog, false);
00224 }
00225
00226 @Override
00227 public void setDebugMode(final boolean printMessageTypes) {
00228
00229 }
00230
00231 };
00232
00237 @NotNull
00238 private final CrossfireFailureListener crossfireFailureListener = new CrossfireFailureListener() {
00239
00240 @Override
00241 public void failure(@NotNull final String command, @NotNull final String arguments) {
00242 if (command.equals("accountlogin") && skin != null) {
00243 try {
00244 final Gui dialog = skin.getDialog("account_login");
00245 final GUIText passwordField = dialog.getFirstElement(GUIText.class, "account_password");
00246 if (passwordField != null) {
00247 passwordField.setText("");
00248 passwordField.setActive(true);
00249 }
00250 } catch (final JXCSkinException ignored) {
00251
00252 }
00253 }
00254 }
00255
00256 @Override
00257 public void clearFailure() {
00258
00259 }
00260
00261 };
00262
00267 @NotNull
00268 private final GuiStateListener guiStateListener = new GuiStateListener() {
00269
00270 @Override
00271 public void start() {
00272 closeTransientDialogs();
00273 server.removeCrossfireDrawextinfoListener(crossfireDrawextinfoListener);
00274 server.removeCrossfireFailureListener(crossfireFailureListener);
00275 windowRenderer.setGuiState(RendererGuiState.START);
00276 showGUIStart();
00277 }
00278
00279 @Override
00280 public void metaserver() {
00281 closeTransientDialogs();
00282 server.removeCrossfireDrawextinfoListener(crossfireDrawextinfoListener);
00283 server.removeCrossfireFailureListener(crossfireFailureListener);
00284 windowRenderer.setGuiState(RendererGuiState.META);
00285 showGUIMeta();
00286 activateMetaserverGui();
00287 }
00288
00289 @Override
00290 public void preConnecting(@NotNull final String serverInfo) {
00291
00292 }
00293
00294 @Override
00295 public void connecting(@NotNull final String serverInfo) {
00296 if (skin == null) {
00297 throw new IllegalStateException();
00298 }
00299
00300 closeTransientDialogs();
00301 windowRenderer.updateServerSettings();
00302 server.addCrossfireDrawextinfoListener(crossfireDrawextinfoListener);
00303 server.addCrossfireFailureListener(crossfireFailureListener);
00304 windowRenderer.setGuiState(RendererGuiState.LOGIN);
00305 showGUIMain();
00306 if (dialogConnect != null) {
00307 openDialog(dialogConnect, false);
00308 updateConnectLabel(ClientSocketState.CONNECTING, null);
00309 }
00310 }
00311
00312 @Override
00313 public void connecting(@NotNull final ClientSocketState clientSocketState) {
00314 updateConnectLabel(clientSocketState, null);
00315 }
00316
00317 @Override
00318 public void connected() {
00319 closeTransientDialogs();
00320 }
00321
00322 @Override
00323 public void connectFailed(@NotNull final String reason) {
00324 closeTransientDialogs();
00325 if (dialogConnect != null) {
00326 openDialog(dialogConnect, false);
00327 updateConnectLabel(ClientSocketState.CONNECT_FAILED, reason);
00328 }
00329 }
00330
00331 };
00332
00344 public GuiManager(@NotNull final GuiStateManager guiStateManager, @NotNull final TooltipManagerImpl tooltipManager, @NotNull final Settings settings, @NotNull final CrossfireServerConnection server, @NotNull final JXCWindowRenderer windowRenderer, @NotNull final GuiFactory guiFactory, @NotNull final KeybindingsManager keybindingsManager, @NotNull final JXCConnection connection) {
00345 this.tooltipManager = tooltipManager;
00346 this.settings = settings;
00347 this.server = server;
00348 this.windowRenderer = windowRenderer;
00349 this.guiFactory = guiFactory;
00350 this.keybindingsManager = keybindingsManager;
00351 this.connection = connection;
00352 guiStateManager.addGuiStateListener(guiStateListener);
00353 windowRenderer.setCurrentGui(guiFactory.newGui());
00354 queryDialog = guiFactory.newGui();
00355 keybindDialog = guiFactory.newGui();
00356 }
00357
00361 public void playerReceived() {
00362 if (windowRenderer.getGuiState() == RendererGuiState.NEW_CHAR) {
00363 openDialogByName("messages");
00364 }
00365 windowRenderer.setGuiState(RendererGuiState.PLAYING);
00366 }
00367
00372 public void manageAccount() {
00373 if (dialogConnect != null) {
00374 closeDialog(dialogConnect);
00375 }
00376 windowRenderer.setGuiState(RendererGuiState.ACCOUNT);
00377 hideAccountWindows();
00378 openDialogByName("account_main");
00379 }
00380
00384 public void showCharacters() {
00385 if (windowRenderer.getGuiState() != RendererGuiState.ACCOUNT) {
00386 windowRenderer.setGuiState(RendererGuiState.ACCOUNT);
00387 }
00388 hideAccountWindows();
00389 openDialogByName("account_characters");
00390 }
00391
00395 public void hideAccountWindows() {
00396 closeDialogByName("account_login");
00397 closeDialogByName("account_create");
00398 closeDialogByName("account_characters");
00399 closeDialogByName("account_main");
00400 closeDialogByName("account_link");
00401 closeDialogByName("account_character_new");
00402 closeDialogByName("account_password");
00403 }
00404
00409 public boolean openQuitDialog() {
00410 if (keybindingsManager.windowClosing()) {
00411 closeKeybindDialog();
00412 }
00413
00414 if (dialogQuit == null) {
00415 return false;
00416 }
00417
00418 if (dialogDisconnect != null) {
00419 closeDialog(dialogDisconnect);
00420 }
00421 assert dialogQuit != null;
00422 openDialog(dialogQuit, false);
00423 return true;
00424 }
00425
00432 public EscAction escPressed(final boolean connected) {
00433 if (keybindingsManager.escPressed()) {
00434 assert keybindDialog != null;
00435 closeDialog(keybindDialog);
00436 } else if (windowRenderer.deactivateCommandInput()) {
00437
00438 } else if (skin != null && closeDialog(skin.getDialogBook(1))) {
00439
00440 } else if (connected) {
00441 if (dialogDisconnect == null) {
00442 return EscAction.DISCONNECT;
00443 } else if (openDialog(dialogDisconnect, false)) {
00444 if (dialogQuit != null) {
00445 closeDialog(dialogQuit);
00446 }
00447 } else {
00448 assert dialogDisconnect != null;
00449 closeDialog(dialogDisconnect);
00450 }
00451 } else {
00452 if (dialogQuit == null) {
00453 return EscAction.QUIT;
00454 } else if (openDialog(dialogQuit, false)) {
00455 if (dialogDisconnect != null) {
00456 closeDialog(dialogDisconnect);
00457 }
00458 } else {
00459 assert dialogQuit != null;
00460 closeDialog(dialogQuit);
00461 }
00462 }
00463 return EscAction.IGNORE;
00464 }
00465
00471 public void openQueryDialog(@NotNull final String prompt, final int queryType) {
00472 if (queryDialog == null) {
00473 throw new IllegalStateException();
00474 }
00475
00476 openDialog(queryDialog, false);
00477 setHideInput((queryType&CrossfireQueryListener.HIDE_INPUT) != 0);
00478 currentQueryDialogIsNamePrompt = prompt.startsWith("What is your name?");
00479 if (currentQueryDialogIsNamePrompt) {
00480 final String playerName = settings.getString("player_"+connection.getHostname(), "");
00481 if (playerName.length() > 0) {
00482 assert queryDialog != null;
00483 final GUIText textArea = queryDialog.getFirstElement(GUIText.class);
00484 if (textArea != null) {
00485 textArea.setText(playerName);
00486 }
00487 }
00488 } else if (prompt.startsWith("[y] to roll new stats") || prompt.startsWith("Welcome, Brave New Warrior!")) {
00489 windowRenderer.setGuiState(RendererGuiState.NEW_CHAR);
00490 if (openDialogByName("new_char")) {
00491 closeDialogByName("messages");
00492 closeDialogByName("status");
00493 } else {
00494
00495
00496 openDialogByName("messages");
00497 openDialogByName("status");
00498 }
00499 assert queryDialog != null;
00500 openDialog(queryDialog, false);
00501 }
00502 }
00503
00512 public boolean openDialog(@NotNull final Gui dialog, final boolean autoCloseOnDeactivate) {
00513 final boolean result = windowRenderer.openDialog(dialog, autoCloseOnDeactivate);
00514 if (dialog == queryDialog) {
00515 setHideInput(false);
00516 } else {
00517 final String name = dialog.getName();
00518 if (name != null) {
00519 if (name.equals("account_login")) {
00520 final GUIText loginField = dialog.getFirstElement(GUIText.class, "account_login");
00521 if (loginField != null) {
00522 final String accountName = settings.getString("login_account_"+connection.getHostname(), "");
00523 if (accountName.length() > 0) {
00524 loginField.setText(accountName);
00525
00526 final GUIText passwordField = dialog.getFirstElement(GUIText.class, "account_password");
00527 if (passwordField != null) {
00528 passwordField.setText("");
00529 passwordField.setActive(true);
00530 }
00531 } else {
00532 loginField.setText("");
00533 loginField.setActive(true);
00534
00535 final GUIText passwordField = dialog.getFirstElement(GUIText.class, "account_password");
00536 if (passwordField != null) {
00537 passwordField.setText("");
00538 }
00539 }
00540 } else {
00541 final GUIText passwordField = dialog.getFirstElement(GUIText.class, "account_password");
00542 if (passwordField != null) {
00543 passwordField.setText("");
00544 }
00545 }
00546 } else if (name.equals("account_characters")) {
00547 final GUICharacterList characterList = dialog.getFirstElement(GUICharacterList.class);
00548 if (characterList != null) {
00549 final String accountName = server.getAccountName();
00550 if (accountName != null) {
00551 final String characterName = settings.getString("login_account_"+connection.getHostname()+"_"+accountName, "");
00552 if (characterName.length() > 0) {
00553 characterList.setCharacter(characterName);
00554 }
00555 }
00556 }
00557 }
00558 }
00559 }
00560 return result;
00561 }
00562
00567 public void toggleDialog(@NotNull final Gui dialog) {
00568 if (windowRenderer.toggleDialog(dialog) && dialog == queryDialog) {
00569 setHideInput(false);
00570 }
00571 }
00572
00576 public void closeQueryDialog() {
00577 if (queryDialog == null) {
00578 throw new IllegalStateException();
00579 }
00580
00581 closeDialog(queryDialog);
00582 }
00583
00589 private boolean openDialogByName(@NotNull final String name) {
00590 if (skin == null) {
00591 throw new IllegalStateException();
00592 }
00593
00594 final Gui dialog;
00595 try {
00596 dialog = skin.getDialog(name);
00597 } catch (final JXCSkinException ignored) {
00598
00599 return false;
00600 }
00601
00602 openDialog(dialog, false);
00603 return true;
00604 }
00605
00610 private void closeDialogByName(@NotNull final String name) {
00611 if (skin == null) {
00612 throw new IllegalStateException();
00613 }
00614
00615 final Gui dialog;
00616 try {
00617 dialog = skin.getDialog(name);
00618 } catch (final JXCSkinException ignored) {
00619
00620 return;
00621 }
00622 closeDialog(dialog);
00623 }
00624
00629 private void closeTransientDialogs() {
00630 if (queryDialog == null || skin == null) {
00631 throw new IllegalStateException();
00632 }
00633
00634 if (dialogDisconnect != null) {
00635 closeDialog(dialogDisconnect);
00636 }
00637 if (dialogQuit != null) {
00638 closeDialog(dialogQuit);
00639 }
00640 if (dialogConnect != null) {
00641 closeDialog(dialogConnect);
00642 }
00643 assert queryDialog != null;
00644 closeDialog(queryDialog);
00645 assert skin != null;
00646 closeDialog(skin.getDialogBook(1));
00647 }
00648
00653 private void activateMetaserverGui() {
00654 final String serverName = settings.getString("server", "crossfire.metalforge.net");
00655 if (serverName.length() > 0) {
00656 windowRenderer.setSelectedHostname(serverName);
00657 }
00658 }
00659
00663 private void openKeybindDialog() {
00664 if (keybindDialog == null) {
00665 throw new IllegalStateException();
00666 }
00667
00668 openDialog(keybindDialog, false);
00669 }
00670
00674 public void closeKeybindDialog() {
00675 if (keybindDialog == null) {
00676 throw new IllegalStateException();
00677 }
00678
00679 closeDialog(keybindDialog);
00680 }
00681
00688 public boolean closeDialog(@NotNull final Gui dialog) {
00689 return windowRenderer.closeDialog(dialog);
00690 }
00691
00697 public void updatePlayerName(@NotNull final String playerName) {
00698 if (currentQueryDialogIsNamePrompt) {
00699 settings.putString("player_"+connection.getHostname(), playerName, "The charactername last played on the server.");
00700 }
00701 }
00702
00711 @Nullable
00712 private GUIText activateCommandInput() {
00713
00714 final GUIText textArea1 = windowRenderer.activateCommandInput();
00715 if (textArea1 != null) {
00716 return textArea1;
00717 }
00718
00719
00720 assert skin != null;
00721 for (final Gui dialog : skin) {
00722 final GUIText textArea3 = JXCWindowRenderer.activateCommandInput(dialog);
00723 if (textArea3 != null) {
00724 openDialog(dialog, true);
00725 return textArea3;
00726 }
00727 }
00728
00729 return null;
00730 }
00731
00740 public void activateCommandInput(@Nullable final String newText) {
00741 final GUIText textArea = activateCommandInput();
00742 if (textArea != null && newText != null && newText.length() > 0) {
00743 textArea.setText(newText);
00744 }
00745 }
00746
00750 public void unsetSkin() {
00751 if (skin != null) {
00752 skin.detach();
00753 windowRenderer.setTooltip(null);
00754 skin = null;
00755 }
00756
00757 queryDialog = null;
00758 keybindDialog = null;
00759 dialogQuit = null;
00760 dialogDisconnect = null;
00761 }
00762
00767 @SuppressWarnings("NullableProblems")
00768 public void setSkin(@NotNull final JXCSkin skin) {
00769 this.skin = skin;
00770 skin.attach(tooltipManager);
00771 windowRenderer.setTooltip(skin.getTooltipLabel());
00772 queryDialog = skin.getDialogQuery();
00773 keybindDialog = skin.getDialogKeyBind();
00774 dialogQuit = skin.getDialogQuit();
00775 dialogDisconnect = skin.getDialogDisconnect();
00776 dialogConnect = skin.getDialogConnect();
00777 dialogConnectLabel = dialogConnect == null ? null : dialogConnect.getFirstElement(AbstractLabel.class, "message");
00778 }
00779
00783 private void showGUIStart() {
00784 windowRenderer.clearGUI(guiFactory.newGui());
00785 assert skin != null;
00786 windowRenderer.setCurrentGui(skin.getStartInterface());
00787 tooltipManager.reset();
00788 }
00789
00793 private void showGUIMeta() {
00794 windowRenderer.clearGUI(guiFactory.newGui());
00795 assert skin != null;
00796 final Gui newGui = skin.getMetaInterface();
00797 windowRenderer.setCurrentGui(newGui);
00798 newGui.activateDefaultElement();
00799 tooltipManager.reset();
00800 }
00801
00805 private void showGUIMain() {
00806 windowRenderer.clearGUI(guiFactory.newGui());
00807 assert skin != null;
00808 final Gui newGui = skin.getMainInterface();
00809 windowRenderer.setCurrentGui(newGui);
00810 tooltipManager.reset();
00811 }
00812
00816 public void term() {
00817 windowRenderer.endRendering();
00818 if (skin != null) {
00819 DialogStateParser.save(skin, windowRenderer);
00820 }
00821 keybindingsManager.saveKeybindings();
00822 }
00823
00831 private void updateConnectLabel(@NotNull final ClientSocketState clientSocketState, @Nullable final String param) {
00832 if (dialogConnectLabel != null) {
00833 String message = null;
00834 switch (clientSocketState) {
00835 case CONNECTING:
00836 message = "Connecting...";
00837 break;
00838
00839 case VERSION:
00840 message = "Exchanging version...";
00841 break;
00842
00843 case SETUP:
00844 message = "Exchanging configuration...";
00845 break;
00846
00847 case REQUESTINFO:
00848 message = "Requesting information...";
00849 break;
00850
00851 case ACCOUNT_INFO:
00852 message = "Starting account session...";
00853 break;
00854
00855 case ADDME:
00856 message = "Joining the game...";
00857 break;
00858
00859 case CONNECTED:
00860 message = "Done.";
00861 break;
00862
00863 case CONNECT_FAILED:
00864 message = "Cannot connect to Crossfire server:\n"+param;
00865 break;
00866 }
00867
00868 assert message != null;
00869 dialogConnectLabel.setText(message);
00870 }
00871 }
00872
00879 public boolean createKeyBinding(final boolean perCharacter, @NotNull final CommandList cmdList) {
00880 final boolean result = keybindingsManager.createKeyBinding(perCharacter, cmdList);
00881 if (result) {
00882 openKeybindDialog();
00883 }
00884 return result;
00885 }
00886
00893 public boolean removeKeyBinding(final boolean perCharacter) {
00894 final boolean result = keybindingsManager.removeKeyBinding(perCharacter);
00895 if (result) {
00896 openKeybindDialog();
00897 }
00898 return result;
00899 }
00900
00906 public void updateWindowSize(final int width, final int height) {
00907 if (skin != null) {
00908 skin.setScreenSize(width, height);
00909 assert skin != null;
00910 for (final Gui dialog : skin) {
00911 dialog.autoSize(width, height);
00912 }
00913 tooltipManager.setScreenSize(width, height);
00914 }
00915 }
00916
00923 @NotNull
00924 public CommandList getCommandList(@NotNull final String args) throws NoSuchCommandException {
00925 if (skin == null) {
00926 throw new IllegalStateException();
00927 }
00928
00929 try {
00930 return skin.getCommandList(args);
00931 } catch (final JXCSkinException ex) {
00932 throw new NoSuchCommandException(ex.getMessage());
00933 }
00934 }
00935
00940 public void setAccountName(@NotNull final String accountName) {
00941 settings.putString("login_account_"+connection.getHostname(), accountName, "The account last logged in on the server.");
00942 }
00943
00949 public void selectCharacter(@NotNull final String accountName, @NotNull final String characterName) {
00950 settings.putString("login_account_"+connection.getHostname()+"_"+accountName, characterName, "The character last selected on the account.");
00951 }
00952
00958 private void setHideInput(final boolean hideInput) {
00959 assert queryDialog != null;
00960 final GUIText textArea = queryDialog.getFirstElement(GUIText.class);
00961 if (textArea != null) {
00962 textArea.setHideInput(hideInput);
00963 }
00964 }
00965
00969 public enum EscAction {
00970
00974 IGNORE,
00975
00979 DISCONNECT,
00980
00984 QUIT
00985
00986 }
00987
00988 }