blob: ef933600330e695fde8fc0201a6b5ca7c4c9e516 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 SSI Schaefer IT Solutions GmbH 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:
* SSI Schaefer IT Solutions GmbH
*******************************************************************************/
package org.eclipse.tea.library.build.ui;
import java.util.Arrays;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.internal.ui.viewsupport.DecoratingJavaLabelProvider;
import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
@SuppressWarnings("restriction")
public class SelectProjectDialog extends TitleAreaDialog {
private IProject selected;
private final String desc;
private final String title;
private String defaultSel;
private final ViewerFilter[] filters;
private final boolean multi;
private IProject[] multiSelected;
public SelectProjectDialog(Shell parentShell, String title, String desc, boolean multi, ViewerFilter... filters) {
super(parentShell);
this.title = title;
this.desc = desc;
this.multi = multi;
this.filters = filters;
}
public void setDefaultSelection(String defaultSel) {
this.defaultSel = defaultSel;
}
@Override
protected Control createDialogArea(Composite parent) {
setTitle(title);
setMessage(desc, IMessageProvider.INFORMATION);
Composite comp = new Composite(parent, SWT.NONE);
GridDataFactory.fillDefaults().grab(true, true).applyTo(comp);
GridLayoutFactory.fillDefaults().margins(20, 20).applyTo(comp);
TableViewer tv;
if (multi) {
tv = CheckboxTableViewer.newCheckList(comp, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
} else {
tv = new TableViewer(comp, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
}
GridDataFactory.fillDefaults().grab(true, true).hint(300, 300).applyTo(tv.getControl());
tv.setContentProvider(ArrayContentProvider.getInstance());
tv.setLabelProvider(new DecoratingJavaLabelProvider(new JavaUILabelProvider()));
tv.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
if (sel == null || sel.isEmpty()) {
selected = null;
} else {
selected = (IProject) sel.getFirstElement();
}
Button button = getButton(IDialogConstants.OK_ID);
if (button != null) {
button.setEnabled(selected != null);
}
}
});
if (multi) {
((CheckboxTableViewer) tv).addCheckStateListener((e) -> {
multiSelected = Arrays.stream(((CheckboxTableViewer) tv).getCheckedElements()).map(x -> (IProject) x)
.toArray(IProject[]::new);
});
}
if (filters != null && filters.length > 0) {
tv.setFilters(filters);
}
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
tv.setInput(root.getProjects());
if (defaultSel != null) {
// pre-select default selection bundle.
IProject project = root.getProject(defaultSel);
if (project != null) {
tv.setSelection(new StructuredSelection(project), true);
selected = project;
}
}
return comp;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
getButton(IDialogConstants.OK_ID).setEnabled(selected != null);
}
public IProject getResult() {
return selected;
}
public IProject[] getMultiResult() {
return multiSelected;
}
}