diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.form b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.form index 55f37ad358..265c1b77de 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.form +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.form @@ -27,10 +27,10 @@ - + - + @@ -43,6 +43,7 @@ + @@ -76,10 +77,13 @@ - + - + + + + @@ -100,10 +104,13 @@ - + + + + - + @@ -123,6 +130,15 @@ + + + + + + + + + @@ -141,6 +157,15 @@ + + + + + + + + + @@ -174,10 +199,13 @@ - + - + + + + @@ -209,13 +237,13 @@ - + - + - + @@ -225,20 +253,6 @@ - - - - - - - - - - - - - - @@ -256,13 +270,13 @@ - + - + - + @@ -326,7 +340,7 @@ - + @@ -402,11 +416,6 @@ - - - - - @@ -422,7 +431,7 @@ - + diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java index 68fe3a7a6e..d13a9aea06 100644 --- a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java +++ b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/StringsContentPanel.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.contentviewers.textcontentviewer; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Arrays; import java.util.List; import java.util.logging.Level; import org.openide.util.NbBundle; @@ -32,6 +33,7 @@ import org.sleuthkit.autopsy.coreutils.StringExtract; import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractResult; import org.sleuthkit.autopsy.coreutils.StringExtract.StringExtractUnicodeTable.SCRIPT; import org.sleuthkit.autopsy.datamodel.StringContent; +import org.sleuthkit.autopsy.guiutils.WrapLayout; import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.TskCoreException; @@ -78,6 +80,11 @@ public class StringsContentPanel extends javax.swing.JPanel { languageCombo.addItem(s); }); + // use wrap layout for better component wrapping + WrapLayout layout = new WrapLayout(0,5); + layout.setOppositeAligned(Arrays.asList(panelScriptSelect)); + controlPanel.setLayout(layout); + } final void resetDisplay() { @@ -119,7 +126,6 @@ public class StringsContentPanel extends javax.swing.JPanel { pageLabel2 = new javax.swing.JLabel(); javax.swing.JSeparator jSepMed5 = new javax.swing.JSeparator(); prevPageButton = new javax.swing.JButton(); - javax.swing.JSeparator jSepXs1 = new javax.swing.JSeparator(); nextPageButton = new javax.swing.JButton(); javax.swing.JSeparator jSepMed6 = new javax.swing.JSeparator(); javax.swing.JPanel panelGoToPage = new javax.swing.JPanel(); @@ -140,8 +146,8 @@ public class StringsContentPanel extends javax.swing.JPanel { selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.selectAllMenuItem.text")); // NOI18N rightClickMenu.add(selectAllMenuItem); - setMinimumSize(new java.awt.Dimension(5, 5)); - setPreferredSize(new java.awt.Dimension(100, 58)); + setMinimumSize(new java.awt.Dimension(250, 5)); + setPreferredSize(new java.awt.Dimension(250, 58)); setLayout(new java.awt.BorderLayout()); controlPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 5, 0)); @@ -149,28 +155,36 @@ public class StringsContentPanel extends javax.swing.JPanel { panelPageOfCount.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0)); pageLabel.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.pageLabel.text_1")); // NOI18N - pageLabel.setMaximumSize(new java.awt.Dimension(33, 14)); - pageLabel.setMinimumSize(new java.awt.Dimension(33, 14)); + pageLabel.setMaximumSize(new java.awt.Dimension(33, 25)); + pageLabel.setMinimumSize(new java.awt.Dimension(33, 25)); + pageLabel.setPreferredSize(new java.awt.Dimension(32, 25)); panelPageOfCount.add(pageLabel); jSepMed1.setPreferredSize(new java.awt.Dimension(5, 0)); panelPageOfCount.add(jSepMed1); currentPageLabel.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.currentPageLabel.text_1")); // NOI18N - currentPageLabel.setMaximumSize(new java.awt.Dimension(18, 14)); - currentPageLabel.setPreferredSize(new java.awt.Dimension(18, 14)); + currentPageLabel.setMaximumSize(new java.awt.Dimension(18, 25)); + currentPageLabel.setMinimumSize(new java.awt.Dimension(7, 25)); + currentPageLabel.setPreferredSize(new java.awt.Dimension(18, 25)); panelPageOfCount.add(currentPageLabel); jSepMed2.setPreferredSize(new java.awt.Dimension(5, 0)); panelPageOfCount.add(jSepMed2); ofLabel.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.ofLabel.text_1")); // NOI18N + ofLabel.setMaximumSize(new java.awt.Dimension(11, 25)); + ofLabel.setMinimumSize(new java.awt.Dimension(11, 25)); + ofLabel.setPreferredSize(new java.awt.Dimension(11, 25)); panelPageOfCount.add(ofLabel); jSepMed3.setPreferredSize(new java.awt.Dimension(5, 0)); panelPageOfCount.add(jSepMed3); totalPageLabel.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.totalPageLabel.text_1")); // NOI18N + totalPageLabel.setMaximumSize(new java.awt.Dimension(21, 25)); + totalPageLabel.setMinimumSize(new java.awt.Dimension(21, 25)); + totalPageLabel.setPreferredSize(new java.awt.Dimension(21, 25)); panelPageOfCount.add(totalPageLabel); jSepMed4.setPreferredSize(new java.awt.Dimension(5, 0)); @@ -181,8 +195,9 @@ public class StringsContentPanel extends javax.swing.JPanel { panelPageNextPrevButton.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 0, 0)); pageLabel2.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.pageLabel2.text")); // NOI18N - pageLabel2.setMaximumSize(new java.awt.Dimension(29, 14)); - pageLabel2.setMinimumSize(new java.awt.Dimension(29, 14)); + pageLabel2.setMaximumSize(new java.awt.Dimension(29, 25)); + pageLabel2.setMinimumSize(new java.awt.Dimension(29, 25)); + pageLabel2.setPreferredSize(new java.awt.Dimension(29, 25)); panelPageNextPrevButton.add(pageLabel2); jSepMed5.setPreferredSize(new java.awt.Dimension(5, 0)); @@ -194,9 +209,9 @@ public class StringsContentPanel extends javax.swing.JPanel { prevPageButton.setContentAreaFilled(false); prevPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_disabled.png"))); // NOI18N prevPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0)); - prevPageButton.setMaximumSize(new java.awt.Dimension(20, 20)); - prevPageButton.setMinimumSize(new java.awt.Dimension(20, 20)); - prevPageButton.setPreferredSize(new java.awt.Dimension(20, 20)); + prevPageButton.setMaximumSize(new java.awt.Dimension(25, 25)); + prevPageButton.setMinimumSize(new java.awt.Dimension(20, 25)); + prevPageButton.setPreferredSize(new java.awt.Dimension(25, 25)); prevPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back_hover.png"))); // NOI18N prevPageButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -205,19 +220,15 @@ public class StringsContentPanel extends javax.swing.JPanel { }); panelPageNextPrevButton.add(prevPageButton); - jSepXs1.setMinimumSize(new java.awt.Dimension(1, 0)); - jSepXs1.setPreferredSize(new java.awt.Dimension(1, 0)); - panelPageNextPrevButton.add(jSepXs1); - nextPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward.png"))); // NOI18N nextPageButton.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.nextPageButton.text")); // NOI18N nextPageButton.setBorderPainted(false); nextPageButton.setContentAreaFilled(false); nextPageButton.setDisabledIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_disabled.png"))); // NOI18N nextPageButton.setMargin(new java.awt.Insets(2, 0, 2, 0)); - nextPageButton.setMaximumSize(new java.awt.Dimension(20, 20)); - nextPageButton.setMinimumSize(new java.awt.Dimension(20, 20)); - nextPageButton.setPreferredSize(new java.awt.Dimension(20, 20)); + nextPageButton.setMaximumSize(new java.awt.Dimension(25, 25)); + nextPageButton.setMinimumSize(new java.awt.Dimension(20, 25)); + nextPageButton.setPreferredSize(new java.awt.Dimension(25, 25)); nextPageButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_forward_hover.png"))); // NOI18N nextPageButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -242,7 +253,7 @@ public class StringsContentPanel extends javax.swing.JPanel { goToPageTextField.setText(org.openide.util.NbBundle.getMessage(StringsContentPanel.class, "StringsContentPanel.goToPageTextField.text")); // NOI18N goToPageTextField.setMaximumSize(new java.awt.Dimension(2147483647, 25)); goToPageTextField.setMinimumSize(new java.awt.Dimension(50, 25)); - goToPageTextField.setPreferredSize(new java.awt.Dimension(100, 25)); + goToPageTextField.setPreferredSize(new java.awt.Dimension(70, 25)); goToPageTextField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { goToPageTextFieldActionPerformed(evt); @@ -278,11 +289,9 @@ public class StringsContentPanel extends javax.swing.JPanel { add(controlPanel, java.awt.BorderLayout.NORTH); - outputScrollPane.setPreferredSize(new java.awt.Dimension(640, 402)); - outputViewPane.setEditable(false); outputViewPane.setFont(new java.awt.Font("Courier New", 0, 11)); // NOI18N - outputViewPane.setPreferredSize(new java.awt.Dimension(100, 40)); + outputViewPane.setPreferredSize(null); outputScrollPane.setViewportView(outputViewPane); add(outputScrollPane, java.awt.BorderLayout.CENTER); diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties index ac480ca0e1..6ae7ed7d12 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties @@ -4,3 +4,4 @@ TranslationContentPanel.ocrLabel.text=OCR: TranslationOptionsPanelController.moduleErr=Module Error TranslationOptionsPanelController.moduleErr.msg=A module caused an error listening to TranslationSettingsPanelController updates. See log to determine which module. Some data could be incomplete. TranslationContentPanel.showLabel.text=Show: +TranslationContentPanel.jSepLarge1.AccessibleContext.accessibleName= diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.form index 4a736ef1d2..4dabce0985 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.form @@ -6,11 +6,11 @@ - + - + @@ -24,28 +24,20 @@ - + - + - - - - - - + - + - - - @@ -58,28 +50,66 @@ - + - - - - + - - - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -97,10 +127,21 @@ - + + + + + + + + + + + + @@ -123,16 +164,36 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -146,10 +207,21 @@ - + + + + + + + + + + + + @@ -183,8 +255,11 @@ + + + - + diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.java index 62f87f0617..4f6fbd7271 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslationContentPanel.java @@ -25,11 +25,13 @@ import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.swing.JComboBox; import org.openide.util.NbBundle; import org.openide.util.NbBundle.Messages; import org.sleuthkit.autopsy.corecomponents.AutoWrappingJTextPane; +import org.sleuthkit.autopsy.guiutils.WrapLayout; /** * A JPanel used by TranslatedContentViewer to display machine translation of @@ -49,6 +51,7 @@ public class TranslationContentPanel extends javax.swing.JPanel { */ public TranslationContentPanel() { initComponents(); + additionalInitComponents(); DISPLAY_PANE = new AutoWrappingJTextPane(); DISPLAY_PANE.setEditable(false); @@ -255,6 +258,13 @@ public class TranslationContentPanel extends javax.swing.JPanel { LANGUAGE_NAMES = createLanguageBiMap(); } + private void additionalInitComponents() { + // use wrap layout for better component wrapping + WrapLayout layout = new WrapLayout(0,5); + layout.setOppositeAligned(Arrays.asList(showPanel, ocrPanel)); + controlPanel.setLayout(layout); + } + /** * Selection choices to be displayed in the combobox dropdown. */ @@ -285,60 +295,88 @@ public class TranslationContentPanel extends javax.swing.JPanel { // //GEN-BEGIN:initComponents private void initComponents() { - jPanel1 = new javax.swing.JPanel(); + controlPanel = new javax.swing.JPanel(); + javax.swing.JPanel warningLabelPanel = new javax.swing.JPanel(); warningLabel = new javax.swing.JLabel(); - javax.swing.JPanel showPanel = new javax.swing.JPanel(); + jSeparator1 = new javax.swing.JSeparator(); + showPanel = new javax.swing.JPanel(); showLabel = new javax.swing.JLabel(); + javax.swing.JSeparator jSepMed1 = new javax.swing.JSeparator(); displayTextComboBox = new javax.swing.JComboBox<>(); - javax.swing.JPanel ocrPanel = new javax.swing.JPanel(); + ocrPanel = new javax.swing.JPanel(); + javax.swing.JSeparator jSepLarge1 = new javax.swing.JSeparator(); ocrLabel = new javax.swing.JLabel(); + javax.swing.JSeparator jSepMed2 = new javax.swing.JSeparator(); ocrDropdown = new javax.swing.JComboBox<>(); textScrollPane = new javax.swing.JScrollPane(); setMaximumSize(new java.awt.Dimension(2000, 2000)); - setMinimumSize(new java.awt.Dimension(2, 2)); + setMinimumSize(new java.awt.Dimension(250, 2)); setName(""); // NOI18N - setPreferredSize(new java.awt.Dimension(100, 58)); + setPreferredSize(new java.awt.Dimension(250, 58)); setVerifyInputWhenFocusTarget(false); setLayout(new java.awt.BorderLayout()); - jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); - jPanel1.setMaximumSize(new java.awt.Dimension(182, 25)); - jPanel1.setMinimumSize(new java.awt.Dimension(254, 25)); - jPanel1.setName(""); // NOI18N - jPanel1.setPreferredSize(new java.awt.Dimension(182, 25)); - jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 5, 0)); + controlPanel.setMaximumSize(new java.awt.Dimension(20000, 20000)); + controlPanel.setMinimumSize(new java.awt.Dimension(2, 25)); + controlPanel.setName(""); // NOI18N + controlPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 5, 0)); + + warningLabelPanel.setMaximumSize(new java.awt.Dimension(32767, 25)); + warningLabelPanel.setMinimumSize(new java.awt.Dimension(2, 25)); + warningLabelPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0)); warningLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/warning16.png"))); // NOI18N warningLabel.setMaximumSize(new java.awt.Dimension(250, 25)); warningLabel.setMinimumSize(new java.awt.Dimension(150, 25)); - warningLabel.setPreferredSize(new java.awt.Dimension(250, 25)); - jPanel1.add(warningLabel); + warningLabel.setPreferredSize(null); + warningLabelPanel.add(warningLabel); + jSeparator1.setMaximumSize(new java.awt.Dimension(1, 25)); + jSeparator1.setMinimumSize(new java.awt.Dimension(1, 25)); + jSeparator1.setPreferredSize(new java.awt.Dimension(1, 25)); + warningLabelPanel.add(jSeparator1); + + controlPanel.add(warningLabelPanel); + + showPanel.setMaximumSize(new java.awt.Dimension(32767, 25)); + showPanel.setMinimumSize(new java.awt.Dimension(0, 25)); showPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0)); org.openide.awt.Mnemonics.setLocalizedText(showLabel, org.openide.util.NbBundle.getMessage(TranslationContentPanel.class, "TranslationContentPanel.showLabel.text")); // NOI18N showLabel.setMaximumSize(new java.awt.Dimension(42, 25)); showLabel.setMinimumSize(new java.awt.Dimension(42, 25)); - showLabel.setPreferredSize(new java.awt.Dimension(42, 25)); + showLabel.setPreferredSize(null); showPanel.add(showLabel); + jSepMed1.setPreferredSize(new java.awt.Dimension(5, 0)); + showPanel.add(jSepMed1); + displayTextComboBox.setMaximumSize(new java.awt.Dimension(170, 25)); displayTextComboBox.setMinimumSize(new java.awt.Dimension(170, 25)); displayTextComboBox.setPreferredSize(new java.awt.Dimension(170, 25)); showPanel.add(displayTextComboBox); - jPanel1.add(showPanel); + controlPanel.add(showPanel); + ocrPanel.setMaximumSize(new java.awt.Dimension(32767, 25)); + ocrPanel.setMinimumSize(new java.awt.Dimension(0, 25)); ocrPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0)); + jSepLarge1.setPreferredSize(new java.awt.Dimension(10, 0)); + ocrPanel.add(jSepLarge1); + jSepLarge1.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(TranslationContentPanel.class, "TranslationContentPanel.jSepLarge1.AccessibleContext.accessibleName")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(ocrLabel, org.openide.util.NbBundle.getMessage(TranslationContentPanel.class, "TranslationContentPanel.ocrLabel.text")); // NOI18N ocrLabel.setEnabled(false); ocrLabel.setMaximumSize(new java.awt.Dimension(40, 25)); ocrLabel.setMinimumSize(new java.awt.Dimension(25, 16)); - ocrLabel.setPreferredSize(new java.awt.Dimension(40, 25)); + ocrLabel.setPreferredSize(null); ocrPanel.add(ocrLabel); + jSepMed2.setPreferredSize(new java.awt.Dimension(5, 0)); + ocrPanel.add(jSepMed2); + ocrDropdown.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "N/A" })); ocrDropdown.setEnabled(false); ocrDropdown.setMaximumSize(new java.awt.Dimension(170, 25)); @@ -347,22 +385,26 @@ public class TranslationContentPanel extends javax.swing.JPanel { ocrDropdown.setPreferredSize(new java.awt.Dimension(170, 25)); ocrPanel.add(ocrDropdown); - jPanel1.add(ocrPanel); + controlPanel.add(ocrPanel); - add(jPanel1, java.awt.BorderLayout.NORTH); + add(controlPanel, java.awt.BorderLayout.NORTH); textScrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); textScrollPane.setMaximumSize(new java.awt.Dimension(20000, 20000)); - textScrollPane.setPreferredSize(new java.awt.Dimension(640, 250)); + textScrollPane.setMinimumSize(new java.awt.Dimension(20, 20)); + textScrollPane.setPreferredSize(new java.awt.Dimension(20, 20)); add(textScrollPane, java.awt.BorderLayout.CENTER); }// //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel controlPanel; private javax.swing.JComboBox displayTextComboBox; - private javax.swing.JPanel jPanel1; + private javax.swing.JSeparator jSeparator1; private javax.swing.JComboBox ocrDropdown; private javax.swing.JLabel ocrLabel; + private javax.swing.JPanel ocrPanel; private javax.swing.JLabel showLabel; + private javax.swing.JPanel showPanel; private javax.swing.JScrollPane textScrollPane; private javax.swing.JLabel warningLabel; // End of variables declaration//GEN-END:variables diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form index 7add18aa42..13e535f4ed 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.form @@ -27,10 +27,10 @@ - + - + @@ -571,10 +571,10 @@ - + - + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java index 11425a2a7d..8ff9c0fdcc 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/ExtractedContentPanel.java @@ -47,6 +47,7 @@ import org.openide.util.NbBundle; import org.sleuthkit.autopsy.coreutils.EscapeUtil; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.TextUtil; +import org.sleuthkit.autopsy.guiutils.WrapLayout; /** * Panel displays HTML content sent to ExtractedContentViewer, and provides a @@ -187,8 +188,7 @@ class ExtractedContentPanel extends javax.swing.JPanel implements ResizableTextP private void additionalInit() { // use wrap layout for better component wrapping - WrapLayout layout = new WrapLayout(); - layout.setHgap(5); + WrapLayout layout = new WrapLayout(0,5); layout.setOppositeAligned(Arrays.asList(textSourcePanel)); controlPanel.setLayout(layout); } @@ -209,13 +209,13 @@ class ExtractedContentPanel extends javax.swing.JPanel implements ResizableTextP controlPanel = new javax.swing.JPanel(); javax.swing.JPanel pagePanel = new javax.swing.JPanel(); pagesLabel = new javax.swing.JLabel(); - fillerSmall1 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); + javax.swing.Box.Filler fillerSmall1 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); pageCurLabel = new javax.swing.JLabel(); - fillerSmall2 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); + javax.swing.Box.Filler fillerSmall2 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); pageOfLabel = new javax.swing.JLabel(); - fillerSmall3 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); + javax.swing.Box.Filler fillerSmall3 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); pageTotalLabel = new javax.swing.JLabel(); - fillerSmall4 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); + javax.swing.Box.Filler fillerSmall4 = new javax.swing.Box.Filler(new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 0), new java.awt.Dimension(5, 32767)); pageButtonsLabel = new javax.swing.JLabel(); javax.swing.Box.Filler fillerMed1 = new javax.swing.Box.Filler(new java.awt.Dimension(10, 0), new java.awt.Dimension(10, 0), new java.awt.Dimension(10, 32767)); pagePreviousButton = new javax.swing.JButton(); @@ -250,8 +250,8 @@ class ExtractedContentPanel extends javax.swing.JPanel implements ResizableTextP selectAllMenuItem.setText(org.openide.util.NbBundle.getMessage(ExtractedContentPanel.class, "ExtractedContentPanel.selectAllMenuItem.text")); // NOI18N rightClickMenu.add(selectAllMenuItem); - setMinimumSize(new java.awt.Dimension(100, 0)); - setPreferredSize(new java.awt.Dimension(100, 58)); + setMinimumSize(new java.awt.Dimension(250, 0)); + setPreferredSize(new java.awt.Dimension(250, 58)); setLayout(new java.awt.BorderLayout()); controlPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 0, 0)); @@ -393,8 +393,8 @@ class ExtractedContentPanel extends javax.swing.JPanel implements ResizableTextP sourceComboBox.setModel(new javax.swing.DefaultComboBoxModel()); sourceComboBox.setMaximumSize(new java.awt.Dimension(150, 32767)); - sourceComboBox.setMinimumSize(new java.awt.Dimension(150, 20)); - sourceComboBox.setPreferredSize(new java.awt.Dimension(150, 20)); + sourceComboBox.setMinimumSize(new java.awt.Dimension(150, 25)); + sourceComboBox.setPreferredSize(new java.awt.Dimension(150, 25)); textSourcePanel.add(sourceComboBox); controlPanel.add(textSourcePanel); @@ -418,10 +418,6 @@ class ExtractedContentPanel extends javax.swing.JPanel implements ResizableTextP private javax.swing.JMenuItem copyMenuItem; private javax.swing.JScrollPane extractedScrollPane; private javax.swing.JTextPane extractedTextPane; - private javax.swing.Box.Filler fillerSmall1; - private javax.swing.Box.Filler fillerSmall2; - private javax.swing.Box.Filler fillerSmall3; - private javax.swing.Box.Filler fillerSmall4; private javax.swing.JLabel hitButtonsLabel; private javax.swing.JLabel hitCountLabel; private javax.swing.JLabel hitLabel; diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/WrapLayout.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/WrapLayout.java deleted file mode 100644 index ac9e7e4afb..0000000000 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/WrapLayout.java +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2019 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.keywordsearch; - -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Insets; -import java.awt.LayoutManager; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -/** - * FlowLayout subclass that fully supports wrapping of components. - * - * Originally written by Rob Camick - * https://tips4java.wordpress.com/2008/11/06/wrap-layout/ - */ -class WrapLayout implements LayoutManager, java.io.Serializable { - - private static final long serialVersionUID = 1L; - - - /** - * The flow layout manager allows a seperation of - * components with gaps. The horizontal gap will - * specify the space between components and between - * the components and the borders of the - * Container. - * - * @serial - * @see #getHgap() - * @see #setHgap(int) - */ - private int hgap; - - /** - * The flow layout manager allows a seperation of - * components with gaps. The vertical gap will - * specify the space between rows and between the - * the rows and the borders of the Container. - * - * @serial - * @see #getHgap() - * @see #setHgap(int) - */ - private int vgap; - - /** - * If true, components will be aligned on their baseline. - */ - private boolean alignOnBaseline; - - - - - - private final Set oppositeAlignedItems = new HashSet<>(); - - /** - * Constructs a new WrapLayout with a left alignment and a - * default 5-unit horizontal and vertical gap. - */ - WrapLayout() { - super(); - } - - - void setOppositeAligned(Collection rightAlignedComponents) { - synchronized (this.oppositeAlignedItems) { - this.oppositeAlignedItems.clear(); - this.oppositeAlignedItems.addAll(rightAlignedComponents); - } - } - - Set getOppositeAlignedItems() { - return oppositeAlignedItems; - } - - - /** - * Gets the horizontal gap between components - * and between the components and the borders - * of the Container - * - * @return the horizontal gap between components - * and between the components and the borders - * of the Container - * @see java.awt.FlowLayout#setHgap - * @since JDK1.1 - */ - int getHgap() { - return hgap; - } - - /** - * Sets the horizontal gap between components and - * between the components and the borders of the - * Container. - * - * @param hgap the horizontal gap between components - * and between the components and the borders - * of the Container - * @see java.awt.FlowLayout#getHgap - * @since JDK1.1 - */ - void setHgap(int hgap) { - this.hgap = hgap; - } - - /** - * Gets the vertical gap between components and - * between the components and the borders of the - * Container. - * - * @return the vertical gap between components - * and between the components and the borders - * of the Container - * @see java.awt.FlowLayout#setVgap - * @since JDK1.1 - */ - int getVgap() { - return vgap; - } - - /** - * Sets the vertical gap between components and between - * the components and the borders of the Container. - * - * @param vgap the vertical gap between components - * and between the components and the borders - * of the Container - * @see java.awt.FlowLayout#getVgap - * @since JDK1.1 - */ - void setVgap(int vgap) { - this.vgap = vgap; - } - - /** - * Sets whether or not components should be vertically aligned along their - * baseline. Components that do not have a baseline will be centered. - * The default is false. - * - * @param alignOnBaseline whether or not components should be - * vertically aligned on their baseline - * @since 1.6 - */ - void setAlignOnBaseline(boolean alignOnBaseline) { - this.alignOnBaseline = alignOnBaseline; - } - - /** - * Returns true if components are to be vertically aligned along - * their baseline. The default is false. - * - * @return true if components are to be vertically aligned along - * their baseline - * @since 1.6 - */ - boolean getAlignOnBaseline() { - return alignOnBaseline; - } - - /** - * Adds the specified component to the layout. - * Not used by this class. - * @param name the name of the component - * @param comp the component to be added - */ - @Override - public void addLayoutComponent(String name, Component comp) { - } - - /** - * Removes the specified component from the layout. - * Not used by this class. - * @param comp the component to remove - * @see java.awt.Container#removeAll - */ - @Override - public void removeLayoutComponent(Component comp) { - } - - - - private int getComponentY(int rowY, boolean alignBaseline, int rowHeight, int itemHeight) { - return alignBaseline ? - rowY + rowHeight - itemHeight : - rowY; - } - - private int getComponentX(int leftX, int rightX, boolean ltr, int xPos, int componentWidth) { - return ltr ? leftX + xPos : rightX - xPos - componentWidth; - } - - private int setComponentDims(Component comp, boolean alignBaseline, boolean ltr, int rowY, int rowHeight, int leftX, int rightX, int xPos) { - Dimension d = comp.getPreferredSize(); - comp.setSize(d); - - int x = getComponentX(leftX, rightX, ltr, xPos, d.width); - int y = getComponentY(rowY, alignBaseline, rowHeight, d.height); - comp.setLocation(x, y); - - return d.width; - } - - - /** - * Lays out the container. This method lets each - * visible component take its preferred size by reshaping the - * components in the target container in order to satisfy the alignment of - * this FlowLayout object. Taken from - * https://raw.githubusercontent.com/mynawang/Java8-Source-Code/master/src/main/jdk8/java/awt/FlowLayout.java. - * - * @param target the specified component being laid out - * - * @see Container - * @see java.awt.Container#doLayout - */ - @Override - public void layoutContainer(Container target) { - synchronized (target.getTreeLock()) { - synchronized (this.oppositeAlignedItems) { - ParentDimensions targetDims = getTargetDimensions(target); - List components = Arrays.asList(target.getComponents()); - List rows = getAllRows(components, true, targetDims.innerWidth); - - boolean ltr = target.getComponentOrientation().isLeftToRight(); - boolean useBaseline = getAlignOnBaseline(); - - int rowY = targetDims.insets.top + getVgap(); - int leftX = targetDims.insets.left + getHgap(); - int rightX = targetDims.outerWidth - targetDims.insets.right - getHgap(); - - for (Row row : rows) { - int rowHeight = row.height; - - int curX = 0; - if (row.components != null) { - for (Component origComp : row.components) - curX += setComponentDims(origComp, useBaseline, ltr, rowY, rowHeight, leftX, rightX, curX) + getHgap(); - } - - if (row.oppositeAligned != null) { - curX = 0; - // reverse opposite aligned for layout purposes since flipping ltr - Collections.reverse(row.oppositeAligned); - for (Component oppAlignedComp : row.oppositeAligned) - curX += setComponentDims(oppAlignedComp, useBaseline, !ltr, rowY, rowHeight, leftX, rightX, curX) + getHgap(); - } - - rowY += rowHeight + getVgap(); - } - } - } - } - - /** - * Returns the preferred dimensions for this layout given the - * visible components in the specified target container. - * - * @param target the component which needs to be laid out - * - * @return the preferred dimensions to lay out the subcomponents of the - * specified container - */ - @Override - public Dimension preferredLayoutSize(Container target) { - return layoutSize(target, true); - } - - /** - * Returns the minimum dimensions needed to layout the visible - * components contained in the specified target container. - * - * @param target the component which needs to be laid out - * - * @return the minimum dimensions to lay out the subcomponents of the - * specified container - */ - @Override - public Dimension minimumLayoutSize(Container target) { - Dimension minimum = layoutSize(target, false); - minimum.width -= (getHgap() + 1); - return minimum; - } - - private static class ParentDimensions { - - final int outerWidth; - final int innerWidth; - final Insets insets; - - ParentDimensions(int outerWidth, int innerWidth, Insets insets) { - this.outerWidth = outerWidth; - this.innerWidth = innerWidth; - this.insets = insets; - } - } - - private ParentDimensions getTargetDimensions(Container target) { - // Each row must fit with the width allocated to the containter. - // When the container width = 0, the preferred width of the container - // has not yet been calculated so lets ask for the maximum. - - int targetWidth = target.getSize().width; - Container container = target; - - while (container.getSize().width == 0 && container.getParent() != null) { - container = container.getParent(); - } - - targetWidth = container.getSize().width; - - if (targetWidth == 0) { - targetWidth = Integer.MAX_VALUE; - } - - int hgap = getHgap(); - - Insets insets = target.getInsets(); - int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2); - int maxWidth = targetWidth - horizontalInsetsAndGap; - - return new ParentDimensions(targetWidth, maxWidth, insets); - } - - /** - * Returns the minimum or preferred dimension needed to layout the target - * container. - * - * @param target target to get layout size for - * @param preferred should preferred size be calculated - * - * @return the dimension to layout the target container - */ - private Dimension layoutSize(Container target, boolean preferred) { - synchronized (target.getTreeLock()) { - synchronized (this.oppositeAlignedItems) { - ParentDimensions targetDims = getTargetDimensions(target); - List components = Arrays.asList(target.getComponents()); - List rows = getAllRows(components, preferred, targetDims.innerWidth); - - Integer containerHeight = rows.stream().map((r) -> r.height).reduce(0, Integer::sum); - // add in vertical gap between rows - if (rows.size() > 1) { - containerHeight += (rows.size() - 1) * getVgap(); - } - - containerHeight += targetDims.insets.top + targetDims.insets.bottom; - - Integer containerWidth = rows.stream().map((r) -> r.width).reduce(0, Math::max); - containerWidth += targetDims.insets.left + targetDims.insets.right + (getHgap() * 2); - - // When using a scroll pane or the DecoratedLookAndFeel we need to - // make sure the preferred size is less than the size of the - // target containter so shrinking the container size works - // correctly. Removing the horizontal gap is an easy way to do this. - Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target); - - if (scrollPane != null && target.isValid()) { - containerWidth -= (getHgap() + 1); - } - - return new Dimension(containerWidth, containerHeight); - } - } - } - - private class Row { - - final List components; - final List oppositeAligned; - final int height; - final int width; - - public Row(List components, List oppositeAligned, int height, int width) { - this.components = components; - this.oppositeAligned = oppositeAligned; - this.height = height; - this.width = width; - } - } - - private List getAllRows(List components, boolean preferred, int maxWidth) { - List originalComp - = components - .stream() - .filter((comp) -> !this.oppositeAlignedItems.contains(comp)) - .collect(Collectors.toList()); - - List originalRowSet = getRowSet(originalComp, preferred, maxWidth); - - List oppositeAlignedComp - = components - .stream() - .filter((comp) -> this.oppositeAlignedItems.contains(comp)) - .collect(Collectors.toList()); - - // go in reverse order and then revert so we can use same getRowSet method - Collections.reverse(oppositeAlignedComp); - List oppositeRowSet = getRowSet(oppositeAlignedComp, preferred, maxWidth) - .stream() - .map((Row row) -> { - Collections.reverse(row.components); - return new Row(null, row.components, row.height, row.width); - }) - .collect(Collectors.toList()); - Collections.reverse(oppositeRowSet); - - List toReturn = new ArrayList<>(); - - if (originalRowSet.size() > 0 && oppositeRowSet.size() > 0) { - Row lastOrig = originalRowSet.get(originalRowSet.size() - 1); - Row firstOpp = oppositeRowSet.get(0); - - int proposedRowWidth = lastOrig.width + firstOpp.width + getHgap(); - if (proposedRowWidth <= maxWidth) { - Row middleRow = new Row(lastOrig.components, firstOpp.oppositeAligned, - Math.max(lastOrig.height, firstOpp.height), proposedRowWidth); - - toReturn.addAll(originalRowSet.subList(0, originalRowSet.size() - 1)); - toReturn.add(middleRow); - toReturn.addAll(oppositeRowSet.subList(1, oppositeRowSet.size())); - return toReturn; - } - } - - toReturn.addAll(originalRowSet); - toReturn.addAll(oppositeRowSet); - return toReturn; - } - - private List getRowSet(List components, boolean preferred, int maxWidth) { - List rows = new ArrayList<>(); - - List rowComponents = new ArrayList<>(); - int rowWidth = 0; - int rowHeight = 0; - - for (Component m : components) { - if (m.isVisible()) { - Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize(); - - // Can't add the component to current row. Start a new row. - if (rowWidth + d.width > maxWidth) { - rows.add(new Row(rowComponents, null, rowHeight, rowWidth)); - rowComponents = new ArrayList<>(); - rowWidth = 0; - rowHeight = 0; - } - - // Add a horizontal gap for all components after the first - if (rowWidth != 0) { - rowWidth += getHgap(); - } - - rowComponents.add(m); - rowWidth += d.width; - rowHeight = Math.max(rowHeight, d.height); - } - } - - if (rowComponents.size() > 0) { - rows.add(new Row(rowComponents, null, rowHeight, rowWidth)); - } - - return rows; - } -}