package LinGUIne.wizards;
import java.io.File;
import java.util.Collection;
import java.util.LinkedList;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.TableItem;
import org.eclipse.swt.widgets.Text;
import LinGUIne.model.Project;
import LinGUIne.model.ProjectManager;
/**
* Page for the user to select a Project they would like to import into the
* workspace.
*
* @author Kyle Mullins
*/
public class ImportProjectWizardPage extends WizardPage {
private ProjectManager projectMan;
private Text txtProjectPath;
private TableViewer tblProjectList;
private Button chkSearchForNested;
private File selectedDir;
private LinkedList<Project> projectsToImport;
public ImportProjectWizardPage(ProjectManager projects){
super("Import Project Wizard");
setTitle("Import Project Wizard");
setDescription("Select an existing Project to import into the workspace.");
projectMan = projects;
projectsToImport = new LinkedList<Project>();
}
@Override
public void createControl(Composite parent) {
final Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new GridLayout(1, false));
Label lblChooseProject = new Label(container, SWT.NONE);
lblChooseProject.setText("Choose an existing Project to import into" +
" the workspace.");
Composite pathContainer = new Composite(container, SWT.NONE);
pathContainer.setLayout(new GridLayout(2, false));
pathContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
txtProjectPath = new Text(pathContainer, SWT.BORDER | SWT.SINGLE);
txtProjectPath.setText("");
txtProjectPath.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
txtProjectPath.addModifyListener(new ModifyListener(){
@Override
public void modifyText(ModifyEvent e) {
File enteredPath = new File(txtProjectPath.getText());
if(enteredPath.exists() && enteredPath.isDirectory()){
selectedDir = enteredPath;
updateProjectList(chkSearchForNested.getSelection());
}
else{
selectedDir = null;
}
}
});
Button btnBrowse = new Button(pathContainer, SWT.NONE);
btnBrowse.setText("Browse...");
btnBrowse.addSelectionListener(new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dirDialog = new DirectoryDialog(container.getShell(),
SWT.NONE);
txtProjectPath.setText(dirDialog.open());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
Label lblProjectsInDir = new Label(container, SWT.NONE);
lblProjectsInDir.setText("Projects:");
tblProjectList = new TableViewer(container, SWT.BORDER | SWT.CHECK |
SWT.V_SCROLL);
tblProjectList.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
tblProjectList.getTable().addSelectionListener(new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent event) {
if(event.detail == SWT.CHECK){
TableItem item = (TableItem)event.item;
if(item.getChecked()){
projectsToImport.add((Project)item.getData());
}
else{
projectsToImport.remove((Project)item.getData());
}
setPageComplete(!projectsToImport.isEmpty());
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
chkSearchForNested = new Button(container, SWT.CHECK);
chkSearchForNested.setText("Search for nested Projects");
chkSearchForNested.addSelectionListener(new SelectionListener(){
@Override
public void widgetSelected(SelectionEvent e) {
if(selectedDir != null){
updateProjectList(chkSearchForNested.getSelection());
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
});
setControl(container);
setPageComplete(false);
}
/**
* Returns the list of selected Projects to be imported.
*/
public Collection<Project> getProjectsToImport(){
return projectsToImport;
}
/**
* Updates the list of Projects. Can search for Projects in sub-folders.
*
* @param searchForNested Whether or not to search for nested Projects.
*/
private void updateProjectList(boolean searchForNested){
LinkedList<File> projectFiles = new LinkedList<File>();
findProjectFiles(selectedDir, searchForNested, projectFiles);
tblProjectList.getTable().removeAll();
for(File projectFile: projectFiles){
boolean alreadyInWorkspace = false;
for(Project proj: projectMan.getProjects()){
if(projectFile.equals(proj.getProjectFile().toFile())){
alreadyInWorkspace = true;
break;
}
}
if(!alreadyInWorkspace){
Project foundProject = Project.createFromFile(projectFile);
tblProjectList.add(foundProject);
}
}
}
/**
* Searches for Projects by finding valid Project files. Can search for
* Projects in sub-folders.
*
* @param dir Directory in which to begin the search.
* @param searchForNested Whether or not to search for nested Projects.
* @param projectFiles List of found Project files.
*/
private void findProjectFiles(File dir, boolean searchForNested,
Collection<File> projectFiles){
if(dir != null){
for(File file: dir.listFiles()){
if(file.isDirectory() && searchForNested){
findProjectFiles(file, searchForNested, projectFiles);
}
else if(file.getName().equals("linguine.project")){
projectFiles.add(file);
}
}
}
}
}