/******************************************************************************* * Copyright (c) 2014, 2015 Willink Transformations and others. * 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: * R.Dvorak and others - QVTo debugger framework * E.D.Willink - revised API for OCL debugger framework *******************************************************************************/ package org.eclipse.ocl.examples.debug.ui.actions; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.ocl.pivot.Constraint; import org.eclipse.ocl.pivot.Element; import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal; import org.eclipse.ocl.pivot.internal.prettyprint.PrettyPrinter; import org.eclipse.ocl.pivot.internal.registry.CompleteOCLRegistry; import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal; import org.eclipse.ocl.pivot.internal.utilities.PivotUtilInternal; import org.eclipse.ocl.pivot.utilities.NameUtil; import org.eclipse.ocl.pivot.utilities.ParserException; import org.eclipse.ocl.xtext.base.ui.utilities.PDEUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class DebugDialog extends Dialog { protected class ConstraintsModifyListener implements ModifyListener { @Override public void modifyText(ModifyEvent e) { constraintText2constraint.clear(); List<String> constraints = new ArrayList<String>(); int selectedIndex = constraintsCombo.getSelectionIndex(); if (selectedIndex >= 0) { String selectedText = constraintsCombo.getItem(selectedIndex); URI selectedURI = constraintsText2resourceURI.get(selectedText); if (selectedURI != null) { Resource eResource = selectedObject.eResource(); if (eResource != null) { EnvironmentFactoryInternal environmentFactory = PivotUtilInternal.getEnvironmentFactory(eResource); MetamodelManagerInternal metamodelManager = environmentFactory.getMetamodelManager(); Element resource = null; try { resource = metamodelManager.loadResource(selectedURI, null, null); } catch (ParserException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if (resource != null) { for (TreeIterator<EObject> tit = resource.eAllContents(); tit.hasNext(); ) { EObject eObject = tit.next(); if (eObject instanceof Constraint) { String constraintText = eObject.toString(); constraints.add(constraintText); constraintText2constraint.put(constraintText, (Constraint)eObject); } } Collections.sort(constraints); } } } } constraintCombo.setItems(constraints.toArray(new String[constraints.size()])); if (constraints.size() > 0) { constraintCombo.select(0); } } } protected class ConstraintModifyListener implements ModifyListener { @Override public void modifyText(ModifyEvent e) { Constraint selectedConstraint2 = null; String text = null; int selectedIndex = constraintCombo.getSelectionIndex(); if (selectedIndex >= 0) { String selectedText = constraintCombo.getItem(selectedIndex); selectedConstraint2 = constraintText2constraint.get(selectedText); if (selectedConstraint2 != null) { text = PrettyPrinter.print(selectedConstraint2); } } selectedConstraint = selectedConstraint2; constraintText.setText(text != null ? text : "<no-constraint-text>"); } } protected final @NonNull CompleteOCLRegistry completeOCLRegistry; protected final @NonNull EObject selectedObject; protected @Nullable Constraint selectedConstraint; private Text elementName; private Text elementNsURI; private Text elementClass; private Text constraintText; private Combo constraintsCombo; private Combo constraintCombo; private final @NonNull Map<String, URI> constraintsText2resourceURI = new HashMap<String, URI>(); private final @NonNull Map<String, Constraint> constraintText2constraint = new HashMap<String, Constraint>(); /** * Create the dialog. * @param parentShell * @param selectedObject */ public DebugDialog(Shell parentShell, @NonNull EObject selectedObject) { super(parentShell); setShellStyle(SWT.SHELL_TRIM | SWT.BORDER); completeOCLRegistry = PDEUtils.createCompleteOCLRegistry(); this.selectedObject = selectedObject; } /** * Create contents of the dialog. * @param parent */ @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); GridLayout gridLayout = (GridLayout) container.getLayout(); gridLayout.numColumns = 2; // Composite elementRow = new Composite(container, SWT.NONE); // GridData gd_elementRow = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); // gd_elementRow.heightHint = 80; // elementRow.setLayoutData(gd_elementRow); // elementRow.setLayout(new GridLayout(2, false)); Label elementLabel = new Label(container, SWT.NONE); elementLabel.setSize(43, 15); elementLabel.setText("Element"); elementName = new Text(container, SWT.BORDER); elementName.setEditable(false); elementName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); elementName.setText(""); Label eClassLabel = new Label(container, SWT.NONE); eClassLabel.setBounds(0, 0, 55, 15); eClassLabel.setText("EClass"); elementClass = new Text(container, SWT.BORDER); elementClass.setEditable(false); elementClass.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); elementClass.setBounds(0, 0, 76, 21); Label nsURILabel = new Label(container, SWT.NONE); nsURILabel.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false, false, 1, 1)); nsURILabel.setBounds(0, 0, 55, 15); nsURILabel.setText("Ns URI"); elementNsURI = new Text(container, SWT.BORDER); elementNsURI.setEditable(false); elementNsURI.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); elementNsURI.setBounds(0, 0, 76, 21); Label constraintsLabel = new Label(container, SWT.NONE); constraintsLabel.setBounds(0, 0, 55, 15); constraintsLabel.setText("Constraints"); constraintsCombo = new Combo(container, SWT.NONE); constraintsCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); constraintsCombo.setBounds(0, 0, 91, 23); Label constraintLabel = new Label(container, SWT.NONE); constraintLabel.setBounds(0, 0, 55, 15); constraintLabel.setText("Constraint"); constraintCombo = new Combo(container, SWT.NONE); constraintCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); constraintText = new Text(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL | SWT.MULTI); constraintText.setEditable(false); GridData gd_constraintText = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); gd_constraintText.minimumHeight = 30; constraintText.setLayoutData(gd_constraintText); // constraintsCombo.addModifyListener(new ConstraintsModifyListener()); constraintCombo.addModifyListener(new ConstraintModifyListener()); setSelection(selectedObject); return container; } /** * Create contents of the button bar. * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(450, 300); } public void setSelection(@NonNull EObject eObject) { elementName.setText(NameUtil.qualifiedNameFor(eObject)); EClass eClass = eObject.eClass(); elementClass.setText(NameUtil.qualifiedNameFor(eClass)); EPackage ePackage = eClass != null ? eClass.getEPackage() : null; String nsURI = ePackage != null ? ePackage.getNsURI() : null; elementNsURI.setText(String.valueOf(nsURI)); @NonNull List<String> elementNsURIs = Collections.singletonList(nsURI); Set<URI> resourceURIs = completeOCLRegistry.getResourceURIs(elementNsURIs); List<String> constraintNsURIs = new ArrayList<String>(); constraintsText2resourceURI.clear(); for (URI resourceURI : resourceURIs) { URI leadingSegments = resourceURI.trimSegments(1); String lastSegment = resourceURI.lastSegment(); String constraintsText = lastSegment + " - " + leadingSegments.toString(); constraintNsURIs.add(constraintsText); constraintsText2resourceURI.put(constraintsText, resourceURI); } Collections.sort(constraintNsURIs); constraintsCombo.setItems(constraintNsURIs.toArray(new String[constraintNsURIs.size()])); constraintsCombo.select(0); } public @NonNull EObject getContext() { return selectedObject; } public @Nullable Constraint getConstraint() { return selectedConstraint; } }