001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.util.ArrayList;
006    import java.util.Iterator;
007    import java.util.List;
008    import net.minecraft.client.Minecraft;
009    import org.lwjgl.opengl.GL11;
010    
011    @SideOnly(Side.CLIENT)
012    public class GuiNewChat extends Gui
013    {
014        /** The Minecraft instance. */
015        private final Minecraft mc;
016    
017        /** A list of messages previously sent through the chat GUI */
018        private final List sentMessages = new ArrayList();
019    
020        /** Chat lines to be displayed in the chat box */
021        private final List chatLines = new ArrayList();
022        private int field_73768_d = 0;
023        private boolean field_73769_e = false;
024    
025        public GuiNewChat(Minecraft par1Minecraft)
026        {
027            this.mc = par1Minecraft;
028        }
029    
030        public void drawChat(int par1)
031        {
032            if (this.mc.gameSettings.chatVisibility != 2)
033            {
034                byte var2 = 10;
035                boolean var3 = false;
036                int var4 = 0;
037                int var5 = this.chatLines.size();
038                float var6 = this.mc.gameSettings.chatOpacity * 0.9F + 0.1F;
039    
040                if (var5 > 0)
041                {
042                    if (this.getChatOpen())
043                    {
044                        var2 = 20;
045                        var3 = true;
046                    }
047    
048                    int var7;
049                    int var9;
050                    int var12;
051    
052                    for (var7 = 0; var7 + this.field_73768_d < this.chatLines.size() && var7 < var2; ++var7)
053                    {
054                        ChatLine var8 = (ChatLine)this.chatLines.get(var7 + this.field_73768_d);
055    
056                        if (var8 != null)
057                        {
058                            var9 = par1 - var8.getUpdatedCounter();
059    
060                            if (var9 < 200 || var3)
061                            {
062                                double var10 = (double)var9 / 200.0D;
063                                var10 = 1.0D - var10;
064                                var10 *= 10.0D;
065    
066                                if (var10 < 0.0D)
067                                {
068                                    var10 = 0.0D;
069                                }
070    
071                                if (var10 > 1.0D)
072                                {
073                                    var10 = 1.0D;
074                                }
075    
076                                var10 *= var10;
077                                var12 = (int)(255.0D * var10);
078    
079                                if (var3)
080                                {
081                                    var12 = 255;
082                                }
083    
084                                var12 = (int)((float)var12 * var6);
085                                ++var4;
086    
087                                if (var12 > 3)
088                                {
089                                    byte var13 = 3;
090                                    int var14 = -var7 * 9;
091                                    drawRect(var13, var14 - 1, var13 + 320 + 4, var14 + 8, var12 / 2 << 24);
092                                    GL11.glEnable(GL11.GL_BLEND);
093                                    String var15 = var8.getChatLineString();
094    
095                                    if (!this.mc.gameSettings.chatColours)
096                                    {
097                                        var15 = StringUtils.stripControlCodes(var15);
098                                    }
099    
100                                    this.mc.fontRenderer.drawStringWithShadow(var15, var13, var14, 16777215 + (var12 << 24));
101                                }
102                            }
103                        }
104                    }
105    
106                    if (var3)
107                    {
108                        var7 = this.mc.fontRenderer.FONT_HEIGHT;
109                        GL11.glTranslatef(0.0F, (float)var7, 0.0F);
110                        int var16 = var5 * var7 + var5;
111                        var9 = var4 * var7 + var4;
112                        int var17 = this.field_73768_d * var9 / var5;
113                        int var11 = var9 * var9 / var16;
114    
115                        if (var16 != var9)
116                        {
117                            var12 = var17 > 0 ? 170 : 96;
118                            int var18 = this.field_73769_e ? 13382451 : 3355562;
119                            drawRect(0, -var17, 2, -var17 - var11, var18 + (var12 << 24));
120                            drawRect(2, -var17, 1, -var17 - var11, 13421772 + (var12 << 24));
121                        }
122                    }
123                }
124            }
125        }
126    
127        public void func_73761_a()
128        {
129            this.chatLines.clear();
130            this.sentMessages.clear();
131        }
132    
133        /**
134         * takes a String and prints it to chat
135         */
136        public void printChatMessage(String par1Str)
137        {
138            this.printChatMessageWithOptionalDeletion(par1Str, 0);
139        }
140    
141        /**
142         * prints the String to Chat. If the ID is not 0, deletes an existing Chat Line of that ID from the GUI
143         */
144        public void printChatMessageWithOptionalDeletion(String par1Str, int par2)
145        {
146            boolean var3 = this.getChatOpen();
147            boolean var4 = true;
148    
149            if (par2 != 0)
150            {
151                this.deleteChatLine(par2);
152            }
153    
154            Iterator var5 = this.mc.fontRenderer.listFormattedStringToWidth(par1Str, 320).iterator();
155    
156            while (var5.hasNext())
157            {
158                String var6 = (String)var5.next();
159    
160                if (var3 && this.field_73768_d > 0)
161                {
162                    this.field_73769_e = true;
163                    this.scroll(1);
164                }
165    
166                if (!var4)
167                {
168                    var6 = " " + var6;
169                }
170    
171                var4 = false;
172                this.chatLines.add(0, new ChatLine(this.mc.ingameGUI.getUpdateCounter(), var6, par2));
173            }
174    
175            while (this.chatLines.size() > 100)
176            {
177                this.chatLines.remove(this.chatLines.size() - 1);
178            }
179        }
180    
181        /**
182         * Gets the list of messages previously sent through the chat GUI
183         */
184        public List getSentMessages()
185        {
186            return this.sentMessages;
187        }
188    
189        /**
190         * Adds this string to the list of sent messages, for recall using the up/down arrow keys
191         */
192        public void addToSentMessages(String par1Str)
193        {
194            if (this.sentMessages.isEmpty() || !((String)this.sentMessages.get(this.sentMessages.size() - 1)).equals(par1Str))
195            {
196                this.sentMessages.add(par1Str);
197            }
198        }
199    
200        /**
201         * Resets the chat scroll (executed when the GUI is closed)
202         */
203        public void resetScroll()
204        {
205            this.field_73768_d = 0;
206            this.field_73769_e = false;
207        }
208    
209        /**
210         * Scrolls the chat by the given number of lines.
211         */
212        public void scroll(int par1)
213        {
214            this.field_73768_d += par1;
215            int var2 = this.chatLines.size();
216    
217            if (this.field_73768_d > var2 - 20)
218            {
219                this.field_73768_d = var2 - 20;
220            }
221    
222            if (this.field_73768_d <= 0)
223            {
224                this.field_73768_d = 0;
225                this.field_73769_e = false;
226            }
227        }
228    
229        public ChatClickData func_73766_a(int par1, int par2)
230        {
231            if (!this.getChatOpen())
232            {
233                return null;
234            }
235            else
236            {
237                ScaledResolution var3 = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
238                int var4 = var3.getScaleFactor();
239                int var5 = par1 / var4 - 3;
240                int var6 = par2 / var4 - 40;
241    
242                if (var5 >= 0 && var6 >= 0)
243                {
244                    int var7 = Math.min(20, this.chatLines.size());
245    
246                    if (var5 <= 320 && var6 < this.mc.fontRenderer.FONT_HEIGHT * var7 + var7)
247                    {
248                        int var8 = var6 / (this.mc.fontRenderer.FONT_HEIGHT + 1) + this.field_73768_d;
249                        return new ChatClickData(this.mc.fontRenderer, (ChatLine)this.chatLines.get(var8), var5, var6 - (var8 - this.field_73768_d) * this.mc.fontRenderer.FONT_HEIGHT + var8);
250                    }
251                    else
252                    {
253                        return null;
254                    }
255                }
256                else
257                {
258                    return null;
259                }
260            }
261        }
262    
263        /**
264         * Adds a message to the chat after translating to the client's locale.
265         */
266        public void addTranslatedMessage(String par1Str, Object ... par2ArrayOfObj)
267        {
268            this.printChatMessage(StringTranslate.getInstance().translateKeyFormat(par1Str, par2ArrayOfObj));
269        }
270    
271        /**
272         * @return {@code true} if the chat GUI is open
273         */
274        public boolean getChatOpen()
275        {
276            return this.mc.currentScreen instanceof GuiChat;
277        }
278    
279        /**
280         * finds and deletes a Chat line by ID
281         */
282        public void deleteChatLine(int par1)
283        {
284            Iterator var2 = this.chatLines.iterator();
285            ChatLine var3;
286    
287            do
288            {
289                if (!var2.hasNext())
290                {
291                    return;
292                }
293    
294                var3 = (ChatLine)var2.next();
295            }
296            while (var3.getChatLineID() != par1);
297    
298            var2.remove();
299        }
300    }