/***************************************************************************** * Copyright (c) 2010 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.customization.properties.generation.wizard; import java.util.List; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.papyrus.customization.properties.generation.Activator; import org.eclipse.papyrus.customization.properties.generation.fieldselection.ContextElement; import org.eclipse.papyrus.customization.properties.generation.fieldselection.FieldSelection; import org.eclipse.papyrus.customization.properties.generation.fieldselection.FieldSelectionFactory; import org.eclipse.papyrus.customization.properties.generation.fieldselection.FieldSelectionPackage; import org.eclipse.papyrus.customization.properties.generation.fieldselection.PropertyDefinition; import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator; import org.eclipse.papyrus.customization.properties.generation.messages.Messages; import org.eclipse.papyrus.customization.properties.generation.wizard.widget.TernaryButton; import org.eclipse.papyrus.views.properties.contexts.Context; import org.eclipse.papyrus.views.properties.contexts.DataContextElement; import org.eclipse.papyrus.views.properties.contexts.DataContextPackage; import org.eclipse.papyrus.views.properties.contexts.DataContextRoot; import org.eclipse.papyrus.views.properties.contexts.Property; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; /** * A WizardPage to choose the fields that will be displayed in the Property view. * For each property, the choice can be either "True", "False" or "Default". * The visibility of properties marked as Default is decided by the Generator. * When the context is regenerated, the visibility of properties marked as default * may change (If the generator is changed) * * @author Camille Letavernier */ public class SelectFieldsPage extends AbstractCreateContextPage { private URI targetURI; private List<Context> contexts; private Composite root; private Composite fields; private FieldSelection fieldSelection; /** * Constructor. */ protected SelectFieldsPage() { super(Messages.SelectFieldsPage_title); } public void createControl(Composite parent) { root = new Composite(parent, SWT.NONE); root.setLayout(new GridLayout(1, true)); setControl(root); setPageComplete(false); setDescription(Messages.SelectFieldsPage_selectFields); } /** * Sets the generated partial context * * @param context * The partially generated context */ public void setContexts(List<Context> contexts) { if(contexts == null || contexts.isEmpty()) { Activator.log.warn("Generated context is null"); //$NON-NLS-1$ return; } this.contexts = contexts; fieldSelection = createNewFieldSelection(); getWizard().setContexts(contexts); Label label = new Label(root, SWT.NONE); label.setText(Messages.SelectFieldsPage_availableFields); ScrolledComposite scrollableFields = new ScrolledComposite(root, SWT.V_SCROLL | SWT.H_SCROLL); scrollableFields.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); scrollableFields.getVerticalBar().setIncrement(10); fields = new Composite(scrollableFields, SWT.NONE); scrollableFields.setContent(fields); fields.setLayout(new GridLayout(4, false)); Label fieldLabel = new Label(fields, SWT.NONE); Label selectionSingle = new Label(fields, SWT.NONE); Label selectionMultiple = new Label(fields, SWT.NONE); Label descriptionLabel = new Label(fields, SWT.NONE); selectionSingle.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); selectionMultiple.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); descriptionLabel.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); fieldLabel.setText(Messages.SelectFieldsPage_field); selectionSingle.setText(Messages.SelectFieldsPage_displaySingle); selectionMultiple.setText(Messages.SelectFieldsPage_displayMultiple); descriptionLabel.setText(Messages.SelectFieldsPage_description); for(Context context : contexts) { for(DataContextRoot dataContextRoot : context.getDataContexts()) { displayFields(dataContextRoot); } } fields.setSize(fields.computeSize(SWT.DEFAULT, SWT.DEFAULT)); root.layout(); fields.layout(); scrollableFields.layout(); } private FieldSelection createNewFieldSelection() { FieldSelection selection = FieldSelectionFactory.eINSTANCE.createFieldSelection(); for(Context context : contexts) { for(DataContextRoot dataContextRoot : context.getDataContexts()) { ContextElement definition = createContextPackage(dataContextRoot); selection.getContextElements().add(definition); } } return selection; } private ContextElement createContextPackage(DataContextPackage sourcePackage) { ContextElement element = createContextElement(sourcePackage); for(DataContextElement sourceElement : sourcePackage.getElements()) { ContextElement subElement; if(sourceElement instanceof DataContextPackage) { subElement = createContextPackage((DataContextPackage)sourceElement); } else { subElement = createContextElement(sourceElement); } element.getElements().add(subElement); } return element; } private ContextElement createContextElement(DataContextElement sourceElement) { ContextElement element = FieldSelectionFactory.eINSTANCE.createContextElement(); element.setName(sourceElement.getName()); for(Property property : sourceElement.getProperties()) { PropertyDefinition propertyDefinition = FieldSelectionFactory.eINSTANCE.createPropertyDefinition(); propertyDefinition.setName(property.getName()); propertyDefinition.setValueSingle(TernaryButton.State.DEFAULT); propertyDefinition.setValueMultiple(TernaryButton.State.DEFAULT); element.getProperties().add(propertyDefinition); } return element; } private void displayFields(DataContextElement contextElement) { if(contextElement.getProperties().size() > 0) { Label separator = new Label(fields, SWT.SEPARATOR | SWT.HORIZONTAL); GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1); separator.setLayoutData(data); Label elementName = new Label(fields, SWT.NONE); elementName.setText(contextElement.getName()); FontData[] fontDatas = elementName.getFont().getFontData(); for(FontData fontData : fontDatas) { fontData.setStyle(SWT.BOLD); // fontData.setHeight(fontData.getHeight() + 2); } elementName.setFont(new Font(elementName.getDisplay(), fontDatas)); data = new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1); elementName.setLayoutData(data); Label separator2 = new Label(fields, SWT.SEPARATOR | SWT.HORIZONTAL); data = new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1); separator2.setLayoutData(data); for(Property property : contextElement.getProperties()) { Label label = new Label(fields, SWT.NONE); label.setText(property.getName()); TernaryButton showSingle = new TernaryButton(fields, getGenerator().isSelectedSingle(property)); TernaryButton showMultiple = new TernaryButton(fields, getGenerator().isSelectedMultiple(property)); PropertyDefinition propertyDefinition = getWizard().getPropertyDefinition(fieldSelection, property); IObservableValue singleValue = EMFProperties.value(FieldSelectionPackage.eINSTANCE.getPropertyDefinition_ValueSingle()).observe(propertyDefinition); IObservableValue multipleValue = EMFProperties.value(FieldSelectionPackage.eINSTANCE.getPropertyDefinition_ValueMultiple()).observe(propertyDefinition); showSingle.setObservable(singleValue); showMultiple.setObservable(multipleValue); Label description = new Label(fields, SWT.WRAP); String propertyDescription = "";// property.getTooltipText(); //$NON-NLS-1$ if(propertyDescription == null || propertyDescription.trim().equals("")) { //$NON-NLS-1$ propertyDescription = Messages.SelectFieldsPage_descriptionNotAvailable; description.setAlignment(SWT.CENTER); } description.setText(propertyDescription); data = new GridData(SWT.FILL, SWT.CENTER, true, false); label.setLayoutData(data); data = new GridData(SWT.FILL, SWT.CENTER, true, false); showSingle.setLayoutData(data); data = new GridData(SWT.FILL, SWT.CENTER, true, false); showMultiple.setLayoutData(data); data = new GridData(SWT.CENTER, SWT.CENTER, true, false); data.widthHint = 500; description.setLayoutData(data); } } if(contextElement instanceof DataContextPackage) { DataContextPackage contextPackage = (DataContextPackage)contextElement; for(DataContextElement element : contextPackage.getElements()) { displayFields(element); } } } private IGenerator getGenerator() { return getWizard().generator; } /** * Sets the URI of the generated context * * @param uri * The URI of the generated context */ public void setTargetURI(URI uri) { this.targetURI = uri; } @Override public void setVisible(boolean visible) { super.setPageComplete(true); super.setVisible(visible); if(contexts == null && visible) { setContexts(getWizard().generator.generate(targetURI)); } } /** * @return the result of the user's field selection */ public FieldSelection getFieldSelection() { return fieldSelection; } }