/******************************************************************************* * Copyright (c) 2015 École Polytechnique de Montréal * * 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: * Cédric Biancheri - Initial API and implementation *******************************************************************************/ package org.eclipse.tracecompass.tmf.ui.project.wizards; import java.util.ArrayList; import java.util.List; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfNavigatorContentProvider; import org.eclipse.tracecompass.tmf.ui.project.model.TmfNavigatorLabelProvider; import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement; import org.eclipse.ui.dialogs.FilteredTree; import org.eclipse.ui.dialogs.PatternFilter; /** * Implementation of a wizard page for selecting a root node for * synchronization. * * @author Cedric Biancheri * @since 2.0 * */ public class SelectRootNodeWizardPage extends WizardPage { // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ private final TmfExperimentElement fExperiment; private CheckboxTreeViewer fCheckboxTreeViewer; private TmfNavigatorContentProvider fContentProvider; private TmfNavigatorLabelProvider fLabelProvider; private TmfTraceElement rootNode; // ------------------------------------------------------------------------ // Constructor // ------------------------------------------------------------------------ /** * @param experiment * The experiment where the synchronization will be made. */ protected SelectRootNodeWizardPage(TmfExperimentElement experiment) { super(""); //$NON-NLS-1$ fExperiment = experiment; } @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); container.setLayout(new GridLayout(2, false)); setControl(container); setTitle(Messages.SelectRootNodeWizardPage_WindowTitle); setDescription(Messages.SelectRootNodeWizardPage_Description); new FilteredTree(container, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter(), true) { @Override protected TreeViewer doCreateTreeViewer(Composite aparent, int style) { return SelectRootNodeWizardPage.this.doCreateTreeViewer(aparent); } }; } private TreeViewer doCreateTreeViewer(Composite parent) { fCheckboxTreeViewer = new CheckboxTreeViewer(parent, SWT.BORDER); fContentProvider = new TmfNavigatorContentProvider() { @Override public Object[] getElements(Object inputElement) { return getChildren(inputElement); } @Override public synchronized Object[] getChildren(Object parentElement) { if (parentElement instanceof TmfExperimentElement) { return ((TmfExperimentElement) parentElement).getTraces().toArray(); } return null; } @Override public boolean hasChildren(Object element) { if (element instanceof TmfExperimentElement) { return !(((TmfExperimentElement) element).getTraces().isEmpty()); } return false; } }; fCheckboxTreeViewer.setContentProvider(fContentProvider); fLabelProvider = new TmfNavigatorLabelProvider(); fCheckboxTreeViewer.setLabelProvider(fLabelProvider); fCheckboxTreeViewer.setComparator(new ViewerComparator()); final Tree tree = fCheckboxTreeViewer.getTree(); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); tree.setLayoutData(gd); tree.setHeaderVisible(true); final TreeViewerColumn column = new TreeViewerColumn(fCheckboxTreeViewer, SWT.NONE); column.getColumn().setText(Messages.SelectRootNodeWizardPage_TraceColumnHeader); column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return fLabelProvider.getText(element); } @Override public Image getImage(Object element) { return fLabelProvider.getImage(element); } }); // Populate the list of traces from the experiment fCheckboxTreeViewer.setInput(fExperiment); column.getColumn().pack(); fCheckboxTreeViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { Object element = event.getElement(); // Uncheck all elements for (Object checkedElement : fCheckboxTreeViewer.getCheckedElements()) { fCheckboxTreeViewer.setChecked(checkedElement, false); } fCheckboxTreeViewer.setChecked(element, event.getChecked()); setPageComplete(event.getChecked()); } }); setPageComplete(true); // Checks the first element by default fCheckboxTreeViewer.getTree().getItem(0).setChecked(true); return fCheckboxTreeViewer; } /** * Method to finalize the select operation. * * @return <code>true</code> if successful. Should always be successful. */ public boolean performFinish() { TmfTraceElement[] selection = getSelection(); if (selection.length > 0 && selection[0] != null) { setRootNode(selection[0]); } return true; } /** * Get the list of selected traces */ private @NonNull TmfTraceElement[] getSelection() { List<TmfTraceElement> traces = new ArrayList<>(); Object[] selection = fCheckboxTreeViewer.getCheckedElements(); for (Object sel : selection) { if (sel instanceof TmfTraceElement) { traces.add((TmfTraceElement) sel); } } return traces.toArray(new @NonNull TmfTraceElement[0]); } /** * Gets the root node. * * @return The root node */ public TmfTraceElement getRootNode() { return rootNode; } /** * Sets the root node * * @param rootNode * The root node */ private void setRootNode(TmfTraceElement rootNode) { this.rootNode = rootNode; } }