diff --git a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties index 094538665e..271d5b3b5a 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/communications/Bundle.properties @@ -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 diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form index cf08d3ba4c..fa4b00c17a 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.form @@ -97,7 +97,7 @@ - + @@ -140,7 +140,7 @@ - + @@ -156,7 +156,7 @@ - + @@ -171,7 +171,7 @@ - + @@ -187,7 +187,7 @@ - + @@ -236,17 +236,17 @@ - + - + - + @@ -272,6 +272,9 @@ + + + @@ -288,6 +291,9 @@ + + + @@ -304,6 +310,9 @@ + + + @@ -320,6 +329,9 @@ + + + diff --git a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java index 95fcfc52bc..4ac198f1c4 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java +++ b/Core/src/org/sleuthkit/autopsy/communications/VisualizationPanel.java @@ -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); } diff --git a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java index b61cec8284..9a890ec555 100644 --- a/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java +++ b/Core/src/org/sleuthkit/autopsy/communications/mxGraphImpl.java @@ -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 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 = "" + accountName; + + ">" + accountName; if (pinnedAccountDevices.contains(adiKey)) { - label = ""+label; + label = "" + label; } if (lockedVertices.contains((mxCell) cell)) { - label += ""; + label += ""; } - return "
" + label + "
"; + return "
" + label + "
"; } 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 { - + 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 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(); }