package com.tibco.as.spacebar.ui.wizards.transfer;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FileSystemElement;
import org.eclipse.ui.model.AdaptableList;
import com.tibco.as.spacebar.ui.SWTFactory;
import com.tibco.as.spacebar.ui.SpaceBarPlugin;
public class AbstractImportWizardPage extends WizardResourceImportPage {
/**
* Represents a view of the file system, in that we only care about folders
* and files with the proper extension
*
*/
class ImportFileSystemElement extends FileSystemElement {
private boolean populated = false;
public ImportFileSystemElement(String name, FileSystemElement parent,
boolean isDirectory) {
super(name, parent, isDirectory);
}
public void setPopulated() {
populated = true;
}
public boolean isPopulated() {
return populated;
}
public AdaptableList getFiles() {
if (!populated) {
populateElementChildren();
}
return super.getFiles();
}
public AdaptableList getFolders() {
if (!populated) {
populateElementChildren();
}
return super.getFolders();
}
/**
* Populates the children of the specified parent
* <code>FileSystemElement</code>
*
* @param element
* @param folderonly
*/
private void populateElementChildren() {
FileSystemStructureProvider provider = FileSystemStructureProvider.INSTANCE;
List<?> allchildren = provider.getChildren(this
.getFileSystemObject());
File child = null;
ImportFileSystemElement newelement = null;
Iterator<?> iter = allchildren.iterator();
while (iter.hasNext()) {
child = (File) iter.next();
if (child.isFile()) {
Path childpath = new Path(child.getAbsolutePath());
String extension = childpath.getFileExtension();
if (extensions.contains(extension)) {
newelement = new ImportFileSystemElement(
provider.getLabel(child), this,
provider.isFolder(child));
newelement.setFileSystemObject(child);
}
} else {
newelement = new ImportFileSystemElement(
provider.getLabel(child), this,
provider.isFolder(child));
newelement.setFileSystemObject(child);
}
}
setPopulated();
}
}
private static final String EMPTY_STRING = "";
private static final String STORE_SOURCE_NAME = "STORE_SOURCE_NAME";
private Collection<String> extensions;
private Text fFromDirectory = null;
/**
* Constructor
*/
protected AbstractImportWizardPage(String name, String message,
String[] extensions) {
super(name, new StructuredSelection());
this.extensions = Arrays.asList(extensions);
setTitle("Import Spaces");
setMessage(message);
}
@Override
public void createControl(Composite parent) {
Composite comp = SWTFactory.createComposite(parent, 1, 1,
GridData.FILL_BOTH);
createRootDirectoryGroup(comp);
createFileSelectionGroup(comp);
restoreWidgetValues();
setControl(comp);
PlatformUI.getWorkbench().getHelpSystem()
.setHelp(comp, SpaceBarPlugin.ID_PLUGIN + "." + getName());
setPageComplete(false);
}
@Override
protected void restoreWidgetValues() {
IDialogSettings settings = getDialogSettings();
if (settings == null) {
return;
}
String key = getSettingKey(STORE_SOURCE_NAME);
String sourceName = settings.get(key);
if (sourceName == null) {
sourceName = EMPTY_STRING;
}
fFromDirectory.setText(sourceName);
resetSelection(new Path(sourceName));
}
@Override
protected void saveWidgetValues() {
IDialogSettings settings = getDialogSettings();
if (settings == null) {
return;
}
String key = getSettingKey(STORE_SOURCE_NAME);
settings.put(key, fFromDirectory.getText().trim());
}
@Override
protected void updateWidgetEnablements() {
setPageComplete(determinePageCompletion());
}
@Override
protected boolean determinePageCompletion() {
if (fFromDirectory.getText().trim().equals(EMPTY_STRING)) {
setErrorMessage("You must select a root folder");
return false;
}
if (selectionGroup.getCheckedElementCount() < 1) {
setErrorMessage("You must select at least one file to import");
return false;
}
setErrorMessage(null);
setMessage("Import spaces from CSV files");
return true;
}
@Override
protected void createSourceGroup(Composite parent) {
}
/**
* Create the group for creating the root directory
*/
protected void createRootDirectoryGroup(Composite parent) {
Composite comp = SWTFactory.createComposite(parent, parent.getFont(),
3, 1, GridData.FILL_HORIZONTAL, 0, 0);
SWTFactory.createLabel(comp, "From &Directory:", 1);
// source name entry field
fFromDirectory = SWTFactory.createText(comp, SWT.BORDER | SWT.SINGLE
| SWT.READ_ONLY, 1, GridData.FILL_HORIZONTAL
| GridData.GRAB_HORIZONTAL);
// source browse button
Button browse = SWTFactory.createPushButton(comp, "Brows&e...", null);
browse.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dd = new DirectoryDialog(getContainer()
.getShell());
dd.setText("Import Spaces");
String filename = dd.open();
if (filename != null) {
IPath path = new Path(filename);
if (path != null) {
fFromDirectory.setText(path.toString());
resetSelection(path);
setPageComplete(determinePageCompletion());
}
}
}
});
}
/**
* Resets the selection of the tree root element for the viewer
*
* @param path
* the path from the text widget
*/
protected void resetSelection(final IPath path) {
BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
public void run() {
File file = new File(path.toOSString());
ImportFileSystemElement dummyparent = new ImportFileSystemElement(
EMPTY_STRING, null, true);
dummyparent.setPopulated();
ImportFileSystemElement element = new ImportFileSystemElement(
FileSystemStructureProvider.INSTANCE.getLabel(file),
dummyparent, file.isDirectory());
element.setFileSystemObject(file);
element.getFiles();
selectionGroup.setRoot(dummyparent);
}
});
}
@Override
protected ITreeContentProvider getFileProvider() {
return new BaseWorkbenchContentProvider() {
public Object[] getChildren(Object o) {
if (o instanceof ImportFileSystemElement) {
ImportFileSystemElement element = (ImportFileSystemElement) o;
return element.getFiles().getChildren(element);
}
return new Object[0];
}
};
}
@Override
protected ITreeContentProvider getFolderProvider() {
return new BaseWorkbenchContentProvider() {
public Object[] getChildren(Object o) {
if (o instanceof ImportFileSystemElement) {
ImportFileSystemElement element = (ImportFileSystemElement) o;
return element.getFolders().getChildren();
}
return new Object[0];
}
public boolean hasChildren(Object o) {
if (o instanceof ImportFileSystemElement) {
ImportFileSystemElement element = (ImportFileSystemElement) o;
if (element.isPopulated()) {
return getChildren(element).length > 0;
}
// If we have not populated then wait until asked
return true;
}
return false;
}
};
}
}