/******************************************************************************* * Copyright (c) 2009, 2014 Ericsson, É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: * Francois Chouinard - Initial API and implementation * Geneviève Bastien - Moved the add and remove code to the experiment class * Patrick Tasse - Add support for folder elements *******************************************************************************/ package fr.inria.linuxtools.tmf.ui.project.wizards; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.Vector; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import fr.inria.linuxtools.internal.tmf.ui.Activator; import fr.inria.linuxtools.tmf.ui.project.model.ITmfProjectModelElement; import fr.inria.linuxtools.tmf.ui.project.model.TmfExperimentElement; import fr.inria.linuxtools.tmf.ui.project.model.TmfProjectElement; import fr.inria.linuxtools.tmf.ui.project.model.TmfTraceElement; import fr.inria.linuxtools.tmf.ui.project.model.TmfTraceFolder; import fr.inria.linuxtools.tmf.ui.project.model.TraceFolderContentProvider; import fr.inria.linuxtools.tmf.ui.project.model.TraceFolderLabelProvider; /** * Implementation of a wizard page for selecting trace for an experiment. * <p> * * @version 1.0 * @author Francois Chouinard */ public class SelectTracesWizardPage extends WizardPage { // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ private final TmfProjectElement fProject; private final TmfExperimentElement fExperiment; private Map<String, TmfTraceElement> fPreviousTraces; private CheckboxTableViewer fCheckboxTableViewer; // ------------------------------------------------------------------------ // Constructor // ------------------------------------------------------------------------ /** * Constructor * @param project The project model element. * @param experiment The experiment model experiment. */ protected SelectTracesWizardPage(TmfProjectElement project, TmfExperimentElement experiment) { super(""); //$NON-NLS-1$ setTitle(Messages.SelectTracesWizardPage_WindowTitle); setDescription(Messages.SelectTracesWizardPage_Description); fProject = project; fExperiment = experiment; } // ------------------------------------------------------------------------ // Dialog // ------------------------------------------------------------------------ @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); container.setLayout(new FormLayout()); setControl(container); fCheckboxTableViewer = CheckboxTableViewer.newCheckList(container, SWT.BORDER); fCheckboxTableViewer.setContentProvider(new TraceFolderContentProvider()); fCheckboxTableViewer.setLabelProvider(new TraceFolderLabelProvider()); fCheckboxTableViewer.setSorter(new ViewerSorter()); final Table table = fCheckboxTableViewer.getTable(); final FormData formData = new FormData(); formData.bottom = new FormAttachment(100, 0); formData.right = new FormAttachment(100, 0); formData.top = new FormAttachment(0, 0); formData.left = new FormAttachment(0, 0); table.setLayoutData(formData); table.setHeaderVisible(true); final TableColumn tableColumn = new TableColumn(table, SWT.NONE); tableColumn.setWidth(200); tableColumn.setText(Messages.SelectTracesWizardPage_TraceColumnHeader); // Get the list of traces already part of the experiment fPreviousTraces = new HashMap<>(); for (ITmfProjectModelElement child : fExperiment.getChildren()) { if (child instanceof TmfTraceElement) { TmfTraceElement trace = (TmfTraceElement) child; String name = trace.getElementPath(); fPreviousTraces.put(name, trace); } } // Populate the list of traces to choose from Set<String> keys = fPreviousTraces.keySet(); TmfTraceFolder traceFolder = fProject.getTracesFolder(); fCheckboxTableViewer.setInput(traceFolder); // Set the checkbox for the traces already included int index = 0; Object element = fCheckboxTableViewer.getElementAt(index++); while (element != null) { if (element instanceof TmfTraceElement) { TmfTraceElement trace = (TmfTraceElement) element; if (keys.contains(trace.getElementPath())) { fCheckboxTableViewer.setChecked(element, true); } } element = fCheckboxTableViewer.getElementAt(index++); } } /** * Method to finalize the select operation. * @return <code>true</code> if successful else <code>false</code> */ public boolean performFinish() { IFolder experiment = fExperiment.getResource(); boolean changed = false; // Add the selected traces to the experiment Set<String> keys = fPreviousTraces.keySet(); TmfTraceElement[] traces = getSelection(); for (TmfTraceElement trace : traces) { String name = trace.getElementPath(); if (keys.contains(name)) { fPreviousTraces.remove(name); } else { fExperiment.addTrace(trace); changed = true; } } // Remove traces that were unchecked (thus left in fPreviousTraces) keys = fPreviousTraces.keySet(); for (String key : keys) { try { fExperiment.removeTrace(fPreviousTraces.get(key)); } catch (CoreException e) { Activator.getDefault().logError("Error selecting traces for experiment " + experiment.getName(), e); //$NON-NLS-1$ } changed = true; } if (changed) { fExperiment.closeEditors(); fExperiment.deleteSupplementaryResources(); } return true; } /** * Get the list of selected traces */ private TmfTraceElement[] getSelection() { Vector<TmfTraceElement> traces = new Vector<>(); Object[] selection = fCheckboxTableViewer.getCheckedElements(); for (Object sel : selection) { if (sel instanceof TmfTraceElement) { traces.add((TmfTraceElement) sel); } } TmfTraceElement[] result = new TmfTraceElement[traces.size()]; traces.toArray(result); return result; } }