/******************************************************************************* * 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.internal.gprof.Activator; import org.eclipse.linuxtools.internal.gprof.Messages; 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.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; /* error label */ private Label errorLabel; /* validation boolean */ private boolean binaryValid; 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; } @Override protected Control createContents(Composite parent) { Control composite = super.createContents(parent); validateBinary(); return composite; } @Override protected Control createDialogArea(Composite parent) { this.getShell().setText(Messages.OpenGmonDialog_GMON_BINARY_FILE); Composite composite = (Composite) super.createDialogArea(parent); /* first line */ Group c = new Group(composite, SWT.NONE); c.setText(Messages.OpenGmonDialog_BINARY_FILE); c.setToolTipText(Messages.OpenGmonDialog_PLEASE_ENTER_BINARY_FILE_FULL_MSG); 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(Messages.OpenGmonDialog_PLEASE_ENTER_BINARY_FILE_FULL_MSG); 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(new BinaryModifyListener()); Composite cbBin = new Composite(c, SWT.NONE); data = new GridData(GridData.HORIZONTAL_ALIGN_END); cbBin.setLayoutData(data); cbBin.setLayout(new GridLayout(2, true)); Button binBrowseWorkspaceButton = new Button(cbBin, SWT.PUSH); binBrowseWorkspaceButton.setText(Messages.OpenGmonDialog_WORKSPACE); binBrowseWorkspaceButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent sev) { handleBrowseWorkspace(Messages.OpenGmonDialog_OPEN_BINARY_FILE, binText); } }); Button binBrowseFileSystemButton = new Button(cbBin, SWT.PUSH); binBrowseFileSystemButton.setText(Messages.OpenGmonDialog_FILE_SYSTEM); binBrowseFileSystemButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent sev) { handleBrowse(Messages.OpenGmonDialog_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 e) { // do nothing: never occurs } File f = new File(binValue); if (f.exists()) { binaryValid = true; getButton(IDialogConstants.OK_ID).setEnabled(binaryValid); errorLabel.setText(""); //$NON-NLS-1$ } else { binaryValid = false; getButton(IDialogConstants.OK_ID).setEnabled(false); if (!binValue.equals("")) { //$NON-NLS-1$ errorLabel.setText("\"" + binText.getText() + "\" " + Messages.OpenGmonDialog_DOES_NOT_EXIST); //$NON-NLS-1$ //$NON-NLS-2$ } else { errorLabel.setText(Messages.OpenGmonDialog_PLEASE_ENTER_BINARY_FILE); } return; } } private class BinaryModifyListener implements ModifyListener { @Override public void modifyText(ModifyEvent e) { validateBinary(); } } private 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(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() + "}"); //$NON-NLS-1$//$NON-NLS-2$ } } private 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 e) { // 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); } } }