diff options
Diffstat (limited to 'ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java')
-rw-r--r-- | ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java | 662 |
1 files changed, 0 insertions, 662 deletions
diff --git a/ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java b/ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java deleted file mode 100644 index 23775e8..0000000 --- a/ddms/libs/ddmuilib/src/com/android/ddmuilib/AllocationPanel.java +++ /dev/null @@ -1,662 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.ddmuilib; - -import com.android.ddmlib.AllocationInfo; -import com.android.ddmlib.AllocationInfo.AllocationSorter; -import com.android.ddmlib.AllocationInfo.SortMode; -import com.android.ddmlib.AndroidDebugBridge.IClientChangeListener; -import com.android.ddmlib.Client; -import com.android.ddmlib.ClientData.AllocationTrackingStatus; - -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Sash; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.Text; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Locale; - -/** - * Base class for our information panels. - */ -public class AllocationPanel extends TablePanel { - - private final static String PREFS_ALLOC_COL_NUMBER = "allocPanel.Col00"; //$NON-NLS-1$ - private final static String PREFS_ALLOC_COL_SIZE = "allocPanel.Col0"; //$NON-NLS-1$ - private final static String PREFS_ALLOC_COL_CLASS = "allocPanel.Col1"; //$NON-NLS-1$ - private final static String PREFS_ALLOC_COL_THREAD = "allocPanel.Col2"; //$NON-NLS-1$ - private final static String PREFS_ALLOC_COL_TRACE_CLASS = "allocPanel.Col3"; //$NON-NLS-1$ - private final static String PREFS_ALLOC_COL_TRACE_METHOD = "allocPanel.Col4"; //$NON-NLS-1$ - - private final static String PREFS_ALLOC_SASH = "allocPanel.sash"; //$NON-NLS-1$ - - private static final String PREFS_STACK_COL_CLASS = "allocPanel.stack.col0"; //$NON-NLS-1$ - private static final String PREFS_STACK_COL_METHOD = "allocPanel.stack.col1"; //$NON-NLS-1$ - private static final String PREFS_STACK_COL_FILE = "allocPanel.stack.col2"; //$NON-NLS-1$ - private static final String PREFS_STACK_COL_LINE = "allocPanel.stack.col3"; //$NON-NLS-1$ - private static final String PREFS_STACK_COL_NATIVE = "allocPanel.stack.col4"; //$NON-NLS-1$ - - private Composite mAllocationBase; - private Table mAllocationTable; - private TableViewer mAllocationViewer; - - private StackTracePanel mStackTracePanel; - private Table mStackTraceTable; - private Button mEnableButton; - private Button mRequestButton; - private Button mTraceFilterCheck; - - private final AllocationSorter mSorter = new AllocationSorter(); - private TableColumn mSortColumn; - private Image mSortUpImg; - private Image mSortDownImg; - private String mFilterText = null; - - /** - * Content Provider to display the allocations of a client. - * Expected input is a {@link Client} object, elements used in the table are of type - * {@link AllocationInfo}. - */ - private class AllocationContentProvider implements IStructuredContentProvider { - @Override - public Object[] getElements(Object inputElement) { - if (inputElement instanceof Client) { - AllocationInfo[] allocs = ((Client)inputElement).getClientData().getAllocations(); - if (allocs != null) { - if (mFilterText != null && mFilterText.length() > 0) { - allocs = getFilteredAllocations(allocs, mFilterText); - } - Arrays.sort(allocs, mSorter); - return allocs; - } - } - - return new Object[0]; - } - - @Override - public void dispose() { - // pass - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // pass - } - } - - /** - * A Label Provider to use with {@link AllocationContentProvider}. It expects the elements to be - * of type {@link AllocationInfo}. - */ - private static class AllocationLabelProvider implements ITableLabelProvider { - - @Override - public Image getColumnImage(Object element, int columnIndex) { - return null; - } - - @Override - public String getColumnText(Object element, int columnIndex) { - if (element instanceof AllocationInfo) { - AllocationInfo alloc = (AllocationInfo)element; - switch (columnIndex) { - case 0: - return Integer.toString(alloc.getAllocNumber()); - case 1: - return Integer.toString(alloc.getSize()); - case 2: - return alloc.getAllocatedClass(); - case 3: - return Short.toString(alloc.getThreadId()); - case 4: - return alloc.getFirstTraceClassName(); - case 5: - return alloc.getFirstTraceMethodName(); - } - } - - return null; - } - - @Override - public void addListener(ILabelProviderListener listener) { - // pass - } - - @Override - public void dispose() { - // pass - } - - @Override - public boolean isLabelProperty(Object element, String property) { - // pass - return false; - } - - @Override - public void removeListener(ILabelProviderListener listener) { - // pass - } - } - - /** - * Create our control(s). - */ - @Override - protected Control createControl(Composite parent) { - final IPreferenceStore store = DdmUiPreferences.getStore(); - - Display display = parent.getDisplay(); - - // get some images - mSortUpImg = ImageLoader.getDdmUiLibLoader().loadImage("sort_up.png", display); - mSortDownImg = ImageLoader.getDdmUiLibLoader().loadImage("sort_down.png", display); - - // base composite for selected client with enabled thread update. - mAllocationBase = new Composite(parent, SWT.NONE); - mAllocationBase.setLayout(new FormLayout()); - - // table above the sash - Composite topParent = new Composite(mAllocationBase, SWT.NONE); - topParent.setLayout(new GridLayout(6, false)); - - mEnableButton = new Button(topParent, SWT.PUSH); - mEnableButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - Client current = getCurrentClient(); - AllocationTrackingStatus status = current.getClientData().getAllocationStatus(); - if (status == AllocationTrackingStatus.ON) { - current.enableAllocationTracker(false); - } else { - current.enableAllocationTracker(true); - } - current.requestAllocationStatus(); - } - }); - - mRequestButton = new Button(topParent, SWT.PUSH); - mRequestButton.setText("Get Allocations"); - mRequestButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - getCurrentClient().requestAllocationDetails(); - } - }); - - setUpButtons(false /* enabled */, AllocationTrackingStatus.OFF); - - GridData gridData; - - Composite spacer = new Composite(topParent, SWT.NONE); - spacer.setLayoutData(gridData = new GridData(GridData.FILL_HORIZONTAL)); - - new Label(topParent, SWT.NONE).setText("Filter:"); - - final Text filterText = new Text(topParent, SWT.BORDER); - filterText.setLayoutData(gridData = new GridData(GridData.FILL_HORIZONTAL)); - gridData.widthHint = 200; - - filterText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent arg0) { - mFilterText = filterText.getText().trim(); - mAllocationViewer.refresh(); - } - }); - - mTraceFilterCheck = new Button(topParent, SWT.CHECK); - mTraceFilterCheck.setText("Inc. trace"); - mTraceFilterCheck.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - mAllocationViewer.refresh(); - } - }); - - mAllocationTable = new Table(topParent, SWT.MULTI | SWT.FULL_SELECTION); - mAllocationTable.setLayoutData(gridData = new GridData(GridData.FILL_BOTH)); - gridData.horizontalSpan = 6; - mAllocationTable.setHeaderVisible(true); - mAllocationTable.setLinesVisible(true); - - final TableColumn numberCol = TableHelper.createTableColumn( - mAllocationTable, - "Alloc Order", - SWT.RIGHT, - "Alloc Order", //$NON-NLS-1$ - PREFS_ALLOC_COL_NUMBER, store); - numberCol.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - setSortColumn(numberCol, SortMode.NUMBER); - } - }); - - final TableColumn sizeCol = TableHelper.createTableColumn( - mAllocationTable, - "Allocation Size", - SWT.RIGHT, - "888", //$NON-NLS-1$ - PREFS_ALLOC_COL_SIZE, store); - sizeCol.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - setSortColumn(sizeCol, SortMode.SIZE); - } - }); - - final TableColumn classCol = TableHelper.createTableColumn( - mAllocationTable, - "Allocated Class", - SWT.LEFT, - "Allocated Class", //$NON-NLS-1$ - PREFS_ALLOC_COL_CLASS, store); - classCol.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - setSortColumn(classCol, SortMode.CLASS); - } - }); - - final TableColumn threadCol = TableHelper.createTableColumn( - mAllocationTable, - "Thread Id", - SWT.LEFT, - "999", //$NON-NLS-1$ - PREFS_ALLOC_COL_THREAD, store); - threadCol.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - setSortColumn(threadCol, SortMode.THREAD); - } - }); - - final TableColumn inClassCol = TableHelper.createTableColumn( - mAllocationTable, - "Allocated in", - SWT.LEFT, - "utime", //$NON-NLS-1$ - PREFS_ALLOC_COL_TRACE_CLASS, store); - inClassCol.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - setSortColumn(inClassCol, SortMode.IN_CLASS); - } - }); - - final TableColumn inMethodCol = TableHelper.createTableColumn( - mAllocationTable, - "Allocated in", - SWT.LEFT, - "utime", //$NON-NLS-1$ - PREFS_ALLOC_COL_TRACE_METHOD, store); - inMethodCol.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - setSortColumn(inMethodCol, SortMode.IN_METHOD); - } - }); - - // init the default sort colum - switch (mSorter.getSortMode()) { - case SIZE: - mSortColumn = sizeCol; - break; - case CLASS: - mSortColumn = classCol; - break; - case THREAD: - mSortColumn = threadCol; - break; - case IN_CLASS: - mSortColumn = inClassCol; - break; - case IN_METHOD: - mSortColumn = inMethodCol; - break; - } - - mSortColumn.setImage(mSorter.isDescending() ? mSortDownImg : mSortUpImg); - - mAllocationViewer = new TableViewer(mAllocationTable); - mAllocationViewer.setContentProvider(new AllocationContentProvider()); - mAllocationViewer.setLabelProvider(new AllocationLabelProvider()); - - mAllocationViewer.addSelectionChangedListener(new ISelectionChangedListener() { - @Override - public void selectionChanged(SelectionChangedEvent event) { - AllocationInfo selectedAlloc = getAllocationSelection(event.getSelection()); - updateAllocationStackTrace(selectedAlloc); - } - }); - - // the separating sash - final Sash sash = new Sash(mAllocationBase, SWT.HORIZONTAL); - Color darkGray = parent.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY); - sash.setBackground(darkGray); - - // the UI below the sash - mStackTracePanel = new StackTracePanel(); - mStackTraceTable = mStackTracePanel.createPanel(mAllocationBase, - PREFS_STACK_COL_CLASS, - PREFS_STACK_COL_METHOD, - PREFS_STACK_COL_FILE, - PREFS_STACK_COL_LINE, - PREFS_STACK_COL_NATIVE, - store); - - // now setup the sash. - // form layout data - FormData data = new FormData(); - data.top = new FormAttachment(0, 0); - data.bottom = new FormAttachment(sash, 0); - data.left = new FormAttachment(0, 0); - data.right = new FormAttachment(100, 0); - topParent.setLayoutData(data); - - final FormData sashData = new FormData(); - if (store != null && store.contains(PREFS_ALLOC_SASH)) { - sashData.top = new FormAttachment(0, store.getInt(PREFS_ALLOC_SASH)); - } else { - sashData.top = new FormAttachment(50,0); // 50% across - } - sashData.left = new FormAttachment(0, 0); - sashData.right = new FormAttachment(100, 0); - sash.setLayoutData(sashData); - - data = new FormData(); - data.top = new FormAttachment(sash, 0); - data.bottom = new FormAttachment(100, 0); - data.left = new FormAttachment(0, 0); - data.right = new FormAttachment(100, 0); - mStackTraceTable.setLayoutData(data); - - // allow resizes, but cap at minPanelWidth - sash.addListener(SWT.Selection, new Listener() { - @Override - public void handleEvent(Event e) { - Rectangle sashRect = sash.getBounds(); - Rectangle panelRect = mAllocationBase.getClientArea(); - int bottom = panelRect.height - sashRect.height - 100; - e.y = Math.max(Math.min(e.y, bottom), 100); - if (e.y != sashRect.y) { - sashData.top = new FormAttachment(0, e.y); - store.setValue(PREFS_ALLOC_SASH, e.y); - mAllocationBase.layout(); - } - } - }); - - return mAllocationBase; - } - - @Override - public void dispose() { - mSortUpImg.dispose(); - mSortDownImg.dispose(); - super.dispose(); - } - - /** - * Sets the focus to the proper control inside the panel. - */ - @Override - public void setFocus() { - mAllocationTable.setFocus(); - } - - /** - * Sent when an existing client information changed. - * <p/> - * This is sent from a non UI thread. - * @param client the updated client. - * @param changeMask the bit mask describing the changed properties. It can contain - * any of the following values: {@link Client#CHANGE_INFO}, {@link Client#CHANGE_NAME} - * {@link Client#CHANGE_DEBUGGER_STATUS}, {@link Client#CHANGE_THREAD_MODE}, - * {@link Client#CHANGE_THREAD_DATA}, {@link Client#CHANGE_HEAP_MODE}, - * {@link Client#CHANGE_HEAP_DATA}, {@link Client#CHANGE_NATIVE_HEAP_DATA} - * - * @see IClientChangeListener#clientChanged(Client, int) - */ - @Override - public void clientChanged(final Client client, int changeMask) { - if (client == getCurrentClient()) { - if ((changeMask & Client.CHANGE_HEAP_ALLOCATIONS) != 0) { - try { - mAllocationTable.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - mAllocationViewer.refresh(); - updateAllocationStackCall(); - } - }); - } catch (SWTException e) { - // widget is disposed, we do nothing - } - } else if ((changeMask & Client.CHANGE_HEAP_ALLOCATION_STATUS) != 0) { - try { - mAllocationTable.getDisplay().asyncExec(new Runnable() { - @Override - public void run() { - setUpButtons(true, client.getClientData().getAllocationStatus()); - } - }); - } catch (SWTException e) { - // widget is disposed, we do nothing - } - } - } - } - - /** - * Sent when a new device is selected. The new device can be accessed - * with {@link #getCurrentDevice()}. - */ - @Override - public void deviceSelected() { - // pass - } - - /** - * Sent when a new client is selected. The new client can be accessed - * with {@link #getCurrentClient()}. - */ - @Override - public void clientSelected() { - if (mAllocationTable.isDisposed()) { - return; - } - - Client client = getCurrentClient(); - - mStackTracePanel.setCurrentClient(client); - mStackTracePanel.setViewerInput(null); // always empty on client selection change. - - if (client != null) { - setUpButtons(true /* enabled */, client.getClientData().getAllocationStatus()); - } else { - setUpButtons(false /* enabled */, AllocationTrackingStatus.OFF); - } - - mAllocationViewer.setInput(client); - } - - /** - * Updates the stack call of the currently selected thread. - * <p/> - * This <b>must</b> be called from the UI thread. - */ - private void updateAllocationStackCall() { - Client client = getCurrentClient(); - if (client != null) { - // get the current selection in the ThreadTable - AllocationInfo selectedAlloc = getAllocationSelection(null); - - if (selectedAlloc != null) { - updateAllocationStackTrace(selectedAlloc); - } else { - updateAllocationStackTrace(null); - } - } - } - - /** - * updates the stackcall of the specified allocation. If <code>null</code> the UI is emptied - * of current data. - * @param thread - */ - private void updateAllocationStackTrace(AllocationInfo alloc) { - mStackTracePanel.setViewerInput(alloc); - } - - @Override - protected void setTableFocusListener() { - addTableToFocusListener(mAllocationTable); - addTableToFocusListener(mStackTraceTable); - } - - /** - * Returns the current allocation selection or <code>null</code> if none is found. - * If a {@link ISelection} object is specified, the first {@link AllocationInfo} from this - * selection is returned, otherwise, the <code>ISelection</code> returned by - * {@link TableViewer#getSelection()} is used. - * @param selection the {@link ISelection} to use, or <code>null</code> - */ - private AllocationInfo getAllocationSelection(ISelection selection) { - if (selection == null) { - selection = mAllocationViewer.getSelection(); - } - - if (selection instanceof IStructuredSelection) { - IStructuredSelection structuredSelection = (IStructuredSelection)selection; - Object object = structuredSelection.getFirstElement(); - if (object instanceof AllocationInfo) { - return (AllocationInfo)object; - } - } - - return null; - } - - /** - * - * @param enabled - * @param trackingStatus - */ - private void setUpButtons(boolean enabled, AllocationTrackingStatus trackingStatus) { - if (enabled) { - switch (trackingStatus) { - case UNKNOWN: - mEnableButton.setText("?"); - mEnableButton.setEnabled(false); - mRequestButton.setEnabled(false); - break; - case OFF: - mEnableButton.setText("Start Tracking"); - mEnableButton.setEnabled(true); - mRequestButton.setEnabled(false); - break; - case ON: - mEnableButton.setText("Stop Tracking"); - mEnableButton.setEnabled(true); - mRequestButton.setEnabled(true); - break; - } - } else { - mEnableButton.setEnabled(false); - mRequestButton.setEnabled(false); - mEnableButton.setText("Start Tracking"); - } - } - - private void setSortColumn(final TableColumn column, SortMode sortMode) { - // set the new sort mode - mSorter.setSortMode(sortMode); - - mAllocationTable.setRedraw(false); - - // remove image from previous sort colum - if (mSortColumn != column) { - mSortColumn.setImage(null); - } - - mSortColumn = column; - if (mSorter.isDescending()) { - mSortColumn.setImage(mSortDownImg); - } else { - mSortColumn.setImage(mSortUpImg); - } - - mAllocationTable.setRedraw(true); - mAllocationViewer.refresh(); - } - - private AllocationInfo[] getFilteredAllocations(AllocationInfo[] allocations, - String filterText) { - ArrayList<AllocationInfo> results = new ArrayList<AllocationInfo>(); - // Using default locale here such that the locale-specific c - Locale locale = Locale.getDefault(); - filterText = filterText.toLowerCase(locale); - boolean fullTrace = mTraceFilterCheck.getSelection(); - - for (AllocationInfo info : allocations) { - if (info.filter(filterText, fullTrace, locale)) { - results.add(info); - } - } - - return results.toArray(new AllocationInfo[results.size()]); - } - -} - |