Have icon for "reset" entry in reflog
[egit/eclipse.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / clone / RepositoryLocationPage.java
blob8584e7bc44f656ed261fa431afb452a41749e83a
1 /*******************************************************************************
2 * Copyright (c) 2012 SAP AG.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License 2.0
5 * which accompanies this distribution, and is available at
6 * https://www.eclipse.org/legal/epl-2.0/
8 * SPDX-License-Identifier: EPL-2.0
10 * Contributors:
11 * Stefan Lay (SAP AG) - initial implementation
12 *******************************************************************************/
13 package org.eclipse.egit.ui.internal.clone;
15 import java.util.HashMap;
16 import java.util.List;
17 import java.util.Map;
19 import org.eclipse.core.runtime.CoreException;
20 import org.eclipse.egit.ui.Activator;
21 import org.eclipse.egit.ui.internal.UIText;
22 import org.eclipse.egit.ui.internal.clone.GitCloneSourceProviderExtension.CloneSourceProvider;
23 import org.eclipse.egit.ui.internal.provisional.wizards.RepositoryServerInfo;
24 import org.eclipse.jface.layout.GridDataFactory;
25 import org.eclipse.jface.layout.GridLayoutFactory;
26 import org.eclipse.jface.viewers.DoubleClickEvent;
27 import org.eclipse.jface.viewers.IDoubleClickListener;
28 import org.eclipse.jface.viewers.ISelectionChangedListener;
29 import org.eclipse.jface.viewers.IStructuredSelection;
30 import org.eclipse.jface.viewers.ITreeContentProvider;
31 import org.eclipse.jface.viewers.SelectionChangedEvent;
32 import org.eclipse.jface.viewers.TreeViewer;
33 import org.eclipse.jface.wizard.IWizardPage;
34 import org.eclipse.jface.wizard.WizardPage;
35 import org.eclipse.swt.SWT;
36 import org.eclipse.swt.widgets.Composite;
37 import org.eclipse.ui.dialogs.FilteredTree;
38 import org.eclipse.ui.dialogs.PatternFilter;
40 /**
41 * Displays the possible locations of git repositories
43 public class RepositoryLocationPage extends WizardPage {
45 private final List<CloneSourceProvider> repositoryImports;
47 // local cache for contributed WizardPages
48 private Map<CloneSourceProvider, WizardPage> resolvedWizardPages;
50 private TreeViewer tv;
52 /**
53 * @param cloneSourceProvider all contributed CloneSourceProviders
55 public RepositoryLocationPage(List<CloneSourceProvider> cloneSourceProvider) {
56 super(RepositoryLocationPage.class.getName());
57 this.repositoryImports = cloneSourceProvider;
58 resolvedWizardPages = new HashMap<>();
59 setTitle(UIText.RepositoryLocationPage_title);
60 setMessage(UIText.RepositoryLocationPage_info);
63 @Override
64 public void createControl(Composite parent) {
65 Composite main = new Composite(parent, SWT.NONE);
67 GridLayoutFactory.fillDefaults().numColumns(2).margins(0, 0)
68 .applyTo(main);
70 GridDataFactory.fillDefaults().grab(true, true).applyTo(main);
71 // use a filtered tree
72 FilteredTree tree = new FilteredTree(main, SWT.SINGLE | SWT.BORDER
73 | SWT.H_SCROLL | SWT.V_SCROLL, new PatternFilter(), true);
75 tv = tree.getViewer();
76 GridDataFactory.fillDefaults().grab(true, true).applyTo(tree);
77 tv.setContentProvider(new RepositoryLocationContentProvider());
79 tv.setLabelProvider(new RepositoryLocationLabelProvider());
81 tv.addSelectionChangedListener(new ISelectionChangedListener() {
83 @Override
84 public void selectionChanged(SelectionChangedEvent event) {
85 checkPage();
87 });
89 tv.addDoubleClickListener(new IDoubleClickListener() {
91 @Override
92 public void doubleClick(DoubleClickEvent event) {
93 checkPage();
94 if (isPageComplete())
95 getContainer().showPage(getNextPage());
97 });
99 tv.setInput(repositoryImports);
100 setControl(main);
103 private void checkPage() {
104 setErrorMessage(null);
105 boolean complete = false;
106 IStructuredSelection selection = (IStructuredSelection) tv
107 .getSelection();
108 if (selection.size() == 1) {
109 Object element = selection.getFirstElement();
110 if (element instanceof CloneSourceProvider) {
111 CloneSourceProvider repositoryImport = (CloneSourceProvider) element;
112 if (repositoryImport.equals(CloneSourceProvider.LOCAL)
113 || repositoryImport.hasFixLocation())
114 complete = true;
115 } else if (element instanceof RepositoryServerInfo) {
116 complete = true;
120 setPageComplete(complete);
123 @Override
124 public IWizardPage getNextPage() {
125 IStructuredSelection selection = (IStructuredSelection) tv
126 .getSelection();
128 if (selection.size() == 1) {
129 Object element = selection.getFirstElement();
130 if (element instanceof CloneSourceProvider) {
131 return getNextPage((CloneSourceProvider) element);
132 } else if (element instanceof RepositoryServerInfo) {
133 Object parent = ((ITreeContentProvider) tv.getContentProvider())
134 .getParent(element);
135 if (parent instanceof CloneSourceProvider)
136 return getNextPage((CloneSourceProvider) parent);
140 return null;
144 private IWizardPage getNextPage(CloneSourceProvider repositoryImport) {
145 if (repositoryImport.equals(CloneSourceProvider.LOCAL))
146 return getWizard().getNextPage(this);
147 else
148 return getWizardPage(repositoryImport);
151 private WizardPage getWizardPage(CloneSourceProvider repositoryImport) {
152 WizardPage nextPage;
153 nextPage = resolvedWizardPages.get(repositoryImport);
154 if (nextPage == null) {
155 try {
156 nextPage = repositoryImport.getRepositorySearchPage();
157 } catch (CoreException e) {
158 Activator.error(e.getLocalizedMessage(), e);
160 if (nextPage != null) {
161 nextPage.setWizard(getWizard());
162 resolvedWizardPages.put(repositoryImport, nextPage);
165 return nextPage;