Java tutorial
/******************************************************************************* * Copyright (c) 2005, 2014 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * QNX Software Systems - initial API and implementation * Ken Ryall (Nokia) - bug 178731 * Synopsys, Inc. - ARC GNU Toolchain support *******************************************************************************/ package com.arc.embeddedcdt.gui; import java.io.IOException; import java.util.ArrayList; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IBinaryParser; import org.eclipse.cdt.core.IBinaryParser.IBinaryObject; import org.eclipse.cdt.core.ICDescriptor; import org.eclipse.cdt.core.ICExtensionReference; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.launch.internal.ui.LaunchImages; import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; import org.eclipse.cdt.launch.ui.CLaunchConfigurationTab; import org.eclipse.cdt.launch.ui.ICDTLaunchHelpContextIds; import org.eclipse.cdt.ui.CElementLabelProvider; import org.eclipse.cdt.utils.pty.PTY; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.dialogs.TwoPaneElementSelector; import com.arc.embeddedcdt.proxy.cdt.LaunchMessages; /** * A launch configuration tab that displays and edits project and main type name launch * configuration attributes. * <p> * This class may be instantiated. This class is not intended to be subclassed. * </p> * * @since 2.0 */ public class CMainTab extends CLaunchConfigurationTab { // Project UI widgets protected Label fProjLabel; protected Text fProjText; protected Button fProjButton; // Main class UI widgets protected Label fProgLabel; protected Text fProgText; protected Button fSearchButton; private final boolean fWantsTerminalOption; protected Button fTerminalButton; private final boolean dontCheckProgram; protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ private String filterPlatform = EMPTY_STRING; public static final int WANTS_TERMINAL = 1; public static final int DONT_CHECK_PROGRAM = 2; public CMainTab() { this(0); } public CMainTab(boolean terminalOption) { this(terminalOption ? WANTS_TERMINAL : 0); } public CMainTab(int flags) { fWantsTerminalOption = (flags & WANTS_TERMINAL) != 0; dontCheckProgram = (flags & DONT_CHECK_PROGRAM) != 0; } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); setControl(comp); LaunchUIPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(getControl(), ICDTLaunchHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB); GridLayout topLayout = new GridLayout(); comp.setLayout(topLayout); createVerticalSpacer(comp, 1); createProjectGroup(comp, 1); createExeFileGroup(comp, 1); createVerticalSpacer(comp, 1); if (wantsTerminalOption() /* && ProcessFactory.supportesTerminal() */) { createTerminalOption(comp, 1); } LaunchUIPlugin.setDialogShell(parent.getShell()); } protected void createProjectGroup(Composite parent, int colSpan) { Composite projComp = new Composite(parent, SWT.NONE); GridLayout projLayout = new GridLayout(); projLayout.numColumns = 2; projLayout.marginHeight = 0; projLayout.marginWidth = 0; projComp.setLayout(projLayout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = colSpan; projComp.setLayoutData(gd); fProjLabel = new Label(projComp, SWT.NONE); fProjLabel.setText("Project (optional): "); //$NON-NLS-1$ gd = new GridData(); gd.horizontalSpan = 2; fProjLabel.setLayoutData(gd); fProjText = new Text(projComp, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); fProjText.setLayoutData(gd); fProjText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent evt) { updateLaunchConfigurationDialog(); } }); fProjButton = createPushButton(projComp, LaunchMessages.getString("Launch.common.Browse_1"), null); //$NON-NLS-1$ fProjButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { handleProjectButtonSelected(); updateLaunchConfigurationDialog(); } }); } protected void createExeFileGroup(Composite parent, int colSpan) { Composite mainComp = new Composite(parent, SWT.NONE); GridLayout mainLayout = new GridLayout(); mainLayout.numColumns = 3; mainLayout.marginHeight = 0; mainLayout.marginWidth = 0; mainComp.setLayout(mainLayout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = colSpan; mainComp.setLayoutData(gd); fProgLabel = new Label(mainComp, SWT.NONE); fProgLabel.setText(LaunchMessages.getString("CMainTab.C/C++_Application")); //$NON-NLS-1$ gd = new GridData(); gd.horizontalSpan = 3; fProgLabel.setLayoutData(gd); fProgText = new Text(mainComp, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); fProgText.setLayoutData(gd); fProgText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent evt) { updateLaunchConfigurationDialog(); } }); fSearchButton = createPushButton(mainComp, LaunchMessages.getString("CMainTab.Search..."), null); //$NON-NLS-1$ fSearchButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { handleSearchButtonSelected(); updateLaunchConfigurationDialog(); } }); Button fBrowseForBinaryButton; fBrowseForBinaryButton = createPushButton(mainComp, LaunchMessages.getString("Launch.common.Browse_2"), //$NON-NLS-1$ null); fBrowseForBinaryButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { handleBinaryBrowseButtonSelected(); updateLaunchConfigurationDialog(); } }); } protected boolean wantsTerminalOption() { return fWantsTerminalOption; } protected void createTerminalOption(Composite parent, int colSpan) { Composite mainComp = new Composite(parent, SWT.NONE); GridLayout mainLayout = new GridLayout(); mainLayout.numColumns = 1; mainLayout.marginHeight = 0; mainLayout.marginWidth = 0; mainComp.setLayout(mainLayout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = colSpan; mainComp.setLayoutData(gd); fTerminalButton = createCheckButton(mainComp, LaunchMessages.getString("CMainTab.UseTerminal")); //$NON-NLS-1$ fTerminalButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { updateLaunchConfigurationDialog(); } }); fTerminalButton.setEnabled(PTY.isSupported()); } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ public void initializeFrom(ILaunchConfiguration config) { filterPlatform = getPlatform(config); updateProjectFromConfig(config); updateProgramFromConfig(config); updateTerminalFromConfig(config); } protected void updateTerminalFromConfig(ILaunchConfiguration config) { if (fTerminalButton != null) { boolean useTerminal = true; try { useTerminal = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, ICDTLaunchConfigurationConstants.USE_TERMINAL_DEFAULT); } catch (CoreException e) { LaunchUIPlugin.log(e); } fTerminalButton.setSelection(useTerminal); } } protected void updateProjectFromConfig(ILaunchConfiguration config) { String projectName = EMPTY_STRING; try { projectName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); } catch (CoreException ce) { LaunchUIPlugin.log(ce); } fProjText.setText(projectName); } protected void updateProgramFromConfig(ILaunchConfiguration config) { String programName = EMPTY_STRING; try { programName = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, EMPTY_STRING); } catch (CoreException ce) { LaunchUIPlugin.log(ce); } fProgText.setText(programName); } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void performApply(ILaunchConfigurationWorkingCopy config) { ICProject cProject = this.getCProject(); if (cProject != null) { config.setMappedResources(new IResource[] { cProject.getProject() }); try { // Only initialize the build config ID once. if (config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, "") //$NON-NLS-1$ .length() == 0) { ICProjectDescription projDes = CCorePlugin.getDefault() .getProjectDescription(cProject.getProject()); if (projDes != null) { String buildConfigID = projDes.getActiveConfiguration().getId(); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_BUILD_CONFIG_ID, buildConfigID); } } } catch (CoreException e) { e.printStackTrace(); } } config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText()); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, fProgText.getText()); if (fTerminalButton != null) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, fTerminalButton.getSelection()); } } /** * Show a dialog that lists all main types */ protected void handleSearchButtonSelected() { if (getCProject() == null) { MessageDialog.openInformation(getShell(), LaunchMessages.getString("CMainTab.Project_required"), //$NON-NLS-1$ LaunchMessages.getString("CMainTab.Enter_project_before_searching_for_program")); //$NON-NLS-1$ return; } ILabelProvider programLabelProvider = new CElementLabelProvider() { public String getText(Object element) { if (element instanceof IBinary) { IBinary bin = (IBinary) element; StringBuffer name = new StringBuffer(); name.append(bin.getPath().lastSegment()); return name.toString(); } return super.getText(element); } public Image getImage(Object element) { if (!(element instanceof ICElement)) { return super.getImage(element); } ICElement celement = (ICElement) element; if (celement.getElementType() == ICElement.C_BINARY) { IBinary belement = (IBinary) celement; if (belement.isExecutable()) { return DebugUITools.getImage(IDebugUIConstants.IMG_ACT_RUN); } } return super.getImage(element); } }; ILabelProvider qualifierLabelProvider = new CElementLabelProvider() { public String getText(Object element) { if (element instanceof IBinary) { IBinary bin = (IBinary) element; StringBuffer name = new StringBuffer(); name.append(bin.getCPU() + (bin.isLittleEndian() ? "le" : "be")); //$NON-NLS-1$ //$NON-NLS-2$ name.append(" - "); //$NON-NLS-1$ name.append(bin.getPath().toString()); return name.toString(); } return super.getText(element); } }; TwoPaneElementSelector dialog = new TwoPaneElementSelector(getShell(), programLabelProvider, qualifierLabelProvider); dialog.setElements(getBinaryFiles(getCProject())); dialog.setMessage(LaunchMessages.getString("CMainTab.Choose_program_to_run")); //$NON-NLS-1$ dialog.setTitle(LaunchMessages.getString("CMainTab.Program_Selection")); //$NON-NLS-1$ dialog.setUpperListLabel(LaunchMessages.getString("Launch.common.BinariesColon")); //$NON-NLS-1$ dialog.setLowerListLabel(LaunchMessages.getString("Launch.common.QualifierColon")); //$NON-NLS-1$ dialog.setMultipleSelection(false); // dialog.set if (dialog.open() == Window.OK) { IBinary binary = (IBinary) dialog.getFirstResult(); fProgText.setText(binary.getResource().getProjectRelativePath().toString()); } } /** * Show a dialog that lets the user select a project. This in turn provides context for the main * type, allowing the user to key a main type name, or constraining the search for main types to * the specified project. */ protected void handleBinaryBrowseButtonSelected() { FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE); fileDialog.setFileName(fProgText.getText()); String text = fileDialog.open(); if (text != null) { fProgText.setText(text); } } /** * Iterate through and suck up all of the executable files that we can find. */ protected IBinary[] getBinaryFiles(final ICProject cproject) { Display display = null; if (cproject == null || !cproject.exists()) { return null; } if (getShell() == null) { Shell shell = LaunchUIPlugin.getShell(); if (shell != null) display = shell.getDisplay(); } else { display = getShell().getDisplay(); } final Object[] ret = new Object[1]; BusyIndicator.showWhile(display, new Runnable() { public void run() { try { ret[0] = cproject.getBinaryContainer().getBinaries(); } catch (CModelException e) { LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ } } }); return (IBinary[]) ret[0]; } /** * Show a dialog that lets the user select a project. This in turn provides context for the main * type, allowing the user to key a main type name, or constraining the search for main types to * the specified project. */ protected void handleProjectButtonSelected() { ICProject project = chooseCProject(); if (project == null) { return; } String projectName = project.getElementName(); fProjText.setText(projectName); } /** * Realize a C Project selection dialog and return the first selected project, or null if there * was none. */ protected ICProject chooseCProject() { try { ICProject[] projects = getCProjects(); ILabelProvider labelProvider = new CElementLabelProvider(); ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider); dialog.setTitle(LaunchMessages.getString("CMainTab.Project_Selection")); //$NON-NLS-1$ dialog.setMessage(LaunchMessages.getString("CMainTab.Choose_project_to_constrain_search_for_program")); //$NON-NLS-1$ dialog.setElements(projects); ICProject cProject = getCProject(); if (cProject != null) { dialog.setInitialSelections(new Object[] { cProject }); } if (dialog.open() == Window.OK) { return (ICProject) dialog.getFirstResult(); } } catch (CModelException e) { LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ } return null; } /** * Return an array a ICProject whose platform match that of the runtime env. */ protected ICProject[] getCProjects() throws CModelException { ICProject cproject[] = CoreModel.getDefault().getCModel().getCProjects(); ArrayList list = new ArrayList(cproject.length); for (int i = 0; i < cproject.length; i++) { ICDescriptor cdesciptor = null; try { cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject) cproject[i].getResource(), false); if (cdesciptor != null) { String projectPlatform = cdesciptor.getPlatform(); if (filterPlatform.equals("*") //$NON-NLS-1$ || projectPlatform.equals("*") //$NON-NLS-1$ || filterPlatform.equalsIgnoreCase(projectPlatform) == true) { list.add(cproject[i]); } } else { list.add(cproject[i]); } } catch (CoreException e) { list.add(cproject[i]); } } return (ICProject[]) list.toArray(new ICProject[list.size()]); } /** * Return the ICProject corresponding to the project name in the project name text field, or * null if the text does not match a project name. */ protected ICProject getCProject() { String projectName = fProjText.getText().trim(); if (projectName.length() < 1) { return null; } return CoreModel.getDefault().getCModel().getCProject(projectName); } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration) */ public boolean isValid(ILaunchConfiguration config) { setErrorMessage(null); setMessage(null); return true; } /** * @param project * @param exePath * @return * @throws CoreException */ protected boolean isBinary(IProject project, IPath exePath) throws CoreException { ICExtensionReference[] parserRef = CCorePlugin.getDefault().getBinaryParserExtensions(project); for (int i = 0; i < parserRef.length; i++) { try { IBinaryParser parser = (IBinaryParser) parserRef[i].createExtension(); IBinaryObject exe = (IBinaryObject) parser.getBinary(exePath); if (exe != null) { return true; } } catch (ClassCastException e) { } catch (IOException e) { } } IBinaryParser parser = CCorePlugin.getDefault().getDefaultBinaryParser(); try { IBinaryObject exe = (IBinaryObject) parser.getBinary(exePath); return exe != null; } catch (ClassCastException e) { } catch (IOException e) { } return false; } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void setDefaults(ILaunchConfigurationWorkingCopy config) { // We set empty attributes for project & program so that when one config // is // compared to another, the existence of empty attributes doesn't cause // an // incorrect result (the performApply() method can result in empty // values // for these attributes being set on a config if there is nothing in the // corresponding text boxes) // plus getContext will use this to base context from if set. config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); ICElement cElement = null; cElement = getContext(config, getPlatform(config)); if (cElement != null) { initializeCProject(cElement, config); initializeProgramName(cElement, config); } if (wantsTerminalOption()) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, ICDTLaunchConfigurationConstants.USE_TERMINAL_DEFAULT); } } /** * Set the program name attributes on the working copy based on the ICElement */ protected void initializeProgramName(ICElement cElement, ILaunchConfigurationWorkingCopy config) { boolean renamed = false; if (!(cElement instanceof IBinary)) { cElement = cElement.getCProject(); } if (cElement instanceof ICProject) { IProject project = cElement.getCProject().getProject(); String name = project.getName(); ICProjectDescription projDes = CCorePlugin.getDefault().getProjectDescription(project); if (projDes != null) { String buildConfigName = projDes.getActiveConfiguration().getName(); name = name + " " + buildConfigName; //$NON-NLS-1$ } name = getLaunchConfigurationDialog().generateName(name); config.rename(name); renamed = true; } IBinary binary = null; if (cElement instanceof ICProject) { IBinary[] bins = getBinaryFiles((ICProject) cElement); if (bins != null && bins.length == 1) { binary = bins[0]; } } else if (cElement instanceof IBinary) { binary = (IBinary) cElement; } if (binary != null) { String path; path = binary.getResource().getProjectRelativePath().toOSString(); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, path); if (!renamed) { String name = binary.getElementName(); int index = name.lastIndexOf('.'); if (index > 0) { name = name.substring(0, index); } name = getLaunchConfigurationDialog().generateName(name); config.rename(name); renamed = true; } } if (!renamed) { String name = getLaunchConfigurationDialog().generateName(cElement.getCProject().getElementName()); config.rename(name); } } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ public String getName() { return LaunchMessages.getString("CMainTab.Main"); //$NON-NLS-1$ } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage() */ public Image getImage() { return LaunchImages.get(LaunchImages.IMG_VIEW_MAIN_TAB); } /* * (non-Javadoc) * * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog() */ protected void updateLaunchConfigurationDialog() { super.updateLaunchConfigurationDialog(); } }