diff options
author | Siva Velusamy <vsiva@google.com> | 2011-11-02 13:50:28 -0700 |
---|---|---|
committer | Siva Velusamy <vsiva@google.com> | 2011-11-02 13:50:28 -0700 |
commit | 4820ea88f12c1635489371f587e9b6ab70f16672 (patch) | |
tree | c3b81e1b9390484640af81af7c29e0d6a0f2417b /ddms/libs | |
parent | 2a6bc05bdf067bfb140fec33380eca12a04c71fc (diff) | |
download | sdk-4820ea88f12c1635489371f587e9b6ab70f16672.zip sdk-4820ea88f12c1635489371f587e9b6ab70f16672.tar.gz sdk-4820ea88f12c1635489371f587e9b6ab70f16672.tar.bz2 |
ddms-heap: Show atleast 1 row.
One some platforms, the table doesn't show any rows at all, and there is
no way to resize the table. This patch makes sure that there is one row
that is always displayed.
Change-Id: Ib93839c610926a7f8629436d26bb7ad9485431af
Diffstat (limited to 'ddms/libs')
-rw-r--r-- | ddms/libs/ddmuilib/src/com/android/ddmuilib/HeapPanel.java | 102 |
1 files changed, 57 insertions, 45 deletions
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/HeapPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/HeapPanel.java index a422e65..83cdc90 100644 --- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/HeapPanel.java +++ b/ddms/libs/ddmuilib/src/com/android/ddmuilib/HeapPanel.java @@ -105,11 +105,11 @@ public final class HeapPanel extends BaseHeapPanel { private static final int PLACEHOLDER_LINEAR_H_SIZE = 300; private static final int[] ZOOMS = {100, 50, 25}; - + private static final NumberFormat sByteFormatter = NumberFormat.getInstance(); private static final NumberFormat sLargeByteFormatter = NumberFormat.getInstance(); private static final NumberFormat sCountFormatter = NumberFormat.getInstance(); - + static { sByteFormatter.setMinimumFractionDigits(0); sByteFormatter.setMaximumFractionDigits(1); @@ -276,7 +276,7 @@ public final class HeapPanel extends BaseHeapPanel { } fillSummaryTable(cd); - + int mode = mDisplayMode.getSelectionIndex(); if (mode == 0) { fillDetailedTable(client, false /* forceRedraw */); @@ -364,10 +364,10 @@ public final class HeapPanel extends BaseHeapPanel { mStatisticsBase.setLayout(gl = new GridLayout(1, false)); gl.marginHeight = gl.marginWidth = 0; mDisplayStack.topControl = mStatisticsBase; - + mStatisticsTable = createDetailedTable(mStatisticsBase); mStatisticsTable.setLayoutData(new GridData(GridData.FILL_BOTH)); - + createChart(); //create the linear composite @@ -393,7 +393,7 @@ public final class HeapPanel extends BaseHeapPanel { createLegend(bottomSection); } -/* +/* mScrolledComposite = new ScrolledComposite(mTop, SWT.H_SCROLL | SWT.V_SCROLL); mScrolledComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); mScrolledComposite.setExpandHorizontal(true); @@ -489,7 +489,7 @@ public final class HeapPanel extends BaseHeapPanel { public void setFocus() { mHeapSummary.setFocus(); } - + private Table createSummaryTable(Composite base) { Table tab = new Table(base, SWT.SINGLE | SWT.FULL_SELECTION); @@ -527,12 +527,16 @@ public final class HeapPanel extends BaseHeapPanel { col.pack(); col.setText("# Objects"); + // make sure there is always one empty item so that one table row is always displayed. + TableItem item = new TableItem(tab, SWT.NONE); + item.setText(""); + return tab; } - + private Table createDetailedTable(Composite base) { IPreferenceStore store = DdmUiPreferences.getStore(); - + Table tab = new Table(base, SWT.SINGLE | SWT.FULL_SELECTION); tab.setHeaderVisible(true); tab.setLinesVisible(true); @@ -568,16 +572,16 @@ public final class HeapPanel extends BaseHeapPanel { tab.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - + Client client = getCurrentClient(); if (client != null) { int index = mStatisticsTable.getSelectionIndex(); TableItem item = mStatisticsTable.getItem(index); - + if (item != null) { Map<Integer, ArrayList<HeapSegmentElement>> heapMap = client.getClientData().getVmHeapData().getProcessedHeapMap(); - + ArrayList<HeapSegmentElement> list = heapMap.get(item.getData()); if (list != null) { showChart(list); @@ -587,10 +591,10 @@ public final class HeapPanel extends BaseHeapPanel { } }); - + return tab; } - + /** * Creates the chart below the statistics table */ @@ -598,30 +602,30 @@ public final class HeapPanel extends BaseHeapPanel { mAllocCountDataSet = new DefaultCategoryDataset(); mChart = ChartFactory.createBarChart(null, "Size", "Count", mAllocCountDataSet, PlotOrientation.VERTICAL, false, true, false); - + // get the font to make a proper title. We need to convert the swt font, // into an awt font. Font f = mStatisticsBase.getFont(); FontData[] fData = f.getFontData(); - + // event though on Mac OS there could be more than one fontData, we'll only use // the first one. FontData firstFontData = fData[0]; - + java.awt.Font awtFont = SWTUtils.toAwtFont(mStatisticsBase.getDisplay(), firstFontData, true /* ensureSameSize */); mChart.setTitle(new TextTitle("Allocation count per size", awtFont)); - + Plot plot = mChart.getPlot(); if (plot instanceof CategoryPlot) { // get the plot CategoryPlot categoryPlot = (CategoryPlot)plot; - + // set the domain axis to draw labels that are displayed even with many values. CategoryAxis domainAxis = categoryPlot.getDomainAxis(); domainAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_90); - + CategoryItemRenderer renderer = categoryPlot.getRenderer(); renderer.setBaseToolTipGenerator(new CategoryToolTipGenerator() { public String generateToolTip(CategoryDataset dataset, int row, int column) { @@ -629,8 +633,8 @@ public final class HeapPanel extends BaseHeapPanel { ByteLong columnKey = (ByteLong)dataset.getColumnKey(column); String rowKey = (String)dataset.getRowKey(row); Number value = dataset.getValue(rowKey, columnKey); - - return String.format("%1$d %2$s of %3$d bytes", value.intValue(), rowKey, + + return String.format("%1$d %2$s of %3$d bytes", value.intValue(), rowKey, columnKey.getValue()); } }); @@ -714,11 +718,13 @@ public final class HeapPanel extends BaseHeapPanel { mHeapSummary.setRedraw(false); mHeapSummary.removeAll(); + int numRows = 0; if (cd != null) { synchronized (cd) { Iterator<Integer> iter = cd.getVmHeapIds(); - + while (iter.hasNext()) { + numRows++; Integer id = iter.next(); Map<String, Long> heapInfo = cd.getVmHeapInfo(id); if (heapInfo == null) { @@ -727,10 +733,10 @@ public final class HeapPanel extends BaseHeapPanel { long sizeInBytes = heapInfo.get(ClientData.HEAP_SIZE_BYTES); long bytesAllocated = heapInfo.get(ClientData.HEAP_BYTES_ALLOCATED); long objectsAllocated = heapInfo.get(ClientData.HEAP_OBJECTS_ALLOCATED); - + TableItem item = new TableItem(mHeapSummary, SWT.NONE); item.setText(0, id.toString()); - + item.setText(1, prettyByteCount(sizeInBytes)); item.setText(2, prettyByteCount(bytesAllocated)); item.setText(3, prettyByteCount(sizeInBytes - bytesAllocated)); @@ -740,10 +746,16 @@ public final class HeapPanel extends BaseHeapPanel { } } + if (numRows == 0) { + // make sure there is always one empty item so that one table row is always displayed. + TableItem item = new TableItem(mHeapSummary, SWT.NONE); + item.setText(""); + } + mHeapSummary.pack(); mHeapSummary.setRedraw(true); } - + private void fillDetailedTable(Client client, boolean forceRedraw) { // first check if the client is invalid or heap updates are not enabled. if (client == null || client.isHeapUpdateEnabled() == false) { @@ -751,7 +763,7 @@ public final class HeapPanel extends BaseHeapPanel { showChart(null); return; } - + ClientData cd = client.getClientData(); Map<Integer, ArrayList<HeapSegmentElement>> heapMap; @@ -762,12 +774,12 @@ public final class HeapPanel extends BaseHeapPanel { // no change, we return. return; } - + heapMap = cd.getVmHeapData().getProcessedHeapMap(); } - + // we have new data, lets display it. - + // First, get the current selection, and its key. int index = mStatisticsTable.getSelectionIndex(); Integer selectedKey = null; @@ -778,11 +790,11 @@ public final class HeapPanel extends BaseHeapPanel { // disable redraws and remove all from the table. mStatisticsTable.setRedraw(false); mStatisticsTable.removeAll(); - + if (heapMap != null) { int selectedIndex = -1; ArrayList<HeapSegmentElement> selectedList = null; - + // get the keys Set<Integer> keys = heapMap.keySet(); int iter = 0; // use a manual iter int because Set<?> doesn't have an index @@ -802,11 +814,11 @@ public final class HeapPanel extends BaseHeapPanel { // get the type item.setText(0, mMapLegend[key]); - + // set the count, smallest, largest int count = list.size(); item.setText(1, addCommasToNumber(count)); - + if (count > 0) { item.setText(3, prettyByteCount(list.get(0).getLength())); item.setText(4, prettyByteCount(list.get(count-1).getLength())); @@ -819,11 +831,11 @@ public final class HeapPanel extends BaseHeapPanel { long totalSize = 0; for (int i = 0 ; i < count; i++) { element = list.get(i); - + size = element.getLength(); totalSize += size; } - + // set the average and total item.setText(2, prettyByteCount(totalSize)); item.setText(6, prettyByteCount(totalSize / count)); @@ -831,7 +843,7 @@ public final class HeapPanel extends BaseHeapPanel { } mStatisticsTable.setRedraw(true); - + if (selectedIndex != -1) { mStatisticsTable.setSelection(selectedIndex); showChart(selectedList); @@ -842,14 +854,14 @@ public final class HeapPanel extends BaseHeapPanel { mStatisticsTable.setRedraw(true); } } - + private static class ByteLong implements Comparable<ByteLong> { private long mValue; - + private ByteLong(long value) { mValue = value; } - + public long getValue() { return mValue; } @@ -865,9 +877,9 @@ public final class HeapPanel extends BaseHeapPanel { } return 0; } - + } - + /** * Fills the chart with the content of the list of {@link HeapSegmentElement}. */ @@ -876,7 +888,7 @@ public final class HeapPanel extends BaseHeapPanel { if (list != null) { String rowKey = "Alloc Count"; - + long currentSize = -1; int currentCount = 0; for (HeapSegmentElement element : list) { @@ -885,14 +897,14 @@ public final class HeapPanel extends BaseHeapPanel { ByteLong columnKey = new ByteLong(currentSize); mAllocCountDataSet.addValue(currentCount, rowKey, columnKey); } - + currentSize = element.getLength(); currentCount = 1; } else { currentCount++; } } - + // add the last item if (currentSize != -1) { ByteLong columnKey = new ByteLong(currentSize); |