155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/*
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * you may not use this file except in compliance with the License.
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * You may obtain a copy of the License at
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * See the License for the specific language governing permissions and
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * limitations under the License.
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpackage com.android.ddms;
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmlib.AndroidDebugBridge;
20ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmlib.AndroidDebugBridge.IClientChangeListener;
2155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmlib.Client;
222143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohetimport com.android.ddmlib.ClientData;
238f7e536747d1d4a26c12c147057f49cd22654794Xavier Ducrohetimport com.android.ddmlib.ClientData.IHprofDumpHandler;
248f7e536747d1d4a26c12c147057f49cd22654794Xavier Ducrohetimport com.android.ddmlib.ClientData.MethodProfilingStatus;
25ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmlib.IDevice;
26ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmlib.Log;
278f7e536747d1d4a26c12c147057f49cd22654794Xavier Ducrohetimport com.android.ddmlib.Log.ILogOutput;
288f7e536747d1d4a26c12c147057f49cd22654794Xavier Ducrohetimport com.android.ddmlib.Log.LogLevel;
29ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmlib.SyncException;
30ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmlib.SyncService;
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.AllocationPanel;
32625b7ea2b82c3f4948bb8bae55f631f85e9c04a9Siva Velusamyimport com.android.ddmuilib.DdmUiPreferences;
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.DevicePanel;
34ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmuilib.DevicePanel.IUiSelectionListener;
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.EmulatorControlPanel;
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.HeapPanel;
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.ITableFocusListener;
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.ImageLoader;
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.InfoPanel;
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.NativeHeapPanel;
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.ScreenShotDialog;
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.SysinfoPanel;
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.TablePanel;
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.ThreadPanel;
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.actions.ToolItemAction;
4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.explorer.DeviceExplorer;
47bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohetimport com.android.ddmuilib.handler.BaseFileHandler;
48bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohetimport com.android.ddmuilib.handler.MethodProfilingHandler;
4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.log.event.EventLogPanel;
502ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamyimport com.android.ddmuilib.logcat.LogCatPanel;
5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.logcat.LogColors;
5255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.logcat.LogFilter;
5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.logcat.LogPanel;
5455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.logcat.LogPanel.ILogFilterStorageManager;
55613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkeyimport com.android.ddmuilib.net.NetworkPanel;
569058318f1052d7813e1c4989fdad49735d65b523Raphael Mollimport com.android.menubar.IMenuBarCallback;
579058318f1052d7813e1c4989fdad49735d65b523Raphael Mollimport com.android.menubar.IMenuBarEnhancer;
589058318f1052d7813e1c4989fdad49735d65b523Raphael Mollimport com.android.menubar.IMenuBarEnhancer.MenuBarMode;
599058318f1052d7813e1c4989fdad49735d65b523Raphael Mollimport com.android.menubar.MenuBarEnhancer;
6055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
6155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.dialogs.MessageDialog;
6255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.IPreferenceStore;
6355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.PreferenceStore;
6455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.SWT;
6555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.SWTError;
6655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.SWTException;
6755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.dnd.Clipboard;
6855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ControlEvent;
6955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ControlListener;
7055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.MenuAdapter;
7155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.MenuEvent;
7255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.SelectionAdapter;
7355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.SelectionEvent;
7455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ShellEvent;
7555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ShellListener;
7655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.graphics.Color;
7755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.graphics.Font;
7855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.graphics.FontData;
792143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohetimport org.eclipse.swt.graphics.Image;
8055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.graphics.Rectangle;
8155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.FillLayout;
8255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.FormAttachment;
8355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.FormData;
8455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.FormLayout;
8555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.GridData;
8655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.GridLayout;
8755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Composite;
8855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Display;
8955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Event;
9055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Label;
9155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Listener;
9255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Menu;
9355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.MenuItem;
9455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Sash;
9555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Shell;
9655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.TabFolder;
9755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.TabItem;
9855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.ToolBar;
9955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.ToolItem;
10055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.io.File;
10255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport java.util.ArrayList;
10355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/**
10555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * This acts as the UI builder. This cannot be its own thread since this prevent using AWT in an
10655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * SWT application. So this class mainly builds the ui, and manages communication between the panels
1075542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet * when {@link IDevice} / {@link Client} selection changes.
10855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
109bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohetpublic class UIThread implements IUiSelectionListener, IClientChangeListener {
110a84dcfef93b62171ede7e3743adb04e2ade5b290Raphael    public static final String APP_NAME = "DDMS";
1119058318f1052d7813e1c4989fdad49735d65b523Raphael Moll
11255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
11355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * UI tab panel definitions. The constants here must match up with the array
11455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * indices in mPanels. PANEL_CLIENT_LIST is a "virtual" panel representing
11555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * the client list.
11655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
11755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final int PANEL_CLIENT_LIST = -1;
11855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
11955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final int PANEL_INFO = 0;
12055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final int PANEL_THREAD = 1;
12255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static final int PANEL_HEAP = 2;
12455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12588ee5dd5573f9700f6d5983af524b8eaf82665beSiva Velusamy    private static final int PANEL_NATIVE_HEAP = 3;
12655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final int PANEL_ALLOCATIONS = 4;
12855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final int PANEL_SYSINFO = 5;
13055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
131613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkey    private static final int PANEL_NETWORK = 6;
132613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkey
133613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkey    private static final int PANEL_COUNT = 7;
13455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
13555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /** Content is setup in the constructor */
13655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static TablePanel[] mPanels = new TablePanel[PANEL_COUNT];
13755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
13855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String[] mPanelNames = new String[] {
13988ee5dd5573f9700f6d5983af524b8eaf82665beSiva Velusamy            "Info", "Threads", "VM Heap", "Native Heap",
140613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkey            "Allocation Tracker", "Sysinfo", "Network"
14155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    };
14255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String[] mPanelTips = new String[] {
14455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            "Client information", "Thread status", "VM heap status",
145613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkey            "Native heap status", "Allocation Tracker", "Sysinfo graphs",
146613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkey            "Network usage"
14755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    };
14855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFERENCE_LOGSASH =
15055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "logSashLocation"; //$NON-NLS-1$
15155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFERENCE_SASH =
15255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "sashLocation"; //$NON-NLS-1$
15355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
15455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFS_COL_TIME =
15555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "logcat.time"; //$NON-NLS-1$
15655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFS_COL_LEVEL =
15755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "logcat.level"; //$NON-NLS-1$
15855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFS_COL_PID =
15955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "logcat.pid"; //$NON-NLS-1$
16055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFS_COL_TAG =
16155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "logcat.tag"; //$NON-NLS-1$
16255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFS_COL_MESSAGE =
16355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "logcat.message"; //$NON-NLS-1$
16455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
16555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static final String PREFS_FILTERS = "logcat.filter"; //$NON-NLS-1$
16655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
16755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // singleton instance
16855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private static UIThread mInstance = new UIThread();
16955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
17055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // our display
17155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Display mDisplay;
17255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
17355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // the table we show in the left-hand pane
17455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private DevicePanel mDevicePanel;
17555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1765542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet    private IDevice mCurrentDevice = null;
17755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Client mCurrentClient = null;
17855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
17955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // status line at the bottom of the app window
18055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Label mStatusLine;
18155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
18255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // some toolbar items we need to update
18355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItem mTBShowThreadUpdates;
18455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItem mTBShowHeapUpdates;
18555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItem mTBHalt;
18655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItem mTBCauseGc;
1872143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet    private ToolItem mTBDumpHprof;
188bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet    private ToolItem mTBProfiling;
18955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
19055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final class FilterStorage implements ILogFilterStorageManager {
19155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
192ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
19355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public LogFilter[] getFilterFromStore() {
19455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String filterPrefs = PrefsDialog.getStore().getString(
19555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    PREFS_FILTERS);
19655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
19755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // split in a string per filter
19855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String[] filters = filterPrefs.split("\\|"); //$NON-NLS-1$
19955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
20055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            ArrayList<LogFilter> list =
20155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                new ArrayList<LogFilter>(filters.length);
20255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
20355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            for (String f : filters) {
20455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (f.length() > 0) {
20555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    LogFilter logFilter = new LogFilter();
20655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (logFilter.loadFromString(f)) {
20755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        list.add(logFilter);
20855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
20955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
21055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
21155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
21255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return list.toArray(new LogFilter[list.size()]);
21355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
21455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
215ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
21655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public void saveFilters(LogFilter[] filters) {
21755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            StringBuilder sb = new StringBuilder();
21855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            for (LogFilter f : filters) {
21955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                String filterString = f.toString();
22055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                sb.append(filterString);
22155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                sb.append('|');
22255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
22355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
22455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            PrefsDialog.getStore().setValue(PREFS_FILTERS, sb.toString());
22555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
22655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
227ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
22855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public boolean requiresDefaultFilter() {
22955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return true;
23055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
23155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
23255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
23355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
23481e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy    /**
23581e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy     * Flag to indicate whether to use the old or the new logcat view. This is a
23681e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy     * temporary workaround that will be removed once the new view is complete.
23781e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy     */
2384000b0448ad1edd0aee7882a974bf02c829669caSiva Velusamy    private static final String USE_OLD_LOGCAT_VIEW =
2394000b0448ad1edd0aee7882a974bf02c829669caSiva Velusamy            System.getenv("ANDROID_USE_OLD_LOGCAT_VIEW");
240ec7f13dae12a4b1ddfd3ab8c21550b617b941a40Siva Velusamy    public static boolean useOldLogCatView() {
2414000b0448ad1edd0aee7882a974bf02c829669caSiva Velusamy        return USE_OLD_LOGCAT_VIEW != null;
24281e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy    }
24381e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy
24481e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy    private LogPanel mLogPanel; /* only valid when useOldLogCatView() == true */
2452ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy    private LogCatPanel mLogCatPanel; /* only valid when useOldLogCatView() == false */
24655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
24755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItemAction mCreateFilterAction;
24855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItemAction mDeleteFilterAction;
24955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItemAction mEditFilterAction;
25055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItemAction mExportAction;
25155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItemAction mClearAction;
25255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
25355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private ToolItemAction[] mLogLevelActions;
25455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private String[] mLogLevelIcons = {
25555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            "v.png", //$NON-NLS-1S
25655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            "d.png", //$NON-NLS-1S
25755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            "i.png", //$NON-NLS-1S
25855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            "w.png", //$NON-NLS-1S
25955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            "e.png", //$NON-NLS-1S
26055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    };
26155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
26255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    protected Clipboard mClipboard;
26355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
26455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private MenuItem mCopyMenuItem;
26555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
26655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private MenuItem mSelectAllMenuItem;
26755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
26855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private TableFocusListener mTableListener;
26955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
27055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private DeviceExplorer mExplorer = null;
27155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Shell mExplorerShell = null;
27255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
27355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private EmulatorControlPanel mEmulatorPanel;
2745542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
27555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private EventLogPanel mEventLogPanel;
27655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
277bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet    private Image mTracingStartImage;
278bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
279bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet    private Image mTracingStopImage;
280bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
281e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet    private ImageLoader mDdmUiLibLoader;
282e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet
28355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private class TableFocusListener implements ITableFocusListener {
28455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
28555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        private IFocusedTableActivator mCurrentActivator;
28655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
287ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
28855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public void focusGained(IFocusedTableActivator activator) {
28955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mCurrentActivator = activator;
29055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mCopyMenuItem.isDisposed() == false) {
29155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mCopyMenuItem.setEnabled(true);
29255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mSelectAllMenuItem.setEnabled(true);
29355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
29455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
29555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
296ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
29755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public void focusLost(IFocusedTableActivator activator) {
29855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // if we move from one table to another, it's unclear
29955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // if the old table lose its focus before the new
30055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // one gets the focus, so we need to check.
30155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (activator == mCurrentActivator) {
30255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                activator = null;
30355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mCopyMenuItem.isDisposed() == false) {
30455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mCopyMenuItem.setEnabled(false);
30555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mSelectAllMenuItem.setEnabled(false);
30655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
30755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
30855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
30955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
31055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public void copy(Clipboard clipboard) {
31155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mCurrentActivator != null) {
31255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mCurrentActivator.copy(clipboard);
31355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
31455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
31555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
31655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public void selectAll() {
31755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mCurrentActivator != null) {
31855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mCurrentActivator.selectAll();
31955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
32055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
32155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
32255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
323bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet    /**
324bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet     * Handler for HPROF dumps.
325bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet     * This will always prompt the user to save the HPROF file.
326bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet     */
327bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet    private class HProfHandler extends BaseFileHandler implements IHprofDumpHandler {
3282143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
3292143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        public HProfHandler(Shell parentShell) {
330bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            super(parentShell);
3312143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        }
3322143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
333ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
33444783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet        public void onEndFailure(final Client client, final String message) {
3352143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            mDisplay.asyncExec(new Runnable() {
336ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
3372143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                public void run() {
3382143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    try {
33944783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                        displayErrorFromUiThread(
34044783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                                "Unable to create HPROF file for application '%1$s'\n\n%2$s" +
341bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                                "Check logcat for more information.",
34244783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                                client.getClientData().getClientDescription(),
34344783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                                message != null ? message + "\n\n" : "");
3442143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    } finally {
3452143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        // this will make sure the dump hprof button is re-enabled for the
3462143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        // current selection. as the client is finished dumping an hprof file
3472143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        enableButtons();
3482143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    }
3492143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                }
3502143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            });
3512143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        }
3522143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
353ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
354bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        public void onSuccess(final String remoteFilePath, final Client client) {
3552143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            mDisplay.asyncExec(new Runnable() {
356ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
3572143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                public void run() {
3582143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    final IDevice device = client.getDevice();
3592143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    try {
3602143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        // get the sync service to pull the HPROF file
3612143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        final SyncService sync = client.getDevice().getSyncService();
3622143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        if (sync != null) {
3639db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                            promptAndPull(sync,
364bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                                    client.getClientData().getClientDescription() + ".hprof",
365bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                                    remoteFilePath, "Save HPROF file");
3662143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        } else {
3679db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                            displayErrorFromUiThread(
3689db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                                    "Unable to download HPROF file from device '%1$s'.",
369bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                                    device.getSerialNumber());
3702143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        }
3719db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                    } catch (SyncException e) {
3729db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                        if (e.wasCanceled() == false) {
3739db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                            displayErrorFromUiThread(
3749db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                                    "Unable to download HPROF file from device '%1$s'.\n\n%2$s",
3759db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                                    device.getSerialNumber(), e.getMessage());
3769db3286c710abeb2c9478c2f95657d945a55d176Xavier Ducrohet                        }
3772143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    } catch (Exception e) {
37844783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                        displayErrorFromUiThread("Unable to download HPROF file from device '%1$s'.",
379bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                                device.getSerialNumber());
3802143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
3812143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    } finally {
3822143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        // this will make sure the dump hprof button is re-enabled for the
3832143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        // current selection. as the client is finished dumping an hprof file
3842143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                        enableButtons();
3852143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                    }
3862143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                }
3872143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            });
3882143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        }
3892143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
390ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye        @Override
39144783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet        public void onSuccess(final byte[] data, final Client client) {
39244783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet            mDisplay.asyncExec(new Runnable() {
393ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
39444783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                public void run() {
39544783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                    promptAndSave(client.getClientData().getClientDescription() + ".hprof", data,
39644783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                            "Save HPROF file");
39744783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet                }
39844783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet            });
39944783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet        }
40044783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet
40144783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet        @Override
40244783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet        protected String getDialogTitle() {
40344783788698204a0dc3b311f5b6add970fb40f40Xavier Ducrohet            return "HPROF Error";
4042143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        }
4052143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet    }
40655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
407bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
40855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
40955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Generic constructor.
41055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
41155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private UIThread() {
41255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPanels[PANEL_INFO] = new InfoPanel();
41355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPanels[PANEL_THREAD] = new ThreadPanel();
41455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPanels[PANEL_HEAP] = new HeapPanel();
41555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (PrefsDialog.getStore().getBoolean(PrefsDialog.SHOW_NATIVE_HEAP)) {
4167f11f7bddb3fde2ac44499094c28a923f00873e2Siva Velusamy            if (System.getenv("ANDROID_DDMS_OLD_HEAP_PANEL") != null) {
4177f11f7bddb3fde2ac44499094c28a923f00873e2Siva Velusamy                mPanels[PANEL_NATIVE_HEAP] = new NativeHeapPanel();
4187f11f7bddb3fde2ac44499094c28a923f00873e2Siva Velusamy            } else {
41988ee5dd5573f9700f6d5983af524b8eaf82665beSiva Velusamy                mPanels[PANEL_NATIVE_HEAP] =
42088ee5dd5573f9700f6d5983af524b8eaf82665beSiva Velusamy                        new com.android.ddmuilib.heap.NativeHeapPanel(getStore());
42188ee5dd5573f9700f6d5983af524b8eaf82665beSiva Velusamy            }
42255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
42355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPanels[PANEL_NATIVE_HEAP] = null;
42455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
42555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPanels[PANEL_ALLOCATIONS] = new AllocationPanel();
42655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPanels[PANEL_SYSINFO] = new SysinfoPanel();
427613f55001e7f39590d02227179f6f272ae8ab96fJeff Sharkey        mPanels[PANEL_NETWORK] = new NetworkPanel();
42855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
42955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
43055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
43155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Get singleton instance of the UI thread.
43255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
43355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public static UIThread getInstance() {
43455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return mInstance;
43555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
43655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
43755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
43855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Return the Display. Don't try this unless you're in the UI thread.
43955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
44055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public Display getDisplay() {
44155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return mDisplay;
44255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
44355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
44455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void asyncExec(Runnable r) {
44555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mDisplay != null && mDisplay.isDisposed() == false) {
44655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mDisplay.asyncExec(r);
44755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
44855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
44955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
45055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /** returns the IPreferenceStore */
45155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public IPreferenceStore getStore() {
45255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return PrefsDialog.getStore();
45355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
45455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
45555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
45655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create SWT objects and drive the user interface event loop.
4579058318f1052d7813e1c4989fdad49735d65b523Raphael Moll     * @param ddmsParentLocation location of the folder that contains ddms.
45855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
4590c44ff52ccfbafa1bfa5dbd49be773dd8e922678Xavier Ducrohet    public void runUI(String ddmsParentLocation) {
4609058318f1052d7813e1c4989fdad49735d65b523Raphael Moll        Display.setAppName(APP_NAME);
461bbd4f1dff7c6940bf4439569f19e8705cd2c3818Siva Velusamy        mDisplay = Display.getDefault();
462a84dcfef93b62171ede7e3743adb04e2ade5b290Raphael        final Shell shell = new Shell(mDisplay, SWT.SHELL_TRIM);
46355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
46455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create the image loaders for DDMS and DDMUILIB
465e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mDdmUiLibLoader = ImageLoader.getDdmUiLibLoader();
4665542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
467e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        shell.setImage(ImageLoader.getLoader(this.getClass()).loadImage(mDisplay,
4688f7e536747d1d4a26c12c147057f49cd22654794Xavier Ducrohet                "ddms-128.png", //$NON-NLS-1$
46955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                100, 50, null));
47055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
47155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Log.setLogOutput(new ILogOutput() {
472ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
47355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void printAndPromptLog(final LogLevel logLevel, final String tag,
47455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    final String message) {
47555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Log.printLog(logLevel, tag, message);
47655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // dialog box only run in UI thread..
47755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mDisplay.asyncExec(new Runnable() {
478ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                    @Override
47955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    public void run() {
4809058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                        Shell activeShell = mDisplay.getActiveShell();
48155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (logLevel == LogLevel.ERROR) {
4829058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                            MessageDialog.openError(activeShell, tag, message);
48355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        } else {
4849058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                            MessageDialog.openWarning(activeShell, tag, message);
48555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
48655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
48755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                });
48855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
48955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
490ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
49155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void printLog(LogLevel logLevel, String tag, String message) {
49255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Log.printLog(logLevel, tag, message);
49355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
49455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
49555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4962143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        // set the handler for hprof dump
4972143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        ClientData.setHprofDumpHandler(new HProfHandler(shell));
498bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        ClientData.setMethodProfilingHandler(new MethodProfilingHandler(shell));
4992143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
50055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // [try to] ensure ADB is running
501020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet        // in the new SDK, adb is in the platform-tools, but when run from the command line
502020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet        // in the Android source tree, then adb is next to ddms.
5030c44ff52ccfbafa1bfa5dbd49be773dd8e922678Xavier Ducrohet        String adbLocation;
5040c44ff52ccfbafa1bfa5dbd49be773dd8e922678Xavier Ducrohet        if (ddmsParentLocation != null && ddmsParentLocation.length() != 0) {
505020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet            // check if there's a platform-tools folder
506020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet            File platformTools = new File(new File(ddmsParentLocation).getParent(),
507020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet                    "platform-tools");  //$NON-NLS-1$
508020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet            if (platformTools.isDirectory()) {
509020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet                adbLocation = platformTools.getAbsolutePath() + File.separator + "adb"; //$NON-NLS-1$
510020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet            } else {
511020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet                adbLocation = ddmsParentLocation + File.separator + "adb"; //$NON-NLS-1$
512020a428e1dd0231555e5ef855e3e6eca38e59c48Xavier Ducrohet            }
51355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
51455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            adbLocation = "adb"; //$NON-NLS-1$
51555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
51655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
51755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AndroidDebugBridge.init(true /* debugger support */);
51855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        AndroidDebugBridge.createBridge(adbLocation, true /* forceNewBridge */);
51955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
520bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        // we need to listen to client change to be notified of client status (profiling) change
521bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        AndroidDebugBridge.addClientChangeListener(this);
522bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
52355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.setText("Dalvik Debug Monitor");
52455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        setConfirmClose(shell);
52555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createMenus(shell);
52655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createWidgets(shell);
52755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
52855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.pack();
52955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        setSizeAndPosition(shell);
53055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.open();
53155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
53255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Log.d("ddms", "UI is up");
53355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
53455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        while (!shell.isDisposed()) {
53555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (!mDisplay.readAndDispatch())
53655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mDisplay.sleep();
53755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
53881e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy        if (useOldLogCatView()) {
53981e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy            mLogPanel.stopLogCat(true);
54081e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy        }
54155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
54255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDevicePanel.dispose();
54355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (TablePanel panel : mPanels) {
54455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (panel != null) {
54555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                panel.dispose();
54655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
54755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
54855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
549e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        ImageLoader.dispose();
550e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet
55155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDisplay.dispose();
55255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Log.d("ddms", "UI is down");
55355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
55455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
55555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
55655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Set the size and position of the main window from the preference, and
55755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * setup listeners for control events (resize/move of the window)
55855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
55955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void setSizeAndPosition(final Shell shell) {
56055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.setMinimumSize(400, 200);
56155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
56255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // get the x/y and w/h from the prefs
56355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        PreferenceStore prefs = PrefsDialog.getStore();
56455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int x = prefs.getInt(PrefsDialog.SHELL_X);
56555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int y = prefs.getInt(PrefsDialog.SHELL_Y);
56655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int w = prefs.getInt(PrefsDialog.SHELL_WIDTH);
56755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int h = prefs.getInt(PrefsDialog.SHELL_HEIGHT);
56855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
56955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // check that we're not out of the display area
57055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Rectangle rect = mDisplay.getClientArea();
57155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // first check the width/height
57255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (w > rect.width) {
57355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            w = rect.width;
57455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.SHELL_WIDTH, rect.width);
57555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
57655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (h > rect.height) {
57755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            h = rect.height;
57855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.SHELL_HEIGHT, rect.height);
57955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
58055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // then check x. Make sure the left corner is in the screen
58155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (x < rect.x) {
58255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            x = rect.x;
58355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.SHELL_X, rect.x);
58455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else if (x >= rect.x + rect.width) {
58555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            x = rect.x + rect.width - w;
58655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.SHELL_X, rect.x);
58755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
58855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // then check y. Make sure the left corner is in the screen
58955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (y < rect.y) {
59055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            y = rect.y;
59155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.SHELL_Y, rect.y);
59255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else if (y >= rect.y + rect.height) {
59355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            y = rect.y + rect.height - h;
59455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.SHELL_Y, rect.y);
59555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
59655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
59755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // now we can set the location/size
59855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.setBounds(x, y, w, h);
59955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
60055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add listener for resize/move
60155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.addControlListener(new ControlListener() {
602ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
60355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void controlMoved(ControlEvent e) {
60455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // get the new x/y
6059058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                Rectangle controlBounds = shell.getBounds();
60655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // store in pref file
6079058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                PreferenceStore currentPrefs = PrefsDialog.getStore();
6089058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.SHELL_X, controlBounds.x);
6099058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.SHELL_Y, controlBounds.y);
61055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
61155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
612ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
61355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void controlResized(ControlEvent e) {
61455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // get the new w/h
6159058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                Rectangle controlBounds = shell.getBounds();
61655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // store in pref file
6179058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                PreferenceStore currentPrefs = PrefsDialog.getStore();
6189058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.SHELL_WIDTH, controlBounds.width);
6199058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.SHELL_HEIGHT, controlBounds.height);
62055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
62155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
62255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
62355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
62455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
62555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Set the size and position of the file explorer window from the
62655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * preference, and setup listeners for control events (resize/move of
62755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * the window)
62855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
62955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void setExplorerSizeAndPosition(final Shell shell) {
63055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.setMinimumSize(400, 200);
63155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
63255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // get the x/y and w/h from the prefs
63355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        PreferenceStore prefs = PrefsDialog.getStore();
63455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int x = prefs.getInt(PrefsDialog.EXPLORER_SHELL_X);
63555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int y = prefs.getInt(PrefsDialog.EXPLORER_SHELL_Y);
63655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int w = prefs.getInt(PrefsDialog.EXPLORER_SHELL_WIDTH);
63755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        int h = prefs.getInt(PrefsDialog.EXPLORER_SHELL_HEIGHT);
63855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
63955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // check that we're not out of the display area
64055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Rectangle rect = mDisplay.getClientArea();
64155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // first check the width/height
64255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (w > rect.width) {
64355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            w = rect.width;
64455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.EXPLORER_SHELL_WIDTH, rect.width);
64555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
64655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (h > rect.height) {
64755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            h = rect.height;
64855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.EXPLORER_SHELL_HEIGHT, rect.height);
64955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
65055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // then check x. Make sure the left corner is in the screen
65155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (x < rect.x) {
65255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            x = rect.x;
65355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.EXPLORER_SHELL_X, rect.x);
65455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else if (x >= rect.x + rect.width) {
65555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            x = rect.x + rect.width - w;
65655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.EXPLORER_SHELL_X, rect.x);
65755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
65855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // then check y. Make sure the left corner is in the screen
65955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (y < rect.y) {
66055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            y = rect.y;
66155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.EXPLORER_SHELL_Y, rect.y);
66255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else if (y >= rect.y + rect.height) {
66355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            y = rect.y + rect.height - h;
66455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            prefs.setValue(PrefsDialog.EXPLORER_SHELL_Y, rect.y);
66555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
66655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
66755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // now we can set the location/size
66855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.setBounds(x, y, w, h);
66955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
67055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add listener for resize/move
67155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.addControlListener(new ControlListener() {
672ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
67355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void controlMoved(ControlEvent e) {
67455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // get the new x/y
6759058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                Rectangle controlBounds = shell.getBounds();
67655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // store in pref file
6779058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                PreferenceStore currentPrefs = PrefsDialog.getStore();
6789058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.EXPLORER_SHELL_X, controlBounds.x);
6799058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.EXPLORER_SHELL_Y, controlBounds.y);
68055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
68155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
682ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
68355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void controlResized(ControlEvent e) {
68455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // get the new w/h
6859058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                Rectangle controlBounds = shell.getBounds();
68655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // store in pref file
6879058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                PreferenceStore currentPrefs = PrefsDialog.getStore();
6889058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.EXPLORER_SHELL_WIDTH, controlBounds.width);
6899058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                currentPrefs.setValue(PrefsDialog.EXPLORER_SHELL_HEIGHT, controlBounds.height);
69055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
69155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
69255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
69355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
69455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
6959058318f1052d7813e1c4989fdad49735d65b523Raphael Moll     * Set the confirm-before-close dialog.
69655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
69755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void setConfirmClose(final Shell shell) {
6989058318f1052d7813e1c4989fdad49735d65b523Raphael Moll        // Note: there was some commented out code to display a confirmation box
6999058318f1052d7813e1c4989fdad49735d65b523Raphael Moll        // when closing. The feature seems unnecessary and the code was not being
7009058318f1052d7813e1c4989fdad49735d65b523Raphael Moll        // used, so it has been removed.
70155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
70255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
70355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
70455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create the menu bar and items.
70555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
70655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createMenus(final Shell shell) {
70755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create menu bar
70855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Menu menuBar = new Menu(shell, SWT.BAR);
70955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
71055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create top-level items
71155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        MenuItem fileItem = new MenuItem(menuBar, SWT.CASCADE);
71255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        fileItem.setText("&File");
71355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        MenuItem editItem = new MenuItem(menuBar, SWT.CASCADE);
71455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        editItem.setText("&Edit");
71555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        MenuItem actionItem = new MenuItem(menuBar, SWT.CASCADE);
71655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        actionItem.setText("&Actions");
71755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        MenuItem deviceItem = new MenuItem(menuBar, SWT.CASCADE);
71855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        deviceItem.setText("&Device");
71955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
72055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create top-level menus
72155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Menu fileMenu = new Menu(menuBar);
72255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        fileItem.setMenu(fileMenu);
72355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Menu editMenu = new Menu(menuBar);
72455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        editItem.setMenu(editMenu);
72555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Menu actionMenu = new Menu(menuBar);
72655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        actionItem.setMenu(actionMenu);
72755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Menu deviceMenu = new Menu(menuBar);
72855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        deviceItem.setMenu(deviceMenu);
72955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
73055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        MenuItem item;
73155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
73255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create File menu items
73355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item = new MenuItem(fileMenu, SWT.NONE);
73455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setText("&Static Port Configuration...");
73555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.addSelectionListener(new SelectionAdapter() {
73655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
73755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
73855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                StaticPortConfigDialog dlg = new StaticPortConfigDialog(shell);
73955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg.open();
74055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
74155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
74255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
7439058318f1052d7813e1c4989fdad49735d65b523Raphael Moll        IMenuBarEnhancer enhancer = MenuBarEnhancer.setupMenu(APP_NAME, fileMenu,
7449058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                new IMenuBarCallback() {
745ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
7469058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            public void printError(String format, Object... args) {
7479058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                Log.e("DDMS Menu Bar", String.format(format, args));
7489058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            }
74955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
750ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
7519058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            public void onPreferencesMenuSelected() {
7529058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                PrefsDialog.run(shell);
7539058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            }
7549058318f1052d7813e1c4989fdad49735d65b523Raphael Moll
755ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
7569058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            public void onAboutMenuSelected() {
7579058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                AboutDialog dlg = new AboutDialog(shell);
7589058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                dlg.open();
75955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
76055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
76155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
7629058318f1052d7813e1c4989fdad49735d65b523Raphael Moll        if (enhancer.getMenuBarMode() == MenuBarMode.GENERIC) {
7639058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            new MenuItem(fileMenu, SWT.SEPARATOR);
7649058318f1052d7813e1c4989fdad49735d65b523Raphael Moll
7659058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            item = new MenuItem(fileMenu, SWT.NONE);
7669058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            item.setText("E&xit\tCtrl-Q");
7674f7dbc53dbf6879365e54ffd1f8d13de69fec3acSiva Velusamy            item.setAccelerator('Q' | SWT.MOD1);
7689058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            item.addSelectionListener(new SelectionAdapter() {
7699058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                @Override
7709058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                public void widgetSelected(SelectionEvent e) {
7719058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                    shell.close();
7729058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                }
7739058318f1052d7813e1c4989fdad49735d65b523Raphael Moll            });
7749058318f1052d7813e1c4989fdad49735d65b523Raphael Moll        }
7759058318f1052d7813e1c4989fdad49735d65b523Raphael Moll
77655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create edit menu items
77755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCopyMenuItem = new MenuItem(editMenu, SWT.NONE);
77855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCopyMenuItem.setText("&Copy\tCtrl-C");
7794f7dbc53dbf6879365e54ffd1f8d13de69fec3acSiva Velusamy        mCopyMenuItem.setAccelerator('C' | SWT.MOD1);
78055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCopyMenuItem.addSelectionListener(new SelectionAdapter() {
78155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
78255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
78355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mTableListener.copy(mClipboard);
78455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
78555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
78655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
78755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        new MenuItem(editMenu, SWT.SEPARATOR);
78855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
78955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSelectAllMenuItem = new MenuItem(editMenu, SWT.NONE);
79055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSelectAllMenuItem.setText("Select &All\tCtrl-A");
7914f7dbc53dbf6879365e54ffd1f8d13de69fec3acSiva Velusamy        mSelectAllMenuItem.setAccelerator('A' | SWT.MOD1);
79255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSelectAllMenuItem.addSelectionListener(new SelectionAdapter() {
79355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
79455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
79555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mTableListener.selectAll();
79655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
79755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
79855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
79955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create Action menu items
80055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // TODO: this should come with a confirmation dialog
80155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final MenuItem actionHaltItem = new MenuItem(actionMenu, SWT.NONE);
80255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        actionHaltItem.setText("&Halt VM");
80355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        actionHaltItem.addSelectionListener(new SelectionAdapter() {
80455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
80555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
80655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mDevicePanel.killSelectedClient();
80755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
80855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
80955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
81055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final MenuItem actionCauseGcItem = new MenuItem(actionMenu, SWT.NONE);
81155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        actionCauseGcItem.setText("Cause &GC");
81255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        actionCauseGcItem.addSelectionListener(new SelectionAdapter() {
81355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
81455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
81555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mDevicePanel.forceGcOnSelectedClient();
81655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
81755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
81855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
819ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek        final MenuItem actionResetAdb = new MenuItem(actionMenu, SWT.NONE);
820ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek        actionResetAdb.setText("&Reset adb");
821ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek        actionResetAdb.addSelectionListener(new SelectionAdapter() {
822ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek            @Override
823ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek            public void widgetSelected(SelectionEvent e) {
824ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek                AndroidDebugBridge bridge = AndroidDebugBridge.getBridge();
825ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek                if (bridge != null) {
826ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek                    bridge.restart();
827ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek                }
828ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek            }
829ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek        });
830ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek
83155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // configure Action items based on current state
83255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        actionMenu.addMenuListener(new MenuAdapter() {
83355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
83455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void menuShown(MenuEvent e) {
8354242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                actionHaltItem.setEnabled(mTBHalt.getEnabled() && mCurrentClient != null);
8364242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                actionCauseGcItem.setEnabled(mTBCauseGc.getEnabled() && mCurrentClient != null);
837ff0b9891ab1650c6d06509ad4ae202c77e202cc3Pierre Zurek                actionResetAdb.setEnabled(true);
83855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
83955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
84055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
84155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create Device menu items
8424242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        final MenuItem screenShotItem = new MenuItem(deviceMenu, SWT.NONE);
843af47437d806484ba944338a981965b31d1bd81a6Tor Norbye
844af47437d806484ba944338a981965b31d1bd81a6Tor Norbye        // The \tCtrl-S "keybinding text" here isn't right for the Mac - but
845af47437d806484ba944338a981965b31d1bd81a6Tor Norbye        // it's stripped out and replaced by the proper keyboard accelerator
846af47437d806484ba944338a981965b31d1bd81a6Tor Norbye        // text (e.g. the unicode symbol for the command key + S) anyway
847af47437d806484ba944338a981965b31d1bd81a6Tor Norbye        // so it's fine to leave it there for the other platforms.
8481ec0b6529b371425aea3004e403c4df1dfc55aa6Xavier Ducrohet        screenShotItem.setText("&Screen capture...\tCtrl-S");
8494f7dbc53dbf6879365e54ffd1f8d13de69fec3acSiva Velusamy        screenShotItem.setAccelerator('S' | SWT.MOD1);
8504242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        screenShotItem.addSelectionListener(new SelectionAdapter() {
85155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
85255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
85355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mCurrentDevice != null) {
85455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    ScreenShotDialog dlg = new ScreenShotDialog(shell);
85555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    dlg.open(mCurrentDevice);
85655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
85755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
85855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
85955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
86055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        new MenuItem(deviceMenu, SWT.SEPARATOR);
86155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8624242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        final MenuItem explorerItem = new MenuItem(deviceMenu, SWT.NONE);
8634242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        explorerItem.setText("File Explorer...");
8644242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        explorerItem.addSelectionListener(new SelectionAdapter() {
86555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
86655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
86755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                createFileExplorer();
86855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
86955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
87055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
87155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        new MenuItem(deviceMenu, SWT.SEPARATOR);
87255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8734242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        final MenuItem processItem = new MenuItem(deviceMenu, SWT.NONE);
8744242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        processItem.setText("Show &process status...");
8754242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        processItem.addSelectionListener(new SelectionAdapter() {
87655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
87755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
87855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DeviceCommandDialog dlg;
87955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg = new DeviceCommandDialog("ps -x", "ps-x.txt", shell);
88055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg.open(mCurrentDevice);
88155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
88255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
88355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8844242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        final MenuItem deviceStateItem = new MenuItem(deviceMenu, SWT.NONE);
8854242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        deviceStateItem.setText("Dump &device state...");
8864242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        deviceStateItem.addSelectionListener(new SelectionAdapter() {
88755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
88855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
88955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DeviceCommandDialog dlg;
89055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg = new DeviceCommandDialog("/system/bin/dumpstate /proc/self/fd/0",
89155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        "device-state.txt", shell);
89255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg.open(mCurrentDevice);
89355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
89455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
89555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8964242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        final MenuItem appStateItem = new MenuItem(deviceMenu, SWT.NONE);
8974242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        appStateItem.setText("Dump &app state...");
8984242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        appStateItem.setEnabled(false);
8994242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        appStateItem.addSelectionListener(new SelectionAdapter() {
90055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
90155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
90255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DeviceCommandDialog dlg;
90355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg = new DeviceCommandDialog("dumpsys", "app-state.txt", shell);
90455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg.open(mCurrentDevice);
90555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
90655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
90755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9084242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        final MenuItem radioStateItem = new MenuItem(deviceMenu, SWT.NONE);
9094242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        radioStateItem.setText("Dump &radio state...");
9104242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        radioStateItem.addSelectionListener(new SelectionAdapter() {
91155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
91255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
91355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DeviceCommandDialog dlg;
91455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg = new DeviceCommandDialog(
91555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        "cat /data/logs/radio.4 /data/logs/radio.3"
91655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        + " /data/logs/radio.2 /data/logs/radio.1"
91755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        + " /data/logs/radio",
91855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        "radio-state.txt", shell);
91955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg.open(mCurrentDevice);
92055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
92155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
92255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9234242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        final MenuItem logCatItem = new MenuItem(deviceMenu, SWT.NONE);
9244242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        logCatItem.setText("Run &logcat...");
9254242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        logCatItem.addSelectionListener(new SelectionAdapter() {
92655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
92755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
92855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DeviceCommandDialog dlg;
92955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg = new DeviceCommandDialog("logcat '*:d jdwp:w'", "log.txt",
93055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        shell);
93155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                dlg.open(mCurrentDevice);
93255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
93355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
93455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9354242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        // configure Action items based on current state
9364242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        deviceMenu.addMenuListener(new MenuAdapter() {
9374242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet            @Override
9384242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet            public void menuShown(MenuEvent e) {
9394242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                boolean deviceEnabled = mCurrentDevice != null;
9404242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                screenShotItem.setEnabled(deviceEnabled);
9414242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                explorerItem.setEnabled(deviceEnabled);
9424242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                processItem.setEnabled(deviceEnabled);
9434242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                deviceStateItem.setEnabled(deviceEnabled);
9444242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                appStateItem.setEnabled(deviceEnabled);
9454242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                radioStateItem.setEnabled(deviceEnabled);
9464242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet                logCatItem.setEnabled(deviceEnabled);
9474242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet            }
9484242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet        });
9494242a9e3569ece6a825fb253f0803178359267b2Xavier Ducrohet
95055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // tell the shell to use this menu
95155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.setMenuBar(menuBar);
95255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
95355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
95455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
95555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create the widgets in the main application window. The basic layout is a
95655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * two-panel sash, with a scrolling list of VMs on the left and detailed
95755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * output for a single VM on the right.
95855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
95955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createWidgets(final Shell shell) {
96055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Color darkGray = shell.getDisplay().getSystemColor(SWT.COLOR_DARK_GRAY);
96155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
96255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        /*
96355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         * Create three areas: tool bar, split panels, status line
96455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         */
96555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        shell.setLayout(new GridLayout(1, false));
96655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
96755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // 1. panel area
96855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final Composite panelArea = new Composite(shell, SWT.BORDER);
96955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
97055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // make the panel area absorb all space
97155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        panelArea.setLayoutData(new GridData(GridData.FILL_BOTH));
97255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
97355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // 2. status line.
97455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mStatusLine = new Label(shell, SWT.NONE);
97555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
97655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // make status line extend all the way across
97755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mStatusLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
97855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
97955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mStatusLine.setText("Initializing...");
98055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
98155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        /*
98255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         * Configure the split-panel area.
98355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project         */
98455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final PreferenceStore prefs = PrefsDialog.getStore();
98555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
98655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite topPanel = new Composite(panelArea, SWT.NONE);
98755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final Sash sash = new Sash(panelArea, SWT.HORIZONTAL);
98855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sash.setBackground(darkGray);
98955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite bottomPanel = new Composite(panelArea, SWT.NONE);
99055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
99155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        panelArea.setLayout(new FormLayout());
99255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
99355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createTopPanel(topPanel, darkGray);
99481e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy
9954f7dbc53dbf6879365e54ffd1f8d13de69fec3acSiva Velusamy        mClipboard = new Clipboard(panelArea.getDisplay());
99681e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy        if (useOldLogCatView()) {
99781e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy            createBottomPanel(bottomPanel);
9982ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy        } else {
9992ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy            createLogCatView(bottomPanel);
100081e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy        }
100155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
100255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // form layout data
100355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        FormData data = new FormData();
100455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.top = new FormAttachment(0, 0);
100555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.bottom = new FormAttachment(sash, 0);
100655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.left = new FormAttachment(0, 0);
100755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.right = new FormAttachment(100, 0);
100855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        topPanel.setLayoutData(data);
100955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
101055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final FormData sashData = new FormData();
101155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (prefs != null && prefs.contains(PREFERENCE_LOGSASH)) {
101255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            sashData.top = new FormAttachment(0, prefs.getInt(
101355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    PREFERENCE_LOGSASH));
101455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
101555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            sashData.top = new FormAttachment(50,0); // 50% across
101655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
101755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sashData.left = new FormAttachment(0, 0);
101855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sashData.right = new FormAttachment(100, 0);
101955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sash.setLayoutData(sashData);
102055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
102155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data = new FormData();
102255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.top = new FormAttachment(sash, 0);
102355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.bottom = new FormAttachment(100, 0);
102455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.left = new FormAttachment(0, 0);
102555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.right = new FormAttachment(100, 0);
102655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        bottomPanel.setLayoutData(data);
102755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
102855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // allow resizes, but cap at minPanelWidth
102955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sash.addListener(SWT.Selection, new Listener() {
1030ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
103155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void handleEvent(Event e) {
103255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Rectangle sashRect = sash.getBounds();
103355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Rectangle panelRect = panelArea.getClientArea();
103455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                int bottom = panelRect.height - sashRect.height - 100;
103555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                e.y = Math.max(Math.min(e.y, bottom), 100);
103655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (e.y != sashRect.y) {
103755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    sashData.top = new FormAttachment(0, e.y);
10389058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                    if (prefs != null) {
10399058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                        prefs.setValue(PREFERENCE_LOGSASH, e.y);
10409058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                    }
104155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    panelArea.layout();
104255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
104355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
104455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
104555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
104655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add a global focus listener for all the tables
104755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTableListener = new TableFocusListener();
104855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
104955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // now set up the listener in the various panels
105081e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy        if (useOldLogCatView()) {
105181e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy            mLogPanel.setTableFocusListener(mTableListener);
10524f7dbc53dbf6879365e54ffd1f8d13de69fec3acSiva Velusamy        } else {
10534f7dbc53dbf6879365e54ffd1f8d13de69fec3acSiva Velusamy            mLogCatPanel.setTableFocusListener(mTableListener);
105481e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy        }
105555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mEventLogPanel.setTableFocusListener(mTableListener);
105655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (TablePanel p : mPanels) {
105755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (p != null) {
105855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                p.setTableFocusListener(mTableListener);
105955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
106055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
10615542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
106255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mStatusLine.setText("");
106355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
106455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
106555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
106655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Populate the tool bar.
106755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
106855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createDevicePanelToolBar(ToolBar toolBar) {
106955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Display display = toolBar.getDisplay();
10705542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
107155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add "show heap updates" button
107255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTBShowHeapUpdates = new ToolItem(toolBar, SWT.CHECK);
1073e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mTBShowHeapUpdates.setImage(mDdmUiLibLoader.loadImage(display,
107455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_HEAP, DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
107555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTBShowHeapUpdates.setToolTipText("Show heap updates");
107655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTBShowHeapUpdates.setEnabled(false);
107755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTBShowHeapUpdates.addSelectionListener(new SelectionAdapter() {
107855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
107955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
108055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mCurrentClient != null) {
108155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // boolean status = ((ToolItem)e.item).getSelection();
108255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // invert previous state
108355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    boolean enable = !mCurrentClient.isHeapUpdateEnabled();
108455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mCurrentClient.setHeapUpdateEnabled(enable);
108555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                } else {
108655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    e.doit = false; // this has no effect?
108755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
108855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
108955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
109055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1091bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        // add "dump HPROF" button
1092bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBDumpHprof = new ToolItem(toolBar, SWT.PUSH);
1093bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBDumpHprof.setToolTipText("Dump HPROF file");
1094bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBDumpHprof.setEnabled(false);
1095e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mTBDumpHprof.setImage(mDdmUiLibLoader.loadImage(display,
1096bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                DevicePanel.ICON_HPROF, DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
1097bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBDumpHprof.addSelectionListener(new SelectionAdapter() {
109855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
109955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
1100bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mDevicePanel.dumpHprof();
1101bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1102bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                // this will make sure the dump hprof button is disabled for the current selection
1103bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                // as the client is already dumping an hprof file
1104bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                enableButtons();
110555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
110655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
11075542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
110855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add "cause GC" button
110955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTBCauseGc = new ToolItem(toolBar, SWT.PUSH);
1110bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBCauseGc.setToolTipText("Cause an immediate GC");
111155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTBCauseGc.setEnabled(false);
1112e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mTBCauseGc.setImage(mDdmUiLibLoader.loadImage(display,
111355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_GC, DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
111455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mTBCauseGc.addSelectionListener(new SelectionAdapter() {
111555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
111655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
111755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mDevicePanel.forceGcOnSelectedClient();
111855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
111955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
112055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1121bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        new ToolItem(toolBar, SWT.SEPARATOR);
1122bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1123bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        // add "show thread updates" button
1124bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBShowThreadUpdates = new ToolItem(toolBar, SWT.CHECK);
1125e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mTBShowThreadUpdates.setImage(mDdmUiLibLoader.loadImage(display,
1126bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                DevicePanel.ICON_THREAD, DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
1127bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBShowThreadUpdates.setToolTipText("Show thread updates");
1128bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBShowThreadUpdates.setEnabled(false);
1129bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBShowThreadUpdates.addSelectionListener(new SelectionAdapter() {
11302143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            @Override
11312143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            public void widgetSelected(SelectionEvent e) {
1132bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                if (mCurrentClient != null) {
1133bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    // boolean status = ((ToolItem)e.item).getSelection();
1134bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    // invert previous state
1135bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    boolean enable = !mCurrentClient.isThreadUpdateEnabled();
11362143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
1137bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    mCurrentClient.setThreadUpdateEnabled(enable);
1138bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                } else {
1139bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    e.doit = false; // this has no effect?
1140bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                }
1141bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            }
1142bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        });
1143bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1144bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        // add a start/stop method tracing
1145e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mTracingStartImage = mDdmUiLibLoader.loadImage(display,
1146bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                DevicePanel.ICON_TRACING_START,
1147bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null);
1148e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mTracingStopImage = mDdmUiLibLoader.loadImage(display,
1149bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                DevicePanel.ICON_TRACING_STOP,
1150bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null);
1151bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBProfiling = new ToolItem(toolBar, SWT.PUSH);
1152bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBProfiling.setToolTipText("Start Method Profiling");
1153bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBProfiling.setEnabled(false);
1154bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBProfiling.setImage(mTracingStartImage);
1155bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBProfiling.addSelectionListener(new SelectionAdapter() {
1156bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            @Override
1157bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            public void widgetSelected(SelectionEvent e) {
1158bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mDevicePanel.toggleMethodProfiling();
1159bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            }
1160bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        });
1161bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1162bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        new ToolItem(toolBar, SWT.SEPARATOR);
1163bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1164bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        // add "kill VM" button; need to make this visually distinct from
1165bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        // the status update buttons
1166bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBHalt = new ToolItem(toolBar, SWT.PUSH);
1167bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBHalt.setToolTipText("Halt the target VM");
1168bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBHalt.setEnabled(false);
1169e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mTBHalt.setImage(mDdmUiLibLoader.loadImage(display,
1170bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                DevicePanel.ICON_HALT, DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
1171bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        mTBHalt.addSelectionListener(new SelectionAdapter() {
1172bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            @Override
1173bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            public void widgetSelected(SelectionEvent e) {
1174bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mDevicePanel.killSelectedClient();
11752143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            }
11762143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet        });
11772143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet
117855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project       toolBar.pack();
117955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
118055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
118155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createTopPanel(final Composite comp, Color darkGray) {
118255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final PreferenceStore prefs = PrefsDialog.getStore();
118355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
118455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        comp.setLayout(new FormLayout());
118555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
118655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite leftPanel = new Composite(comp, SWT.NONE);
118755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final Sash sash = new Sash(comp, SWT.VERTICAL);
118855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sash.setBackground(darkGray);
118955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite rightPanel = new Composite(comp, SWT.NONE);
119055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
119155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createLeftPanel(leftPanel);
119255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createRightPanel(rightPanel);
119355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
119455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        FormData data = new FormData();
119555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.top = new FormAttachment(0, 0);
119655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.bottom = new FormAttachment(100, 0);
119755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.left = new FormAttachment(0, 0);
119855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.right = new FormAttachment(sash, 0);
119955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        leftPanel.setLayoutData(data);
120055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
120155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final FormData sashData = new FormData();
120255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sashData.top = new FormAttachment(0, 0);
120355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sashData.bottom = new FormAttachment(100, 0);
120455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (prefs != null && prefs.contains(PREFERENCE_SASH)) {
120555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            sashData.left = new FormAttachment(0, prefs.getInt(
120655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    PREFERENCE_SASH));
120755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
120855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // position the sash 380 from the right instead of x% (done by using
120955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // FormAttachment(x, 0)) in order to keep the sash at the same
121055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // position
121155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // from the left when the window is resized.
121255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // 380px is just enough to display the left table with no horizontal
121355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // scrollbar with the default font.
121455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            sashData.left = new FormAttachment(0, 380);
121555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
121655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sash.setLayoutData(sashData);
121755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
121855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data = new FormData();
121955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.top = new FormAttachment(0, 0);
122055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.bottom = new FormAttachment(100, 0);
122155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.left = new FormAttachment(sash, 0);
122255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        data.right = new FormAttachment(100, 0);
122355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        rightPanel.setLayoutData(data);
122455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
122555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final int minPanelWidth = 60;
122655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
122755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // allow resizes, but cap at minPanelWidth
122855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sash.addListener(SWT.Selection, new Listener() {
1229ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
123055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void handleEvent(Event e) {
123155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Rectangle sashRect = sash.getBounds();
123255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Rectangle panelRect = comp.getClientArea();
123355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                int right = panelRect.width - sashRect.width - minPanelWidth;
123455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                e.x = Math.max(Math.min(e.x, right), minPanelWidth);
123555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (e.x != sashRect.x) {
123655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    sashData.left = new FormAttachment(0, e.x);
12379058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                    if (prefs != null) {
12389058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                        prefs.setValue(PREFERENCE_SASH, e.x);
12399058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                    }
124055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    comp.layout();
124155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
124255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
124355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
124455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
124555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
124655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createBottomPanel(final Composite comp) {
124755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final PreferenceStore prefs = PrefsDialog.getStore();
124855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
124955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create clipboard
125055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Display display = comp.getDisplay();
125155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
125255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        LogColors colors = new LogColors();
125355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
125455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        colors.infoColor = new Color(display, 0, 127, 0);
125555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        colors.debugColor = new Color(display, 0, 0, 127);
125655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        colors.errorColor = new Color(display, 255, 0, 0);
125755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        colors.warningColor = new Color(display, 255, 127, 0);
125855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        colors.verboseColor = new Color(display, 0, 0, 0);
125955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
126055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // set the preferences names
126155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        LogPanel.PREFS_TIME = PREFS_COL_TIME;
126255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        LogPanel.PREFS_LEVEL = PREFS_COL_LEVEL;
126355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        LogPanel.PREFS_PID = PREFS_COL_PID;
126455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        LogPanel.PREFS_TAG = PREFS_COL_TAG;
126555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        LogPanel.PREFS_MESSAGE = PREFS_COL_MESSAGE;
126655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
126755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        comp.setLayout(new GridLayout(1, false));
126855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
126955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolBar toolBar = new ToolBar(comp, SWT.HORIZONTAL);
127055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
127155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCreateFilterAction = new ToolItemAction(toolBar, SWT.PUSH);
127255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCreateFilterAction.item.setToolTipText("Create Filter");
1273e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mCreateFilterAction.item.setImage(mDdmUiLibLoader.loadImage(mDisplay,
127455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "add.png", //$NON-NLS-1$
127555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
127655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCreateFilterAction.item.addSelectionListener(new SelectionAdapter() {
127755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
127855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
127955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mLogPanel.addFilter();
128055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
128155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
128255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
128355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mEditFilterAction = new ToolItemAction(toolBar, SWT.PUSH);
128455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mEditFilterAction.item.setToolTipText("Edit Filter");
1285e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mEditFilterAction.item.setImage(mDdmUiLibLoader.loadImage(mDisplay,
128655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "edit.png", //$NON-NLS-1$
128755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
128855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mEditFilterAction.item.addSelectionListener(new SelectionAdapter() {
128955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
129055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
129155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mLogPanel.editFilter();
129255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
129355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
129455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
129555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDeleteFilterAction = new ToolItemAction(toolBar, SWT.PUSH);
129655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDeleteFilterAction.item.setToolTipText("Delete Filter");
1297e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mDeleteFilterAction.item.setImage(mDdmUiLibLoader.loadImage(mDisplay,
129855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "delete.png", //$NON-NLS-1$
129955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
130055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDeleteFilterAction.item.addSelectionListener(new SelectionAdapter() {
130155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
130255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
130355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mLogPanel.deleteFilter();
130455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
130555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
130655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
130755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
130855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        new ToolItem(toolBar, SWT.SEPARATOR);
130955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
131055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        LogLevel[] levels = LogLevel.values();
131155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLogLevelActions = new ToolItemAction[mLogLevelIcons.length];
131255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (int i = 0 ; i < mLogLevelActions.length; i++) {
131355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String name = levels[i].getStringValue();
131455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            final ToolItemAction newAction = new ToolItemAction(toolBar, SWT.CHECK);
131555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mLogLevelActions[i] = newAction;
131655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            //newAction.item.setText(name);
131755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            newAction.item.addSelectionListener(new SelectionAdapter() {
131855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                @Override
131955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void widgetSelected(SelectionEvent e) {
132055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // disable the other actions and record current index
13219058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                    for (int k = 0 ; k < mLogLevelActions.length; k++) {
13229058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                        ToolItemAction a = mLogLevelActions[k];
132355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (a == newAction) {
132455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            a.setChecked(true);
132555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
132655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // set the log level
13279058318f1052d7813e1c4989fdad49735d65b523Raphael Moll                            mLogPanel.setCurrentFilterLogLevel(k+2);
132855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        } else {
132955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            a.setChecked(false);
133055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
133155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
133255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
133355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
133455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
133555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            newAction.item.setToolTipText(name);
1336e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet            newAction.item.setImage(mDdmUiLibLoader.loadImage(mDisplay,
133755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mLogLevelIcons[i],
133855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
133955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
134055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
134155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        new ToolItem(toolBar, SWT.SEPARATOR);
134255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
134355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mClearAction = new ToolItemAction(toolBar, SWT.PUSH);
134455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mClearAction.item.setToolTipText("Clear Log");
13455542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
1346e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mClearAction.item.setImage(mDdmUiLibLoader.loadImage(mDisplay,
134755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "clear.png", //$NON-NLS-1$
134855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
134955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mClearAction.item.addSelectionListener(new SelectionAdapter() {
135055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
135155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
135255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mLogPanel.clear();
135355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
135455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
135555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
135655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        new ToolItem(toolBar, SWT.SEPARATOR);
135755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
135855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mExportAction = new ToolItemAction(toolBar, SWT.PUSH);
135955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mExportAction.item.setToolTipText("Export Selection As Text...");
1360e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mExportAction.item.setImage(mDdmUiLibLoader.loadImage(mDisplay,
136155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "save.png", //$NON-NLS-1$
136255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
136355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mExportAction.item.addSelectionListener(new SelectionAdapter() {
136455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
136555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
136655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mLogPanel.save();
136755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
136855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
136955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
137055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
137155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        toolBar.pack();
137255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
137355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // now create the log view
1374e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mLogPanel = new LogPanel(colors, new FilterStorage(), LogPanel.FILTER_MANUAL);
137555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
137655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLogPanel.setActions(mDeleteFilterAction, mEditFilterAction, mLogLevelActions);
137755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
137855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String colMode = prefs.getString(PrefsDialog.LOGCAT_COLUMN_MODE);
137955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (PrefsDialog.LOGCAT_COLUMN_MODE_AUTO.equals(colMode)) {
138055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mLogPanel.setColumnMode(LogPanel.COLUMN_MODE_AUTO);
138155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
138255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
138355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String fontStr = PrefsDialog.getStore().getString(PrefsDialog.LOGCAT_FONT);
138455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (fontStr != null) {
138555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            try {
138655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                FontData fdat = new FontData(fontStr);
138755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mLogPanel.setFont(new Font(display, fdat));
138855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } catch (IllegalArgumentException e) {
138955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // Looks like fontStr isn't a valid font representation.
139055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // We do nothing in this case, the logcat view will use the default font.
139155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } catch (SWTError e2) {
139255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // Looks like the Font() constructor failed.
139355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // We do nothing in this case, the logcat view will use the default font.
139455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
139555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
139655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
139755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLogPanel.createPanel(comp);
139855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
139955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // and start the logcat
140055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLogPanel.startLogCat(mCurrentDevice);
140155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
140255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14032ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy    private void createLogCatView(Composite parent) {
1404f35c5c55a2d644a7705637b4ff99aa6417d7577bSiva Velusamy        IPreferenceStore prefStore = DdmUiPreferences.getStore();
1405bfde12592b821ef00973e0eedf663752ca789087Siva Velusamy        mLogCatPanel = new LogCatPanel(prefStore);
14062ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy        mLogCatPanel.createPanel(parent);
14072ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy
14082ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy        if (mCurrentDevice != null) {
14092ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy            mLogCatPanel.deviceSelected(mCurrentDevice);
14102ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy        }
14112ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy    }
14122ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy
141355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
141455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create the contents of the left panel: a table of VMs.
141555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
141655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createLeftPanel(final Composite comp) {
141755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        comp.setLayout(new GridLayout(1, false));
141855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolBar toolBar = new ToolBar(comp, SWT.HORIZONTAL | SWT.RIGHT | SWT.WRAP);
141955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        toolBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
142055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createDevicePanelToolBar(toolBar);
142155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
142255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite c = new Composite(comp, SWT.NONE);
142355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        c.setLayoutData(new GridData(GridData.FILL_BOTH));
142455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1425e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mDevicePanel = new DevicePanel(true /* showPorts */);
142655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDevicePanel.createPanel(c);
142755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
142855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add ourselves to the device panel selection listener
142955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDevicePanel.addSelectionListener(this);
143055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
143155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
143255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /*
143355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create the contents of the right panel: tabs with VM information.
143455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
143555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createRightPanel(final Composite comp) {
143655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TabItem item;
143755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TabFolder tabFolder;
143855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
143955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        comp.setLayout(new FillLayout());
144055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
144155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        tabFolder = new TabFolder(comp, SWT.NONE);
144255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
144355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (int i = 0; i < mPanels.length; i++) {
144455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mPanels[i] != null) {
144555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                item = new TabItem(tabFolder, SWT.NONE);
144655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                item.setText(mPanelNames[i]);
144755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                item.setToolTipText(mPanelTips[i]);
144855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                item.setControl(mPanels[i].createPanel(tabFolder));
144955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
145055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
145155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
145255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add the emulator control panel to the folders.
145355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item = new TabItem(tabFolder, SWT.NONE);
145455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setText("Emulator Control");
145555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setToolTipText("Emulator Control Panel");
1456e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mEmulatorPanel = new EmulatorControlPanel();
145755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setControl(mEmulatorPanel.createPanel(tabFolder));
145855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
145955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // add the event log panel to the folders.
146055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item = new TabItem(tabFolder, SWT.NONE);
146155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setText("Event Log");
146255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setToolTipText("Event Log");
14635542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
146455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create the composite that will hold the toolbar and the event log panel.
146555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite eventLogTopComposite = new Composite(tabFolder, SWT.NONE);
146655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setControl(eventLogTopComposite);
146755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        eventLogTopComposite.setLayout(new GridLayout(1, false));
14685542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
146955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create the toolbar and the actions
147055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolBar toolbar = new ToolBar(eventLogTopComposite, SWT.HORIZONTAL);
147155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        toolbar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
147255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
147355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolItemAction optionsAction = new ToolItemAction(toolbar, SWT.PUSH);
147455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        optionsAction.item.setToolTipText("Opens the options panel");
1475e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        optionsAction.item.setImage(mDdmUiLibLoader.loadImage(comp.getDisplay(),
147655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "edit.png", //$NON-NLS-1$
147755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
147855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
147955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolItemAction clearAction = new ToolItemAction(toolbar, SWT.PUSH);
148055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        clearAction.item.setToolTipText("Clears the event log");
1481e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        clearAction.item.setImage(mDdmUiLibLoader.loadImage(comp.getDisplay(),
148255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "clear.png", //$NON-NLS-1$
148355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
14845542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
148555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        new ToolItem(toolbar, SWT.SEPARATOR);
148655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
148755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolItemAction saveAction = new ToolItemAction(toolbar, SWT.PUSH);
148855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        saveAction.item.setToolTipText("Saves the event log");
1489e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        saveAction.item.setImage(mDdmUiLibLoader.loadImage(comp.getDisplay(),
149055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "save.png", //$NON-NLS-1$
149155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
149255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
149355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolItemAction loadAction = new ToolItemAction(toolbar, SWT.PUSH);
149455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        loadAction.item.setToolTipText("Loads an event log");
1495e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        loadAction.item.setImage(mDdmUiLibLoader.loadImage(comp.getDisplay(),
149655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "load.png", //$NON-NLS-1$
149755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
149855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
149955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        ToolItemAction importBugAction = new ToolItemAction(toolbar, SWT.PUSH);
150055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        importBugAction.item.setToolTipText("Imports a bug report");
1501e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        importBugAction.item.setImage(mDdmUiLibLoader.loadImage(comp.getDisplay(),
150255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "importBug.png", //$NON-NLS-1$
150355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                DevicePanel.ICON_WIDTH, DevicePanel.ICON_WIDTH, null));
150455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
150555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create the event log panel
1506e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        mEventLogPanel = new EventLogPanel();
15075542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
150855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // set the external actions
150955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mEventLogPanel.setActions(optionsAction, clearAction, saveAction, loadAction,
151055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                importBugAction);
151155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
151255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // create the panel
151355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mEventLogPanel.createPanel(eventLogTopComposite);
151455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
151555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
151655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createFileExplorer() {
151755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mExplorer == null) {
151855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorerShell = new Shell(mDisplay);
151955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
152055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // create the ui
152155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorerShell.setLayout(new GridLayout(1, false));
152255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
152355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // toolbar + action
152455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            ToolBar toolBar = new ToolBar(mExplorerShell, SWT.HORIZONTAL);
152555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            toolBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
152655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
152755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            ToolItemAction pullAction = new ToolItemAction(toolBar, SWT.PUSH);
152855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            pullAction.item.setToolTipText("Pull File from Device");
1529e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet            Image image = mDdmUiLibLoader.loadImage("pull.png", mDisplay); //$NON-NLS-1$
15302143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            if (image != null) {
15312143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                pullAction.item.setImage(image);
15322143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            } else {
15332143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                // this is for debugging purpose when the icon is missing
15342143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                pullAction.item.setText("Pull"); //$NON-NLS-1$
15352143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            }
153655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
153755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            ToolItemAction pushAction = new ToolItemAction(toolBar, SWT.PUSH);
153855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            pushAction.item.setToolTipText("Push file onto Device");
1539e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet            image = mDdmUiLibLoader.loadImage("push.png", mDisplay); //$NON-NLS-1$
15402143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            if (image != null) {
15412143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                pushAction.item.setImage(image);
15422143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            } else {
15432143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                // this is for debugging purpose when the icon is missing
15442143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                pushAction.item.setText("Push"); //$NON-NLS-1$
15452143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            }
154655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
154755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            ToolItemAction deleteAction = new ToolItemAction(toolBar, SWT.PUSH);
154855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            deleteAction.item.setToolTipText("Delete");
1549e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet            image = mDdmUiLibLoader.loadImage("delete.png", mDisplay); //$NON-NLS-1$
15502143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            if (image != null) {
15512143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                deleteAction.item.setImage(image);
15522143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            } else {
15532143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                // this is for debugging purpose when the icon is missing
15542143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet                deleteAction.item.setText("Delete"); //$NON-NLS-1$
15552143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            }
155655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
15579fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            ToolItemAction createNewFolderAction = new ToolItemAction(toolBar, SWT.PUSH);
15589fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            createNewFolderAction.item.setToolTipText("New Folder");
15599fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            image = mDdmUiLibLoader.loadImage("add.png", mDisplay); //$NON-NLS-1$
15609fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            if (image != null) {
15619fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek                createNewFolderAction.item.setImage(image);
15629fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            } else {
15639fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek                // this is for debugging purpose when the icon is missing
15649fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek                createNewFolderAction.item.setText("New Folder"); //$NON-NLS-1$
15659fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            }
15669fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek
156755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // device explorer
156855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorer = new DeviceExplorer();
15699fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            mExplorer.setActions(pushAction, pullAction, deleteAction, createNewFolderAction);
157055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
157155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            pullAction.item.addSelectionListener(new SelectionAdapter() {
157255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                @Override
157355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void widgetSelected(SelectionEvent e) {
157455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mExplorer.pullSelection();
157555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
157655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
157755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            pullAction.setEnabled(false);
157855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
157955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            pushAction.item.addSelectionListener(new SelectionAdapter() {
158055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                @Override
158155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void widgetSelected(SelectionEvent e) {
158255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mExplorer.pushIntoSelection();
158355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
158455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
158555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            pushAction.setEnabled(false);
158655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
158755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            deleteAction.item.addSelectionListener(new SelectionAdapter() {
158855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                @Override
158955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void widgetSelected(SelectionEvent e) {
159055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mExplorer.deleteSelection();
159155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
159255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
159355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            deleteAction.setEnabled(false);
159455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
15959fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            createNewFolderAction.item.addSelectionListener(new SelectionAdapter() {
15969fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek                @Override
15979fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek                public void widgetSelected(SelectionEvent e) {
15989fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek                    mExplorer.createNewFolderInSelection();
15999fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek                }
16009fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            });
16019fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek            createNewFolderAction.setEnabled(false);
16029fd1167924dca792834cade14772e2be5a55b3d5Pierre Zurek
160355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            Composite parent = new Composite(mExplorerShell, SWT.NONE);
160455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            parent.setLayoutData(new GridData(GridData.FILL_BOTH));
160555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
160655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorer.createPanel(parent);
160755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorer.switchDevice(mCurrentDevice);
160855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
160955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorerShell.addShellListener(new ShellListener() {
1610ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
161155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void shellActivated(ShellEvent e) {
161255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // pass
161355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
161455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1615ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
161655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void shellClosed(ShellEvent e) {
161755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mExplorer = null;
161855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mExplorerShell = null;
161955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
162055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1621ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
162255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void shellDeactivated(ShellEvent e) {
162355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // pass
162455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
162555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1626ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
162755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void shellDeiconified(ShellEvent e) {
162855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // pass
162955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
163055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1631ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
163255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void shellIconified(ShellEvent e) {
163355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    // pass
163455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
163555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
163655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
163755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorerShell.pack();
163855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            setExplorerSizeAndPosition(mExplorerShell);
163955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mExplorerShell.open();
164055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
164155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mExplorerShell != null) {
164255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mExplorerShell.forceActive();
164355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
164455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
164555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
164655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
164755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
164855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Set the status line. TODO: make this a stack, so we can safely have
164955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * multiple things trying to set it all at once. Also specify an expiration?
165055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
165155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void setStatusLine(final String str) {
165255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        try {
165355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mDisplay.asyncExec(new Runnable() {
1654ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
165555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void run() {
165655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    doSetStatusLine(str);
165755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
165855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
165955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } catch (SWTException swte) {
166055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (!mDisplay.isDisposed())
166155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                throw swte;
166255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
166355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
166455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
166555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void doSetStatusLine(String str) {
166655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mStatusLine.isDisposed())
166755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
166855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
166955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (!mStatusLine.getText().equals(str)) {
167055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mStatusLine.setText(str);
167155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
167255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // try { Thread.sleep(100); }
167355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // catch (InterruptedException ie) {}
167455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
167555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
167655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
167755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void displayError(final String msg) {
167855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        try {
167955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mDisplay.syncExec(new Runnable() {
1680ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
168155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void run() {
168255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    MessageDialog.openError(mDisplay.getActiveShell(), "Error",
168355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            msg);
168455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
168555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
168655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } catch (SWTException swte) {
168755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (!mDisplay.isDisposed())
168855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                throw swte;
168955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
169055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
169155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
169255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void enableButtons() {
169355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mCurrentClient != null) {
169455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowThreadUpdates.setSelection(mCurrentClient.isThreadUpdateEnabled());
169555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowThreadUpdates.setEnabled(true);
169655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowHeapUpdates.setSelection(mCurrentClient.isHeapUpdateEnabled());
169755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowHeapUpdates.setEnabled(true);
169855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBHalt.setEnabled(true);
169955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBCauseGc.setEnabled(true);
1700bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1701bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            ClientData data = mCurrentClient.getClientData();
1702bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1703bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            if (data.hasFeature(ClientData.FEATURE_HPROF)) {
1704bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBDumpHprof.setEnabled(data.hasPendingHprofDump() == false);
1705bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBDumpHprof.setToolTipText("Dump HPROF file");
1706bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            } else {
1707bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBDumpHprof.setEnabled(false);
1708bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBDumpHprof.setToolTipText("Dump HPROF file (not supported by this VM)");
1709bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            }
1710bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1711bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            if (data.hasFeature(ClientData.FEATURE_PROFILING)) {
1712bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBProfiling.setEnabled(true);
1713bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                if (data.getMethodProfilingStatus() == MethodProfilingStatus.ON) {
1714bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    mTBProfiling.setToolTipText("Stop Method Profiling");
1715bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    mTBProfiling.setImage(mTracingStopImage);
1716bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                } else {
1717bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    mTBProfiling.setToolTipText("Start Method Profiling");
1718bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    mTBProfiling.setImage(mTracingStartImage);
1719bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                }
1720bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            } else {
1721bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBProfiling.setEnabled(false);
1722bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBProfiling.setImage(mTracingStartImage);
1723bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mTBProfiling.setToolTipText("Start Method Profiling (not supported by this VM)");
1724bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            }
172555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } else {
172655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // list is empty, disable these
172755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowThreadUpdates.setSelection(false);
172855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowThreadUpdates.setEnabled(false);
172955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowHeapUpdates.setSelection(false);
173055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBShowHeapUpdates.setEnabled(false);
173155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBHalt.setEnabled(false);
173255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mTBCauseGc.setEnabled(false);
1733bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
17342143c56c55f6ef9439b26070d7139b2c907ca3daXavier Ducrohet            mTBDumpHprof.setEnabled(false);
1735bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            mTBDumpHprof.setToolTipText("Dump HPROF file");
1736bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1737bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            mTBProfiling.setEnabled(false);
1738bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            mTBProfiling.setImage(mTracingStartImage);
1739bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            mTBProfiling.setToolTipText("Start Method Profiling");
174055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
174155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
174255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
174355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
17445542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet     * Sent when a new {@link IDevice} and {@link Client} are selected.
174555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param selectedDevice the selected device. If null, no devices are selected.
174655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param selectedClient The selected client. If null, no clients are selected.
174755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     *
174855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @see IUiSelectionListener
174955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
1750ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye    @Override
17515542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet    public void selectionChanged(IDevice selectedDevice, Client selectedClient) {
175255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mCurrentDevice != selectedDevice) {
175355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mCurrentDevice = selectedDevice;
175455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            for (TablePanel panel : mPanels) {
175555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (panel != null) {
175655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    panel.deviceSelected(mCurrentDevice);
175755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
175855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
175955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
176055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mEmulatorPanel.deviceSelected(mCurrentDevice);
176181e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy            if (useOldLogCatView()) {
176281e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy                mLogPanel.deviceSelected(mCurrentDevice);
17632ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy            } else {
17642ecd3a82201d03a35ab124f466941dce4d4be637Siva Velusamy                mLogCatPanel.deviceSelected(mCurrentDevice);
176581e6255a2998b05465952004b6f4b4c2331270b4Siva Velusamy            }
176655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mEventLogPanel != null) {
176755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mEventLogPanel.deviceSelected(mCurrentDevice);
176855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
176955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
177055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mExplorer != null) {
177155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mExplorer.switchDevice(mCurrentDevice);
177255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
177355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
177455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
177555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mCurrentClient != selectedClient) {
177655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            AndroidDebugBridge.getBridge().setSelectedClient(selectedClient);
177755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mCurrentClient = selectedClient;
177855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            for (TablePanel panel : mPanels) {
177955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (panel != null) {
178055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    panel.clientSelected(mCurrentClient);
178155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
178255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
178355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
178455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            enableButtons();
178555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
178655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
1787bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet
1788ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye    @Override
1789bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet    public void clientChanged(Client client, int changeMask) {
1790bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        if ((changeMask & Client.CHANGE_METHOD_PROFILING_STATUS) ==
1791bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                Client.CHANGE_METHOD_PROFILING_STATUS) {
1792bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            if (mCurrentClient == client) {
1793bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                mDisplay.asyncExec(new Runnable() {
1794ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                    @Override
1795bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    public void run() {
1796bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                        // force refresh of the button enabled state.
1797bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                        enableButtons();
1798bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                    }
1799bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet                });
1800bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet            }
1801bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet        }
1802bcf38645bef192b380f0d338b263aea075cd1aebXavier Ducrohet    }
180355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
1804