Merge remote-tracking branch 'upstream/release-4.19.0' into rcordovano-7747-os-acct-inst-create-evt

This commit is contained in:
Richard Cordovano 2021-06-23 10:04:35 -04:00
commit e00eb327e1
20 changed files with 171 additions and 141 deletions

View File

@ -22,6 +22,7 @@ import org.sleuthkit.autopsy.featureaccess.FeatureAccessUtils;
import com.google.common.annotations.Beta; import com.google.common.annotations.Beta;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.awt.Cursor;
import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeData; import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeData;
import java.awt.Frame; import java.awt.Frame;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@ -1334,12 +1335,14 @@ public class Case {
* opened via the DirectoryTreeTopComponent 'propertyChange()' * opened via the DirectoryTreeTopComponent 'propertyChange()'
* method on a DATA_SOURCE_ADDED event. * method on a DATA_SOURCE_ADDED event.
*/ */
mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
if (hasData) { if (hasData) {
CoreComponentControl.openCoreWindows(); CoreComponentControl.openCoreWindows();
} else { } else {
//ensure that the DirectoryTreeTopComponent is open so that it's listener can open the core windows including making it visible. //ensure that the DirectoryTreeTopComponent is open so that it's listener can open the core windows including making it visible.
DirectoryTreeTopComponent.findInstance(); DirectoryTreeTopComponent.findInstance();
} }
mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
/* /*
* Reset the main window title to: * Reset the main window title to:

View File

@ -43,5 +43,5 @@ OtherOccurrencesPanel.showCommonalityMenuItem.text=Show Frequency
OtherOccurrencesPanel.showCaseDetailsMenuItem.text=Show Case Details OtherOccurrencesPanel.showCaseDetailsMenuItem.text=Show Case Details
OtherOccurrencesPanel.table.noArtifacts=Item has no attributes with which to search. OtherOccurrencesPanel.table.noArtifacts=Item has no attributes with which to search.
OtherOccurrencesPanel.table.noResultsFound=No results found. OtherOccurrencesPanel.table.noResultsFound=No results found.
OtherOccurrencesPanel_earliestCaseNotAvailable=Not Availble. OtherOccurrencesPanel_earliestCaseNotAvailable=Not Available.
OtherOccurrencesPanel_table_loadingResults=Loading results OtherOccurrencesPanel_table_loadingResults=Loading results

View File

@ -34,8 +34,6 @@
</MenuItem> </MenuItem>
</SubComponents> </SubComponents>
</Container> </Container>
<Component class="javax.swing.JFileChooser" name="CSVFileChooser">
</Component>
</NonVisualComponents> </NonVisualComponents>
<AuxValues> <AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>

View File

@ -35,6 +35,9 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.logging.Level; import java.util.logging.Level;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
@ -46,7 +49,6 @@ import javax.swing.SwingWorker;
import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.TableModel; import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter; import javax.swing.table.TableRowSorter;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
@ -71,7 +73,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
private static final CorrelationCaseWrapper NO_ARTIFACTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noArtifacts()); private static final CorrelationCaseWrapper NO_ARTIFACTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noArtifacts());
private static final CorrelationCaseWrapper NO_RESULTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noResultsFound()); private static final CorrelationCaseWrapper NO_RESULTS_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_noResultsFound());
private static final CorrelationCaseWrapper LOADING_CASE = new CorrelationCaseWrapper(Bundle.OtherOccurrencesPanel_table_loadingResults());
private static final Logger logger = Logger.getLogger(OtherOccurrencesPanel.class.getName()); private static final Logger logger = Logger.getLogger(OtherOccurrencesPanel.class.getName());
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final OtherOccurrencesFilesTableModel filesTableModel; private final OtherOccurrencesFilesTableModel filesTableModel;
@ -85,6 +86,11 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
private SwingWorker<?, ?> worker; private SwingWorker<?, ?> worker;
// Initializing the JFileChooser in a thread to prevent a block on the EDT
// see https://stackoverflow.com/questions/49792375/jfilechooser-is-very-slow-when-using-windows-look-and-feel
private final FutureTask<JFileChooser> futureFileChooser = new FutureTask<>(JFileChooser::new);
private JFileChooser CSVFileChooser;
/** /**
* Creates new form OtherOccurrencesPanel * Creates new form OtherOccurrencesPanel
*/ */
@ -93,9 +99,11 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
this.casesTableModel = new OtherOccurrencesCasesTableModel(); this.casesTableModel = new OtherOccurrencesCasesTableModel();
this.dataSourcesTableModel = new OtherOccurrencesDataSourcesTableModel(); this.dataSourcesTableModel = new OtherOccurrencesDataSourcesTableModel();
this.correlationAttributes = new ArrayList<>(); this.correlationAttributes = new ArrayList<>();
occurrencePanel = new OccurrencePanel();
initComponents(); initComponents();
customizeComponents(); customizeComponents();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(futureFileChooser);
} }
private void customizeComponents() { private void customizeComponents() {
@ -245,6 +253,18 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
private void saveToCSV() throws NoCurrentCaseException { private void saveToCSV() throws NoCurrentCaseException {
if (casesTableModel.getRowCount() > 0) { if (casesTableModel.getRowCount() > 0) {
if(CSVFileChooser == null) {
try{
CSVFileChooser = futureFileChooser.get();
} catch (InterruptedException | ExecutionException ex) {
// If something happened with the thread try and
// initalized the chooser now
logger.log(Level.WARNING, "A failure occurred in the JFileChooser background thread");
CSVFileChooser = new JFileChooser();
}
}
Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
String fileName = String.format("%1$tY%1$tm%1$te%1$tI%1$tM%1$tS_other_data_sources.csv", now); String fileName = String.format("%1$tY%1$tm%1$te%1$tI%1$tM%1$tS_other_data_sources.csv", now);
CSVFileChooser.setCurrentDirectory(new File(Case.getCurrentCaseThrows().getExportDirectory())); CSVFileChooser.setCurrentDirectory(new File(Case.getCurrentCaseThrows().getExportDirectory()));
@ -258,13 +278,13 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
if (!selectedFile.getName().endsWith(".csv")) { // NON-NLS if (!selectedFile.getName().endsWith(".csv")) { // NON-NLS
selectedFile = new File(selectedFile.toString() + ".csv"); // NON-NLS selectedFile = new File(selectedFile.toString() + ".csv"); // NON-NLS
} }
CSVWorker worker = new CSVWorker(selectedFile, file, dataSourceName, deviceId, Collections.unmodifiableCollection(correlationAttributes)); CSVWorker csvWorker = new CSVWorker(selectedFile, file, dataSourceName, deviceId, Collections.unmodifiableCollection(correlationAttributes));
worker.execute(); csvWorker.execute();
} }
} }
} }
@NbBundle.Messages({"OtherOccurrencesPanel_earliestCaseNotAvailable=Not Availble."}) @NbBundle.Messages({"OtherOccurrencesPanel_earliestCaseNotAvailable=Not Available."})
/** /**
* Reset the UI and clear cached data. * Reset the UI and clear cached data.
*/ */
@ -685,7 +705,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
exportToCSVMenuItem = new javax.swing.JMenuItem(); exportToCSVMenuItem = new javax.swing.JMenuItem();
showCaseDetailsMenuItem = new javax.swing.JMenuItem(); showCaseDetailsMenuItem = new javax.swing.JMenuItem();
showCommonalityMenuItem = new javax.swing.JMenuItem(); showCommonalityMenuItem = new javax.swing.JMenuItem();
CSVFileChooser = new javax.swing.JFileChooser();
tableContainerPanel = new javax.swing.JPanel(); tableContainerPanel = new javax.swing.JPanel();
tablesViewerSplitPane = new javax.swing.JSplitPane(); tablesViewerSplitPane = new javax.swing.JSplitPane();
caseDatasourceFileSplitPane = new javax.swing.JSplitPane(); caseDatasourceFileSplitPane = new javax.swing.JSplitPane();
@ -704,12 +723,12 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
rightClickPopupMenu.addPopupMenuListener(new javax.swing.event.PopupMenuListener() { rightClickPopupMenu.addPopupMenuListener(new javax.swing.event.PopupMenuListener() {
public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) { public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) {
rightClickPopupMenuPopupMenuWillBecomeVisible(evt);
} }
public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) { public void popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
} }
public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) { public void popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent evt) {
rightClickPopupMenuPopupMenuWillBecomeVisible(evt);
} }
}); });
@ -857,7 +876,6 @@ public final class OtherOccurrencesPanel extends javax.swing.JPanel {
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JFileChooser CSVFileChooser;
private javax.swing.JSplitPane caseDatasourceFileSplitPane; private javax.swing.JSplitPane caseDatasourceFileSplitPane;
private javax.swing.JSplitPane caseDatasourceSplitPane; private javax.swing.JSplitPane caseDatasourceSplitPane;
private javax.swing.JScrollPane caseScrollPane; private javax.swing.JScrollPane caseScrollPane;

View File

@ -34,6 +34,9 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import static java.util.Objects.nonNull; import static java.util.Objects.nonNull;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javafx.application.Platform; import javafx.application.Platform;
@ -150,7 +153,7 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
@ThreadConfined(type = ThreadConfined.ThreadType.AWT) @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
private final JMenuItem exportTagsMenuItem; private final JMenuItem exportTagsMenuItem;
@ThreadConfined(type = ThreadConfined.ThreadType.AWT) @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
private final JFileChooser exportChooser; private JFileChooser exportChooser;
@ThreadConfined(type = ThreadConfined.ThreadType.AWT) @ThreadConfined(type = ThreadConfined.ThreadType.AWT)
private final JFXPanel fxPanel; private final JFXPanel fxPanel;
@ -190,9 +193,9 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
private Task<Image> readImageFileTask; private Task<Image> readImageFileTask;
private volatile ImageTransforms imageTransforms; private volatile ImageTransforms imageTransforms;
static { // Initializing the JFileChooser in a thread to prevent a block on the EDT
ImageIO.scanForPlugins(); // see https://stackoverflow.com/questions/49792375/jfilechooser-is-very-slow-when-using-windows-look-and-feel
} private final FutureTask<JFileChooser> futureFileChooser = new FutureTask<>(JFileChooser::new);
/** /**
* Constructs a media image file viewer implemented as a Swing panel that * Constructs a media image file viewer implemented as a Swing panel that
@ -211,8 +214,8 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
imageTransforms = new ImageTransforms(0, 0, true); imageTransforms = new ImageTransforms(0, 0, true);
exportChooser = new JFileChooser(); ExecutorService executor = Executors.newSingleThreadExecutor();
exportChooser.setDialogTitle(Bundle.MediaViewImagePanel_fileChooserTitle()); executor.execute(futureFileChooser);
//Build popupMenu when Tags Menu button is pressed. //Build popupMenu when Tags Menu button is pressed.
imageTaggingOptions = new JPopupMenu(); imageTaggingOptions = new JPopupMenu();
@ -1043,6 +1046,18 @@ class MediaViewImagePanel extends JPanel implements MediaFileViewer.MediaViewPan
final AbstractFile file = imageFile; final AbstractFile file = imageFile;
tagsGroup.clearFocus(); tagsGroup.clearFocus();
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
if(exportChooser == null) {
try {
exportChooser = futureFileChooser.get();
} catch (InterruptedException | ExecutionException ex) {
// If something happened with the thread try and
// initalized the chooser now
logger.log(Level.WARNING, "A failure occurred in the JFileChooser background thread");
exportChooser = new JFileChooser();
}
}
exportChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); exportChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
//Always base chooser location to export folder //Always base chooser location to export folder
exportChooser.setCurrentDirectory(new File(Case.getCurrentCase().getExportDirectory())); exportChooser.setCurrentDirectory(new File(Case.getCurrentCase().getExportDirectory()));

View File

@ -33,6 +33,7 @@ import java.util.logging.Handler;
import java.util.logging.Level; import java.util.logging.Level;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.embed.swing.JFXPanel; import javafx.embed.swing.JFXPanel;
import javax.imageio.ImageIO;
import net.sf.sevenzipjbinding.SevenZip; import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipNativeInitializationException; import net.sf.sevenzipjbinding.SevenZipNativeInitializationException;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@ -44,6 +45,7 @@ import org.openide.windows.WindowManager;
import org.sleuthkit.autopsy.actions.IngestRunningCheck; import org.sleuthkit.autopsy.actions.IngestRunningCheck;
import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.Case;
import static org.sleuthkit.autopsy.core.UserPreferences.SETTINGS_PROPERTIES; import static org.sleuthkit.autopsy.core.UserPreferences.SETTINGS_PROPERTIES;
import org.sleuthkit.autopsy.corelibs.OpenCvLoader;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil; import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.coreutils.ModuleSettings; import org.sleuthkit.autopsy.coreutils.ModuleSettings;
@ -66,6 +68,13 @@ public class Installer extends ModuleInstall {
static { static {
loadDynLibraries(); loadDynLibraries();
// This call was moved from MediaViewImagePanel so that it is
// not called during top level component construction.
ImageIO.scanForPlugins();
// This will cause OpenCvLoader to load its library instead of
OpenCvLoader.openCvIsLoaded();
} }
private static void loadDynLibraries() { private static void loadDynLibraries() {

View File

@ -80,6 +80,7 @@ import static org.sleuthkit.autopsy.datamodel.AbstractContentNode.NO_DESCR;
import org.sleuthkit.autopsy.texttranslation.TextTranslationService; import org.sleuthkit.autopsy.texttranslation.TextTranslationService;
import org.sleuthkit.autopsy.datamodel.utils.FileNameTransTask; import org.sleuthkit.autopsy.datamodel.utils.FileNameTransTask;
import org.sleuthkit.datamodel.AnalysisResult; import org.sleuthkit.datamodel.AnalysisResult;
import org.sleuthkit.datamodel.BlackboardArtifact.Category;
import org.sleuthkit.datamodel.Score; import org.sleuthkit.datamodel.Score;
/** /**
@ -109,17 +110,6 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
Case.Events.CR_COMMENT_CHANGED, Case.Events.CR_COMMENT_CHANGED,
Case.Events.CURRENT_CASE); Case.Events.CURRENT_CASE);
/*
* Artifact types for which the unique path of the artifact's source content
* should be displayed in the node's property sheet.
*/
private static final Integer[] SHOW_UNIQUE_PATH = new Integer[]{
BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID()
};
/* /*
* Artifact types for which the file metadata of the artifact's source file * Artifact types for which the file metadata of the artifact's source file
* should be displayed in the node's property sheet. * should be displayed in the node's property sheet.
@ -129,6 +119,7 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
}; };
private final BlackboardArtifact artifact; private final BlackboardArtifact artifact;
private final BlackboardArtifact.Type artifactType;
private Content srcContent; private Content srcContent;
private volatile String translatedSourceName; private volatile String translatedSourceName;
@ -237,6 +228,8 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
public BlackboardArtifactNode(BlackboardArtifact artifact, String iconPath) { public BlackboardArtifactNode(BlackboardArtifact artifact, String iconPath) {
super(artifact, createLookup(artifact, false)); super(artifact, createLookup(artifact, false));
this.artifact = artifact; this.artifact = artifact;
this.artifactType = getType(artifact);
for (Content lookupContent : this.getLookup().lookupAll(Content.class)) { for (Content lookupContent : this.getLookup().lookupAll(Content.class)) {
if ((lookupContent != null) && (!(lookupContent instanceof BlackboardArtifact))) { if ((lookupContent != null) && (!(lookupContent instanceof BlackboardArtifact))) {
srcContent = lookupContent; srcContent = lookupContent;
@ -278,6 +271,8 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
public BlackboardArtifactNode(BlackboardArtifact artifact, boolean lookupIsAssociatedFile) { public BlackboardArtifactNode(BlackboardArtifact artifact, boolean lookupIsAssociatedFile) {
super(artifact, createLookup(artifact, lookupIsAssociatedFile)); super(artifact, createLookup(artifact, lookupIsAssociatedFile));
this.artifact = artifact; this.artifact = artifact;
this.artifactType = getType(artifact);
try { try {
//The lookup for a file may or may not exist so we define the srcContent as the parent. //The lookup for a file may or may not exist so we define the srcContent as the parent.
srcContent = artifact.getParent(); srcContent = artifact.getParent();
@ -318,6 +313,20 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
this(artifact, IconsUtil.getIconFilePath(artifact.getArtifactTypeID())); this(artifact, IconsUtil.getIconFilePath(artifact.getArtifactTypeID()));
} }
/**
* Returns the artifact type of the artifact.
* @param artifact The artifact.
* @return The artifact type or null if no type could be retrieved.
*/
private static BlackboardArtifact.Type getType(BlackboardArtifact artifact) {
try {
return artifact.getType();
} catch (TskCoreException ex) {
logger.log(Level.WARNING, MessageFormat.format("Error getting the artifact type for artifact (artifact objID={0})", artifact.getId()), ex);
return null;
}
}
/** /**
* Creates a Lookup object for this node and populates it with both the * Creates a Lookup object for this node and populates it with both the
* artifact this node represents and its source content. * artifact this node represents and its source content.
@ -655,7 +664,7 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
* If the type of the artifact represented by this node dictates the * If the type of the artifact represented by this node dictates the
* addition of the source content's unique path, add it to the sheet. * addition of the source content's unique path, add it to the sheet.
*/ */
if (Arrays.asList(SHOW_UNIQUE_PATH).contains(artifactTypeId)) { if (artifactType != null && artifactType.getCategory() == Category.ANALYSIS_RESULT) {
String sourcePath = ""; //NON-NLS String sourcePath = ""; //NON-NLS
try { try {
sourcePath = srcContent.getUniquePath(); sourcePath = srcContent.getUniquePath();

View File

@ -228,7 +228,7 @@ public class HostNode extends DisplayableItemNode {
* @param hostGrouping The HostGrouping key. * @param hostGrouping The HostGrouping key.
*/ */
HostNode(HostGrouping hostGrouping) { HostNode(HostGrouping hostGrouping) {
this(Children.create(new HostGroupingChildren(HOST_GROUPING_CONVERTER, hostGrouping.getHost()), false), hostGrouping.getHost()); this(Children.create(new HostGroupingChildren(HOST_GROUPING_CONVERTER, hostGrouping.getHost()), true), hostGrouping.getHost());
} }
/** /**

View File

@ -33,6 +33,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeEvent;
@ -44,14 +45,11 @@ import javax.swing.SwingUtilities;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener; import javax.swing.event.PopupMenuListener;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.tree.TreeSelectionModel; import javax.swing.tree.TreeSelectionModel;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils; import org.openide.explorer.ExplorerUtils;
import org.openide.explorer.view.BeanTreeView; import org.openide.explorer.view.BeanTreeView;
import org.openide.explorer.view.Visualizer;
import org.openide.nodes.AbstractNode; import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children; import org.openide.nodes.Children;
import org.openide.nodes.Node; import org.openide.nodes.Node;
@ -126,6 +124,10 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
private static final String GROUPING_THRESHOLD_NAME = "GroupDataSourceThreshold"; private static final String GROUPING_THRESHOLD_NAME = "GroupDataSourceThreshold";
private static final String SETTINGS_FILE = "CasePreferences.properties"; //NON-NLS private static final String SETTINGS_FILE = "CasePreferences.properties"; //NON-NLS
// nodes to be opened if present at top level
private static final Set<String> NODES_TO_EXPAND = Stream.of(AnalysisResults.getName(), DataArtifacts.getName(), ViewsNode.NAME)
.collect(Collectors.toSet());
/** /**
* the constructor * the constructor
*/ */
@ -134,31 +136,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
// only allow one item to be selected at a time // only allow one item to be selected at a time
getTree().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); getTree().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
//Hook into the JTree and pre-expand the Views Node and Results node when a user
//expands an item in the tree that makes these nodes visible.
((ExpansionBeanTreeView) getTree()).addTreeExpansionListener(new TreeExpansionListener() {
@Override
public void treeExpanded(TreeExpansionEvent event) {
//Bail immediately if we are not in the Group By view.
//Assumption here is that the views are already expanded.
if (!CasePreferences.getGroupItemsInTreeByDataSource()) {
return;
}
Node expandedNode = Visualizer.findNode(event.getPath().getLastPathComponent());
for (Node child : em.getRootContext().getChildren().getNodes()) {
if (child.equals(expandedNode)) {
preExpandNodes(child.getChildren());
}
}
}
@Override
public void treeCollapsed(TreeExpansionEvent event) {
//Do nothing
}
});
// remove the close button // remove the close button
putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE); putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE);
setName(NbBundle.getMessage(DirectoryTreeTopComponent.class, "CTL_DirectoryTreeTopComponent")); setName(NbBundle.getMessage(DirectoryTreeTopComponent.class, "CTL_DirectoryTreeTopComponent"));
@ -201,30 +179,23 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat
*/ */
private void preExpandNodes(Children rootChildren) { private void preExpandNodes(Children rootChildren) {
BeanTreeView tree = getTree(); BeanTreeView tree = getTree();
for (String categoryKey : new String[]{AnalysisResults.getName(), DataArtifacts.getName()}) {
Node categoryNode = rootChildren.findChild(categoryKey);
if (!Objects.isNull(categoryNode)) { // using getNodes(true) to fetch children so that async nodes are loaded
tree.expandNode(categoryNode); Node[] rootChildrenNodes = rootChildren.getNodes(true);
Children resultsChildren = categoryNode.getChildren(); if (rootChildrenNodes == null || rootChildrenNodes.length < 1) {
Arrays.stream(resultsChildren.getNodes()).forEach(tree::expandNode); return;
}
}
Node views = rootChildren.findChild(ViewsNode.NAME);
if (!Objects.isNull(views)) {
tree.expandNode(views);
} }
// expand all nodes parents of and including hosts if group by host/person // expand all nodes parents of and including hosts if group by host/person
if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) { if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) {
Node[] rootNodes = rootChildren.getNodes(); Stream.of(rootChildrenNodes)
if (rootNodes != null) {
Stream.of(rootNodes)
.flatMap((n) -> getHostNodesAndParents(n).stream()) .flatMap((n) -> getHostNodesAndParents(n).stream())
.filter((n) -> n != null) .filter((n) -> n != null)
.forEach((n) -> tree.expandNode(n)); .forEach(tree::expandNode);
} } else {
Stream.of(rootChildrenNodes)
.filter(n -> n != null && NODES_TO_EXPAND.contains(n.getName()))
.forEach(tree::expandNode);
} }
} }

View File

@ -57,11 +57,11 @@
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/> <EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
<Component id="descLabel" min="-2" max="-2" attributes="0"/> <Component id="descLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/> <EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="jAllSetsCheckBox" min="-2" max="-2" attributes="0"/> <Component id="jAllSetsCheckBox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="jScrollPane1" min="-2" pref="164" max="-2" attributes="0"/> <Component id="jScrollPane1" pref="159" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="selectButton" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="selectButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="deselectButton" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="deselectButton" alignment="3" min="-2" max="-2" attributes="0"/>

View File

@ -299,10 +299,10 @@ class PortableCaseInterestingItemsListPanel extends javax.swing.JPanel {
.addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createSequentialGroup()
.addGap(6, 6, 6) .addGap(6, 6, 6)
.addComponent(descLabel) .addComponent(descLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jAllSetsCheckBox) .addComponent(jAllSetsCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

View File

@ -56,11 +56,11 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Component id="descLabel" min="-2" max="-2" attributes="0"/> <Component id="descLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/> <EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="jAllTagsCheckBox" min="-2" max="-2" attributes="0"/> <Component id="jAllTagsCheckBox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="jScrollPane1" min="-2" pref="168" max="-2" attributes="0"/> <Component id="jScrollPane1" pref="163" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
<Component id="selectButton" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="selectButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="deselectButton" alignment="3" min="-2" max="-2" attributes="0"/> <Component id="deselectButton" alignment="3" min="-2" max="-2" attributes="0"/>

View File

@ -331,10 +331,10 @@ class PortableCaseTagsListPanel extends javax.swing.JPanel {
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup() .addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(descLabel) .addComponent(descLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jAllTagsCheckBox) .addComponent(jAllTagsCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 168, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(selectButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

View File

@ -26,26 +26,25 @@
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="27" max="-2" attributes="0"/>
<Component id="tagsScrollPane" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="deselectAllButton" linkSize="1" max="32767" attributes="0"/>
<Component id="selectAllButton" linkSize="1" max="32767" attributes="0"/>
</Group>
</Group>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="allTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/> <Component id="allTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/>
<Component id="dataLabel" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="dataLabel" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="allResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="allResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="specificTaggedResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/> <Component id="specificTaggedResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="advancedButton" alignment="0" min="-2" max="-2" attributes="0"/> <Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="advancedButton" min="-2" max="-2" attributes="0"/>
<Group type="102" attributes="0">
<Component id="tagsScrollPane" pref="699" max="32767" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="deselectAllButton" linkSize="1" max="32767" attributes="0"/>
<Component id="selectAllButton" linkSize="1" max="32767" attributes="0"/>
</Group>
</Group>
</Group> </Group>
<EmptySpace min="0" pref="454" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
@ -55,15 +54,15 @@
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="dataLabel" min="-2" max="-2" attributes="0"/> <Component id="dataLabel" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/> <EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="allResultsRadioButton" min="-2" max="-2" attributes="0"/> <Component id="allResultsRadioButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="allTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/> <Component id="allTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="specificTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/> <Component id="specificTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/> <EmptySpace type="separate" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Component id="selectAllButton" min="-2" max="-2" attributes="0"/> <Component id="selectAllButton" min="-2" max="-2" attributes="0"/>
@ -72,14 +71,15 @@
<EmptySpace min="-2" pref="136" max="-2" attributes="0"/> <EmptySpace min="-2" pref="136" max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="1" attributes="0">
<Component id="tagsScrollPane" min="-2" pref="150" max="-2" attributes="0"/> <EmptySpace min="1" pref="1" max="-2" attributes="0"/>
<Component id="tagsScrollPane" max="32767" attributes="0"/>
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/> <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
<Component id="advancedButton" min="-2" max="-2" attributes="0"/> <Component id="advancedButton" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</Group>
</Group>
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
<SubComponents> <SubComponents>

View File

@ -365,22 +365,21 @@ final class ReportVisualPanel2 extends JPanel {
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(27, 27, 27)
.addComponent(tagsScrollPane)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(allTaggedResultsRadioButton) .addComponent(allTaggedResultsRadioButton)
.addComponent(dataLabel) .addComponent(dataLabel)
.addComponent(allResultsRadioButton) .addComponent(allResultsRadioButton)
.addComponent(specificTaggedResultsRadioButton) .addComponent(specificTaggedResultsRadioButton)
.addComponent(advancedButton)) .addGroup(layout.createSequentialGroup()
.addGap(0, 454, Short.MAX_VALUE))) .addGap(10, 10, 10)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(advancedButton)
.addGroup(layout.createSequentialGroup()
.addComponent(tagsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 699, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))))
.addContainerGap()) .addContainerGap())
); );
@ -397,7 +396,7 @@ final class ReportVisualPanel2 extends JPanel {
.addComponent(allTaggedResultsRadioButton) .addComponent(allTaggedResultsRadioButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(specificTaggedResultsRadioButton) .addComponent(specificTaggedResultsRadioButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addComponent(selectAllButton) .addComponent(selectAllButton)
@ -405,10 +404,11 @@ final class ReportVisualPanel2 extends JPanel {
.addComponent(deselectAllButton) .addComponent(deselectAllButton)
.addGap(136, 136, 136)) .addGap(136, 136, 136))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(tagsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(1, 1, 1)
.addComponent(tagsScrollPane)
.addGap(5, 5, 5) .addGap(5, 5, 5)
.addComponent(advancedButton) .addComponent(advancedButton)))
.addContainerGap()))) .addContainerGap())
); );
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents

View File

@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> <Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[834, 374]"/>
</Property>
</Properties>
<AuxValues> <AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>

View File

@ -155,6 +155,8 @@ class ReportWizardPortableCaseOptionsVisualPanel extends javax.swing.JPanel {
listPanel = new javax.swing.JPanel(); listPanel = new javax.swing.JPanel();
includeAppCheckbox = new javax.swing.JCheckBox(); includeAppCheckbox = new javax.swing.JCheckBox();
setPreferredSize(new java.awt.Dimension(834, 374));
chunkSizeComboBox.addActionListener(new java.awt.event.ActionListener() { chunkSizeComboBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) { public void actionPerformed(java.awt.event.ActionEvent evt) {
chunkSizeComboBoxActionPerformed(evt); chunkSizeComboBoxActionPerformed(evt);

View File

@ -49,18 +49,18 @@
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="jLabel1" min="-2" max="-2" attributes="0"/> <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/> <EmptySpace type="unrelated" min="-2" max="-2" attributes="0"/>
<Component id="jAllTagsCheckBox" min="-2" max="-2" attributes="0"/> <Component id="jAllTagsCheckBox" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<Component id="selectAllButton" min="-2" max="-2" attributes="0"/> <Component id="selectAllButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="deselectAllButton" min="-2" max="-2" attributes="0"/> <Component id="deselectAllButton" min="-2" max="-2" attributes="0"/>
</Group> </Group>
<Component id="jScrollPane1" min="-2" pref="112" max="-2" attributes="0"/> <Component id="jScrollPane1" pref="112" max="32767" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="jLabel2" min="-2" max="-2" attributes="0"/> <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="4" max="-2" attributes="0"/> <EmptySpace min="-2" pref="4" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0"> <Group type="103" groupAlignment="3" attributes="0">
@ -87,7 +87,7 @@
</Property> </Property>
</Properties> </Properties>
<AuxValues> <AuxValues>
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;String&gt;"/> <AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;TagName&gt;"/>
</AuxValues> </AuxValues>
</Component> </Component>
</SubComponents> </SubComponents>

View File

@ -322,7 +322,7 @@ class SaveTaggedHashesToHashDbConfigPanel extends javax.swing.JPanel {
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addComponent(jLabel1) .addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jAllTagsCheckBox) .addComponent(jAllTagsCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -330,7 +330,7 @@ class SaveTaggedHashesToHashDbConfigPanel extends javax.swing.JPanel {
.addComponent(selectAllButton) .addComponent(selectAllButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(deselectAllButton)) .addComponent(deselectAllButton))
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 112, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2) .addComponent(jLabel2)
.addGap(4, 4, 4) .addGap(4, 4, 4)