From 540bf4168ba8f133f7386e340c3d3e91c44414e5 Mon Sep 17 00:00:00 2001 From: Mathias Kinzler Date: Wed, 2 Jun 2010 18:15:55 +0200 Subject: [PATCH] Git Import Projects: always show directories Currently, the import projects wizard only shows the working directory tree if it is started from the clone wizard. The working directory tree should also be shown when the wizard is started from the Git Repositories view in order to improve usability. If a subfolder of the working directory is selected for starting this wizard, the selected folder should be marked in the wizard's tree. The user can still change the selected folder before hitting "Next". Bug: 315169 Change-Id: Ifc3411ddf41f56567ab7aaebb3b0398ca7899655 Signed-off-by: Mathias Kinzler Signed-off-by: Matthias Sohn --- .../clone/GitCreateProjectViaWizardWizard.java | 5 +- .../clone/GitImportWithDirectoriesPage.java | 139 --------------------- .../egit/ui/internal/clone/GitImportWizard.java | 2 +- .../ui/internal/clone/GitSelectWizardPage.java | 137 +++++++++++++++++++- 4 files changed, 134 insertions(+), 149 deletions(-) delete mode 100644 org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWithDirectoriesPage.java diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitCreateProjectViaWizardWizard.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitCreateProjectViaWizardWizard.java index aa1bdb79..dae346e5 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitCreateProjectViaWizardWizard.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitCreateProjectViaWizardWizard.java @@ -83,8 +83,7 @@ public class GitCreateProjectViaWizardWizard extends Wizard implements @Override public void addPages() { - - mySelectionPage = new GitSelectWizardPage(); + mySelectionPage = new GitSelectWizardPage(myRepository, myGitDir); addPage(mySelectionPage); myCreateGeneralProjectPage = new GitCreateGeneralProjectPage(myGitDir); addPage(myCreateGeneralProjectPage); @@ -92,7 +91,7 @@ public class GitCreateProjectViaWizardWizard extends Wizard implements @Override public void setVisible(boolean visible) { - setProjectsList(myGitDir); + setProjectsList(mySelectionPage.getPath()); super.setVisible(visible); } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWithDirectoriesPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWithDirectoriesPage.java deleted file mode 100644 index 50896144..00000000 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWithDirectoriesPage.java +++ /dev/null @@ -1,139 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010 SAP AG. - * 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: - * Mathias Kinzler (SAP AG) - initial implementation - *******************************************************************************/ -package org.eclipse.egit.ui.internal.clone; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.egit.ui.UIText; -import org.eclipse.egit.ui.internal.repository.RepositoriesViewContentProvider; -import org.eclipse.egit.ui.internal.repository.RepositoriesViewLabelProvider; -import org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode; -import org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNodeType; -import org.eclipse.egit.ui.internal.repository.tree.WorkingDirNode; -import org.eclipse.jface.layout.GridDataFactory; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.widgets.Composite; - -/** - * Select a wizard and a directory from a Git Working Directory - */ -public class GitImportWithDirectoriesPage extends GitSelectWizardPage { - - private TreeViewer tv; - - /** - * - */ - public GitImportWithDirectoriesPage() { - super(); - setTitle(UIText.GitImportWithDirectoriesPage_PageTitle); - setMessage(UIText.GitImportWithDirectoriesPage_PageMessage); - } - - /** - * @param repo - */ - public void setRepository(Repository repo) { - List input = new ArrayList(); - if (repo != null) - input.add(new WorkingDirNode(null, repo)); - tv.setInput(input); - // select the working directory as default - tv.setSelection(new StructuredSelection(input.get(0))); - } - - public void createControl(Composite parent) { - super.createControl(parent); - - Composite main = (Composite) getControl(); - - tv = new TreeViewer(main, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL - | SWT.BORDER); - tv.setContentProvider(new RepositoriesViewContentProvider()); - GridDataFactory.fillDefaults().grab(true, true).applyTo(tv.getTree()); - new RepositoriesViewLabelProvider(tv); - - SelectionListener sl = new SelectionAdapter() { - - @Override - public void widgetSelected(SelectionEvent e) { - tv.getTree().setEnabled(!newProjectWizard.getSelection()); - } - - }; - - generalWizard.addSelectionListener(sl); - importExisting.addSelectionListener(sl); - newProjectWizard.addSelectionListener(sl); - - tv.addSelectionChangedListener(new ISelectionChangedListener() { - - public void selectionChanged(SelectionChangedEvent event) { - checkPage(); - } - }); - - tv.getTree().setEnabled(!newProjectWizard.getSelection()); - checkPage(); - setControl(main); - } - - /** - * @return the selected path - */ - public String getPath() { - IStructuredSelection sel = (IStructuredSelection) tv.getSelection(); - RepositoryTreeNode node = (RepositoryTreeNode) sel.getFirstElement(); - if (node != null && node.getType() == RepositoryTreeNodeType.FOLDER) - return ((File) node.getObject()).getPath(); - if (node != null && node.getType() == RepositoryTreeNodeType.WORKINGDIR) - return node.getRepository().getWorkDir().getPath(); - return null; - } - - protected void checkPage() { - super.checkPage(); - if (getErrorMessage() != null) - return; - - if (newProjectWizard.getSelection()) - return; - - IStructuredSelection sel = (IStructuredSelection) tv.getSelection(); - try { - if (sel.isEmpty()) { - setErrorMessage(UIText.GitImportWithDirectoriesPage_SelectFolderMessage); - return; - } - RepositoryTreeNode node = (RepositoryTreeNode) sel - .getFirstElement(); - if (node.getType() != RepositoryTreeNodeType.FOLDER - && node.getType() != RepositoryTreeNodeType.WORKINGDIR) { - setErrorMessage(UIText.GitImportWithDirectoriesPage_SelectFolderMessage); - return; - } - } finally { - setPageComplete(getErrorMessage() == null); - } - } - -} diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java index 11170834..27f613ac 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitImportWizard.java @@ -47,7 +47,7 @@ public class GitImportWizard extends Wizard implements ProjectCreator, private GitSelectRepositoryPage selectRepoPage = new GitSelectRepositoryPage(); - private GitImportWithDirectoriesPage importWithDirectoriesPage = new GitImportWithDirectoriesPage(); + private GitSelectWizardPage importWithDirectoriesPage = new GitSelectWizardPage(); private GitProjectsImportPage projectsImportPage = new GitProjectsImportPage(); diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitSelectWizardPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitSelectWizardPage.java index ec4a1d30..6469f40f 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitSelectWizardPage.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/clone/GitSelectWizardPage.java @@ -10,11 +10,29 @@ *******************************************************************************/ package org.eclipse.egit.ui.internal.clone; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; import org.eclipse.egit.ui.Activator; import org.eclipse.egit.ui.UIText; +import org.eclipse.egit.ui.internal.repository.RepositoriesViewContentProvider; +import org.eclipse.egit.ui.internal.repository.RepositoriesViewLabelProvider; +import org.eclipse.egit.ui.internal.repository.tree.FolderNode; +import org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode; +import org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNodeType; +import org.eclipse.egit.ui.internal.repository.tree.WorkingDirNode; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.jgit.lib.Repository; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -67,20 +85,60 @@ public class GitSelectWizardPage extends WizardPage { Button actionNothing; + private TreeViewer tv; + + private final Repository initialRepository; + + private final String initialPath; + /** * Default constructor */ public GitSelectWizardPage() { super(GitSelectWizardPage.class.getName()); - setTitle(UIText.GitSelectWizardPage_WizardTitle); + setTitle(UIText.GitImportWithDirectoriesPage_PageTitle); + setMessage(UIText.GitImportWithDirectoriesPage_PageMessage); + initialRepository = null; + initialPath = null; } /** - * @param name - * the page name + * Default constructor + * + * @param repository + * @param path */ - protected GitSelectWizardPage(String name) { - super(name); + public GitSelectWizardPage(Repository repository, String path) { + super(GitSelectWizardPage.class.getName()); + setTitle(UIText.GitImportWithDirectoriesPage_PageTitle); + setMessage(UIText.GitImportWithDirectoriesPage_PageMessage); + initialRepository = repository; + initialPath = path; + } + + /** + * @return the selected path + */ + public String getPath() { + IStructuredSelection sel = (IStructuredSelection) tv.getSelection(); + RepositoryTreeNode node = (RepositoryTreeNode) sel.getFirstElement(); + if (node != null && node.getType() == RepositoryTreeNodeType.FOLDER) + return ((File) node.getObject()).getPath(); + if (node != null && node.getType() == RepositoryTreeNodeType.WORKINGDIR) + return node.getRepository().getWorkDir().getPath(); + return null; + } + + /** + * @param repo + */ + public void setRepository(Repository repo) { + List input = new ArrayList(); + if (repo != null) + input.add(new WorkingDirNode(null, repo)); + tv.setInput(input); + // select the working directory as default + tv.setSelection(new StructuredSelection(input.get(0))); } public void createControl(Composite parent) { @@ -93,6 +151,7 @@ public class GitSelectWizardPage extends WizardPage { @Override public void widgetSelected(SelectionEvent e) { + tv.getTree().setEnabled(!newProjectWizard.getSelection()); checkPage(); } }; @@ -173,6 +232,55 @@ public class GitSelectWizardPage extends WizardPage { break; } + tv = new TreeViewer(main, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL + | SWT.BORDER); + RepositoriesViewContentProvider cp = new RepositoriesViewContentProvider(); + tv.setContentProvider(cp); + GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 200) + .applyTo(tv.getTree()); + new RepositoriesViewLabelProvider(tv); + + tv.addSelectionChangedListener(new ISelectionChangedListener() { + + public void selectionChanged(SelectionChangedEvent event) { + checkPage(); + } + }); + + if (initialRepository != null) { + List input = new ArrayList(); + WorkingDirNode node = new WorkingDirNode(null, initialRepository); + input.add(node); + tv.setInput(input); + // select the working directory as default + if (initialPath == null) + tv.setSelection(new StructuredSelection(input.get(0))); + else { + RepositoryTreeNode parentNode = node; + + IPath fullPath = new Path(initialPath); + IPath workdirPath = new Path(initialRepository.getWorkDir() + .getPath()); + if (workdirPath.isPrefixOf(fullPath)) { + IPath relPath = fullPath.removeFirstSegments(workdirPath + .segmentCount()); + for (String segment : relPath.segments()) { + for (Object child : cp.getChildren(parentNode)) { + if (child instanceof FolderNode) { + FolderNode childFolder = (FolderNode) child; + if (childFolder.getObject().getName().equals( + segment)) { + parentNode = childFolder; + break; + } + } + } + } + tv.setSelection(new StructuredSelection(parentNode)); + } + } + } + tv.getTree().setEnabled(!newProjectWizard.getSelection()); setControl(main); } @@ -215,8 +323,25 @@ public class GitSelectWizardPage extends WizardPage { settings.put(PREF_ACT, getActionSelection()); setErrorMessage(null); + + if (newProjectWizard.getSelection()) { + setPageComplete(true); + return; + } + + IStructuredSelection sel = (IStructuredSelection) tv.getSelection(); try { - // no special checks yet + if (sel.isEmpty()) { + setErrorMessage(UIText.GitImportWithDirectoriesPage_SelectFolderMessage); + return; + } + RepositoryTreeNode node = (RepositoryTreeNode) sel + .getFirstElement(); + if (node.getType() != RepositoryTreeNodeType.FOLDER + && node.getType() != RepositoryTreeNodeType.WORKINGDIR) { + setErrorMessage(UIText.GitImportWithDirectoriesPage_SelectFolderMessage); + return; + } } finally { setPageComplete(getErrorMessage() == null); } -- 2.11.4.GIT