diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java new file mode 100644 index 000000000..64e7dd80d --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.ndk/src/com/android/ide/eclipse/ndk/internal/launch/NdkDebuggerTab.java @@ -0,0 +1,311 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.ide.eclipse.ndk.internal.launch; + +import com.android.ide.eclipse.ndk.internal.NdkHelper; +import com.android.ide.eclipse.ndk.internal.NdkManager; + +import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.DirectoryDialog; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class NdkDebuggerTab extends AbstractLaunchConfigurationTab { + private static String sLastGdbPath; + private static String sLastSolibPath; + + private Text mGdbPathText; + private Text mGdbInitPathText; + private Text mGdbRemotePortText; + + private org.eclipse.swt.widgets.List mSoliblist; + private Button mAddSolibButton; + private Button mDeleteSolibButton; + + /** + * @wbp.parser.entryPoint (Window Builder Entry Point) + */ + @Override + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + setControl(comp); + comp.setLayout(new GridLayout(1, false)); + + Group grpGdb = new Group(comp, SWT.NONE); + grpGdb.setText("Launch Options"); + grpGdb.setLayout(new GridLayout(3, false)); + grpGdb.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + Label lblDebugger = new Label(grpGdb, SWT.NONE); + lblDebugger.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblDebugger.setText("Debugger:"); + + mGdbPathText = new Text(grpGdb, SWT.BORDER); + mGdbPathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + final Button btnBrowseGdb = new Button(grpGdb, SWT.NONE); + btnBrowseGdb.setText("Browse..."); + + Label lblNewLabel = new Label(grpGdb, SWT.NONE); + lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblNewLabel.setText("GDB Command File:"); + + mGdbInitPathText = new Text(grpGdb, SWT.BORDER); + mGdbInitPathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + + final Button btnBrowseGdbInit = new Button(grpGdb, SWT.NONE); + btnBrowseGdbInit.setText("Browse..."); + + SelectionListener browseListener = new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + Shell shell = ((Control) e.getSource()).getShell(); + if (e.getSource() == btnBrowseGdb) { + browseForGdb(shell); + } else { + browseForGdbInit(shell); + } + checkParameters(); + updateLaunchConfigurationDialog(); + } + }; + btnBrowseGdb.addSelectionListener(browseListener); + btnBrowseGdbInit.addSelectionListener(browseListener); + + Label lblPort = new Label(grpGdb, SWT.NONE); + lblPort.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + lblPort.setText("Port:"); + + mGdbRemotePortText = new Text(grpGdb, SWT.BORDER); + GridData gd_text_2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); + gd_text_2.widthHint = 100; + mGdbRemotePortText.setLayoutData(gd_text_2); + + ModifyListener m = new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + checkParameters(); + updateLaunchConfigurationDialog(); + } + }; + mGdbPathText.addModifyListener(m); + mGdbInitPathText.addModifyListener(m); + mGdbRemotePortText.addModifyListener(m); + + Group grpSharedLibraries = new Group(comp, SWT.NONE); + grpSharedLibraries.setText("Shared Libraries"); + grpSharedLibraries.setLayout(new GridLayout(2, false)); + GridData gd_grpSharedLibraries = new GridData(GridData.FILL_BOTH); + gd_grpSharedLibraries.verticalAlignment = SWT.TOP; + gd_grpSharedLibraries.grabExcessVerticalSpace = true; + grpSharedLibraries.setLayoutData(gd_grpSharedLibraries); + + mSoliblist = new org.eclipse.swt.widgets.List(grpSharedLibraries, + SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE); + GridData gd_list = new GridData(GridData.FILL_BOTH); + gd_list.heightHint = 133; + gd_list.grabExcessVerticalSpace = false; + gd_list.verticalSpan = 1; + mSoliblist.setLayoutData(gd_list); + + Composite composite = new Composite(grpSharedLibraries, SWT.NONE); + composite.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); + composite.setLayout(new RowLayout(SWT.VERTICAL)); + + mAddSolibButton = new Button(composite, SWT.NONE); + mAddSolibButton.setText("Add..."); + + mDeleteSolibButton = new Button(composite, SWT.NONE); + mDeleteSolibButton.setText("Remove"); + mDeleteSolibButton.setEnabled(false); + + SelectionListener l = new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + Control c = (Control) e.getSource(); + if (c == mSoliblist) { + // enable delete only if there is a selection + mDeleteSolibButton.setEnabled(mSoliblist.getSelectionCount() > 0); + } else if (c == mAddSolibButton) { + addSolib(c.getShell()); + } else { + // delete current selection + int index = mSoliblist.getSelectionIndex(); + if (index >= 0) { + mSoliblist.remove(index); + } + } + updateLaunchConfigurationDialog(); + } + }; + + mSoliblist.addSelectionListener(l); + mAddSolibButton.addSelectionListener(l); + mDeleteSolibButton.addSelectionListener(l); + } + + private void addSolib(Shell shell) { + DirectoryDialog dd = new DirectoryDialog(shell); + if (sLastSolibPath != null) { + dd.setFilterPath(sLastSolibPath); + } + String solibPath = dd.open(); + + if (solibPath != null) { + mSoliblist.add(solibPath); + sLastSolibPath = new File(solibPath).getParent(); + } + } + + private void browseForGdb(Shell shell) { + if (sLastGdbPath == null) { + sLastGdbPath = NdkManager.getNdkLocation(); + } + + FileDialog fd = new FileDialog(shell); + fd.setFilterPath(sLastGdbPath); + + String gdbPath = fd.open(); + if (gdbPath != null) { + mGdbPathText.setText(gdbPath); + sLastGdbPath = new File(gdbPath).getParent(); + } + } + + private void browseForGdbInit(Shell shell) { + FileDialog fd = new FileDialog(shell); + String gdbInit = fd.open(); + if (gdbInit != null) { + mGdbInitPathText.setText(gdbInit); + } + } + + private void checkParameters() { + // check gdb path + String gdb = mGdbPathText.getText().trim(); + if (!gdb.equals(NdkLaunchConstants.DEFAULT_GDB)) { + File f = new File(gdb); + if (!f.exists() || !f.canExecute()) { + setErrorMessage("Invalid gdb location."); + return; + } + } + + // check gdb init path + String gdbInit = mGdbInitPathText.getText().trim(); + if (!gdbInit.isEmpty()) { + File f = new File(gdbInit); + if (!f.exists() || !f.isFile()) { + setErrorMessage("Invalid gdbinit location."); + return; + } + } + + // port should be a valid integer + String port = mGdbRemotePortText.getText().trim(); + try { + Integer.parseInt(port, 10); + } catch (NumberFormatException e) { + setErrorMessage("Port should be a valid integer"); + return; + } + + // no errors + setErrorMessage(null); + setMessage(null); + } + + @Override + public void setDefaults(ILaunchConfigurationWorkingCopy config) { + NdkHelper.setLaunchConfigDefaults(config); + } + + @Override + public void initializeFrom(ILaunchConfiguration config) { + mGdbPathText.setText(getAttribute(config, NdkLaunchConstants.ATTR_NDK_GDB, + NdkLaunchConstants.DEFAULT_GDB)); + mGdbInitPathText.setText(getAttribute(config, + IGDBLaunchConfigurationConstants.ATTR_GDB_INIT, + NdkLaunchConstants.DEFAULT_GDBINIT)); + mGdbRemotePortText.setText(getAttribute(config, IGDBLaunchConfigurationConstants.ATTR_PORT, + NdkLaunchConstants.DEFAULT_GDB_PORT)); + + List<String> solibs = getAttribute(config, NdkLaunchConstants.ATTR_NDK_SOLIB, + Collections.EMPTY_LIST); + mSoliblist.removeAll(); + for (String s: solibs) { + mSoliblist.add(s); + } + } + + private String getAttribute(ILaunchConfiguration config, String key, String defaultValue) { + try { + return config.getAttribute(key, defaultValue); + } catch (CoreException e) { + return defaultValue; + } + } + + private List<String> getAttribute(ILaunchConfiguration config, String key, + List<String> defaultValue) { + try { + return config.getAttribute(key, defaultValue); + } catch (CoreException e) { + return defaultValue; + } + } + + @Override + public void performApply(ILaunchConfigurationWorkingCopy config) { + config.setAttribute(NdkLaunchConstants.ATTR_NDK_GDB, mGdbPathText.getText().trim()); + config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_GDB_INIT, + mGdbInitPathText.getText().trim()); + config.setAttribute(IGDBLaunchConfigurationConstants.ATTR_PORT, + mGdbRemotePortText.getText().trim()); + config.setAttribute(NdkLaunchConstants.ATTR_NDK_SOLIB, + Arrays.asList(mSoliblist.getItems())); + } + + @Override + public String getName() { + return "Debugger"; + } +} |