From 1c5d9111a66edbf2321bb5ae5afe6973629eaba6 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 14 Sep 2017 08:36:08 -0400 Subject: [PATCH 1/3] Show actual full path to the database --- .../optionspanel/Bundle.properties | 2 + .../optionspanel/EamDbSettingsDialog.form | 90 ++++++++++++------ .../optionspanel/EamDbSettingsDialog.java | 93 ++++++++++++++----- 3 files changed, 131 insertions(+), 54 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties index ed1de3ea5b..3145c9c3ea 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties @@ -74,3 +74,5 @@ GlobalSettingsPanel.bnManageProperties.text=Manage Correlation Properties ImportHashDatabaseDialog.lbInstructions.text=Choose an .idx file to import into the central repository. ImportHashDatabaseDialog.lbFilePath.text=File Path: ImportHashDatabaseDialog.tfFilePath.text= +EamDbSettingsDialog.lbDatabaseDesc.text=Database: +EamDbSettingsDialog.lbFullDbPath.text=jLabel2 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form index a3ff6584b0..c6ffc84110 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form @@ -114,40 +114,49 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -190,7 +199,12 @@ - + + + + + + @@ -212,6 +226,10 @@ + + + + @@ -286,6 +304,20 @@ + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index f6abcf896d..0e48b81bb4 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -114,6 +114,8 @@ public class EamDbSettingsDialog extends JDialog { cbDatabaseType = new javax.swing.JComboBox<>(); lbSingleUserSqLite = new javax.swing.JLabel(); lbDatabaseType = new javax.swing.JLabel(); + lbDatabaseDesc = new javax.swing.JLabel(); + lbFullDbPath = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); @@ -158,6 +160,14 @@ public class EamDbSettingsDialog extends JDialog { tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N + tfDatabasePath.addKeyListener(new java.awt.event.KeyAdapter() { + public void keyReleased(java.awt.event.KeyEvent evt) { + tfDatabasePathKeyReleased(evt); + } + public void keyTyped(java.awt.event.KeyEvent evt) { + tfDatabasePathKeyTyped(evt); + } + }); org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() { @@ -185,6 +195,10 @@ public class EamDbSettingsDialog extends JDialog { org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseType, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseType.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(lbDatabaseDesc, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbDatabaseDesc.text")); // NOI18N + + org.openide.awt.Mnemonics.setLocalizedText(lbFullDbPath, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.lbFullDbPath.text")); // NOI18N + javax.swing.GroupLayout pnSQLiteSettingsLayout = new javax.swing.GroupLayout(pnSQLiteSettings); pnSQLiteSettings.setLayout(pnSQLiteSettingsLayout); pnSQLiteSettingsLayout.setHorizontalGroup( @@ -192,32 +206,38 @@ public class EamDbSettingsDialog extends JDialog { .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() .addContainerGap() .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbHostName) - .addComponent(lbPort) - .addComponent(lbUserName) - .addComponent(lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbDatabasePath) - .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.TRAILING))) - .addGap(10, 10, 10) - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE) - .addGap(9, 9, 9)) - .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addComponent(tfDatabasePath) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnDatabasePathFileOpen) - .addGap(11, 11, 11)) .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tbDbHostname) - .addComponent(jpDbPassword) - .addComponent(tbDbUsername, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(tbDbPort)) - .addGap(10, 10, 10)))) + .addComponent(lbHostName) + .addComponent(lbPort) + .addComponent(lbUserName) + .addComponent(lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGap(10, 10, 10) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE) + .addGap(9, 9, 9)) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addComponent(tfDatabasePath) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnDatabasePathFileOpen) + .addGap(11, 11, 11)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup() + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tbDbUsername) + .addComponent(tbDbPort, javax.swing.GroupLayout.Alignment.LEADING)) + .addGap(10, 10, 10)))) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) ); pnSQLiteSettingsLayout.setVerticalGroup( pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -249,7 +269,11 @@ public class EamDbSettingsDialog extends JDialog { .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(10, 10, 10)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbFullDbPath) + .addComponent(lbDatabaseDesc)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); @@ -532,9 +556,23 @@ public class EamDbSettingsDialog extends JDialog { customizeComponents(); }//GEN-LAST:event_cbDatabaseTypeActionPerformed + private void tfDatabasePathKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfDatabasePathKeyTyped + + }//GEN-LAST:event_tfDatabasePathKeyTyped + + private void tfDatabasePathKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfDatabasePathKeyReleased + + }//GEN-LAST:event_tfDatabasePathKeyReleased + + private void updateFullDbPath(){ + lbFullDbPath.setText(tfDatabasePath.getText() + "/" + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT); + } + private void displayDatabaseSettings(boolean isPostgres) { lbDatabasePath.setVisible(!isPostgres); tfDatabasePath.setVisible(!isPostgres); + lbDatabaseDesc.setVisible(!isPostgres); + lbFullDbPath.setVisible(!isPostgres); lbSingleUserSqLite.setVisible(!isPostgres); bnDatabasePathFileOpen.setVisible(!isPostgres); lbHostName.setVisible(isPostgres); @@ -762,6 +800,7 @@ public class EamDbSettingsDialog extends JDialog { public void changedUpdate(DocumentEvent e) { firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); testingStatus = DatabaseTestResult.UNTESTED; + updateFullDbPath(); valid(); } @@ -769,6 +808,7 @@ public class EamDbSettingsDialog extends JDialog { public void insertUpdate(DocumentEvent e) { firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); testingStatus = DatabaseTestResult.UNTESTED; + updateFullDbPath(); valid(); } @@ -776,6 +816,7 @@ public class EamDbSettingsDialog extends JDialog { public void removeUpdate(DocumentEvent e) { firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null); testingStatus = DatabaseTestResult.UNTESTED; + updateFullDbPath(); valid(); } @@ -797,8 +838,10 @@ public class EamDbSettingsDialog extends JDialog { private javax.swing.JComboBox cbDatabaseType; private javax.swing.JFileChooser fcDatabasePath; private javax.swing.JPasswordField jpDbPassword; + private javax.swing.JLabel lbDatabaseDesc; private javax.swing.JLabel lbDatabasePath; private javax.swing.JLabel lbDatabaseType; + private javax.swing.JLabel lbFullDbPath; private javax.swing.JLabel lbHostName; private javax.swing.JLabel lbPort; private javax.swing.JLabel lbSingleUserSqLite; From ab5d047ae896d2c0645cba0604fb47a565a380cc Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Thu, 14 Sep 2017 10:25:47 -0400 Subject: [PATCH 2/3] Allow user to select db file directly --- .../optionspanel/Bundle.properties | 2 +- .../optionspanel/EamDbSettingsDialog.form | 106 ++++++++------- .../optionspanel/EamDbSettingsDialog.java | 126 ++++++++++-------- 3 files changed, 125 insertions(+), 109 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties index 3145c9c3ea..5e0831e130 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/Bundle.properties @@ -74,5 +74,5 @@ GlobalSettingsPanel.bnManageProperties.text=Manage Correlation Properties ImportHashDatabaseDialog.lbInstructions.text=Choose an .idx file to import into the central repository. ImportHashDatabaseDialog.lbFilePath.text=File Path: ImportHashDatabaseDialog.tfFilePath.text= -EamDbSettingsDialog.lbDatabaseDesc.text=Database: +EamDbSettingsDialog.lbDatabaseDesc.text=Database File: EamDbSettingsDialog.lbFullDbPath.text=jLabel2 diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form index c6ffc84110..0d925df9e1 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.form @@ -44,7 +44,7 @@ - + @@ -117,49 +117,47 @@ + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + @@ -179,7 +177,7 @@ - + @@ -195,16 +193,18 @@ - - - + + + - - - + + + - + + + @@ -226,10 +226,6 @@ - - - - @@ -318,6 +314,16 @@ + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java index 0e48b81bb4..8fb0bfe236 100755 --- a/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java +++ b/Core/src/org/sleuthkit/autopsy/centralrepository/optionspanel/EamDbSettingsDialog.java @@ -22,6 +22,7 @@ import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileFilter; import org.netbeans.spi.options.OptionsPanelController; import org.openide.util.NbBundle.Messages; import org.openide.windows.WindowManager; @@ -76,8 +77,26 @@ public class EamDbSettingsDialog extends JDialog { } initComponents(); - fcDatabasePath.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - fcDatabasePath.setDialogTitle(Bundle.EamDbSettingsDialog_fcDatabasePath_title()); + fcDatabasePath.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + fcDatabasePath.setAcceptAllFileFilterUsed(false); + fcDatabasePath.setDialogTitle(Bundle.EamDbSettingsDialog_fcDatabasePath_title()); + fcDatabasePath.setFileFilter(new FileFilter() { + @Override + public boolean accept(File pathname) { + if (pathname.isDirectory()) { + return true; + } else if (pathname.getName().toLowerCase().equals((CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT).toLowerCase())) { + return true; + } else { + return false; + } + } + + @Override + public String getDescription() { + return "Directories and Central Repository databases"; + } + }); cbDatabaseType.setSelectedItem(selectedPlatform); customizeComponents(); valid(); @@ -116,6 +135,7 @@ public class EamDbSettingsDialog extends JDialog { lbDatabaseType = new javax.swing.JLabel(); lbDatabaseDesc = new javax.swing.JLabel(); lbFullDbPath = new javax.swing.JLabel(); + filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767)); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); @@ -160,14 +180,6 @@ public class EamDbSettingsDialog extends JDialog { tfDatabasePath.setText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.text")); // NOI18N tfDatabasePath.setToolTipText(org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.tfDatabasePath.toolTipText")); // NOI18N - tfDatabasePath.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - tfDatabasePathKeyReleased(evt); - } - public void keyTyped(java.awt.event.KeyEvent evt) { - tfDatabasePathKeyTyped(evt); - } - }); org.openide.awt.Mnemonics.setLocalizedText(bnDatabasePathFileOpen, org.openide.util.NbBundle.getMessage(EamDbSettingsDialog.class, "EamDbSettingsDialog.bnDatabasePathFileOpen.text")); // NOI18N bnDatabasePathFileOpen.addActionListener(new java.awt.event.ActionListener() { @@ -206,38 +218,38 @@ public class EamDbSettingsDialog extends JDialog { .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() .addContainerGap() .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbHostName) + .addComponent(lbPort) + .addComponent(lbUserName) + .addComponent(lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(10, 10, 10) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbHostName) - .addComponent(lbPort) - .addComponent(lbUserName) - .addComponent(lbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(lbDatabasePath, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(lbUserPassword, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) - .addGap(10, 10, 10) - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE) - .addGap(9, 9, 9)) - .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addComponent(tfDatabasePath) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnDatabasePathFileOpen) - .addGap(11, 11, 11)) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup() - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(tbDbUsername) - .addComponent(tbDbPort, javax.swing.GroupLayout.Alignment.LEADING)) - .addGap(10, 10, 10)))) + .addComponent(cbDatabaseType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lbSingleUserSqLite, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE) + .addGap(9, 9, 9)) .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() - .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(18, 18, 18) - .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addComponent(tfDatabasePath) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnDatabasePathFileOpen) + .addGap(11, 11, 11)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnSQLiteSettingsLayout.createSequentialGroup() + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(tbDbHostname, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jpDbPassword, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(tbDbUsername) + .addComponent(tbDbPort, javax.swing.GroupLayout.Alignment.LEADING)) + .addGap(10, 10, 10)))) + .addGroup(pnSQLiteSettingsLayout.createSequentialGroup() + .addGap(55, 55, 55) + .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) ); pnSQLiteSettingsLayout.setVerticalGroup( pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -253,7 +265,7 @@ public class EamDbSettingsDialog extends JDialog { .addComponent(lbDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(tfDatabasePath, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(bnDatabasePathFileOpen)) - .addGap(0, 0, 0) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(tbDbHostname, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbHostName, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)) @@ -266,14 +278,16 @@ public class EamDbSettingsDialog extends JDialog { .addComponent(tbDbUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lbUserName, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(lbFullDbPath) - .addComponent(lbDatabaseDesc)) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(jpDbPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lbUserPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(pnSQLiteSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lbFullDbPath, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lbDatabaseDesc, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); @@ -292,7 +306,7 @@ public class EamDbSettingsDialog extends JDialog { .addGroup(layout.createSequentialGroup() .addGap(10, 10, 10) .addComponent(pnSQLiteSettings, 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) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE) .addComponent(pnButtons, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(10, 10, 10)) ); @@ -331,6 +345,9 @@ public class EamDbSettingsDialog extends JDialog { fcDatabasePath.setSelectedFile(new File(dbSettingsSqlite.getDbDirectory())); if (fcDatabasePath.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File databaseFile = fcDatabasePath.getSelectedFile(); + if (databaseFile.isFile()) { + databaseFile = fcDatabasePath.getCurrentDirectory(); + } try { tfDatabasePath.setText(databaseFile.getCanonicalPath()); valid(); @@ -556,16 +573,8 @@ public class EamDbSettingsDialog extends JDialog { customizeComponents(); }//GEN-LAST:event_cbDatabaseTypeActionPerformed - private void tfDatabasePathKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfDatabasePathKeyTyped - - }//GEN-LAST:event_tfDatabasePathKeyTyped - - private void tfDatabasePathKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tfDatabasePathKeyReleased - - }//GEN-LAST:event_tfDatabasePathKeyReleased - private void updateFullDbPath(){ - lbFullDbPath.setText(tfDatabasePath.getText() + "/" + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT); + lbFullDbPath.setText(tfDatabasePath.getText() + File.separator + CENTRAL_REPO_DB_NAME + CENTRAL_REPO_SQLITE_EXT); } private void displayDatabaseSettings(boolean isPostgres) { @@ -837,6 +846,7 @@ public class EamDbSettingsDialog extends JDialog { private javax.swing.JButton bnOk; private javax.swing.JComboBox cbDatabaseType; private javax.swing.JFileChooser fcDatabasePath; + private javax.swing.Box.Filler filler1; private javax.swing.JPasswordField jpDbPassword; private javax.swing.JLabel lbDatabaseDesc; private javax.swing.JLabel lbDatabasePath; From 61872f84f50a0f00c620d9db64b2415253e58cf9 Mon Sep 17 00:00:00 2001 From: Ann Priestman Date: Fri, 15 Sep 2017 08:53:43 -0400 Subject: [PATCH 3/3] Update screenshot --- .../images/central_repo_sqlite.png | Bin 12297 -> 13640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/doxygen-user/images/central_repo_sqlite.png b/docs/doxygen-user/images/central_repo_sqlite.png index 1ef4983058c3bca54658c589b4017503c857141e..1a1f633659ac18cb4809d2c54c194c8d4ac89822 100644 GIT binary patch literal 13640 zcmeIYcT`hf*De}GMHB>7dQ$`;A|N2W1nEUUx^$^QdT#-ug7l*FA|N0jT?hfGQ4o+0 z0tul?FQK>4LeA#*e&fC0d%rvG8R!3#F*35U_gXV6YtJ>;^E`7#zR*;rxWRY>1Oid0 zswn7yK$m}lK$p0$Uk0v-xHawrA7pMSMxG$h%{v$GOQ4KT^uR?@FI5di(pfS}asdgA zebHYa&^?fFB`}aRDp^6% z2E#u}9j*Fql#dEFRC8{6yfNT$f^`3Cja8sZHQVU^^;KB3nuOHLjt|-Yv0Lx&-ubzE zFmd7Yn|JZ26s~n`%Yng7Gg|{Yf!R5jWzSpPb_g;MNLEzwUWIlDTmwnP9AB zY&_oNzvtoMQF0y-`Vm-)^FmYK#Z$JRCO6|KX(h2Ws#H@CRZY$QQaC{&(kcc7dV^wt z3&dyLhX3>}nt)4UE`eDAa2_xIe1iyD~D zC*!b)R~MrV8RU-bBB(HeHE6YBe$?o@Ay0kT%x#D*CwS7MZ-mLErH7S{yp8^; z{UF*f7)qZ-Hj`#gA24{&ha0f8kQ}~g;WuywPJ~Y*N`pK*8#yVbh;0eW@&il$ybtVI zTF>=tY!+g5QK#{!jd9G``AX=QxWhzh>X0NIQscvzvy%d~;%6c3cYXDNzh)>y+)wPn z1mdDQP>1UdTo!xfoe%=Yn1J*T0u?p2nQ6~aQ=iZDPVE*ar%M2G?yw!gc30eQ@N>if zL^9xPp-W|=GyK+i^J6>mR3Q*(MZID8iG(CeIBa>yESj6sI68uxT00LpK&Q>aYYe6? zS9sm|uDj~m)a%ge*SNfW*QgF{USap@`rAl_9%}fV^*Iv_@tyqfL9e|&IU!hOj#jyb zQ8IIgLXIS9)&WXRe=gX{yfr!Vp0R-8PRd zmAne-_fdj|Z>|h(w$(pSu>Yt5yM-2JtJcztCXVAf%{L*OKb~3qT3NqNO)f!Blu(E` zdHaX@ksLX}rw4M7YLN|}_OBdm`7=FjN$>IVJzda2Y3fs!BSW1zeV`W@HQ>w4O+0Q| z6o?l^xy8<7)=nbQXIc9#;C9Ac5i_W#2%P*ooxG&o-sfsvzf9J9HcdtF)1+L^7Qy8Qn2v(=gQ%*LiW^N)c&Ea{OT*Ym_T3X9e7ROo({Y@m zg2JbHw62s=TeB|c?_{yO7bD9?+{xS9i<))4xK(B)dRmQ;~VMp&ax zxZ(NAIyp6YgJJl$8T=E=-5Q9qpU+e_!2-p;q)^llxbh*IU7}s=cvUeq$ZLIJTbqnM zFVMAQ(vUE=J4TZtS>etW0QFwpisGRzXl>|eg=^xI9E*xnyHGMZCBB+kZLT(Bxb(wB zh}1WtviBCjXgSE9~S+hP7ci2$k4Gc#P=~h?6@-H(ri5!!h}B-9@u~09Q6LQgf2i6d)_

?<?V&i01fs=|>psRSCZRy(&+Le92_E8*)Bl9Dlp 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 Jh1{!m{|gI6g3kZ| literal 12297 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 Vq4y