From 45dfc29cc1dc900d6075e8545fb5b56c940a8e66 Mon Sep 17 00:00:00 2001
From: jmillman <jmillman@basistech.com>
Date: Thu, 28 Aug 2014 15:25:21 -0400
Subject: [PATCH] move FXMConstructor to CoreUtils

---
 .../autopsy/coreutils}/FXMLConstructor.java   |   7 +-
 .../autopsy/timeline/FXMLConstructor.java     | 145 ------------------
 .../actions/SwingMenuItemAdapter.java         |  91 -----------
 .../autopsy/timeline/ui/StatusBar.java        |   2 +-
 .../autopsy/timeline/ui/TimeZonePanel.java    |   2 +-
 .../timeline/ui/VisualizationPanel.java       |   4 +-
 .../ui/countsview/CountsViewPane.java         |   6 +-
 .../ui/detailview/DetailViewPane.java         |   4 +-
 .../timeline/ui/detailview/tree/NavPanel.java |   2 +-
 .../timeline/ui/filtering/FilterSetPanel.java |   2 +-
 .../timeline/zooming/ZoomSettingsPane.java    |   2 +-
 .../imageanalyzer/filtering/FilterPane.java   |   2 +-
 .../imageanalyzer/filtering/FiltersPanel.java |   2 +-
 .../filtering/filters/AtomicFilter.java       |   2 +-
 .../filtering/filters/NameFilter.java         |   2 +-
 .../imageanalyzer/gui/DrawableTile.java       |   2 +-
 .../autopsy/imageanalyzer/gui/GroupPane.java  |   2 +-
 .../imageanalyzer/gui/MediaControl.java       |   2 +-
 .../imageanalyzer/gui/NoGroupsDialog.java     |   2 +-
 .../imageanalyzer/gui/SlideShowView.java      |   2 +-
 .../imageanalyzer/gui/SummaryTablePane.java   |   2 +-
 .../autopsy/imageanalyzer/gui/Toolbar.java    |   2 +-
 .../imageanalyzer/gui/navpanel/NavPanel.java  |   2 +-
 23 files changed, 29 insertions(+), 262 deletions(-)
 rename {ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer => Core/src/org/sleuthkit/autopsy/coreutils}/FXMLConstructor.java (96%)
 delete mode 100644 Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java
 delete mode 100644 Core/src/org/sleuthkit/autopsy/timeline/actions/SwingMenuItemAdapter.java

diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/FXMLConstructor.java b/Core/src/org/sleuthkit/autopsy/coreutils/FXMLConstructor.java
similarity index 96%
rename from ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/FXMLConstructor.java
rename to Core/src/org/sleuthkit/autopsy/coreutils/FXMLConstructor.java
index 1d4cbc39d3..f398d7c7aa 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/FXMLConstructor.java
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/FXMLConstructor.java
@@ -16,7 +16,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.sleuthkit.autopsy.imageanalyzer;
+package org.sleuthkit.autopsy.coreutils;
 
 import java.io.IOException;
 import java.net.URL;
@@ -35,6 +35,9 @@
  */
 public class FXMLConstructor {
 
+    private FXMLConstructor() {
+    }
+    
     private static final CachingClassLoader CACHING_CLASS_LOADER = new CachingClassLoader((FXMLLoader.getDefaultClassLoader()));
 
     static public void construct(Node n, String fxmlFileName) {
@@ -65,7 +68,7 @@ static public void construct(Node n, String fxmlFileName) {
      */
     static public class CachingClassLoader extends ClassLoader {
 
-        private final Map<String, Class> classes = new HashMap<String, Class>();
+        private final Map<String, Class<?>> classes = new HashMap<>();
 
         private final ClassLoader parent;
 
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java b/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java
deleted file mode 100644
index 685d50d3d5..0000000000
--- a/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2013 Basis Technology Corp.
- * Contact: carrier <at> sleuthkit <dot> org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.timeline;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Node;
-import org.openide.util.Exceptions;
-
-/**
- * This class support both programmer productivity by abstracting frequently
- * used code to load FXML-defined GUI components, and code performance by
- * implementing a caching FXMLLoader as described at
- * http://stackoverflow.com/questions/11734885/javafx2-very-poor-performance-when-adding-custom-made-fxmlpanels-to-gridpane.
- *
- * TODO: this code is duplicated in the Image Analyze module, we should move it
- * into a centralized places like a JavaFX utils class/package/module in
- * Autopsy- jm
- */
-public class FXMLConstructor {
-
-    private static final CachingClassLoader CACHING_CLASS_LOADER = new CachingClassLoader((FXMLLoader.getDefaultClassLoader()));
-
-    static public void construct(Node n, String fxmlFileName) {
-        FXMLLoader fxmlLoader = new FXMLLoader(n.getClass().getResource(fxmlFileName));
-        fxmlLoader.setRoot(n);
-        fxmlLoader.setController(n);
-        fxmlLoader.setClassLoader(CACHING_CLASS_LOADER);
-
-        try {
-            fxmlLoader.load();
-        } catch (Exception exception) {
-            try {
-                fxmlLoader.setClassLoader(FXMLLoader.getDefaultClassLoader());
-                fxmlLoader.load();
-            } catch (Exception ex) {
-                Exceptions.printStackTrace(ex);
-            }
-        }
-    }
-
-    /**
-     * The default FXMLLoader does not cache information about previously loaded
-     * FXML files. See
-     * http://stackoverflow.com/questions/11734885/javafx2-very-poor-performance-when-adding-custom-made-fxmlpanels-to-gridpane.
-     * for more details. As a partial workaround, we cache information on
-     * previously loaded classes. This does not solve all performance issues,
-     * but is a big improvement.
-     */
-    static public class CachingClassLoader extends ClassLoader {
-
-        private final Map<String, Class<?>> classes = new HashMap<>();
-
-        private final ClassLoader parent;
-
-        public CachingClassLoader(ClassLoader parent) {
-            this.parent = parent;
-        }
-
-        @Override
-        public Class<?> loadClass(String name) throws ClassNotFoundException {
-            Class<?> c = findClass(name);
-            if (c == null) {
-                throw new ClassNotFoundException(name);
-            }
-            return c;
-        }
-
-        @Override
-        protected Class<?> findClass(String className) throws ClassNotFoundException {
-// System.out.print("try to load " + className); 
-            if (classes.containsKey(className)) {
-                Class<?> result = classes.get(className);
-                return result;
-            } else {
-                try {
-                    Class<?> result = parent.loadClass(className);
-// System.out.println(" -> success!"); 
-                    classes.put(className, result);
-                    return result;
-                } catch (ClassNotFoundException ignore) {
-// System.out.println(); 
-                    classes.put(className, null);
-                    return null;
-                }
-            }
-        }
-
-        // ========= delegating methods ============= 
-        @Override
-        public URL getResource(String name) {
-            return parent.getResource(name);
-        }
-
-        @Override
-        public Enumeration<URL> getResources(String name) throws IOException {
-            return parent.getResources(name);
-        }
-
-        @Override
-        public String toString() {
-            return parent.toString();
-        }
-
-        @Override
-        public void setDefaultAssertionStatus(boolean enabled) {
-            parent.setDefaultAssertionStatus(enabled);
-        }
-
-        @Override
-        public void setPackageAssertionStatus(String packageName, boolean enabled) {
-            parent.setPackageAssertionStatus(packageName, enabled);
-        }
-
-        @Override
-        public void setClassAssertionStatus(String className, boolean enabled) {
-            parent.setClassAssertionStatus(className, enabled);
-        }
-
-        @Override
-        public void clearAssertionStatus() {
-            parent.clearAssertionStatus();
-        }
-    }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/SwingMenuItemAdapter.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/SwingMenuItemAdapter.java
deleted file mode 100644
index 85f7e5552d..0000000000
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/SwingMenuItemAdapter.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2013-14 Basis Technology Corp.
- * Contact: carrier <at> sleuthkit <dot> org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.sleuthkit.autopsy.timeline.actions;
-
-import javafx.event.ActionEvent;
-import javafx.scene.control.Menu;
-import javafx.scene.control.MenuItem;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.MenuElement;
-import javax.swing.SwingUtilities;
-
-public class SwingMenuItemAdapter extends MenuItem {
-
-    JMenuItem jMenuItem;
-
-    SwingMenuItemAdapter(final JMenuItem jMenuItem) {
-        super(jMenuItem.getText());
-        this.jMenuItem = jMenuItem;
-        setOnAction((ActionEvent t) -> {
-            SwingUtilities.invokeLater(() -> {
-                jMenuItem.doClick();
-            });
-
-        });
-    }
-
-    public static MenuItem create(MenuElement jmenuItem) {
-        if (jmenuItem instanceof JMenu) {
-            return new SwingMenuAdapter((JMenu) jmenuItem);
-        } else if (jmenuItem instanceof JPopupMenu) {
-            return new SwingMenuAdapter((JPopupMenu) jmenuItem);
-        } else {
-            return new SwingMenuItemAdapter((JMenuItem) jmenuItem);
-        }
-
-    }
-}
-
-class SwingMenuAdapter extends Menu {
-
-    private final MenuElement jMenu;
-
-    SwingMenuAdapter(final JMenu jMenu) {
-        super(jMenu.getText());
-        this.jMenu = jMenu;
-        buildChildren(jMenu);
-
-    }
-
-    SwingMenuAdapter(JPopupMenu jPopupMenu) {
-        super(jPopupMenu.getLabel());
-        this.jMenu = jPopupMenu;
-
-        buildChildren(jMenu);
-    }
-
-    private void buildChildren(MenuElement jMenu) {
-
-        for (MenuElement menuE : jMenu.getSubElements()) {
-            if (menuE instanceof JMenu) {
-                getItems().add(SwingMenuItemAdapter.create((JMenu) menuE));
-            } else if (menuE instanceof JMenuItem) {
-                getItems().add(SwingMenuItemAdapter.create((JMenuItem) menuE));
-            } else if (menuE instanceof JPopupMenu) {
-                buildChildren(menuE);
-            } else {
-
-                System.out.println(menuE.toString());
-//                throw new UnsupportedOperationException();
-            }
-        }
-    }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.java
index 0a80d3146d..b292d13c8b 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/StatusBar.java
@@ -25,7 +25,7 @@
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.Priority;
 import javafx.scene.layout.Region;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 import org.sleuthkit.autopsy.timeline.TimeLineUI;
 
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.java
index 6882781b64..87303ea9ee 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/TimeZonePanel.java
@@ -27,7 +27,7 @@
 import javafx.scene.control.TitledPane;
 import javafx.scene.control.Toggle;
 import javafx.scene.control.ToggleGroup;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 
 /**
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/VisualizationPanel.java
index 2500fffdb1..d761cb6bbf 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/VisualizationPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/VisualizationPanel.java
@@ -67,9 +67,9 @@
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.Interval;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.coreutils.LoggedTask;
+import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 import org.sleuthkit.autopsy.timeline.TimeLineView;
 import org.sleuthkit.autopsy.timeline.VisualizationMode;
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java
index 6791def14e..1bf47b4850 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java
@@ -60,8 +60,10 @@
 import org.joda.time.DateTime;
 import org.joda.time.Interval;
 import org.joda.time.Seconds;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.ColorUtilities;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.coreutils.LoggedTask;
+import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 import org.sleuthkit.autopsy.timeline.TimeLineView;
 import org.sleuthkit.autopsy.timeline.actions.Back;
@@ -70,9 +72,7 @@
 import org.sleuthkit.autopsy.timeline.events.type.EventType;
 import org.sleuthkit.autopsy.timeline.events.type.RootEventType;
 import org.sleuthkit.autopsy.timeline.ui.AbstractVisualization;
-import org.sleuthkit.autopsy.coreutils.ColorUtilities;
 import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
-import org.sleuthkit.autopsy.coreutils.Logger;
 
 /**
  * FXML Controller class for a {@link StackedBarChart<String,Number>} based
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java
index c012c86e40..15f446684d 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java
@@ -60,8 +60,9 @@
 import javafx.scene.layout.Region;
 import javafx.scene.layout.VBox;
 import org.joda.time.DateTime;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.coreutils.LoggedTask;
+import org.sleuthkit.autopsy.coreutils.Logger;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 import org.sleuthkit.autopsy.timeline.events.AggregateEvent;
 import org.sleuthkit.autopsy.timeline.events.FilteredEventsModel;
@@ -70,7 +71,6 @@
 import org.sleuthkit.autopsy.timeline.ui.countsview.CountsViewPane;
 import org.sleuthkit.autopsy.timeline.ui.detailview.tree.NavTreeNode;
 import org.sleuthkit.autopsy.timeline.utils.RangeDivisionInfo;
-import org.sleuthkit.autopsy.coreutils.Logger;
 
 /**
  * FXML Controller class for a {@link EventDetailChart} based implementation of
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/NavPanel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/NavPanel.java
index dd368a5257..d64d23b218 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/NavPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/NavPanel.java
@@ -36,7 +36,7 @@
 import javafx.scene.layout.BorderPane;
 import javafx.scene.layout.StackPane;
 import javafx.scene.shape.Rectangle;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 import org.sleuthkit.autopsy.timeline.TimeLineView;
 import org.sleuthkit.autopsy.timeline.events.AggregateEvent;
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java
index 89f379f80f..38d67104ac 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java
@@ -32,7 +32,7 @@
 import javafx.scene.control.TreeTableView;
 import javafx.scene.layout.BorderPane;
 import org.controlsfx.control.action.AbstractAction;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 import org.sleuthkit.autopsy.timeline.TimeLineView;
 import org.sleuthkit.autopsy.timeline.actions.DefaultFilters;
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.java b/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.java
index f07e113461..958c1c139c 100644
--- a/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/zooming/ZoomSettingsPane.java
@@ -30,7 +30,7 @@
 import javafx.scene.control.TitledPane;
 import javafx.scene.control.Tooltip;
 import javafx.util.StringConverter;
-import org.sleuthkit.autopsy.timeline.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.timeline.TimeLineController;
 import org.sleuthkit.autopsy.timeline.TimeLineView;
 import org.sleuthkit.autopsy.timeline.VisualizationMode;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FilterPane.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FilterPane.java
index d2294c700d..b964c8be2b 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FilterPane.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FilterPane.java
@@ -21,7 +21,7 @@
 import org.sleuthkit.autopsy.imageanalyzer.filtering.filters.FilterRow;
 import org.sleuthkit.autopsy.imageanalyzer.filtering.filters.AtomicFilter;
 import org.sleuthkit.autopsy.imageanalyzer.filtering.filters.UnionFilter;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import java.net.URL;
 import java.util.Map;
 import java.util.ResourceBundle;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FiltersPanel.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FiltersPanel.java
index 855c50b6f1..2a120ee032 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FiltersPanel.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/FiltersPanel.java
@@ -40,7 +40,7 @@
 import javax.swing.SortOrder;
 import org.sleuthkit.autopsy.coreutils.LoggedTask;
 import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.FileUpdateEvent;
 import org.sleuthkit.autopsy.imageanalyzer.FileUpdateListener;
 import org.sleuthkit.autopsy.imageanalyzer.ImageAnalyzerController;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/AtomicFilter.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/AtomicFilter.java
index 77c545e895..953391a3a8 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/AtomicFilter.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/AtomicFilter.java
@@ -4,7 +4,7 @@
  */
 package org.sleuthkit.autopsy.imageanalyzer.filtering.filters;
 
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableAttribute;
 import org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableFile;
 import java.net.URL;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/NameFilter.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/NameFilter.java
index 08b0f4305e..540b60fcd0 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/NameFilter.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/filtering/filters/NameFilter.java
@@ -4,7 +4,7 @@
  */
 package org.sleuthkit.autopsy.imageanalyzer.filtering.filters;
 
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableAttribute;
 import java.net.URL;
 import java.util.ResourceBundle;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/DrawableTile.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/DrawableTile.java
index f6d792cf9f..8376eb065f 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/DrawableTile.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/DrawableTile.java
@@ -29,7 +29,7 @@
 import javafx.scene.image.ImageView;
 import javafx.scene.paint.Color;
 import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.TagUtils;
 import org.sleuthkit.autopsy.coreutils.ThreadConfined;
 import org.sleuthkit.autopsy.coreutils.ThreadConfined.ThreadType;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/GroupPane.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/GroupPane.java
index d67c7eac2a..14bac4bfaa 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/GroupPane.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/GroupPane.java
@@ -96,7 +96,7 @@
 import org.sleuthkit.autopsy.directorytree.ExtractAction;
 import org.sleuthkit.autopsy.imageanalyzer.ImageAnalyzerController;
 import org.sleuthkit.autopsy.imageanalyzer.ImageAnalyzerTopComponent;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.FileIDSelectionModel;
 import org.sleuthkit.autopsy.imageanalyzer.TagUtils;
 import org.sleuthkit.autopsy.coreutils.ThreadConfined;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/MediaControl.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/MediaControl.java
index a822acb00a..b8f1dc97cc 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/MediaControl.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/MediaControl.java
@@ -18,7 +18,7 @@
  */
 package org.sleuthkit.autopsy.imageanalyzer.gui;
 
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import java.net.URL;
 import java.util.ResourceBundle;
 import java.util.logging.Level;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/NoGroupsDialog.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/NoGroupsDialog.java
index 77bd00cc1f..47c7a31717 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/NoGroupsDialog.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/NoGroupsDialog.java
@@ -19,7 +19,7 @@
  */
 package org.sleuthkit.autopsy.imageanalyzer.gui;
 
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import java.net.URL;
 import java.util.ResourceBundle;
 import javafx.fxml.FXML;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SlideShowView.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SlideShowView.java
index dbd30e79c4..2a80d18ec1 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SlideShowView.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SlideShowView.java
@@ -47,7 +47,7 @@
 import javafx.scene.layout.Region;
 import org.openide.util.Exceptions;
 import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.FileIDSelectionModel;
 import org.sleuthkit.autopsy.imageanalyzer.TagUtils;
 import org.sleuthkit.autopsy.coreutils.ThreadConfined;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SummaryTablePane.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SummaryTablePane.java
index 32936a0da2..8beb5f1211 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SummaryTablePane.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/SummaryTablePane.java
@@ -36,7 +36,7 @@
 import org.openide.util.Exceptions;
 import org.sleuthkit.autopsy.casemodule.Case;
 import org.sleuthkit.autopsy.imageanalyzer.ImageAnalyzerController;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.datamodel.Category;
 import org.sleuthkit.datamodel.TskCoreException;
 
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/Toolbar.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/Toolbar.java
index a6688d4d8f..7a98548b0a 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/Toolbar.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/Toolbar.java
@@ -42,7 +42,7 @@
 import javafx.scene.layout.HBox;
 import javax.swing.SortOrder;
 import org.openide.util.Exceptions;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.FileIDSelectionModel;
 import org.sleuthkit.autopsy.imageanalyzer.IconCache;
 import org.sleuthkit.autopsy.imageanalyzer.ImageAnalyzerController;
diff --git a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java
index 9bce73f563..f7b81912db 100644
--- a/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java
+++ b/ImageAnalyzer/src/org/sleuthkit/autopsy/imageanalyzer/gui/navpanel/NavPanel.java
@@ -44,7 +44,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.openide.util.Exceptions;
 import org.sleuthkit.autopsy.imageanalyzer.ImageAnalyzerController;
-import org.sleuthkit.autopsy.imageanalyzer.FXMLConstructor;
+import org.sleuthkit.autopsy.coreutils.FXMLConstructor;
 import org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableAttribute;
 import org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableAttribute.AttributeName;
 import static org.sleuthkit.autopsy.imageanalyzer.datamodel.DrawableAttribute.AttributeName.PATH;
-- 
GitLab