diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.form b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.form
new file mode 100644
index 0000000000..3ffa0901da
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.form
@@ -0,0 +1,117 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.java
new file mode 100644
index 0000000000..70041e1105
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.java
@@ -0,0 +1,246 @@
+/*
+ * Central Repository
+ *
+ * Copyright 2021 Basis Technology Corp.
+ * Contact: carrier sleuthkit 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.datamodel.hosts;
+
+import org.sleuthkit.datamodel.Host;
+import java.util.Collection;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import org.openide.util.NbBundle.Messages;
+
+/**
+ *
+ * Dialog for adding or editing a host.
+ */
+class AddEditHostDialog extends javax.swing.JDialog {
+
+ private static final long serialVersionUID = 1L;
+
+ private boolean changed = false;
+
+ private final Set hostNamesUpper;
+ private final Host initialHost;
+
+ AddEditHostDialog(java.awt.Frame parent, Collection currentHosts) {
+ this(parent, currentHosts, null);
+ }
+
+ /**
+ * Main constructor.
+ *
+ * @param parent The parent frame for this dialog.
+ * @param currentHosts The current set of hosts (used for determining if
+ * name is unique).
+ * @param initialHost If adding a new host, this will be a null value.
+ * Otherwise, if editing, this will be the host being edited.
+ */
+ @Messages({
+ "AddEditHostDialog_addHost_title=Add Host",
+ "AddEditHostDialog_editHost_title=Edit Host"
+ })
+ AddEditHostDialog(java.awt.Frame parent, Collection currentHosts, Host initialHost) {
+ super(parent, true);
+ this.initialHost = initialHost;
+ setTitle(initialHost == null ? Bundle.AddEditHostDialog_addHost_title() : Bundle.AddEditHostDialog_editHost_title());
+
+ Stream curHostStream = (currentHosts == null) ? Stream.empty() : currentHosts.stream();
+ hostNamesUpper = curHostStream
+ .filter(h -> h != null && h.getName() != null)
+ .map(h -> h.getName().toUpperCase())
+ .collect(Collectors.toSet());
+
+ initComponents();
+ onNameUpdate(initialHost == null ? null : initialHost.getName());
+
+ // initially, don't show validation message (for empty strings or repeat),
+ // but do disable ok button if not valid.
+ validationLabel.setText("");
+
+ inputTextField.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ onNameUpdate(inputTextField.getText());
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ onNameUpdate(inputTextField.getText());
+ }
+
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ onNameUpdate(inputTextField.getText());
+ }
+ });
+ }
+
+ /**
+ * @return The current string value for the name in the input field.
+ */
+ String getValue() {
+ return inputTextField.getText();
+ }
+
+ /**
+ * @return Whether or not the value has been changed and the user pressed
+ * okay to save the new value.
+ */
+ boolean isChanged() {
+ return changed;
+ }
+
+ /**
+ * When the text field is updated, this method is called.
+ *
+ * @param newNameValue
+ */
+ private void onNameUpdate(String newNameValue) {
+ String newNameValueOrEmpty = newNameValue == null ? "" : newNameValue;
+ // update input text field if it is not the same.
+ if (!newNameValueOrEmpty.equals(this.inputTextField.getText())) {
+ inputTextField.setText(newNameValue);
+ }
+
+ // validate text input against invariants setting validation
+ // message and whether or not okay button is enabled accordingly.
+ String validationMessage = getValidationMessage(newNameValue);
+ okButton.setEnabled(validationMessage == null);
+ validationLabel.setText(validationMessage == null ? "" : validationMessage);
+ }
+
+ /**
+ * Gets the validation message based on the current text checked against the
+ * host names.
+ *
+ * @param name The current name in the text field.
+ * @return The validation message if the name is not valid or null.
+ */
+ @Messages({
+ "AddEditHostDialog_getValidationMessage_onEmpty=Please provide some text for the host name.",
+ "AddEditHostDialog_getValidationMessage_sameAsOriginal=Please provide a new name for this host.",
+ "AddEditHostDialog_getValidationMessage_onDuplicate=Another host already has the same name. Please choose a different name for this host.",})
+ private String getValidationMessage(String name) {
+ if (name == null || name.isEmpty()) {
+ return Bundle.AddEditHostDialog_getValidationMessage_onEmpty();
+ } else if (initialHost != null && name.equalsIgnoreCase(initialHost.getName())) {
+ return Bundle.AddEditHostDialog_getValidationMessage_sameAsOriginal();
+ } else if (hostNamesUpper.contains(name.toUpperCase())) {
+ return Bundle.AddEditHostDialog_getValidationMessage_onDuplicate();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * 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")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ inputTextField = new javax.swing.JTextField();
+ javax.swing.JLabel nameLabel = new javax.swing.JLabel();
+ validationLabel = new javax.swing.JLabel();
+ okButton = new javax.swing.JButton();
+ javax.swing.JButton cancelButton = new javax.swing.JButton();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+
+ inputTextField.setText(org.openide.util.NbBundle.getMessage(AddEditHostDialog.class, "AddEditHostDialog.inputTextField.text")); // NOI18N
+
+ nameLabel.setText(org.openide.util.NbBundle.getMessage(AddEditHostDialog.class, "AddEditHostDialog.nameLabel.text")); // NOI18N
+
+ validationLabel.setForeground(new java.awt.Color(204, 0, 51));
+ validationLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
+
+ okButton.setText(org.openide.util.NbBundle.getMessage(AddEditHostDialog.class, "AddEditHostDialog.okButton.text")); // NOI18N
+ okButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ okButtonActionPerformed(evt);
+ }
+ });
+
+ cancelButton.setText(org.openide.util.NbBundle.getMessage(AddEditHostDialog.class, "AddEditHostDialog.cancelButton.text")); // NOI18N
+ cancelButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cancelButtonActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(validationLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(inputTextField)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(nameLabel)
+ .addGap(0, 0, Short.MAX_VALUE))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addGap(0, 222, Short.MAX_VALUE)
+ .addComponent(cancelButton)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(okButton)))
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(nameLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(inputTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(validationLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(okButton)
+ .addComponent(cancelButton))
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+
+ pack();
+ }// //GEN-END:initComponents
+
+ private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
+ this.changed = true;
+ dispose();
+ }//GEN-LAST:event_okButtonActionPerformed
+
+
+ private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
+ this.changed = false;
+ dispose();
+ }//GEN-LAST:event_cancelButtonActionPerformed
+
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JTextField inputTextField;
+ private javax.swing.JButton okButton;
+ private javax.swing.JLabel validationLabel;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties
new file mode 100644
index 0000000000..1c2607cb95
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties
@@ -0,0 +1,15 @@
+# To change this license header, choose License Headers in Project Properties.
+# To change this template file, choose Tools | Templates
+# and open the template in the editor.
+ManageHostsDialog.hostDetailsLabel.text=Host Details
+ManageHostsDialog.hostNameLabel.text=Host Name:
+ManageHostsDialog.closeButton.text=Close
+ManageHostsDialog.hostDescriptionTextArea.text=Hosts represent individual devices that may have multiple data sources.
+ManageHostsDialog.hostListLabel.text=Hosts
+ManageHostsDialog.newButton.text=New
+ManageHostsDialog.editButton.text=Edit
+ManageHostsDialog.deleteButton.text=Delete
+AddEditHostDialog.nameLabel.text=Name:
+AddEditHostDialog.okButton.text=OK
+AddEditHostDialog.cancelButton.text=Cancel
+AddEditHostDialog.inputTextField.text=jTextField1
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED
new file mode 100644
index 0000000000..bc9689aa11
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED
@@ -0,0 +1,23 @@
+AddEditHostDialog_addHost_title=Add Host
+AddEditHostDialog_editHost_title=Edit Host
+AddEditHostDialog_getValidationMessage_onDuplicate=Another host already has the same name. Please choose a different name for this host.
+AddEditHostDialog_getValidationMessage_onEmpty=Please provide some text for the host name.
+AddEditHostDialog_getValidationMessage_sameAsOriginal=Please provide a new name for this host.
+CTL_OpenHosts=Hosts
+# To change this license header, choose License Headers in Project Properties.
+# To change this template file, choose Tools | Templates
+# and open the template in the editor.
+ManageHostsDialog.hostDetailsLabel.text=Host Details
+ManageHostsDialog.hostNameLabel.text=Host Name:
+ManageHostsDialog.closeButton.text=Close
+ManageHostsDialog.hostDescriptionTextArea.text=Hosts represent individual devices that may have multiple data sources.
+ManageHostsDialog.hostListLabel.text=Hosts
+ManageHostsDialog.newButton.text=New
+ManageHostsDialog.editButton.text=Edit
+ManageHostsDialog.deleteButton.text=Delete
+AddEditHostDialog.nameLabel.text=Name:
+AddEditHostDialog.okButton.text=OK
+AddEditHostDialog.cancelButton.text=Cancel
+AddEditHostDialog.inputTextField.text=jTextField1
+ManageHostsDialog_title_text=Manage Hosts
+OpenHostsAction_displayName=Hosts
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.form b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.form
new file mode 100644
index 0000000000..40ff2c13e5
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.form
@@ -0,0 +1,359 @@
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.java b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.java
new file mode 100644
index 0000000000..3da8f9a303
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.java
@@ -0,0 +1,428 @@
+/*
+ * Central Repository
+ *
+ * Copyright 2021 Basis Technology Corp.
+ * Contact: carrier sleuthkit 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.datamodel.hosts;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.stream.Collectors;
+import javax.swing.JFrame;
+import javax.swing.ListModel;
+import org.openide.util.NbBundle.Messages;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.datamodel.Host;
+import org.sleuthkit.datamodel.TskCoreException;
+
+/**
+ * Dialog for managing CRUD operations with hosts from the UI.
+ */
+@Messages({
+ "ManageHostsDialog_title_text=Manage Hosts"
+})
+public class ManageHostsDialog extends javax.swing.JDialog {
+
+ private static final Logger logger = Logger.getLogger(ManageHostsDialog.class.getName());
+ private static final long serialVersionUID = 1L;
+
+ private List hostListData = Collections.emptyList();
+
+ /**
+ *
+ * @param parent
+ * @param modal
+ */
+ public ManageHostsDialog(java.awt.Frame parent, boolean modal) {
+ super(parent, modal);
+ initComponents();
+ refresh();
+
+ // refreshes UI when selection changes including button enabled state and data.
+ this.hostList.addListSelectionListener((evt) -> refreshComponents());
+ }
+
+ /**
+ * @return The currently selected host in the list or null if no host is
+ * selected.
+ */
+ Host getSelectedHost() {
+ return this.hostList.getSelectedValue();
+ }
+
+ /**
+ * Shows add/edit dialog, and if a value is returned, creates a new Host.
+ */
+ private void addHost() {
+ String newHostName = getAddEditDialogName(null);
+ if (newHostName != null) {
+ try {
+ Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().createHost(newHostName);
+ } catch (NoCurrentCaseException | TskCoreException e) {
+ logger.log(Level.WARNING, String.format("Unable to add new host '%s' at this time.", newHostName), e);
+ }
+ System.out.println(String.format("Should create a host of name %s", newHostName));
+ refresh();
+ }
+ }
+
+ /**
+ * Deletes the selected host if possible.
+ *
+ * @param selectedHost
+ */
+ private void deleteHost(Host selectedHost) {
+ if (selectedHost != null) {
+ System.out.println("Deleting: " + selectedHost);
+ refresh();
+ }
+ }
+
+ /**
+ * Shows add/edit dialog, and if a value is returned, creates a new Host.
+ *
+ * @param selectedHost The selected host.
+ */
+ private void editHost(Host selectedHost) {
+ if (selectedHost != null) {
+ String newHostName = getAddEditDialogName(selectedHost);
+ if (newHostName != null) {
+ //TODO
+ logger.log(Level.SEVERE, String.format("This needs to edit host %d to change to %s.", selectedHost.getId(), newHostName));
+ //Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().updateHost(selectedHost.getId(), newHostName);
+ refresh();
+ }
+ }
+ }
+
+ /**
+ * Shows the dialog to add or edit the name of a host.
+ *
+ * @param origValue The original values for the host or null if adding a
+ * host.
+ * @return The new name for the host or null if operation was cancelled.
+ */
+ private String getAddEditDialogName(Host origValue) {
+ JFrame parent = (this.getRootPane() != null && this.getRootPane().getParent() instanceof JFrame)
+ ? (JFrame) this.getRootPane().getParent()
+ : null;
+
+ AddEditHostDialog addEditDialog = new AddEditHostDialog(parent, hostListData, origValue);
+ if (addEditDialog.isChanged()) {
+ String newHostName = addEditDialog.getName();
+ return newHostName;
+ }
+
+ return null;
+ }
+
+ /**
+ * Refreshes the data and ui components for this dialog.
+ */
+ private void refresh() {
+ refreshData();
+ refreshComponents();
+ }
+
+ /**
+ * Refreshes the data for this dialog and updates the host JList with the
+ * hosts.
+ */
+ private void refreshData() {
+ Host selectedHost = hostList.getSelectedValue();
+ Long selectedId = selectedHost == null ? null : selectedHost.getId();
+ hostListData = getHostListData();
+ hostList.setListData(hostListData.toArray(new Host[0]));
+
+ if (selectedId != null) {
+ ListModel model = hostList.getModel();
+
+ for (int i = 0; i < model.getSize(); i++) {
+ Object o = model.getElementAt(i);
+ if (o instanceof Host && ((Host) o).getId() == selectedId) {
+ hostList.setSelectedIndex(i);
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current list of hosts for the case.
+ *
+ * @return The list of hosts to be displayed in the list (sorted
+ * alphabetically).
+ */
+ private List getHostListData() {
+ List toRet = null;
+ try {
+ toRet = Case.getCurrentCaseThrows().getSleuthkitCase().getHostManager().getHosts();
+ } catch (TskCoreException | NoCurrentCaseException ex) {
+ logger.log(Level.WARNING, "There was an error while fetching hosts for current case.", ex);
+ }
+ return (toRet == null)
+ ? Collections.emptyList()
+ : toRet.stream()
+ .filter(h -> h != null)
+ .sorted((a, b) -> getNameOrEmpty(a).compareToIgnoreCase(getNameOrEmpty(b)))
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * Returns the name of the host or an empty string if the host or name of
+ * host is null.
+ *
+ * @param h The host.
+ * @return The name of the host or empty string.
+ */
+ private String getNameOrEmpty(Host h) {
+ return (h == null || h.getName() == null) ? "" : h.getName();
+ }
+
+ /**
+ * Refreshes component's enabled state and displayed host data.
+ */
+ private void refreshComponents() {
+ Host selectedHost = this.hostList.getSelectedValue();
+ boolean itemSelected = selectedHost != null;
+ this.editButton.setEnabled(itemSelected);
+ this.deleteButton.setEnabled(itemSelected);
+ String nameTextFieldStr = selectedHost != null && selectedHost.getName() != null ? selectedHost.getName() : "";
+ this.hostNameTextField.setText(nameTextFieldStr);
+
+ }
+
+ /**
+ * 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")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ javax.swing.JScrollPane manageHostsScrollPane = new javax.swing.JScrollPane();
+ javax.swing.JPanel manageHostsPanel = new javax.swing.JPanel();
+ javax.swing.JScrollPane hostListScrollPane = new javax.swing.JScrollPane();
+ hostList = new javax.swing.JList<>();
+ javax.swing.JScrollPane hostDescriptionScrollPane = new javax.swing.JScrollPane();
+ hostDescriptionTextArea = new javax.swing.JTextArea();
+ newButton = new javax.swing.JButton();
+ deleteButton = new javax.swing.JButton();
+ closeButton = new javax.swing.JButton();
+ javax.swing.JLabel hostListLabel = new javax.swing.JLabel();
+ javax.swing.JSeparator jSeparator1 = new javax.swing.JSeparator();
+ javax.swing.JLabel hostNameLabel = new javax.swing.JLabel();
+ hostNameTextField = new javax.swing.JTextField();
+ editButton = new javax.swing.JButton();
+ javax.swing.JLabel hostDetailsLabel = new javax.swing.JLabel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ setMinimumSize(new java.awt.Dimension(600, 450));
+
+ manageHostsScrollPane.setMinimumSize(new java.awt.Dimension(600, 450));
+ manageHostsScrollPane.setPreferredSize(new java.awt.Dimension(600, 450));
+
+ manageHostsPanel.setPreferredSize(new java.awt.Dimension(527, 407));
+
+ hostList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+ hostListScrollPane.setViewportView(hostList);
+
+ hostDescriptionTextArea.setEditable(false);
+ hostDescriptionTextArea.setBackground(new java.awt.Color(240, 240, 240));
+ hostDescriptionTextArea.setColumns(20);
+ hostDescriptionTextArea.setLineWrap(true);
+ hostDescriptionTextArea.setRows(3);
+ hostDescriptionTextArea.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.hostDescriptionTextArea.text")); // NOI18N
+ hostDescriptionTextArea.setWrapStyleWord(true);
+ hostDescriptionScrollPane.setViewportView(hostDescriptionTextArea);
+
+ newButton.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.newButton.text")); // NOI18N
+ newButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
+ newButton.setMaximumSize(new java.awt.Dimension(70, 23));
+ newButton.setMinimumSize(new java.awt.Dimension(70, 23));
+ newButton.setPreferredSize(new java.awt.Dimension(70, 23));
+ newButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ newButtonActionPerformed(evt);
+ }
+ });
+
+ deleteButton.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.deleteButton.text")); // NOI18N
+ deleteButton.setMargin(new java.awt.Insets(2, 6, 2, 6));
+ deleteButton.setMaximumSize(new java.awt.Dimension(70, 23));
+ deleteButton.setMinimumSize(new java.awt.Dimension(70, 23));
+ deleteButton.setPreferredSize(new java.awt.Dimension(70, 23));
+ deleteButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ deleteButtonActionPerformed(evt);
+ }
+ });
+
+ closeButton.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.closeButton.text")); // NOI18N
+ closeButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ closeButtonActionPerformed(evt);
+ }
+ });
+
+ hostListLabel.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.hostListLabel.text")); // NOI18N
+
+ jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
+
+ hostNameLabel.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.hostNameLabel.text")); // NOI18N
+
+ hostNameTextField.setEditable(false);
+
+ editButton.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.editButton.text")); // NOI18N
+ editButton.setMaximumSize(new java.awt.Dimension(70, 23));
+ editButton.setMinimumSize(new java.awt.Dimension(70, 23));
+ editButton.setPreferredSize(new java.awt.Dimension(70, 23));
+ editButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ editButtonActionPerformed(evt);
+ }
+ });
+
+ hostDetailsLabel.setText(org.openide.util.NbBundle.getMessage(ManageHostsDialog.class, "ManageHostsDialog.hostDetailsLabel.text")); // NOI18N
+
+ javax.swing.GroupLayout manageHostsPanelLayout = new javax.swing.GroupLayout(manageHostsPanel);
+ manageHostsPanel.setLayout(manageHostsPanelLayout);
+ manageHostsPanelLayout.setHorizontalGroup(
+ manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(hostDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(hostListLabel)
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(hostListScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(closeButton))
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addGap(29, 29, 29)
+ .addComponent(hostNameLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(hostNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE)))
+ .addContainerGap())
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(hostDetailsLabel)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
+ );
+ manageHostsPanelLayout.setVerticalGroup(
+ manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addComponent(hostDetailsLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(hostNameLabel)
+ .addComponent(hostNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(closeButton))
+ .addComponent(jSeparator1)
+ .addGroup(manageHostsPanelLayout.createSequentialGroup()
+ .addComponent(hostDescriptionScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(hostListLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(hostListScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 325, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(manageHostsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(newButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(deleteButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(editButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
+ .addContainerGap())
+ );
+
+ java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("com/mycompany/hostsmanagement/Bundle"); // NOI18N
+ newButton.getAccessibleContext().setAccessibleName(bundle.getString("ManageHostsDialog.newButton.text")); // NOI18N
+ deleteButton.getAccessibleContext().setAccessibleName(bundle.getString("ManageHostsDialog.deleteButton.text")); // NOI18N
+ closeButton.getAccessibleContext().setAccessibleName(bundle.getString("ManageHostsDialog.closeButton.text")); // NOI18N
+ hostListLabel.getAccessibleContext().setAccessibleName(bundle.getString("ManageHostsDialog.hostListLabel.text")); // NOI18N
+ hostNameLabel.getAccessibleContext().setAccessibleName(bundle.getString("ManageHostsDialog.hostNameLabel.text")); // NOI18N
+ editButton.getAccessibleContext().setAccessibleName(bundle.getString("ManageHostsDialog.editButton.text")); // NOI18N
+ hostDetailsLabel.getAccessibleContext().setAccessibleName(bundle.getString("ManageHostsDialog.hostDetailsLabel.text")); // NOI18N
+
+ manageHostsScrollPane.setViewportView(manageHostsPanel);
+
+ 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, 0)
+ .addComponent(manageHostsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addGap(0, 0, 0)
+ .addComponent(manageHostsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+
+ pack();
+ }// //GEN-END:initComponents
+
+ private void newButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newButtonActionPerformed
+ addHost();
+ }//GEN-LAST:event_newButtonActionPerformed
+
+ private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed
+ Host host = this.hostList.getSelectedValue();
+ if (host != null) {
+ deleteHost(host);
+ }
+ }//GEN-LAST:event_deleteButtonActionPerformed
+
+ private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed
+ dispose();
+ }//GEN-LAST:event_closeButtonActionPerformed
+
+ private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed
+ Host host = this.hostList.getSelectedValue();
+ if (host != null) {
+ editHost(host);
+ }
+ }//GEN-LAST:event_editButtonActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton closeButton;
+ private javax.swing.JButton deleteButton;
+ private javax.swing.JButton editButton;
+ private javax.swing.JTextArea hostDescriptionTextArea;
+ private javax.swing.JList hostList;
+ private javax.swing.JTextField hostNameTextField;
+ private javax.swing.JButton newButton;
+ // End of variables declaration//GEN-END:variables
+}