/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package rsclient.hiscores; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import java.text.NumberFormat; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EtchedBorder; import logic.Calculate; import logic.RuneScapeAccount; import net.miginfocom.swing.MigLayout; import org.pushingpixels.trident.Timeline; import rsclient.coregui.LengthRestrictedDocument; /** * * @author ben */ public class HiscoresPanel extends JPanel implements StatRolloverListener { private JTextField usernameField; private JLabel xpDisplay, rsnLabel; private LevelsPanel levelsDisplayPanel; private RuneScapeAccount account; private JButton searchButton; private LevelInfoPanel levelInfoPanel; private Timeline rolloverTimeline; private ActionListener fireQuery; public HiscoresPanel() { account = new RuneScapeAccount(""); setup(); setupListeners(); setupAnimation(); searchButton.addActionListener(fireQuery); usernameField.addActionListener(fireQuery); } @Override public void onRolledOver(LevelScorePanel skillPanel) { if(!account.isValidAccount()){ return; } String skill = skillPanel.getSkill(); String capitalizedSkill = Character.toUpperCase(skill.charAt(0)) + skill.substring(1); int levelInt = account.hiscores.get(skill).level; int rankInt = account.hiscores.get(skill).rank; int experienceInt = account.hiscores.get(skill).experience; if(levelInt == 99){ while(experienceInt > Calculate.xpForLevel(levelInt + 1)){ levelInt++; } } String rankStr = NumberFormat.getIntegerInstance().format(rankInt); String experienceStr = NumberFormat.getIntegerInstance().format(experienceInt); if (rankInt < 0){ rankStr = "Unranked"; } if (!skill.equalsIgnoreCase("combat") && !skill.equalsIgnoreCase("overall")) { Integer x = Math.min(Calculate.xpForLevel(levelInt + 1), 200000000) - experienceInt; String xptl = NumberFormat.getIntegerInstance().format(x); //calculates the percentage of the way to the next level, //with 0% being 0 xp past the user's current level. double progressToLevel = ((double) experienceInt - (double) Calculate.xpForLevel(levelInt)) / (Math.min((double) Calculate.xpForLevel(levelInt + 1), 200000000) - (double) Calculate.xpForLevel(levelInt)); levelInfoPanel.setInfo(capitalizedSkill, rankStr, experienceStr, xptl, (int) (progressToLevel * 100)); } else if (skill.equalsIgnoreCase("overall")) { levelInfoPanel.setInfo(capitalizedSkill, rankStr, experienceStr, "", 0); } else { levelInfoPanel.setInfo("", "", "", "", 0); } } @Override public void onRolledOff(LevelScorePanel skillPanel) { levelInfoPanel.setInfo("", "", "", "", 0); levelInfoPanel.resetProgressBar(); } private void setup() { this.setLayout(new MigLayout("ins 5,center")); this.setBackground(Color.BLACK); usernameField = new JTextField(); usernameField.setDocument(new LengthRestrictedDocument(12)); usernameField.setBackground(new Color(101, 101, 101)); usernameField.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); xpDisplay = new JLabel(); rsnLabel = new JLabel("RSN:"); rsnLabel.setForeground(Color.white); rsnLabel.setFont(new Font(rsnLabel.getFont().getFontName(), Font.BOLD, rsnLabel.getFont().getSize())); levelsDisplayPanel = new LevelsPanel(); levelsDisplayPanel.setRolloverListener(this); levelInfoPanel = new LevelInfoPanel(); searchButton = new JButton(); searchButton.setIcon(new javax.swing.ImageIcon(getClass().getClassLoader().getResource("resources/searchiconsquare3.png"))); //searchButton.setIcon(new javax.swing.ImageIcon(getClass().getClassLoader().getResource("resources/bwsearch2.png"))); searchButton.setBorderPainted(false); searchButton.setFocusPainted(false); searchButton.setContentAreaFilled(false); add(rsnLabel, "cell 0 0, gap 0, align left"); add(usernameField, "width 60%, cell 1 0,align left, "); add(searchButton, "cell 2 0,align right "); add(levelsDisplayPanel, "width 100%, height 20%, cell 0 1, center,spanx"); add(levelInfoPanel, "width 100%, height 15%, cell 0 2, center, spanx"); } private void setupAnimation() { rolloverTimeline = new Timeline(usernameField); rolloverTimeline.addPropertyToInterpolate("background", usernameField.getBackground(), new Color(121, 121, 121)); rolloverTimeline.setDuration(150); usernameField.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { rolloverTimeline.play(); } @Override public void mouseExited(MouseEvent e) { rolloverTimeline.playReverse(); } }); } private void setupListeners() { fireQuery = new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { account = new RuneScapeAccount(usernameField.getText()); Runnable r1 = new Runnable() { public void run() { try { rsnLabel.setText("loading..."); account.loadStats(); } catch (IOException ex) {} if(account.isValidAccount()){ rsnLabel.setText("RSN:"); levelsDisplayPanel.updateLevels(account); } else { rsnLabel.setText("INVALID:"); levelsDisplayPanel.nullLevels(); } } }; new Thread(r1).start(); } }; } }