setImageDescriptor(UIIcons.WIZBAN_CONNECT_REPO);
this.myWizard = w;
}
public void createControl(Composite parent) {
final RepositoryUtil util = Activator.getDefault().getRepositoryUtil();
Composite main = new Composite(parent, SWT.NONE);
// use zero spacing to save some real estate here
GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(main);
final Button internalModeButton = new Button(main, SWT.CHECK);
internalModeButton
.setText(UIText.ExistingOrNewPage_InternalModeCheckbox);
internalModeButton
.setToolTipText(UIText.ExistingOrNewPage_CreationInWorkspaceWarningTooltip);
internalModeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
internalMode = internalModeButton.getSelection();
updateControls();
}
});
externalComposite = new Composite(main, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, true)
.applyTo(externalComposite);
externalComposite.setLayout(new GridLayout(3, false));
new Label(externalComposite, SWT.NONE)
.setText(UIText.ExistingOrNewPage_ExistingRepositoryLabel);
final Combo existingRepoCombo = new Combo(externalComposite,
SWT.READ_ONLY);
GridDataFactory.fillDefaults().grab(true, false)
.applyTo(existingRepoCombo);
final ComboViewer v = new ComboViewer(existingRepoCombo);
v.setContentProvider(new RepoComboContentProvider());
v.setLabelProvider(new RepoComboLabelProvider());
v.setInput(new Object());
// the default ViewerSorter seems to do the right thing
// i.e. sort as String
v.setSorter(new ViewerSorter());
existingRepoCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
selectedRepository = null;
IStructuredSelection sel = (IStructuredSelection) v
.getSelection();
setRepository((Repository) sel.getFirstElement());
updateControls();
}
});
Button createRepoWizard = new Button(externalComposite, SWT.PUSH);
createRepoWizard.setText(UIText.ExistingOrNewPage_CreateRepositoryButton);
createRepoWizard.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
NewRepositoryWizard wiz = new NewRepositoryWizard(true);
if (new WizardDialog(getShell(), wiz).open() == Window.OK) {
v.refresh();
selectedRepository = wiz.getCreatedRepository();
v.setSelection(new StructuredSelection(selectedRepository));
updateControls();
}
}
});
new Label(externalComposite, SWT.NONE)
.setText(UIText.ExistingOrNewPage_WorkingDirectoryLabel);
workDir = new Text(externalComposite, SWT.BORDER | SWT.READ_ONLY);
GridDataFactory.fillDefaults().grab(true, false).applyTo(workDir);
GridDataFactory.fillDefaults().applyTo(workDir);
// leave the space between the "Create" and "Browse" buttons empty (i.e.
// do not fill to the right border
new Label(externalComposite, SWT.NONE);
new Label(externalComposite, SWT.NONE)
.setText(UIText.ExistingOrNewPage_RelativePathLabel);
relPath = new Text(externalComposite, SWT.BORDER);
relPath.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateControls();
}
});
GridDataFactory.fillDefaults().grab(true, false).applyTo(relPath);
browseRepository = new Button(externalComposite, SWT.PUSH);
browseRepository.setEnabled(false);
browseRepository
.setText(UIText.ExistingOrNewPage_BrowseRepositoryButton);
browseRepository.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dlg = new DirectoryDialog(getShell());
dlg.setFilterPath(selectedRepository.getWorkTree().getPath());
String directory = dlg.open();
if (directory != null) {
setRelativePath(directory);
updateControls();
}
}
});
Table projectMoveTable = new Table(externalComposite, SWT.MULTI
| SWT.FULL_SELECTION | SWT.CHECK | SWT.BORDER);
projectMoveViewer = new CheckboxTableViewer(projectMoveTable);
GridDataFactory.fillDefaults().span(3, 1).grab(true, true)
.applyTo(projectMoveTable);
TableColumn tc;
tc = new TableColumn(projectMoveTable, SWT.NONE);
tc.setText(UIText.ExistingOrNewPage_ProjectNameColumnHeader);
tc.setWidth(100);
tc = new TableColumn(projectMoveTable, SWT.NONE);
tc.setText(UIText.ExistingOrNewPage_CurrentLocationColumnHeader);
tc.setWidth(250);
tc = new TableColumn(projectMoveTable, SWT.NONE);
tc.setText(UIText.ExistingOrNewPage_NewLocationTargetHeader);
tc.setWidth(350);
projectMoveTable.setHeaderVisible(true);
projectMoveViewer
.setContentProvider(ArrayContentProvider.getInstance());
projectMoveViewer.setLabelProvider(moveProjectsLabelProvider);
projectMoveViewer.setInput(myWizard.projects);
projectMoveViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
updateControls();
}
});
TableItem[] children = projectMoveViewer.getTable().getItems();
for (int i = 0; i < children.length; i++) {
TableItem item = children[i];
IProject data = (IProject) item.getData();
RepositoryFinder repositoryFinder = new RepositoryFinder(data);
repositoryFinder.setFindInChildren(false);
try {
Collection<RepositoryMapping> find = repositoryFinder
.find(new NullProgressMonitor());
if (find.size() != 1)
item.setChecked(true);
} catch (CoreException e1) {
item.setText(2, e1.getMessage());
}
}
parentRepoComposite = new Composite(main, SWT.NONE);
parentRepoComposite.setLayout(new GridLayout(3, false));
GridDataFactory.fillDefaults().grab(true, true)
.applyTo(parentRepoComposite);
tree = new Tree(parentRepoComposite, SWT.BORDER | SWT.MULTI
| SWT.FULL_SELECTION | SWT.CHECK);
viewer = new CheckboxTreeViewer(tree);
tree.setHeaderVisible(true);
tree.setLayout(new GridLayout());
tree.setLayoutData(GridDataFactory.fillDefaults().grab(true, true)
.span(3, 1).create());
viewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
ProjectAndRepo checkable = (ProjectAndRepo) event
.getElement();
for (TreeItem ti : tree.getItems()) {
if (ti.getItemCount() > 0
|| ((ProjectAndRepo) ti.getData()).getRepo()
.equals("")) //$NON-NLS-1$
ti.setChecked(false);
for (TreeItem subTi : ti.getItems()) {
IProject project = ((ProjectAndRepo) subTi
.getData()).getProject();
if (checkable.getProject() != null
&& !subTi.getData().equals(checkable)
&& checkable.getProject().equals(project))
subTi.setChecked(false);
}
}
}
}
});
TreeColumn c1 = new TreeColumn(tree, SWT.NONE);
c1.setText(UIText.ExistingOrNewPage_HeaderProject);
c1.setWidth(100);
TreeColumn c2 = new TreeColumn(tree, SWT.NONE);
c2.setText(UIText.ExistingOrNewPage_HeaderLocation);
c2.setWidth(400);
TreeColumn c3 = new TreeColumn(tree, SWT.NONE);
c3.setText(UIText.ExistingOrNewPage_HeaderRepository);
c3.setWidth(200);
boolean allProjectsInExistingRepos = true;
for (IProject project : myWizard.projects) {
RepositoryFinder repositoryFinder = new RepositoryFinder(project);
repositoryFinder.setFindInChildren(false);
try {
Collection<RepositoryMapping> mappings;
mappings = repositoryFinder.find(new NullProgressMonitor());
Iterator<RepositoryMapping> mi = mappings.iterator();
RepositoryMapping m = mi.hasNext() ? mi.next() : null;
if (m == null) {
// no mapping found, enable repository creation
TreeItem treeItem = new TreeItem(tree, SWT.NONE);
updateProjectTreeItem(treeItem, project);
treeItem.setText(1, project.getLocation().toOSString());
treeItem.setText(2, ""); //$NON-NLS-1$
treeItem.setData(new ProjectAndRepo(project, "")); //$NON-NLS-1$
allProjectsInExistingRepos = false;
} else if (!mi.hasNext()) {
// exactly one mapping found
TreeItem treeItem = new TreeItem(tree, SWT.NONE);
updateProjectTreeItem(treeItem, project);
treeItem.setText(1, project.getLocation().toOSString());
fillTreeItemWithGitDirectory(m, treeItem, false);
treeItem.setData(new ProjectAndRepo(project, m
.getGitDirAbsolutePath().toOSString()));
treeItem.setChecked(true);
}
else {
TreeItem treeItem = new TreeItem(tree, SWT.NONE);
updateProjectTreeItem(treeItem, project);
treeItem.setText(1, project.getLocation().toOSString());
treeItem.setData(new ProjectAndRepo(project, "")); //$NON-NLS-1$
TreeItem treeItem2 = new TreeItem(treeItem, SWT.NONE);
updateProjectTreeItem(treeItem2, project);
fillTreeItemWithGitDirectory(m, treeItem2, true);
treeItem2.setData(new ProjectAndRepo(project, m
.getGitDirAbsolutePath().toOSString()));
while (mi.hasNext()) { // fill in additional mappings
m = mi.next();
treeItem2 = new TreeItem(treeItem, SWT.NONE);
updateProjectTreeItem(treeItem2, project);
fillTreeItemWithGitDirectory(m, treeItem2, true);
treeItem2.setData(new ProjectAndRepo(m.getContainer()
.getProject(), m.getGitDirAbsolutePath()
.toOSString()));
}
treeItem.setExpanded(true);
allProjectsInExistingRepos = false;
}
} catch (CoreException e) {
TreeItem treeItem2 = new TreeItem(tree, SWT.BOLD | SWT.ITALIC);
treeItem2.setText(e.getMessage());
}
}
createRepo = new Button(parentRepoComposite, SWT.PUSH);
createRepo.setLayoutData(GridDataFactory.fillDefaults().create());
createRepo.setText(UIText.ExistingOrNewPage_CreateButton);
createRepo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
File gitDir = new File(repositoryToCreate.getText(),
Constants.DOT_GIT);
try {
Repository repository = FileRepositoryBuilder
.create(gitDir);
repository.create();
for (IProject project : getProjects(false).keySet()) {
// If we don't refresh the project directories right
// now we won't later know that a .git directory
// exists within it and we won't mark the .git
// directory as a team-private member. Failure
// to do so might allow someone to delete
// the .git directory without us stopping them.
// (Half lie, we should optimize so we do not
// refresh when the .git is not within the project)
//
if (!gitDir.toString().contains("..")) //$NON-NLS-1$
project.refreshLocal(IResource.DEPTH_ONE,
new NullProgressMonitor());
}
util.addConfiguredRepository(gitDir);
} catch (IOException e1) {
String msg = NLS
.bind(UIText.ExistingOrNewPage_ErrorFailedToCreateRepository,
gitDir.toString());
org.eclipse.egit.ui.Activator.handleError(msg, e1, true);