package org.eclipse.linuxtools.internal.tmf.ui.project.dialogs;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map.Entry;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.linuxtools.internal.tmf.ui.Activator;
+import org.eclipse.linuxtools.tmf.ui.project.model.TmfCommonProjectElement;
+import org.eclipse.linuxtools.tmf.ui.project.model.TmfExperimentElement;
+import org.eclipse.linuxtools.tmf.ui.project.model.TmfTraceElement;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
+import com.google.common.collect.Multimap;
+
/**
* SelectSupplementaryResourcesDialog
*/
public class SelectSupplementaryResourcesDialog extends Dialog {
+ // ------------------------------------------------------------------------
+ // Constants
+ // ------------------------------------------------------------------------
+ private static final Image EXPERIMENT_IMAGE = Activator.getDefault().getImageFromPath("icons/elcl16/experiment.gif"); //$NON-NLS-1$
+ private static final Image TRACE_IMAGE = Activator.getDefault().getImageFromPath("icons/elcl16/trace.gif"); //$NON-NLS-1$
+ private static final Image RESOURCE_IMAGE = PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
+
// ------------------------------------------------------------------------
// Members
// ------------------------------------------------------------------------
private CheckboxTreeViewer fTreeViewer;
- private final IResource[] fAvailableResources;
- private IResource[] fReturndResources;
+ private final Multimap<TmfCommonProjectElement, IResource> fResourceMap;
+ private IResource[] fReturnedResources;
// ------------------------------------------------------------------------
// Constructor
*
* @param shell
* Parent shell of this dialog
- * @param resources
- * Available resources
+ * @param resourceMap
+ * Map of element to supplementary resources
*/
- public SelectSupplementaryResourcesDialog(Shell shell, IResource[] resources) {
+ public SelectSupplementaryResourcesDialog(Shell shell, Multimap<TmfCommonProjectElement, IResource> resourceMap) {
super(shell);
- fAvailableResources = Arrays.copyOf(resources, resources.length);
+ fResourceMap = resourceMap;
setShellStyle(SWT.RESIZE | getShellStyle());
}
// ------------------------------------------------------------------------
/**
- * @return A copy of the resources
+ * @return A copy of the selected resources
*/
public IResource[] getResources() {
- return Arrays.copyOf(fReturndResources, fReturndResources.length);
+ return Arrays.copyOf(fReturnedResources, fReturnedResources.length);
}
// ------------------------------------------------------------------------
@Override
public boolean hasChildren(Object element) {
- return false;
+ return element instanceof TmfCommonProjectElement;
}
@Override
public Object getParent(Object element) {
+ if (element instanceof IResource) {
+ getParentElement((IResource) element);
+ }
return null;
}
@Override
public Object[] getElements(Object inputElement) {
- if (inputElement instanceof IResource[]) {
+ if (inputElement instanceof Object[]) {
return (Object[]) inputElement;
}
return null;
@Override
public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof TmfCommonProjectElement) {
+ return fResourceMap.get((TmfCommonProjectElement) parentElement).toArray();
+ }
return null;
}
});
public String getText(Object element) {
if (element instanceof IResource) {
IResource resource = (IResource) element;
- // remove .tracing/ segment
- return resource.getProjectRelativePath().removeFirstSegments(1).toString();
+ TmfCommonProjectElement projectElement = getParentElement(resource);
+ // remove .tracing/<supplementary folder> segments
+ IPath suppFolderPath = projectElement.getTraceSupplementaryFolder(projectElement.getElementPath()).getFullPath();
+ return resource.getFullPath().removeFirstSegments(suppFolderPath.segmentCount()).toString();
+ } else if (element instanceof TmfCommonProjectElement) {
+ TmfCommonProjectElement projectElement = (TmfCommonProjectElement) element;
+ return projectElement.getElementPath();
}
return super.getText(element);
}
+
+ @Override
+ public Image getImage(Object element) {
+ if (element instanceof IResource) {
+ return RESOURCE_IMAGE;
+ } else if (element instanceof TmfTraceElement) {
+ return TRACE_IMAGE;
+ } else if (element instanceof TmfExperimentElement) {
+ return EXPERIMENT_IMAGE;
+ }
+ return null;
+ }
+
});
- fTreeViewer.setInput(fAvailableResources);
+ fTreeViewer.setInput(fResourceMap.keySet().toArray());
+ fTreeViewer.expandAll();
setAllChecked(true);
- fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ fTreeViewer.addCheckStateListener(new ICheckStateListener() {
+ @Override
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ if (event.getElement() instanceof TmfCommonProjectElement) {
+ fTreeViewer.setSubtreeChecked(event.getElement(), event.getChecked());
+ fTreeViewer.setGrayed(event.getElement(), false);
+ } else if (event.getElement() instanceof IResource) {
+ TmfCommonProjectElement projectElement = getParentElement((IResource) event.getElement());
+ int checkedCount = 0;
+ Collection<IResource> resources = fResourceMap.get(projectElement);
+ for (IResource resource : resources) {
+ if (fTreeViewer.getChecked(resource)) {
+ checkedCount++;
+ }
+ }
+ if (checkedCount == resources.size()) {
+ fTreeViewer.setChecked(projectElement, true);
+ fTreeViewer.setGrayed(projectElement, false);
+ } else if (checkedCount > 0) {
+ fTreeViewer.setGrayChecked(projectElement, true);
+ } else {
+ fTreeViewer.setGrayChecked(projectElement, false);
+ }
+ }
+ }
+ });
+ fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateOKButtonEnablement();
return composite;
}
+ private TmfCommonProjectElement getParentElement(IResource resource) {
+ for (Entry<TmfCommonProjectElement, IResource> entry : fResourceMap.entries()) {
+ if (entry.getValue().equals(resource)) {
+ return entry.getKey();
+ }
+ }
+ return null;
+ }
+
private void setAllChecked(boolean state) {
- for (Object element : fAvailableResources) {
- fTreeViewer.setChecked(element, state);
+ for (Object element : fResourceMap.keySet()) {
+ fTreeViewer.setSubtreeChecked(element, state);
+ fTreeViewer.setGrayed(element, false);
}
}
@Override
protected void okPressed() {
- Object[] checked = fTreeViewer.getCheckedElements();
-
- fReturndResources = new IResource[checked.length];
- for (int i = 0; i < checked.length; i++) {
- fReturndResources[i] = (IResource) checked[i];
+ Object[] checkedElements = fTreeViewer.getCheckedElements();
+ List<IResource> checkedResources = new ArrayList<>(checkedElements.length);
+ for (Object checked : checkedElements) {
+ if (checked instanceof IResource) {
+ checkedResources.add((IResource) checked);
+ }
}
+ fReturnedResources = checkedResources.toArray(new IResource[0]);
super.okPressed();
}