/******************************************************************************* * Copyright (c) 2009 Red Hat, Inc. * 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: * Elliott Baron <ebaron@redhat.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.valgrind.launch; import java.io.File; import java.io.FileFilter; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; 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.DirectoryDialog; 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.ISharedImages; import org.eclipse.ui.PlatformUI; public class ValgrindExportWizardPage extends WizardPage { private IPath outputPath; private CheckboxTableViewer viewer; private Text destText; protected ValgrindExportWizardPage(String pageName, String title, ImageDescriptor titleImage) { super(pageName, title, titleImage); } @Override public void createControl(Composite parent) { Composite top = new Composite(parent, SWT.NONE); top.setLayout(new GridLayout()); top.setLayoutData(new GridData(GridData.FILL_BOTH)); IPath logPath = null; // Retrieve location of Valgrind logs from launch configuration ILaunchConfiguration config = getPlugin().getCurrentLaunchConfiguration(); if (config != null && config.exists()) { String strpath; try { strpath = config.getAttribute(LaunchConfigurationConstants.ATTR_INTERNAL_OUTPUT_DIR, (String) null); if (strpath != null) { logPath = Path.fromPortableString(strpath); } } catch (CoreException e) { setErrorMessage(e.getLocalizedMessage()); e.printStackTrace(); } } Label selectFilesLabel = new Label(top, SWT.NONE); selectFilesLabel.setText(Messages.getString("ValgrindExportWizardPage.Viewer_label")); //$NON-NLS-1$ viewer = CheckboxTableViewer.newCheckList(top, SWT.BORDER); viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { return ((File) element).getName(); } @Override public Image getImage(Object element) { return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE); } }); Composite selectAllNoneTop = new Composite(top, SWT.NONE); selectAllNoneTop.setLayout(new GridLayout(2, true)); selectAllNoneTop.setLayoutData(new GridData(SWT.TRAIL, SWT.DEFAULT, false, false)); Button selectAllButton = new Button(selectAllNoneTop, SWT.NONE); selectAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); selectAllButton.setText(Messages.getString("ValgrindExportWizardPage.Select_all")); //$NON-NLS-1$ selectAllButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { viewer.setAllChecked(true); } }); Button deselectAllButton = new Button(selectAllNoneTop, SWT.NONE); deselectAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); deselectAllButton.setText(Messages.getString("ValgrindExportWizardPage.Deselect_all")); //$NON-NLS-1$ deselectAllButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { viewer.setAllChecked(false); } }); createDestinationGroup(top); if (logPath != null) { // List all output files in our output directory from the recent launch File logs[] = logPath.toFile().listFiles((FileFilter) pathname -> pathname.isFile()); viewer.setInput(logs); viewer.setAllChecked(true); } // catch any errors so far setPageComplete(isValid()); setControl(top); } public IPath getOutputPath() { return outputPath; } public File[] getSelectedFiles() { Object[] selected = viewer.getCheckedElements(); File[] files = new File[selected.length]; System.arraycopy(selected, 0, files, 0, selected.length); return files; } private void createDestinationGroup(Composite top) { Group destGroup = new Group(top, SWT.SHADOW_OUT); destGroup.setText(Messages.getString("ValgrindExportWizardPage.Destination_group")); //$NON-NLS-1$ destGroup.setLayout(new GridLayout(2, false)); destGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); destText = new Text(destGroup, SWT.BORDER); destText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); destText.addModifyListener(e -> setPageComplete(isValid())); Button browseButton = new Button(destGroup, SWT.PUSH); browseButton.setText(Messages.getString("ValgrindExportWizardPage.Browse")); //$NON-NLS-1$ browseButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // Prompt for output directory Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); DirectoryDialog dialog = new DirectoryDialog(parent); dialog.setText(Messages.getString("ValgrindLaunchConfigurationDelegate.Select_Destination")); //$NON-NLS-1$ String strpath = dialog.open(); if (strpath != null) { destText.setText(strpath); } } }); } private boolean isValid() { boolean valid = false; int length = -1; setErrorMessage(null); setMessage(null); Object obj = viewer.getInput(); // Check if there are no launch files (either null because directory is missing // or 0 files are found in directory) if (obj instanceof File[]) length = ((File[])obj).length; if (viewer.getInput() == null || length == 0) { setErrorMessage(Messages.getString("ValgrindExportWizardPage.Err_No_Valgrind_run")); //$NON-NLS-1$ } else if (destText.getText().equals("")) { //$NON-NLS-1$ setMessage(Messages.getString("ValgrindExportWizardPage.Msg_Select_destination")); //$NON-NLS-1$ } else { IPath path = Path.fromOSString(destText.getText()); if (!path.toFile().exists()) { setErrorMessage(NLS.bind(Messages.getString("ValgrindExportWizardPage.Err_Dir_not_exist"), path.toOSString())); //$NON-NLS-1$ } else if (!path.toFile().isDirectory()) { setErrorMessage(NLS.bind(Messages.getString("ValgrindExportWizardPage.Err_Not_dir"), path.toOSString())); //$NON-NLS-1$ } else { outputPath = path; valid = true; } } return valid; } private ValgrindLaunchPlugin getPlugin() { return ValgrindLaunchPlugin.getDefault(); } public CheckboxTableViewer getViewer() { return viewer; } public Text getDestText() { return destText; } }