19 package org.sleuthkit.autopsy.centralrepository.contentviewer;
 
   22 import java.awt.Color;
 
   24 import java.util.ArrayList;
 
   26 import java.util.HashMap;
 
   27 import java.util.HashSet;
 
   28 import java.util.List;
 
   30 import java.util.logging.Level;
 
   31 import org.openide.util.NbBundle.Messages;
 
   41 final class OccurrencePanel 
extends javax.swing.JPanel {
 
   43     private static final Logger LOGGER = Logger.getLogger(OccurrencePanel.class.getName());
 
   44     private static final int LEFT_INSET = 10;
 
   45     private static final int RIGHT_INSET = 10;
 
   46     private static final int TOP_INSET = 10;
 
   47     private static final int BOTTOM_INSET = 10;
 
   48     private static final int VERTICAL_GAP = 6;
 
   49     private static final int HORIZONTAL_GAP = 4;
 
   50     private static final long serialVersionUID = 1L;
 
   52     private int gridY = 0;
 
   53     private final List<NodeData> nodeDataList;
 
   54     private final Map<String, String> caseNamesAndDates = 
new HashMap<>();
 
   55     private final Set<String> dataSourceNames = 
new HashSet<>();
 
   56     private final Set<String> filePaths = 
new HashSet<>();
 
   62         nodeDataList = 
new ArrayList<>();
 
   63         customizeComponents();
 
   72     OccurrencePanel(String caseName, String caseCreatedDate) {
 
   73         nodeDataList = 
new ArrayList<>();
 
   74         caseNamesAndDates.put(caseName, caseCreatedDate);
 
   75         customizeComponents();
 
   86     OccurrencePanel(String caseName, String caseCreatedDate, String dataSourceName) {
 
   87         nodeDataList = 
new ArrayList<>();
 
   88         caseNamesAndDates.put(caseName, caseCreatedDate);
 
   89         dataSourceNames.add(dataSourceName);
 
   90         customizeComponents();
 
  100     OccurrencePanel(List<NodeData> nodeDataList) {
 
  101         this.nodeDataList = nodeDataList;
 
  102         customizeComponents();
 
  109     private void customizeComponents() {
 
  111         if (!this.nodeDataList.isEmpty()) {
 
  115             addInstanceDetails();
 
  116             if (!filePaths.isEmpty()) {
 
  120         if (!dataSourceNames.isEmpty()) {
 
  121             addDataSourceDetails();
 
  123         if (!caseNamesAndDates.keySet().isEmpty()) {
 
  127         addItemToBag(gridY, 0, 0, 0, 
new javax.swing.Box.Filler(
new java.awt.Dimension(0, 0), 
new java.awt.Dimension(0, 0), 
new java.awt.Dimension(0, 32767)));
 
  131         "OccurrencePanel.commonProperties.text=Common Properties",
 
  132         "OccurrencePanel.commonPropertyTypeLabel.text=Type:",
 
  133         "OccurrencePanel.commonPropertyValueLabel.text=Value:",
 
  134         "OccurrencePanel.commonPropertyKnownStatusLabel.text=Known Status:",
 
  135         "OccurrencePanel.commonPropertyCommentLabel.text=Comment:" 
  144     private void addInstanceDetails() {
 
  145         javax.swing.JLabel commonPropertiesLabel = 
new javax.swing.JLabel();
 
  146         org.openide.awt.Mnemonics.setLocalizedText(commonPropertiesLabel, Bundle.OccurrencePanel_commonProperties_text());
 
  147         commonPropertiesLabel.setFont(commonPropertiesLabel.getFont().deriveFont(Font.BOLD, commonPropertiesLabel.getFont().getSize()));
 
  148         addItemToBag(gridY, 0, TOP_INSET, 0, commonPropertiesLabel);
 
  151         for (NodeData occurrence : nodeDataList) {
 
  152             if (occurrence instanceof NodeData) {
 
  153                 String type = occurrence.getType();
 
  154                 if (!type.isEmpty()) {
 
  155                     javax.swing.JLabel typeLabel = 
new javax.swing.JLabel();
 
  156                     org.openide.awt.Mnemonics.setLocalizedText(typeLabel, Bundle.OccurrencePanel_commonPropertyTypeLabel_text());
 
  157                     addItemToBag(gridY, 0, VERTICAL_GAP, 0, typeLabel);
 
  158                     javax.swing.JLabel typeFieldValue = 
new javax.swing.JLabel();
 
  159                     typeFieldValue.setText(type);
 
  160                     addItemToBag(gridY, 1, VERTICAL_GAP, 0, typeFieldValue);
 
  163                 String value = occurrence.getValue();
 
  164                 if (!value.isEmpty()) {
 
  165                     javax.swing.JLabel valueLabel = 
new javax.swing.JLabel();
 
  166                     org.openide.awt.Mnemonics.setLocalizedText(valueLabel, Bundle.OccurrencePanel_commonPropertyValueLabel_text());
 
  167                     addItemToBag(gridY, 0, 0, 0, valueLabel);
 
  168                     javax.swing.JLabel valueFieldValue = 
new javax.swing.JLabel();
 
  169                     valueFieldValue.setText(value);
 
  170                     addItemToBag(gridY, 1, 0, 0, valueFieldValue);
 
  173                 TskData.FileKnown knownStatus = occurrence.getKnown();
 
  174                 javax.swing.JLabel knownStatusLabel = 
new javax.swing.JLabel();
 
  175                 org.openide.awt.Mnemonics.setLocalizedText(knownStatusLabel, Bundle.OccurrencePanel_commonPropertyKnownStatusLabel_text());
 
  176                 addItemToBag(gridY, 0, 0, 0, knownStatusLabel);
 
  177                 javax.swing.JLabel knownStatusValue = 
new javax.swing.JLabel();
 
  178                 knownStatusValue.setText(knownStatus.getName());
 
  179                 if (knownStatus == TskData.FileKnown.BAD) {
 
  180                     knownStatusValue.setForeground(Color.RED);
 
  182                 addItemToBag(gridY, 1, 0, 0, knownStatusValue);
 
  184                 String comment = occurrence.getComment();
 
  185                 if (!comment.isEmpty()) {
 
  186                     javax.swing.JLabel commentLabel = 
new javax.swing.JLabel();
 
  187                     org.openide.awt.Mnemonics.setLocalizedText(commentLabel, Bundle.OccurrencePanel_commonPropertyCommentLabel_text());
 
  188                     addItemToBag(gridY, 0, 0, VERTICAL_GAP, commentLabel);
 
  189                     javax.swing.JTextArea commentValue = 
new javax.swing.JTextArea();
 
  190                     commentValue.setText(comment);
 
  191                     commentValue.setEditable(
false);
 
  192                     commentValue.setColumns(20);
 
  193                     commentValue.setLineWrap(
true);
 
  194                     commentValue.setRows(3);
 
  195                     commentValue.setTabSize(4);
 
  196                     commentValue.setWrapStyleWord(
true);
 
  197                     commentValue.setBorder(javax.swing.BorderFactory.createEtchedBorder());
 
  198                     commentValue.setBackground(javax.swing.UIManager.getDefaults().getColor(
"TextArea.disabledBackground"));
 
  199                     addItemToBag(gridY, 1, 0, VERTICAL_GAP, commentValue);
 
  202                 String caseDate = 
"";
 
  204                     if (CentralRepository.isEnabled()) {
 
  205                         CorrelationCase partialCase = occurrence.getCorrelationAttributeInstance().getCorrelationCase();
 
  206                         caseDate = CentralRepository.getInstance().getCaseByUUID(partialCase.getCaseUUID()).getCreationDate();
 
  208                 } 
catch (CentralRepoException ex) {
 
  209                     LOGGER.log(Level.WARNING, 
"Error getting case created date for other occurrence content viewer", ex);
 
  212                 caseNamesAndDates.put(occurrence.getCaseName(), caseDate);
 
  213                 dataSourceNames.add(occurrence.getDataSourceName());
 
  214                 filePaths.add(occurrence.getFilePath());
 
  221         "OccurrencePanel.fileDetails.text=File Details",
 
  222         "OccurrencePanel.filePathLabel.text=File Path:" 
  227     private void addFileDetails() {
 
  228         String filePath = filePaths.size() > 1 ? 
"" : filePaths.iterator().next();
 
  229         if (!filePath.isEmpty()) {
 
  230             javax.swing.JLabel fileDetailsLabel = 
new javax.swing.JLabel();
 
  231             org.openide.awt.Mnemonics.setLocalizedText(fileDetailsLabel, Bundle.OccurrencePanel_fileDetails_text());
 
  232             fileDetailsLabel.setFont(fileDetailsLabel.getFont().deriveFont(Font.BOLD, fileDetailsLabel.getFont().getSize()));
 
  233             addItemToBag(gridY, 0, TOP_INSET, 0, fileDetailsLabel);
 
  235             javax.swing.JLabel filePathLabel = 
new javax.swing.JLabel();
 
  236             org.openide.awt.Mnemonics.setLocalizedText(filePathLabel, Bundle.OccurrencePanel_filePathLabel_text());
 
  237             addItemToBag(gridY, 0, VERTICAL_GAP, VERTICAL_GAP, filePathLabel);
 
  238             javax.swing.JTextArea filePathValue = 
new javax.swing.JTextArea();
 
  239             filePathValue.setText(filePath);
 
  240             filePathValue.setEditable(
false);
 
  241             filePathValue.setColumns(20);
 
  242             filePathValue.setLineWrap(
true);
 
  243             filePathValue.setRows(3);
 
  244             filePathValue.setTabSize(4);
 
  245             filePathValue.setWrapStyleWord(
true);
 
  246             filePathValue.setBorder(javax.swing.BorderFactory.createEtchedBorder());
 
  247             filePathValue.setBackground(javax.swing.UIManager.getDefaults().getColor(
"TextArea.disabledBackground"));
 
  248             addItemToBag(gridY, 1, VERTICAL_GAP, VERTICAL_GAP, filePathValue);
 
  254         "OccurrencePanel.dataSourceDetails.text=Data Source Details",
 
  255         "OccurrencePanel.dataSourceNameLabel.text=Name:" 
  261     private void addDataSourceDetails() {
 
  262         String dataSourceName = dataSourceNames.size() > 1 ? 
"" : dataSourceNames.iterator().next();
 
  263         if (!dataSourceName.isEmpty()) {
 
  264             javax.swing.JLabel dataSourceDetailsLabel = 
new javax.swing.JLabel();
 
  265             org.openide.awt.Mnemonics.setLocalizedText(dataSourceDetailsLabel, Bundle.OccurrencePanel_dataSourceDetails_text());
 
  266             dataSourceDetailsLabel.setFont(dataSourceDetailsLabel.getFont().deriveFont(Font.BOLD, dataSourceDetailsLabel.getFont().getSize()));
 
  267             addItemToBag(gridY, 0, TOP_INSET, 0, dataSourceDetailsLabel);
 
  269             javax.swing.JLabel dataSourceNameLabel = 
new javax.swing.JLabel();
 
  270             org.openide.awt.Mnemonics.setLocalizedText(dataSourceNameLabel, Bundle.OccurrencePanel_dataSourceNameLabel_text());
 
  271             addItemToBag(gridY, 0, VERTICAL_GAP, VERTICAL_GAP, dataSourceNameLabel);
 
  272             javax.swing.JLabel dataSourceNameValue = 
new javax.swing.JLabel();
 
  273             dataSourceNameValue.setText(dataSourceName);
 
  274             addItemToBag(gridY, 1, VERTICAL_GAP, VERTICAL_GAP, dataSourceNameValue);
 
  280         "OccurrencePanel.caseDetails.text=Case Details",
 
  281         "OccurrencePanel.caseNameLabel.text=Name:",
 
  282         "OccurrencePanel.caseCreatedDateLabel.text=Created Date:" 
  287     private void addCaseDetails() {
 
  288         javax.swing.JLabel caseDetailsLabel = 
new javax.swing.JLabel();
 
  289         org.openide.awt.Mnemonics.setLocalizedText(caseDetailsLabel, Bundle.OccurrencePanel_caseDetails_text());
 
  290         caseDetailsLabel.setFont(caseDetailsLabel.getFont().deriveFont(Font.BOLD, caseDetailsLabel.getFont().getSize()));
 
  291         addItemToBag(gridY, 0, TOP_INSET, 0, caseDetailsLabel);
 
  293         String caseName = caseNamesAndDates.keySet().size() > 1 ? 
"" : caseNamesAndDates.keySet().iterator().next();
 
  294         if (!caseName.isEmpty()) {
 
  295             javax.swing.JLabel caseNameLabel = 
new javax.swing.JLabel();
 
  296             org.openide.awt.Mnemonics.setLocalizedText(caseNameLabel, Bundle.OccurrencePanel_caseNameLabel_text());
 
  297             addItemToBag(gridY, 0, VERTICAL_GAP, 0, caseNameLabel);
 
  298             javax.swing.JLabel caseNameValue = 
new javax.swing.JLabel();
 
  299             caseNameValue.setText(caseName);
 
  300             addItemToBag(gridY, 1, VERTICAL_GAP, 0, caseNameValue);
 
  303         String caseCreatedDate = caseNamesAndDates.keySet().size() > 1 ? 
"" : caseNamesAndDates.get(caseName);
 
  304         if (caseCreatedDate != null && !caseCreatedDate.isEmpty()) {
 
  305             javax.swing.JLabel caseCreatedLabel = 
new javax.swing.JLabel();
 
  306             org.openide.awt.Mnemonics.setLocalizedText(caseCreatedLabel, Bundle.OccurrencePanel_caseCreatedDateLabel_text());
 
  307             addItemToBag(gridY, 0, 0, BOTTOM_INSET, caseCreatedLabel);
 
  308             javax.swing.JLabel caseCreatedValue = 
new javax.swing.JLabel();
 
  309             caseCreatedValue.setText(caseCreatedDate);
 
  310             addItemToBag(gridY, 1, 0, BOTTOM_INSET, caseCreatedValue);
 
  325     private void addItemToBag(
int gridYLocation, 
int gridXLocation, 
int topInset, 
int bottomInset, javax.swing.JComponent item) {
 
  326         java.awt.GridBagConstraints gridBagConstraints;
 
  327         gridBagConstraints = 
new java.awt.GridBagConstraints();
 
  328         gridBagConstraints.gridx = gridXLocation;
 
  329         gridBagConstraints.gridy = gridYLocation;
 
  330         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 
  331         gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
 
  332         int leftInset = LEFT_INSET;
 
  333         int rightInset = HORIZONTAL_GAP;
 
  335         if (gridXLocation == 1) {
 
  337             rightInset = RIGHT_INSET;
 
  338             gridBagConstraints.weightx = 0.1;
 
  339             gridBagConstraints.gridwidth = 2;
 
  341         gridBagConstraints.insets = 
new java.awt.Insets(topInset, leftInset, bottomInset, rightInset);
 
  343         if (item instanceof javax.swing.Box.Filler) {
 
  344             gridBagConstraints.weighty = 0.1;
 
  346         add(item, gridBagConstraints);
 
  354     @SuppressWarnings(
"unchecked")
 
  356     private 
void initComponents() {
 
  358         setMinimumSize(
new java.awt.Dimension(50, 30));
 
  359         setPreferredSize(null);
 
  360         setLayout(
new java.awt.GridBagLayout());