From 2feff3dca2efe4877659a62bcfef55d89d3cf2d1 Mon Sep 17 00:00:00 2001 From: Greg DiCristofaro Date: Tue, 9 Feb 2021 16:42:33 -0500 Subject: [PATCH] first commit --- .../datamodel/hosts/AddEditHostDialog.form | 117 +++++ .../datamodel/hosts/AddEditHostDialog.java | 246 ++++++++++ .../autopsy/datamodel/hosts/Bundle.properties | 15 + .../datamodel/hosts/Bundle.properties-MERGED | 23 + .../datamodel/hosts/ManageHostsDialog.form | 359 +++++++++++++++ .../datamodel/hosts/ManageHostsDialog.java | 428 ++++++++++++++++++ 6 files changed, 1188 insertions(+) create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.form create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/AddEditHostDialog.java create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties-MERGED create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.form create mode 100644 Core/src/org/sleuthkit/autopsy/datamodel/hosts/ManageHostsDialog.java 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 +}