19 package org.sleuthkit.autopsy.contentviewers.artifactviewers;
21 import java.awt.Dimension;
23 import java.awt.GridBagConstraints;
24 import java.awt.GridBagLayout;
25 import java.awt.Insets;
26 import java.awt.Toolkit;
27 import java.awt.datatransfer.StringSelection;
28 import java.awt.event.ActionEvent;
29 import java.awt.event.ActionListener;
30 import java.util.ArrayList;
31 import java.util.List;
32 import javax.swing.JLabel;
33 import javax.swing.JMenuItem;
34 import javax.swing.JComponent;
35 import javax.swing.JPanel;
36 import javax.swing.JPopupMenu;
37 import javax.swing.JTextPane;
38 import javax.swing.SwingUtilities;
39 import org.openide.util.NbBundle;
47 final class CommunicationArtifactViewerHelper {
50 private final static int MAX_COLS = 4;
52 final static int LEFT_INSET = 12;
57 private CommunicationArtifactViewerHelper() {
71 static JLabel addHeader(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String headerString) {
73 Insets savedInsets = constraints.insets;
76 javax.swing.JLabel headingLabel =
new javax.swing.JLabel();
80 if (constraints.gridy != 0) {
81 addBlankLine(panel, gridbagLayout, constraints);
84 constraints.gridx = 0;
87 constraints.gridwidth = MAX_COLS;
88 constraints.insets =
new Insets(0, 0, 0, 0);
91 headingLabel.setText(headerString);
94 headingLabel.setFont(headingLabel.getFont().deriveFont(Font.BOLD, headingLabel.getFont().getSize() + 2));
97 gridbagLayout.setConstraints(headingLabel, constraints);
98 panel.add(headingLabel);
101 constraints.gridwidth = 1;
104 addLineEndGlue(panel, gridbagLayout, constraints);
107 constraints.insets = savedInsets;
122 static void addComponent(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, JComponent component) {
125 gridbagLayout.setConstraints(component, constraints);
126 panel.add(component);
137 static void addLineEndGlue(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints) {
139 constraints.gridx = MAX_COLS;
141 double savedWeightX = constraints.weightx;
142 int savedFill = constraints.fill;
144 constraints.weightx = 1.0;
145 constraints.fill = GridBagConstraints.BOTH;
147 javax.swing.Box.Filler horizontalFiller =
new javax.swing.Box.Filler(
new Dimension(0, 0),
new Dimension(0, 0),
new Dimension(32767, 0));
148 gridbagLayout.setConstraints(horizontalFiller, constraints);
149 panel.add(horizontalFiller);
152 constraints.fill = savedFill;
153 constraints.weightx = savedWeightX;
164 static void addPageEndGlue(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints) {
166 constraints.gridx = 0;
168 double savedWeighty = constraints.weighty;
169 int savedFill = constraints.fill;
171 constraints.weighty = 1.0;
172 constraints.fill = GridBagConstraints.VERTICAL;
174 javax.swing.Box.Filler vertFiller =
new javax.swing.Box.Filler(
new Dimension(0, 0),
new Dimension(0, 0),
new Dimension(0, 32767));
175 gridbagLayout.setConstraints(vertFiller, constraints);
176 panel.add(vertFiller, constraints);
179 constraints.weighty = savedWeighty;
180 constraints.fill = savedFill;
190 static void addBlankLine(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints) {
192 constraints.gridx = 0;
194 javax.swing.JLabel filler =
new javax.swing.JLabel(
" ");
195 gridbagLayout.setConstraints(filler, constraints);
198 addLineEndGlue(panel, gridbagLayout, constraints);
211 static JLabel addKey(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String keyString) {
212 return addKeyAtCol(panel, gridbagLayout, constraints, keyString, 0);
226 static JLabel addKeyAtCol(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String keyString,
int gridx) {
229 javax.swing.JLabel keyLabel =
new javax.swing.JLabel();
232 constraints.gridx = gridx < MAX_COLS - 1 ? gridx : MAX_COLS - 2;
235 keyLabel.setText(keyString +
": ");
238 gridbagLayout.setConstraints(keyLabel, constraints);
254 static JTextPane addValue(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String valueString) {
255 return addValueAtCol(panel, gridbagLayout, constraints, valueString, 1);
269 static JTextPane addValueAtCol(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String valueString,
int gridx) {
271 JTextPane valueField =
new JTextPane();
272 valueField.setEditable(
false);
273 valueField.setOpaque(
false);
275 constraints.gridx = gridx < MAX_COLS ? gridx : MAX_COLS - 1;
277 GridBagConstraints cloneConstraints = (GridBagConstraints) constraints.clone();
280 cloneConstraints.gridwidth = 2;
281 cloneConstraints.fill = GridBagConstraints.BOTH;
284 valueField.setText(valueString);
287 valueField.addMouseListener(
new java.awt.event.MouseAdapter() {
289 public void mouseClicked(java.awt.event.MouseEvent evt) {
290 valueLabelMouseClicked(evt, valueField);
295 gridbagLayout.setConstraints(valueField, cloneConstraints);
296 panel.add(valueField);
299 addLineEndGlue(panel, gridbagLayout, constraints);
316 static JLabel addMessageRow(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String messageString) {
317 return addMessageRow(panel, gridbagLayout, constraints, messageString, 0);
332 static JLabel addMessageRow(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String messageString,
int gridx) {
335 javax.swing.JLabel messageLabel =
new javax.swing.JLabel();
338 constraints.gridx = gridx < MAX_COLS - 1 ? gridx : MAX_COLS - 2;
340 int savedGridwidth = constraints.gridwidth;
342 constraints.gridwidth = 3;
345 messageLabel.setText(messageString);
348 gridbagLayout.setConstraints(messageLabel, constraints);
349 panel.add(messageLabel);
351 addLineEndGlue(panel, gridbagLayout, constraints);
354 constraints.gridwidth = savedGridwidth;
376 "CommunicationArtifactViewerHelper_persona_label=Persona: ",
377 "CommunicationArtifactViewerHelper_persona_searching=Searching...",
378 "CommunicationArtifactViewerHelper_persona_unknown=Unknown",
379 "CommunicationArtifactViewerHelper_persona_button_view=View",
380 "CommunicationArtifactViewerHelper_persona_button_create=Create"
383 static List<AccountPersonaSearcherData> addPersonaRow(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String accountIdentifier) {
384 List<AccountPersonaSearcherData> dataList =
new ArrayList<>();
387 constraints.gridx = 1;
389 Insets savedInsets = constraints.insets;
392 constraints.insets =
new java.awt.Insets(0, 2 * LEFT_INSET, 0, 0);
395 javax.swing.JLabel personaLabel =
new javax.swing.JLabel();
396 String personaLabelText = Bundle.CommunicationArtifactViewerHelper_persona_label();
397 personaLabelText = personaLabelText.concat(CentralRepository.isEnabled()
398 ? Bundle.CommunicationArtifactViewerHelper_persona_searching()
399 : Bundle.CommunicationArtifactViewerHelper_persona_unknown());
401 personaLabel.setText(personaLabelText);
404 gridbagLayout.setConstraints(personaLabel, constraints);
405 panel.add(personaLabel);
408 constraints.insets = savedInsets;
413 javax.swing.JButton personaButton =
new javax.swing.JButton();
414 personaButton.setText(Bundle.CommunicationArtifactViewerHelper_persona_button_view());
415 personaButton.setMargin(
new Insets(0, 5, 0, 5));
416 personaButton.setEnabled(
false);
418 gridbagLayout.setConstraints(personaButton, constraints);
419 panel.add(personaButton);
421 if (CentralRepository.isEnabled()) {
423 dataList.add(
new AccountPersonaSearcherData(accountIdentifier, personaLabel, personaButton));
425 personaLabel.setEnabled(
false);
428 addLineEndGlue(panel, gridbagLayout, constraints);
444 "# {0} - contact name",
445 "CommunicationArtifactViewerHelper_contact_label=Contact: {0}",
446 "CommunicationArtifactViewerHelper_contact_label_unknown=Unknown"
448 static JComponent addContactRow(JPanel panel, GridBagLayout gridbagLayout, GridBagConstraints constraints, String contactId) {
452 GridBagConstraints indentedConstraints = (GridBagConstraints) constraints.clone();
455 indentedConstraints.insets =
new java.awt.Insets(0, 2 * LEFT_INSET, 0, 0);
457 String contactInfo = Bundle.CommunicationArtifactViewerHelper_contact_label(contactId != null && !contactId.isEmpty() ? contactId : Bundle.CommunicationArtifactViewerHelper_contact_label_unknown());
459 return addValueAtCol(panel, gridbagLayout, indentedConstraints, contactInfo, 1);
470 "CommunicationArtifactViewerHelper_menuitem_copy=Copy"
472 private static void valueLabelMouseClicked(java.awt.event.MouseEvent evt, JTextPane valueLabel) {
473 if (SwingUtilities.isRightMouseButton(evt)) {
474 JPopupMenu popup =
new JPopupMenu();
476 JMenuItem copyMenu =
new JMenuItem(Bundle.CommunicationArtifactViewerHelper_menuitem_copy());
477 copyMenu.addActionListener(
new ActionListener() {
479 public void actionPerformed(ActionEvent e) {
480 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
new StringSelection(valueLabel.getText()), null);
485 popup.show(valueLabel, evt.getX(), evt.getY());