diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java
index fac4c95813..03b4750da4 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/DataResultViewerThumbnail.java
@@ -19,14 +19,9 @@
package org.sleuthkit.autopsy.corecomponents;
import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dialog;
-import java.awt.Dimension;
import java.awt.EventQueue;
-import java.awt.FlowLayout;
-import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
@@ -37,10 +32,7 @@ import java.util.logging.Level;
import java.util.prefs.Preferences;
import java.util.stream.Collectors;
import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
-import javax.swing.SortOrder;
-import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import org.apache.commons.lang3.StringUtils;
import org.netbeans.api.progress.ProgressHandle;
@@ -756,177 +748,5 @@ public final class DataResultViewerThumbnail extends AbstractDataResultViewer {
}
}
}
- }
-
- private class WrapLayout extends FlowLayout {
-
- private Dimension preferredLayoutSize;
-
- /**
- * Constructs a new WrapLayout
with a left alignment and a
- * default 5-unit horizontal and vertical gap.
- */
- public WrapLayout() {
- super();
- }
-
- /**
- * Constructs a new FlowLayout
with the specified alignment
- * and a default 5-unit horizontal and vertical gap. The value of the
- * alignment argument must be one of WrapLayout
,
- * WrapLayout
, or WrapLayout
.
- *
- * @param align the alignment value
- */
- public WrapLayout(int align) {
- super(align);
- }
-
- /**
- * Creates a new flow layout manager with the indicated alignment and
- * the indicated horizontal and vertical gaps.
- *
- * The value of the alignment argument must be one of
- *
+ * The value of the alignment argument must be one of
+ * WrapLayout
, WrapLayout
, or
- * WrapLayout
.
- *
- * @param align the alignment value
- * @param hgap the horizontal gap between components
- * @param vgap the vertical gap between components
- */
- public WrapLayout(int align, int hgap, int vgap) {
- super(align, hgap, vgap);
- }
-
- /**
- * Returns the preferred dimensions for this layout given the
- * visible components in the specified target container.
- *
- * @param target the component which needs to be laid out
- *
- * @return the preferred dimensions to lay out the subcomponents of the
- * specified container
- */
- @Override
- public Dimension preferredLayoutSize(Container target) {
- return layoutSize(target, true);
- }
-
- /**
- * Returns the minimum dimensions needed to layout the visible
- * components contained in the specified target container.
- *
- * @param target the component which needs to be laid out
- *
- * @return the minimum dimensions to lay out the subcomponents of the
- * specified container
- */
- @Override
- public Dimension minimumLayoutSize(Container target) {
- Dimension minimum = layoutSize(target, false);
- minimum.width -= (getHgap() + 1);
- return minimum;
- }
-
- /**
- * Returns the minimum or preferred dimension needed to layout the
- * target container.
- *
- * @param target target to get layout size for
- * @param preferred should preferred size be calculated
- *
- * @return the dimension to layout the target container
- */
- private Dimension layoutSize(Container target, boolean preferred) {
- synchronized (target.getTreeLock()) {
- // Each row must fit with the width allocated to the containter.
- // When the container width = 0, the preferred width of the container
- // has not yet been calculated so lets ask for the maximum.
-
- int targetWidth = target.getSize().width;
- Container container = target;
-
- while (container.getSize().width == 0 && container.getParent() != null) {
- container = container.getParent();
- }
-
- targetWidth = container.getSize().width;
-
- if (targetWidth == 0) {
- targetWidth = Integer.MAX_VALUE;
- }
-
- int hgap = getHgap();
- int vgap = getVgap();
- Insets insets = target.getInsets();
- int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2);
- int maxWidth = targetWidth - horizontalInsetsAndGap;
-
- // Fit components into the allowed width
- Dimension dim = new Dimension(0, 0);
- int rowWidth = 0;
- int rowHeight = 0;
-
- int nmembers = target.getComponentCount();
-
- for (int i = 0; i < nmembers; i++) {
- Component m = target.getComponent(i);
-
- if (m.isVisible()) {
- Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize();
-
- // Can't add the component to current row. Start a new row.
- if (rowWidth + d.width > maxWidth) {
- addRow(dim, rowWidth, rowHeight);
- rowWidth = 0;
- rowHeight = 0;
- }
-
- // Add a horizontal gap for all components after the first
- if (rowWidth != 0) {
- rowWidth += hgap;
- }
-
- rowWidth += d.width;
- rowHeight = Math.max(rowHeight, d.height);
- }
- }
-
- addRow(dim, rowWidth, rowHeight);
-
- dim.width += horizontalInsetsAndGap;
- dim.height += insets.top + insets.bottom + vgap * 2;
-
- // When using a scroll pane or the DecoratedLookAndFeel we need to
- // make sure the preferred size is less than the size of the
- // target containter so shrinking the container size works
- // correctly. Removing the horizontal gap is an easy way to do this.
- Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target);
-
- if (scrollPane != null && target.isValid()) {
- dim.width -= (hgap + 1);
- }
-
- return dim;
- }
- }
-
- /*
- * A new row has been completed. Use the dimensions of this row to
- * update the preferred size for the container.
- *
- * @param dim update the width and height when appropriate @param
- * rowWidth the width of the row to add @param rowHeight the height of
- * the row to add
- */
- private void addRow(Dimension dim, int rowWidth, int rowHeight) {
- dim.width = Math.max(dim.width, rowWidth);
-
- if (dim.height > 0) {
- dim.height += getVgap();
- }
-
- dim.height += rowHeight;
- }
- }
+ }
}
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java b/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java
new file mode 100755
index 0000000000..91235149a9
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/WrapLayout.java
@@ -0,0 +1,205 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier WrapLayout
with a left alignment and a
+ * default 5-unit horizontal and vertical gap.
+ */
+ public WrapLayout() {
+ super();
+ }
+
+ /**
+ * Constructs a new FlowLayout
with the specified alignment
+ * and a default 5-unit horizontal and vertical gap. The value of the
+ * alignment argument must be one of WrapLayout
,
+ * WrapLayout
, or WrapLayout
.
+ *
+ * @param align the alignment value
+ */
+ public WrapLayout(int align) {
+ super(align);
+ }
+
+ /**
+ * Creates a new flow layout manager with the indicated alignment and
+ * the indicated horizontal and vertical gaps.
+ * WrapLayout
, WrapLayout
, or
+ * WrapLayout
.
+ *
+ * @param align the alignment value
+ * @param hgap the horizontal gap between components
+ * @param vgap the vertical gap between components
+ */
+ public WrapLayout(int align, int hgap, int vgap) {
+ super(align, hgap, vgap);
+ }
+
+ /**
+ * Returns the preferred dimensions for this layout given the
+ * visible components in the specified target container.
+ *
+ * @param target the component which needs to be laid out
+ *
+ * @return the preferred dimensions to lay out the subcomponents of the
+ * specified container
+ */
+ @Override
+ public Dimension preferredLayoutSize(Container target) {
+ return layoutSize(target, true);
+ }
+
+ /**
+ * Returns the minimum dimensions needed to layout the visible
+ * components contained in the specified target container.
+ *
+ * @param target the component which needs to be laid out
+ *
+ * @return the minimum dimensions to lay out the subcomponents of the
+ * specified container
+ */
+ @Override
+ public Dimension minimumLayoutSize(Container target) {
+ Dimension minimum = layoutSize(target, false);
+ minimum.width -= (getHgap() + 1);
+ return minimum;
+ }
+
+ /**
+ * Returns the minimum or preferred dimension needed to layout the
+ * target container.
+ *
+ * @param target target to get layout size for
+ * @param preferred should preferred size be calculated
+ *
+ * @return the dimension to layout the target container
+ */
+ private Dimension layoutSize(Container target, boolean preferred) {
+ synchronized (target.getTreeLock()) {
+ // Each row must fit with the width allocated to the containter.
+ // When the container width = 0, the preferred width of the container
+ // has not yet been calculated so lets ask for the maximum.
+
+ int targetWidth = target.getSize().width;
+ Container container = target;
+
+ while (container.getSize().width == 0 && container.getParent() != null) {
+ container = container.getParent();
+ }
+
+ targetWidth = container.getSize().width;
+
+ if (targetWidth == 0) {
+ targetWidth = Integer.MAX_VALUE;
+ }
+
+ int hgap = getHgap();
+ int vgap = getVgap();
+ Insets insets = target.getInsets();
+ int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2);
+ int maxWidth = targetWidth - horizontalInsetsAndGap;
+
+ // Fit components into the allowed width
+ Dimension dim = new Dimension(0, 0);
+ int rowWidth = 0;
+ int rowHeight = 0;
+
+ int nmembers = target.getComponentCount();
+
+ for (int i = 0; i < nmembers; i++) {
+ Component m = target.getComponent(i);
+
+ if (m.isVisible()) {
+ Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize();
+
+ // Can't add the component to current row. Start a new row.
+ if (rowWidth + d.width > maxWidth) {
+ addRow(dim, rowWidth, rowHeight);
+ rowWidth = 0;
+ rowHeight = 0;
+ }
+
+ // Add a horizontal gap for all components after the first
+ if (rowWidth != 0) {
+ rowWidth += hgap;
+ }
+
+ rowWidth += d.width;
+ rowHeight = Math.max(rowHeight, d.height);
+ }
+ }
+
+ addRow(dim, rowWidth, rowHeight);
+
+ dim.width += horizontalInsetsAndGap;
+ dim.height += insets.top + insets.bottom + vgap * 2;
+
+ // When using a scroll pane or the DecoratedLookAndFeel we need to
+ // make sure the preferred size is less than the size of the
+ // target containter so shrinking the container size works
+ // correctly. Removing the horizontal gap is an easy way to do this.
+ Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target);
+
+ if (scrollPane != null && target.isValid()) {
+ dim.width -= (hgap + 1);
+ }
+
+ return dim;
+ }
+ }
+
+ /*
+ * A new row has been completed. Use the dimensions of this row to
+ * update the preferred size for the container.
+ *
+ * @param dim update the width and height when appropriate @param
+ * rowWidth the width of the row to add @param rowHeight the height of
+ * the row to add
+ */
+ private void addRow(Dimension dim, int rowWidth, int rowHeight) {
+ dim.width = Math.max(dim.width, rowWidth);
+
+ if (dim.height > 0) {
+ dim.height += getVgap();
+ }
+
+ dim.height += rowHeight;
+ }
+ }
\ No newline at end of file