blob: 6761ffba9cffe28a9c48b82dbaacbd05af40079c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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
*******************************************************************************/
package org.eclipse.egit.internal.relengtools;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.Label;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
/**
* This class extends
* <code>WizardPage<code> class and use a <code>CheckboxTreeViewer<code> to
* display selectable items.
*/
public class ProjectSelectionPage extends WizardPage {
private CheckboxTreeViewer viewer;
private IDialogSettings settings;
private Button compareButton;
private boolean compareButtonChecked;
private String SELECTED_ITEMS_KEY = Messages
.getString("ProjectSelectionPage.0"); //$NON-NLS-1$
private String COMPARE_BUTTON_KEY = Messages
.getString("ProjectSelectionPage.1"); //$NON-NLS-1$
private MapProject mapProject;
private class MapFileLabelProvider extends LabelProvider {
WorkbenchLabelProvider provider = new WorkbenchLabelProvider();
public String getText(Object element) {
if (element instanceof MapFile) {
return ((MapFile) element).getName();
}
return provider.getText(element);
}
public Image getImage(Object element) {
if (element instanceof MapFile) {
return provider.getImage(((MapFile) element).getFile());
}
return provider.getImage(element);
}
public void dispose() {
provider.dispose();
super.dispose();
}
}
public ProjectSelectionPage(String pageName, String title,
IDialogSettings settings, ImageDescriptor image) {
super(pageName, title, image);
this.settings = settings;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
* .Composite)
*/
public void createControl(Composite parent) {
Font font = parent.getFont();
Composite topContainer = new Composite(parent, SWT.NONE);
topContainer.setLayout(new GridLayout());
topContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
Label label = new Label(topContainer, SWT.HORIZONTAL);
label.setFont(font);
label.setText(Messages.getString("ProjectSelectionPage.2")); //$NON-NLS-1$
viewer = new ContainerCheckedTreeViewer(topContainer, SWT.SINGLE
| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = viewer.getTree().getItemHeight() * 15;
viewer.getTree().setLayoutData(gd);
viewer.getTree().setFont(font);
viewer.setLabelProvider(new MapFileLabelProvider());
viewer.setContentProvider(getContentProvider());
viewer.setComparator(new ResourceComparator(ResourceComparator.NAME) {
public int compare(Viewer viewer, Object o1, Object o2) {
if (o1 instanceof MapFile && o2 instanceof MapFile) {
return super.compare(viewer, ((MapFile) o1).getFile(),
((MapFile) o2).getFile());
}
return super.compare(viewer, o1, o2);
}
});
viewer.setInput(mapProject);
viewer.expandAll();
viewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
updatePageComplete();
}
});
compareButton = new Button(topContainer, SWT.CHECK);
compareButton.setText(Messages.getString("ProjectSelectionPage.3")); //$NON-NLS-1$
compareButton.setFont(font);
compareButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
compareButtonChecked = compareButton.getSelection();
}
});
initialize();
setControl(topContainer);
}
/**
* Returns the content provider for the viewer
*/
private IContentProvider getContentProvider() {
return new WorkbenchContentProvider() {
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof MapProject) {
return mapProject.getValidMapFiles();
}
if (parentElement instanceof MapFile) {
return ((MapFile) parentElement).getAccessibleProjects();
}
return null;
}
/*
* @see
* org.eclipse.ui.model.BaseWorkbenchContentProvider#getParent(java
* .lang.Object)
*
* @since 3.7
*/
public Object getParent(Object element) {
if (mapProject == null)
return null;
if (element instanceof MapFile) {
return mapProject;
}
if (element instanceof IProject) {
MapFile[] mapFiles = mapProject.getValidMapFiles();
for (int i = 0; i < mapFiles.length; i++) {
if (mapFiles[i].contains((IProject) element))
return mapFiles[i];
}
}
return super.getParent(element);
}
public boolean hasChildren(Object element) {
if (element instanceof MapFile) {
return ((MapFile) element).getAccessibleProjects().length > 0;
}
return false;
}
};
}
/**
* Returns all the checked items if they are IProject
*/
public IProject[] getCheckedProjects() {
ArrayList projectsToRelease = new ArrayList();
Object[] obj = viewer.getCheckedElements();
if (obj == null)
return null;
for (int i = 0; i < obj.length; i++) {
if (obj[i] instanceof IProject)
projectsToRelease.add(obj[i]);
}
return (IProject[]) projectsToRelease
.toArray(new IProject[projectsToRelease.size()]);
}
private void readProjectSettings() {
if (settings == null)
return;
if (settings.getArray(SELECTED_ITEMS_KEY) != null) {
ArrayList nameList = new ArrayList(Arrays.asList(settings
.getArray(SELECTED_ITEMS_KEY)));
if (nameList != null) {
Iterator iter = nameList.iterator();
while (iter.hasNext()) {
String name = (String) iter.next();
IProject project = getProjectWithName(name);
if (project != null) {
viewer.setChecked(project, true);
}
}
}
}
}
private void initCompareEnablement() {
if (settings == null || settings.get(COMPARE_BUTTON_KEY) == null) {
compareButton.setSelection(true);
compareButtonChecked = true;
return;
} else {
boolean b = settings.getBoolean(COMPARE_BUTTON_KEY);
compareButton.setSelection(b);
compareButtonChecked = b;
}
}
/**
* Save the checked items and the checkbox options to dialog settings
*/
public void saveSettings() {
Object[] obj = viewer.getCheckedElements();
ArrayList names = new ArrayList();
for (int i = 0; i < obj.length; i++) {
if (obj[i] instanceof IProject) {
names.add(((IProject) obj[i]).getName());
}
}
settings.put(SELECTED_ITEMS_KEY,
(String[]) names.toArray(new String[names.size()]));
settings.put(COMPARE_BUTTON_KEY, compareButtonChecked);
}
/*
* @see
* org.eclipse.jface.wizard.WizardPage#setPreviousPage(org.eclipse.jface
* .wizard.IWizardPage)
*
* @since 3.7
*/
public void setPreviousPage(IWizardPage page) {
super.setPreviousPage(page);
updatePageComplete();
}
private void initialize() {
initCheckedProjects();
initCompareEnablement();
updatePageComplete();
}
private void initCheckedProjects() {
IProject[] p = ((ReleaseWizard) getWizard()).getPreSelectedProjects();
if (p != null) {
viewer.setCheckedElements(p);
} else {
readProjectSettings();
}
}
/**
* Called by
* <code>readSettings()<code> to return the project associated with the given name
*/
private IProject getProjectWithName(String name) {
IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(name);
if (project.exists() && project.isAccessible())
return project;
return null;
}
public boolean isCompareButtonChecked() {
return compareButtonChecked;
}
/**
* This page will not complete until at least one project is checked
*/
private void updatePageComplete() {
Object[] obj = viewer.getCheckedElements();
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// Exclude the situation that an empty shown map file is
// selected
if (obj[i] instanceof IProject) {
setPageComplete(true);
break;
}
}
} else {
setPageComplete(false);
}
}
private CheckboxTreeViewer getViewer() {
return viewer;
}
public void setSelection(IProject[] projects) {
if (projects != null && projects.length > 0) {
getViewer().setCheckedElements(projects);
}
}
public void updateMapProject(MapProject m) {
mapProject = m;
if (viewer != null) {
Object[] checkedElements = null;
if (m != null && mapProject != null
&& m.getProject().equals(mapProject.getProject()))
checkedElements = viewer.getCheckedElements();
viewer.setInput(mapProject);
viewer.expandAll();
if (checkedElements != null)
viewer.setCheckedElements(checkedElements);
}
}
}