improve fitGraph and other small tweaks

This commit is contained in:
millmanorama 2018-02-09 17:51:32 +01:00
parent 9225730f02
commit cce4e918cd
4 changed files with 137 additions and 111 deletions

View File

@ -24,7 +24,7 @@ VisualizationPanel.jButton6.text=Hierarchy
VisualizationPanel.jButton7.text=Circle
VisualizationPanel.jButton8.text=Organic
VisualizationPanel.fitGraphButton.text=
VisualizationPanel.statusLabel.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=
@ -32,8 +32,12 @@ 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
VisualizationPanel.jLabel2.text=Zoom:
VisualizationPanel.zoomLabel.text=100%
VisualizationPanel.zoomOutButton.toolTipText=Zoom out
VisualizationPanel.zoomInButton.toolTipText=Zoom in
VisualizationPanel.zoomActualButton.toolTipText=reset zoom
VisualizationPanel.fitZoomButton.toolTipText=fit visualization
VisualizationPanel.organicLayoutButton.text=Organic

View File

@ -97,7 +97,7 @@
</Container>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="jPanel1">
<Container class="javax.swing.JPanel" name="placeHolderPanel">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
@ -140,7 +140,7 @@
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="jPanel2">
<Container class="javax.swing.JPanel" name="toolbar">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="First"/>
@ -156,7 +156,7 @@
<EmptySpace max="-2" attributes="0"/>
<Component id="fastOrganicLayoutButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="OrganicLayoutButton" min="-2" max="-2" attributes="0"/>
<Component id="organicLayoutButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="hierarchyLayoutButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
@ -171,7 +171,7 @@
<Component id="zoomActualButton" min="-2" pref="33" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="fitZoomButton" min="-2" pref="32" max="-2" attributes="0"/>
<EmptySpace pref="110" max="32767" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
<Component id="jLabel2" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="zoomLabel" min="-2" max="-2" attributes="0"/>
@ -187,7 +187,7 @@
<Component id="jLabel1" alignment="2" min="-2" pref="25" max="-2" attributes="0"/>
<Component id="hierarchyLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="fastOrganicLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="OrganicLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="organicLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="circleLayoutButton" alignment="2" min="-2" max="-2" attributes="0"/>
<Component id="jSeparator1" alignment="2" max="32767" attributes="0"/>
<Component id="zoomOutButton" alignment="2" min="-2" max="-2" attributes="0"/>
@ -236,17 +236,17 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fastOrganicLayoutButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="OrganicLayoutButton">
<Component class="javax.swing.JButton" name="organicLayoutButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.OrganicLayoutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.organicLayoutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="OrganicLayoutButtonActionPerformed"/>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="organicLayoutButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="circleLayoutButton">
@ -272,6 +272,9 @@
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomOutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomOutButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
@ -288,6 +291,9 @@
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomInButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
@ -304,6 +310,9 @@
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomActualButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.zoomActualButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
@ -320,6 +329,9 @@
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.fitZoomButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>

View File

@ -43,6 +43,8 @@ import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.text.DecimalFormat;
import java.util.Arrays;
@ -120,20 +122,21 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
private CommunicationsManager commsManager;
private CommunicationsFilter currentFilter;
private final mxRubberband rubberband;
private mxFastOrganicLayout mxFastOrganicLayout;
private mxCircleLayout mxCircleLayout;
private final mxOrganicLayout mxOrganicLayout;
private mxHierarchicalLayout mxHierarchicalLayout;
private final mxFastOrganicLayout fastOrganicLayout;
private final mxCircleLayout circleLayout;
private final mxOrganicLayout organicLayout;
private final mxHierarchicalLayout hierarchicalLayout;
private SwingWorker<?, ?> worker;
public VisualizationPanel() {
initComponents();
graph = new mxGraphImpl();
mxFastOrganicLayout = new mxFastOrganicLayoutImpl(graph);
mxCircleLayout = new mxCircleLayoutImpl(graph);
mxOrganicLayout = new mxOrganicLayoutImpl(graph);
mxHierarchicalLayout = new mxHierarchicalLayoutImpl(graph);
fastOrganicLayout = new mxFastOrganicLayoutImpl(graph);
circleLayout = new mxCircleLayoutImpl(graph);
organicLayout = new mxOrganicLayoutImpl(graph);
hierarchicalLayout = new mxHierarchicalLayoutImpl(graph);
graphComponent = new mxGraphComponent(graph);
graphComponent.setAutoExtend(true);
graphComponent.setAutoScroll(true);
@ -249,7 +252,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
graph.getModel().endUpdate();
}
applyOrganicLayout(10);
}
@Subscribe
@ -269,7 +271,6 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
graph.getModel().endUpdate();
}
applyOrganicLayout(10);
}
@Subscribe
@ -287,18 +288,30 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
graph.getModel().endUpdate();
}
applyOrganicLayout(10);
}
private void rebuildGraph() throws TskCoreException {
if (graph.hasPinnedAccounts()) {
borderLayoutPanel.remove(jPanel1);
borderLayoutPanel.remove(placeHolderPanel);
borderLayoutPanel.add(graphComponent, BorderLayout.CENTER);
SwingWorker<?, ?> rebuild = graph.rebuild(new ProgressIndicatorImpl(), commsManager, currentFilter);
rebuild.execute();
if (worker != null) {
worker.cancel(true);
}
worker = graph.rebuild(new ProgressIndicatorImpl(), commsManager, currentFilter);
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (worker.isDone()) {
applyOrganicLayout(10);
}
}
});
worker.execute();
} else {
borderLayoutPanel.remove(graphComponent);
borderLayoutPanel.add(jPanel1, BorderLayout.CENTER);
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
}
}
@ -358,13 +371,13 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
statusLabel = new JLabel();
progresPanel = new JPanel();
progressBar = new JProgressBar();
jPanel1 = new JPanel();
placeHolderPanel = new JPanel();
jTextArea1 = new JTextArea();
jPanel2 = new JPanel();
toolbar = new JPanel();
jLabel1 = new JLabel();
hierarchyLayoutButton = new JButton();
fastOrganicLayoutButton = new JButton();
OrganicLayoutButton = new JButton();
organicLayoutButton = new JButton();
circleLayoutButton = new JButton();
jSeparator1 = new JToolBar.Separator();
zoomOutButton = new JButton();
@ -416,22 +429,22 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
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()
GroupLayout placeHolderPanelLayout = new GroupLayout(placeHolderPanel);
placeHolderPanel.setLayout(placeHolderPanelLayout);
placeHolderPanelLayout.setHorizontalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
.add(GroupLayout.TRAILING, placeHolderPanelLayout.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()
placeHolderPanelLayout.setVerticalGroup(placeHolderPanelLayout.createParallelGroup(GroupLayout.LEADING)
.add(GroupLayout.TRAILING, placeHolderPanelLayout.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);
borderLayoutPanel.add(placeHolderPanel, BorderLayout.CENTER);
jLabel1.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.jLabel1.text")); // NOI18N
@ -455,13 +468,13 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}
});
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() {
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) {
OrganicLayoutButtonActionPerformed(evt);
organicLayoutButtonActionPerformed(evt);
}
});
@ -477,6 +490,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
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
zoomOutButton.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomOutButton.toolTipText")); // NOI18N
zoomOutButton.setFocusable(false);
zoomOutButton.setHorizontalTextPosition(SwingConstants.CENTER);
zoomOutButton.setVerticalTextPosition(SwingConstants.BOTTOM);
@ -488,6 +502,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
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.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomInButton.toolTipText")); // NOI18N
zoomInButton.setFocusable(false);
zoomInButton.setHorizontalTextPosition(SwingConstants.CENTER);
zoomInButton.setVerticalTextPosition(SwingConstants.BOTTOM);
@ -499,6 +514,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
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.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomActualButton.toolTipText")); // NOI18N
zoomActualButton.setFocusable(false);
zoomActualButton.setHorizontalTextPosition(SwingConstants.CENTER);
zoomActualButton.setVerticalTextPosition(SwingConstants.BOTTOM);
@ -510,6 +526,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
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.setToolTipText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.fitZoomButton.toolTipText")); // NOI18N
fitZoomButton.setFocusable(false);
fitZoomButton.setHorizontalTextPosition(SwingConstants.CENTER);
fitZoomButton.setVerticalTextPosition(SwingConstants.BOTTOM);
@ -523,16 +540,16 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
zoomLabel.setText(NbBundle.getMessage(VisualizationPanel.class, "VisualizationPanel.zoomLabel.text")); // NOI18N
GroupLayout jPanel2Layout = new GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(GroupLayout.LEADING)
.add(jPanel2Layout.createSequentialGroup()
GroupLayout toolbarLayout = new GroupLayout(toolbar);
toolbar.setLayout(toolbarLayout);
toolbarLayout.setHorizontalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
.add(toolbarLayout.createSequentialGroup()
.add(3, 3, 3)
.add(jLabel1)
.addPreferredGap(LayoutStyle.RELATED)
.add(fastOrganicLayoutButton)
.addPreferredGap(LayoutStyle.RELATED)
.add(OrganicLayoutButton)
.add(organicLayoutButton)
.addPreferredGap(LayoutStyle.RELATED)
.add(hierarchyLayoutButton)
.addPreferredGap(LayoutStyle.RELATED)
@ -547,20 +564,20 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
.add(zoomActualButton, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED)
.add(fitZoomButton, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(LayoutStyle.RELATED, 110, Short.MAX_VALUE)
.addPreferredGap(LayoutStyle.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(jLabel2)
.addPreferredGap(LayoutStyle.RELATED)
.add(zoomLabel)
.add(27, 27, 27))
);
jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(GroupLayout.LEADING)
.add(jPanel2Layout.createSequentialGroup()
toolbarLayout.setVerticalGroup(toolbarLayout.createParallelGroup(GroupLayout.LEADING)
.add(toolbarLayout.createSequentialGroup()
.add(3, 3, 3)
.add(jPanel2Layout.createParallelGroup(GroupLayout.CENTER)
.add(toolbarLayout.createParallelGroup(GroupLayout.CENTER)
.add(jLabel1, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)
.add(hierarchyLayoutButton)
.add(fastOrganicLayoutButton)
.add(OrganicLayoutButton)
.add(organicLayoutButton)
.add(circleLayoutButton)
.add(jSeparator1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(zoomOutButton)
@ -572,7 +589,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
.add(3, 3, 3))
);
borderLayoutPanel.add(jPanel2, BorderLayout.PAGE_START);
borderLayoutPanel.add(toolbar, BorderLayout.PAGE_START);
splitPane.setLeftComponent(borderLayoutPanel);
@ -596,30 +613,29 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}//GEN-LAST:event_zoomOutButtonActionPerformed
private void circleLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_circleLayoutButtonActionPerformed
morph(mxCircleLayout);
morph(circleLayout);
}//GEN-LAST:event_circleLayoutButtonActionPerformed
private void OrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_OrganicLayoutButtonActionPerformed
private void organicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_organicLayoutButtonActionPerformed
applyOrganicLayout(10);
}//GEN-LAST:event_OrganicLayoutButtonActionPerformed
}//GEN-LAST:event_organicLayoutButtonActionPerformed
private void fastOrganicLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_fastOrganicLayoutButtonActionPerformed
morph(mxFastOrganicLayout);
morph(fastOrganicLayout);
}//GEN-LAST:event_fastOrganicLayoutButtonActionPerformed
private void hierarchyLayoutButtonActionPerformed(ActionEvent evt) {//GEN-FIRST:event_hierarchyLayoutButtonActionPerformed
morph(mxHierarchicalLayout);
morph(hierarchicalLayout);
}//GEN-LAST:event_hierarchyLayoutButtonActionPerformed
private void applyOrganicLayout(int iterations) {
mxOrganicLayout.setMaxIterations(iterations);
morph(mxOrganicLayout);
organicLayout.setMaxIterations(iterations);
morph(organicLayout);
}
private void fitGraph() {
graphComponent.zoomTo(1, true);
mxPoint translate = graph.getView().getTranslate();
if (translate == null || Double.isNaN(translate.getX()) || Double.isNaN(translate.getY())) {
translate = new mxPoint();
@ -629,7 +645,10 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
if (boundsForCells == null || Double.isNaN(boundsForCells.getWidth()) || Double.isNaN(boundsForCells.getHeight())) {
boundsForCells = new mxRectangle(0, 0, 1, 1);
}
graph.getView().setTranslate(new mxPoint(translate.getX() - boundsForCells.getX(), translate.getY() - boundsForCells.getY()));
final mxPoint mxPoint = new mxPoint(translate.getX() - boundsForCells.getX(), translate.getY() - boundsForCells.getY());
// graph.getView().setTranslate(mxPoint);
graph.cellsMoved(graph.getChildCells(graph.getDefaultParent()), mxPoint.getX(), mxPoint.getY(), false, false);
boundsForCells = graph.getCellBounds(graph.getDefaultParent(), true, true, true);
if (boundsForCells == null || Double.isNaN(boundsForCells.getWidth()) || Double.isNaN(boundsForCells.getHeight())) {
@ -637,13 +656,10 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}
Dimension size = graphComponent.getSize();
double widthFactor = size.getWidth() / boundsForCells.getWidth();
// widthFactor = boundsForCells.getWidth() / size.getWidth();
graphComponent.zoom(widthFactor);
graphComponent.zoom(widthFactor);//, true);
// bounds = graph.getGraphBounds();
}
private void morph(mxIGraphLayout layout) {
@ -662,16 +678,12 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
progressBar.setVisible(false);
progressBar.setValue(0);
});
morph.addListener(mxEvent.EXECUTE, (Object sender, mxEventObject event) -> {
// fitGraph();
});
morph.startAnimation();
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private JButton OrganicLayoutButton;
private JPanel borderLayoutPanel;
private JButton circleLayoutButton;
private JButton fastOrganicLayoutButton;
@ -679,22 +691,23 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
private JButton hierarchyLayoutButton;
private JLabel jLabel1;
private JLabel jLabel2;
private JPanel jPanel1;
private JPanel jPanel2;
private JToolBar.Separator jSeparator1;
private JTextArea jTextArea1;
private JToolBar jToolBar2;
private JButton organicLayoutButton;
private JPanel placeHolderPanel;
private JPanel progresPanel;
private JProgressBar progressBar;
private JSplitPane splitPane;
private JLabel statusLabel;
private JPanel toolbar;
private JButton zoomActualButton;
private JButton zoomInButton;
private JLabel zoomLabel;
private JButton zoomOutButton;
// End of variables declaration//GEN-END:variables
private class SelectionListener implements mxEventSource.mxIEventListener {
final private class SelectionListener implements mxEventSource.mxIEventListener {
@Override
@ -726,7 +739,7 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}
}
private class ProgressIndicatorImpl implements ProgressIndicator {
final private class ProgressIndicatorImpl implements ProgressIndicator {
@Override
public void start(String message, int totalWorkUnits) {
@ -799,9 +812,9 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}
}
private class mxFastOrganicLayoutImpl extends mxFastOrganicLayout {
final private class mxFastOrganicLayoutImpl extends mxFastOrganicLayout {
public mxFastOrganicLayoutImpl(mxGraph graph) {
private mxFastOrganicLayoutImpl(mxGraph graph) {
super(graph);
}
@ -821,12 +834,10 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}
}
private class mxCircleLayoutImpl extends mxCircleLayout {
final private class mxCircleLayoutImpl extends mxCircleLayout {
public mxCircleLayoutImpl(mxGraph graph) {
private mxCircleLayoutImpl(mxGraph graph) {
super(graph);
}
{
setResetEdges(true);
}
@ -846,12 +857,10 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}
}
private class mxOrganicLayoutImpl extends mxOrganicLayout {
final private class mxOrganicLayoutImpl extends mxOrganicLayout {
public mxOrganicLayoutImpl(mxGraph graph) {
private mxOrganicLayoutImpl(mxGraph graph) {
super(graph);
}
{
setResetEdges(true);
}
@ -871,9 +880,9 @@ final public class VisualizationPanel extends JPanel implements Lookup.Provider
}
}
private class mxHierarchicalLayoutImpl extends mxHierarchicalLayout {
final private class mxHierarchicalLayoutImpl extends mxHierarchicalLayout {
public mxHierarchicalLayoutImpl(mxGraph graph) {
private mxHierarchicalLayoutImpl(mxGraph graph) {
super(graph);
}

View File

@ -38,7 +38,6 @@ import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import javax.swing.SwingWorker;
import org.openide.util.Exceptions;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.progress.ProgressIndicator;
import org.sleuthkit.datamodel.AccountDeviceInstance;
@ -61,21 +60,19 @@ final class mxGraphImpl extends mxGraph {
private final Multimap<Content, mxCell> edgeMap = MultimapBuilder.hashKeys().hashSetValues().build();
static {
//initialize defaul cell (Vertex and/or Edge) properties
//initialize defaul vertex properties
mxStylesheet.getDefaultVertexStyle().put(mxConstants.STYLE_SHAPE, mxConstants.SHAPE_ELLIPSE);
mxStylesheet.getDefaultVertexStyle().put(mxConstants.STYLE_PERIMETER, mxConstants.PERIMETER_ELLIPSE);
mxStylesheet.getDefaultVertexStyle().put(mxConstants.STYLE_FONTCOLOR, "000000");
// mxStylesheet.getDefaultVertexStyle().put(mxConstants.STYLE_WHITE_SPACE, "wrap");
//initialize defaul edge properties
mxStylesheet.getDefaultEdgeStyle().put(mxConstants.STYLE_NOLABEL, true);
// mxStylesheet.getDefaultEdgeStyle().put(mxConstants.STYLE_OPACITY, 50 );
// mxStylesheet.getDefaultEdgeStyle().put(mxConstants.STYLE_ROUNDED, true);
mxStylesheet.getDefaultEdgeStyle().put(mxConstants.STYLE_PERIMETER_SPACING, 0);
mxStylesheet.getDefaultEdgeStyle().put(mxConstants.STYLE_ENDARROW, mxConstants.NONE);
mxStylesheet.getDefaultEdgeStyle().put(mxConstants.STYLE_STARTARROW, mxConstants.NONE);
}
public mxGraphImpl() {
mxGraphImpl() {
super(mxStylesheet);
setAutoSizeCells(true);
setCellsCloneable(false);
@ -139,17 +136,20 @@ final class mxGraphImpl extends mxGraph {
if (value instanceof AccountDeviceInstanceKey) {
final AccountDeviceInstanceKey adiKey = (AccountDeviceInstanceKey) value;
final String accountName = adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID();
final double size = Math.round(Math.log(adiKey.getMessageCount()) + 5);
String iconFileName = Utils.getIconFileName(adiKey.getAccountDeviceInstance().getAccount().getAccountType());
String label = "<img src=\""
String label = "<img height=" + size + " width=" + size + " src="
+ mxGraphImpl.class.getResource("/org/sleuthkit/autopsy/communications/images/" + iconFileName)
+ "\">" + accountName;
+ ">" + accountName;
if (pinnedAccountDevices.contains(adiKey)) {
label = "<img src=\"" + MARKER_PIN_URL + "\">"+label;
label = "<img height=" + size + " width=" + size + " src=" + MARKER_PIN_URL + ">" + label;
}
if (lockedVertices.contains((mxCell) cell)) {
label += "<img src=\"" + LOCK_URL + "\">";
label += "<img height=" + size + " width=" + size + " src=" + LOCK_URL + ">";
}
return "<div style=\"font-size:"+ (Math.log(adiKey.getMessageCount())+5)+ "px;\" >" + label + "</div>";
return "<div style=\"font-size:" + size + "px;\" >" + label + "</div>";
} else {
return "";
}
@ -184,14 +184,15 @@ final class mxGraphImpl extends mxGraph {
getView().updateLabelBounds(state);
getView().updateBoundingBox(state);
}
SwingWorker<?, ?> rebuild(ProgressIndicator progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
return new SwingWorkerImpl(progress, commsManager, currentFilter);
}
void resetGraph() {
clear();
getView().setScale(1);
pinnedAccountDevices.clear();
lockedVertices.clear();
}
@ -207,8 +208,8 @@ final class mxGraphImpl extends mxGraph {
mxCell newVertex = (mxCell) insertVertex(
getDefaultParent(),
vertexName, accountDeviceInstanceKey,
Math.random() * getView().getGraphBounds().getWidth(),
Math.random() * getView().getGraphBounds().getHeight(),
Math.random() * 400,
Math.random() * 400,
size,
size);
return newVertex;
@ -249,23 +250,23 @@ final class mxGraphImpl extends mxGraph {
double getScale() {
return getView().getScale();
}
boolean isVertexLocked(mxCell vertex) {
return lockedVertices.contains(vertex);
}
private class SwingWorkerImpl extends SwingWorker<Void, Void> {
private final ProgressIndicator progress;
private final CommunicationsManager commsManager;
private final CommunicationsFilter currentFilter;
SwingWorkerImpl(ProgressIndicator progress, CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
this.progress = progress;
this.currentFilter = currentFilter;
this.commsManager = commsManager;
}
@Override
protected Void doInBackground() throws Exception {
progress.start("Loading accounts", pinnedAccountDevices.size());
@ -296,7 +297,7 @@ final class mxGraphImpl extends mxGraph {
for (i = 0; i < relatedAccountsList.size(); i++) {
AccountDeviceInstanceKey adiKey1 = relatedAccountsList.get(i);
for (int j = i; j < relatedAccountsList.size(); j++) {
AccountDeviceInstanceKey adiKey2 = relatedAccountsList.get(j);
List<Content> relationships = commsManager.getRelationshipSources(
adiKey1.getAccountDeviceInstance(),
@ -315,14 +316,14 @@ final class mxGraphImpl extends mxGraph {
}
return null;
}
@Override
protected void done() {
super.done();
try {
get();
} catch (InterruptedException | ExecutionException ex) {
Exceptions.printStackTrace(ex);
logger.log(Level.SEVERE, "Error building graph visualization. ", ex);
} finally {
progress.finish();
}