From eb376b8eb37c742b70f088d7268933c91d5ec7ea Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 00:55:29 -0600 Subject: [PATCH 01/10] pull all still needed `WordUtils.wrap` calls into one method --- .../forge/screens/home/quest/VSubmenuQuestData.java | 11 ++++++----- .../src/forge/screens/quest/NewQuestScreen.java | 13 +------------ 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 65454ac06ce..b283bd01459 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -17,7 +17,6 @@ import forge.screens.home.EMenuGroup; import forge.screens.home.IVSubmenu; import forge.screens.home.VHomeUI; import forge.toolbox.*; -import forge.util.storage.IStorage; import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.text.WordUtils; @@ -243,17 +242,15 @@ public enum VSubmenuQuestData implements IVSubmenu { cboAllowUnlocks.setSelected(true); final Map preconDescriptions = new HashMap<>(); - final IStorage preconDecks = QuestController.getPrecons(); - for (final PreconDeck preconDeck : preconDecks) { + for (final PreconDeck preconDeck : QuestController.getPrecons()) { if (QuestController.getPreconDeals(preconDeck).getMinWins() > 0) { continue; } final String name = preconDeck.getName(); cbxPreconDeck.addItem(name); String description = preconDeck.getDescription(); - description = "" + WordUtils.wrap(description, 40, "
", false) + ""; - preconDescriptions.put(name, description); + preconDescriptions.put(name, wordWrapAsHTML(description)); } // The cbx needs strictly typed renderer @@ -363,6 +360,10 @@ public enum VSubmenuQuestData implements IVSubmenu { pnlOptions.add(btnEmbark, "w 300px!, h 30px!, ax center, span 2, gap 0 0 15px 30px"); } + private static String wordWrapAsHTML(String str) { + return "" + WordUtils.wrap(str, 40, "
", false, " ") + ""; + } + /* (non-Javadoc) * @see forge.view.home.IViewSubmenu#populate() */ diff --git a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java index fa5d33c5ba1..eecf8fc8ed4 100644 --- a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java @@ -47,15 +47,10 @@ import forge.util.FileUtil; import forge.util.ThreadUtil; import forge.util.Utils; import forge.util.gui.SOptionPane; -import forge.util.storage.IStorage; - -import org.apache.commons.lang3.text.WordUtils; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -282,18 +277,12 @@ public class NewQuestScreen extends FScreen { cbAllowUnlocks.setSelected(true); - final Map preconDescriptions = new HashMap<>(); - IStorage preconDecks = QuestController.getPrecons(); - - for (PreconDeck preconDeck : preconDecks) { + for (PreconDeck preconDeck : QuestController.getPrecons()) { if (QuestController.getPreconDeals(preconDeck).getMinWins() > 0) { continue; } String name = preconDeck.getName(); cbxPreconDeck.addItem(name); - String description = preconDeck.getDescription(); - description = "" + WordUtils.wrap(description, 40, "
", false) + ""; - preconDescriptions.put(name, description); } // disable the very powerful sets -- they can be unlocked later for a high price From bc859b3e52b0e768e26571e379fa7acfd4319aa4 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 00:56:12 -0600 Subject: [PATCH 02/10] inline `wrap` --- .../screens/home/quest/VSubmenuQuestData.java | 79 ++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index b283bd01459..2587fd428d0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -19,7 +19,7 @@ import forge.screens.home.VHomeUI; import forge.toolbox.*; import forge.util.Localizer; import net.miginfocom.swing.MigLayout; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.lang3.StringUtils; import javax.swing.*; import javax.swing.plaf.basic.BasicComboBoxRenderer; @@ -28,6 +28,8 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Assembles Swing components of quest data submenu singleton. @@ -361,7 +363,80 @@ public enum VSubmenuQuestData implements IVSubmenu { } private static String wordWrapAsHTML(String str) { - return "" + WordUtils.wrap(str, 40, "
", false, " ") + ""; + String result = null; + int wrapLength = 40; + String newLineStr = "
"; + String wrapOn = " "; + if (str != null) { + if (newLineStr == null) { + newLineStr = System.lineSeparator(); + } + if (wrapLength < 1) { + wrapLength = 1; + } + if (StringUtils.isBlank(wrapOn)) { + wrapOn = " "; + } + final Pattern patternToWrapOn = Pattern.compile(wrapOn); + final int inputLineLength = str.length(); + int offset = 0; + final StringBuilder wrappedLine = new StringBuilder(inputLineLength + 32); + while (offset < inputLineLength) { + int spaceToWrapAt = -1; + Matcher matcher = patternToWrapOn.matcher(str.substring(offset, Math.min(offset + wrapLength + 1, inputLineLength))); + if (matcher.find()) { + if (matcher.start() == 0) { + offset += matcher.end(); + continue; + } + spaceToWrapAt = matcher.start() + offset; + } + + // only last line without leading spaces is left + if (inputLineLength - offset <= wrapLength) { + break; + } + + while (matcher.find()) { + spaceToWrapAt = matcher.start() + offset; + } + + if (spaceToWrapAt >= offset) { + // normal case + wrappedLine.append(str, offset, spaceToWrapAt); + wrappedLine.append(newLineStr); + offset = spaceToWrapAt + 1; + + } else { + // really long word or URL + if (false) { + // wrap really long word one line at a time + wrappedLine.append(str, offset, wrapLength + offset); + wrappedLine.append(newLineStr); + offset += wrapLength; + } else { + // do not wrap really long word, just extend beyond limit + matcher = patternToWrapOn.matcher(str.substring(offset + wrapLength)); + if (matcher.find()) { + spaceToWrapAt = matcher.start() + offset + wrapLength; + } + + if (spaceToWrapAt >= 0) { + wrappedLine.append(str, offset, spaceToWrapAt); + wrappedLine.append(newLineStr); + offset = spaceToWrapAt + 1; + } else { + wrappedLine.append(str, offset, str.length()); + offset = inputLineLength; + } + } + } + }// Whatever is left in line is short enough to just pass through + wrappedLine.append(str, offset, str.length()); + result = wrappedLine.toString(); + } + + return "" + result + ""; } /* (non-Javadoc) From 70986149ef4bc31dbb40eeaf5021ce3583ecd544 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 01:05:42 -0600 Subject: [PATCH 03/10] do less stuff since we know what the arguments will be. --- .../screens/home/quest/VSubmenuQuestData.java | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 2587fd428d0..ff95b6cb0d0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -19,7 +19,6 @@ import forge.screens.home.VHomeUI; import forge.toolbox.*; import forge.util.Localizer; import net.miginfocom.swing.MigLayout; -import org.apache.commons.lang3.StringUtils; import javax.swing.*; import javax.swing.plaf.basic.BasicComboBoxRenderer; @@ -362,22 +361,12 @@ public enum VSubmenuQuestData implements IVSubmenu { pnlOptions.add(btnEmbark, "w 300px!, h 30px!, ax center, span 2, gap 0 0 15px 30px"); } + final static Pattern patternToWrapOn = Pattern.compile(" "); private static String wordWrapAsHTML(String str) { String result = null; int wrapLength = 40; String newLineStr = "
"; - String wrapOn = " "; if (str != null) { - if (newLineStr == null) { - newLineStr = System.lineSeparator(); - } - if (wrapLength < 1) { - wrapLength = 1; - } - if (StringUtils.isBlank(wrapOn)) { - wrapOn = " "; - } - final Pattern patternToWrapOn = Pattern.compile(wrapOn); final int inputLineLength = str.length(); int offset = 0; final StringBuilder wrappedLine = new StringBuilder(inputLineLength + 32); @@ -408,27 +397,19 @@ public enum VSubmenuQuestData implements IVSubmenu { offset = spaceToWrapAt + 1; } else { - // really long word or URL - if (false) { - // wrap really long word one line at a time - wrappedLine.append(str, offset, wrapLength + offset); - wrappedLine.append(newLineStr); - offset += wrapLength; - } else { - // do not wrap really long word, just extend beyond limit - matcher = patternToWrapOn.matcher(str.substring(offset + wrapLength)); - if (matcher.find()) { - spaceToWrapAt = matcher.start() + offset + wrapLength; - } + // do not wrap really long word, just extend beyond limit + matcher = patternToWrapOn.matcher(str.substring(offset + wrapLength)); + if (matcher.find()) { + spaceToWrapAt = matcher.start() + offset + wrapLength; + } - if (spaceToWrapAt >= 0) { - wrappedLine.append(str, offset, spaceToWrapAt); - wrappedLine.append(newLineStr); - offset = spaceToWrapAt + 1; - } else { - wrappedLine.append(str, offset, str.length()); - offset = inputLineLength; - } + if (spaceToWrapAt >= 0) { + wrappedLine.append(str, offset, spaceToWrapAt); + wrappedLine.append(newLineStr); + offset = spaceToWrapAt + 1; + } else { + wrappedLine.append(str, offset, str.length()); + offset = inputLineLength; } } }// Whatever is left in line is short enough to just pass through From 6808be7a42ebccdd99e5c197d5ca7fe92d633899 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 01:33:52 -0600 Subject: [PATCH 04/10] route all `capitalize` calls through a new method --- .../src/main/java/forge/toolbox/FSkin.java | 4 ++-- .../src/main/java/forge/view/SimulateMatch.java | 4 ++-- forge-gui-mobile/src/forge/assets/FSkin.java | 4 ++-- forge-gui/src/main/java/forge/util/WordUtil.java | 11 +++++++++++ 4 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 forge-gui/src/main/java/forge/util/WordUtil.java diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java b/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java index f7e658da7ae..722c862906b 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/FSkin.java @@ -28,8 +28,8 @@ import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.util.OperatingSystem; +import forge.util.WordUtil; import forge.view.FView; -import org.apache.commons.lang3.text.WordUtils; import javax.imageio.ImageIO; import javax.swing.*; @@ -1084,7 +1084,7 @@ public class FSkin { allSkins = new ArrayList<>(); final List skinDirectoryNames = getSkinDirectoryNames(); for (String skinDirectoryName : skinDirectoryNames) { - allSkins.add(WordUtils.capitalize(skinDirectoryName.replace('_', ' '))); + allSkins.add(WordUtil.capitalize(skinDirectoryName.replace('_', ' '))); } Collections.sort(allSkins); } diff --git a/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java b/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java index c5b9f0fad36..a680839fcb4 100644 --- a/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java +++ b/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java @@ -12,8 +12,8 @@ import forge.game.*; import forge.properties.ForgeConstants; import forge.tournament.system.*; import forge.util.TextUtil; +import forge.util.WordUtil; import forge.util.storage.IStorage; -import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.time.StopWatch; import forge.deck.Deck; @@ -75,7 +75,7 @@ public class SimulateMatch { GameType type = GameType.Constructed; if (params.containsKey("f")) { - type = GameType.valueOf(WordUtils.capitalize(params.get("f").get(0))); + type = GameType.valueOf(WordUtil.capitalize(params.get("f").get(0))); } GameRules rules = new GameRules(type); diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index 9ed94ee43c3..c783993411b 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang3.text.WordUtils; +import forge.util.WordUtil; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; @@ -101,7 +101,7 @@ public class FSkin { allSkins = new ArrayList<>(); final List skinDirectoryNames = getSkinDirectoryNames(); for (final String skinDirectoryName : skinDirectoryNames) { - allSkins.add(WordUtils.capitalize(skinDirectoryName.replace('_', ' '))); + allSkins.add(WordUtil.capitalize(skinDirectoryName.replace('_', ' '))); } Collections.sort(allSkins); } diff --git a/forge-gui/src/main/java/forge/util/WordUtil.java b/forge-gui/src/main/java/forge/util/WordUtil.java new file mode 100644 index 00000000000..4022c50acea --- /dev/null +++ b/forge-gui/src/main/java/forge/util/WordUtil.java @@ -0,0 +1,11 @@ +package forge.util; + +import org.apache.commons.lang3.text.WordUtils; + +public class WordUtil { + public static String capitalize(String str) { + return WordUtils.capitalize(str); + } + + private WordUtil() {} +} From 4969547938df0fbc426c60e90438f53016ef61de Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 01:36:37 -0600 Subject: [PATCH 05/10] inline `capitalize` --- .../src/main/java/forge/util/WordUtil.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/util/WordUtil.java b/forge-gui/src/main/java/forge/util/WordUtil.java index 4022c50acea..e69a52475df 100644 --- a/forge-gui/src/main/java/forge/util/WordUtil.java +++ b/forge-gui/src/main/java/forge/util/WordUtil.java @@ -1,10 +1,24 @@ package forge.util; -import org.apache.commons.lang3.text.WordUtils; +import org.apache.commons.lang3.StringUtils; public class WordUtil { public static String capitalize(String str) { - return WordUtils.capitalize(str); + if (StringUtils.isEmpty(str)) { + return str; + } + final char[] buffer = str.toCharArray(); + boolean capitalizeNext = true; + for (int i = 0; i < buffer.length; i++) { + final char ch = buffer[i]; + if (Character.isWhitespace(ch)) { + capitalizeNext = true; + } else if (capitalizeNext) { + buffer[i] = Character.toTitleCase(ch); + capitalizeNext = false; + } + } + return new String(buffer); } private WordUtil() {} From ac7f34d3f5f4dfef5d9355b4634b7020492f6644 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 01:40:15 -0600 Subject: [PATCH 06/10] Cast to Object as recommended by warning --- .../src/main/java/forge/toolbox/special/PlayerDetailsPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java index bccc0c274d9..59afc0532b9 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java @@ -213,7 +213,7 @@ public class PlayerDetailsPanel extends JPanel { } public void setToolTip(final String... args) { - super.setToolTipText(String.format(tooltip, args)); + super.setToolTipText(String.format(tooltip, (Object) args)); } @Override From ea25ad2c3b654d200fcf3edf8c9cafa8de772ed7 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 01:49:06 -0600 Subject: [PATCH 07/10] use `setVisible(true)` instead of `show` to get rid of the warning --- .../src/main/java/forge/gui/GuiChoose.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index b47791c4b84..56bbdc0ea13 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -288,16 +288,12 @@ public class GuiChoose { public static List manipulateCardList(final CMatchUI gui, final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { gui.setSelectables(manipulable); - final Callable> callable = new Callable>() { - @Override - public List call() { - ListCardArea tempArea = ListCardArea.show(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); - // tempArea.pack(); - tempArea.show(); - final List cardList = tempArea.getCards(); - return cardList; - } - }; + final Callable> callable = () -> { + ListCardArea tempArea = ListCardArea.show(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); + // tempArea.pack(); + tempArea.setVisible(true); + return tempArea.getCards(); + }; final FutureTask> ft = new FutureTask<>(callable); FThreads.invokeInEdtAndWait(ft); gui.clearSelectables(); From d53eb3a3fe12d20b4dee85751c581661774b28da Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 02:00:12 -0600 Subject: [PATCH 08/10] pull all `URLDecoder.decode` calls into one method and suppress the warning since changing it appears to have broken things before. --- .../forge/download/GuiDownloadService.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/forge-gui/src/main/java/forge/download/GuiDownloadService.java b/forge-gui/src/main/java/forge/download/GuiDownloadService.java index d6183fe207c..4e72ae2842d 100644 --- a/forge-gui/src/main/java/forge/download/GuiDownloadService.java +++ b/forge-gui/src/main/java/forge/download/GuiDownloadService.java @@ -264,12 +264,8 @@ public abstract class GuiDownloadService implements Runnable { count++; cardSkipped = true; //assume skipped unless saved successfully String url = kv.getValue(); - /* - * decode URL Key, Reverted to old version, - * on Android 6.0 it throws an error - * when you download the card price - */ - String decodedKey = URLDecoder.decode(kv.getKey()); + + String decodedKey = decodeURL(kv.getKey()); final File fileDest = new File(decodedKey); final String filePath = fileDest.getPath(); final String subLastIndex = filePath.contains("pics") ? "\\pics\\" : "\\db\\"; @@ -365,6 +361,16 @@ public abstract class GuiDownloadService implements Runnable { GuiBase.getInterface().preventSystemSleep(false); } + @SuppressWarnings("deprecation") + private static String decodeURL(String key) { + /* + * decode URL Key, Reverted to old version, + * on Android 6.0 it throws an error + * when you download the card price + */ + return URLDecoder.decode(key); + } + protected Proxy getProxy() { if (type == 0) { return Proxy.NO_PROXY; @@ -385,7 +391,7 @@ public abstract class GuiDownloadService implements Runnable { protected static void addMissingItems(Map list, String nameUrlFile, String dir) { for (Pair nameUrlPair : FileUtil.readNameUrlFile(nameUrlFile)) { - File f = new File(dir, URLDecoder.decode(nameUrlPair.getLeft())); + File f = new File(dir, decodeURL(nameUrlPair.getLeft())); //System.out.println(f.getAbsolutePath()); if (!f.exists()) { list.put(f.getAbsolutePath(), nameUrlPair.getRight()); From b010da744c07841cd86d4af9dbf8cbf1a26789ef Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Sun, 6 Oct 2019 02:13:37 -0600 Subject: [PATCH 09/10] progagate type information through to get rid of warning --- forge-gui-mobile/src/forge/animation/GifDecoder.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/forge-gui-mobile/src/forge/animation/GifDecoder.java b/forge-gui-mobile/src/forge/animation/GifDecoder.java index 258b8d7036c..5ff29d18df5 100644 --- a/forge-gui-mobile/src/forge/animation/GifDecoder.java +++ b/forge-gui-mobile/src/forge/animation/GifDecoder.java @@ -687,7 +687,7 @@ public class GifDecoder { } while ((blockSize > 0) && !err()); } - public Animation getAnimation(PlayMode playType) { + private Animation getAnimation(PlayMode playType) { int nrFrames = getFrameCount(); Pixmap frame = getFrame(0); int width = frame.getWidth(); @@ -725,12 +725,11 @@ public class GifDecoder { } float frameDuration = (float)getDelay(0); frameDuration /= 1000; // convert milliseconds into seconds - Animation result = new Animation(frameDuration, texReg, playType); - return result; + return new Animation<>(frameDuration, texReg, playType); } - public static Animation loadGIFAnimation(PlayMode playType, InputStream is) { + public static Animation loadGIFAnimation(PlayMode playType, InputStream is) { GifDecoder gdec = new GifDecoder(); gdec.read(is); return gdec.getAnimation(playType); From f0076117df426715d358f7243796b98b9d5abe08 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Tue, 19 Nov 2019 19:38:51 -0700 Subject: [PATCH 10/10] respond to code review --- .../src/main/java/forge/gui/GuiChoose.java | 14 ++-- .../screens/home/quest/VSubmenuQuestData.java | 64 +------------------ .../src/main/java/forge/util/WordUtil.java | 62 ++++++++++++++++++ 3 files changed, 73 insertions(+), 67 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index 56bbdc0ea13..f64ae7e077e 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -288,11 +288,15 @@ public class GuiChoose { public static List manipulateCardList(final CMatchUI gui, final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { gui.setSelectables(manipulable); - final Callable> callable = () -> { - ListCardArea tempArea = ListCardArea.show(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); - // tempArea.pack(); - tempArea.setVisible(true); - return tempArea.getCards(); + @SuppressWarnings("Convert2Lambda") // Avoid lambdas to maintain compatibility with Android 5 API + final Callable> callable = new Callable>() { + @Override + public List call() { + ListCardArea tempArea = ListCardArea.show(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); + // tempArea.pack(); + tempArea.setVisible(true); + return tempArea.getCards(); + } }; final FutureTask> ft = new FutureTask<>(callable); FThreads.invokeInEdtAndWait(ft); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index ff95b6cb0d0..c3a505d3d76 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -18,6 +18,7 @@ import forge.screens.home.IVSubmenu; import forge.screens.home.VHomeUI; import forge.toolbox.*; import forge.util.Localizer; +import forge.util.WordUtil; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -27,8 +28,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * Assembles Swing components of quest data submenu singleton. @@ -251,7 +250,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final String name = preconDeck.getName(); cbxPreconDeck.addItem(name); String description = preconDeck.getDescription(); - preconDescriptions.put(name, wordWrapAsHTML(description)); + preconDescriptions.put(name, WordUtil.wordWrapAsHTML(description)); } // The cbx needs strictly typed renderer @@ -361,65 +360,6 @@ public enum VSubmenuQuestData implements IVSubmenu { pnlOptions.add(btnEmbark, "w 300px!, h 30px!, ax center, span 2, gap 0 0 15px 30px"); } - final static Pattern patternToWrapOn = Pattern.compile(" "); - private static String wordWrapAsHTML(String str) { - String result = null; - int wrapLength = 40; - String newLineStr = "
"; - if (str != null) { - final int inputLineLength = str.length(); - int offset = 0; - final StringBuilder wrappedLine = new StringBuilder(inputLineLength + 32); - while (offset < inputLineLength) { - int spaceToWrapAt = -1; - Matcher matcher = patternToWrapOn.matcher(str.substring(offset, Math.min(offset + wrapLength + 1, inputLineLength))); - if (matcher.find()) { - if (matcher.start() == 0) { - offset += matcher.end(); - continue; - } - spaceToWrapAt = matcher.start() + offset; - } - - // only last line without leading spaces is left - if (inputLineLength - offset <= wrapLength) { - break; - } - - while (matcher.find()) { - spaceToWrapAt = matcher.start() + offset; - } - - if (spaceToWrapAt >= offset) { - // normal case - wrappedLine.append(str, offset, spaceToWrapAt); - wrappedLine.append(newLineStr); - offset = spaceToWrapAt + 1; - - } else { - // do not wrap really long word, just extend beyond limit - matcher = patternToWrapOn.matcher(str.substring(offset + wrapLength)); - if (matcher.find()) { - spaceToWrapAt = matcher.start() + offset + wrapLength; - } - - if (spaceToWrapAt >= 0) { - wrappedLine.append(str, offset, spaceToWrapAt); - wrappedLine.append(newLineStr); - offset = spaceToWrapAt + 1; - } else { - wrappedLine.append(str, offset, str.length()); - offset = inputLineLength; - } - } - }// Whatever is left in line is short enough to just pass through - wrappedLine.append(str, offset, str.length()); - result = wrappedLine.toString(); - } - - return "" + result + ""; - } - /* (non-Javadoc) * @see forge.view.home.IViewSubmenu#populate() */ diff --git a/forge-gui/src/main/java/forge/util/WordUtil.java b/forge-gui/src/main/java/forge/util/WordUtil.java index e69a52475df..83251e58ec9 100644 --- a/forge-gui/src/main/java/forge/util/WordUtil.java +++ b/forge-gui/src/main/java/forge/util/WordUtil.java @@ -2,6 +2,9 @@ package forge.util; import org.apache.commons.lang3.StringUtils; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class WordUtil { public static String capitalize(String str) { if (StringUtils.isEmpty(str)) { @@ -21,5 +24,64 @@ public class WordUtil { return new String(buffer); } + private final static Pattern patternToWrapOn = Pattern.compile(" "); + public static String wordWrapAsHTML(String str) { + String result = null; + int wrapLength = 40; + String newLineStr = "
"; + if (str != null) { + final int inputLineLength = str.length(); + int offset = 0; + final StringBuilder wrappedLine = new StringBuilder(inputLineLength + 32); + while (offset < inputLineLength) { + int spaceToWrapAt = -1; + Matcher matcher = patternToWrapOn.matcher(str.substring(offset, Math.min(offset + wrapLength + 1, inputLineLength))); + if (matcher.find()) { + if (matcher.start() == 0) { + offset += matcher.end(); + continue; + } + spaceToWrapAt = matcher.start() + offset; + } + + // only last line without leading spaces is left + if (inputLineLength - offset <= wrapLength) { + break; + } + + while (matcher.find()) { + spaceToWrapAt = matcher.start() + offset; + } + + if (spaceToWrapAt >= offset) { + // normal case + wrappedLine.append(str, offset, spaceToWrapAt); + wrappedLine.append(newLineStr); + offset = spaceToWrapAt + 1; + + } else { + // do not wrap really long word, just extend beyond limit + matcher = patternToWrapOn.matcher(str.substring(offset + wrapLength)); + if (matcher.find()) { + spaceToWrapAt = matcher.start() + offset + wrapLength; + } + + if (spaceToWrapAt >= 0) { + wrappedLine.append(str, offset, spaceToWrapAt); + wrappedLine.append(newLineStr); + offset = spaceToWrapAt + 1; + } else { + wrappedLine.append(str, offset, str.length()); + offset = inputLineLength; + } + } + }// Whatever is left in line is short enough to just pass through + wrappedLine.append(str, offset, str.length()); + result = wrappedLine.toString(); + } + + return "" + result + ""; + } + private WordUtil() {} }