/******************************************************************************* * Copyright (c) 2013, 2014 Ericsson * * 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: * Matthew Khouzam - Initial API and implementation *******************************************************************************/ package fr.inria.linuxtools.internal.tmf.ui.project.wizards.importtrace; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; 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.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.IWorkbench; import fr.inria.linuxtools.tmf.core.project.model.TraceTypeHelper; /** * <b>Select trace types to import</b>, this page is the first of three pages * shown. This one selects the type of traces that are to be scanned. * * @author Matthew Khouzam * @since 2.0 */ public class ImportTraceWizardSelectTraceTypePage extends AbstractImportTraceWizardPage { private CheckboxTreeViewer fTreeView; private final TraceTypeContentProvider fProvider = new TraceTypeContentProvider(); /** * Select trace types to import * * @param name * The name of the page. * @param selection * The current selection */ protected ImportTraceWizardSelectTraceTypePage(String name, IStructuredSelection selection) { super(name, selection); } /** * Select trace types to import * * @param workbench * The workbench reference. * @param selection * The current selection */ public ImportTraceWizardSelectTraceTypePage(IWorkbench workbench, IStructuredSelection selection) { super(workbench, selection); } @Override public void createControl(Composite parent) { super.createControl(parent); Composite control = (Composite) this.getControl(); final ICheckStateListener listener = new TraceTypeCheckListener(); setTitle(Messages.ImportTraceWizardSelectTraceTypePageTitle); fTreeView = new CheckboxTreeViewer(control, SWT.BORDER); fTreeView.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); fTreeView.setContentProvider(fProvider); fTreeView.setInput(fProvider); fTreeView.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { return element.toString(); } }); fTreeView.addCheckStateListener(listener); // populateTree(treeView); Composite buttonArea = new Composite(control, SWT.NONE); buttonArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); buttonArea.setLayout(new GridLayout(2, false)); Button selectAll = new Button(buttonArea, SWT.NONE); selectAll.setText(Messages.ImportTraceWizardSelectAll); selectAll.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false)); selectAll.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { String elements[] = (String[]) ((ITreeContentProvider) fTreeView.getContentProvider()).getElements(null); for (String key : elements) { fTreeView.setSubtreeChecked(key, true); } getWizard().getContainer().updateButtons(); } }); Button selectNone = new Button(buttonArea, SWT.NONE); selectNone.setText(Messages.ImportTraceWizardPageSelectNone); selectNone.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); selectNone.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { String elements[] = (String[]) ((ITreeContentProvider) fTreeView.getContentProvider()).getElements(null); for (String key : elements) { fTreeView.setSubtreeChecked(key, false); } getWizard().getContainer().updateButtons(); } }); fTreeView.expandAll(); } @Override public boolean canFlipToNextPage() { List<String> tracesToScan = new ArrayList<>(); String elements[] = (String[]) fProvider.getElements(null); for (String traceFamily : elements) { final TraceTypeHelper[] children = (TraceTypeHelper[]) fProvider.getChildren(traceFamily); if (children != null) { for (TraceTypeHelper traceType : children) { if (fTreeView.getChecked(traceType)) { tracesToScan.add(traceType.getCanonicalName()); } } } } ((BatchImportTraceWizard) getWizard()).setTraceTypesToScan(tracesToScan); if (tracesToScan.isEmpty()) { setErrorMessage(Messages.ImportTraceWizardPageSelectHint); } else { setErrorMessage(null); } return super.canFlipToNextPage() && !tracesToScan.isEmpty(); } private final class TraceTypeCheckListener implements ICheckStateListener { @Override public void checkStateChanged(CheckStateChangedEvent event) { boolean checkStatus = event.getChecked(); Object element = event.getElement(); fTreeView.setGrayed(element, false); fTreeView.setSubtreeChecked(element, checkStatus); ITreeContentProvider tcp = (ITreeContentProvider) fTreeView.getContentProvider(); String parentElement = (String) tcp.getParent(element); if (parentElement != null) { TraceTypeHelper[] siblings = (TraceTypeHelper[]) tcp.getChildren(parentElement); final TraceTypeHelper first = siblings[0]; final boolean isFirstChecked = fTreeView.getChecked(first); boolean allSame = true; for (TraceTypeHelper peer : siblings) { final boolean peerChecked = fTreeView.getChecked(peer); if (peerChecked != isFirstChecked) { allSame = false; } } if (allSame) { fTreeView.setGrayed(parentElement, false); fTreeView.setChecked(parentElement, checkStatus); } else { fTreeView.setChecked(parentElement, false); fTreeView.setGrayed(parentElement, true); } } getWizard().getContainer().updateButtons(); } } }