package net.refractions.linecleaner.ui;
import java.io.File;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
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.Label;
import org.eclipse.swt.widgets.Text;
public class OutputSelectionPage extends WizardPage {
protected Text pathText;
private Button browse;
protected OutputSelectionPage() {
super(NAME, TITLE, IMAGE);
}
private static final String NAME = "Output";
private static final String TITLE = "Choose the destination for the output.";
private static final ImageDescriptor IMAGE = null;
private static final String DEFAULT_FILE_NAME = "new.shp";
private GridData createEdgeGridData() {
GridData edgeGridData = new GridData();
edgeGridData.grabExcessHorizontalSpace = false;
edgeGridData.grabExcessVerticalSpace = false;
edgeGridData.horizontalAlignment = SWT.FILL;
edgeGridData.verticalAlignment = SWT.CENTER;
return edgeGridData;
}
private GridData createMiddleGridData() {
GridData middleGridData = new GridData();
middleGridData.grabExcessHorizontalSpace = true;
middleGridData.grabExcessVerticalSpace = false;
middleGridData.horizontalAlignment = SWT.FILL;
middleGridData.verticalAlignment = SWT.CENTER;
return middleGridData;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
GridLayout gridLayout = new GridLayout(3, false);
composite.setLayout(gridLayout);
Label label = new Label(composite, SWT.NONE);
label.setLayoutData(createEdgeGridData());
label.setText("Output file location: ");
label.setToolTipText("This is the location where the final dataset will be saved to.");
pathText = new Text(composite, SWT.BORDER);
pathText.setLayoutData(createMiddleGridData());
pathText.setText(System.getProperty("user.home")+System.getProperty("file.separator")
+ DEFAULT_FILE_NAME);
pathText.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
}
public void mouseDown(MouseEvent e) {
}
public void mouseDoubleClick(MouseEvent e) {
String text = pathText.getText();
int fileNameBegin = text.lastIndexOf(System.getProperty("file.separator"))+1;
int fileNameEnd = text.lastIndexOf(".");
pathText.setSelection(fileNameBegin, fileNameEnd);
}
});
pathText.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
updateButtons();
}
public void keyPressed(KeyEvent e) {
updateButtons();
}
});
pathText.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
updateButtons();
}
public void focusGained(FocusEvent e) {
updateButtons();
}
});
browse = new Button(composite, SWT.PUSH);
browse.setLayoutData(createEdgeGridData());
browse.setText("Browse...");
browse.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(getWizard().getContainer().getShell());
dialog.setMessage("Choose a directory to place the dataset output in.");
String path = dialog.open();
if (path == null) { //Cancel pressed
return;
}
String filename = "";
String previousPath = pathText.getText();
int index = previousPath.lastIndexOf(System.getProperty("file.separator"));
if (index >= 0) {
filename = previousPath.substring(index+1);
}
pathText.setText(path+System.getProperty("file.separator")+filename);
}
public void widgetSelected(SelectionEvent e) {
widgetDefaultSelected(e);
}
});
setControl(composite);
}
@Override
public boolean isPageComplete() {
String filename = pathText.getText();
File file = new File(filename);
boolean result = true;
if (file.isDirectory()) {
setErrorMessage("Target file is a directory.");
result = false;
} else if (file.exists() && !file.canWrite()) {
setErrorMessage("Cannot write to " + filename);
result = false;
} else if (file.exists()) {
setErrorMessage(null);
setMessage("File exists and will be over-written.", IMessageProvider.WARNING);
result = true;
} else {
setErrorMessage(null);
setMessage("File does not exist and will be created.", IMessageProvider.INFORMATION);
result = true;
}
return result;
}
public String getFileNoExtension() {
String text = pathText.getText();
int index = text.lastIndexOf(".");
if (index >= 0) {
return text.substring(0, index);
}
return text;
}
public String getOutputPath() {
String text = pathText.getText();
int index = text.lastIndexOf(System.getProperty("file.separator"));
if (index >= 0) {
return text.substring(0, index);
}
return text;
}
private void updateButtons() {
getWizard().getContainer().updateButtons();
}
}