diff --git a/pom.xml b/pom.xml index 9de7c444..25f842b1 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,11 @@ commons-io 1.3.2 + + org.apache.commons + commons-lang3 + 3.7 + org.apache.httpcomponents httpclient diff --git a/src/main/java/com/rarchives/ripme/ripper/AbstractRipper.java b/src/main/java/com/rarchives/ripme/ripper/AbstractRipper.java index 94ac1ec9..eb210895 100644 --- a/src/main/java/com/rarchives/ripme/ripper/AbstractRipper.java +++ b/src/main/java/com/rarchives/ripme/ripper/AbstractRipper.java @@ -299,7 +299,7 @@ public abstract class AbstractRipper * Prefix to prepend to the saved filename. * @param subdirectory * Sub-directory of the working directory to save the images to. - * @return True on success, flase on failure. + * @return True on success, false on failure. */ protected boolean addURLToDownload(URL url, String prefix, String subdirectory) { return addURLToDownload(url, prefix, subdirectory, null, null, null); @@ -316,7 +316,7 @@ public abstract class AbstractRipper * URL to download * @param prefix * Text to append to saved filename. - * @return True on success, flase on failure. + * @return True on success, false on failure. */ protected boolean addURLToDownload(URL url, String prefix) { // Use empty subdirectory diff --git a/src/main/java/com/rarchives/ripme/ui/MainWindow.java b/src/main/java/com/rarchives/ripme/ui/MainWindow.java index e0114fea..f25d1320 100644 --- a/src/main/java/com/rarchives/ripme/ui/MainWindow.java +++ b/src/main/java/com/rarchives/ripme/ui/MainWindow.java @@ -25,6 +25,7 @@ import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; +import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; @@ -50,6 +51,7 @@ import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyledDocument; +import org.apache.commons.lang3.ArrayUtils; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.FileAppender; import org.apache.log4j.Level; @@ -150,6 +152,26 @@ public final class MainWindow implements Runnable, RipStatusHandler { } } + private static int getAverageFontWidth(JComponent component) { + int[] widths = component.getFontMetrics(component.getFont()).getWidths(); + return Collections.max(Arrays.asList(ArrayUtils.toObject(widths))); + } + + private static void insertWrappedString(JComponent parent, StyledDocument document, String string, SimpleAttributeSet s) + throws BadLocationException { + StringBuilder resultString = new StringBuilder(); + int maxCharsToFit = parent.getWidth() / getAverageFontWidth(parent); + int i = 0; + while(i < string.length()/maxCharsToFit) { + if(i > 0) resultString.append(string.substring(i*maxCharsToFit-2, i*maxCharsToFit)); + resultString.append(string.substring(i*maxCharsToFit, (i+1)*maxCharsToFit-2)); + resultString.append("\\\n"); + i++; + } + resultString.append(string.substring(string.length()-(string.length()%maxCharsToFit))); + resultString.append("\n"); + document.insertString(document.getLength(), resultString.toString(), s); + } private static void addCheckboxListener(JCheckBox checkBox, String configString) { checkBox.addActionListener(arg0 -> { @@ -241,7 +263,14 @@ public final class MainWindow implements Runnable, RipStatusHandler { private void statusWithColor(String text, Color color) { statusLabel.setForeground(color); - statusLabel.setText(text); + statusLabel.setToolTipText(text); + int averageWidth = getAverageFontWidth(statusLabel); + int numCharsToFit = statusLabel.getWidth() / averageWidth; + if(text.length() > (mainFrame.getWidth() / averageWidth)) { + statusLabel.setText(text.substring(0, numCharsToFit-6) + "..."); + } else { + statusLabel.setText(text); + } pack(); } @@ -308,6 +337,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { gbc.weightx = 1; statusLabel = new JLabel(rb.getString("inactive")); + statusLabel.setToolTipText(rb.getString("inactive")); statusLabel.setHorizontalAlignment(JLabel.CENTER); openButton = new JButton(); openButton.setVisible(false); @@ -353,6 +383,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { logPanel.setBorder(emptyBorder); logText = new JTextPane(); logText.setEditable(false); + logText.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); JScrollPane logTextScroll = new JScrollPane(logText); logTextScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); logPanel.setVisible(false); @@ -1012,7 +1043,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { StyledDocument sd = logText.getStyledDocument(); try { synchronized (this) { - sd.insertString(sd.getLength(), text + "\n", sas); + insertWrappedString(logText, sd, text, sas); } } catch (BadLocationException e) { }