blob: 33c850d6ea4fd23371ade73d6c3ec8b0bfa9019d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Atlassian 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:
* Atlassian - initial API and implementation
******************************************************************************/
package com.atlassian.connector.eclipse.internal.crucible.ui.editor.parts;
import com.atlassian.connector.eclipse.internal.crucible.ui.commons.CrucibleUserLabelProvider;
import com.atlassian.connector.eclipse.ui.viewers.ArrayTreeContentProvider;
import com.atlassian.theplugin.commons.crucible.api.model.User;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.mylyn.internal.provisional.commons.ui.SubstringPatternFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* Part containing a selection tree for reviewers
*
* @author Thomas Ehrnhoefer
*/
public class ReviewersSelectionTreePart {
private final Set<User> selectedReviewers;
private CheckboxFilteredTree tree;
private ICheckStateListener externalListener;
private final Collection<User> allReviewers;
private class CheckboxFilteredTree extends FilteredTree {
protected CheckboxFilteredTree(Composite parent) {
super(parent);
}
public CheckboxFilteredTree(Composite parent, int treeStyle, PatternFilter filter) {
super(parent, treeStyle, filter);
}
@Override
protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
return new CheckboxTreeViewer(parent, style);
}
@Override
public CheckboxTreeViewer getViewer() {
return (CheckboxTreeViewer) super.getViewer();
}
}
public ReviewersSelectionTreePart(Set<User> selectedUsers, Collection<User> allReviewers) {
selectedReviewers = selectedUsers == null ? new HashSet<User>() : new HashSet<User>(selectedUsers);
this.allReviewers = new HashSet<User>(allReviewers);
}
public void setCheckStateListener(ICheckStateListener listener) {
externalListener = listener;
}
public Composite createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout());
GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
composite.setLayoutData(gd);
tree = new CheckboxFilteredTree(composite, SWT.CHECK | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER,
new SubstringPatternFilter());
GridDataFactory.fillDefaults().grab(true, true).hint(SWT.DEFAULT, 250).applyTo(tree);
tree.getViewer().setContentProvider(ArrayTreeContentProvider.getInstance());
tree.getViewer().setInput(allReviewers);
// updateInput();
tree.getViewer().setLabelProvider(new CrucibleUserLabelProvider());
for (TreeItem item : tree.getViewer().getTree().getItems()) {
if (selectedReviewers.contains(item.getData())) {
item.setChecked(true);
}
}
tree.getViewer().setSorter(new ViewerSorter());
tree.getViewer().setCheckedElements(selectedReviewers.toArray(new User[selectedReviewers.size()]));
tree.getViewer().addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
selectedReviewers.add((User) event.getElement());
} else {
selectedReviewers.remove(event.getElement());
}
if (externalListener != null) {
externalListener.checkStateChanged(event);
}
}
});
parent.pack();
return composite;
}
public void setAllReviewers(Collection<User> allReviewers) {
this.allReviewers.clear();
this.allReviewers.addAll(allReviewers);
tree.getViewer().setInput(this.allReviewers);
}
public Set<User> getSelectedReviewers() {
return selectedReviewers;
}
}