From 7a3953da9fe78c97aebee46676e198bdc93a8e1c Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 6 Feb 2018 15:55:57 +0100 Subject: [PATCH 1/3] move adding edges/vertices off the EDT. remove unneeded RelationshipModel --- .../autopsy/communications/mxGraphImpl.java | 55 ++----------------- 1 file changed, 6 insertions(+), 49 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java index 5f7397b1b5..0d64d2f54e 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java +++ b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java @@ -30,7 +30,6 @@ import com.mxgraph.view.mxStylesheet; import java.net.URL; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -77,6 +76,7 @@ final class mxGraphImpl extends mxGraph { public mxGraphImpl() { super(mxStylesheet); + setAutoSizeCells(true); setCellsCloneable(false); setDropEnabled(false); setCellsCloneable(false); @@ -167,37 +167,6 @@ final class mxGraphImpl extends mxGraph { lockedAccountDevices.clear(); } - private static class RelationshipModel { - - @Override - public String toString() { - return adiKey1.getAccountDeviceInstance().getAccount().getTypeSpecificID() - + "<-" + relationshipSources.size() + "->" - + adiKey2.getAccountDeviceInstance().getAccount().getTypeSpecificID(); - } - - private final List relationshipSources; - private final AccountDeviceInstanceKey adiKey1; - private final AccountDeviceInstanceKey adiKey2; - - private RelationshipModel(List relationships, AccountDeviceInstanceKey adiKey1, AccountDeviceInstanceKey adiKey2) { - this.relationshipSources = relationships; - this.adiKey1 = adiKey1; - this.adiKey2 = adiKey2; - } - - public List getSources() { - return Collections.unmodifiableList(relationshipSources); - } - - public AccountDeviceInstanceKey getAccount1() { - return adiKey1; - } - - public AccountDeviceInstanceKey getAccount2() { - return adiKey2; - } - } private mxCell getOrCreateVertex(AccountDeviceInstanceKey accountDeviceInstanceKey) { final AccountDeviceInstance accountDeviceInstance = accountDeviceInstanceKey.getAccountDeviceInstance(); @@ -245,7 +214,7 @@ final class mxGraphImpl extends mxGraph { return edge; } - class SwingWorkerImpl extends SwingWorker, mxGraphImpl.RelationshipModel> { + class SwingWorkerImpl extends SwingWorker { private final ProgressIndicator progress; private final CommunicationsManager commsManager; @@ -258,11 +227,10 @@ final class mxGraphImpl extends mxGraph { } @Override - protected Set doInBackground() throws Exception { + protected Void doInBackground() throws Exception { progress.start("Loading accounts", pinnedAccountDevices.size()); int i = 0; - Set relationshipModels = new HashSet<>(); try { /** * set to keep track of accounts related to pinned accounts @@ -296,9 +264,8 @@ final class mxGraphImpl extends mxGraph { adiKey2.getAccountDeviceInstance(), currentFilter); if (relationships.size() > 0) { - mxGraphImpl.RelationshipModel relationshipModel = new RelationshipModel(relationships, adiKey1, adiKey2); - publish(relationshipModel); - progress.progress(relationshipModel.toString()); + mxCell addEdge = addEdge(relationships,adiKey1,adiKey2); + progress.progress(addEdge.getId()); } } progress.progress(i); @@ -307,17 +274,7 @@ final class mxGraphImpl extends mxGraph { logger.log(Level.SEVERE, "Error", tskCoreException); } finally { } - return relationshipModels; - } - - @Override - protected void process(List chunks) { - super.process(chunks); - for (mxGraphImpl.RelationshipModel relationShipModel : chunks) { - mxCell addEdge = addEdge(relationShipModel.getSources(), - relationShipModel.getAccount1(), - relationShipModel.getAccount2()); - } + return null; } @Override From 3e534832391ff70fe0c8a311cdbd6deae419fa05 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 6 Feb 2018 16:04:42 +0100 Subject: [PATCH 2/3] add reset zoom button, rename buttons --- .../communications/VisualizationPanel.form | 72 +++++---- .../communications/VisualizationPanel.java | 138 ++++++++++-------- 2 files changed, 122 insertions(+), 88 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form index 13517bf10b..7010f8f9cf 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form @@ -50,56 +50,56 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -120,22 +120,6 @@ - - - - - - - - - - - - - - - - @@ -152,6 +136,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index 096abcc93a..2d3f26cbc1 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -349,14 +349,15 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider splitPane = new JSplitPane(); borderLayoutPanel = new JPanel(); jToolBar1 = new JToolBar(); - jButton6 = new JButton(); - jButton1 = new JButton(); - jButton8 = new JButton(); - jButton7 = new JButton(); + hierarchyLayoutButton = new JButton(); + fastOrganicLayoutButton = new JButton(); + OrganicLayoutButton = new JButton(); + circleLayoutButton = new JButton(); jSeparator1 = new JToolBar.Separator(); zoomOutButton = new JButton(); - fitGraphButton = new JButton(); zoomInButton = new JButton(); + zoomActualButton = new JButton(); + fitZoomButton = new JButton(); statusPanel = new JPanel(); progressBar = new JProgressBar(); @@ -369,49 +370,49 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider jToolBar1.setRollover(true); - jButton6.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jButton6.text")); // NOI18N - jButton6.setFocusable(false); - jButton6.setHorizontalTextPosition(SwingConstants.CENTER); - jButton6.setVerticalTextPosition(SwingConstants.BOTTOM); - jButton6.addActionListener(new ActionListener() { + hierarchyLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.hierarchyLayoutButton.text")); // NOI18N + hierarchyLayoutButton.setFocusable(false); + hierarchyLayoutButton.setHorizontalTextPosition(SwingConstants.CENTER); + hierarchyLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM); + hierarchyLayoutButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { - jButton6ActionPerformed(evt); + hierarchyLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(jButton6); + jToolBar1.add(hierarchyLayoutButton); - jButton1.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jButton1.text")); // NOI18N - jButton1.setFocusable(false); - jButton1.setHorizontalTextPosition(SwingConstants.CENTER); - jButton1.setVerticalTextPosition(SwingConstants.BOTTOM); - jButton1.addActionListener(new ActionListener() { + fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N + fastOrganicLayoutButton.setFocusable(false); + fastOrganicLayoutButton.setHorizontalTextPosition(SwingConstants.CENTER); + fastOrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM); + fastOrganicLayoutButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { - jButton1ActionPerformed(evt); + fastOrganicLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(jButton1); + jToolBar1.add(fastOrganicLayoutButton); - jButton8.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jButton8.text")); // NOI18N - jButton8.setFocusable(false); - jButton8.setHorizontalTextPosition(SwingConstants.CENTER); - jButton8.setVerticalTextPosition(SwingConstants.BOTTOM); - jButton8.addActionListener(new ActionListener() { + OrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.OrganicLayoutButton.text")); // NOI18N + OrganicLayoutButton.setFocusable(false); + OrganicLayoutButton.setHorizontalTextPosition(SwingConstants.CENTER); + OrganicLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM); + OrganicLayoutButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { - jButton8ActionPerformed(evt); + OrganicLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(jButton8); + jToolBar1.add(OrganicLayoutButton); - jButton7.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jButton7.text")); // NOI18N - jButton7.setFocusable(false); - jButton7.setHorizontalTextPosition(SwingConstants.CENTER); - jButton7.setVerticalTextPosition(SwingConstants.BOTTOM); - jButton7.addActionListener(new ActionListener() { + circleLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.circleLayoutButton.text")); // NOI18N + circleLayoutButton.setFocusable(false); + circleLayoutButton.setHorizontalTextPosition(SwingConstants.CENTER); + circleLayoutButton.setVerticalTextPosition(SwingConstants.BOTTOM); + circleLayoutButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { - jButton7ActionPerformed(evt); + circleLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(jButton7); + jToolBar1.add(circleLayoutButton); jToolBar1.add(jSeparator1); zoomOutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N @@ -426,18 +427,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider }); jToolBar1.add(zoomOutButton); - fitGraphButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N - fitGraphButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitGraphButton.text")); // NOI18N - fitGraphButton.setFocusable(false); - fitGraphButton.setHorizontalTextPosition(SwingConstants.CENTER); - fitGraphButton.setVerticalTextPosition(SwingConstants.BOTTOM); - fitGraphButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - fitGraphButtonActionPerformed(evt); - } - }); - jToolBar1.add(fitGraphButton); - zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N zoomInButton.setFocusable(false); @@ -450,6 +439,30 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider }); jToolBar1.add(zoomInButton); + zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N + zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N + zoomActualButton.setFocusable(false); + zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER); + zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM); + zoomActualButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + zoomActualButtonActionPerformed(evt); + } + }); + jToolBar1.add(zoomActualButton); + + fitZoomButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N + fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N + fitZoomButton.setFocusable(false); + fitZoomButton.setHorizontalTextPosition(SwingConstants.CENTER); + fitZoomButton.setVerticalTextPosition(SwingConstants.BOTTOM); + fitZoomButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + fitZoomButtonActionPerformed(evt); + } + }); + jToolBar1.add(fitZoomButton); + borderLayoutPanel.add(jToolBar1, BorderLayout.NORTH); progressBar.setMaximumSize(new Dimension(200, 14)); @@ -477,9 +490,9 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider add(splitPane, BorderLayout.CENTER); }// //GEN-END:initComponents - private void jButton1ActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed + private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed morph(new mxFastOrganicLayout(graph)); - }//GEN-LAST:event_jButton1ActionPerformed + }//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed private void zoomInButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_zoomInButtonActionPerformed graphComponent.zoomIn(); @@ -489,17 +502,17 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider graphComponent.zoomOut(); }//GEN-LAST:event_zoomOutButtonActionPerformed - private void jButton6ActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed + private void hierarchyLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_hierarchyLayoutButtonActionPerformed morph(new mxHierarchicalLayout(graph)); - }//GEN-LAST:event_jButton6ActionPerformed + }//GEN-LAST:event_hierarchyLayoutButtonActionPerformed - private void jButton7ActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jButton7ActionPerformed + private void circleLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_circleLayoutButtonActionPerformed morph(new mxCircleLayout(graph)); - }//GEN-LAST:event_jButton7ActionPerformed + }//GEN-LAST:event_circleLayoutButtonActionPerformed - private void jButton8ActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jButton8ActionPerformed + private void OrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_OrganicLayoutButtonActionPerformed applyOrganicLayout(10); - }//GEN-LAST:event_jButton8ActionPerformed + }//GEN-LAST:event_OrganicLayoutButtonActionPerformed private void applyOrganicLayout(int iterations) { mxOrganicLayout mxOrganicLayout = new mxOrganicLayout(graph) { @@ -513,9 +526,13 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider morph(mxOrganicLayout); } - private void fitGraphButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitGraphButtonActionPerformed + private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed fitGraph(); - }//GEN-LAST:event_fitGraphButtonActionPerformed + }//GEN-LAST:event_fitZoomButtonActionPerformed + + private void zoomActualButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_zoomActualButtonActionPerformed + graphComponent.zoomActual(); + }//GEN-LAST:event_zoomActualButtonActionPerformed private void fitGraph() { final Object[] childVertices = graph.getChildVertices(graph.getDefaultParent()); @@ -560,17 +577,18 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider } // Variables declaration - do not modify//GEN-BEGIN:variables + private JButton OrganicLayoutButton; private JPanel borderLayoutPanel; - private JButton fitGraphButton; - private JButton jButton1; - private JButton jButton6; - private JButton jButton7; - private JButton jButton8; + private JButton circleLayoutButton; + private JButton fastOrganicLayoutButton; + private JButton fitZoomButton; + private JButton hierarchyLayoutButton; private JToolBar.Separator jSeparator1; private JToolBar jToolBar1; private JProgressBar progressBar; private JSplitPane splitPane; private JPanel statusPanel; + private JButton zoomActualButton; private JButton zoomInButton; private JButton zoomOutButton; // End of variables declaration//GEN-END:variables From 5d948b7dfd2cf22ed44889a889961d6b2f73c9e7 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 6 Feb 2018 17:19:28 +0100 Subject: [PATCH 3/3] show instructional message when there are no pinned accounts --- .../autopsy/communications/Bundle.properties | 13 +- .../communications/VisualizationPanel.form | 192 ++++++++++++++---- .../communications/VisualizationPanel.java | 188 ++++++++++++----- .../autopsy/communications/mxGraphImpl.java | 7 +- 4 files changed, 298 insertions(+), 102 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 0161fd855c..27068a5f55 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -23,6 +23,15 @@ CVTTopComponent.vizPanel.TabConstraints.tabTitle_1=Visualize VisualizationPanel.jButton6.text=Hierarchy VisualizationPanel.jButton7.text=Circle VisualizationPanel.jButton8.text=Organic -VisualizationPanel.zoomOutButton.text= -VisualizationPanel.zoomInButton.text= VisualizationPanel.fitGraphButton.text= +VisualizationPanel.statusLabel.text= +VisualizationPanel.jTextArea1.text=Right-click an account in the Browse Accounts table, and select 'Visualize' to begin. +VisualizationPanel.jLabel1.text=Layouts: +VisualizationPanel.fitZoomButton.text= +VisualizationPanel.zoomActualButton.text= +VisualizationPanel.zoomInButton.text= +VisualizationPanel.zoomOutButton.text= +VisualizationPanel.circleLayoutButton.text=Circle +VisualizationPanel.OrganicLayoutButton.text=Organic +VisualizationPanel.fastOrganicLayoutButton.text=Fast Organic +VisualizationPanel.hierarchyLayoutButton.text=Hierarchy diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form index 7010f8f9cf..baca6eec89 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form @@ -11,7 +11,7 @@ - + @@ -38,18 +38,166 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -170,44 +318,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index 2d3f26cbc1..0dd0c4844d 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -52,16 +52,19 @@ import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JButton; +import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JProgressBar; import javax.swing.JSplitPane; +import javax.swing.JTextArea; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import org.jdesktop.layout.GroupLayout; +import org.jdesktop.layout.LayoutStyle; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; import org.openide.nodes.Node; @@ -289,11 +292,15 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider } private void rebuildGraph() throws TskCoreException { - - SwingWorker rebuild = graph.rebuild(new ProgressIndicatorImpl(), commsManager, currentFilter); - - rebuild.execute(); - + if (graph.hasPinnedAccounts()) { + borderLayoutPanel.remove(jPanel1); + borderLayoutPanel.add(graphComponent, BorderLayout.CENTER); + SwingWorker rebuild = graph.rebuild(new ProgressIndicatorImpl(), commsManager, currentFilter); + rebuild.execute(); + } else { + borderLayoutPanel.remove(graphComponent); + borderLayoutPanel.add(jPanel1, BorderLayout.CENTER); + } } @Override @@ -348,7 +355,14 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider splitPane = new JSplitPane(); borderLayoutPanel = new JPanel(); - jToolBar1 = new JToolBar(); + jToolBar2 = new JToolBar(); + statusLabel = new JLabel(); + progresPanel = new JPanel(); + progressBar = new JProgressBar(); + jPanel1 = new JPanel(); + jTextArea1 = new JTextArea(); + jPanel2 = new JPanel(); + jLabel1 = new JLabel(); hierarchyLayoutButton = new JButton(); fastOrganicLayoutButton = new JButton(); OrganicLayoutButton = new JButton(); @@ -358,8 +372,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider zoomInButton = new JButton(); zoomActualButton = new JButton(); fitZoomButton = new JButton(); - statusPanel = new JPanel(); - progressBar = new JProgressBar(); setLayout(new BorderLayout()); @@ -368,7 +380,56 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider borderLayoutPanel.setLayout(new BorderLayout()); - jToolBar1.setRollover(true); + jToolBar2.setFloatable(false); + jToolBar2.setRollover(true); + + statusLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.statusLabel.text")); // NOI18N + jToolBar2.add(statusLabel); + + progressBar.setMaximumSize(new Dimension(200, 14)); + progressBar.setStringPainted(true); + + GroupLayout progresPanelLayout = new GroupLayout(progresPanel); + progresPanel.setLayout(progresPanelLayout); + progresPanelLayout.setHorizontalGroup(progresPanelLayout.createParallelGroup(GroupLayout.LEADING) + .add(GroupLayout.TRAILING, progresPanelLayout.createSequentialGroup() + .add(0, 651, Short.MAX_VALUE) + .add(progressBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + ); + progresPanelLayout.setVerticalGroup(progresPanelLayout.createParallelGroup(GroupLayout.LEADING) + .add(GroupLayout.TRAILING, progresPanelLayout.createSequentialGroup() + .add(0, 0, 0) + .add(progressBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) + ); + + jToolBar2.add(progresPanel); + + borderLayoutPanel.add(jToolBar2, BorderLayout.PAGE_END); + + jTextArea1.setBackground(new Color(240, 240, 240)); + jTextArea1.setColumns(20); + jTextArea1.setLineWrap(true); + jTextArea1.setRows(5); + jTextArea1.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jTextArea1.text")); // NOI18N + + GroupLayout jPanel1Layout = new GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(GroupLayout.LEADING) + .add(GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup() + .addContainerGap(213, Short.MAX_VALUE) + .add(jTextArea1, GroupLayout.PREFERRED_SIZE, 372, GroupLayout.PREFERRED_SIZE) + .addContainerGap(214, Short.MAX_VALUE)) + ); + jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(GroupLayout.LEADING) + .add(GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup() + .addContainerGap(200, Short.MAX_VALUE) + .add(jTextArea1, GroupLayout.PREFERRED_SIZE, 43, GroupLayout.PREFERRED_SIZE) + .addContainerGap(200, Short.MAX_VALUE)) + ); + + borderLayoutPanel.add(jPanel1, BorderLayout.CENTER); + + jLabel1.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jLabel1.text")); // NOI18N hierarchyLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.hierarchyLayoutButton.text")); // NOI18N hierarchyLayoutButton.setFocusable(false); @@ -379,7 +440,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider hierarchyLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(hierarchyLayoutButton); fastOrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fastOrganicLayoutButton.text")); // NOI18N fastOrganicLayoutButton.setFocusable(false); @@ -390,7 +450,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider fastOrganicLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(fastOrganicLayoutButton); OrganicLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.OrganicLayoutButton.text")); // NOI18N OrganicLayoutButton.setFocusable(false); @@ -401,7 +460,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider OrganicLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(OrganicLayoutButton); circleLayoutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.circleLayoutButton.text")); // NOI18N circleLayoutButton.setFocusable(false); @@ -412,8 +470,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider circleLayoutButtonActionPerformed(evt); } }); - jToolBar1.add(circleLayoutButton); - jToolBar1.add(jSeparator1); zoomOutButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-out-red.png"))); // NOI18N zoomOutButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.text")); // NOI18N @@ -425,7 +481,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider zoomOutButtonActionPerformed(evt); } }); - jToolBar1.add(zoomOutButton); zoomInButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-in-green.png"))); // NOI18N zoomInButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.text")); // NOI18N @@ -437,7 +492,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider zoomInButtonActionPerformed(evt); } }); - jToolBar1.add(zoomInButton); zoomActualButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-actual.png"))); // NOI18N zoomActualButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.text")); // NOI18N @@ -449,7 +503,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider zoomActualButtonActionPerformed(evt); } }); - jToolBar1.add(zoomActualButton); fitZoomButton.setIcon(new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/communications/images/magnifier-zoom-fit.png"))); // NOI18N fitZoomButton.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.text")); // NOI18N @@ -461,38 +514,64 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider fitZoomButtonActionPerformed(evt); } }); - jToolBar1.add(fitZoomButton); - borderLayoutPanel.add(jToolBar1, BorderLayout.NORTH); - - progressBar.setMaximumSize(new Dimension(200, 14)); - progressBar.setStringPainted(true); - - GroupLayout statusPanelLayout = new GroupLayout(statusPanel); - statusPanel.setLayout(statusPanelLayout); - statusPanelLayout.setHorizontalGroup(statusPanelLayout.createParallelGroup(GroupLayout.LEADING) - .add(GroupLayout.TRAILING, statusPanelLayout.createSequentialGroup() - .addContainerGap(516, Short.MAX_VALUE) - .add(progressBar, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - statusPanelLayout.setVerticalGroup(statusPanelLayout.createParallelGroup(GroupLayout.LEADING) - .add(GroupLayout.TRAILING, statusPanelLayout.createSequentialGroup() + GroupLayout jPanel2Layout = new GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(GroupLayout.LEADING) + .add(jPanel2Layout.createSequentialGroup() .add(3, 3, 3) - .add(progressBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .add(jLabel1) + .addPreferredGap(LayoutStyle.RELATED) + .add(fastOrganicLayoutButton) + .addPreferredGap(LayoutStyle.RELATED) + .add(OrganicLayoutButton) + .addPreferredGap(LayoutStyle.RELATED) + .add(hierarchyLayoutButton) + .addPreferredGap(LayoutStyle.RELATED) + .add(circleLayoutButton) + .addPreferredGap(LayoutStyle.RELATED) + .add(jSeparator1, GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.RELATED) + .add(zoomOutButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.RELATED) + .add(zoomInButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.RELATED) + .add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.RELATED) + .add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE) + .addContainerGap(214, Short.MAX_VALUE)) + ); + jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(GroupLayout.LEADING) + .add(jPanel2Layout.createSequentialGroup() + .add(3, 3, 3) + .add(jPanel2Layout.createParallelGroup(GroupLayout.CENTER) + .add(jLabel1, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE) + .add(hierarchyLayoutButton) + .add(fastOrganicLayoutButton) + .add(OrganicLayoutButton) + .add(circleLayoutButton) + .add(jSeparator1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(zoomOutButton) + .add(zoomInButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(zoomActualButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(fitZoomButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(3, 3, 3)) ); - borderLayoutPanel.add(statusPanel, BorderLayout.SOUTH); + borderLayoutPanel.add(jPanel2, BorderLayout.PAGE_START); splitPane.setLeftComponent(borderLayoutPanel); add(splitPane, BorderLayout.CENTER); }// //GEN-END:initComponents - private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed - morph(new mxFastOrganicLayout(graph)); - }//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed + private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed + fitGraph(); + }//GEN-LAST:event_fitZoomButtonActionPerformed + + private void zoomActualButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_zoomActualButtonActionPerformed + graphComponent.zoomActual(); + }//GEN-LAST:event_zoomActualButtonActionPerformed private void zoomInButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_zoomInButtonActionPerformed graphComponent.zoomIn(); @@ -502,10 +581,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider graphComponent.zoomOut(); }//GEN-LAST:event_zoomOutButtonActionPerformed - private void hierarchyLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_hierarchyLayoutButtonActionPerformed - morph(new mxHierarchicalLayout(graph)); - }//GEN-LAST:event_hierarchyLayoutButtonActionPerformed - private void circleLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_circleLayoutButtonActionPerformed morph(new mxCircleLayout(graph)); }//GEN-LAST:event_circleLayoutButtonActionPerformed @@ -514,6 +589,14 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider applyOrganicLayout(10); }//GEN-LAST:event_OrganicLayoutButtonActionPerformed + private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed + morph(new mxFastOrganicLayout(graph)); + }//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed + + private void hierarchyLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_hierarchyLayoutButtonActionPerformed + morph(new mxHierarchicalLayout(graph)); + }//GEN-LAST:event_hierarchyLayoutButtonActionPerformed + private void applyOrganicLayout(int iterations) { mxOrganicLayout mxOrganicLayout = new mxOrganicLayout(graph) { @Override @@ -526,14 +609,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider morph(mxOrganicLayout); } - private void fitZoomButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fitZoomButtonActionPerformed - fitGraph(); - }//GEN-LAST:event_fitZoomButtonActionPerformed - - private void zoomActualButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_zoomActualButtonActionPerformed - graphComponent.zoomActual(); - }//GEN-LAST:event_zoomActualButtonActionPerformed - private void fitGraph() { final Object[] childVertices = graph.getChildVertices(graph.getDefaultParent()); mxRectangle boundsForCells = graph.getBoundsForCells(childVertices, true, true, true); @@ -546,10 +621,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider } graph.getView().setTranslate(new mxPoint(translate.getX() - boundsForCells.getX(), translate.getY() - boundsForCells.getY())); - -// graphComponent.zoomActual(); -// graphComponent.zoomAndCenter(); -// graph.getGraphBounds().getWidth() } private void morph(mxIGraphLayout layout) { @@ -583,11 +654,16 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider private JButton fastOrganicLayoutButton; private JButton fitZoomButton; private JButton hierarchyLayoutButton; + private JLabel jLabel1; + private JPanel jPanel1; + private JPanel jPanel2; private JToolBar.Separator jSeparator1; - private JToolBar jToolBar1; + private JTextArea jTextArea1; + private JToolBar jToolBar2; + private JPanel progresPanel; private JProgressBar progressBar; private JSplitPane splitPane; - private JPanel statusPanel; + private JLabel statusLabel; private JButton zoomActualButton; private JButton zoomInButton; private JButton zoomOutButton; diff --git a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java index 0d64d2f54e..da235f1526 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java +++ b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java @@ -167,7 +167,6 @@ final class mxGraphImpl extends mxGraph { lockedAccountDevices.clear(); } - private mxCell getOrCreateVertex(AccountDeviceInstanceKey accountDeviceInstanceKey) { final AccountDeviceInstance accountDeviceInstance = accountDeviceInstanceKey.getAccountDeviceInstance(); final String name =// accountDeviceInstance.getDeviceId() + ":" + @@ -214,6 +213,9 @@ final class mxGraphImpl extends mxGraph { return edge; } + boolean hasPinnedAccounts() { + return pinnedAccountDevices.isEmpty() == false; } + class SwingWorkerImpl extends SwingWorker { private final ProgressIndicator progress; @@ -228,7 +230,6 @@ final class mxGraphImpl extends mxGraph { @Override protected Void doInBackground() throws Exception { - progress.start("Loading accounts", pinnedAccountDevices.size()); int i = 0; try { @@ -264,7 +265,7 @@ final class mxGraphImpl extends mxGraph { adiKey2.getAccountDeviceInstance(), currentFilter); if (relationships.size() > 0) { - mxCell addEdge = addEdge(relationships,adiKey1,adiKey2); + mxCell addEdge = addEdge(relationships, adiKey1, adiKey2); progress.progress(addEdge.getId()); } }