Eclipseplugins
SelectRepositoryPage.java
1 package com.proalpha.pds.gitutils.mylyn;
2 
3 import java.lang.reflect.InvocationTargetException;
4 import java.net.URL;
5 import java.util.Collections;
6 
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;
42 
43 import com.proalpha.pds.gitutils.Activator;
44 
52 @SuppressWarnings("restriction")
53 public class SelectRepositoryPage extends WizardPage {
54 
55  private final Logger logger = LoggerFactory.getLogger(SelectRepositoryPage.class);
56  private FeatureBranchSettings settings;
57  private RepositoryFilter searchFilter;
58  private CheckboxTableViewer repositoryViewer;
59  private ICheckStateListener checkRepositoryStateListener;
60  private Button showAllProjectsButton;
61 
63  super(SelectRepositoryPage.class.getName());
64 
65  this.settings = settings;
66 
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");
70 
71  URL url = FileLocator.find(Platform.getBundle(Activator.PLUGIN_ID), new Path("icons/pA-logox72.png"),
72  Collections.emptyMap());
73 
74  setImageDescriptor(ImageDescriptor.createFromURL(url));
75  searchFilter = new RepositoryFilter(settings.getTask());
76  }
77 
78  private void createFilterText(Group repositoryGroup) {
79 
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() {
84 
85  @Override
86  public void modifyText(ModifyEvent event) {
87  searchFilter.setSearchText(filterText.getText());
88 
89  RepositoryNode activeRepositoryNode = getActiveRepositoryNode();
90  repositoryViewer.refresh();
91  // clear selection if repository is no longer visible
92  checkIfRepositoryStillInView(activeRepositoryNode);
93  }
94  });
95  }
96 
102  private RepositoryNode getActiveRepositoryNode() {
103  RepositoryNode returnValue = null;
104  Object[] activeRepositoryNodes = repositoryViewer.getCheckedElements();
105 
106  // activeRepositoryNodes is either of length 0 or 1 since there can only be one
107  // activated repository
108  if (activeRepositoryNodes.length > 0) {
109  returnValue = (RepositoryNode) activeRepositoryNodes[0];
110  }
111 
112  return returnValue;
113  }
114 
122  private void checkIfRepositoryStillInView(RepositoryNode activeRepositoryNode) {
123 
124  if (activeRepositoryNode != null) {
125  for (TableItem item : repositoryViewer.getTable().getItems()) {
126  if (item.getData().equals(activeRepositoryNode)) {
127  return;
128  }
129  }
130  setNoRepositorySelected();
131  }
132  }
133 
137  private void createButtonShowAllProjects(Group repositoryGroup) {
138  showAllProjectsButton = new Button(repositoryGroup, SWT.CHECK);
139  showAllProjectsButton.setText("Show all Repositories");
140  showAllProjectsButton.addSelectionListener(new SelectionListener() {
141 
142  @Override
143  public void widgetSelected(SelectionEvent event) {
144  searchFilter.setShowAllProjects(((Button) event.widget).getSelection());
145  RepositoryNode activeRepositoryNode = getActiveRepositoryNode();
146  repositoryViewer.refresh();
147  // clear selection if repository is no longer visible
148  checkIfRepositoryStillInView(activeRepositoryNode);
149  }
150 
151  @Override
152  public void widgetDefaultSelected(SelectionEvent arg0) {
153 
154  }
155  });
156  }
157 
158  @Override
159  public void createControl(Composite parent) {
160 
161  Composite container = new Composite(parent, SWT.NULL);
162  container.setLayout(new GridLayout(1, false));
163 
164  Group repositoryGroup = new Group(container, SWT.NONE);
165  repositoryGroup.setText("Repositories");
166  repositoryGroup.setBackgroundMode(SWT.INHERIT_DEFAULT);
167 
168  createFilterText(repositoryGroup);
169  createButtonShowAllProjects(repositoryGroup);
170 
171  GridDataFactory.fillDefaults().grab(true, true).span(2, 1).applyTo(repositoryGroup);
172  GridLayoutFactory.swtDefaults().numColumns(1).applyTo(repositoryGroup);
173 
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);
182  checkRepositoryStateListener = new CheckRepositoryStateListener();
183 
184  repositoryViewer.addCheckStateListener(checkRepositoryStateListener);
185  GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 40).applyTo(repositoryViewer.getControl());
186 
187  if (repositoryViewer.getTable().getItems().length == 1) {
188  checkRepositoryStateListener.checkStateChanged(
189  new CheckStateChangedEvent(repositoryViewer, repositoryViewer.getElementAt(0), true));
190  }
191 
192  setPageComplete(true);
193  setControl(container);
194  }
195 
201  private void setNoRepositorySelected() {
202  setMessage(
203  "If no local repository is selected, then only the task will be active but no repository action will be performed!",
204  INFORMATION);
205  settings.setRepository(null);
206  setPageComplete(true);
207  }
208 
209  public class CheckRepositoryStateListener implements ICheckStateListener {
210 
211  boolean clean;
212 
213  @Override
214  public void checkStateChanged(CheckStateChangedEvent event) {
215  clean = true;
216 
217  if (event.getChecked()) {
218  Repository rep = ((RepositoryNode) event.getElement()).getRepository();
219 
220  settings.setRepository(rep);
221  settings.setDbCommit(Activator.fetchDbCommit(rep));
222  settings.setArtifactsCommit(Activator.fetchArtifactsCommit(rep));
223  repositoryViewer.setAllChecked(false);
224  repositoryViewer.setChecked(event.getElement(), true);
225 
226  try (Git git = new Git(rep)) {
227  // isClean() also reports false if there are untracked files
228  // --> this is possibly "too clean". It is sufficient to check
229  // if there are tracked files which chaned
230  setMessage("Check repository status...", INFORMATION);
231 
232  getContainer().run(true, false, new IRunnableWithProgress() {
233  public void run(IProgressMonitor monitor) {
234  try {
235  clean = git.status().call().getUncommittedChanges().isEmpty();
236 
237  } catch (NoWorkTreeException | GitAPIException e) {
238  logger.error("Error while trying to get the state of the repository", e);
239  }
240 
241  }
242  });
243  } catch (InvocationTargetException e) {
244  logger.error(e.getMessage(), e);
245  } catch (InterruptedException e) {
246  logger.error(e.getMessage(), e);
247  Thread.currentThread().interrupt();
248  }
249 
250  if (!clean) {
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);
256  } else {
257  setPageComplete(rep != null);
258  settings.deriveDefaults();
259  setMessage("");
260 
261  }
262  } else {
263  setNoRepositorySelected();
264  }
265  }
266  }
267 
268  @Override
269  public boolean canFlipToNextPage() {
270  if (settings.getRepository() != null) {
271  return super.canFlipToNextPage();
272  }
273  return false;
274  }
275 }
static String fetchDbCommit(Repository repository)
Definition: Activator.java:154
static String fetchArtifactsCommit(Repository repository)
Definition: Activator.java:169