/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. 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: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ /** * */ package de.tub.tfs.henshin.editor.ui.dialog; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.henshin.model.HenshinPackage; import org.eclipse.emf.henshin.model.Module; import org.eclipse.emf.henshin.model.Rule; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import de.tub.tfs.henshin.editor.util.HenshinUtil; import de.tub.tfs.henshin.editor.util.IconUtil; import de.tub.tfs.henshin.editor.util.ModelUtil; /** * @author angel * */ public final class CreateAmalgamationUnitDialog extends Dialog { /** The title. */ private String title; /** The ok button. */ private Button okButton; private Module transSys; private Text unitNameText; private String unitName; private Button newRuleRB; private Label ruleNameLabel; private Text ruleNameText; private String ruleName; private Button definedRuleRB; private List definedRuleList; private ListViewer definedRuleListViewer; private Rule definedRule; /** * Instantiates a new creates the edge dialog. * * @param parentShell * the parent shell * @param graph * the graph * @param title * the title */ public CreateAmalgamationUnitDialog(Shell parentShell, String title, Module transSys) { super(parentShell); this.title = title; this.transSys = transSys; } /** * @return Unit name of an amalgamation unit to create. */ public String getUnitName() { return unitName; } /** * @return Rule name of an kernel rule to create. */ public String getRuleName() { return ruleName; } /** * @return A defined rule to set as kernel rule. */ public Rule getDefinedRule() { return definedRule; } /* * (non-Javadoc) * * @see * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets * .Shell) */ @Override protected void configureShell(Shell shell) { super.configureShell(shell); if (title != null) { shell.setText(title); } shell.setSize(600, 400); shell.layout(); } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createButton(org.eclipse.swt.widgets * .Composite, int, java.lang.String, boolean) */ @Override protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { Button button = super.createButton(parent, id, label, defaultButton); if (id == OK) { okButton = button; okButton.setEnabled(isComplete()); } return button; } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets * .Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); final Group unitNameGroup = new Group(composite, SWT.NONE); unitNameGroup.setLayout(new GridLayout(2, false)); unitNameGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); unitNameGroup.setText("Unit Name"); unitNameText = new Text(unitNameGroup, SWT.BORDER); unitName = ModelUtil.getNewChildDistinctName(transSys, HenshinPackage.MODULE__UNITS, "amalgamationUnit"); unitNameText.setText(unitName); unitNameText .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); final Group kernelRuleGroup = new Group(composite, SWT.NONE); kernelRuleGroup.setLayout(new GridLayout(2, false)); kernelRuleGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); kernelRuleGroup.setText("Kernel Rule"); newRuleRB = new Button(kernelRuleGroup, SWT.RADIO); newRuleRB.setText("Create a new rule as kernel rule."); newRuleRB.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); newRuleRB.setSelection(true); ruleNameLabel = new Label(kernelRuleGroup, SWT.NONE); ruleNameLabel.setText("Rule name : "); ruleNameLabel.setVisible(true); ruleNameText = new Text(kernelRuleGroup, SWT.BORDER); ruleName = ModelUtil.getNewChildDistinctName(transSys, HenshinPackage.MODULE__UNITS, "rule"); ruleNameText.setText(ruleName); ruleNameText .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); ruleNameText.setVisible(true); definedRuleRB = new Button(kernelRuleGroup, SWT.RADIO); definedRuleRB.setText("Add defined rule as kernel rule."); definedRuleRB.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); definedRuleRB.setSelection(false); definedRuleList = new List(kernelRuleGroup, SWT.BORDER); definedRuleList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); definedRuleList.setVisible(false); definedRuleListViewer = new ListViewer(definedRuleList); definedRuleListViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof Rule) { return ((Rule) element).getName(); } return super.getText(element); } @Override public Image getImage(Object element) { return IconUtil.getDescriptor("Rule16.png").createImage(); } }); for (Rule rule : HenshinUtil.getRules(transSys) ) { definedRuleListViewer.add(rule); } addListener(); unitNameText.setFocus(); unitNameText.selectAll(); return composite; } /** * Adds the listener. */ private void addListener() { unitNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { unitName = unitNameText.getText(); okButton.setEnabled(isComplete()); } }); newRuleRB.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { ruleNameLabel.setVisible(newRuleRB.getSelection()); ruleNameText.setVisible(newRuleRB.getSelection()); if (ruleNameText.isVisible()) { ruleNameText.selectAll(); ruleNameText.setFocus(); } okButton.setEnabled(isComplete()); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); ruleNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { ruleName = ruleNameText.getText(); okButton.setEnabled(isComplete()); } }); definedRuleRB.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { definedRuleList.setVisible(definedRuleRB.getSelection()); EList<Rule> r = HenshinUtil.getRules(transSys); if (definedRuleList.isVisible() && !r.isEmpty()) { definedRuleList.setSelection(0); definedRule = r.get(0); } okButton.setEnabled(isComplete()); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); definedRuleListViewer .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { Object selection = definedRuleListViewer.getSelection(); if (selection != null && selection instanceof StructuredSelection) { selection = ((StructuredSelection) selection) .getFirstElement(); if (selection instanceof Rule) { definedRule = (Rule) selection; okButton.setEnabled(isComplete()); } } } }); } /** * */ private boolean isComplete() { boolean complete = true; if (newRuleRB.getSelection()) { complete &= ruleName != null && ruleName.length() > 0; definedRule = null; } else if (definedRuleRB.getSelection()) { complete &= definedRule != null; ruleName = null; } return complete && unitName != null && unitName.length() > 0; } }