X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fresources%2FBundle.java;h=92b02eb43e75cc59eec8cb5a6c3bf80c20c7f300;hb=e8aa5bf9227a0d6a6d0bb6a8bc0cc04d0f4d601a;hp=40177da6cbfc23050e4e266d65253fde52060f27;hpb=cd0c27d2e457ea19fcd9def879e1534a528292c2;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/resources/Bundle.java b/src/be/nikiroo/utils/resources/Bundle.java index 40177da..92b02eb 100644 --- a/src/be/nikiroo/utils/resources/Bundle.java +++ b/src/be/nikiroo/utils/resources/Bundle.java @@ -1,6 +1,5 @@ package be.nikiroo.utils.resources; -import java.awt.Color; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; @@ -259,85 +258,133 @@ public class Bundle> { * @return the associated value */ public char getCharacter(E id, char def) { - String s = getString(id).trim(); - if (s.length() > 0) { - return s.charAt(0); + String s = getString(id); + if (s != null && s.length() > 0) { + return s.trim().charAt(0); } return def; } /** - * Return the value associated to the given id as a {@link Color}. + * Return the value associated to the given id as a colour if it is found + * and can be parsed. + *

+ * The returned value is an ARGB value. * * @param id * the id of the value to get * * @return the associated value */ - public Color getColor(E id) { - Color color = null; + public Integer getColor(E id) { + Integer rep = null; String bg = getString(id).trim(); + + int r = 0, g = 0, b = 0, a = -1; if (bg.startsWith("#") && (bg.length() == 7 || bg.length() == 9)) { try { - int r = Integer.parseInt(bg.substring(1, 3), 16); - int g = Integer.parseInt(bg.substring(3, 5), 16); - int b = Integer.parseInt(bg.substring(5, 7), 16); - int a = 255; + r = Integer.parseInt(bg.substring(1, 3), 16); + g = Integer.parseInt(bg.substring(3, 5), 16); + b = Integer.parseInt(bg.substring(5, 7), 16); if (bg.length() == 9) { a = Integer.parseInt(bg.substring(7, 9), 16); + } else { + a = 255; } - color = new Color(r, g, b, a); + } catch (NumberFormatException e) { - color = null; // no changes + // no changes } } // Try by name if still not found - if (color == null) { - try { - Field field = Color.class.getField(bg); - color = (Color) field.get(null); - } catch (Exception e) { + if (a == -1) { + if ("black".equalsIgnoreCase(bg)) { + a = 255; + r = 0; + g = 0; + b = 0; + } else if ("white".equalsIgnoreCase(bg)) { + a = 255; + r = 255; + g = 255; + b = 255; + } else if ("red".equalsIgnoreCase(bg)) { + a = 255; + r = 255; + g = 0; + b = 0; + } else if ("green".equalsIgnoreCase(bg)) { + a = 255; + r = 0; + g = 255; + b = 0; + } else if ("blue".equalsIgnoreCase(bg)) { + a = 255; + r = 0; + g = 0; + b = 255; + } else if ("grey".equalsIgnoreCase(bg) + || "gray".equalsIgnoreCase(bg)) { + a = 255; + r = 128; + g = 128; + b = 128; + } else if ("cyan".equalsIgnoreCase(bg)) { + a = 255; + r = 0; + g = 255; + b = 255; + } else if ("magenta".equalsIgnoreCase(bg)) { + a = 255; + r = 255; + g = 0; + b = 255; + } else if ("yellow".equalsIgnoreCase(bg)) { + a = 255; + r = 255; + g = 255; + b = 0; } } - // - return color; + if (a != -1) { + rep = ((a & 0xFF) << 24) // + | ((r & 0xFF) << 16) // + | ((g & 0xFF) << 8) // + | ((b & 0xFF) << 0); + } + + return rep; } /** - * Set the value associated to the given id as a {@link Color}. + * Set the value associated to the given id as a colour. + *

+ * The value is an BGRA value. * * @param id * the id of the value to set * @param color - * the new color - */ - public void setColor(E id, Color color) { - // Check for named colours first - try { - Field[] fields = Color.class.getFields(); - for (Field field : fields) { - if (field.equals(color)) { - setString(id, field.getName()); - return; - } - } - } catch (Exception e) { - } - // - - String r = Integer.toString(color.getRed(), 16); - String g = Integer.toString(color.getGreen(), 16); - String b = Integer.toString(color.getBlue(), 16); - String a = ""; - if (color.getAlpha() < 255) { - a = Integer.toString(color.getAlpha(), 16); + * the new colour + */ + public void setColor(E id, Integer color) { + int a = (color >> 24) & 0xFF; + int r = (color >> 16) & 0xFF; + int g = (color >> 8) & 0xFF; + int b = (color >> 0) & 0xFF; + + String rs = Integer.toString(r, 16); + String gs = Integer.toString(g, 16); + String bs = Integer.toString(b, 16); + String as = ""; + if (a < 255) { + as = Integer.toString(a, 16); } - setString(id, "#" + r + g + b + a); + setString(id, "#" + rs + gs + bs + as); } /** @@ -399,6 +446,40 @@ public class Bundle> { writer.close(); } + /** + * Delete the .properties file. + *

+ * Will use the most likely candidate as base if the file does not already + * exists and this resource is translatable (for instance, "en_US" will use + * "en" as a base if the resource is a translation file). + *

+ * Will delete the files in {@link Bundles#getDirectory()}; it MUST + * be set. + * + * @return TRUE if the file was deleted + */ + public boolean deleteFile() { + return deleteFile(Bundles.getDirectory()); + } + + /** + * Delete the .properties file. + *

+ * Will use the most likely candidate as base if the file does not already + * exists and this resource is translatable (for instance, "en_US" will use + * "en" as a base if the resource is a translation file). + * + * @param path + * the path where the .properties files are, MUST NOT be + * NULL + * + * @return TRUE if the file was deleted + */ + public boolean deleteFile(String path) { + File file = getUpdateFile(path); + return file.delete(); + } + /** * The description {@link TransBundle}, that is, a {@link TransBundle} * dedicated to the description of the values of the given {@link Bundle} @@ -483,12 +564,13 @@ public class Bundle> { Meta.Format format = meta.format(); String[] list = meta.list(); boolean nullable = meta.nullable(); + String def = meta.def(); String info = meta.info(); boolean array = meta.array(); // Default, empty values -> NULL - if (desc.length() + list.length + info.length() == 0 && !group - && nullable && format == Meta.Format.STRING) { + if (desc.length() + list.length + info.length() + def.length() == 0 + && !group && nullable && format == Meta.Format.STRING) { return null; } @@ -620,9 +702,11 @@ public class Bundle> { protected void setBundle(Enum name, Locale locale, boolean resetToDefault) { changeMap.clear(); String dir = Bundles.getDirectory(); + String bname = type.getPackage().getName() + "." + name.name(); boolean found = false; if (!resetToDefault && dir != null) { + // Look into Bundles.getDirectory() for .properties files try { File file = getPropertyFile(dir, name.name(), locale); if (file != null) { @@ -637,37 +721,50 @@ public class Bundle> { } if (!found) { - String bname = type.getPackage().getName() + "." + name.name(); + // Look into the package itself for resources try { resetMap(ResourceBundle .getBundle(bname, locale, type.getClassLoader(), new FixedResourceBundleControl())); + found = true; + } catch (MissingResourceException e) { } catch (Exception e) { - // We have no bundle for this Bundle - System.err.println("No bundle found for: " + bname); - resetMap(null); + e.printStackTrace(); } } + + if (!found) { + // We have no bundle for this Bundle + System.err.println("No bundle found for: " + bname); + resetMap(null); + } } /** - * Reset the backing map to the content of the given bundle, or empty if - * bundle is NULL. + * Reset the backing map to the content of the given bundle, or with default + * valiues if bundle is NULL. * * @param bundle * the bundle to copy */ protected void resetMap(ResourceBundle bundle) { this.map.clear(); - - if (bundle != null) { - for (E field : type.getEnumConstants()) { - try { - String value = bundle.getString(field.name()); - this.map.put(field.name(), - value == null ? null : value.trim()); - } catch (MissingResourceException e) { + for (Field field : type.getDeclaredFields()) { + try { + Meta meta = field.getAnnotation(Meta.class); + if (meta != null) { + E id = Enum.valueOf(type, field.getName()); + + String value; + if (bundle != null) { + value = bundle.getString(id.name()); + } else { + value = meta.def(); + } + + this.map.put(id.name(), value == null ? null : value.trim()); } + } catch (MissingResourceException e) { } } } @@ -698,7 +795,7 @@ public class Bundle> { if (snap instanceof Map) { changeMap = (Map) snap; } else { - throw new Error( + throw new RuntimeException( "Restoring changes in a Bundle must be done on a changes snapshot, " + "or NULL to discard current changes"); } @@ -740,7 +837,7 @@ public class Bundle> { if (file.exists()) { break; } - + file = null; }