mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-14 17:06:16 +00:00
Merge pull request #5906 from ethteck/6380-personas-view
6380 Groundwork for persona editing / creating, viewing functional
This commit is contained in:
commit
10663e9c25
@ -44,6 +44,7 @@ EamDbUtil.centralRepoConnectionFailed.message=Unable to connect to Central Repos
|
|||||||
EamDbUtil.centralRepoDisabled.message=\ The Central Repository has been disabled.
|
EamDbUtil.centralRepoDisabled.message=\ The Central Repository has been disabled.
|
||||||
EamDbUtil.centralRepoUpgradeFailed.message=Failed to upgrade Central Repository.
|
EamDbUtil.centralRepoUpgradeFailed.message=Failed to upgrade Central Repository.
|
||||||
EamDbUtil.exclusiveLockAquisitionFailure.message=Unable to acquire exclusive lock for Central Repository.
|
EamDbUtil.exclusiveLockAquisitionFailure.message=Unable to acquire exclusive lock for Central Repository.
|
||||||
|
Persona.defaultName=Unnamed
|
||||||
PostgresEamDb.centralRepoDisabled.message=Central Repository module is not enabled.
|
PostgresEamDb.centralRepoDisabled.message=Central Repository module is not enabled.
|
||||||
PostgresEamDb.connectionFailed.message=Error getting connection to database.
|
PostgresEamDb.connectionFailed.message=Error getting connection to database.
|
||||||
PostgresEamDb.multiUserLockError.message=Error acquiring database lock
|
PostgresEamDb.multiUserLockError.message=Error acquiring database lock
|
||||||
|
@ -27,6 +27,7 @@ import java.util.Collections;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.openide.util.NbBundle;
|
||||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -114,9 +115,6 @@ public class Persona {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Persona name to use if no name is specified.
|
|
||||||
private static final String DEFAULT_PERSONA_NAME = "Unknown";
|
|
||||||
|
|
||||||
// primary key in the Personas table in CR database
|
// primary key in the Personas table in CR database
|
||||||
private final long id;
|
private final long id;
|
||||||
private final String uuidStr;
|
private final String uuidStr;
|
||||||
@ -126,6 +124,11 @@ public class Persona {
|
|||||||
private final long modifiedDate;
|
private final long modifiedDate;
|
||||||
private final PersonaStatus status;
|
private final PersonaStatus status;
|
||||||
private final CentralRepoExaminer examiner;
|
private final CentralRepoExaminer examiner;
|
||||||
|
|
||||||
|
@NbBundle.Messages("Persona.defaultName=Unnamed")
|
||||||
|
public static String getDefaultName() {
|
||||||
|
return Bundle.Persona_defaultName();
|
||||||
|
}
|
||||||
|
|
||||||
public long getId() {
|
public long getId() {
|
||||||
return id;
|
return id;
|
||||||
@ -240,7 +243,7 @@ public class Persona {
|
|||||||
String insertClause = " INTO personas (uuid, comment, name, created_date, modified_date, status_id, examiner_id ) "
|
String insertClause = " INTO personas (uuid, comment, name, created_date, modified_date, status_id, examiner_id ) "
|
||||||
+ "VALUES ( '" + uuidStr + "', "
|
+ "VALUES ( '" + uuidStr + "', "
|
||||||
+ "'" + ((StringUtils.isBlank(comment) ? "" : SleuthkitCase.escapeSingleQuotes(comment))) + "',"
|
+ "'" + ((StringUtils.isBlank(comment) ? "" : SleuthkitCase.escapeSingleQuotes(comment))) + "',"
|
||||||
+ "'" + ((StringUtils.isBlank(name) ? DEFAULT_PERSONA_NAME : SleuthkitCase.escapeSingleQuotes(name))) + "',"
|
+ "'" + ((StringUtils.isBlank(name) ? getDefaultName() : SleuthkitCase.escapeSingleQuotes(name))) + "',"
|
||||||
+ timeStampMillis.toString() + ","
|
+ timeStampMillis.toString() + ","
|
||||||
+ timeStampMillis.toString() + ","
|
+ timeStampMillis.toString() + ","
|
||||||
+ status.getStatusId() + ","
|
+ status.getStatusId() + ","
|
||||||
|
@ -0,0 +1,104 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
<Property name="resizable" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
<SyntheticProperties>
|
||||||
|
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||||
|
<SyntheticProperty name="generateCenter" type="boolean" value="false"/>
|
||||||
|
</SyntheticProperties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="okBtn" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="cancelBtn" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="3" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="settingsPanel" alignment="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="settingsPanel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="okBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="cancelBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="settingsPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||||
|
<Border info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo">
|
||||||
|
<EtchetBorder/>
|
||||||
|
</Border>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="492" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="213" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JButton" name="cancelBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="AddAccountDialog.cancelBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[79, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[79, 23]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[79, 23]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelBtnActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="okBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="AddAccountDialog.okBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okBtnActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -0,0 +1,209 @@
|
|||||||
|
/*
|
||||||
|
* Central Repository
|
||||||
|
*
|
||||||
|
* Copyright 2020 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.centralrepository.persona;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import javax.swing.JDialog;
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JList;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
import javax.swing.ListCellRenderer;
|
||||||
|
import org.openide.util.NbBundle.Messages;
|
||||||
|
import org.openide.windows.WindowManager;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount.CentralRepoAccountType;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration dialog for adding an account to a persona.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("PMD.SingularField") // UI widgets cause lots of false positives
|
||||||
|
public class AddAccountDialog extends JDialog {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(AddAccountDialog.class.getName());
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private final TypeChoiceRenderer TYPE_CHOICE_RENDERER = new TypeChoiceRenderer();
|
||||||
|
private final PersonaDetailsPanel pdp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new add account dialog
|
||||||
|
*/
|
||||||
|
@Messages({"AddAccountDialog.title.text=Add Account",})
|
||||||
|
public AddAccountDialog(PersonaDetailsPanel pdp) {
|
||||||
|
super((JFrame) WindowManager.getDefault().getMainWindow(),
|
||||||
|
Bundle.AddAccountDialog_title_text(),
|
||||||
|
true);
|
||||||
|
this.pdp = pdp;
|
||||||
|
|
||||||
|
initComponents();
|
||||||
|
//typeComboBox.setRenderer(TYPE_CHOICE_RENDERER);
|
||||||
|
display();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class handles displaying and rendering drop down menu for account type choices
|
||||||
|
*/
|
||||||
|
private class TypeChoiceRenderer extends JLabel implements ListCellRenderer<CentralRepoAccountType>, Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component getListCellRendererComponent(
|
||||||
|
JList<? extends CentralRepoAccountType> list, CentralRepoAccountType value,
|
||||||
|
int index, boolean isSelected, boolean cellHasFocus) {
|
||||||
|
setText(value.getAcctType().getDisplayName());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Messages({
|
||||||
|
"AddAccountDialog_get_types_exception_Title=Central Repository failure",
|
||||||
|
"AddAccountDialog_get_types_exception_msg=Failed to access central repository",
|
||||||
|
})
|
||||||
|
private CentralRepoAccountType[] getAllAccountTypes() {
|
||||||
|
CentralRepoAccountType[] ret = new CentralRepoAccountType[0];
|
||||||
|
try {
|
||||||
|
ret = CentralRepository.getInstance().getAllAccountTypes().toArray(new CentralRepoAccountType[0]);
|
||||||
|
} catch (CentralRepoException e) {
|
||||||
|
logger.log(Level.SEVERE, "Failed to access central repository", e);
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
Bundle.AddAccountDialog_get_types_exception_Title(),
|
||||||
|
Bundle.AddAccountDialog_get_types_exception_msg(),
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called from within the constructor to initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
|
* regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
settingsPanel = new javax.swing.JPanel();
|
||||||
|
cancelBtn = new javax.swing.JButton();
|
||||||
|
okBtn = new javax.swing.JButton();
|
||||||
|
|
||||||
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
setResizable(false);
|
||||||
|
|
||||||
|
settingsPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
|
||||||
|
|
||||||
|
javax.swing.GroupLayout settingsPanelLayout = new javax.swing.GroupLayout(settingsPanel);
|
||||||
|
settingsPanel.setLayout(settingsPanelLayout);
|
||||||
|
settingsPanelLayout.setHorizontalGroup(
|
||||||
|
settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 492, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
settingsPanelLayout.setVerticalGroup(
|
||||||
|
settingsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 213, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(cancelBtn, org.openide.util.NbBundle.getMessage(AddAccountDialog.class, "AddAccountDialog.cancelBtn.text")); // NOI18N
|
||||||
|
cancelBtn.setMaximumSize(new java.awt.Dimension(79, 23));
|
||||||
|
cancelBtn.setMinimumSize(new java.awt.Dimension(79, 23));
|
||||||
|
cancelBtn.setPreferredSize(new java.awt.Dimension(79, 23));
|
||||||
|
cancelBtn.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
cancelBtnActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(okBtn, org.openide.util.NbBundle.getMessage(AddAccountDialog.class, "AddAccountDialog.okBtn.text")); // NOI18N
|
||||||
|
okBtn.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
okBtnActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||||
|
getContentPane().setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE)
|
||||||
|
.addComponent(okBtn)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(cancelBtn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(3, 3, 3))
|
||||||
|
.addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
|
||||||
|
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {cancelBtn, okBtn});
|
||||||
|
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addComponent(settingsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(okBtn)
|
||||||
|
.addComponent(cancelBtn, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void display() {
|
||||||
|
this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
|
||||||
|
setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Messages({
|
||||||
|
"AddAccountDialog_validate_id_failure_title=Account ID issue",
|
||||||
|
"AddAccountDialog_validate_id_failure=Account ID must not be empty",
|
||||||
|
})
|
||||||
|
private boolean validateFields() {
|
||||||
|
/*if (idTextField.getText().isEmpty()) {
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
Bundle.AddAccountDialog_validate_id_failure(),
|
||||||
|
Bundle.AddAccountDialog_validate_id_failure_title(),
|
||||||
|
JOptionPane.WARNING_MESSAGE);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void okBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okBtnActionPerformed
|
||||||
|
if (validateFields()) {
|
||||||
|
dispose();
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_okBtnActionPerformed
|
||||||
|
|
||||||
|
private void cancelBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelBtnActionPerformed
|
||||||
|
dispose();
|
||||||
|
}//GEN-LAST:event_cancelBtnActionPerformed
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JButton cancelBtn;
|
||||||
|
private javax.swing.JButton okBtn;
|
||||||
|
private javax.swing.JPanel settingsPanel;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
CTL_OpenPersonaManager=Persona Manager
|
||||||
|
CTL_PersonaManagerTopComponentAction=Persona Manager
|
||||||
|
CTL_PersonaDetailsTopComponent=Persona Details
|
||||||
|
PersonaManagerTopComponent.createBtn.text=Create New
|
||||||
|
PersonaManagerTopComponent.searchBtn.text=Search
|
||||||
|
PersonaManagerTopComponent.resultsTable.columnModel.title1=Name
|
||||||
|
PersonaManagerTopComponent.resultsTable.columnModel.title0=ID
|
||||||
|
PersonaManagerTopComponent.resultsTable.toolTipText=
|
||||||
|
PersonaManagerTopComponent.searchAccountRadio.text=Account
|
||||||
|
PersonaManagerTopComponent.searchNameRadio.text=Name
|
||||||
|
PersonaManagerTopComponent.searchField.text=
|
||||||
|
PersonaDetailsPanel.deleteMetadataBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addMetadataBtn.text=Add
|
||||||
|
PersonaDetailsPanel.metadataLabel.text=Metadata:
|
||||||
|
PersonaDetailsPanel.deleteAccountBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addAccountBtn.text=Add
|
||||||
|
PersonaDetailsPanel.accountsLbl.text=Accounts:
|
||||||
|
PersonaDetailsPanel.nameField.text=
|
||||||
|
PersonaDetailsPanel.saveBtn.toolTipText=
|
||||||
|
PersonaDetailsPanel.saveBtn.text=Save Changes
|
||||||
|
PersonaDetailsPanel.nameLbl.text=Name:
|
||||||
|
PersonaDetailsPanel.deleteCaseBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addCaseBtn.text=Add
|
||||||
|
PersonaDetailsPanel.casesLbl.text=Cases found in:
|
||||||
|
PersonaDetailsPanel.deleteAliasBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addAliasBtn.text=Add
|
||||||
|
PersonaDetailsPanel.aliasesLabel.text=Aliases:
|
||||||
|
AddAccountDialog.cancelBtn.text=Cancel
|
||||||
|
AddAccountDialog.okBtn.text=OK
|
||||||
|
PersonaManagerTopComponent.editBtn.text=Edit
|
@ -0,0 +1,44 @@
|
|||||||
|
AddAccountDialog.title.text=Add Account
|
||||||
|
AddAccountDialog_get_types_exception_msg=Failed to access central repository
|
||||||
|
AddAccountDialog_get_types_exception_Title=Central Repository failure
|
||||||
|
AddAccountDialog_validate_id_failure=Account ID must not be empty
|
||||||
|
AddAccountDialog_validate_id_failure_title=Account ID issue
|
||||||
|
CTL_OpenPersonaManager=Persona Manager
|
||||||
|
CTL_PersonaManagerTopComponentAction=Persona Manager
|
||||||
|
CTL_PersonaDetailsTopComponent=Persona Details
|
||||||
|
OpenPersonasAction.displayName=Persona Manager
|
||||||
|
PersonaDetailsPanel_load_exception_msg=Failed to load persona
|
||||||
|
PersonaDetailsPanel_load_exception_Title=Initialization failure
|
||||||
|
PersonaDetailsPanel_NameCreate=Create Persona
|
||||||
|
PersonaDetailsPanel_NameEdit=Edit Persona
|
||||||
|
PersonaDetailsPanel_NameView=View Persona
|
||||||
|
PersonaManagerTopComponent.createBtn.text=Create New
|
||||||
|
PersonaManagerTopComponent.searchBtn.text=Search
|
||||||
|
PersonaManagerTopComponent.resultsTable.columnModel.title1=Name
|
||||||
|
PersonaManagerTopComponent.resultsTable.columnModel.title0=ID
|
||||||
|
PersonaManagerTopComponent.resultsTable.toolTipText=
|
||||||
|
PersonaManagerTopComponent.searchAccountRadio.text=Account
|
||||||
|
PersonaManagerTopComponent.searchNameRadio.text=Name
|
||||||
|
PersonaManagerTopComponent.searchField.text=
|
||||||
|
PersonaDetailsPanel.deleteMetadataBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addMetadataBtn.text=Add
|
||||||
|
PersonaDetailsPanel.metadataLabel.text=Metadata:
|
||||||
|
PersonaDetailsPanel.deleteAccountBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addAccountBtn.text=Add
|
||||||
|
PersonaDetailsPanel.accountsLbl.text=Accounts:
|
||||||
|
PersonaDetailsPanel.nameField.text=
|
||||||
|
PersonaDetailsPanel.saveBtn.toolTipText=
|
||||||
|
PersonaDetailsPanel.saveBtn.text=Save Changes
|
||||||
|
PersonaDetailsPanel.nameLbl.text=Name:
|
||||||
|
PersonaDetailsPanel.deleteCaseBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addCaseBtn.text=Add
|
||||||
|
PersonaDetailsPanel.casesLbl.text=Cases found in:
|
||||||
|
PersonaDetailsPanel.deleteAliasBtn.text=Delete
|
||||||
|
PersonaDetailsPanel.addAliasBtn.text=Add
|
||||||
|
PersonaDetailsPanel.aliasesLabel.text=Aliases:
|
||||||
|
AddAccountDialog.cancelBtn.text=Cancel
|
||||||
|
AddAccountDialog.okBtn.text=OK
|
||||||
|
PersonaManagerTopComponent.editBtn.text=Edit
|
||||||
|
PMTopComponent_Name=Persona Manager
|
||||||
|
PMTopComponent_search_exception_msg=Failed to search personas
|
||||||
|
PMTopComponent_search_exception_Title=Search failure
|
@ -0,0 +1,2 @@
|
|||||||
|
AddAccountDialog.cancelBtn.text=\u53d6\u308a\u6d88\u3057
|
||||||
|
AddAccountDialog.okBtn.text=OK
|
@ -16,7 +16,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.sleuthkit.autopsy.persona;
|
package org.sleuthkit.autopsy.centralrepository.persona;
|
||||||
|
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.JMenuItem;
|
||||||
import org.openide.awt.ActionID;
|
import org.openide.awt.ActionID;
|
||||||
@ -28,33 +28,33 @@ import org.openide.util.NbBundle;
|
|||||||
import org.openide.util.actions.CallableSystemAction;
|
import org.openide.util.actions.CallableSystemAction;
|
||||||
import org.openide.windows.TopComponent;
|
import org.openide.windows.TopComponent;
|
||||||
import org.openide.windows.WindowManager;
|
import org.openide.windows.WindowManager;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepository;
|
||||||
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An Action that opens the Personas window.
|
* An Action that opens the Persona Search window.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.persona.Personas")
|
@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.centralrepository.persona.OpenPersonaManagerAction")
|
||||||
@ActionRegistration(displayName = "#CTL_OpenPersonas", lazy = false)
|
@ActionRegistration(displayName = "#CTL_OpenPersonaManager", lazy = false)
|
||||||
@ActionReferences(value = {
|
@ActionReferences(value = {
|
||||||
@ActionReference(path = "Menu/Tools", position = 105)
|
@ActionReference(path = "Menu/Tools", position = 105)
|
||||||
})
|
})
|
||||||
public final class OpenPersonasAction extends CallableSystemAction {
|
public final class OpenPersonaManagerAction extends CallableSystemAction {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final JMenuItem menuItem;
|
private final JMenuItem menuItem;
|
||||||
|
|
||||||
|
public OpenPersonaManagerAction() {
|
||||||
public OpenPersonasAction() {
|
|
||||||
menuItem = super.getMenuPresenter();
|
menuItem = super.getMenuPresenter();
|
||||||
this.setEnabled(true);
|
this.setEnabled(CentralRepository.isEnabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
|
||||||
public void performAction() {
|
public void performAction() {
|
||||||
final TopComponent topComponent = WindowManager.getDefault().findTopComponent("PersonasTopComponent");
|
final TopComponent topComponent = WindowManager.getDefault().findTopComponent("PersonaManagerTopComponent");
|
||||||
if (topComponent != null) {
|
if (topComponent != null) {
|
||||||
if (topComponent.isOpened() == false) {
|
if (topComponent.isOpened() == false) {
|
||||||
topComponent.open();
|
topComponent.open();
|
||||||
@ -65,7 +65,7 @@ public final class OpenPersonasAction extends CallableSystemAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NbBundle.Messages("OpenPersonasAction.displayName=Personas")
|
@NbBundle.Messages("OpenPersonasAction.displayName=Persona Manager")
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return Bundle.OpenPersonasAction_displayName();
|
return Bundle.OpenPersonasAction_displayName();
|
||||||
}
|
}
|
||||||
@ -85,6 +85,11 @@ public final class OpenPersonasAction extends CallableSystemAction {
|
|||||||
super.setEnabled(enable);
|
super.setEnabled(enable);
|
||||||
menuItem.setEnabled(enable);
|
menuItem.setEnabled(enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return CentralRepository.isEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JMenuItem getMenuPresenter() {
|
public JMenuItem getMenuPresenter() {
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2020 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.centralrepository.persona;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An enum that represents the mode for the persona details panel
|
||||||
|
*/
|
||||||
|
|
||||||
|
public enum PersonaDetailsMode {
|
||||||
|
CREATE, VIEW, EDIT
|
||||||
|
}
|
@ -0,0 +1,350 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you 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.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="481" max="32767" attributes="0"/>
|
||||||
|
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="detailsPanel" alignment="1" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="583" max="32767" attributes="0"/>
|
||||||
|
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="detailsPanel" alignment="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="detailsPanel">
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="accountsTablePane" alignment="1" pref="469" max="32767" attributes="0"/>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="nameLbl" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="nameField" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="accountsLbl" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="metadataLabel" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="metadataTablePane" alignment="1" pref="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="aliasesLabel" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="aliasesTablePane" alignment="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="casesLbl" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<Component id="addCaseBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteCaseBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="saveBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="casesTablePane" max="32767" attributes="0"/>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="addAccountBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteAccountBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="addMetadataBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteMetadataBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="addAliasBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteAliasBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="nameLbl" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="nameField" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="accountsLbl" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="accountsTablePane" min="-2" pref="56" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="addAccountBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteAccountBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="metadataLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="metadataTablePane" min="-2" pref="66" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="addMetadataBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteMetadataBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="aliasesLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="aliasesTablePane" min="-2" pref="74" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="addAliasBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteAliasBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="casesLbl" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="casesTablePane" min="-2" pref="63" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="saveBtn" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" alignment="0" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="addCaseBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="deleteCaseBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="nameLbl">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.nameLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="nameField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="false"/>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.nameField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nameFieldActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="accountsLbl">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.accountsLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="accountsTablePane">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTable" name="accountsTable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||||
|
<Table columnCount="0" rowCount="4"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JButton" name="addAccountBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.addAccountBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="deleteAccountBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.deleteAccountBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="metadataLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.metadataLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="metadataTablePane">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTable" name="metadataTable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||||
|
<Table columnCount="0" rowCount="4"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JButton" name="addMetadataBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.addMetadataBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="deleteMetadataBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.deleteMetadataBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="aliasesLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.aliasesLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="aliasesTablePane">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTable" name="aliasesTable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||||
|
<Table columnCount="0" rowCount="4"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JButton" name="addAliasBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.addAliasBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="deleteAliasBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.deleteAliasBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="casesLbl">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.casesLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="casesTablePane">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTable" name="casesTable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||||
|
<Table columnCount="0" rowCount="4"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JButton" name="addCaseBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.addCaseBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="deleteCaseBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.deleteCaseBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="saveBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.saveBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaDetailsPanel.saveBtn.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -0,0 +1,579 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2020 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.centralrepository.persona;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
import javax.swing.JTable;
|
||||||
|
import javax.swing.event.ListSelectionEvent;
|
||||||
|
import javax.swing.event.ListSelectionListener;
|
||||||
|
import javax.swing.table.DefaultTableModel;
|
||||||
|
import org.openide.windows.TopComponent;
|
||||||
|
import org.openide.util.NbBundle.Messages;
|
||||||
|
import org.openide.windows.RetainLocation;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoAccount;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationCase;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAccount;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaAlias;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.PersonaMetadata;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JPanel for persona details
|
||||||
|
*/
|
||||||
|
@TopComponent.Description(preferredID = "PersonaDetailsTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
|
||||||
|
@TopComponent.Registration(mode = "personadetails", openAtStartup = false)
|
||||||
|
@RetainLocation("personadetails")
|
||||||
|
@SuppressWarnings("PMD.SingularField")
|
||||||
|
public final class PersonaDetailsPanel extends javax.swing.JPanel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(PersonaDetailsPanel.class.getName());
|
||||||
|
|
||||||
|
private PersonaDetailsMode mode;
|
||||||
|
|
||||||
|
private Persona currentPersona;
|
||||||
|
private String currentName = null;
|
||||||
|
private List<PersonaAccount> currentAccounts;
|
||||||
|
private List<PersonaMetadata> currentMetadata;
|
||||||
|
private List<PersonaAlias> currentAliases;
|
||||||
|
private List<CorrelationCase> currentCases;
|
||||||
|
|
||||||
|
// Creation
|
||||||
|
private PersonaDetailsTableModel accountsModel;
|
||||||
|
private PersonaDetailsTableModel metadataModel;
|
||||||
|
private PersonaDetailsTableModel aliasesModel;
|
||||||
|
private PersonaDetailsTableModel casesModel;
|
||||||
|
|
||||||
|
|
||||||
|
@Messages({
|
||||||
|
"PersonaDetailsPanel_NameEdit=Edit Persona",
|
||||||
|
"PersonaDetailsPanel_NameCreate=Create Persona",
|
||||||
|
"PersonaDetailsPanel_NameView=View Persona",})
|
||||||
|
public PersonaDetailsPanel() {
|
||||||
|
initComponents();
|
||||||
|
|
||||||
|
addAccountBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
showAddAccountDialog();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
addAliasBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
addAlias();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
deleteAliasBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
deleteAlias();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
aliasesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
|
||||||
|
public void valueChanged(ListSelectionEvent e) {
|
||||||
|
handleAliasListSelectionChange(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
saveBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
savePressed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showAddAccountDialog() {
|
||||||
|
AddAccountDialog dialog = new AddAccountDialog(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addAlias() {
|
||||||
|
aliasesModel.addRow(new String[]{""});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteAlias() {
|
||||||
|
int idx = aliasesTable.getSelectedRow();
|
||||||
|
if (idx != -1) {
|
||||||
|
aliasesModel.removeRow(idx);
|
||||||
|
}
|
||||||
|
deleteAliasBtn.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleAliasListSelectionChange(ListSelectionEvent e) {
|
||||||
|
if (e.getValueIsAdjusting()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
deleteAliasBtn.setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void savePressed() {
|
||||||
|
//todo handle
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called from within the constructor to initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
|
* regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
detailsPanel = new javax.swing.JPanel();
|
||||||
|
nameLbl = new javax.swing.JLabel();
|
||||||
|
nameField = new javax.swing.JTextField();
|
||||||
|
accountsLbl = new javax.swing.JLabel();
|
||||||
|
accountsTablePane = new javax.swing.JScrollPane();
|
||||||
|
accountsTable = new javax.swing.JTable();
|
||||||
|
addAccountBtn = new javax.swing.JButton();
|
||||||
|
deleteAccountBtn = new javax.swing.JButton();
|
||||||
|
metadataLabel = new javax.swing.JLabel();
|
||||||
|
metadataTablePane = new javax.swing.JScrollPane();
|
||||||
|
metadataTable = new javax.swing.JTable();
|
||||||
|
addMetadataBtn = new javax.swing.JButton();
|
||||||
|
deleteMetadataBtn = new javax.swing.JButton();
|
||||||
|
aliasesLabel = new javax.swing.JLabel();
|
||||||
|
aliasesTablePane = new javax.swing.JScrollPane();
|
||||||
|
aliasesTable = new javax.swing.JTable();
|
||||||
|
addAliasBtn = new javax.swing.JButton();
|
||||||
|
deleteAliasBtn = new javax.swing.JButton();
|
||||||
|
casesLbl = new javax.swing.JLabel();
|
||||||
|
casesTablePane = new javax.swing.JScrollPane();
|
||||||
|
casesTable = new javax.swing.JTable();
|
||||||
|
addCaseBtn = new javax.swing.JButton();
|
||||||
|
deleteCaseBtn = new javax.swing.JButton();
|
||||||
|
saveBtn = new javax.swing.JButton();
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(nameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameLbl.text")); // NOI18N
|
||||||
|
|
||||||
|
nameField.setEditable(false);
|
||||||
|
nameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.nameField.text")); // NOI18N
|
||||||
|
nameField.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
nameFieldActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(accountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.accountsLbl.text")); // NOI18N
|
||||||
|
|
||||||
|
accountsTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
|
new Object [][] {
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{}
|
||||||
|
},
|
||||||
|
new String [] {
|
||||||
|
|
||||||
|
}
|
||||||
|
));
|
||||||
|
accountsTablePane.setViewportView(accountsTable);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(addAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAccountBtn.text")); // NOI18N
|
||||||
|
addAccountBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(deleteAccountBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAccountBtn.text")); // NOI18N
|
||||||
|
deleteAccountBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(metadataLabel, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.metadataLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
metadataTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
|
new Object [][] {
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{}
|
||||||
|
},
|
||||||
|
new String [] {
|
||||||
|
|
||||||
|
}
|
||||||
|
));
|
||||||
|
metadataTablePane.setViewportView(metadataTable);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(addMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addMetadataBtn.text")); // NOI18N
|
||||||
|
addMetadataBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(deleteMetadataBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteMetadataBtn.text")); // NOI18N
|
||||||
|
deleteMetadataBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(aliasesLabel, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.aliasesLabel.text")); // NOI18N
|
||||||
|
|
||||||
|
aliasesTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
|
new Object [][] {
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{}
|
||||||
|
},
|
||||||
|
new String [] {
|
||||||
|
|
||||||
|
}
|
||||||
|
));
|
||||||
|
aliasesTablePane.setViewportView(aliasesTable);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(addAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addAliasBtn.text")); // NOI18N
|
||||||
|
addAliasBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(deleteAliasBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteAliasBtn.text")); // NOI18N
|
||||||
|
deleteAliasBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(casesLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.casesLbl.text")); // NOI18N
|
||||||
|
|
||||||
|
casesTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
|
new Object [][] {
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{}
|
||||||
|
},
|
||||||
|
new String [] {
|
||||||
|
|
||||||
|
}
|
||||||
|
));
|
||||||
|
casesTablePane.setViewportView(casesTable);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(addCaseBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.addCaseBtn.text")); // NOI18N
|
||||||
|
addCaseBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(deleteCaseBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.deleteCaseBtn.text")); // NOI18N
|
||||||
|
deleteCaseBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(saveBtn, org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.saveBtn.text")); // NOI18N
|
||||||
|
saveBtn.setToolTipText(org.openide.util.NbBundle.getMessage(PersonaDetailsPanel.class, "PersonaDetailsPanel.saveBtn.toolTipText")); // NOI18N
|
||||||
|
saveBtn.setEnabled(false);
|
||||||
|
|
||||||
|
javax.swing.GroupLayout detailsPanelLayout = new javax.swing.GroupLayout(detailsPanel);
|
||||||
|
detailsPanel.setLayout(detailsPanelLayout);
|
||||||
|
detailsPanelLayout.setHorizontalGroup(
|
||||||
|
detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(accountsTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 469, Short.MAX_VALUE)
|
||||||
|
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(nameLbl)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(nameField))
|
||||||
|
.addComponent(accountsLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(metadataLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(metadataTablePane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
|
.addComponent(aliasesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
|
.addComponent(casesLbl, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(addCaseBtn)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(deleteCaseBtn)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(saveBtn))
|
||||||
|
.addComponent(casesTablePane)
|
||||||
|
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(addAccountBtn)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(deleteAccountBtn))
|
||||||
|
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(addMetadataBtn)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(deleteMetadataBtn))
|
||||||
|
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(addAliasBtn)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(deleteAliasBtn)))
|
||||||
|
.addGap(0, 0, Short.MAX_VALUE)))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
detailsPanelLayout.setVerticalGroup(
|
||||||
|
detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(detailsPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(nameLbl)
|
||||||
|
.addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(accountsLbl)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(accountsTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(addAccountBtn)
|
||||||
|
.addComponent(deleteAccountBtn))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(metadataLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(metadataTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(addMetadataBtn)
|
||||||
|
.addComponent(deleteMetadataBtn))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(aliasesLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(aliasesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(addAliasBtn)
|
||||||
|
.addComponent(deleteAliasBtn))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(casesLbl)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(casesTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(saveBtn)
|
||||||
|
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(addCaseBtn)
|
||||||
|
.addComponent(deleteCaseBtn)))
|
||||||
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
|
this.setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 481, Short.MAX_VALUE)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(detailsPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 583, Short.MAX_VALUE)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(detailsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void nameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameFieldActionPerformed
|
||||||
|
|
||||||
|
}//GEN-LAST:event_nameFieldActionPerformed
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JLabel accountsLbl;
|
||||||
|
private javax.swing.JTable accountsTable;
|
||||||
|
private javax.swing.JScrollPane accountsTablePane;
|
||||||
|
private javax.swing.JButton addAccountBtn;
|
||||||
|
private javax.swing.JButton addAliasBtn;
|
||||||
|
private javax.swing.JButton addCaseBtn;
|
||||||
|
private javax.swing.JButton addMetadataBtn;
|
||||||
|
private javax.swing.JLabel aliasesLabel;
|
||||||
|
private javax.swing.JTable aliasesTable;
|
||||||
|
private javax.swing.JScrollPane aliasesTablePane;
|
||||||
|
private javax.swing.JLabel casesLbl;
|
||||||
|
private javax.swing.JTable casesTable;
|
||||||
|
private javax.swing.JScrollPane casesTablePane;
|
||||||
|
private javax.swing.JButton deleteAccountBtn;
|
||||||
|
private javax.swing.JButton deleteAliasBtn;
|
||||||
|
private javax.swing.JButton deleteCaseBtn;
|
||||||
|
private javax.swing.JButton deleteMetadataBtn;
|
||||||
|
private javax.swing.JPanel detailsPanel;
|
||||||
|
private javax.swing.JLabel metadataLabel;
|
||||||
|
private javax.swing.JTable metadataTable;
|
||||||
|
private javax.swing.JScrollPane metadataTablePane;
|
||||||
|
private javax.swing.JTextField nameField;
|
||||||
|
private javax.swing.JLabel nameLbl;
|
||||||
|
private javax.swing.JButton saveBtn;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
@Messages({
|
||||||
|
"PersonaDetailsPanel_load_exception_Title=Initialization failure",
|
||||||
|
"PersonaDetailsPanel_load_exception_msg=Failed to load persona",})
|
||||||
|
private void loadPersona(Component parent, Persona persona) {
|
||||||
|
String name;
|
||||||
|
Collection<PersonaAccount> accounts;
|
||||||
|
Collection<PersonaMetadata> metadata;
|
||||||
|
Collection<PersonaAlias> aliases;
|
||||||
|
Collection<CorrelationCase> cases;
|
||||||
|
try {
|
||||||
|
name = persona.getName();
|
||||||
|
accounts = persona.getPersonaAccounts();
|
||||||
|
metadata = persona.getMetadata();
|
||||||
|
aliases = persona.getAliases();
|
||||||
|
cases = persona.getCases();
|
||||||
|
} catch (CentralRepoException ex) {
|
||||||
|
logger.log(Level.SEVERE, "Failed to load persona", ex);
|
||||||
|
JOptionPane.showMessageDialog(parent,
|
||||||
|
Bundle.PersonaDetailsPanel_load_exception_Title(),
|
||||||
|
Bundle.PersonaDetailsPanel_load_exception_msg(),
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.currentPersona = persona;
|
||||||
|
this.currentName = name;
|
||||||
|
this.currentAccounts = new ArrayList<>(accounts);
|
||||||
|
this.currentMetadata = new ArrayList<>(metadata);
|
||||||
|
this.currentAliases = new ArrayList<>(aliases);
|
||||||
|
this.currentCases = new ArrayList<>(cases);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
currentPersona = null;
|
||||||
|
nameField.setText("");
|
||||||
|
nameField.setEditable(false);
|
||||||
|
|
||||||
|
updateAccountsTable(Collections.EMPTY_LIST);
|
||||||
|
|
||||||
|
saveBtn.setEnabled(false);
|
||||||
|
addAccountBtn.setEnabled(false);
|
||||||
|
addMetadataBtn.setEnabled(false);
|
||||||
|
addAliasBtn.setEnabled(false);
|
||||||
|
addCaseBtn.setEnabled(false);
|
||||||
|
deleteAccountBtn.setEnabled(false);
|
||||||
|
deleteMetadataBtn.setEnabled(false);
|
||||||
|
deleteAliasBtn.setEnabled(false);
|
||||||
|
deleteCaseBtn.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table model for persona details
|
||||||
|
*/
|
||||||
|
final class PersonaDetailsTableModel extends DefaultTableModel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
PersonaDetailsTableModel(Object[][] rows, String[] colNames) {
|
||||||
|
super(rows, colNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCellEditable(int row, int column) {
|
||||||
|
return mode != PersonaDetailsMode.VIEW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAccountsTable(Collection<PersonaAccount> accounts) {
|
||||||
|
Object[][] rows = new Object[accounts.size()][2];
|
||||||
|
int i = 0;
|
||||||
|
for (PersonaAccount account : accounts) {
|
||||||
|
CentralRepoAccount acc = account.getAccount();
|
||||||
|
rows[i] = new Object[]{
|
||||||
|
acc.getAccountType().getAcctType().getDisplayName(),
|
||||||
|
acc.getTypeSpecificId()
|
||||||
|
};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
accountsModel = new PersonaDetailsTableModel(
|
||||||
|
rows,
|
||||||
|
new String[]{"Type", "ID"}
|
||||||
|
);
|
||||||
|
accountsTable.setModel(accountsModel);
|
||||||
|
|
||||||
|
// Formatting
|
||||||
|
accountsTable.getColumnModel().getColumn(0).setMaxWidth(100);
|
||||||
|
accountsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateMetadataTable(Collection<PersonaMetadata> metadata) {
|
||||||
|
Object[][] rows = new Object[metadata.size()][2];
|
||||||
|
int i = 0;
|
||||||
|
for (PersonaMetadata md : metadata) {
|
||||||
|
rows[i] = new Object[]{md.getName(), md.getValue()};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
metadataModel = new PersonaDetailsTableModel(
|
||||||
|
rows,
|
||||||
|
new String[]{"Name", "Value"}
|
||||||
|
);
|
||||||
|
metadataTable.setModel(metadataModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAliasesTable(Collection<PersonaAlias> aliases) {
|
||||||
|
Object[][] rows = new Object[aliases.size()][1];
|
||||||
|
int i = 0;
|
||||||
|
for (PersonaAlias alias : aliases) {
|
||||||
|
rows[i] = new Object[]{alias.getAlias()};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
aliasesModel = new PersonaDetailsTableModel(
|
||||||
|
rows,
|
||||||
|
new String[]{"Alias"}
|
||||||
|
);
|
||||||
|
aliasesTable.setModel(aliasesModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateCasesTable(Collection<CorrelationCase> cases) {
|
||||||
|
Object[][] rows = new Object[cases.size()][1];
|
||||||
|
int i = 0;
|
||||||
|
for (CorrelationCase c : cases) {
|
||||||
|
rows[i] = new Object[]{c.getDisplayName()};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
casesModel = new PersonaDetailsTableModel(
|
||||||
|
rows,
|
||||||
|
new String[]{"Case"}
|
||||||
|
);
|
||||||
|
casesTable.setModel(casesModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enableEditUIComponents() {
|
||||||
|
nameField.setEditable(true);
|
||||||
|
addAccountBtn.setEnabled(true);
|
||||||
|
addMetadataBtn.setEnabled(true);
|
||||||
|
addAliasBtn.setEnabled(true);
|
||||||
|
addCaseBtn.setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void initializeFields() {
|
||||||
|
nameField.setText(currentName);
|
||||||
|
updateAccountsTable(currentAccounts);
|
||||||
|
updateMetadataTable(currentMetadata);
|
||||||
|
updateAliasesTable(currentAliases);
|
||||||
|
updateCasesTable(currentCases);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setMode(Component parent, PersonaDetailsMode mode, Persona persona) {
|
||||||
|
clear();
|
||||||
|
this.mode = mode;
|
||||||
|
switch (mode) {
|
||||||
|
case CREATE:
|
||||||
|
currentName = Persona.getDefaultName();
|
||||||
|
currentAccounts = new ArrayList<>();
|
||||||
|
currentMetadata = new ArrayList<>();
|
||||||
|
currentAliases = new ArrayList<>();
|
||||||
|
currentCases = new ArrayList<>();
|
||||||
|
enableEditUIComponents();
|
||||||
|
break;
|
||||||
|
case EDIT:
|
||||||
|
loadPersona(parent, persona);
|
||||||
|
enableEditUIComponents();
|
||||||
|
break;
|
||||||
|
case VIEW:
|
||||||
|
loadPersona(parent, persona);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
logger.log(Level.WARNING, "Unsupported mode: {0}", mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
initializeFields();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,225 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you 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.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||||
|
<NonVisualComponents>
|
||||||
|
<Component class="javax.swing.ButtonGroup" name="searchButtonGroup">
|
||||||
|
</Component>
|
||||||
|
</NonVisualComponents>
|
||||||
|
<Properties>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[400, 400]"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jSplitPane1" alignment="0" pref="675" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="jSplitPane1" alignment="0" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JSplitPane" name="jSplitPane1">
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="searchPanel">
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||||
|
<JSplitPaneConstraints position="left"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="resultsPane" pref="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="searchField" max="32767" attributes="0"/>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Component id="searchNameRadio" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="searchAccountRadio" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="searchBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="editBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="createBtn" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="searchField" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="searchNameRadio" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="searchAccountRadio" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="searchBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="resultsPane" pref="619" max="32767" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="editBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="createBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTextField" name="searchField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.searchField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="searchNameRadio">
|
||||||
|
<Properties>
|
||||||
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
<ComponentRef name="searchButtonGroup"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="selected" type="boolean" value="true"/>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.searchNameRadio.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="searchNameRadioActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="searchAccountRadio">
|
||||||
|
<Properties>
|
||||||
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
<ComponentRef name="searchButtonGroup"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.searchAccountRadio.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="resultsPane">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTable" name="resultsTable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.resultsTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
|
||||||
|
<TableColumnModel selectionModel="0">
|
||||||
|
<Column maxWidth="25" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.resultsTable.columnModel.title0" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Title>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.resultsTable.columnModel.title1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Title>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
</TableColumnModel>
|
||||||
|
</Property>
|
||||||
|
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
|
||||||
|
<TableHeader reorderingAllowed="false" resizingAllowed="true"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JButton" name="searchBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.searchBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="editBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.editBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="enabled" type="boolean" value="false"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="createBtn">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||||
|
<ResourceString bundle="org/sleuthkit/autopsy/centralrepository/persona/Bundle.properties" key="PersonaManagerTopComponent.createBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="createBtnActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel" name="detailsPanel">
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
|
||||||
|
<JSplitPaneConstraints position="right"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -0,0 +1,313 @@
|
|||||||
|
/*
|
||||||
|
* Autopsy Forensic Browser
|
||||||
|
*
|
||||||
|
* Copyright 2020 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.centralrepository.persona;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
import javax.swing.JTable;
|
||||||
|
import javax.swing.ListSelectionModel;
|
||||||
|
import javax.swing.event.ListSelectionEvent;
|
||||||
|
import javax.swing.event.ListSelectionListener;
|
||||||
|
import javax.swing.table.DefaultTableModel;
|
||||||
|
import org.openide.util.NbBundle.Messages;
|
||||||
|
import org.openide.windows.RetainLocation;
|
||||||
|
import org.openide.windows.TopComponent;
|
||||||
|
import org.openide.windows.WindowManager;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
||||||
|
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
|
||||||
|
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Top component for the Personas tool
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@TopComponent.Description(preferredID = "PersonaManagerTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
|
||||||
|
@TopComponent.Registration(mode = "personamanager", openAtStartup = false)
|
||||||
|
@RetainLocation("personamanager")
|
||||||
|
@SuppressWarnings("PMD.SingularField")
|
||||||
|
public final class PersonaManagerTopComponent extends TopComponent {
|
||||||
|
|
||||||
|
private static final Logger logger = Logger.getLogger(PersonaManagerTopComponent.class.getName());
|
||||||
|
|
||||||
|
private List<Persona> currentResults = null;
|
||||||
|
private Persona selectedPersona = null;
|
||||||
|
|
||||||
|
@Messages({
|
||||||
|
"PMTopComponent_Name=Persona Manager"
|
||||||
|
})
|
||||||
|
public PersonaManagerTopComponent() {
|
||||||
|
initComponents();
|
||||||
|
setName(Bundle.PMTopComponent_Name());
|
||||||
|
executeSearch();
|
||||||
|
|
||||||
|
searchBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
executeSearch();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
editBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
detailsPanel.setMode(PersonaManagerTopComponent.this, PersonaDetailsMode.EDIT, selectedPersona);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
createBtn.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
detailsPanel.setMode(PersonaManagerTopComponent.this, PersonaDetailsMode.CREATE, null);
|
||||||
|
resultsTable.clearSelection();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Results table
|
||||||
|
resultsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||||
|
resultsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
|
||||||
|
public void valueChanged(ListSelectionEvent e) {
|
||||||
|
handleSelectionChange(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPersona(int index) {
|
||||||
|
Persona persona = currentResults.get(index);
|
||||||
|
selectedPersona = persona;
|
||||||
|
editBtn.setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Table model for the persona search results
|
||||||
|
*/
|
||||||
|
final class PersonaFilterTableModel extends DefaultTableModel {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
PersonaFilterTableModel(Object[][] rows, String[] colNames) {
|
||||||
|
super(rows, colNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCellEditable(int row, int column) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleSelectionChange(ListSelectionEvent e) {
|
||||||
|
if (e.getValueIsAdjusting()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int selectedRow = resultsTable.getSelectedRow();
|
||||||
|
if (selectedRow != -1) {
|
||||||
|
setPersona(resultsTable.getSelectedRow());
|
||||||
|
detailsPanel.setMode(this, PersonaDetailsMode.VIEW, selectedPersona);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateResultsTable(Collection<Persona> results) {
|
||||||
|
Object[][] rows = new Object[results.size()][2];
|
||||||
|
int i = 0;
|
||||||
|
for (Persona result : results) {
|
||||||
|
rows[i] = new Object[]{result.getId(), result.getName()};
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
PersonaFilterTableModel updatedTableModel = new PersonaFilterTableModel(
|
||||||
|
rows,
|
||||||
|
new String[]{"ID", "Name"}
|
||||||
|
);
|
||||||
|
|
||||||
|
resultsTable.setModel(updatedTableModel);
|
||||||
|
currentResults = new ArrayList<>(results);
|
||||||
|
|
||||||
|
// Formatting
|
||||||
|
resultsTable.getColumnModel().getColumn(0).setMaxWidth(100);
|
||||||
|
resultsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Messages({
|
||||||
|
"PMTopComponent_search_exception_Title=Search failure",
|
||||||
|
"PMTopComponent_search_exception_msg=Failed to search personas",})
|
||||||
|
private void executeSearch() {
|
||||||
|
Collection<Persona> results;
|
||||||
|
try {
|
||||||
|
results = Persona.getPersonaByName(searchField.getText());
|
||||||
|
} catch (CentralRepoException ex) {
|
||||||
|
logger.log(Level.SEVERE, "Failed to search personas", ex);
|
||||||
|
JOptionPane.showMessageDialog(this,
|
||||||
|
Bundle.PMTopComponent_search_exception_Title(),
|
||||||
|
Bundle.PMTopComponent_search_exception_msg(),
|
||||||
|
JOptionPane.ERROR_MESSAGE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
resultsTable.clearSelection();
|
||||||
|
updateResultsTable(results);
|
||||||
|
editBtn.setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void componentOpened() {
|
||||||
|
super.componentOpened();
|
||||||
|
WindowManager.getDefault().setTopComponentFloating(this, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called from within the constructor to initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is always
|
||||||
|
* regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
searchButtonGroup = new javax.swing.ButtonGroup();
|
||||||
|
jSplitPane1 = new javax.swing.JSplitPane();
|
||||||
|
searchPanel = new javax.swing.JPanel();
|
||||||
|
searchField = new javax.swing.JTextField();
|
||||||
|
searchNameRadio = new javax.swing.JRadioButton();
|
||||||
|
searchAccountRadio = new javax.swing.JRadioButton();
|
||||||
|
resultsPane = new javax.swing.JScrollPane();
|
||||||
|
resultsTable = new javax.swing.JTable();
|
||||||
|
searchBtn = new javax.swing.JButton();
|
||||||
|
editBtn = new javax.swing.JButton();
|
||||||
|
createBtn = new javax.swing.JButton();
|
||||||
|
detailsPanel = new org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel();
|
||||||
|
|
||||||
|
setMinimumSize(new java.awt.Dimension(400, 400));
|
||||||
|
|
||||||
|
searchField.setText(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchField.text")); // NOI18N
|
||||||
|
|
||||||
|
searchButtonGroup.add(searchNameRadio);
|
||||||
|
searchNameRadio.setSelected(true);
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(searchNameRadio, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchNameRadio.text")); // NOI18N
|
||||||
|
searchNameRadio.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
searchNameRadioActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
searchButtonGroup.add(searchAccountRadio);
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(searchAccountRadio, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchAccountRadio.text")); // NOI18N
|
||||||
|
searchAccountRadio.setEnabled(false);
|
||||||
|
|
||||||
|
resultsTable.setToolTipText(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.resultsTable.toolTipText")); // NOI18N
|
||||||
|
resultsTable.getTableHeader().setReorderingAllowed(false);
|
||||||
|
resultsPane.setViewportView(resultsTable);
|
||||||
|
if (resultsTable.getColumnModel().getColumnCount() > 0) {
|
||||||
|
resultsTable.getColumnModel().getColumn(0).setMaxWidth(25);
|
||||||
|
resultsTable.getColumnModel().getColumn(0).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.resultsTable.columnModel.title0")); // NOI18N
|
||||||
|
resultsTable.getColumnModel().getColumn(1).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.resultsTable.columnModel.title1")); // NOI18N
|
||||||
|
}
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(searchBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.searchBtn.text")); // NOI18N
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(editBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.editBtn.text")); // NOI18N
|
||||||
|
editBtn.setEnabled(false);
|
||||||
|
|
||||||
|
org.openide.awt.Mnemonics.setLocalizedText(createBtn, org.openide.util.NbBundle.getMessage(PersonaManagerTopComponent.class, "PersonaManagerTopComponent.createBtn.text")); // NOI18N
|
||||||
|
createBtn.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
createBtnActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
javax.swing.GroupLayout searchPanelLayout = new javax.swing.GroupLayout(searchPanel);
|
||||||
|
searchPanel.setLayout(searchPanelLayout);
|
||||||
|
searchPanelLayout.setHorizontalGroup(
|
||||||
|
searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(searchPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(resultsPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
||||||
|
.addComponent(searchField)
|
||||||
|
.addGroup(searchPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(searchNameRadio)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(searchAccountRadio)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(searchBtn))
|
||||||
|
.addGroup(searchPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(editBtn)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(createBtn)))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
searchPanelLayout.setVerticalGroup(
|
||||||
|
searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(searchPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(searchNameRadio)
|
||||||
|
.addComponent(searchAccountRadio)
|
||||||
|
.addComponent(searchBtn))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(resultsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 619, Short.MAX_VALUE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(editBtn)
|
||||||
|
.addComponent(createBtn))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
|
||||||
|
jSplitPane1.setLeftComponent(searchPanel);
|
||||||
|
jSplitPane1.setRightComponent(detailsPanel);
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
||||||
|
this.setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 675, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(jSplitPane1)
|
||||||
|
);
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void searchNameRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchNameRadioActionPerformed
|
||||||
|
// TODO add your handling code here:
|
||||||
|
}//GEN-LAST:event_searchNameRadioActionPerformed
|
||||||
|
|
||||||
|
private void createBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createBtnActionPerformed
|
||||||
|
// TODO add your handling code here:
|
||||||
|
}//GEN-LAST:event_createBtnActionPerformed
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JButton createBtn;
|
||||||
|
private org.sleuthkit.autopsy.centralrepository.persona.PersonaDetailsPanel detailsPanel;
|
||||||
|
private javax.swing.JButton editBtn;
|
||||||
|
private javax.swing.JSplitPane jSplitPane1;
|
||||||
|
private javax.swing.JScrollPane resultsPane;
|
||||||
|
private javax.swing.JTable resultsTable;
|
||||||
|
private javax.swing.JRadioButton searchAccountRadio;
|
||||||
|
private javax.swing.JButton searchBtn;
|
||||||
|
private javax.swing.ButtonGroup searchButtonGroup;
|
||||||
|
private javax.swing.JTextField searchField;
|
||||||
|
private javax.swing.JRadioButton searchNameRadio;
|
||||||
|
private javax.swing.JPanel searchPanel;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
}
|
@ -1,15 +0,0 @@
|
|||||||
CTL_OpenPersonas=Personas
|
|
||||||
CTL_PersonasTopComponentAction=PersonasTopComponent
|
|
||||||
CTL_PersonasTopComponent=Personas
|
|
||||||
PersonaDetailsTopComponent.resultNameLbl.text=Name:
|
|
||||||
PersonaDetailsTopComponent.resultCasesLbl.text=Cases found in:
|
|
||||||
PersonaDetailsTopComponent.resultAccountsLbl.text=Accounts:
|
|
||||||
PersonaDetailsTopComponent.resultAliasesLbl.text=Aliases:
|
|
||||||
PersonaDetailsTopComponent.resultNameField.text=Johnathan Dough
|
|
||||||
PersonaSearchTopComponent.searchAccountRadio.text=Account
|
|
||||||
PersonaSearchTopComponent.searchNameRadio.text=Name
|
|
||||||
PersonaSearchTopComponent.searchField.text=
|
|
||||||
PersonaSearchTopComponent.searchBtn.text=Search
|
|
||||||
PersonaSearchTopComponent.filterResultsTable.columnModel.title1=Name
|
|
||||||
PersonaSearchTopComponent.filterResultsTable.columnModel.title0=ID
|
|
||||||
PersonaSearchTopComponent.filterResultsTable.toolTipText=
|
|
@ -1,5 +0,0 @@
|
|||||||
CTL_OpenPersonas=Personas
|
|
||||||
CTL_PersonasTopComponentAction=PersonasTopComponent
|
|
||||||
CTL_PersonasTopComponent=Personas
|
|
||||||
OpenPersonasAction.displayName=Personas
|
|
||||||
PTopComponent_Name=Personas
|
|
@ -1,230 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you 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.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
|
||||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
|
||||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
|
||||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
|
||||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
|
||||||
</AuxValues>
|
|
||||||
|
|
||||||
<Layout>
|
|
||||||
<DimensionLayout dim="0">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<EmptySpace min="0" pref="505" max="32767" attributes="0"/>
|
|
||||||
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" attributes="0">
|
|
||||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="detailsPanel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
<DimensionLayout dim="1">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<EmptySpace min="0" pref="555" max="32767" attributes="0"/>
|
|
||||||
<Group type="103" rootIndex="1" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" attributes="0">
|
|
||||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="detailsPanel" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
</Layout>
|
|
||||||
<SubComponents>
|
|
||||||
<Container class="javax.swing.JPanel" name="detailsPanel">
|
|
||||||
|
|
||||||
<Layout>
|
|
||||||
<DimensionLayout dim="0">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" alignment="1" attributes="0">
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="1" attributes="0">
|
|
||||||
<Component id="accountsTablePane" alignment="1" pref="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="aliasesListPane" alignment="1" max="32767" attributes="0"/>
|
|
||||||
<Component id="casesListPane" alignment="1" max="32767" attributes="0"/>
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<Component id="resultNameLbl" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="resultNameField" pref="447" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<Component id="resultAliasesLbl" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="resultAccountsLbl" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="resultCasesLbl" alignment="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
<DimensionLayout dim="1">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="resultNameLbl" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="resultNameField" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
|
||||||
<Component id="resultAliasesLbl" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="aliasesListPane" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
|
||||||
<Component id="resultAccountsLbl" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="accountsTablePane" min="-2" pref="153" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
|
||||||
<Component id="resultCasesLbl" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="casesListPane" pref="118" max="32767" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
</Layout>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JLabel" name="resultNameLbl">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaDetailsTopComponent.resultNameLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JTextField" name="resultNameField">
|
|
||||||
<Properties>
|
|
||||||
<Property name="editable" type="boolean" value="false"/>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaDetailsTopComponent.resultNameField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Events>
|
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="resultNameFieldActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="resultAliasesLbl">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaDetailsTopComponent.resultAliasesLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JLabel" name="resultAccountsLbl">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaDetailsTopComponent.resultAccountsLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Container class="javax.swing.JScrollPane" name="accountsTablePane">
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
|
||||||
</AuxValues>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JTable" name="accountsTable">
|
|
||||||
<Properties>
|
|
||||||
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
|
||||||
<Table columnCount="2" rowCount="4">
|
|
||||||
<Column editable="false" title="Type" type="java.lang.String">
|
|
||||||
<Data value="Email"/>
|
|
||||||
<Data value="Phone"/>
|
|
||||||
<Data value="Twitter"/>
|
|
||||||
<Data value="null"/>
|
|
||||||
</Column>
|
|
||||||
<Column editable="false" title="Data" type="java.lang.String">
|
|
||||||
<Data value="jdb@yahoo.com"/>
|
|
||||||
<Data value="865-555-5555"/>
|
|
||||||
<Data value="@jd93.bread"/>
|
|
||||||
<Data value="null"/>
|
|
||||||
</Column>
|
|
||||||
</Table>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
<Component class="javax.swing.JLabel" name="resultCasesLbl">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaDetailsTopComponent.resultCasesLbl.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Container class="javax.swing.JScrollPane" name="casesListPane">
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
|
||||||
</AuxValues>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JList" name="casesList">
|
|
||||||
<Properties>
|
|
||||||
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
|
|
||||||
<StringArray count="2">
|
|
||||||
<StringItem index="0" value="Investigation 13"/>
|
|
||||||
<StringItem index="1" value="Scene 5"/>
|
|
||||||
</StringArray>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<String>"/>
|
|
||||||
</AuxValues>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
<Container class="javax.swing.JScrollPane" name="aliasesListPane">
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
|
||||||
</AuxValues>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JList" name="aliasesList">
|
|
||||||
<Properties>
|
|
||||||
<Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.editors2.ListModelEditor">
|
|
||||||
<StringArray count="3">
|
|
||||||
<StringItem index="0" value="J.D."/>
|
|
||||||
<StringItem index="1" value="Fred Smidge"/>
|
|
||||||
<StringItem index="2" value="Ethan Roseman"/>
|
|
||||||
</StringArray>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="<String>"/>
|
|
||||||
</AuxValues>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
</SubComponents>
|
|
||||||
</Form>
|
|
@ -1,209 +0,0 @@
|
|||||||
/*
|
|
||||||
* Autopsy Forensic Browser
|
|
||||||
*
|
|
||||||
* Copyright 2020 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.persona;
|
|
||||||
|
|
||||||
import org.openide.windows.TopComponent;
|
|
||||||
import org.openide.util.NbBundle.Messages;
|
|
||||||
import org.openide.windows.RetainLocation;
|
|
||||||
import org.openide.windows.WindowManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Top component for persona details
|
|
||||||
*/
|
|
||||||
@TopComponent.Description(preferredID = "PersonasTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
|
|
||||||
@TopComponent.Registration(mode = "personadetails", openAtStartup = false)
|
|
||||||
@RetainLocation("personadetails")
|
|
||||||
@SuppressWarnings("PMD.SingularField")
|
|
||||||
public final class PersonaDetailsTopComponent extends TopComponent {
|
|
||||||
|
|
||||||
@Messages({
|
|
||||||
"PDTopComponent_Name=Persona Details"
|
|
||||||
})
|
|
||||||
public PersonaDetailsTopComponent() {
|
|
||||||
initComponents();
|
|
||||||
setName(Bundle.PDTopComponent_Name());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called from within the constructor to initialize the form.
|
|
||||||
* WARNING: Do NOT modify this code. The content of this method is always
|
|
||||||
* regenerated by the Form Editor.
|
|
||||||
*/
|
|
||||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
||||||
private void initComponents() {
|
|
||||||
|
|
||||||
detailsPanel = new javax.swing.JPanel();
|
|
||||||
resultNameLbl = new javax.swing.JLabel();
|
|
||||||
resultNameField = new javax.swing.JTextField();
|
|
||||||
resultAliasesLbl = new javax.swing.JLabel();
|
|
||||||
resultAccountsLbl = new javax.swing.JLabel();
|
|
||||||
accountsTablePane = new javax.swing.JScrollPane();
|
|
||||||
accountsTable = new javax.swing.JTable();
|
|
||||||
resultCasesLbl = new javax.swing.JLabel();
|
|
||||||
casesListPane = new javax.swing.JScrollPane();
|
|
||||||
casesList = new javax.swing.JList<>();
|
|
||||||
aliasesListPane = new javax.swing.JScrollPane();
|
|
||||||
aliasesList = new javax.swing.JList<>();
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(resultNameLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultNameLbl.text")); // NOI18N
|
|
||||||
|
|
||||||
resultNameField.setEditable(false);
|
|
||||||
resultNameField.setText(org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultNameField.text")); // NOI18N
|
|
||||||
resultNameField.addActionListener(new java.awt.event.ActionListener() {
|
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
||||||
resultNameFieldActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(resultAliasesLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultAliasesLbl.text")); // NOI18N
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(resultAccountsLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultAccountsLbl.text")); // NOI18N
|
|
||||||
|
|
||||||
accountsTable.setModel(new javax.swing.table.DefaultTableModel(
|
|
||||||
new Object [][] {
|
|
||||||
{"Email", "jdb@yahoo.com"},
|
|
||||||
{"Phone", "865-555-5555"},
|
|
||||||
{"Twitter", "@jd93.bread"},
|
|
||||||
{null, null}
|
|
||||||
},
|
|
||||||
new String [] {
|
|
||||||
"Type", "Data"
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
Class[] types = new Class [] {
|
|
||||||
java.lang.String.class, java.lang.String.class
|
|
||||||
};
|
|
||||||
boolean[] canEdit = new boolean [] {
|
|
||||||
false, false
|
|
||||||
};
|
|
||||||
|
|
||||||
public Class getColumnClass(int columnIndex) {
|
|
||||||
return types [columnIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
|
||||||
return canEdit [columnIndex];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
accountsTablePane.setViewportView(accountsTable);
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(resultCasesLbl, org.openide.util.NbBundle.getMessage(PersonaDetailsTopComponent.class, "PersonaDetailsTopComponent.resultCasesLbl.text")); // NOI18N
|
|
||||||
|
|
||||||
casesList.setModel(new javax.swing.AbstractListModel<String>() {
|
|
||||||
String[] strings = { "Investigation 13", "Scene 5" };
|
|
||||||
public int getSize() { return strings.length; }
|
|
||||||
public String getElementAt(int i) { return strings[i]; }
|
|
||||||
});
|
|
||||||
casesListPane.setViewportView(casesList);
|
|
||||||
|
|
||||||
aliasesList.setModel(new javax.swing.AbstractListModel<String>() {
|
|
||||||
String[] strings = { "J.D.", "Fred Smidge", "Ethan Roseman" };
|
|
||||||
public int getSize() { return strings.length; }
|
|
||||||
public String getElementAt(int i) { return strings[i]; }
|
|
||||||
});
|
|
||||||
aliasesListPane.setViewportView(aliasesList);
|
|
||||||
|
|
||||||
javax.swing.GroupLayout detailsPanelLayout = new javax.swing.GroupLayout(detailsPanel);
|
|
||||||
detailsPanel.setLayout(detailsPanelLayout);
|
|
||||||
detailsPanelLayout.setHorizontalGroup(
|
|
||||||
detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, detailsPanelLayout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
||||||
.addComponent(accountsTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
|
||||||
.addComponent(aliasesListPane)
|
|
||||||
.addComponent(casesListPane)
|
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, detailsPanelLayout.createSequentialGroup()
|
|
||||||
.addComponent(resultNameLbl)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(resultNameField, javax.swing.GroupLayout.DEFAULT_SIZE, 447, Short.MAX_VALUE))
|
|
||||||
.addComponent(resultAliasesLbl, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(resultAccountsLbl, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(resultCasesLbl, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
detailsPanelLayout.setVerticalGroup(
|
|
||||||
detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(detailsPanelLayout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addGroup(detailsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(resultNameLbl)
|
|
||||||
.addComponent(resultNameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
||||||
.addGap(18, 18, 18)
|
|
||||||
.addComponent(resultAliasesLbl)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(aliasesListPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
||||||
.addComponent(resultAccountsLbl)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(accountsTablePane, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
||||||
.addComponent(resultCasesLbl)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(casesListPane, javax.swing.GroupLayout.DEFAULT_SIZE, 118, Short.MAX_VALUE)
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
|
||||||
this.setLayout(layout);
|
|
||||||
layout.setHorizontalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 505, Short.MAX_VALUE)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addGap(0, 0, Short.MAX_VALUE)
|
|
||||||
.addComponent(detailsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addGap(0, 0, Short.MAX_VALUE)))
|
|
||||||
);
|
|
||||||
layout.setVerticalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 555, Short.MAX_VALUE)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addGap(0, 0, Short.MAX_VALUE)
|
|
||||||
.addComponent(detailsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addGap(0, 0, Short.MAX_VALUE)))
|
|
||||||
);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
|
||||||
|
|
||||||
private void resultNameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resultNameFieldActionPerformed
|
|
||||||
|
|
||||||
}//GEN-LAST:event_resultNameFieldActionPerformed
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
||||||
private javax.swing.JTable accountsTable;
|
|
||||||
private javax.swing.JScrollPane accountsTablePane;
|
|
||||||
private javax.swing.JList<String> aliasesList;
|
|
||||||
private javax.swing.JScrollPane aliasesListPane;
|
|
||||||
private javax.swing.JList<String> casesList;
|
|
||||||
private javax.swing.JScrollPane casesListPane;
|
|
||||||
private javax.swing.JPanel detailsPanel;
|
|
||||||
private javax.swing.JLabel resultAccountsLbl;
|
|
||||||
private javax.swing.JLabel resultAliasesLbl;
|
|
||||||
private javax.swing.JLabel resultCasesLbl;
|
|
||||||
private javax.swing.JTextField resultNameField;
|
|
||||||
private javax.swing.JLabel resultNameLbl;
|
|
||||||
// End of variables declaration//GEN-END:variables
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void componentOpened() {
|
|
||||||
super.componentOpened();
|
|
||||||
WindowManager.getDefault().setTopComponentFloating(this, true);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,178 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
or more contributor license agreements. See the NOTICE file
|
|
||||||
distributed with this work for additional information
|
|
||||||
regarding copyright ownership. The ASF licenses this file
|
|
||||||
to you 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.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<Form version="1.5" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
|
||||||
<NonVisualComponents>
|
|
||||||
<Component class="javax.swing.ButtonGroup" name="searchButtonGroup">
|
|
||||||
</Component>
|
|
||||||
</NonVisualComponents>
|
|
||||||
<Properties>
|
|
||||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
|
||||||
<Dimension value="[400, 400]"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
|
||||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
|
||||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
|
||||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
|
||||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
|
||||||
</AuxValues>
|
|
||||||
|
|
||||||
<Layout>
|
|
||||||
<DimensionLayout dim="0">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="searchPanel" alignment="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
<DimensionLayout dim="1">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="searchPanel" alignment="0" max="32767" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
</Layout>
|
|
||||||
<SubComponents>
|
|
||||||
<Container class="javax.swing.JPanel" name="searchPanel">
|
|
||||||
|
|
||||||
<Layout>
|
|
||||||
<DimensionLayout dim="0">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Component id="filterResultsPane" pref="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="searchField" max="32767" attributes="0"/>
|
|
||||||
<Group type="102" attributes="0">
|
|
||||||
<Component id="searchNameRadio" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="searchAccountRadio" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace pref="155" max="32767" attributes="0"/>
|
|
||||||
<Component id="searchBtn" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
<DimensionLayout dim="1">
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
|
||||||
<Group type="102" alignment="0" attributes="0">
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="searchField" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
|
||||||
<Component id="searchNameRadio" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="searchAccountRadio" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="searchBtn" alignment="3" min="-2" max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
<Component id="filterResultsPane" pref="320" max="32767" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
|
||||||
</DimensionLayout>
|
|
||||||
</Layout>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JTextField" name="searchField">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.searchField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JRadioButton" name="searchNameRadio">
|
|
||||||
<Properties>
|
|
||||||
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
|
||||||
<ComponentRef name="searchButtonGroup"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="selected" type="boolean" value="true"/>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.searchNameRadio.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
<Events>
|
|
||||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="searchNameRadioActionPerformed"/>
|
|
||||||
</Events>
|
|
||||||
</Component>
|
|
||||||
<Component class="javax.swing.JRadioButton" name="searchAccountRadio">
|
|
||||||
<Properties>
|
|
||||||
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
|
||||||
<ComponentRef name="searchButtonGroup"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.searchAccountRadio.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
<Container class="javax.swing.JScrollPane" name="filterResultsPane">
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
|
||||||
</AuxValues>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JTable" name="filterResultsTable">
|
|
||||||
<Properties>
|
|
||||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.filterResultsTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
<Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
|
|
||||||
<TableColumnModel selectionModel="0">
|
|
||||||
<Column maxWidth="25" minWidth="-1" prefWidth="-1" resizable="true">
|
|
||||||
<Title editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.filterResultsTable.columnModel.title0" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Title>
|
|
||||||
<Editor/>
|
|
||||||
<Renderer/>
|
|
||||||
</Column>
|
|
||||||
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
|
||||||
<Title editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.filterResultsTable.columnModel.title1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Title>
|
|
||||||
<Editor/>
|
|
||||||
<Renderer/>
|
|
||||||
</Column>
|
|
||||||
</TableColumnModel>
|
|
||||||
</Property>
|
|
||||||
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
|
|
||||||
<TableHeader reorderingAllowed="false" resizingAllowed="true"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
<Component class="javax.swing.JButton" name="searchBtn">
|
|
||||||
<Properties>
|
|
||||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
|
||||||
<ResourceString bundle="org/sleuthkit/autopsy/persona/Bundle.properties" key="PersonaSearchTopComponent.searchBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
</SubComponents>
|
|
||||||
</Form>
|
|
@ -1,217 +0,0 @@
|
|||||||
/*
|
|
||||||
* Autopsy Forensic Browser
|
|
||||||
*
|
|
||||||
* Copyright 2020 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.persona;
|
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import javax.swing.JTable;
|
|
||||||
import javax.swing.ListSelectionModel;
|
|
||||||
import javax.swing.table.DefaultTableModel;
|
|
||||||
import org.openide.util.Exceptions;
|
|
||||||
import org.openide.util.NbBundle.Messages;
|
|
||||||
import org.openide.windows.RetainLocation;
|
|
||||||
import org.openide.windows.TopComponent;
|
|
||||||
import org.openide.windows.WindowManager;
|
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.CentralRepoException;
|
|
||||||
import org.sleuthkit.autopsy.centralrepository.datamodel.Persona;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Top component for the Personas tool
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@TopComponent.Description(preferredID = "PersonasTopComponent", persistenceType = TopComponent.PERSISTENCE_NEVER)
|
|
||||||
@TopComponent.Registration(mode = "personasearch", openAtStartup = false)
|
|
||||||
@RetainLocation("personasearch")
|
|
||||||
@SuppressWarnings("PMD.SingularField")
|
|
||||||
public final class PersonaSearchTopComponent extends TopComponent {
|
|
||||||
|
|
||||||
@Messages({
|
|
||||||
"PSTopComponent_Name=Persona Search"
|
|
||||||
})
|
|
||||||
public PersonaSearchTopComponent() {
|
|
||||||
initComponents();
|
|
||||||
setName(Bundle.PSTopComponent_Name());
|
|
||||||
executeSearch();
|
|
||||||
|
|
||||||
searchBtn.addActionListener(new ActionListener() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
executeSearch();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Table model for the persona search results
|
|
||||||
*/
|
|
||||||
final class PersonaFilterTableModel extends DefaultTableModel {
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
PersonaFilterTableModel(Object[][] rows, String[] colNames) {
|
|
||||||
super(rows, colNames);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCellEditable(int row, int column) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateResultsTable(Collection<Persona> results) {
|
|
||||||
Object[][] rows = new Object[results.size()][2];
|
|
||||||
int i = 0;
|
|
||||||
for (Persona result : results) {
|
|
||||||
rows[i] = new String[]{String.valueOf(result.getId()), result.getName()};
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
DefaultTableModel updatedTableModel = new PersonaFilterTableModel(
|
|
||||||
rows,
|
|
||||||
new String[]{"ID", "Name"}
|
|
||||||
);
|
|
||||||
|
|
||||||
filterResultsTable.setModel(updatedTableModel);
|
|
||||||
|
|
||||||
// Formatting
|
|
||||||
filterResultsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
|
||||||
filterResultsTable.getColumnModel().getColumn(0).setMaxWidth(100);
|
|
||||||
filterResultsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void executeSearch() {
|
|
||||||
Collection<Persona> results = Collections.EMPTY_LIST;
|
|
||||||
try {
|
|
||||||
results = Persona.getPersonaByName(searchField.getText());
|
|
||||||
} catch (CentralRepoException ex) {
|
|
||||||
Exceptions.printStackTrace(ex);
|
|
||||||
}
|
|
||||||
updateResultsTable(results);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void componentOpened() {
|
|
||||||
super.componentOpened();
|
|
||||||
WindowManager.getDefault().setTopComponentFloating(this, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is called from within the constructor to initialize the form.
|
|
||||||
* WARNING: Do NOT modify this code. The content of this method is always
|
|
||||||
* regenerated by the Form Editor.
|
|
||||||
*/
|
|
||||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
||||||
private void initComponents() {
|
|
||||||
|
|
||||||
searchButtonGroup = new javax.swing.ButtonGroup();
|
|
||||||
searchPanel = new javax.swing.JPanel();
|
|
||||||
searchField = new javax.swing.JTextField();
|
|
||||||
searchNameRadio = new javax.swing.JRadioButton();
|
|
||||||
searchAccountRadio = new javax.swing.JRadioButton();
|
|
||||||
filterResultsPane = new javax.swing.JScrollPane();
|
|
||||||
filterResultsTable = new javax.swing.JTable();
|
|
||||||
searchBtn = new javax.swing.JButton();
|
|
||||||
|
|
||||||
setMinimumSize(new java.awt.Dimension(400, 400));
|
|
||||||
|
|
||||||
searchField.setText(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchField.text")); // NOI18N
|
|
||||||
|
|
||||||
searchButtonGroup.add(searchNameRadio);
|
|
||||||
searchNameRadio.setSelected(true);
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(searchNameRadio, org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchNameRadio.text")); // NOI18N
|
|
||||||
searchNameRadio.addActionListener(new java.awt.event.ActionListener() {
|
|
||||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
|
||||||
searchNameRadioActionPerformed(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
searchButtonGroup.add(searchAccountRadio);
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(searchAccountRadio, org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchAccountRadio.text")); // NOI18N
|
|
||||||
|
|
||||||
filterResultsTable.setToolTipText(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.filterResultsTable.toolTipText")); // NOI18N
|
|
||||||
filterResultsTable.getTableHeader().setReorderingAllowed(false);
|
|
||||||
filterResultsPane.setViewportView(filterResultsTable);
|
|
||||||
if (filterResultsTable.getColumnModel().getColumnCount() > 0) {
|
|
||||||
filterResultsTable.getColumnModel().getColumn(0).setMaxWidth(25);
|
|
||||||
filterResultsTable.getColumnModel().getColumn(0).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.filterResultsTable.columnModel.title0")); // NOI18N
|
|
||||||
filterResultsTable.getColumnModel().getColumn(1).setHeaderValue(org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.filterResultsTable.columnModel.title1")); // NOI18N
|
|
||||||
}
|
|
||||||
|
|
||||||
org.openide.awt.Mnemonics.setLocalizedText(searchBtn, org.openide.util.NbBundle.getMessage(PersonaSearchTopComponent.class, "PersonaSearchTopComponent.searchBtn.text")); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout searchPanelLayout = new javax.swing.GroupLayout(searchPanel);
|
|
||||||
searchPanel.setLayout(searchPanelLayout);
|
|
||||||
searchPanelLayout.setHorizontalGroup(
|
|
||||||
searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(searchPanelLayout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(filterResultsPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
|
|
||||||
.addComponent(searchField)
|
|
||||||
.addGroup(searchPanelLayout.createSequentialGroup()
|
|
||||||
.addComponent(searchNameRadio)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(searchAccountRadio)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 155, Short.MAX_VALUE)
|
|
||||||
.addComponent(searchBtn)))
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
searchPanelLayout.setVerticalGroup(
|
|
||||||
searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(searchPanelLayout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addGroup(searchPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(searchNameRadio)
|
|
||||||
.addComponent(searchAccountRadio)
|
|
||||||
.addComponent(searchBtn))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(filterResultsPane, javax.swing.GroupLayout.DEFAULT_SIZE, 320, Short.MAX_VALUE)
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
|
|
||||||
this.setLayout(layout);
|
|
||||||
layout.setHorizontalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(searchPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
layout.setVerticalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(searchPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
|
||||||
|
|
||||||
private void searchNameRadioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchNameRadioActionPerformed
|
|
||||||
// TODO add your handling code here:
|
|
||||||
}//GEN-LAST:event_searchNameRadioActionPerformed
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
||||||
private javax.swing.JScrollPane filterResultsPane;
|
|
||||||
private javax.swing.JTable filterResultsTable;
|
|
||||||
private javax.swing.JRadioButton searchAccountRadio;
|
|
||||||
private javax.swing.JButton searchBtn;
|
|
||||||
private javax.swing.ButtonGroup searchButtonGroup;
|
|
||||||
private javax.swing.JTextField searchField;
|
|
||||||
private javax.swing.JRadioButton searchNameRadio;
|
|
||||||
private javax.swing.JPanel searchPanel;
|
|
||||||
// End of variables declaration//GEN-END:variables
|
|
||||||
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user