package ca.canucksoftware.themebuilder; import javax.swing.JColorChooser; import java.awt.Color; import java.io.File; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStream; import java.io.OutputStream; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.util.LinkedList; /** * * @author Jason Robitaille */ public class PatchData { public final String CARRIER_PATCH = "resources/custom-carrier-string.patch"; public final String TEXTCOLOUR_PATCH = "resources/change-top-bar-text-colour.patch"; public final String OPACITY_PATCH = "resources/launcher-opacity.patch"; public String carrierString; public Color textColour; public int opacity; public PatchData() { carrierString = null; textColour = Color.WHITE; opacity = 100; } public boolean parsePatch(File f, String patch) { String s = null; boolean result = false; if(patch.equalsIgnoreCase(CARRIER_PATCH)) { s = findReturn(f, "this.carrierText = \""); if(s!=null) { carrierString = s.substring(s.indexOf("\"")+1, s.lastIndexOf("\"")); result = true; } } else if(patch.equalsIgnoreCase(TEXTCOLOUR_PATCH)) { s = findReturn(f, "color:"); if(s!=null) { s = s.substring(s.indexOf(":")+1, s.indexOf(";")).trim(); textColour = Color.decode(s); result = true; } } else if(patch.equalsIgnoreCase(OPACITY_PATCH)) { s = findReturn(f, "opacity:"); if(s!=null) { s = s.substring(s.indexOf(":")+1, s.indexOf(";")).trim(); opacity = (int)(Double.parseDouble(s)*100); result = true; } } return result; } public void setColour() { Color c = JColorChooser.showDialog(null, "Select A Colour", Color.WHITE); if(c!=null) { textColour = c; } } public LinkedList<String> list() { LinkedList<String> files = new LinkedList<String>(); if(carrierString!=null) { if(carrierString.length()>0) { files.add(CARRIER_PATCH.substring(CARRIER_PATCH.lastIndexOf("/")+1)); } } if(textColour!=null) { if(textColour!=Color.WHITE) { files.add(TEXTCOLOUR_PATCH.substring(TEXTCOLOUR_PATCH.lastIndexOf("/")+1)); } } if(opacity!=100) { files.add(OPACITY_PATCH.substring(OPACITY_PATCH.lastIndexOf("/")+1)); } return files; } public void removePatch(String patch) { if(patch.equalsIgnoreCase(CARRIER_PATCH.substring(CARRIER_PATCH.lastIndexOf("/")+1))) { carrierString = null; } else if(patch.equalsIgnoreCase(TEXTCOLOUR_PATCH.substring(TEXTCOLOUR_PATCH.lastIndexOf("/")+1))) { textColour = Color.WHITE; } else if(patch.equalsIgnoreCase(OPACITY_PATCH.substring(OPACITY_PATCH.lastIndexOf("/")+1))) { opacity = 100; } } public LinkedList<File> getPatches() { LinkedList<File> patches = new LinkedList<File>(); if(carrierString!=null) { if(carrierString.length()>0) { patches.add(findReplace(extractFromJar(CARRIER_PATCH), "/*Edit Here*/", "+\t\t\tthis.carrierText = \"" + carrierString + "\";\n")); } } if(textColour!=null) { if(textColour!=Color.WHITE) { String colHex = getHexVal(); patches.add(findReplace(extractFromJar(TEXTCOLOUR_PATCH), "/*Edit Here*/", "+\t\tcolor: " + colHex + ";\n")); } } if(opacity!=100) { String opacVal = (((double)opacity)/100) + ""; patches.add(findReplace(extractFromJar(OPACITY_PATCH), "/*Edit Here*/", "+\topacity: " + opacVal + ";\n")); } return patches; } public String getHexVal() { return "#" + Integer.toHexString((textColour.getRGB() & 0xffffff) | 0x1000000).substring(1).toUpperCase(); } private File extractFromJar(String filename) { try { String tmpFilePath = System.getProperty("java.io.tmpdir"); File efile = new File(tmpFilePath, filename.substring(filename.lastIndexOf("/")+1)); if(efile.exists()) efile.delete(); InputStream in = new BufferedInputStream(super.getClass().getResourceAsStream(filename)); OutputStream out = new BufferedOutputStream(new FileOutputStream(efile)); byte[] buffer = new byte[2048]; for (;;) { int nBytes = in.read(buffer); if (nBytes <= 0) break; out.write(buffer, 0, nBytes); } out.flush(); out.close(); in.close(); return efile; } catch (Exception e) { return null; } } private File findReplace(File f, String find, String replace) { File result = null; String tmpFilePath = System.getProperty("java.io.tmpdir"); try { result = new File(tmpFilePath, "output"); BufferedReader br = new BufferedReader(new FileReader(f)); BufferedWriter bw = new BufferedWriter(new FileWriter(result)); String line = br.readLine(); while(line!=null) { line += "\n"; if(line.contains(find)) { line = replace; } bw.write(line); line = br.readLine(); } bw.flush(); bw.close(); br.close(); f.delete(); result.renameTo(f); result = f; } catch(Exception e) { result = null; } return result; } private String findReturn(File f, String find) { String result = null; try { BufferedReader br = new BufferedReader(new FileReader(f)); String line = br.readLine(); while(line!=null) { line += "\n"; if(line.contains(find)) { result = line; } line = br.readLine(); } br.close(); } catch(Exception e) { result = null; } return result; } }