blob: 390ad1f79b1fb8e4eddab39584771b6f3743f2d8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ui.synchronize;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.team.internal.ui.TeamUIMessages;
import org.eclipse.team.ui.synchronize.ISynchronizeScope;
import org.eclipse.team.ui.synchronize.ResourceScope;
import org.eclipse.team.ui.synchronize.WorkingSetScope;
import org.eclipse.team.ui.synchronize.WorkspaceScope;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceComparator;
/**
* Page that allows the user to select a set of resources that are managed by a subscriber
* participant. Callers can provide a scope hint to determine the initial selection for the
* resource list. By default, the resources in the current selection are checked, otherwise
* all resources are checked.
*
* @since 3.0
*/
public class GlobalRefreshResourceSelectionPage extends GlobalRefreshElementSelectionPage {
private List resources;
/**
* Content provider that accepts a <code>SubscriberParticipant</code> as input and
* returns the participants root resources.
*/
class MyContentProvider extends BaseWorkbenchContentProvider {
@Override
public Object[] getChildren(Object element) {
if(element instanceof List) {
return ((List<?>)element).toArray(new IResource[((List)element).size()]);
}
return super.getChildren(element);
}
}
/**
* Label decorator that will display the full path for participant roots that are folders. This
* is useful for participants that have non-project roots.
*/
class MyLabelProvider extends LabelProvider {
private LabelProvider workbenchProvider = new WorkbenchLabelProvider();
@Override
public String getText(Object element) {
if(element instanceof IContainer) {
IContainer c = (IContainer)element;
if(c.getType() != IResource.PROJECT && resources.contains(c)) {
return c.getFullPath().toString();
}
}
return workbenchProvider.getText(element);
}
@Override
public Image getImage(Object element) {
return workbenchProvider.getImage(element);
}
}
/**
* Create a new page for the given participant. The scope hint will determine the initial selection.
*
* @param resources the resources to synchronize
*/
public GlobalRefreshResourceSelectionPage(IResource[] resources) {
super(TeamUIMessages.GlobalRefreshResourceSelectionPage_1);
// Caching the roots so that the decorator doesn't have to recompute all the time.
this.resources = Arrays.asList(resources);
setDescription(TeamUIMessages.GlobalRefreshResourceSelectionPage_2);
setTitle(TeamUIMessages.GlobalRefreshResourceSelectionPage_3);
}
@Override
protected ContainerCheckedTreeViewer createViewer(Composite top) {
GridData data;
ContainerCheckedTreeViewer fViewer = new ContainerCheckedTreeViewer(top, SWT.BORDER);
data = new GridData(GridData.FILL_BOTH);
//data.widthHint = 200;
data.heightHint = 100;
fViewer.getControl().setLayoutData(data);
fViewer.setContentProvider(new MyContentProvider());
fViewer.setLabelProvider(new DecoratingLabelProvider(new MyLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
fViewer.addCheckStateListener(event -> updateOKStatus());
fViewer.setComparator(new ResourceComparator(ResourceComparator.NAME));
fViewer.setInput(resources);
return fViewer;
}
@Override
protected void checkAll() {
getViewer().setCheckedElements(resources.toArray());
}
@Override
protected boolean checkWorkingSetElements() {
List<IResource> allWorkingSetResources = new ArrayList<>();
IWorkingSet[] workingSets = getWorkingSets();
for (IWorkingSet set : workingSets) {
allWorkingSetResources.addAll(IDE.computeSelectedResources(new StructuredSelection(set.getElements())));
}
getViewer().setCheckedElements(allWorkingSetResources.toArray(new IResource[allWorkingSetResources.size()]));
return !allWorkingSetResources.isEmpty();
}
public IResource[] getRootResources() {
Object[] objects = getRootElement();
IResource[] resources = new IResource[objects.length];
for (int i = 0; i < resources.length; i++) {
resources[i] = (IResource)objects[i];
}
return resources;
}
public ISynchronizeScope getSynchronizeScope() {
if (isWorkingSetSelected()) {
return new WorkingSetScope(getWorkingSets());
}
if (isWorkspaceSelected()) {
return new WorkspaceScope();
}
return new ResourceScope(getRootResources());
}
}