debuggercdi/com.nokia.cdt.debug.launch/src/com/nokia/cdt/internal/debug/launch/wizard/MainExecutableSelectionWizardPage.java
Keeping PlatSim internal only.
/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.cdt.internal.debug.launch.wizard;
import com.nokia.cpp.internal.api.utils.core.*;
import com.nokia.cpp.internal.api.utils.ui.BrowseDialogUtils;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
import java.text.MessageFormat;
import java.util.*;
import java.util.List;
public class MainExecutableSelectionWizardPage extends WizardPage {
public interface IPathValidator {
/**
* @param path IPath
* @return Error string or <code>null</code> if is valid
*/
String isValidPath(IPath path);
}
private static final String EMULATOR = "Emulator"; //$NON-NLS-1$
private static final String BROWSE_ITEM = Messages.getString("MainExecutableSelectionWizardPage.BrowseLabel"); //$NON-NLS-1$
private static final String EXE = "exe"; //$NON-NLS-1$
private static final String DLL = "dll"; //$NON-NLS-1$
// the following two arrays need to correspond
private static final String[] FILTER_EXTS = {
"*." + EXE, //$NON-NLS-1$
"*.*" //$NON-NLS-1$
};
private static final String[] FILTER_EXT_NAMES = {
Messages.getString("MainExecutableSelectionWizardPage.ExecutableFilesLabel"), //$NON-NLS-1$
Messages.getString("MainExecutableSelectionWizardPage.AllFilesLabel") //$NON-NLS-1$
};
private ComboViewer viewer;
private Text exePathLabel;
private Button usePathCheck;
private Text pathText;
private boolean isDisposed = false;
private String selectedItem;
private String targetPath;
private Map<String, Pair<IPath, IPath>> displayStringToExeMmpPair;
private List<Pair<IPath, IPath>> unDisplayedDlls;
private IPath emulatorPath;
private boolean asProcessToLaunch;
private boolean useEmulatorByDefault;
private final ISummaryTextItemContainer summaryTextItemContainer;
private IPathValidator pathValidator;
private List<String> input;
private IPath defaultExecutable;
public MainExecutableSelectionWizardPage(List<IPath> mmps, List<IPath> exes,
IPath defaultExecutable, boolean asProcessToLaunch, IPath emulatorPath, boolean emulatorOnly, ISummaryTextItemContainer summaryTextItemContainer) {
super("MainExecutableSelectionWizardPage"); //$NON-NLS-1$
Check.checkArg(summaryTextItemContainer);
this.asProcessToLaunch = asProcessToLaunch;
this.emulatorPath = emulatorPath;
this.useEmulatorByDefault = emulatorOnly;
this.summaryTextItemContainer = summaryTextItemContainer;
this.defaultExecutable = defaultExecutable;
createExesMap(exes, mmps);
setPageComplete(false);
setTitle(getAltString("MainExecutableSelectionWizardPage.Title")); //$NON-NLS-1$
setDescription(getAltString("MainExecutableSelectionWizardPage.Description")); //$NON-NLS-1$
}
private void createExesMap(List<IPath> exes, List<IPath> mmps) {
displayStringToExeMmpPair = new HashMap<String, Pair<IPath, IPath>>();
unDisplayedDlls = new ArrayList<Pair<IPath,IPath>>();
// mmps may be empty if executables project
boolean hasMMPs = !mmps.isEmpty();
for (int i = 0; i < exes.size(); i++) {
IPath exePath = exes.get(i);
Pair<IPath, IPath> pair = new Pair<IPath, IPath>(exePath, hasMMPs ? mmps.get(i) : null);
// if used as process to launch, then only use .exe paths
if (!asProcessToLaunch || EXE.equalsIgnoreCase(exePath.getFileExtension())) {
displayStringToExeMmpPair.put(exePath.lastSegment(), pair);
}
else if (DLL.equalsIgnoreCase(exePath.getFileExtension())) {
unDisplayedDlls.add(pair);
}
}
}
public void dispose() {
isDisposed = true;
getValues();
super.dispose();
}
private void getValues() {
if (selectedItem != null || targetPath != null)
return;
boolean usePath = usePathCheck != null && usePathCheck.getSelection();
if (!usePath) {
ISelection selection = viewer.getSelection();
if (!selection.isEmpty()) {
selectedItem = (String) ((IStructuredSelection) selection).getFirstElement();
}
}
else {
targetPath = pathText.getText();
}
}
/*
* @see IDialogPage#createControl(Composite)
*/
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new GridLayout(1, false));
composite.setLayoutData(new GridData());
final Label exeLabel = new Label(composite, SWT.NONE);
exeLabel.setText(getAltString("MainExecutableSelectionWizardPage.ExeLabel")); //$NON-NLS-1$
exeLabel.setToolTipText(getAltString("MainExecutableSelectionWizardPage.ExeToolTip")); //$NON-NLS-1$
exeLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
exeLabel.setData(".uid", "MainExecutableSelectionWizardPage.exeLabel");
viewer = new ComboViewer(composite, SWT.READ_ONLY);
Combo combo = viewer.getCombo();
combo.setData(".uid", "MainExecutableCombo"); //$NON-NLS-1$ //$NON-NLS-2$
combo.setToolTipText(getAltString("MainExecutableSelectionWizardPage.ExeToolTip")); //$NON-NLS-1$
combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
combo.setVisibleItemCount(20);
combo.setData(".uid", "MainExecutableSelectionWizardPage.combo");
viewer.setContentProvider(new ArrayContentProvider());
viewer.setLabelProvider(new LabelProvider());
viewer.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object o1, Object o2) {
if (o1.equals(EMULATOR) || o2.equals(BROWSE_ITEM))
return -1;
if (o2.equals(EMULATOR) || o1.equals(BROWSE_ITEM))
return 1;
if (!asProcessToLaunch) { // put .exe before any other extension, if not as process to launch
boolean isEXE1 = EXE.equalsIgnoreCase(new Path(o1.toString()).getFileExtension());
boolean isEXE2 = EXE.equalsIgnoreCase(new Path(o2.toString()).getFileExtension());
if (isEXE1 != isEXE2) { // if only one is an exe
return isEXE1 ? -1 : 1; // return -1 if exe path is .exe, 1 otherwise, sorting .exe paths ahead of anything else
}
}
return o1.toString().compareToIgnoreCase(o2.toString());
}
});
input = new ArrayList<String>(displayStringToExeMmpPair.keySet());
if (emulatorPath != null) {
input.add(EMULATOR); //$NON-NLS-1$
input.add(BROWSE_ITEM);
}
if (asProcessToLaunch) {
Label label = new Label(composite, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
label.setText(Messages.getString("MainExecutableSelectionWizardPage.FullPathLabel")); //$NON-NLS-1$
if (emulatorPath == null)
label.setVisible(false);
exePathLabel = new Text(composite, SWT.BORDER | SWT.WRAP | SWT.READ_ONLY);
exePathLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
exePathLabel.setData(".uid", "MainExecutableSelectionWizardPage.exePathLabel");
if (emulatorPath == null) {
exePathLabel.setVisible(false);
usePathCheck = new Button(composite, SWT.CHECK);
usePathCheck.setSelection(false);
usePathCheck.setText(Messages.getString("MainExecutableSelectionWizardPage.UsePathLabel.device")); //$NON-NLS-1$
usePathCheck.setToolTipText(Messages.getString("MainExecutableSelectionWizardPage.UsePathLabel.device.ToolTip")); //$NON-NLS-1$
usePathCheck.setData(".uid", "MainExecutableSelectionWizardPage.usePathCheck");
GridData gd = new GridData(SWT.FILL, SWT.CENTER, false, false);
gd.verticalIndent = 30;
usePathCheck.setLayoutData(gd);
usePathCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (input.isEmpty())
usePathCheck.setSelection(true);
enableControls(usePathCheck.getSelection());
}
});
pathText = new Text(composite, SWT.BORDER);
pathText.setEnabled(false);
pathText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
pathText.setToolTipText(Messages.getString("MainExecutableSelectionWizardPage.UsePathLabel.device.ToolTip")); //$NON-NLS-1$
pathText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validatePage();
}
});
pathText.setData(".uid", "MainExecutableSelectionWizardPage.pathText");
if (input.isEmpty()) {
usePathCheck.setSelection(true);
enableControls(true);
}
}
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
String item = (String) selection.getFirstElement();
if (item.equals(BROWSE_ITEM)) {
FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN);
fileDialog.setText(Messages.getString("MainExecutableSelectionWizardPage.SelectExectuableTitle")); //$NON-NLS-1$
BrowseDialogUtils.initializeFrom(fileDialog, emulatorPath);
fileDialog.setFilterExtensions(FILTER_EXTS);
fileDialog.setFilterNames(FILTER_EXT_NAMES);
String pathstr = fileDialog.open();
if (pathstr != null) {
IPath path = new Path(pathstr);
String displayString = path.lastSegment();
Pair<IPath, IPath> pair = new Pair<IPath, IPath>(path, null);
if (!displayStringToExeMmpPair.values().contains(pair)) {
displayStringToExeMmpPair.put(displayString, pair);
input.add(displayString);
viewer.setInput(input);
}
item = displayString;
}
else {
// just set selection to first item in combo, if user cancels browse
item = viewer.getCombo().getItem(0);
}
viewer.setSelection(new StructuredSelection(item));
}
else {
Pair<IPath, IPath> pair = getSelectedExeMmpPair(item);
exePathLabel.setText(pair.first.toOSString());
exePathLabel.getParent().layout();
}
}
});
}
viewer.setInput(input);
if (!input.isEmpty()) {
int index = (emulatorPath != null && combo.getItemCount() > 1 && !useEmulatorByDefault) ? 1 : 0;
if (index == 1 && defaultExecutable != null)
{
int defaultExeIndex = index = combo.indexOf(defaultExecutable.lastSegment());
if (defaultExeIndex > 0)
index = defaultExeIndex;
}
combo.select(index);
if (exePathLabel != null) {
Pair<IPath, IPath> pair = getSelectedExeMmpPair(combo.getItem(index));
exePathLabel.setText(pair.first.toOSString());
}
}
setControl(composite);
Dialog.applyDialogFont(parent);
validatePage();
}
protected void enableControls(boolean usePath) {
viewer.getCombo().setEnabled(!usePath);
exePathLabel.setEnabled(!usePath);
pathText.setEnabled(usePath);
if (usePath)
pathText.setFocus();
validatePage();
}
public Pair<IPath, IPath> getSelectedExeMmpPair() {
if (!isDisposed) {
getValues();
}
if (selectedItem != null)
return getSelectedExeMmpPair(selectedItem);
else {
Collection<Pair<IPath, IPath>> exeMmpPairs = displayStringToExeMmpPair.values();
if (targetPath != null) {
// see if we can use the selected path - process to launch string
// by checking if the file name matches any of the ones in our list of exes
IPath path = new Path(targetPath);
String filename = path.lastSegment();
for (Pair<IPath, IPath> exeMmpPair : exeMmpPairs) {
IPath exePath = exeMmpPair.first;
if (filename.equalsIgnoreCase(exePath.lastSegment())) {
return exeMmpPair;
}
}
}
// none could be found matching the selected path, so use the first in the list, if not empty
if (!exeMmpPairs.isEmpty())
return exeMmpPairs.iterator().next();
// return something from the undisplayed exes
if (!unDisplayedDlls.isEmpty())
return unDisplayedDlls.get(0);
return new Pair(null, null); // debugging will fail due to no program name
}
}
private Pair<IPath, IPath> getSelectedExeMmpPair(String item) {
if (item.equals(EMULATOR))
return new Pair<IPath, IPath>(emulatorPath, null);
return displayStringToExeMmpPair.get(item);
}
public IPath getProcessToLaunchTargetPath() {
if (!isDisposed) {
getValues();
}
if (targetPath != null)
return new Path(targetPath);
return null;
}
private String getAltString(String key) {
String altKey = key;
if (!asProcessToLaunch)
altKey += "." + "mainExe"; //$NON-NLS-1$ //$NON-NLS-2$
return Messages.getString(altKey);
}
private void validatePage() {
boolean isValid = input != null && !((List) input).isEmpty();
String error = null;
if (usePathCheck != null && usePathCheck.getSelection()) {
if (pathValidator != null) {
error = pathValidator.isValidPath(new Path(pathText.getText()));
isValid = error == null;
}
else if (pathText.getText().length() == 0) {
isValid = false;
}
}
setPageComplete(isValid);
if (isValid)
setErrorMessage(null);
else {
if (error != null)
setErrorMessage(error);
else
setErrorMessage(Messages.getString("MainExecutableSelectionWizardPage.NoExesError")); //$NON-NLS-1$
}
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (!visible) {
boolean usePath = usePathCheck != null && usePathCheck.getSelection();
String executable;
if (usePath)
executable = pathText.getText();
else
executable = getSelectedExeMmpPair().first.lastSegment();
summaryTextItemContainer.putSummaryTextItem("Executable", //$NON-NLS-1$
MessageFormat.format("{0} {1}", new Object[] { //$NON-NLS-1$
getAltString("MainExecutableSelectionWizardPage.ExeLabel"), //$NON-NLS-1$
executable }));
}
}
public void setPathValidator(IPathValidator pathValidator) {
this.pathValidator = pathValidator;
}
@Override
public void performHelp() {
PlatformUI.getWorkbench().getHelpSystem().displayHelp(LaunchWizardHelpIds.WIZARD_BINARY_SELECTION_PAGE);
}
}