diff --git a/.gitignore b/.gitignore index a032d03..d784c81 100644 --- a/.gitignore +++ b/.gitignore @@ -121,4 +121,5 @@ parabotv2 releases ._* -Test.java \ No newline at end of file +Test.java +*.DS_Store diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..05e482a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,36 @@ +language: java + +jdk: +- oraclejdk7 + +before_install: + - chmod +x ./.travis/artifact-upload.sh + - chmod +x ./.travis/maven-build.sh + +script: ./.travis/maven-build.sh + +notifications: + slack: + secure: ciAOsdv9lf/IbAwyzeR/z2nlBSevmBHBqca6tf0Yh2DIyAx/uUo1ojon0W7Kv6tCECGhSTdfQAnZ+nFjjqaRs+Jq4svd9WKYrFuZyOWmT31iSJ/nvPymRvevSsgwpSKr0nJS9dxePKto/T3ozW29kx88eaJQH17zOaX2rfuIje4= + webhooks: + urls: + - https://dockbit.com/webhooks/7PrMKazLtLw5hhpXvakVKWoq + on_success: always + on_failure: always + on_start: never + +env: + global: + - secure: UG+b1tEgc8xv9x4r//2OAIK1RrYv6n209KTTFMMwcnAa7DI8HaP8nljRa5/VhDhuKHdlVrYH/tI90v7UVBs0GDVNwK5V17Io0fMm3FUGZekSthTCqqno5wAGa9r6a6mMLtSaSmIFeIKi0+0d2ZwplRuhj/dtEYjjBBj+kK8g4nE= + - secure: St/fecUDInFBCRriYqgp2F8PU9/SooorgxD9Mrs+b0EsC7AbtSsQXvdIv2Lp6xzdQ0VSXPcLIhULPOYrmBKnGQ/NjXTIZXxnroyQxxnI6xyEWIZwiHRY/bKRJDRbQTxD9NL32szKiDSwnw7pu6llF4D64UqQvziq4Gm6VohU75M= + - secure: bD15GVZWowiknbfLavh8CxSh0GsnF5kT4kZ6ggCuUDGyj0mzqf7dNRnchQIKkCG0WRYyTrFN4pEiygeywWsipEeAVv9Xhx3cuUZmzeQaR5KCWabSwJ8gK6jZd1YhcWmM9vrdPHobZr65MP0y/8mu/Fovgky9dY7KDf4G3SebNrM= + +addons: + artifacts: + paths: ./target/final/ + s3_region: "us-west-1" + +cache: + directories: + - .autoconf + - $HOME/.m2 diff --git a/.travis/artifact-upload.sh b/.travis/artifact-upload.sh new file mode 100644 index 0000000..6c1b4f4 --- /dev/null +++ b/.travis/artifact-upload.sh @@ -0,0 +1,8 @@ +#! /bin/bash + +local_file="$(ls $TRAVIS_BUILD_DIR/target/final/Parabot-V*.jar | head -n 1 | xargs -n 1 basename)" +local_path="$(ls $TRAVIS_BUILD_DIR/target/final/Parabot-V*.jar | head -n 1)" +target_url="ftp://$FTP_HOST/$local_file" + +echo "Uploading $local_file to $target_url" +curl -us $FTP_USERNAME:$FTP_PASSWORD -T "$local_path" "$target_url" \ No newline at end of file diff --git a/.travis/maven-build.sh b/.travis/maven-build.sh new file mode 100755 index 0000000..957ccf6 --- /dev/null +++ b/.travis/maven-build.sh @@ -0,0 +1,7 @@ +#! /bin/bash + +if [ "$TRAVIS_BRANCH" == "master" ]; then + mvn -U package +else + mvn -Dversion="-RC-$TRAVIS_BUILD_ID" -U package +fi \ No newline at end of file diff --git a/README.md b/README.md index d39fe36..ef23a16 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ +[![Build Status](https://travis-ci.org/Parabot/Parabot.svg?branch=master)](https://travis-ci.org/Parabot/Parabot) + # Parabot -Parabot V2.4. +Parabot V2.5. #### Website diff --git a/deploy/deploy.bat b/deploy/deploy.bat index 5ad3b36..e1f4c4f 100644 --- a/deploy/deploy.bat +++ b/deploy/deploy.bat @@ -1,4 +1,5 @@ -mvn install:install-file -DgroupId=${project.groupId} -DartifactId=${project.artifactId} -Dversion=${project.version} -Dpackaging=jar -Dfile=../target/${project.build.finalName}-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository +mvn install:install-file -DgroupId=${project.groupId} -DartifactId=${project.artifactId} -Dversion=${project.version} -Dpackaging=jar -Dfile=../target/final/${project.build.finalName}-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository :: mvn install:install-file -DgroupId=org.parabot -DartifactId=client -Dversion=2.4.1.1 -Dpackaging=jar -Dfile=../target/Parabot-V2.4.1.1-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository :: mvn install:install-file -DgroupId=org.parabot -DartifactId=client -Dversion=2.4.3 -Dpackaging=jar -Dfile=../target/Parabot-V2.4.3-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository +:: mvn install:install-file -DgroupId=org.parabot -DartifactId=client -Dversion=2.5 -Dpackaging=jar -Dfile=../target/final/Parabot-V2.5-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 index 1bf4a9f..b790f36 --- a/pom.xml +++ b/pom.xml @@ -6,12 +6,13 @@ org.parabot client - 2.4.5 + 2.5.1 jar 1.7 + Parabot client @@ -80,7 +81,7 @@ - Parabot-V${version} + Parabot-V${version}${build.version} src/main/resources @@ -89,18 +90,29 @@ deploy true - - - - - - - deploy.bat - + + deploy.bat + package.bat + clean.bat + + + + + + maven-resources-plugin + 2.5 + + UTF-8 + + ttf + + + + org.apache.maven.plugins maven-compiler-plugin @@ -114,7 +126,7 @@ org.apache.maven.plugins maven-assembly-plugin - 2.4.1 + ${version} jar-with-dependencies @@ -124,6 +136,8 @@ org.parabot.Landing + ${project.build.directory}/final/ + false @@ -135,7 +149,6 @@ - diff --git a/src/main/java/org/parabot/core/Configuration.java b/src/main/java/org/parabot/core/Configuration.java index 9003784..5ae8cdc 100644 --- a/src/main/java/org/parabot/core/Configuration.java +++ b/src/main/java/org/parabot/core/Configuration.java @@ -26,4 +26,7 @@ public class Configuration { public static final String BUGSNAG_API = "d79752cf94dd4beb24c3d312a8609f53"; public static final Version BOT_VERSION = ProjectProperties.getProjectVersion(); + + public static final String BOT_TITLE = "Parabot"; + public static final String BOT_SLOGAN = "The best RuneScape private server bot"; } diff --git a/src/main/java/org/parabot/core/Context.java b/src/main/java/org/parabot/core/Context.java index c895f1d..8cfd7b7 100644 --- a/src/main/java/org/parabot/core/Context.java +++ b/src/main/java/org/parabot/core/Context.java @@ -163,6 +163,7 @@ public class Context { * Loads the game */ public void load() { + BotUI.getInstance().getJMenuBar().remove(2); Core.verbose("Parsing server jar..."); serverProvider.init(); serverProvider.parseJar(); diff --git a/src/main/java/org/parabot/core/Directories.java b/src/main/java/org/parabot/core/Directories.java index 8b04584..d18ae07 100644 --- a/src/main/java/org/parabot/core/Directories.java +++ b/src/main/java/org/parabot/core/Directories.java @@ -40,6 +40,7 @@ public class Directories { cached.put("Settings", new File(cached.get("Root"), "/Parabot/settings/")); cached.put("Servers", new File(cached.get("Root"), "/Parabot/servers/")); cached.put("Cache", new File(cached.get("Root"), "/Parabot/cache/")); + cached.put("Screenshots", new File(cached.get("Root"), "/Parabot/screenshots/")); Core.verbose("Directories cached."); clearCache(259200); @@ -192,6 +193,16 @@ public class Directories { return cached.get("Home"); } + + /** + * Returns the screenshot folder. + * + * @return + */ + public static File getScreenshotDir() { + return cached.get("Screenshots"); + } + /** * Validates all directories and makes them if necessary */ diff --git a/src/main/java/org/parabot/core/classpath/ClassPath.java b/src/main/java/org/parabot/core/classpath/ClassPath.java index 45ade74..ddd9881 100644 --- a/src/main/java/org/parabot/core/classpath/ClassPath.java +++ b/src/main/java/org/parabot/core/classpath/ClassPath.java @@ -196,7 +196,7 @@ public class ClassPath { * @throws IOException */ protected void loadClass(InputStream in) throws IOException { - ClassReader cr = new ClassReader(in); + ClassReader cr = new ClassReader(in); ClassNode cn = new ClassNode(); RemappingClassAdapter rca = new RemappingClassAdapter(cn,classRemapper); RedirectClassAdapter redir = new RedirectClassAdapter(rca); diff --git a/src/main/java/org/parabot/core/ui/BotUI.java b/src/main/java/org/parabot/core/ui/BotUI.java index 060b17a..532e52b 100644 --- a/src/main/java/org/parabot/core/ui/BotUI.java +++ b/src/main/java/org/parabot/core/ui/BotUI.java @@ -1,17 +1,23 @@ package org.parabot.core.ui; import org.parabot.core.Context; +import org.parabot.core.Directories; import org.parabot.core.ui.components.GamePanel; import org.parabot.core.ui.components.VerboseLoader; import org.parabot.core.ui.images.Images; import org.parabot.core.ui.utils.SwingUtil; import org.parabot.environment.OperatingSystem; +import org.parabot.environment.api.utils.StringUtils; import org.parabot.environment.scripts.Script; import org.parabot.environment.scripts.randoms.Random; +import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; /** @@ -25,7 +31,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, private static BotUI instance; private static JDialog dialog; - private JMenuItem run, pause, stop; + private JMenuItem run, pause, stop, cacheClear; private boolean runScript, pauseScript; public BotUI(String username, String password) { @@ -38,7 +44,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, setTitle("Parabot"); setResizable(false); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); createMenu(); setLayout(new BorderLayout()); @@ -64,11 +70,13 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, return instance; } + private void createMenu() { JMenuBar menuBar = new JMenuBar(); JMenu file = new JMenu("File"); JMenu scripts = new JMenu("Script"); + JMenu features = new JMenu("Features"); JMenuItem screenshot = new JMenuItem("Create screenshot"); JMenuItem proxy = new JMenuItem("Network"); @@ -94,6 +102,9 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, stop.setEnabled(false); stop.setIcon(new ImageIcon(Images.getResource("/storage/images/stop.png"))); + cacheClear = new JMenuItem("Clear cache"); + cacheClear.setIcon(new ImageIcon(Images.getResource("/storage/images/trash.png"))); + screenshot.addActionListener(this); proxy.addActionListener(this); randoms.addActionListener(this); @@ -101,6 +112,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, logger.addActionListener(this); explorer.addActionListener(this); exit.addActionListener(this); + cacheClear.addActionListener(this); run.addActionListener(this); pause.addActionListener(this); @@ -118,8 +130,12 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, scripts.add(pause); scripts.add(stop); + features.add(cacheClear); + menuBar.add(file); menuBar.add(scripts); + menuBar.add(features); + setJMenuBar(menuBar); } @@ -130,7 +146,33 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, switch (command) { case "Create screenshot": - JOptionPane.showMessageDialog(this, "We are still working on this..."); + try { + Robot robot = new Robot(); + Rectangle parabotScreen = new Rectangle((int) getLocation().getX(), (int) getLocation().getY(), getWidth(), getHeight()); + BufferedImage image = robot.createScreenCapture(parabotScreen); + String randString = StringUtils.randomString(10); + boolean search = true; + boolean duplicate = false; + while (search == true) { + for (File f : Directories.getScreenshotDir().listFiles()) { + if (f.getAbsoluteFile().getName().contains(randString)) { + duplicate = true; + break; + } + } + if (!duplicate) { + search = false; + } else { + randString = StringUtils.randomString(10); + duplicate = false; + } + } + File file = new File(Directories.getScreenshotDir().getPath() + "/" + randString + ".png"); + ImageIO.write(image, "png", file); + + } catch (IOException | AWTException k) { + k.printStackTrace(); + } break; case "Exit": System.exit(0); @@ -173,7 +215,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, BotUI.getInstance().revalidate(); if (!Logger.getInstance().isClearable()) { Logger.getInstance().setClearable(); - } else if(Logger.getInstance().isClearable() && !Logger.getInstance().isVisible()) { + } else if (Logger.getInstance().isClearable() && !Logger.getInstance().isVisible()) { Logger.clearLogger(); Logger.addMessage("Logger started", false); } @@ -181,6 +223,9 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, case "Disable dialog": BotDialog.getInstance().setVisible(!dialog.isVisible()); break; + case "Clear cache": + Directories.clearCache(); + break; default: System.out.println("Invalid command: " + command); } @@ -274,4 +319,5 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener, @Override public void windowOpened(WindowEvent arg0) { } -} + +} \ No newline at end of file diff --git a/src/main/java/org/parabot/core/ui/ReflectUI.java b/src/main/java/org/parabot/core/ui/ReflectUI.java index 2b26873..351ca66 100644 --- a/src/main/java/org/parabot/core/ui/ReflectUI.java +++ b/src/main/java/org/parabot/core/ui/ReflectUI.java @@ -1,198 +1,263 @@ package org.parabot.core.ui; -import java.awt.Dimension; -import java.util.HashMap; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JEditorPane; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; - import org.parabot.core.Context; import org.parabot.core.asm.ASMClassLoader; import org.parabot.core.classpath.ClassPath; import org.parabot.core.reflect.RefClass; import org.parabot.core.reflect.RefField; +import javax.swing.*; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Enumeration; +import java.util.HashMap; + /** - * * A Reflection explorer - * + * * @author Everel - * */ public class ReflectUI extends JFrame { - private static final long serialVersionUID = 98565034137367257L; - private DefaultMutableTreeNode root; - private DefaultTreeModel model; - private JEditorPane basicInfoPane; - private JEditorPane selectionInfoPane; - - private Object instance; + private static final long serialVersionUID = 98565034137367257L; + private JTree tree; + private DefaultMutableTreeNode root; + private DefaultTreeModel model; + private JEditorPane basicInfoPane; + private JEditorPane selectionInfoPane; - private HashMap classes; - private HashMap fields; + private Object instance; - public ReflectUI() { - this.root = new DefaultMutableTreeNode("Classes"); - this.model = new DefaultTreeModel(root); - this.basicInfoPane = new JEditorPane(); - this.selectionInfoPane = new JEditorPane(); - this.classes = new HashMap<>(); - this.fields = new HashMap<>(); - this.instance = Context.getInstance().getClient(); + private HashMap classes; + private HashMap fields; - fillModel(); + public ReflectUI() { + this.root = new DefaultMutableTreeNode("Classes"); + this.model = new DefaultTreeModel(root); + this.basicInfoPane = new JEditorPane(); + this.selectionInfoPane = new JEditorPane(); + this.classes = new HashMap<>(); + this.fields = new HashMap<>(); + this.instance = Context.getInstance().getClient(); - setTitle("Reflection explorer"); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); + fillModel(); - JPanel content = new JPanel(); - content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); + setTitle("Reflection explorer"); + setDefaultCloseOperation(DISPOSE_ON_CLOSE); - JPanel exploreContent = new JPanel(); - exploreContent.setLayout(new BoxLayout(exploreContent, BoxLayout.X_AXIS)); - - JPanel infoContent = new JPanel(); - infoContent.setLayout(new BoxLayout(infoContent, BoxLayout.Y_AXIS)); + JPanel content = new JPanel(); + content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); - JTree tree = new JTree(); - tree.setRootVisible(true); - tree.setShowsRootHandles(true); - tree.setModel(model); - tree.addTreeSelectionListener(new TreeSelectionListener() { + JPanel exploreContent = new JPanel(); + exploreContent.setLayout(new BoxLayout(exploreContent, BoxLayout.X_AXIS)); - @Override - public void valueChanged(TreeSelectionEvent event) { - TreePath path = event.getPath(); - Object[] pathElements = path.getPath(); - Object element = pathElements[pathElements.length-1]; - if(pathElements.length == 2) { - // class - setClassInfo(classes.get(element)); - } - if(pathElements.length == 3) { - // field - setFieldInfo(fields.get(element)); - } - } - - }); + JPanel infoContent = new JPanel(); + infoContent.setLayout(new BoxLayout(infoContent, BoxLayout.Y_AXIS)); - JScrollPane scrollTreePane = new JScrollPane(tree); - scrollTreePane.setPreferredSize(new Dimension(400, 300)); - - basicInfoPane.setContentType("text/html"); - basicInfoPane.setEditable(false); + JPanel searchContent = new JPanel(); + searchContent.setLayout(new BoxLayout(searchContent, BoxLayout.X_AXIS)); - selectionInfoPane.setContentType("text/html"); - selectionInfoPane.setEditable(false); - - JScrollPane scrollBasicInfoPane = new JScrollPane(basicInfoPane); - scrollBasicInfoPane.setPreferredSize(new Dimension(400, 90)); + final JTextField searchFunction = new JTextField(10); + searchFunction.setHorizontalAlignment(JTextField.CENTER); + searchFunction.setSize(30, 30); + searchFunction.setColumns(1); + searchFunction.setPreferredSize(new Dimension(30, 30)); - JScrollPane scrollSelectInfoPane = new JScrollPane(selectionInfoPane); - scrollSelectInfoPane.setPreferredSize(new Dimension(400, 200)); - - infoContent.add(scrollBasicInfoPane); - infoContent.add(Box.createRigidArea(new Dimension(0, 10))); - infoContent.add(scrollSelectInfoPane); + final JButton searchButton = new JButton("Search"); + searchFunction.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + searchButton.getActionListeners()[0].actionPerformed(e); + } + }); - exploreContent.add(scrollTreePane); - exploreContent.add(Box.createRigidArea(new Dimension(10, 0))); - exploreContent.add(infoContent); + searchButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + RefField result = null; + String search = searchFunction.getText(); + for (RefField f : fields.values()) { + if (f != null && (f.asObject()) != null) { + String value; + if ((value = f.asObject().toString()).equalsIgnoreCase(search)) { + result = f; + } else if (value.toLowerCase().startsWith(search.toLowerCase())) { + result = f; + } else if (value.toLowerCase().endsWith(search.toLowerCase())) { + result = f; + } + } + } + if (result != null) { + setFieldInfo(result); + } + } + }); - content.add(exploreContent); - JScrollPane contentPane = new JScrollPane(content); - Dimension prefSize = content.getPreferredSize(); - contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height)); - setContentPane(contentPane); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } + final JButton adjustClasses = new JButton("Expand"); + adjustClasses.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Enumeration topLevelNodes + = ((TreeNode) tree.getModel().getRoot()).children(); + while (topLevelNodes.hasMoreElements()) { + DefaultMutableTreeNode node + = (DefaultMutableTreeNode) topLevelNodes.nextElement(); + TreePath treePath = new TreePath(node.getPath()); + if (adjustClasses.getText().equalsIgnoreCase("expand")) { + tree.expandPath(treePath); + } else { + tree.collapsePath(treePath); + } + } - private void fillModel() { - Context context = Context.getInstance(); - ClassPath classPath = context.getClassPath(); - ASMClassLoader classLoader = context.getASMClassLoader(); - for (String className : classPath.classNames) { - try { - DefaultMutableTreeNode classNode = new DefaultMutableTreeNode( - "Class: " + className); - DefaultMutableTreeNode fieldNode; + adjustClasses.setText(adjustClasses.getText().equalsIgnoreCase("expand") ? "Collapse" : "Expand"); + } + }); - Class clazz = classLoader.loadClass(className); + searchContent.add(adjustClasses); + searchContent.add(searchFunction); + searchContent.setMaximumSize(new Dimension(500, (int) searchContent.getPreferredSize().getHeight())); + searchContent.add(searchButton); - RefClass refClass = new RefClass(clazz); - if(refClass.instanceOf(this.instance)) { - refClass.setInstance(this.instance); - } - - for (RefField field : refClass.getFields()) { - fieldNode = new DefaultMutableTreeNode("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]"); - classNode.add(fieldNode); - fields.put(fieldNode, field); - } - classes.put(classNode, refClass); - root.add(classNode); - } catch (Throwable t) { - t.printStackTrace(); - } - } - } - - private void fillBasicInfoPane() { - Context context = Context.getInstance(); - ClassPath classPath = context.getClassPath(); - - StringBuilder builder = new StringBuilder(); - - builder.append("Classes: ").append(classPath.classNames.size()).append("
"); - builder.append("Using instance: ").append(instance.toString()).append("
"); - - basicInfoPane.setText(builder.toString()); - } - - private void setFieldInfo(RefField refField) { - StringBuilder builder = new StringBuilder(); - RefClass refClass = refField.getOwner(); - builder.append("

").append(refClass.getClassName()).append(".").append(refField.getName()).append("


"); - builder.append("Class: ").append(refClass.getClassName()).append("
"); - builder.append("Value: ").append(refField.asObject()).append("
"); - builder.append("Type: ").append(refField.getASMType().getClassName()).append("
"); - builder.append("Static: ").append(refField.isStatic() ? "yes" : "no").append("
"); - builder.append("Array: ").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("
"); - selectionInfoPane.setText(builder.toString()); - - fillBasicInfoPane(); - } - - private void setClassInfo(RefClass refClass) { - StringBuilder builder = new StringBuilder(); - builder.append("

").append(refClass.getClassName()).append("


"); - if(refClass.getClassName().contains(".")) { - builder.append("Package: ").append(refClass.getClassName().substring(0, refClass.getClassName().lastIndexOf("."))).append("
"); - } - builder.append("Abstract: ").append(refClass.isAbstract() ? "yes" : "no").append("
"); - builder.append("Interface: ").append(refClass.isInterface() ? "yes" : "no").append("
"); - builder.append("Superclass: ").append(refClass.hasSuperclass() ? refClass.getSuperclass().getClassName() : "no").append("
"); - builder.append("Fields: ").append(refClass.getFields().length).append("
"); - builder.append("Methods: ").append(refClass.getMethods().length).append("
"); - builder.append("Constructors: ").append(refClass.getConstructors().length).append("
"); - selectionInfoPane.setText(builder.toString()); - - fillBasicInfoPane(); - } + tree = new JTree(); + tree.setRootVisible(true); + tree.setShowsRootHandles(true); + tree.setModel(model); + tree.addTreeSelectionListener(new TreeSelectionListener() { -} + @Override + public void valueChanged(TreeSelectionEvent event) { + TreePath path = event.getPath(); + Object[] pathElements = path.getPath(); + Object element = pathElements[pathElements.length - 1]; + if (pathElements.length == 2) { + setClassInfo(classes.get(element)); + } else if (pathElements.length == 3) { + RefField field = fields.get(element); + setFieldInfo(field); + DefaultMutableTreeNode el = (DefaultMutableTreeNode) element; + el.setUserObject("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]"); + } + } + + }); + + JScrollPane scrollTreePane = new JScrollPane(tree); + scrollTreePane.setPreferredSize(new Dimension(400, 300)); + + basicInfoPane.setContentType("text/html"); + basicInfoPane.setEditable(false); + + selectionInfoPane.setContentType("text/html"); + selectionInfoPane.setEditable(false); + + JScrollPane scrollBasicInfoPane = new JScrollPane(basicInfoPane); + scrollBasicInfoPane.setPreferredSize(new Dimension(400, 90)); + + JScrollPane scrollSelectInfoPane = new JScrollPane(selectionInfoPane); + scrollSelectInfoPane.setPreferredSize(new Dimension(400, 200)); + + infoContent.add(scrollBasicInfoPane); + infoContent.add(Box.createRigidArea(new Dimension(0, 10))); + infoContent.add(scrollSelectInfoPane); + + exploreContent.add(scrollTreePane); + exploreContent.add(Box.createRigidArea(new Dimension(10, 0))); + exploreContent.add(infoContent); + + content.add(exploreContent); + content.add(searchContent); + + JScrollPane contentPane = new JScrollPane(content); + Dimension prefSize = content.getPreferredSize(); + contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height)); + setContentPane(contentPane); + pack(); + setLocationRelativeTo(null); + setVisible(true); + } + + private void fillModel() { + Context context = Context.getInstance(); + ClassPath classPath = context.getClassPath(); + ASMClassLoader classLoader = context.getASMClassLoader(); + for (String className : classPath.classNames) { + try { + DefaultMutableTreeNode classNode = new DefaultMutableTreeNode( + "Class: " + className); + DefaultMutableTreeNode fieldNode; + + Class clazz = classLoader.loadClass(className); + + RefClass refClass = new RefClass(clazz); + if (refClass.instanceOf(this.instance)) { + refClass.setInstance(this.instance); + } + + for (RefField field : refClass.getFields()) { + fieldNode = new DefaultMutableTreeNode("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]"); + classNode.add(fieldNode); + fields.put(fieldNode, field); + } + classes.put(classNode, refClass); + + root.add(classNode); + } catch (Throwable t) { + t.printStackTrace(); + } + } + } + + private void fillBasicInfoPane() { + Context context = Context.getInstance(); + ClassPath classPath = context.getClassPath(); + + StringBuilder builder = new StringBuilder(); + + builder.append("Classes: ").append(classPath.classNames.size()).append("
"); + builder.append("Using instance: ").append(instance.toString()).append("
"); + + basicInfoPane.setText(builder.toString()); + } + + private void setFieldInfo(RefField refField) { + StringBuilder builder = new StringBuilder(); + RefClass refClass = refField.getOwner(); + builder.append("

").append(refClass.getClassName()).append(".").append(refField.getName()).append("


"); + builder.append("Class: ").append(refClass.getClassName()).append("
"); + builder.append("Value: ").append(refField.asObject()).append("
"); + builder.append("Type: ").append(refField.getASMType().getClassName()).append("
"); + builder.append("Static: ").append(refField.isStatic() ? "yes" : "no").append("
"); + builder.append("Array: ").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("
"); + selectionInfoPane.setText(builder.toString()); + + fillBasicInfoPane(); + } + + private void setClassInfo(RefClass refClass) { + StringBuilder builder = new StringBuilder(); + builder.append("

").append(refClass.getClassName()).append("


"); + if (refClass.getClassName().contains(".")) { + builder.append("Package: ").append(refClass.getClassName().substring(0, refClass.getClassName().lastIndexOf("."))).append("
"); + } + builder.append("Abstract: ").append(refClass.isAbstract() ? "yes" : "no").append("
"); + builder.append("Interface: ").append(refClass.isInterface() ? "yes" : "no").append("
"); + builder.append("Superclass: ").append(refClass.hasSuperclass() ? refClass.getSuperclass().getClassName() : "no").append("
"); + builder.append("Fields: ").append(refClass.getFields().length).append("
"); + builder.append("Methods: ").append(refClass.getMethods().length).append("
"); + builder.append("Constructors: ").append(refClass.getConstructors().length).append("
"); + selectionInfoPane.setText(builder.toString()); + + fillBasicInfoPane(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/parabot/core/ui/ServerSelector.java b/src/main/java/org/parabot/core/ui/ServerSelector.java old mode 100644 new mode 100755 index 2731890..3bbaacd --- a/src/main/java/org/parabot/core/ui/ServerSelector.java +++ b/src/main/java/org/parabot/core/ui/ServerSelector.java @@ -31,7 +31,6 @@ public class ServerSelector extends JPanel { } public ServerSelector() { - Queue widgets = getServers(); if (initServer != null) { if (runServer(widgets)) { @@ -42,7 +41,7 @@ public class ServerSelector extends JPanel { setLayout(new BorderLayout()); - setPreferredSize(new Dimension(600, 400)); + setPreferredSize(new Dimension(600, 350)); JPanel interior = new JPanel(null); @@ -66,8 +65,7 @@ public class ServerSelector extends JPanel { .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrlInterior .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - - add(scrlInterior, BorderLayout.CENTER); + add(scrlInterior); } diff --git a/src/main/java/org/parabot/core/ui/components/ServerComponent.java b/src/main/java/org/parabot/core/ui/components/ServerComponent.java index ee38480..7fa9c83 100644 --- a/src/main/java/org/parabot/core/ui/components/ServerComponent.java +++ b/src/main/java/org/parabot/core/ui/components/ServerComponent.java @@ -13,6 +13,7 @@ import java.awt.event.MouseMotionListener; import javax.swing.JPanel; import org.parabot.core.desc.ServerDescription; +import org.parabot.core.ui.fonts.Fonts; import org.parabot.environment.Environment; /** @@ -61,13 +62,13 @@ public class ServerComponent extends JPanel implements MouseListener, g2d.setColor(bgColor); g2d.fillRect(0, 0, w, h); g.setColor(Color.black); - Font title = new Font("Arial", Font.BOLD, 16); + Font title = Fonts.getResource("leelawadee.ttf", 16); g.setFont(title); String serverName = desc.getServerName(); int sw = g.getFontMetrics().stringWidth(serverName); g.drawString(serverName, (w / 2) - (sw / 2), 30); - Font normal = new Font("Arial", Font.PLAIN, 12); + Font normal = Fonts.getResource("leelawadee.ttf"); g.setFont(normal); FontMetrics fm = g.getFontMetrics(); String author = "Author: " + desc.getAuthor(); diff --git a/src/main/java/org/parabot/core/ui/components/VerboseLoader.java b/src/main/java/org/parabot/core/ui/components/VerboseLoader.java old mode 100644 new mode 100755 index 9ab8c70..9d9e102 --- a/src/main/java/org/parabot/core/ui/components/VerboseLoader.java +++ b/src/main/java/org/parabot/core/ui/components/VerboseLoader.java @@ -1,250 +1,286 @@ package org.parabot.core.ui.components; +import org.parabot.core.Configuration; import org.parabot.core.Core; import org.parabot.core.forum.AccountManager; import org.parabot.core.forum.AccountManagerAccess; import org.parabot.core.io.ProgressListener; import org.parabot.core.ui.ServerSelector; import org.parabot.core.ui.images.Images; +import org.parabot.core.ui.fonts.Fonts; import org.parabot.core.ui.utils.UILog; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.geom.Line2D; import java.awt.image.BufferedImage; +import java.awt.image.RescaleOp; /** * An informative JPanel which tells the user what bot is doing - * - * @author Everel * + * @author Everel, EmmaStone */ public class VerboseLoader extends JPanel implements ProgressListener { - private static final long serialVersionUID = 7412412644921803896L; - private static VerboseLoader current; - private static String state = "Initializing loader..."; - - public static final int STATE_AUTHENTICATION = 0; - public static final int STATE_LOADING = 1; - public static final int STATE_SERVER_SELECT = 2; - private int currentState; - - private static AccountManager manager; - - private FontMetrics fontMetrics; - private BufferedImage background; - private ProgressBar progressBar; - private JPanel loginPanel; - - public static final AccountManagerAccess MANAGER_FETCHER = new AccountManagerAccess() { + private static final long serialVersionUID = 7412412644921803896L; + private static VerboseLoader current; + private static String state = "Initializing loader..."; - @Override - public final void setManager(AccountManager manager) { - VerboseLoader.manager = manager; - } + private static final int STATE_AUTHENTICATION = 0; + public static final int STATE_LOADING = 1; + private static final int STATE_SERVER_SELECT = 2; + private int currentState; - }; + private static AccountManager manager; - private VerboseLoader(String username, String password) { - if(current != null) { - throw new IllegalStateException("MainScreenComponent already made."); - } - current = this; - this.background = Images.getResource("/storage/images/background.png"); - this.progressBar = new ProgressBar(400, 20); - setLayout(new GridBagLayout()); - setSize(775, 510); - setPreferredSize(new Dimension(775, 510)); - setDoubleBuffered(true); - setOpaque(false); - - if(username != null && password != null) { - if(Core.inDebugMode() || manager.login(username, password, false)) { - currentState = STATE_SERVER_SELECT; - } - } - - if(currentState == STATE_AUTHENTICATION) { - addLoginPanel(); - } else if(currentState == STATE_SERVER_SELECT) { - addServerPanel(); - } - } - - public void addServerPanel() { - JPanel servers = ServerSelector.getInstance(); - add(servers, new GridBagConstraints()); - } - - public void addLoginPanel() { - loginPanel = new JPanel(); - loginPanel.setOpaque(false); - - loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS)); - - Font labelFont = new Font("Times New Roman", Font.PLAIN, 11); - - JLabel usernameLabel = new JLabel("Username"); - usernameLabel.setFont(labelFont); - usernameLabel.setAlignmentX(Box.CENTER_ALIGNMENT); - usernameLabel.setForeground(Color.white); - - final JTextField userInput = new JTextField(25); - final JTextField passInput = new JPasswordField(25); - userInput.addActionListener(new ActionListener() { + private FontMetrics fontMetrics; + private BufferedImage background, banner, loginBox; + private ProgressBar progressBar; + private JPanel loginPanel; - @Override - public void actionPerformed(ActionEvent e) { - passInput.requestFocus(); - } - - }); - userInput.setFont(labelFont); - userInput.setAlignmentX(Box.CENTER_ALIGNMENT); - userInput.setMaximumSize(userInput.getPreferredSize()); - - final JButton login = new JButton("Login"); - - passInput.setAlignmentX(Box.CENTER_ALIGNMENT); - passInput.setMaximumSize(userInput.getPreferredSize()); + public static final AccountManagerAccess MANAGER_FETCHER = new AccountManagerAccess() { + + @Override + public final void setManager(AccountManager manager) { + VerboseLoader.manager = manager; + } + + }; + + private VerboseLoader(String username, String password) { + if (current != null) { + throw new IllegalStateException("MainScreenComponent already made."); + } + current = this; + this.background = Images.getResource("/storage/images/background.png"); + this.banner = Images.getResource("/storage/images/logo.png"); + this.loginBox = Images.getResource("/storage/images/login.png"); + this.progressBar = new ProgressBar(400, 20); + setLayout(new GridBagLayout()); + setSize(775, 510); + setPreferredSize(new Dimension(775, 510)); + setDoubleBuffered(true); + setOpaque(false); + + if (username != null && password != null) { + if (Core.inDebugMode() || manager.login(username, password, false)) { + currentState = STATE_SERVER_SELECT; + } + } + + if (currentState == STATE_AUTHENTICATION) { + addLoginPanel(); + } else if (currentState == STATE_SERVER_SELECT) { + addServerPanel(); + } + } + + public void addServerPanel() { + JPanel servers = ServerSelector.getInstance(); + GridBagLayout bagLayout = (GridBagLayout) getLayout(); + GridBagConstraints c = new GridBagConstraints(); + + c.weightx = 1; + c.weighty = 1; + c.gridx = 0; + c.gridy = 0; + c.anchor = GridBagConstraints.SOUTH; + c.insets = new Insets(0, 0, 25, 0); + + bagLayout.setConstraints(servers, c); + add(servers); + } + + public void addLoginPanel() { + loginPanel = new JPanel(); + loginPanel.setOpaque(false); + + loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS)); + + Font labelFont = Fonts.getResource("leelawadee.ttf"); + + JLabel usernameLabel = new JLabel("Username"); + usernameLabel.setFont(labelFont); + usernameLabel.setAlignmentX(Box.CENTER_ALIGNMENT); + usernameLabel.setForeground(Color.white); + + final JTextField userInput = new JTextField(20); + final JTextField passInput = new JPasswordField(20); + userInput.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + passInput.requestFocus(); + } + + }); + userInput.setFont(labelFont); + userInput.setAlignmentX(Box.CENTER_ALIGNMENT); + userInput.setMaximumSize(userInput.getPreferredSize()); + + final JButton login = new JButton("Login"); + + passInput.setAlignmentX(Box.CENTER_ALIGNMENT); + passInput.setMaximumSize(userInput.getPreferredSize()); passInput.setPreferredSize(new Dimension(userInput.getWidth(), 20)); passInput.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - login.doClick(); - } - + @Override + public void actionPerformed(ActionEvent e) { + login.doClick(); + } + }); - - JLabel passwordLabel = new JLabel("Password"); - passwordLabel.setFont(labelFont); - passwordLabel.setAlignmentX(Box.CENTER_ALIGNMENT); - passwordLabel.setForeground(Color.white); - - - login.setAlignmentX(Box.CENTER_ALIGNMENT); - login.setOpaque(false); - - login.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if(manager.login(userInput.getText(), passInput.getText(), false)) { - switchState(STATE_SERVER_SELECT); - } else { - Core.verbose("Failed to log in."); - UILog.log("Error", "Incorrect username or password. Have you tried logging into http://bdn.parabot.org/account/", JOptionPane.ERROR_MESSAGE); - } - } - - }); - - loginPanel.add(Box.createRigidArea(new Dimension(0, 5))); - loginPanel.add(usernameLabel); - loginPanel.add(Box.createRigidArea(new Dimension(0, 5))); - loginPanel.add(userInput); - loginPanel.add(Box.createRigidArea(new Dimension(0, 5))); - loginPanel.add(passwordLabel); - loginPanel.add(Box.createRigidArea(new Dimension(0, 5))); - loginPanel.add(passInput); - loginPanel.add(Box.createRigidArea(new Dimension(0, 5))); - loginPanel.add(login); - loginPanel.add(Box.createRigidArea(new Dimension(0, 5))); - - add(loginPanel, new GridBagConstraints()); - } + JLabel passwordLabel = new JLabel("Password"); + passwordLabel.setFont(labelFont); + passwordLabel.setAlignmentX(Box.CENTER_ALIGNMENT); + passwordLabel.setForeground(Color.white); - public void switchState(int state) { - removeAll(); - if(state == STATE_AUTHENTICATION) { - addLoginPanel(); - } else if(state == STATE_SERVER_SELECT) { - addServerPanel(); - } - this.currentState = state; - revalidate(); - } - /** - * Paints on this panel - */ - @Override - public void paintComponent(Graphics graphics) { - super.paintComponent(graphics); - - - Graphics2D g = (Graphics2D) graphics; - g.setRenderingHint( - RenderingHints.KEY_TEXT_ANTIALIASING, - RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - - g.drawImage(background, 0, 0, null); - - if (fontMetrics == null) { - fontMetrics = g.getFontMetrics(); - } - - if(currentState == STATE_AUTHENTICATION) { - g.setColor(new Color(74, 74, 72, 100)); - g.fillRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight()); - g.setColor(Color.black); - g.drawRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight()); - } - - g.setColor(Color.white); - - if(currentState == STATE_LOADING) { - progressBar.draw(g, (getWidth() / 2) - 200, 220); - g.setFont(new Font("Times New Roman", Font.PLAIN, 14)); - int x = (getWidth() / 2) - (fontMetrics.stringWidth(state) / 2); - g.drawString(state, x, 200); - } - - - g.setFont(new Font("Times New Roman", Font.PLAIN, 12)); - final String version = "v2.1"; - g.drawString(version, - getWidth() - g.getFontMetrics().stringWidth(version) - 10, - getHeight() - 12); - } + login.setAlignmentX(Box.CENTER_ALIGNMENT); + login.setOpaque(false); - /** - * Gets instance of this panel - * @return instance of this panel - */ - public static VerboseLoader get(String username, String password) { - return current == null ? new VerboseLoader(username, password) : current; - } - - /** - * Gets instance of this panel - * @return instance of this panel - */ - public static VerboseLoader get() { - return current == null ? new VerboseLoader(null, null) : current; - } - + login.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (manager.login(userInput.getText(), passInput.getText(), false)) { + switchState(STATE_SERVER_SELECT); + } else { + Core.verbose("Failed to log in."); + UILog.log("Error", "Incorrect username or password. Have you tried logging into http://bdn.parabot.org/account/", JOptionPane.ERROR_MESSAGE); + } + } - /** - * Updates the status message and repaints the panel - * @param message - */ - public static void setState(final String message) { - state = message; - current.repaint(); - } + }); - @Override - public void onProgressUpdate(double value) { - progressBar.setValue(value); - this.repaint(); - } + loginPanel.add(Box.createRigidArea(new Dimension(0, 8))); + loginPanel.add(usernameLabel); + loginPanel.add(Box.createRigidArea(new Dimension(0, 4))); + loginPanel.add(userInput); + loginPanel.add(Box.createRigidArea(new Dimension(0, 4))); + loginPanel.add(passwordLabel); + loginPanel.add(Box.createRigidArea(new Dimension(0, 4))); + loginPanel.add(passInput); + loginPanel.add(Box.createRigidArea(new Dimension(0, 2))); + loginPanel.add(login); + loginPanel.add(Box.createRigidArea(new Dimension(0, 4))); - @Override - public void updateDownloadSpeed(double mbPerSecond) { - progressBar.setText(String.format("(%.2fMB/s)", mbPerSecond)); - } + add(loginPanel, new GridBagConstraints()); + } -} + public void switchState(int state) { + removeAll(); + if (state == STATE_AUTHENTICATION) { + addLoginPanel(); + } else if (state == STATE_SERVER_SELECT) { + addServerPanel(); + } + this.currentState = state; + revalidate(); + } + + /** + * Paints on this panel + */ + @Override + public void paintComponent(Graphics graphics) { + super.paintComponent(graphics); + + + Graphics2D g = (Graphics2D) graphics; + g.setRenderingHint( + RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + + g.drawImage(background, 0, 0, null); + float[] scales = {1f, 1f, 1f, 0.9f}; + float[] offsets = new float[4]; + RescaleOp rop = new RescaleOp(scales, offsets, null); + g.drawImage(banner, rop, 0, 0); + + g.setStroke(new BasicStroke(5)); + g.setPaint(Color.WHITE); + + g.draw(new Line2D.Float(0, 1, this.getWidth(), 1)); //TOP + g.draw(new Line2D.Float(0, 0, 0, 120)); //LEFT + g.draw(new Line2D.Float(0, 120, this.getWidth(), 120)); //BOTTOM + g.draw(new Line2D.Float(this.getWidth() - 6, 0, this.getWidth() - 6, 120)); //RIGHT + + g.setColor(Color.white); + + g.setFont(Fonts.getResource("leelawadee.ttf", 30)); + g.getFont().deriveFont(Font.BOLD); + g.drawString(Configuration.BOT_TITLE, 20, 50); + + g.setFont(Fonts.getResource("leelawadee.ttf", 15)); + g.getFont().deriveFont(Font.ITALIC); + g.drawString(Configuration.BOT_SLOGAN, 20, 85); + + if (fontMetrics == null) { + fontMetrics = g.getFontMetrics(); + } + + if (currentState == STATE_AUTHENTICATION) { + g.drawImage(loginBox, loginPanel.getX() - 30, loginPanel.getY() - 22, null); + } + + g.setColor(Color.white); + + if (currentState == STATE_LOADING) { + progressBar.draw(g, (getWidth() / 2) - 200, 220); + g.setFont(Fonts.getResource("leelawadee.ttf")); + int x = (getWidth() / 2) - (fontMetrics.stringWidth(state) / 2); + g.drawString(state, x, 200); + } + + + g.setFont(Fonts.getResource("leelawadee.ttf")); + final String version = Configuration.BOT_VERSION.get(); + g.drawString(version, + getWidth() - g.getFontMetrics().stringWidth(version) - 10, + getHeight() - 12); + } + + /** + * Gets instance of this panel + * + * @return instance of this panel + */ + public static VerboseLoader get(String username, String password) { + return current == null ? new VerboseLoader(username, password) : current; + } + + /** + * Gets instance of this panel + * + * @return instance of this panel + */ + public static VerboseLoader get() { + return current == null ? new VerboseLoader(null, null) : current; + } + + + /** + * Updates the status message and repaints the panel + * + * @param message + */ + public static void setState(final String message) { + state = message; + current.repaint(); + } + + @Override + public void onProgressUpdate(double value) { + progressBar.setValue(value); + this.repaint(); + } + + @Override + public void updateDownloadSpeed(double mbPerSecond) { + progressBar.setText(String.format("(%.2fMB/s)", mbPerSecond)); + } +} \ No newline at end of file diff --git a/src/main/java/org/parabot/core/ui/fonts/Fonts.java b/src/main/java/org/parabot/core/ui/fonts/Fonts.java new file mode 100644 index 0000000..378c654 --- /dev/null +++ b/src/main/java/org/parabot/core/ui/fonts/Fonts.java @@ -0,0 +1,38 @@ +package org.parabot.core.ui.fonts; + +import java.awt.*; +import java.util.ArrayList; + +/** + * @author Capslock + */ +public class Fonts { + private static final java.util.List FONT_CACHE = new ArrayList<>(); + + /** + * Calls the getResource with the default size of 12 + * + * @param resource + * @return + */ + public static Font getResource(final String resource) { + return getResource(resource, 12f); + } + + public static Font getResource(final String fileName, float size) { + ParabotFont parabotFont = null; + + for (ParabotFont font : FONT_CACHE) { + if (font.getLocation().equalsIgnoreCase(fileName) && font.getSize() == size) { + parabotFont = font; + } + } + + if (parabotFont == null) { + parabotFont = new ParabotFont(fileName, size); + FONT_CACHE.add(parabotFont); + } + + return parabotFont.getFont(); + } +} diff --git a/src/main/java/org/parabot/core/ui/fonts/ParabotFont.java b/src/main/java/org/parabot/core/ui/fonts/ParabotFont.java new file mode 100644 index 0000000..ebd3d5d --- /dev/null +++ b/src/main/java/org/parabot/core/ui/fonts/ParabotFont.java @@ -0,0 +1,55 @@ +package org.parabot.core.ui.fonts; + +import java.awt.*; +import java.io.IOException; + +/** + * @author Capslock + */ +public class ParabotFont { + + private String location; + private Font font; + + public ParabotFont(String location, float size) { + if (!location.toLowerCase().startsWith("/storage/fonts/")) { + location = "/storage/fonts/" + location; + } + this.location = location; + + try { + this.font = createFont(size); + } catch (FontFormatException | IOException e) { + e.printStackTrace(); + } + } + + private Font createFont(float size) throws IOException, FontFormatException { + return Font.createFont(Font.TRUETYPE_FONT, Fonts.class.getResourceAsStream(this.location)).deriveFont(size); + } + + public float getSize() { + return font.getSize(); + } + + public String getLocation() { + return location; + } + + public Font getFont() { + return font; + } + + @Override + public boolean equals(Object obj) { + if (obj != null) { + if (obj instanceof ParabotFont) { + ParabotFont otherFont = (ParabotFont) obj; + if (otherFont.getSize() == this.getSize()) { + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/org/parabot/core/ui/images/trash.png b/src/main/java/org/parabot/core/ui/images/trash.png new file mode 100644 index 0000000..53867b6 Binary files /dev/null and b/src/main/java/org/parabot/core/ui/images/trash.png differ diff --git a/src/main/resources/storage/app.properties b/src/main/resources/storage/app.properties old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/fonts/leelawadee.ttf b/src/main/resources/storage/fonts/leelawadee.ttf new file mode 100644 index 0000000..8d5e4b5 Binary files /dev/null and b/src/main/resources/storage/fonts/leelawadee.ttf differ diff --git a/src/main/resources/storage/images/add.png b/src/main/resources/storage/images/add.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/background.png b/src/main/resources/storage/images/background.png index fd302e3..34f1df9 100644 Binary files a/src/main/resources/storage/images/background.png and b/src/main/resources/storage/images/background.png differ diff --git a/src/main/resources/storage/images/category/agility.png b/src/main/resources/storage/images/category/agility.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/combat.png b/src/main/resources/storage/images/category/combat.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/cooking.png b/src/main/resources/storage/images/category/cooking.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/crafting.png b/src/main/resources/storage/images/category/crafting.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/dungeoneering.png b/src/main/resources/storage/images/category/dungeoneering.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/farming.png b/src/main/resources/storage/images/category/farming.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/firemaking.png b/src/main/resources/storage/images/category/firemaking.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/fishing.png b/src/main/resources/storage/images/category/fishing.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/fletching.png b/src/main/resources/storage/images/category/fletching.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/herblore.png b/src/main/resources/storage/images/category/herblore.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/hunter.png b/src/main/resources/storage/images/category/hunter.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/magic.png b/src/main/resources/storage/images/category/magic.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/minigames.png b/src/main/resources/storage/images/category/minigames.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/mining.png b/src/main/resources/storage/images/category/mining.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/moneymaking.png b/src/main/resources/storage/images/category/moneymaking.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/other.png b/src/main/resources/storage/images/category/other.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/prayer.png b/src/main/resources/storage/images/category/prayer.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/runecrafting.png b/src/main/resources/storage/images/category/runecrafting.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/script.png b/src/main/resources/storage/images/category/script.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/slayer.png b/src/main/resources/storage/images/category/slayer.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/smithing.png b/src/main/resources/storage/images/category/smithing.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/thieving.png b/src/main/resources/storage/images/category/thieving.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/utility.png b/src/main/resources/storage/images/category/utility.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/category/woodcutting.png b/src/main/resources/storage/images/category/woodcutting.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/close.png b/src/main/resources/storage/images/close.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/close_red.png b/src/main/resources/storage/images/close_red.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/icon.png b/src/main/resources/storage/images/icon.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/login.png b/src/main/resources/storage/images/login.png new file mode 100644 index 0000000..ef5014e Binary files /dev/null and b/src/main/resources/storage/images/login.png differ diff --git a/src/main/resources/storage/images/logo.png b/src/main/resources/storage/images/logo.png new file mode 100644 index 0000000..fe40317 Binary files /dev/null and b/src/main/resources/storage/images/logo.png differ diff --git a/src/main/resources/storage/images/para.png b/src/main/resources/storage/images/para.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/pause.png b/src/main/resources/storage/images/pause.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/run.png b/src/main/resources/storage/images/run.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/stop.png b/src/main/resources/storage/images/stop.png old mode 100644 new mode 100755 diff --git a/src/main/resources/storage/images/trash.png b/src/main/resources/storage/images/trash.png new file mode 100644 index 0000000..53867b6 Binary files /dev/null and b/src/main/resources/storage/images/trash.png differ