Java tutorial
/******************************************************************************* * Copyright (c) 2010 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation * Dariusz Luksza <dariusz@luksza.org> *******************************************************************************/ package org.eclipse.egit.ui.internal.synchronize; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.egit.ui.UIIcons; import org.eclipse.egit.ui.UIText; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.jgit.lib.Repository; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer; import org.eclipse.ui.ide.IDE; class GitSynchronizeWizardPage extends WizardPage { private CheckboxTreeViewer treeViewer; private Map<Repository, Set<IProject>> repositories; private Set<Repository> selectedRepositories = new HashSet<Repository>(); private Set<IProject> selectedProjects = new HashSet<IProject>(); private Map<Repository, String> selectedBranches = new HashMap<Repository, String>(); private Image branchesImage = UIIcons.BRANCHES.createImage(); private Image repositoryImage = UIIcons.REPOSITORY.createImage(); GitSynchronizeWizardPage() { super(GitSynchronizeWizardPage.class.getName()); setTitle(UIText.GitBranchSynchronizeWizardPage_title); setDescription(UIText.GitBranchSynchronizeWizardPage_description); } public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(1, false); layout.marginWidth = 0; layout.marginHeight = 0; composite.setLayout(layout); repositories = new HashMap<Repository, Set<IProject>>(); for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { RepositoryMapping mapping = RepositoryMapping.getMapping(project); if (mapping != null) { Repository repository = mapping.getRepository(); Set<IProject> set = repositories.get(repository); if (set == null) { set = new HashSet<IProject>(); repositories.put(repository, set); } set.add(project); } } treeViewer = new ContainerCheckedTreeViewer(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION); treeViewer.getTree().setLinesVisible(true); treeViewer.getTree().setHeaderVisible(true); treeViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); TreeViewerColumn repositoriesColumn = new TreeViewerColumn(treeViewer, SWT.LEAD); repositoriesColumn.getColumn().setText(UIText.GitBranchSynchronizeWizardPage_repositories); repositoriesColumn.getColumn().setImage(repositoryImage); repositoriesColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof Repository) { return ((Repository) element).getDirectory().getAbsolutePath(); } return ((IProject) element).getName(); } @Override public Image getImage(Object element) { if (element instanceof Repository) { return repositoryImage; } return PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT); } }); TreeViewerColumn branchesColumn = new TreeViewerColumn(treeViewer, SWT.LEAD); branchesColumn.getColumn().setText(UIText.GitBranchSynchronizeWizardPage_branches); branchesColumn.getColumn().setImage(branchesImage); branchesColumn.getColumn().setWidth(200); final ComboBoxCellEditor branchesEditor = new ComboBoxCellEditor(treeViewer.getTree(), new String[0]); branchesColumn.setEditingSupport(new EditingSupport(treeViewer) { @Override protected void setValue(Object element, Object value) { int intValue = ((Integer) value).intValue(); if (intValue == -1) { return; } CCombo combo = (CCombo) branchesEditor.getControl(); String branch = combo.getItem(intValue); if (element instanceof IProject) { RepositoryMapping mapping = RepositoryMapping.getMapping((IResource) element); Repository repository = mapping.getRepository(); selectedBranches.put(repository, branch); treeViewer.refresh(repository, true); } else { selectedBranches.put((Repository) element, branch); treeViewer.refresh(element, true); } setPageComplete(selectedBranches.size() == selectedRepositories.size()); } @Override protected Object getValue(Object element) { if (element instanceof IProject) { RepositoryMapping mapping = RepositoryMapping.getMapping((IResource) element); String branch = selectedBranches.get(mapping.getRepository()); CCombo combo = (CCombo) branchesEditor.getControl(); int index = branch == null ? 0 : combo.indexOf(branch); return Integer.valueOf(index); } else { String branch = selectedBranches.get(element); CCombo combo = (CCombo) branchesEditor.getControl(); int index = branch == null ? 0 : combo.indexOf(branch); return Integer.valueOf(index); } } @Override protected CellEditor getCellEditor(Object element) { if (element instanceof IProject) { RepositoryMapping mapping = RepositoryMapping.getMapping((IResource) element); Set<String> refs = mapping.getRepository().getAllRefs().keySet(); branchesEditor.setItems(refs.toArray(new String[refs.size()])); } else { Set<String> refs = ((Repository) element).getAllRefs().keySet(); branchesEditor.setItems(refs.toArray(new String[refs.size()])); } return branchesEditor; } @Override protected boolean canEdit(Object element) { return true; } }); branchesColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof IProject) { RepositoryMapping mapping = RepositoryMapping.getMapping((IResource) element); String branch = selectedBranches.get(mapping.getRepository()); return branch == null ? "" : branch; //$NON-NLS-1$ } else { String branch = selectedBranches.get(element); return branch == null ? "" : branch; //$NON-NLS-1$ } } }); treeViewer.setContentProvider(new ITreeContentProvider() { public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // nothing to do } public void dispose() { // nothing to do } public Object[] getElements(Object inputElement) { return (Object[]) inputElement; } public boolean hasChildren(Object element) { if (element instanceof Repository) { return !repositories.get(element).isEmpty(); } return false; } public Object getParent(Object element) { return null; } public Object[] getChildren(Object parentElement) { if (parentElement instanceof Repository) { return repositories.get(parentElement).toArray(); } return new Object[0]; } }); final Object[] array = repositories.keySet().toArray(); treeViewer.setInput(array); treeViewer.setCheckedElements(array); repositoriesColumn.getColumn().pack(); save(); treeViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { selectedRepositories.clear(); selectedProjects.clear(); save(); if (event.getChecked()) { setPageComplete(selectedBranches.size() == selectedRepositories.size()); } else if (treeViewer.getCheckedElements().length == 0) { setPageComplete(false); } } }); Composite buttonsComposite = new Composite(composite, SWT.NONE); layout = new GridLayout(2, true); layout.marginWidth = 0; layout.marginHeight = 0; buttonsComposite.setLayout(layout); buttonsComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false)); Button selectAllBtn = new Button(buttonsComposite, SWT.PUSH); selectAllBtn.setText(UIText.GitBranchSynchronizeWizardPage_selectAll); selectAllBtn.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { treeViewer.setCheckedElements(array); save(); setPageComplete(selectedBranches.size() == selectedRepositories.size()); } }); selectAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); Button deselectAllBtn = new Button(buttonsComposite, SWT.PUSH); deselectAllBtn.setText(UIText.GitBranchSynchronizeWizardPage_deselectAll); deselectAllBtn.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { // uncheck everything treeViewer.setCheckedElements(new Object[0]); // clear all selection selectedRepositories.clear(); selectedProjects.clear(); // mark page as being incomplete setPageComplete(false); } }); deselectAllBtn.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); Dialog.applyDialogFont(composite); setPageComplete(false); setControl(composite); } @Override public void dispose() { if (branchesImage != null) { branchesImage.dispose(); } if (repositoryImage != null) { repositoryImage.dispose(); } super.dispose(); } private void save() { // record any candidate repositories that should be synchronized for (Object grayedElement : treeViewer.getGrayedElements()) { selectedRepositories.add((Repository) grayedElement); } for (Object checkedElement : treeViewer.getCheckedElements()) { if (checkedElement instanceof Repository) { Repository repo = (Repository) checkedElement; if (selectedRepositories.add(repo)) { // if this repository hasn't been added yet, it implies it's // a checked element which means all the projects it owns // should be selected selectedProjects.addAll(repositories.get(repo)); } } else { selectedProjects.add((IProject) checkedElement); } } } Map<Repository, String> getSelectedBranches() { return selectedBranches; } Set<IProject> getSelectedProjects() { return selectedProjects; } }