1 package com.proalpha.pds.gitutils.mylyn;
3 import java.lang.reflect.InvocationTargetException;
5 import java.util.Collections;
7 import org.eclipse.core.resources.ResourcesPlugin;
8 import org.eclipse.core.runtime.FileLocator;
9 import org.eclipse.core.runtime.IProgressMonitor;
10 import org.eclipse.core.runtime.Path;
11 import org.eclipse.core.runtime.Platform;
12 import org.eclipse.egit.ui.internal.repository.RepositoriesViewContentProvider;
13 import org.eclipse.egit.ui.internal.repository.RepositoryTreeNodeLabelProvider;
14 import org.eclipse.egit.ui.internal.repository.tree.RepositoryNode;
15 import org.eclipse.jface.dialogs.MessageDialog;
16 import org.eclipse.jface.layout.GridDataFactory;
17 import org.eclipse.jface.layout.GridLayoutFactory;
18 import org.eclipse.jface.operation.IRunnableWithProgress;
19 import org.eclipse.jface.resource.ImageDescriptor;
20 import org.eclipse.jface.viewers.CheckStateChangedEvent;
21 import org.eclipse.jface.viewers.CheckboxTableViewer;
22 import org.eclipse.jface.viewers.ICheckStateListener;
23 import org.eclipse.jface.wizard.WizardPage;
24 import org.eclipse.jgit.api.Git;
25 import org.eclipse.jgit.api.errors.GitAPIException;
26 import org.eclipse.jgit.errors.NoWorkTreeException;
27 import org.eclipse.jgit.lib.Repository;
28 import org.eclipse.swt.SWT;
29 import org.eclipse.swt.events.ModifyEvent;
30 import org.eclipse.swt.events.ModifyListener;
31 import org.eclipse.swt.events.SelectionEvent;
32 import org.eclipse.swt.events.SelectionListener;
33 import org.eclipse.swt.layout.GridData;
34 import org.eclipse.swt.layout.GridLayout;
35 import org.eclipse.swt.widgets.Button;
36 import org.eclipse.swt.widgets.Composite;
37 import org.eclipse.swt.widgets.Group;
38 import org.eclipse.swt.widgets.TableItem;
39 import org.eclipse.swt.widgets.Text;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
43 import com.proalpha.pds.gitutils.Activator;
52 @SuppressWarnings(
"restriction")
58 private CheckboxTableViewer repositoryViewer;
59 private ICheckStateListener checkRepositoryStateListener;
60 private Button showAllProjectsButton;
65 this.settings = settings;
67 setTitle(
"Repository Selection");
68 setMessage(
"If no repository is selected, the task will be activated without repository action.", INFORMATION);
69 setDescription(
"Desc Select the repository");
71 URL url = FileLocator.find(Platform.getBundle(
Activator.PLUGIN_ID),
new Path(
"icons/pA-logox72.png"),
72 Collections.emptyMap());
74 setImageDescriptor(ImageDescriptor.createFromURL(url));
78 private void createFilterText(Group repositoryGroup) {
80 Text filterText =
new Text(repositoryGroup, SWT.SEARCH | SWT.ICON_SEARCH | SWT.CANCEL | SWT.ICON_CANCEL);
81 filterText.setLayoutData(
new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
82 filterText.setMessage(
"type to filter the repositories shown");
83 filterText.addModifyListener(
new ModifyListener() {
86 public void modifyText(ModifyEvent event) {
87 searchFilter.setSearchText(filterText.getText());
89 RepositoryNode activeRepositoryNode = getActiveRepositoryNode();
90 repositoryViewer.refresh();
92 checkIfRepositoryStillInView(activeRepositoryNode);
102 private RepositoryNode getActiveRepositoryNode() {
103 RepositoryNode returnValue =
null;
104 Object[] activeRepositoryNodes = repositoryViewer.getCheckedElements();
108 if (activeRepositoryNodes.length > 0) {
109 returnValue = (RepositoryNode) activeRepositoryNodes[0];
122 private void checkIfRepositoryStillInView(RepositoryNode activeRepositoryNode) {
124 if (activeRepositoryNode !=
null) {
125 for (TableItem item : repositoryViewer.getTable().getItems()) {
126 if (item.getData().equals(activeRepositoryNode)) {
130 setNoRepositorySelected();
137 private void createButtonShowAllProjects(Group repositoryGroup) {
138 showAllProjectsButton =
new Button(repositoryGroup, SWT.CHECK);
139 showAllProjectsButton.setText(
"Show all Repositories");
140 showAllProjectsButton.addSelectionListener(
new SelectionListener() {
143 public void widgetSelected(SelectionEvent event) {
145 RepositoryNode activeRepositoryNode = getActiveRepositoryNode();
146 repositoryViewer.refresh();
148 checkIfRepositoryStillInView(activeRepositoryNode);
152 public void widgetDefaultSelected(SelectionEvent arg0) {
159 public void createControl(Composite parent) {
161 Composite container =
new Composite(parent, SWT.NULL);
162 container.setLayout(
new GridLayout(1,
false));
164 Group repositoryGroup =
new Group(container, SWT.NONE);
165 repositoryGroup.setText(
"Repositories");
166 repositoryGroup.setBackgroundMode(SWT.INHERIT_DEFAULT);
168 createFilterText(repositoryGroup);
169 createButtonShowAllProjects(repositoryGroup);
171 GridDataFactory.fillDefaults().grab(
true,
true).span(2, 1).applyTo(repositoryGroup);
172 GridLayoutFactory.swtDefaults().numColumns(1).applyTo(repositoryGroup);
174 repositoryViewer = CheckboxTableViewer.newCheckList(repositoryGroup,
175 SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
176 repositoryViewer.setLabelProvider(
new RepositoryTreeNodeLabelProvider());
177 repositoryViewer.setContentProvider(
new RepositoriesViewContentProvider());
178 repositoryViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
179 repositoryViewer.addFilter(searchFilter);
180 showAllProjectsButton.setSelection(
true);
181 showAllProjectsButton.notifyListeners(SWT.Selection,
null);
184 repositoryViewer.addCheckStateListener(checkRepositoryStateListener);
185 GridDataFactory.fillDefaults().grab(
true,
true).hint(SWT.DEFAULT, 40).applyTo(repositoryViewer.getControl());
187 if (repositoryViewer.getTable().getItems().length == 1) {
188 checkRepositoryStateListener.checkStateChanged(
189 new CheckStateChangedEvent(repositoryViewer, repositoryViewer.getElementAt(0),
true));
192 setPageComplete(
true);
193 setControl(container);
201 private void setNoRepositorySelected() {
203 "If no local repository is selected, then only the task will be active but no repository action will be performed!",
205 settings.setRepository(
null);
206 setPageComplete(
true);
214 public void checkStateChanged(CheckStateChangedEvent event) {
217 if (event.getChecked()) {
218 Repository rep = ((RepositoryNode) event.getElement()).getRepository();
220 settings.setRepository(rep);
223 repositoryViewer.setAllChecked(
false);
224 repositoryViewer.setChecked(event.getElement(),
true);
226 try (Git git =
new Git(rep)) {
230 setMessage(
"Check repository status...", INFORMATION);
232 getContainer().run(
true,
false,
new IRunnableWithProgress() {
233 public void run(IProgressMonitor monitor) {
235 clean = git.status().call().getUncommittedChanges().isEmpty();
237 }
catch (NoWorkTreeException | GitAPIException e) {
238 logger.error(
"Error while trying to get the state of the repository", e);
243 }
catch (InvocationTargetException e) {
244 logger.error(e.getMessage(), e);
245 }
catch (InterruptedException e) {
246 logger.error(e.getMessage(), e);
247 Thread.currentThread().interrupt();
251 MessageDialog.openError(getShell(),
"Dirty workspace",
252 "The workspace of this repository is dirty. You have to commit, "
253 +
"stash, or undo your changes before you can create a new branch "
254 +
"in this repository.");
255 setPageComplete(
false);
257 setPageComplete(rep !=
null);
263 setNoRepositorySelected();
269 public boolean canFlipToNextPage() {
270 if (settings.getRepository() !=
null) {
271 return super.canFlipToNextPage();
static String fetchDbCommit(Repository repository)
static String fetchArtifactsCommit(Repository repository)
void setShowAllProjects(boolean showAll)