diff options
Diffstat (limited to 'gprof/org.eclipse.linuxtools.gprof/src/org/eclipse/linuxtools/internal/gprof/dialog/OpenGmonDialog.java')
-rw-r--r-- | gprof/org.eclipse.linuxtools.gprof/src/org/eclipse/linuxtools/internal/gprof/dialog/OpenGmonDialog.java | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/gprof/org.eclipse.linuxtools.gprof/src/org/eclipse/linuxtools/internal/gprof/dialog/OpenGmonDialog.java b/gprof/org.eclipse.linuxtools.gprof/src/org/eclipse/linuxtools/internal/gprof/dialog/OpenGmonDialog.java new file mode 100644 index 0000000000..ad32790d57 --- /dev/null +++ b/gprof/org.eclipse.linuxtools.gprof/src/org/eclipse/linuxtools/internal/gprof/dialog/OpenGmonDialog.java @@ -0,0 +1,252 @@ +/******************************************************************************* + * Copyright (c) 2009 STMicroelectronics. + * 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: + * Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation + *******************************************************************************/ +package org.eclipse.linuxtools.internal.gprof.dialog; + +import java.io.File; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.variables.IStringVariableManager; +import org.eclipse.core.variables.VariablesPlugin; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.linuxtools.gprof.Activator; +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.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.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 org.eclipse.ui.dialogs.ElementTreeSelectionDialog; +import org.eclipse.ui.dialogs.ISelectionStatusValidator; +import org.eclipse.ui.model.WorkbenchContentProvider; +import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.ui.views.navigator.ResourceComparator; + + +/** + * This dialog box is opened when user clicks on a gmon file. + * it alows the user to choose the binary file who produced the gmon file. + * @author Xavier Raynaud <xavier.raynaud@st.com> + * + */ +public class OpenGmonDialog extends Dialog { + + /* Inputs */ + private Text binText; + private String binValue; + + /* buttons */ + private Button binBrowseWorkspaceButton; + private Button binBrowseFileSystemButton; + + /* error label */ + private Label errorLabel; + + /* validation boolean */ + private boolean binaryValid; + + /* internal listener */ + private BinaryModifyListener binModifyListener = new BinaryModifyListener(); + + private final String defaultValue; + private final IPath gmonFile; + + /** + * Constructor + * @param parentShell + * @param binPath the path to a binary file. + */ + public OpenGmonDialog(Shell parentShell, String binPath, IPath gmonFile) { + super(parentShell); + this.gmonFile = gmonFile; + setShellStyle(getShellStyle() | SWT.RESIZE); + this.defaultValue = binPath; + } + + /** + * Gets the Binary file selected by the user + * @return a path to a binary file + */ + public String getBinaryFile() { + return binValue; + } + + + protected Control createContents(Composite parent) { + Control composite = super.createContents(parent); + validateBinary(); + return composite; + } + + protected Control createDialogArea(Composite parent) { + this.getShell().setText("Gmon File Viewer: binary file..."); + Composite composite = (Composite) super.createDialogArea(parent); + + /* first line */ + Group c = new Group(composite, SWT.NONE); + c.setText("Binary File"); + c.setToolTipText("Please enter here the binary file which produced the profile data."); + GridLayout layout = new GridLayout(2,false); + c.setLayout(layout); + GridData data = new GridData(GridData.FILL_BOTH); + c.setLayoutData(data); + + Label binLabel = new Label(c,SWT.NONE); + binLabel.setText("Please enter here the binary file which produced the profile data."); + data = new GridData(); + data.horizontalSpan = 2; + binLabel.setLayoutData(data); + + binText = new Text(c,SWT.BORDER); + binText.setText(this.defaultValue); + data = new GridData(GridData.FILL_HORIZONTAL); + data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH; + binText.setLayoutData(data); + binText.addModifyListener(binModifyListener); + + Composite cbBin = new Composite(c,SWT.NONE); + data = new GridData(GridData.HORIZONTAL_ALIGN_END); + cbBin.setLayoutData(data); + cbBin.setLayout(new GridLayout(2, true)); + binBrowseWorkspaceButton = new Button(cbBin, SWT.PUSH); + binBrowseWorkspaceButton.setText("&Workspace..."); + binBrowseWorkspaceButton.addSelectionListener( + new SelectionAdapter() + { + public void widgetSelected(SelectionEvent sev) + { + handleBrowseWorkspace("Open Binary file...", binText); + } + } + ); + binBrowseFileSystemButton = new Button(cbBin, SWT.PUSH); + binBrowseFileSystemButton.setText("&File System..."); + binBrowseFileSystemButton.addSelectionListener( + new SelectionAdapter() + { + public void widgetSelected(SelectionEvent sev) + { + handleBrowse("Open Binary file...", binText); + } + } + ); + + /* 2sd line */ + errorLabel = new Label(composite,SWT.NONE); + data = new GridData(GridData.FILL_HORIZONTAL); + data.horizontalSpan = 3; + errorLabel.setLayoutData(data); + errorLabel.setForeground(getShell().getDisplay().getSystemColor(SWT.COLOR_RED)); + + c.layout(); + + return composite; + } + + private void validateBinary() { + binValue = binText.getText(); + IStringVariableManager mgr = VariablesPlugin.getDefault().getStringVariableManager(); + try { + binValue = mgr.performStringSubstitution(binValue, false); + } catch (CoreException _) { + // do nothing: never occurs + } + + File f = new File(binValue); + if (f.exists()) { + binaryValid = true; + getButton(IDialogConstants.OK_ID).setEnabled(binaryValid); + errorLabel.setText(""); + } else { + binaryValid = false; + getButton(IDialogConstants.OK_ID).setEnabled(false); + if (!binValue.equals("")) { + errorLabel.setText("\"" + binText.getText() + "\" doesn't exist"); + } else { + errorLabel.setText("Please enter a binary file"); + } + return; + } + } + + private class BinaryModifyListener implements ModifyListener + { + public void modifyText(ModifyEvent e) { + validateBinary(); + } + + } + + protected void handleBrowseWorkspace(String msg, Text text) { + ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); + dialog.setTitle(msg); + dialog.setMessage(msg); + dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); + dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); + dialog.setAllowMultiple(false); + IContainer c = ResourcesPlugin.getWorkspace().getRoot().getContainerForLocation(this.gmonFile); + if (c != null) dialog.setInitialSelection(c.getProject()); + dialog.setValidator(new ISelectionStatusValidator() { + public IStatus validate(Object[] selection) + { + if (selection.length != 1) { + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$ + } + if (!(selection[0] instanceof IFile)) { + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$ + } + return new Status(IStatus.OK, Activator.PLUGIN_ID, 0, "", null); //$NON-NLS-1$ + } + }); + if (dialog.open() == IDialogConstants.OK_ID) { + IResource resource = (IResource) dialog.getFirstResult(); + text.setText("${resource_loc:" + resource.getFullPath() + "}"); + } + } + + + protected void handleBrowse(String msg, Text text) + { + FileDialog dialog = new FileDialog(this.getShell(),SWT.OPEN); + dialog.setText(msg); + String t = text.getText(); + IStringVariableManager mgr = VariablesPlugin.getDefault().getStringVariableManager(); + try { + t = mgr.performStringSubstitution(t, false); + } catch (CoreException _) { + // do nothing: never occurs + } + File f = new File(t); + t = f.getParent(); + if (t == null || t.length() == 0) { + t = this.gmonFile.removeLastSegments(1).toOSString(); + } + dialog.setFilterPath(t); + String s = dialog.open(); + if (s != null) text.setText(s); + } +} |