package org.codefaces.ui.internal.wizards; import org.codefaces.core.models.Repo; import org.codefaces.core.models.RepoFolderRoot; import org.codefaces.core.models.RepoResource; import org.codefaces.ui.internal.commons.RepoFolderOpenListener; import org.codefaces.ui.internal.commons.RepoFolderViewFilter; import org.codefaces.ui.internal.commons.RepoResourceComparator; import org.codefaces.ui.internal.commons.RepoResourceContentProvider; import org.codefaces.ui.internal.commons.RepoResourceLabelProvider; import org.codefaces.ui.wizards.RepoSettings; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.rwt.lifecycle.UICallBack; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class RepositoryResourcePage extends WizardPage { private class TreeViewSelectionChangedListener implements ISelectionChangedListener { @Override public void selectionChanged(SelectionChangedEvent event) { Object selectedElement = ((IStructuredSelection) event .getSelection()).getFirstElement(); if (!(selectedElement instanceof RepoResource)) { return; } RepoResource selection = (RepoResource) selectedElement; setPageComplete(selection != null); settings.put(RepoSettings.REPO_RESOURCE_INPUT, selection); } } private static final String DESCRIPTION = "Select the folder to be imported"; private static final String TITLE = "Select folder"; private TreeViewer repoStructureViewer; private RepoSettings settings; protected RepositoryResourcePage(RepoSettings settings) { super(TITLE); setTitle(TITLE); setDescription(DESCRIPTION); this.settings = settings; } private void bindRepoStructureViewer() { repoStructureViewer.addOpenListener(new RepoFolderOpenListener()); repoStructureViewer .addSelectionChangedListener(new TreeViewSelectionChangedListener()); } @Override public void createControl(Composite parent) { Composite dialogAreaComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, false); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; dialogAreaComposite.setLayout(layout); dialogAreaComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); dialogAreaComposite.setFont(parent.getFont()); setControl(dialogAreaComposite); createRepoStructureViewer(dialogAreaComposite); bindRepoStructureViewer(); setPageComplete(false); } private void createRepoStructureViewer(Composite parent) { repoStructureViewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); repoStructureViewer.getControl().setLayoutData( new GridData(GridData.FILL_BOTH)); repoStructureViewer .setContentProvider(new RepoResourceContentProvider()); repoStructureViewer.setLabelProvider(new RepoResourceLabelProvider()); repoStructureViewer .setFilters(new ViewerFilter[] { new RepoFolderViewFilter() }); repoStructureViewer.setComparator(new RepoResourceComparator()); } private void populateRepoStructureViewer(Repo repo) { RepoFolderRoot root = null; if (repo != null) { root = repo.getRoot(); } repoStructureViewer.setInput(root); repoStructureViewer.setSelection(null); } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { new ConnectorToRepositoryJob().schedule(); } } private void connectToRepository() { Object typePara = settings.get(RepoSettings.REPO_KIND); Assert.isTrue(typePara instanceof String); Object locationPara = settings.get(RepoSettings.REPO_URL); Assert.isTrue(locationPara instanceof String); Object userNamePara = settings.get(RepoSettings.REPO_USER); Assert.isTrue(userNamePara == null || userNamePara instanceof String); Object passwordPara = settings.get(RepoSettings.REPO_PASSWORD); Assert.isTrue(passwordPara == null || passwordPara instanceof String); final String type = (String) typePara; final String location = (String) locationPara; final String username = (String) userNamePara; final String password = (String) passwordPara; Repo repo = Repo.create(type, location, username, password); settings.put(RepoSettings.REPO, repo); } private class ConnectorToRepositoryJob extends Job { public ConnectorToRepositoryJob() { super("Connectoring to repository"); setSystem(true); } @Override protected IStatus run(IProgressMonitor monitor) { runOnUIThread(new Runnable() { @Override public void run() { populateRepoStructureViewer(null); setErrorMessage(null); } }); try { UICallBack.runNonUIThreadWithFakeContext( RepositoryResourcePage.this.getShell().getDisplay(), new Runnable() { @Override public void run() { connectToRepository(); } }); runOnUIThread(new Runnable() { @Override public void run() { populateRepoStructureViewer((Repo) settings .get(RepoSettings.REPO)); } }); } catch (final Exception e) { runOnUIThread(new Runnable() { @Override public void run() { setErrorMessage(e.getMessage()); } }); } return Status.OK_STATUS; } private void runOnUIThread(Runnable runnable) { Shell shell = RepositoryResourcePage.this.getShell(); if (shell == null || shell.isDisposed()) { return; } Display display = shell.getDisplay(); if (display == null || display.isDisposed()) { return; } display.asyncExec(runnable); } } }