blob: 120411909d458d2effbbc951e0d72b0ec7d1e470 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
*
* 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:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and Implementation
*******************************************************************************/
package org.eclipse.efm.execution.configuration.common.ui.page.overview;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.efm.execution.configuration.common.ui.api.AbstractConfigurationPage;
import org.eclipse.efm.execution.configuration.common.ui.api.AbstractConfigurationProfile;
import org.eclipse.efm.execution.configuration.common.ui.api.IWidgetToolkit;
import org.eclipse.efm.execution.configuration.common.ui.editors.BooleanFieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class OverviewTransitionCoverageConfigurationProfile extends AbstractConfigurationProfile {
public BooleanFieldEditor fEnabledDetailedSelectionBooleanField;
public Composite fCompDetailedSelection;
private Table fAllTransitionsListTable;
private TableColumn fAllTransitionsListTableColumn;
private Table fSelectedTransitionsTable;
private TableColumn fSelectedTransitionsTableColumn;
private List< String > fAllTransitionsList;
private List< String > fSelectedTransitionsList;
private String fModelFilePath;
/**
* Constructor
* @param parentTab
*/
public OverviewTransitionCoverageConfigurationProfile(AbstractConfigurationPage configurationPage) {
super(configurationPage);
fModelFilePath = null;
}
@Override
public String getSectionTitle() {
return "Transition Coverage";
}
@Override
public String getSectionDescription() {
return "Transition Coverage, configuration section";
}
@Override
protected void createContent(Composite parent, IWidgetToolkit widgetToolkit)
{
fEnabledDetailedSelectionBooleanField =
new BooleanFieldEditor(fConfigurationPage,
ATTR_ENABLED_TRANSITION_COVERAGE_DETAILS_SELECTION,
"&Enable Transitions Selection", parent, false);
fEnabledDetailedSelectionBooleanField.addSelectionListener(
new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleEnablingDetailedSelection();
}
});
// ==================================================================================
fCompDetailedSelection = widgetToolkit.createComposite(
parent, 2, 1, GridData.FILL_HORIZONTAL);
fAllTransitionsListTable = new Table(
fCompDetailedSelection, SWT.CHECK | SWT.BORDER);
fAllTransitionsListTableColumn =
new TableColumn (fAllTransitionsListTable, SWT.NONE);
fAllTransitionsListTableColumn.setText("Transitions List");
fAllTransitionsListTable.setHeaderVisible(true);
fSelectedTransitionsTable =
new Table(fCompDetailedSelection, SWT.BORDER);
fSelectedTransitionsTableColumn =
new TableColumn(fSelectedTransitionsTable, SWT.NONE);
fSelectedTransitionsTableColumn.setText("Selected transitions");
fSelectedTransitionsTable.setHeaderVisible(true);
// ==================================================================================
/*
fCompDetailedSelection = SWTFactory.createComposite(
parent, 2, 1, GridData.FILL_HORIZONTAL);
ScrolledComposite scrolledComposite1 = new ScrolledComposite(
fCompDetailedSelection, SWT.H_SCROLL | SWT.V_SCROLL);
scrolledComposite1.setLayout(new GridLayout());
scrolledComposite1.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
fAllTransitionsListTable = new Table(scrolledComposite1,
SWT.CHECK | SWT.BORDER);
fAllTransitionsListTable.setHeaderVisible(true);
scrolledComposite1.setContent(fAllTransitionsListTable);
scrolledComposite1.setExpandHorizontal(true);
scrolledComposite1.setExpandVertical(true);
scrolledComposite1.setMinSize(
fAllTransitionsListTable.computeSize(SWT.DEFAULT, SWT.DEFAULT));
ScrolledComposite scrolledComposite2 = new ScrolledComposite(
fCompDetailedSelection, SWT.H_SCROLL | SWT.V_SCROLL);
scrolledComposite2.setLayout(new GridLayout());
scrolledComposite2.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
fSelectedTransitionsTable = new Table(scrolledComposite2, SWT.BORDER);
fSelectedTransitionsTable.setHeaderVisible(true);
scrolledComposite2.setContent(fSelectedTransitionsTable);
scrolledComposite2.setExpandHorizontal(true);
scrolledComposite2.setExpandVertical(true);
scrolledComposite2.setMinSize(
fSelectedTransitionsTable.computeSize(
SWT.DEFAULT, SWT.DEFAULT));
fAllTransitionsListTableColumn =
new TableColumn(fAllTransitionsListTable, SWT.NONE);
fAllTransitionsListTableColumn.setText("Transitions to be selected");
fAllTransitionsListTableColumn.setWidth(10);
fSelectedTransitionsTableColumn =
new TableColumn(fSelectedTransitionsTable, SWT.NONE);
fSelectedTransitionsTableColumn.setText("Selected transitions");
fSelectedTransitionsTableColumn.setWidth(10);
*/
// ==================================================================================
int listHeight = fAllTransitionsListTable.getItemHeight() * 10;
Rectangle trim =
fAllTransitionsListTable.computeTrim(0, 0, 0, listHeight);
GridData gridDataLeft = new GridData();
gridDataLeft.heightHint = trim.height;
gridDataLeft.horizontalIndent = 0;
gridDataLeft.verticalIndent = 10;
fAllTransitionsListTable.setLayoutData(gridDataLeft);
GridData gridDataRight = new GridData();
gridDataRight.heightHint = trim.height;
gridDataRight.horizontalIndent = 0;
gridDataRight.verticalIndent = 10;
fSelectedTransitionsTable.setLayoutData(gridDataRight);
fAllTransitionsListTable.addSelectionListener(
new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean refresh = false;
if( e.item instanceof TableItem )
{
TableItem selectedItem = (TableItem)( e.item );
String strItem = selectedItem.getText();
if( selectedItem.getChecked() )
{
if( ! fSelectedTransitionsList.contains(strItem) )
{
fSelectedTransitionsList.add(strItem);
refresh = true;
}
}
else if( fSelectedTransitionsList.contains(strItem) )
{
fSelectedTransitionsList.remove(strItem);
refresh = true;
}
}
if( refresh ) {
fSelectedTransitionsList.sort(null);
fSelectedTransitionsTable.removeAll();
for(int i = 0; i < fSelectedTransitionsList.size(); i++)
{
TableItem item = new TableItem(
fSelectedTransitionsTable, SWT.NONE);
item.setText( fSelectedTransitionsList.get(i) );
}
}
fConfigurationPage.propagateGUIupdate();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
fConfigurationPage.propagateGUIupdate();
}
});
fSelectedTransitionsTable.addMouseListener( new MouseListener() {
@Override
public void mouseUp(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
}
@Override
public void mouseDoubleClick(MouseEvent e) {
String strItem2;
for( int index : fSelectedTransitionsTable.getSelectionIndices() )
{
strItem2 = fSelectedTransitionsTable.getItem(index).getText();
for( TableItem tableItem1 : fAllTransitionsListTable.getItems() )
{
if( tableItem1.getText().equals(strItem2) )
{
fSelectedTransitionsList.remove(strItem2);
tableItem1.setChecked(false);
fSelectedTransitionsTable.remove(index);
fConfigurationPage.propagateGUIupdate();
break;
}
}
}
}
});
}
private void handleEnablingDetailedSelection() {
fConfigurationPage.propagateVisibility(fCompDetailedSelection,
fEnabledDetailedSelectionBooleanField.getBooleanValue());
}
private void initTransitionTable() {
loadTransitionListToBeSelected();
fAllTransitionsListTable.removeAll();
for(int i = 0; i < fAllTransitionsList.size(); i++) {
TableItem item = new TableItem(fAllTransitionsListTable, SWT.NONE);
item.setChecked(false);
item.setText( fAllTransitionsList.get(i) );
}
}
public void handleModelFilePathChanged(String modelFilePath) {
fModelFilePath = modelFilePath;
// Force Re-initialization
fAllTransitionsList = null;
updateTransitionTables();
}
public void updateTransitionTables() {
fSelectedTransitionsTable.removeAll();
if( (fAllTransitionsList == null)
|| fAllTransitionsList.isEmpty() )
{
initTransitionTable();
}
if( (fAllTransitionsList != null)
&& (fSelectedTransitionsList != null)
&& (! fAllTransitionsList.isEmpty())
&& (! fSelectedTransitionsList.isEmpty()) )
{
for(int i = 0; i < fSelectedTransitionsList.size(); i++)
{
TableItem item = new TableItem(
fSelectedTransitionsTable, SWT.NONE);
item.setText( fSelectedTransitionsList.get(i) );
}
for(int i = 0; i < fAllTransitionsList.size(); i++)
{
if( fSelectedTransitionsList.contains(
fAllTransitionsList.get(i)) )
{
fAllTransitionsListTable.getItem( i ).setChecked(true);
}
}
}
else {
// fSelectedTransitionsList.clear();
}
}
private void loadTransitionListToBeSelected() {
if( fAllTransitionsList == null ) {
fAllTransitionsList = new ArrayList<String>();
}
else {
fAllTransitionsList.clear();
}
File modelFile =
((fModelFilePath == null) || fModelFilePath.isEmpty()) ?
null : new File( fModelFilePath );
try {
if( (modelFile != null) && modelFile.isFile() ) {
InputStream ips;
ips = new FileInputStream( modelFile );
InputStreamReader ipsr = new InputStreamReader(ips);
BufferedReader br = new BufferedReader(ipsr);
String ligne;
String transitionName = "";
int maxSizetransitionName = 0;
int pos;
while ((ligne=br.readLine())!=null){
// Classic Case:
// 'transition' ( < ( 'else' | 'prior:'\d )*> )?
// transitionName ( --> stateName )? { ...
//
if( (pos = ligne.indexOf("transition")) >= 0 ) {
ligne = ligne.substring( pos + "transition".length() );
transitionName = ligne.replaceAll(
"\\s*(<[^>]*>\\s*)?([^\\s-{]*).*", "$2");
if( transitionName.isEmpty() ) {
// transition_name_empty
}
else {
fAllTransitionsList.add(transitionName);
maxSizetransitionName =
Math.max(maxSizetransitionName,
transitionName.length() );
}
}
// Other Case:
// transitionName --> stateName { ...
//
else if( ligne.contains("-->") &&
!ligne.contains("}") &&
!ligne.contains("output ") &&
!ligne.contains("procedure ") &&
!ligne.contains("call ") ) {
ligne = ligne.replaceAll("\t", "");
ligne = ligne.substring(0, ligne.indexOf("-->"));
ligne = ligne.replaceAll(" ", "");
transitionName = ligne.replaceFirst("@", "");
if( transitionName.length() == 0 ) {
// transition_name_empty
}
else {
fAllTransitionsList.add(transitionName);
maxSizetransitionName =
Math.max(maxSizetransitionName,
transitionName.length() );
}
}
}
br.close();
fAllTransitionsList.sort(null);
if( maxSizetransitionName <= 30 ) {
fAllTransitionsListTableColumn.setWidth(200);
fSelectedTransitionsTableColumn.setWidth(200);
}
// else if( maxSizetransitionName <= 60 ) {
// fAllTransitionsListTableColumn.setWidth(
// maxSizetransitionName * 9 + 30);
// fSelectedTransitionsTableColumn.setWidth(
// maxSizetransitionName * 9 + 10);
// }
else {
// fAllTransitionsListTableColumn.setWidth(700);
fAllTransitionsListTableColumn.setWidth(
maxSizetransitionName * 9 + 30);
// fSelectedTransitionsTableColumn.setWidth(700);
fSelectedTransitionsTableColumn.setWidth(
maxSizetransitionName * 9 + 10);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration)
{
// fEnabledDetailedSelectionBooleanField.setDefaults(configuration);
configuration.setAttribute(
ATTR_ENABLED_TRANSITION_COVERAGE_DETAILS_SELECTION, false);
configuration.setAttribute(
ATTR_TRANSITION_COVERAGE_SELECTION, new ArrayList<String>());
}
@Override
public void initializeFrom(ILaunchConfiguration configuration)
{
try {
fModelFilePath = configuration.getAttribute(
ATTR_SPECIFICATION_MODEL_FILE_LOCATION,
DEFAULT_SPECIFICATION_MODEL_FILE_LOCATION);
}
catch( CoreException e2 ) {
fModelFilePath = null;
e2.printStackTrace();
}
fEnabledDetailedSelectionBooleanField.initializeFrom(configuration);
handleEnablingDetailedSelection();
try {
fSelectedTransitionsList = new ArrayList<String>();
fSelectedTransitionsList.addAll(
configuration.getAttribute(
ATTR_TRANSITION_COVERAGE_SELECTION,
new ArrayList<String>()) );
}
catch( CoreException e ) {
e.printStackTrace();
fSelectedTransitionsList = new ArrayList<String>();
}
updateTransitionTables();
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration)
{
fEnabledDetailedSelectionBooleanField.performApply(configuration);
configuration.setAttribute(
ATTR_TRANSITION_COVERAGE_SELECTION, fSelectedTransitionsList);
}
@Override
public boolean isValid(ILaunchConfiguration launchConfig) {
if( fEnabledDetailedSelectionBooleanField.getBooleanValue()
&& ( fSelectedTransitionsList.size() == 0 ) )
{
setErrorMessage("You must select at least one transition");
return false;
}
return true;
}
}