    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.net.URI;
    006    import java.util.ArrayList;
    007    import java.util.Iterator;
    008    import java.util.List;
    009    import org.lwjgl.input.Keyboard;
    010    import org.lwjgl.input.Mouse;
    011
    012    @SideOnly(Side.CLIENT)
    013    public class GuiChat extends GuiScreen
    014    {
    015        private String field_73898_b = "";
    016
    017        /**
    018         * keeps position of which chat message you will select when you press up, (does not increase for duplicated
    019         * messages sent immediately after each other)
    020         */
    021        private int sentHistoryCursor = -1;
    022        private boolean field_73897_d = false;
    023        private boolean field_73905_m = false;
    024        private int field_73903_n = 0;
    025        private List field_73904_o = new ArrayList();
    026
    027        /** used to pass around the URI to various dialogues and to the host os */
    028        private URI clickedURI = null;
    029
    030        /** Chat entry field */
    031        protected GuiTextField inputField;
    032
    033        /**
    034         * is the text that appears when you press the chat key and the input box appears pre-filled
    035         */
    036        private String defaultInputFieldText = "";
    037
    038        public GuiChat() {}
    039
    040        public GuiChat(String par1Str)
    041        {
    042            this.defaultInputFieldText = par1Str;
    043        }
    044
    045        /**
    046         * Adds the buttons (and other controls) to the screen in question.
    047         */
    048        public void initGui()
    049        {
    050            Keyboard.enableRepeatEvents(true);
    051            this.sentHistoryCursor = this.mc.ingameGUI.getChatGUI().getSentMessages().size();
    052            this.inputField = new GuiTextField(this.fontRenderer, 4, this.height - 12, this.width - 4, 12);
    053            this.inputField.setMaxStringLength(100);
    054            this.inputField.setEnableBackgroundDrawing(false);
    055            this.inputField.setFocused(true);
    056            this.inputField.setText(this.defaultInputFieldText);
    057            this.inputField.setCanLoseFocus(false);
    058        }
    059
    060        /**
    061         * Called when the screen is unloaded. Used to disable keyboard repeat events
    062         */
    063        public void onGuiClosed()
    064        {
    065            Keyboard.enableRepeatEvents(false);
    066            this.mc.ingameGUI.getChatGUI().resetScroll();
    067        }
    068
    069        /**
    070         * Called from the main game loop to update the screen.
    071         */
    072        public void updateScreen()
    073        {
    074            this.inputField.updateCursorCounter();
    075        }
    076
    077        /**
    078         * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
    079         */
    080        protected void keyTyped(char par1, int par2)
    081        {
    082            this.field_73905_m = false;
    083
    084            if (par2 == 15)
    085            {
    086                this.completePlayerName();
    087            }
    088            else
    089            {
    090                this.field_73897_d = false;
    091            }
    092
    093            if (par2 == 1)
    094            {
    095                this.mc.displayGuiScreen((GuiScreen)null);
    096            }
    097            else if (par2 == 28)
    098            {
    099                String var3 = this.inputField.getText().trim();
    100
    101                if (var3.length() > 0)
    102                {
    103                    this.mc.ingameGUI.getChatGUI().addToSentMessages(var3);
    104
    105                    if (!this.mc.handleClientCommand(var3))
    106                    {
    107                        this.mc.thePlayer.sendChatMessage(var3);
    108                    }
    109                }
    110
    111                this.mc.displayGuiScreen((GuiScreen)null);
    112            }
    113            else if (par2 == 200)
    114            {
    115                this.getSentHistory(-1);
    116            }
    117            else if (par2 == 208)
    118            {
    119                this.getSentHistory(1);
    120            }
    121            else if (par2 == 201)
    122            {
    123                this.mc.ingameGUI.getChatGUI().scroll(19);
    124            }
    125            else if (par2 == 209)
    126            {
    127                this.mc.ingameGUI.getChatGUI().scroll(-19);
    128            }
    129            else
    130            {
    131                this.inputField.textboxKeyTyped(par1, par2);
    132            }
    133        }
    134
    135        /**
    136         * Handles mouse input.
    137         */
    138        public void handleMouseInput()
    139        {
    140            super.handleMouseInput();
    141            int var1 = Mouse.getEventDWheel();
    142
    143            if (var1 != 0)
    144            {
    145                if (var1 > 1)
    146                {
    147                    var1 = 1;
    148                }
    149
    150                if (var1 < -1)
    151                {
    152                    var1 = -1;
    153                }
    154
    155                if (!isShiftKeyDown())
    156                {
    157                    var1 *= 7;
    158                }
    159
    160                this.mc.ingameGUI.getChatGUI().scroll(var1);
    161            }
    162        }
    163
    164        /**
    165         * Called when the mouse is clicked.
    166         */
    167        protected void mouseClicked(int par1, int par2, int par3)
    168        {
    169            if (par3 == 0 && this.mc.gameSettings.chatLinks)
    170            {
    171                ChatClickData var4 = this.mc.ingameGUI.getChatGUI().func_73766_a(Mouse.getX(), Mouse.getY());
    172
    173                if (var4 != null)
    174                {
    175                    URI var5 = var4.getURI();
    176
    177                    if (var5 != null)
    178                    {
    179                        if (this.mc.gameSettings.chatLinksPrompt)
    180                        {
    181                            this.clickedURI = var5;
    182                            this.mc.displayGuiScreen(new GuiChatConfirmLink(this, this, var4.getClickedUrl(), 0, var4));
    183                        }
    184                        else
    185                        {
    186                            this.func_73896_a(var5);
    187                        }
    188
    189                        return;
    190                    }
    191                }
    192            }
    193
    194            this.inputField.mouseClicked(par1, par2, par3);
    195            super.mouseClicked(par1, par2, par3);
    196        }
    197
    198        public void confirmClicked(boolean par1, int par2)
    199        {
    200            if (par2 == 0)
    201            {
    202                if (par1)
    203                {
    204                    this.func_73896_a(this.clickedURI);
    205                }
    206
    207                this.clickedURI = null;
    208                this.mc.displayGuiScreen(this);
    209            }
    210        }
    211
    212        private void func_73896_a(URI par1URI)
    213        {
    214            try
    215            {
    216                Class var2 = Class.forName("java.awt.Desktop");
    217                Object var3 = var2.getMethod("getDesktop", new Class[0]).invoke((Object)null, new Object[0]);
    218                var2.getMethod("browse", new Class[] {URI.class}).invoke(var3, new Object[] {par1URI});
    219            }
    220            catch (Throwable var4)
    221            {
    222                var4.printStackTrace();
    223            }
    224        }
    225
    226        /**
    227         * Autocompletes player name
    228         */
    229        public void completePlayerName()
    230        {
    231            String var3;
    232
    233            if (this.field_73897_d)
    234            {
    235                this.inputField.deleteFromCursor(this.inputField.func_73798_a(-1, this.inputField.getCursorPosition(), false) - this.inputField.getCursorPosition());
    236
    237                if (this.field_73903_n >= this.field_73904_o.size())
    238                {
    239                    this.field_73903_n = 0;
    240                }
    241            }
    242            else
    243            {
    244                int var1 = this.inputField.func_73798_a(-1, this.inputField.getCursorPosition(), false);
    245                this.field_73904_o.clear();
    246                this.field_73903_n = 0;
    247                String var2 = this.inputField.getText().substring(var1).toLowerCase();
    248                var3 = this.inputField.getText().substring(0, this.inputField.getCursorPosition());
    249                this.func_73893_a(var3, var2);
    250
    251                if (this.field_73904_o.isEmpty())
    252                {
    253                    return;
    254                }
    255
    256                this.field_73897_d = true;
    257                this.inputField.deleteFromCursor(var1 - this.inputField.getCursorPosition());
    258            }
    259
    260            if (this.field_73904_o.size() > 1)
    261            {
    262                StringBuilder var4 = new StringBuilder();
    263
    264                for (Iterator var5 = this.field_73904_o.iterator(); var5.hasNext(); var4.append(var3))
    265                {
    266                    var3 = (String)var5.next();
    267
    268                    if (var4.length() > 0)
    269                    {
    270                        var4.append(", ");
    271                    }
    272                }
    273
    274                this.mc.ingameGUI.getChatGUI().printChatMessageWithOptionalDeletion(var4.toString(), 1);
    275            }
    276
    277            this.inputField.writeText((String)this.field_73904_o.get(this.field_73903_n++));
    278        }
    279
    280        private void func_73893_a(String par1Str, String par2Str)
    281        {
    282            if (par1Str.length() >= 1)
    283            {
    284                this.mc.thePlayer.sendQueue.addToSendQueue(new Packet203AutoComplete(par1Str));
    285                this.field_73905_m = true;
    286            }
    287        }
    288
    289        /**
    290         * input is relative and is applied directly to the sentHistoryCursor so -1 is the previous message, 1 is the next
    291         * message from the current cursor position
    292         */
    293        public void getSentHistory(int par1)
    294        {
    295            int var2 = this.sentHistoryCursor + par1;
    296            int var3 = this.mc.ingameGUI.getChatGUI().getSentMessages().size();
    297
    298            if (var2 < 0)
    299            {
    300                var2 = 0;
    301            }
    302
    303            if (var2 > var3)
    304            {
    305                var2 = var3;
    306            }
    307
    308            if (var2 != this.sentHistoryCursor)
    309            {
    310                if (var2 == var3)
    311                {
    312                    this.sentHistoryCursor = var3;
    313                    this.inputField.setText(this.field_73898_b);
    314                }
    315                else
    316                {
    317                    if (this.sentHistoryCursor == var3)
    318                    {
    319                        this.field_73898_b = this.inputField.getText();
    320                    }
    321
    322                    this.inputField.setText((String)this.mc.ingameGUI.getChatGUI().getSentMessages().get(var2));
    323                    this.sentHistoryCursor = var2;
    324                }
    325            }
    326        }
    327
    328        /**
    329         * Draws the screen and all the components in it.
    330         */
    331        public void drawScreen(int par1, int par2, float par3)
    332        {
    333            drawRect(2, this.height - 14, this.width - 2, this.height - 2, Integer.MIN_VALUE);
    334            this.inputField.drawTextBox();
    335            super.drawScreen(par1, par2, par3);
    336        }
    337
    338        public void func_73894_a(String[] par1ArrayOfStr)
    339        {
    340            if (this.field_73905_m)
    341            {
    342                this.field_73904_o.clear();
    343                String[] var2 = par1ArrayOfStr;
    344                int var3 = par1ArrayOfStr.length;
    345
    346                for (int var4 = 0; var4 < var3; ++var4)
    347                {
    348                    String var5 = var2[var4];
    349
    350                    if (var5.length() > 0)
    351                    {
    352                        this.field_73904_o.add(var5);
    353                    }
    354                }
    355
    356                if (this.field_73904_o.size() > 0)
    357                {
    358                    this.field_73897_d = true;
    359                    this.completePlayerName();
    360                }
    361            }
    362        }
    363
    364        /**
    365         * Returns true if this GUI should pause the game when it is displayed in single-player
    366         */
    367        public boolean doesGuiPauseGame()
    368        {
    369            return false;
    370        }
    371    }