/*******************************************************************************
* Copyright (c) 2012 VMware, Inc.
* 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.codehaus.groovy.eclipse.wizards;
import org.codehaus.groovy.eclipse.core.compiler.CompilerUtils;
import org.codehaus.groovy.eclipse.preferences.CompilerSwitchUIHelper;
import org.codehaus.groovy.frameworkadapter.util.SpecifiedVersion;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
*
* @author Andrew Eisenberg
* @since 3.0.0
*/
public class ListMessageDialog extends MessageDialog {
class TableContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
if (inputElement instanceof IProject[]) {
return (IProject[]) inputElement;
}
return null;
}
public void dispose() { }
public void inputChanged(Viewer viewer2, Object oldInput, Object newInput) { }
}
private static final String TITLE = "Fix compiler level mismatches"; //$NON-NLS-1$
private final IProject[] mismatchedProjects;
private IProject[] checkedMismatchedProjects;
private CheckboxTableViewer viewer;
/**
* Opens the mismatched compiler dialog focusing on the selected projects
* @param mismatchProjects
* @return
*/
public static IProject[] openViewer(Shell shell, IProject[] mismatchProjects) {
ListMessageDialog dialog = new ListMessageDialog(shell, mismatchProjects);
int res = dialog.open();
if (res == 0D) {
return dialog.getAllChecked();
} else {
return null;
}
}
@Override
protected void buttonPressed(int buttonId) {
if (buttonId == 0) {
Object[] checkedElements = viewer.getCheckedElements();
checkedMismatchedProjects = new IProject[checkedElements.length];
System.arraycopy(checkedElements, 0, checkedMismatchedProjects, 0, checkedElements.length);
}
super.buttonPressed(buttonId);
}
@Override
protected boolean isResizable() {
return true;
}
public ListMessageDialog(Shell shell, IProject[] mismatchedProjects) {
super(shell, TITLE, null, createMessage(mismatchedProjects), QUESTION, new String[] { IDialogConstants.YES_LABEL,
IDialogConstants.NO_LABEL }, 0);
this.mismatchedProjects = mismatchedProjects;
}
@Override
protected Control createCustomArea(Composite parent) {
((GridLayout) parent.getLayout()).numColumns = 2;
((GridLayout) parent.getLayout()).makeColumnsEqualWidth = false;
viewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 150;
gd.verticalSpan = 2;
viewer.getTable().setLayoutData(gd);
viewer.setContentProvider(new TableContentProvider());
viewer.setLabelProvider(new WorkbenchLabelProvider() {
@Override
protected String decorateText(String input, Object element) {
String label = super.decorateText(input, element);
if (element instanceof IProject) {
SpecifiedVersion version = CompilerUtils.getCompilerLevel((IProject) element);
return label + " -- " + version.toReadableVersionString();
} else {
return label;
}
}
});
viewer.setInput(mismatchedProjects);
viewer.setAllChecked(true);
applyDialogFont(viewer.getControl());
createButton(parent, "Select all", new SelectionAdapter() { //$NON-NLS-1$
@Override
public void widgetSelected(SelectionEvent e) {
viewer.setAllChecked(true);
}
});
createButton(parent, "Select none", new SelectionAdapter() { //$NON-NLS-1$
@Override
public void widgetSelected(SelectionEvent e) {
viewer.setAllChecked(false);
}
});
Composite compilerBlock = CompilerSwitchUIHelper.createCompilerSwitchBlock(parent);
compilerBlock.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 2, 1));
return parent;
}
protected Button createButton(Composite parent, String label, SelectionListener listener) {
return createButton(parent, label, SWT.PUSH, listener);
}
protected Button createButton(Composite parent, String label, int style, SelectionListener listener) {
Button button= new Button(parent, SWT.PUSH);
button.setFont(parent.getFont());
button.setText(label);
button.addSelectionListener(listener);
GridData gd= new GridData();
gd.horizontalAlignment= GridData.FILL;
gd.grabExcessHorizontalSpace= false;
gd.verticalAlignment= GridData.BEGINNING;
gd.widthHint = 100;
button.setLayoutData(gd);
return button;
}
IProject[] getAllChecked() {
return checkedMismatchedProjects;
}
private static String createMessage(IProject[] allMismatchedProjects) {
StringBuilder sb = new StringBuilder();
if (allMismatchedProjects.length > 1) {
sb.append("The following Groovy compiler mismatches have been found."); //$NON-NLS-1$
} else {
sb.append("The following Groovy compiler mismatch has been found."); //$NON-NLS-1$
}
if (allMismatchedProjects.length > 1) {
sb.append(" These projects may not compile until their compiler level matches the workspace level.\n\n"); //$NON-NLS-1$
} else {
sb.append(" This project may not compile until its compiler level matches the workspace level.\n\n"); //$NON-NLS-1$
}
sb.append("Do you want to change the project compiler levels to match the workspace level?"); //$NON-NLS-1$
return sb.toString();
}
}