blob: 06478099ad44070a1e33a9c45cfcbbb6cb6ea769 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
*
* </copyright>
*/
package org.eclipse.egf.pattern.ui.editors.wizards.pages;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import org.eclipse.egf.model.pattern.Pattern;
import org.eclipse.egf.model.pattern.PatternCall;
import org.eclipse.egf.model.pattern.PatternParameter;
import org.eclipse.egf.model.pattern.impl.Paramerter2ParameterMapImpl;
import org.eclipse.egf.pattern.ui.ImageShop;
import org.eclipse.egf.pattern.ui.Messages;
import org.eclipse.egf.pattern.ui.editors.providers.CommonListContentProvider;
import org.eclipse.egf.pattern.ui.editors.providers.ParameterMatchingLibraryProvider;
import org.eclipse.egf.pattern.ui.editors.providers.ParametersTableLabelProvider;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* @author XiaoRu Chen - Soyatec
*
*/
public class ParameterMatchingPage extends WizardPage {
private Pattern patternCaller;
private Pattern patternCallee;
private Label patternCalleeNameLabel;
private TableViewer calleeTableViewer;
private TableViewer matchingTableViewer;
private TableViewer callerTableViewer;
private Button createMatch;
private Button deleteMatch;
private Button editMatch;
private PatternCall call;
private TransactionalEditingDomain transactionalEditingDomain;
private List<RecordingCommand> matchingCommands;
public ParameterMatchingPage(ISelection selection, Pattern patternCaller, TransactionalEditingDomain transactionalEditingDomain) {
super(Messages.ParameterMatchingPage_title);
setTitle(Messages.ParameterMatchingPage_title);
setDescription(Messages.ParameterMatchingPage_label_text);
this.patternCaller = patternCaller;
this.transactionalEditingDomain = transactionalEditingDomain;
}
public void createControl(Composite parent) {
Composite dialogArea = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
dialogArea.setLayout(layout);
createParameterArea(dialogArea);
createMatchingArea(dialogArea);
setControl(dialogArea);
}
private void createParameterArea(Composite dialogArea) {
Composite parameterArea = createArea(dialogArea, true);
createCallerArea(parameterArea);
createCalleeArea(parameterArea);
createMatingButton(parameterArea);
}
private void createMatingButton(Composite parameterArea) {
createMatch = new Button(parameterArea, SWT.PUSH);
createMatch.setText(Messages.ParameterMatchingPage_button_create);
GridData gd = new GridData();
gd.widthHint = 200;
gd.horizontalSpan = 2;
gd.horizontalAlignment = SWT.CENTER;
gd.verticalIndent = 0;
createMatch.setLayoutData(gd);
createMatch.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
createMatching();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
private void createMatchingArea(Composite dialogArea) {
Composite parameterArea = createArea(dialogArea, false);
Label currenMatchingLabel = new Label(parameterArea, SWT.NONE);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
gd.horizontalIndent = 9;
currenMatchingLabel.setLayoutData(gd);
currenMatchingLabel.setText(Messages.ParameterMatchingPage_current_mathings_title);
Table table = new Table(parameterArea, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 160;
gd.horizontalIndent = 7;
gd.verticalIndent = 0;
table.setLayoutData(gd);
TableColumn tableColumn = new TableColumn(table, SWT.NONE);
tableColumn.setWidth(420);
matchingTableViewer = new TableViewer(table);
matchingTableViewer.setLabelProvider(new ParameterMatchingLibraryProvider());
matchingTableViewer.setContentProvider(new CommonListContentProvider());
matchingTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
checkEidtAndDeleteButtonEnable();
}
});
createMatchingAreaButtons(parameterArea);
}
private void createMatchingAreaButtons(Composite parameterArea) {
Composite buttonsArea = new Composite(parameterArea, SWT.NONE);
GridLayout layout = new GridLayout();
buttonsArea.setLayout(layout);
deleteMatch = createButton(buttonsArea);
deleteMatch.setToolTipText(Messages.ParameterMatchingPage_button_delete);
deleteMatch.setText(""); //$NON-NLS-1$
deleteMatch.setImage(ImageShop.get(ImageShop.IMG_DELETE_OBJ));
deleteMatch.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
deleteMatching();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
editMatch = createButton(buttonsArea);
editMatch.setToolTipText(Messages.ParameterMatchingPage_button_edit);
editMatch.setText(""); //$NON-NLS-1$
editMatch.setImage(ImageShop.get(ImageShop.IMG_EDIT_OBJ));
}
private Composite createArea(Composite composite, boolean makeColumnsEqualWidth) {
Composite container = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout(2, makeColumnsEqualWidth);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.verticalIndent = 0;
container.setLayout(layout);
container.setLayoutData(gd);
return container;
}
private void createCallerArea(Composite dialogArea) {
Composite callerArea = createCallArea(dialogArea);
createPatternNameLabel(callerArea, patternCaller);
callerTableViewer = createParameterTableViewer(callerArea, patternCaller);
callerTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
checkCreateButtonEnable();
}
});
}
private void createCalleeArea(Composite dialogArea) {
Composite calleeArea = createCallArea(dialogArea);
patternCalleeNameLabel = createPatternNameLabel(calleeArea, patternCallee);
calleeTableViewer = createParameterTableViewer(calleeArea, patternCallee);
calleeTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
checkCreateButtonEnable();
}
});
}
private Label createPatternNameLabel(Composite container, Pattern pattern) {
Label patternNameLabel = new Label(container, SWT.NONE);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
patternNameLabel.setLayoutData(gd);
setPatternName(pattern, patternNameLabel); //$NON-NLS-1$ //$NON-NLS-2$
return patternNameLabel;
}
private TableViewer createParameterTableViewer(Composite container, Pattern pattern) {
Table listTable = new Table(container, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = listTable.getItemHeight();
listTable.setLayoutData(gd);
TableColumn tableColumn = new TableColumn(listTable, SWT.NONE);
tableColumn.setWidth(260);
TableViewer tableViewer = new TableViewer(listTable);
tableViewer.setLabelProvider(new ParametersTableLabelProvider());
tableViewer.setContentProvider(new CommonListContentProvider());
return tableViewer;
}
private Composite createCallArea(Composite container) {
Composite callArea = new Composite(container, SWT.NONE);
GridLayout layout = new GridLayout();
callArea.setLayout(layout);
GridData gd = new GridData(GridData.FILL_BOTH);
callArea.setLayoutData(gd);
return callArea;
}
private Button createButton(Composite container) {
Button button = new Button(container, SWT.PUSH);
GridData gd = new GridData();
gd.widthHint = 60;
button.setLayoutData(gd);
return button;
}
private List<PatternParameter> getCallerTableInput(Pattern pattern) {
return pattern == null ? null : pattern.getParameters();
}
private List<PatternParameter> getCalleeTableInput(Pattern pattern) {
if (pattern == null) {
return null;
}
EList<PatternParameter> parameters = pattern.getParameters();
List<PatternParameter> availableParameters = new ArrayList<PatternParameter>();
EMap<PatternParameter, PatternParameter> parameterMatching = call.getParameterMatching();
for (PatternParameter parameter : parameters) {
if (isAvailableParameter(parameter, parameterMatching)) {
availableParameters.add(parameter);
}
}
return availableParameters;
}
/**
* Check whether the parameter is available.
*/
private boolean isAvailableParameter(PatternParameter parameter, EMap<PatternParameter, PatternParameter> parameterMatching) {
for (int i = 0; i < parameterMatching.size(); i++) {
Entry<PatternParameter, PatternParameter> currentEntry = parameterMatching.get(i);
PatternParameter currentKey = currentEntry.getKey();
if (currentKey.equals(parameter)) {
return false;
}
}
return true;
}
private void checkCreateButtonEnable() {
if ((getSelection(callerTableViewer) != null) && (getSelection(calleeTableViewer) != null)) {
createMatch.setEnabled(true);
} else {
createMatch.setEnabled(false);
}
}
private void checkEidtAndDeleteButtonEnable() {
if ((getSelection(matchingTableViewer) != null)) {
deleteMatch.setEnabled(true);
editMatch.setEnabled(true);
} else {
deleteMatch.setEnabled(false);
editMatch.setEnabled(false);
}
}
/**
* Return the selection of the tableViewer.
*/
private Object getSelection(TableViewer tableViewer) {
int selectionIndex = tableViewer.getTable().getSelectionIndex();
if (selectionIndex != -1) {
return tableViewer.getElementAt(selectionIndex);
}
return null;
}
/**
* Create a new parameter matching.
*/
private void createMatching() {
final PatternParameter callerParameter = (PatternParameter) getSelection(callerTableViewer);
final PatternParameter calleeParameter = (PatternParameter) getSelection(calleeTableViewer);
int selectIndex = calleeTableViewer.getTable().getSelectionIndex();
RecordingCommand cmd = new RecordingCommand(transactionalEditingDomain) {
protected void doExecute() {
call.getParameterMatching().put(calleeParameter, callerParameter);
}
};
transactionalEditingDomain.getCommandStack().execute(cmd);
matchingCommands.add(cmd);
refreshTables();
setSelection(calleeTableViewer, selectIndex);
}
/**
* Delete a new parameter matching.
*/
private void deleteMatching() {
final Paramerter2ParameterMapImpl deleteItem = (Paramerter2ParameterMapImpl) getSelection(matchingTableViewer);
int selectIndex = matchingTableViewer.getTable().getSelectionIndex();
RecordingCommand cmd = new RecordingCommand(transactionalEditingDomain) {
protected void doExecute() {
call.getParameterMatching().remove(deleteItem);
}
};
transactionalEditingDomain.getCommandStack().execute(cmd);
matchingCommands.add(cmd);
refreshTables();
setSelection(matchingTableViewer, selectIndex);
}
private void refreshTables() {
matchingTableViewer.setInput(getMatchingList());
calleeTableViewer.setInput(getCalleeTableInput(patternCallee));
setMissingInformation();
}
/**
* Get the matchingTableViewer's input.
*/
private EMap<PatternParameter, PatternParameter> getMatchingList() {
EMap<PatternParameter, PatternParameter> parameterMatching = null;
parameterMatching = call.getParameterMatching();
return parameterMatching;
}
/**
* Update the patterCallee table.
*/
public void setVisible(boolean visible) {
if (visible) {
matchingCommands = new ArrayList<RecordingCommand>();
updatePatternCallee();
callerTableViewer.setInput(getCallerTableInput(patternCaller));
refreshTables();
checkCreateButtonEnable();
checkEidtAndDeleteButtonEnable();
}
super.setVisible(visible);
}
private String getPatternName(String name) {
return name + ((name == null || name.equals("")) ? "" : ":"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
/**
* Set the display pattern name label.
*/
private void setPatternName(Pattern pattern, Label label) {
String patternName = pattern == null ? "" : pattern.getName(); //$NON-NLS-1$
label.setText(getPatternName(patternName));
}
/**
* Refresh the patternCallee area.
*/
private void updatePatternCallee() {
setPatternName(patternCallee, patternCalleeNameLabel);
calleeTableViewer.setInput(getCallerTableInput(patternCallee));
}
/**
* Set new selection after refresh the tableViewr.
*/
private void setSelection(TableViewer tableViewer, int oldIndex) {
int len = tableViewer.getTable().getItemCount();
if (len > 0) {
if (oldIndex == len) {
tableViewer.getTable().setSelection(oldIndex - 1);
} else if (oldIndex < len) {
tableViewer.getTable().setSelection(oldIndex);
}
}
checkCreateButtonEnable();
checkEidtAndDeleteButtonEnable();
}
/**
* If there is no available caller parameters or callee parameters to
* setup,show the information in the page.
*/
private void setMissingInformation() {
String message = null;
if (callerTableViewer.getTable().getItemCount() == 0 || calleeTableViewer.getTable().getItemCount() == 0) {
message = Messages.ParameterMatchingPage_missing_information;
}
setMessage(message, INFORMATION);
}
public void setPatternCall(PatternCall call) {
this.call = call;
}
public PatternCall getPatternCall() {
return call;
}
public void setPatternCallee(Pattern patternCallee) {
this.patternCallee = patternCallee;
}
public List<RecordingCommand> getParameterMatchingCommands() {
return matchingCommands;
}
}