/******************************************************************************* * Copyright (c) 2012, 2017 Original authors and others. * 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: * Original authors and others - initial API and implementation * Thanh Liem PHAN (ALL4TEC) <thanhliem.phan@all4tec.net> - Bug 509361 ******************************************************************************/ package org.eclipse.nebula.widgets.nattable.export; import java.io.File; import java.io.OutputStream; import java.io.PrintStream; import org.eclipse.nebula.widgets.nattable.Messages; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; /** * Implementation of IOutputStreamProvider that will open a {@link FileDialog} * on requesting an OutputStream, to let a user specify the location to write a * file. */ public class FileOutputStreamProvider implements IOutputStreamProvider { protected String defaultFileName; protected String[] defaultFilterNames; protected String[] defaultFilterExtensions; protected String currentFileName; /** * @since 1.5 */ protected int extFilterIndex = -1; public FileOutputStreamProvider( String defaultFileName, String[] defaultFilterNames, String[] defaultFilterExtensions) { this.defaultFileName = defaultFileName; this.defaultFilterNames = defaultFilterNames; this.defaultFilterExtensions = defaultFilterExtensions; } /** * Opens a {@link FileDialog} to let a user choose the location to write the * export to, and returns the corresponding {@link PrintStream} to that * file. */ @Override public OutputStream getOutputStream(Shell shell) { FileDialog dialog = new FileDialog(shell, SWT.SAVE); String filterPath; String relativeFileName; int lastIndexOfFileSeparator = this.defaultFileName.lastIndexOf(File.separator); if (lastIndexOfFileSeparator >= 0) { filterPath = this.defaultFileName.substring(0, lastIndexOfFileSeparator); relativeFileName = this.defaultFileName.substring(lastIndexOfFileSeparator + 1); } else { filterPath = "/"; //$NON-NLS-1$ relativeFileName = this.defaultFileName; } dialog.setFilterPath(filterPath); dialog.setOverwrite(true); dialog.setFileName(relativeFileName); dialog.setFilterNames(this.defaultFilterNames); dialog.setFilterExtensions(this.defaultFilterExtensions); this.currentFileName = dialog.open(); // reset the extension filter index each time the FileDialog is opened // to avoid the case that if the dialog is cancelled, the old value // index could be accidentally reused this.extFilterIndex = -1; if (this.currentFileName == null) { return null; } this.extFilterIndex = dialog.getFilterIndex(); try { return new PrintStream(this.currentFileName); } catch (Exception e) { throw new RuntimeException( Messages.getString("FileOutputStreamProvider.errorMessage", this.currentFileName), e); //$NON-NLS-1$ } } @Override public File getResult() { return (this.currentFileName != null) ? new File(this.currentFileName) : null; } /** * Extension filter index is >= 0 if there is a selected one in the file * dialog. Extension filter index is equal -1 if the file dialog is not * opened or no extension is selected. * * @return The extension filter index selected in the {@link FileDialog}. * @since 1.5 */ public int getExtensionFilterIndex() { return this.extFilterIndex; } }