blob: 80ef2d3f022fc40f98e27b52393c804cc02c0b05 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2005, 2014 IBM Corporation, Ericsson
* 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:
* IBM - Initial API and implementation
* Bernd Hufmann - Updated for TMF
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.SDView;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.handlers.provider.ISDFilterProvider;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.util.Messages;
import org.eclipse.ui.IViewPart;
/**
* This is the filters list dialog.<br>
* It is associated to an SDView and to a ISDFilterProvider.<br>
*
* @version 1.0
* @author sveyrier
*/
public class FilterListDialog extends Dialog {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
/**
* Filter list criteria property name
*/
protected static final String FILTERS_LIST_CRITERIA = "filtersListsCriteria"; //$NON-NLS-1$
/**
* Filter list size property name
*/
protected static final String FILTERS_LIST_SIZE = "filtersListSize"; //$NON-NLS-1$
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The viewer and provided are kept here as attributes
*/
private final IViewPart fViewer;
/**
* The filter provider implementation
*/
private final ISDFilterProvider fProvider;
/**
* The filters are the result of editing this list
*/
private List<FilterCriteria> fFilters;
/**
* The add button.
*/
private Button fAdd;
/**
* The remove button.
*/
private Button fRemove;
/**
* The edit button.
*/
private Button fEdit;
/**
* The table with list of filters.
*/
private Table fTable;
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
/**
* Standard constructor
*
* @param view The view reference
* @param loader The filter provider implementation
*/
public FilterListDialog(IViewPart view, ISDFilterProvider loader) {
super(view.getSite().getShell());
fViewer = view;
fProvider = loader;
fFilters = null;
setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
}
// ------------------------------------------------------------------------
// Methods
// ------------------------------------------------------------------------
/**
* Adds a criteria to the table
*
* @param criteria A criteria to add
* @param checked A flag whether criteria is checked (selected) or not
* @param positive A flag whether criteria is for positive filter or not
* @param loaderClassName A loader class name for the filters
*/
protected void addCriteria(Criteria criteria, boolean checked, boolean positive, String loaderClassName) {
CriteriaTableItem cti = new CriteriaTableItem(fTable, checked, positive, loaderClassName);
cti.setCriteria(criteria);
}
/**
* Replaces a selected criteria with a new criteria.
*
* @param newCriteria A new criteria.
*/
protected void replaceSelectedCriteria(Criteria newCriteria) {
CriteriaTableItem cti = (CriteriaTableItem) fTable.getSelection()[0].getData();
cti.setCriteria(newCriteria);
}
/**
* Handles table selection count.
*/
protected void handleTableSelectionCount() {
int count = fTable.getSelectionCount();
fEdit.setEnabled(count == 1);
fRemove.setEnabled(count > 0);
}
@Override
public Control createDialogArea(Composite parent) {
Group ret = new Group(parent, SWT.NONE);
ret.setText(Messages.SequenceDiagram_ListOfHideDisplayPatterns);
RowLayout rowLayout = new RowLayout();
rowLayout.wrap = false;
rowLayout.pack = true;
rowLayout.justify = false;
rowLayout.type = SWT.HORIZONTAL;
rowLayout.marginLeft = 4;
rowLayout.marginTop = 4;
rowLayout.marginRight = 4;
rowLayout.marginBottom = 4;
rowLayout.spacing = 8;
ret.setLayout(rowLayout);
fTable = new Table(ret, SWT.MULTI | SWT.CHECK);
fTable.setLayoutData(new RowData(220, 84));
fTable.setHeaderVisible(false);
fTable.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
int count = fTable.getSelectionCount();
if (count == 1) {
Criteria criteria = openFilterDialog(((CriteriaTableItem) fTable.getSelection()[0].getData()).getCriteria(), Messages.SequenceDiagram_Update);
if (criteria != null) {
replaceSelectedCriteria(criteria);
}
}
}
@Override
public void widgetSelected(SelectionEvent e) {
handleTableSelectionCount();
}
});
if (fFilters != null) {
for (Iterator<FilterCriteria> i = fFilters.iterator(); i.hasNext();) {
FilterCriteria filterCriteria = i.next();
addCriteria(filterCriteria.getCriteria(), filterCriteria.isActive(), filterCriteria.isPositive(), filterCriteria.getLoaderClassName());
}
}
Composite commands = new Composite(ret, SWT.NONE);
RowLayout rowLayoutCommands = new RowLayout();
rowLayoutCommands.wrap = false;
rowLayoutCommands.pack = false;
rowLayoutCommands.justify = true;
rowLayoutCommands.type = SWT.VERTICAL;
rowLayoutCommands.marginLeft = 0;
rowLayoutCommands.marginTop = 4;
rowLayoutCommands.marginRight = 0;
rowLayoutCommands.marginBottom = 4;
rowLayoutCommands.spacing = 8;
commands.setLayout(rowLayoutCommands);
fAdd = new Button(commands, SWT.NONE);
fAdd.setText(Messages.SequenceDiagram_Add);
fAdd.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// Nothing to do
}
@Override
public void widgetSelected(SelectionEvent e) {
Criteria init = new Criteria();
Criteria c = openFilterDialog(init, Messages.SequenceDiagram_Create);
if (c != null) {
addCriteria(c, true, false, null);
}
}
});
fEdit = new Button(commands, SWT.NONE);
fEdit.setText(Messages.SequenceDiagram_EditIt);
fEdit.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// Nothing to do
}
@Override
public void widgetSelected(SelectionEvent e) {
Criteria c = openFilterDialog(((CriteriaTableItem) fTable.getSelection()[0].getData()).getCriteria(), Messages.SequenceDiagram_Update);
if (c != null) {
replaceSelectedCriteria(c);
}
}
});
fEdit.setEnabled(false);
fRemove = new Button(commands, SWT.NONE);
fRemove.setText(Messages.SequenceDiagram_Remove);
fRemove.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// Nothing to do
}
@Override
public void widgetSelected(SelectionEvent e) {
fTable.remove(fTable.getSelectionIndices());
handleTableSelectionCount();
}
});
fRemove.setEnabled(false);
getShell().setText(Messages.SequenceDiagram_SequenceDiagramHidePatterns);
/*
* for (int i=0;i<filters.size();i++) { if (filters.get(i) instanceof FilterCriteria)
* addCriteria(((FilterCriteria)filters.get(i)).getCriteria(),true); }
*/
return ret;
}
/**
* Opens the filter dialog box with given parameter.
*
* @param criteria The criteria reference to pass
* @param action to distinguish between "Update" and "Create"
* @return the criteria that has been updated or created
*/
protected Criteria openFilterDialog(Criteria criteria, String action) {
SearchFilterDialog filter = new SearchFilterDialog((SDView) fViewer, fProvider, true, SWT.APPLICATION_MODAL);
filter.setCriteria(criteria);
filter.setOkText(action);
filter.setTitle(Messages.SequenceDiagram_DefinitionOfHidePattern);
filter.open();
return filter.getCriteria();
}
@Override
public int open() {
create();
getShell().pack();
getShell().setLocation(getShell().getDisplay().getCursorLocation());
loadFiltersCriteria();
return super.open();
}
@Override
public void okPressed() {
if (fTable.getItemCount() > 0) {
fFilters = new ArrayList<>();
} else {
fFilters = null;
}
for (int i = 0; i < fTable.getItemCount(); i++) {
TableItem item = fTable.getItem(i);
CriteriaTableItem cti = (CriteriaTableItem) item.getData();
FilterCriteria fc = new FilterCriteria(cti.getCriteria(), item.getChecked(), cti.isPositive(), cti.getLoaderClassName());
FilterCriteria efc = FilterCriteria.find(fc, fFilters);
if (efc == null) {
fFilters.add(fc);
} else {
efc.setActive(efc.isActive() || fc.isActive());
}
}
super.close();
fProvider.filter(fFilters);
saveFiltersCriteria(fFilters);
}
/**
* Sets the list of filters.
*
* @param filters The list of filters to set.
*/
public void setFilters(List<FilterCriteria> filters) {
fFilters = filters;
}
/**
* Returns the filters list after editing.
*
* @return the filters list after editing
*/
public List<FilterCriteria> getFilters() {
return fFilters;
}
/**
* Loads the filter criteria from global filters which are saved in the dialog settings.
*/
protected void loadFiltersCriteria() {
List<FilterCriteria> globalFilters = getGlobalFilters();
for (Iterator<FilterCriteria> i = globalFilters.iterator(); i.hasNext();) {
FilterCriteria filterCriteria = i.next();
addCriteria(filterCriteria.getCriteria(), filterCriteria.isActive(), filterCriteria.isPositive(), filterCriteria.getLoaderClassName());
}
}
/**
* Returns the global filters which are saved in the dialog settings..
*
* @return the saved global filters
*/
public static List<FilterCriteria> getGlobalFilters() {
DialogSettings settings = (DialogSettings) Activator.getDefault().getDialogSettings().getSection(FILTERS_LIST_CRITERIA);
int i = 0;
DialogSettings section = null;
int size = 0;
List<FilterCriteria> globalFilters = new ArrayList<>();
if (settings != null) {
try {
size = settings.getInt(FILTERS_LIST_SIZE);
} catch (NumberFormatException e) {
// This is not a problem
size = 0;
}
section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA + i);
while ((section != null) && (i < size)) {
FilterCriteria criteria = new FilterCriteria();
criteria.setCriteria(new Criteria());
criteria.load(section);
globalFilters.add(criteria);
section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA + (++i));
}
}
return globalFilters;
}
/**
* Saves the filter criteria in the dialog settings.
*
* @param globalFilters A list of filters to save.
*/
public static void saveFiltersCriteria(List<FilterCriteria> globalFilters) {
DialogSettings settings = (DialogSettings) Activator.getDefault().getDialogSettings();
DialogSettings section = (DialogSettings) settings.getSection(FILTERS_LIST_CRITERIA);
if (section == null) {
section = (DialogSettings) settings.addNewSection(FILTERS_LIST_CRITERIA);
}
if (globalFilters == null) {
section.put(FILTERS_LIST_SIZE, 0);
return;
}
section.put(FILTERS_LIST_SIZE, globalFilters.size());
FilterCriteria criteria;
for (int j = 0; j < globalFilters.size(); j++) {
if (globalFilters.get(j) == null) {
return;
}
criteria = globalFilters.get(j);
DialogSettings subSection = (DialogSettings) section.getSection(FILTERS_LIST_CRITERIA + j);
if (subSection == null) {
subSection = (DialogSettings) section.addNewSection(FILTERS_LIST_CRITERIA + j);
}
criteria.save(subSection);
}
}
/**
* Deactivates the saved global filters.
*/
public static void deactivateSavedGlobalFilters() {
// Deactivate all filters
List<FilterCriteria> filters = getGlobalFilters();
for(FilterCriteria criteria : filters) {
criteria.setActive(false);
}
// Save settings
FilterListDialog.saveFiltersCriteria(filters);
}
// ------------------------------------------------------------------------
// Helper classes
// ------------------------------------------------------------------------
/**
* A class to map TableItems that can be toggled active or inactive and Criteria
*/
protected class CriteriaTableItem {
/**
* The criteria reference
*/
protected Criteria fCriteria;
/**
* The "positive" value.
*/
protected boolean fIsPositive;
/**
* The loader class name
*/
protected String fLoaderClassName;
/**
* The actual table item.
*/
protected TableItem fTableItem;
/**
* Constructor
*
* @param parent The parent table
* @param isActive <code>true</code> if filter criteria is active else <code>false</code>
* @param isPositive <code>true</code> for positive filter else <code>false</code>
* @param loaderClassName The loader class name
*/
public CriteriaTableItem(Table parent, boolean isActive, boolean isPositive, String loaderClassName) {
fTableItem = new TableItem(parent, SWT.NONE);
fTableItem.setData(this);
fTableItem.setChecked(isActive);
fIsPositive = isPositive;
fLoaderClassName = loaderClassName;
}
/**
* Constructor
*
* @param parent The parent table
* @param isActive <code>true</code> if filter criteria is active else <code>false</code>
* @param isPositive <code>true</code> for positive filter else <code>false</code>
* @param loaderClassName The loader class name
* @param index The table item index
*/
public CriteriaTableItem(Table parent, boolean isActive, boolean isPositive, String loaderClassName, int index) {
fTableItem = new TableItem(parent, SWT.NONE, index);
fTableItem.setChecked(isActive);
fIsPositive = isPositive;
fLoaderClassName = loaderClassName;
}
/**
* Sets the criteria.
*
* @param criteria The criteria to set
*/
public void setCriteria(Criteria criteria) {
fCriteria = criteria;
fTableItem.setText((fIsPositive ? Messages.SequenceDiagram_display : Messages.SequenceDiagram_hide) + " " + fCriteria.getExpression() + " " + fCriteria.getGraphNodeSummary(fProvider, fLoaderClassName)); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Returns the criteria.
* @return the criteria
*/
public Criteria getCriteria() {
return fCriteria;
}
/**
* Returns whether positive filtering is active or not.
*
* @return <code>true</code> for positive filter else <code>false</code>
*/
public boolean isPositive() {
return fIsPositive;
}
/**
* Returns the loader class name.
*
* @return the loader class name
*/
public String getLoaderClassName() {
return fLoaderClassName;
}
}
}