mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-17 18:17:43 +00:00
improve fitGraph and other small tweaks
This commit is contained in:
parent
9225730f02
commit
cce4e918cd
@ -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
|
||||
|
@ -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, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/communications/Bundle.properties" key="VisualizationPanel.organicLayoutButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</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, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="focusable" type="boolean" value="false"/>
|
||||
<Property name="horizontalTextPosition" type="int" value="0"/>
|
||||
<Property name="verticalTextPosition" type="int" value="3"/>
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user