/*******************************************************************************
* Copyright (c) 2013 Ericsson
*
* 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:
* Matthew Khouzam - Initial API and implementation
* Marc-Andre Laperle - Remember last selected directory
*******************************************************************************/
package fr.inria.linuxtools.internal.tmf.ui.project.wizards.importtrace;
import java.io.File;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbench;
/**
* <b>Select the directories to scan for traces</b> this page is the second of
* three pages shown. This one selects the files to be scanned.
*
* @author Matthew Khouzam
* @since 2.0
*/
public class ImportTraceWizardSelectDirectoriesPage extends AbstractImportTraceWizardPage {
/**
* ID
*/
public static String ID = "fr.inria.linuxtools.tmf.ui.project.wizards.importtrace.ImportTraceWizardPagePopulate"; //$NON-NLS-1$
private static final String STORE_DIRECTORY_ID = ID + ".STORE_DIRECTORY_ID"; //$NON-NLS-1$
/**
* Constructor. Creates the trace wizard page.
*
* @param name
* The name of the page.
* @param selection
* The current selection
*/
protected ImportTraceWizardSelectDirectoriesPage(String name, IStructuredSelection selection) {
super(name, selection);
}
/**
* Constructor
*
* @param workbench
* The workbench reference.
* @param selection
* The current selection
*/
public ImportTraceWizardSelectDirectoriesPage(IWorkbench workbench, IStructuredSelection selection) {
super(workbench, selection);
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
final Composite control = (Composite) this.getControl();
control.setLayout(new GridLayout(2, false));
control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final Table selectedFiles = new Table(control, SWT.H_SCROLL | SWT.V_SCROLL);
selectedFiles.clearAll();
selectedFiles.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
selectedFiles.setLinesVisible(true);
Composite buttonArea = new Composite(control, SWT.None);
buttonArea.setLayout(new GridLayout());
buttonArea.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
Button addFile = new Button(buttonArea, SWT.PUSH);
addFile.setText(Messages.ImportTraceWizardAddFile);
addFile.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
addFile.addSelectionListener(new AddFileHandler());
addFile.setAlignment(SWT.CENTER);
Button addDirectory = new Button(buttonArea, SWT.PUSH);
addDirectory.setText(Messages.ImportTraceWizardAddDirectory);
addDirectory.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
addDirectory.addSelectionListener(new AddDirectoryHandler());
addDirectory.setAlignment(SWT.CENTER);
Button removeFile = new Button(buttonArea, SWT.PUSH);
removeFile.setText(Messages.ImportTraceWizardRemove);
removeFile.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
removeFile.addSelectionListener(new RemoveFileHandler(selectedFiles));
removeFile.setAlignment(SWT.CENTER);
// int maxSize = Math.max(addFile.getSize().x, Math.max(addDirectory.getSize().x, removeFile.getSize().x));
// int maxHeight = Math.max(addFile.getSize().y, Math.max(addDirectory.getSize().y, removeFile.getSize().y));
// addFile.setSize(maxSize, maxHeight);
// addDirectory.setSize(maxSize, maxHeight);
// removeFile.setSize(maxSize, maxHeight);
this.setTitle(Messages.ImportTraceWizardDirectoryTitle);
}
private void updateButtons() {
BatchImportTraceWizard wiz = getBatchWizard();
updateTable();
wiz.getContainer().updateButtons();
}
private void updateTable() {
final Table selectedFiles = (Table) ((Composite) getControl()).getChildren()[0];
selectedFiles.clearAll();
selectedFiles.setItemCount(0);
for (String s : ((BatchImportTraceWizard) getWizard()).getFileNames()) {
TableItem ti = new TableItem(selectedFiles, SWT.None);
ti.setText(s);
}
}
@Override
public boolean canFlipToNextPage() {
final Table selectedFiles = (Table) ((Composite) getControl()).getChildren()[0];
boolean canLoad = selectedFiles.getItemCount() > 0;
if (canLoad) {
setErrorMessage(null);
} else {
setErrorMessage(Messages.ImportTraceWizardDirectoryHint);
}
return canLoad;
}
private final class AddFileHandler implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new
FileDialog(Display.getCurrent().getActiveShell(), SWT.NONE);
String lastDirectory = getLastSelectedDirectory();
if (lastDirectory != null) {
dialog.setFilterPath(lastDirectory);
}
String fn = dialog.open();
if (null != fn) {
File f = new File(fn);
if (f.exists()) {
getBatchWizard().addFileToScan(fn);
saveSelectedDirectory(f.getParentFile());
}
}
updateButtons();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
}
private final class AddDirectoryHandler implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent e) {
// BUG BUG BUG BUG BUG IN SWT. Cannot read multiple files in a
// fake directory.
// FileDialog dialog = new
// FileDialog(Display.getCurrent().getActiveShell(), SWT.OPEN |
// SWT.MULTI);
// dialog.setFilterPath(".");
// if (null != dialog.open()) {
// for (String fn : dialog.getFileNames()) {
// final String pathname = dialog.getFilterPath() +
// File.separator + fn;
// File f = new File(pathname);
// if (f.exists()) {
// ((BatchImportTraceWizard) getWizard()).addFile(fn, f);
// }
// }
// }
DirectoryDialog dialog = new
DirectoryDialog(Display.getCurrent().getActiveShell(), SWT.NONE);
String lastDirectory = getLastSelectedDirectory();
if (lastDirectory != null) {
dialog.setFilterPath(lastDirectory);
}
String fn = dialog.open();
if (null != fn) {
File f = new File(fn);
if (f.exists()) {
getBatchWizard().addFileToScan(fn);
saveSelectedDirectory(f);
}
}
updateButtons();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
}
private String getLastSelectedDirectory() {
final IDialogSettings settings = getDialogSettings();
if (settings != null) {
final String directory = settings.get(STORE_DIRECTORY_ID);
if (directory != null && !directory.isEmpty()) {
final File file = new File(directory);
if (file.exists()) {
return directory.toString();
}
}
}
return null;
}
private void saveSelectedDirectory(File directory) {
final IDialogSettings settings = getDialogSettings();
if (settings != null && directory != null && directory.exists()) {
settings.put(STORE_DIRECTORY_ID, directory.toString());
}
}
private final class RemoveFileHandler implements SelectionListener {
private final Table selectedFiles;
private RemoveFileHandler(Table selectedFiles) {
this.selectedFiles = selectedFiles;
}
@Override
public void widgetSelected(SelectionEvent e) {
TableItem selectedToRemove[] = selectedFiles.getSelection();
for (TableItem victim : selectedToRemove) {
String victimName = victim.getText();
((BatchImportTraceWizard) getWizard()).removeFile(victimName);
}
updateButtons();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
}
}