diff --git a/src/main/java/de/idrinth/waraddonclient/gui/Window.java b/src/main/java/de/idrinth/waraddonclient/gui/Window.java index 7ae4697..08401c3 100644 --- a/src/main/java/de/idrinth/waraddonclient/gui/Window.java +++ b/src/main/java/de/idrinth/waraddonclient/gui/Window.java @@ -5,6 +5,7 @@ import de.idrinth.waraddonclient.service.Backup; import de.idrinth.waraddonclient.model.addon.Addon; import de.idrinth.waraddonclient.model.GuiAddonList; +import de.idrinth.waraddonclient.model.addon.ActualAddon; import de.idrinth.waraddonclient.model.addon.NoAddon; import java.io.IOException; import java.net.URISyntaxException; @@ -796,6 +797,9 @@ public void valueChanged(ListSelectionEvent event) { */ public void updateUi() { description.setText(activeAddon.getDescription(config.getLanguage())); + if (ActualAddon.class.isInstance(activeAddon)) { + new Thread(((ActualAddon) activeAddon).loadDescription(description, config.getLanguage())).start(); + } addonTitle.setText(activeAddon.getName()); installButton.setEnabled(true); removeButton.setEnabled(true); diff --git a/src/main/java/de/idrinth/waraddonclient/model/addon/ActualAddon.java b/src/main/java/de/idrinth/waraddonclient/model/addon/ActualAddon.java index cc37601..ca668d1 100644 --- a/src/main/java/de/idrinth/waraddonclient/model/addon/ActualAddon.java +++ b/src/main/java/de/idrinth/waraddonclient/model/addon/ActualAddon.java @@ -16,9 +16,11 @@ import java.util.Objects; import javax.json.JsonArray; import javax.json.JsonObject; +import javax.swing.JEditorPane; import javax.xml.parsers.FactoryConfigurationError; import net.lingala.zip4j.ZipFile; import org.apache.commons.io.FileUtils; +import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; @@ -55,6 +57,8 @@ public class ActualAddon implements de.idrinth.waraddonclient.model.addon.Addon private final XmlParser parser; private final Config config; + + private String defaultDescription = ""; public ActualAddon(javax.json.JsonObject addon, Request client, BaseLogger logger, XmlParser parser, Config config) throws InvalidArgumentException { if (addon == null) { @@ -168,24 +172,7 @@ public Object[] getTableRow() { return row; } - /** - * return a languages description if avaible, otherwise a default - * - * @param language - * @return String - */ public String getDescription(String language) { - if (descriptions.isEmpty()) { - try { - JsonObject addon = client.getAddon(slug); - descriptions.put("en", getStringFromObject("description", addon)); - descriptions.put("de", getStringFromObject("description_de", addon)); - descriptions.put("fr", getStringFromObject("description_fr", addon)); - } catch (IOException ex) { - logger.error("Failed loading addon-data from server."); - } - } - String defaultDescription = ""; String description = "<p><strong>There is currently no Description for " + name + ".</strong></p>" + "<p>You can help by adding one at <a href=\"http://tools.idrinth.de/addons/" + slug + "/\">http://tools.idrinth.de/addons/" + slug + "/</a>.</p>" @@ -195,7 +182,24 @@ public String getDescription(String language) { } else if (descriptions.get("en") != null && !descriptions.get("en").isEmpty()) { description = descriptions.get("en"); } - return "<html>" + description; + return "<html>" + description.replaceAll("(\\\\n|\\\\r)+", " ").replaceAll("\\\\\"", "\""); + } + + public Runnable loadDescription(JEditorPane field, String language) { + if (!descriptions.isEmpty()) { + return () -> {}; + } + return () -> { + try { + JsonObject addon = client.getAddon(slug); + descriptions.put("en", getStringFromObject("description", addon)); + descriptions.put("de", getStringFromObject("description_de", addon)); + descriptions.put("fr", getStringFromObject("description_fr", addon)); + field.setText(getDescription(language)); + } catch (IOException ex) { + logger.error("Failed loading addon-data from server."); + } + }; } /** @@ -355,8 +359,13 @@ private boolean processDirectory() { if (!fileEntry.isDirectory() && org.apache.commons.io.FilenameUtils.getExtension(fileEntry.getName()).equalsIgnoreCase("mod")) { try { - NodeList list = parser.parse(fileEntry).getElementsByTagName("UiMod"); + Document doc = parser.parse(fileEntry); + NodeList list = doc.getElementsByTagName("UiMod"); installed = list.item(0).getAttributes().getNamedItem("version").getTextContent(); + NodeList description = doc.getElementsByTagName("Description"); + if (description.getLength() > 0) { + defaultDescription = description.item(0).getAttributes().getNamedItem("text").getTextContent(); + } return true; } catch (FactoryConfigurationError | SAXException | IOException exception) { logger.error(exception);