blob: e0713b1c5860326d3fcfbd28cfa0342961ebd75d [file] [log] [blame]
/*******************************************************************************
* 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 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:
* 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.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
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(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;
}
}