Java tutorial
/******************************************************************************* * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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 *******************************************************************************/ package gov.redhawk.ide.codegen.ui; import gov.redhawk.ide.codegen.CodegenFactory; import gov.redhawk.ide.codegen.CodegenPackage; import gov.redhawk.ide.codegen.ICodeGeneratorDescriptor; import gov.redhawk.ide.codegen.IPropertyDescriptor; import gov.redhawk.ide.codegen.ITemplateDesc; import gov.redhawk.ide.codegen.ImplementationSettings; import gov.redhawk.ide.codegen.Property; import gov.redhawk.ide.codegen.RedhawkCodegenActivator; import gov.redhawk.ui.util.SWTUtil; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import mil.jpeojtrs.sca.spd.Implementation; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.observable.set.ISetChangeListener; import org.eclipse.core.databinding.observable.set.SetChangeEvent; import org.eclipse.core.databinding.observable.set.WritableSet; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.jface.databinding.viewers.ViewersObservables; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.widgets.FormToolkit; /** * @since 2.0 */ public class BooleanGeneratorPropertiesComposite extends BaseGeneratorPropertiesComposite implements ICodegenComposite { private static final int TOOLTIP_DELAY_MILLIS = 300; private static final int TOOLTIP_DISPLAY_TIME_MILLIS = 5000; private static final int TOOLTIP_OFFSET = 5; private CheckboxTableViewer propertiesViewer; private HashMap<ImplementationSettings, WritableSet> setMap; private Binding propBinding; /** * @param parent * @param style * @param toolkit */ public BooleanGeneratorPropertiesComposite(final Composite parent, final int style, final FormToolkit toolkit) { super(parent, style, toolkit); initialize(); } /** * {@inheritDoc} */ @Override protected void templateSelected(final ITemplateDesc desc) { // Remove the old properties in the ImplementationSettings final EList<Property> properties = this.getImplSettings().getProperties(); if (!properties.isEmpty()) { final Collection<Property> c = new ArrayList<Property>(); c.addAll(properties); final Command command = RemoveCommand.create(this.getEditingDomain(), this.getImplSettings(), CodegenPackage.Literals.IMPLEMENTATION_SETTINGS__PROPERTIES, c); this.getEditingDomain().getCommandStack().execute(command); } // Add the new Properties with their default values if (desc.getPropertyDescriptors().length != 0) { final CompoundCommand comp = new CompoundCommand(); for (final IPropertyDescriptor value : desc.getPropertyDescriptors()) { final Property p = CodegenFactory.eINSTANCE.createProperty(); p.setId(value.getKey()); p.setValue(value.getDefaultValue()); comp.append(AddCommand.create(this.getEditingDomain(), this.getImplSettings(), CodegenPackage.Literals.IMPLEMENTATION_SETTINGS__PROPERTIES, p)); } this.getEditingDomain().getCommandStack().execute(comp); } this.propertiesViewer.setInput(this.getImplSettings().getProperties()); this.propertiesViewer.refresh(true); if (this.getImplSettings().getProperties().size() > 0) { this.propertiesViewer.reveal( this.getImplSettings().getProperties().get(this.getImplSettings().getProperties().size() - 1)); } createPropertyBinding(); } /** * {@inheritDoc} */ @Override public void dispose() { this.getContext().removeBinding(this.propBinding); super.dispose(); } /** * {@inheritDoc} * * @since 6.0 */ @Override protected void createPropertiesArea() { final Label label = this.getToolkit().createLabel(this, "Properties:"); label.setForeground(this.getToolkit().getColors().getColor(IFormColors.TITLE)); label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.TOP).create()); final Composite tableComp = this.getToolkit().createComposite(this, SWT.NULL); final GridLayout layout = SWTUtil.TABLE_ENTRY_LAYOUT_FACTORY.create(); tableComp.setLayout(layout); tableComp.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).indent(2, 0).grab(true, true).create()); this.propertiesViewer = new CheckboxTableViewer( new Table(tableComp, SWT.BORDER | SWT.CHECK | SWT.READ_ONLY)); this.propertiesViewer.setContentProvider(new ArrayContentProvider()); ColumnViewerToolTipSupport.enableFor(this.propertiesViewer); final CellLabelProvider labelProvider = new CellLabelProvider() { public String getText(final Object element) { String text = ""; if (element instanceof Property) { if (((Property) element).getId().length() != 0) { final ICodeGeneratorDescriptor generator = RedhawkCodegenActivator .getCodeGeneratorsRegistry().findCodegen(BooleanGeneratorPropertiesComposite.this .getImplSettings().getGeneratorId()); final ITemplateDesc template = getTemplateDesc(generator); if (template != null) { for (final IPropertyDescriptor propDesc : template.getPropertyDescriptors()) { if (propDesc.getKey().equals(((Property) element).getId())) { text = propDesc.getName(); break; } } } } else { text = ((Property) element).getId(); } } return text; } @Override public String getToolTipText(final Object element) { String text = "No description available for this property"; if (element instanceof Property) { if (((Property) element).getId().length() != 0) { final ICodeGeneratorDescriptor generator = RedhawkCodegenActivator .getCodeGeneratorsRegistry().findCodegen(BooleanGeneratorPropertiesComposite.this .getImplSettings().getGeneratorId()); final ITemplateDesc template = getTemplateDesc(generator); if (template != null) { for (final IPropertyDescriptor propDesc : template.getPropertyDescriptors()) { if (propDesc.getKey().equals(((Property) element).getId())) { text = propDesc.getDescription(); break; } } } } } return text; } @Override public Point getToolTipShift(final Object object) { return new Point(BooleanGeneratorPropertiesComposite.TOOLTIP_OFFSET, BooleanGeneratorPropertiesComposite.TOOLTIP_OFFSET); } @Override public int getToolTipDisplayDelayTime(final Object object) { return BooleanGeneratorPropertiesComposite.TOOLTIP_DELAY_MILLIS; } @Override public int getToolTipTimeDisplayed(final Object object) { return BooleanGeneratorPropertiesComposite.TOOLTIP_DISPLAY_TIME_MILLIS; } @Override public void update(final ViewerCell cell) { cell.setText(getText(cell.getElement())); } }; this.propertiesViewer.setLabelProvider(labelProvider); this.propertiesViewer.getControl() .setLayoutData(GridDataFactory.fillDefaults().span(2, 2).grab(true, true).create()); } /** * {@inheritDoc} * * @since 6.0 */ @Override protected void createPropertyBinding() { if (this.setMap == null) { this.setMap = new HashMap<ImplementationSettings, WritableSet>(); } else { this.getContext().removeBinding(this.propBinding); this.setMap.remove(this.getImplSettings()); } final WritableSet mySet; if (!this.setMap.containsKey(this.getImplSettings())) { mySet = new WritableSet(); for (final Property prop : this.getImplSettings().getProperties()) { if ("TRUE".equalsIgnoreCase(prop.getValue())) { mySet.add(prop); } } mySet.addSetChangeListener(new ISetChangeListener() { @Override public void handleSetChange(final SetChangeEvent event) { for (final Object obj : event.diff.getRemovals()) { final Property p = (Property) obj; final Command command = SetCommand.create( BooleanGeneratorPropertiesComposite.this.getEditingDomain(), p, CodegenPackage.Literals.PROPERTY__VALUE, "FALSE"); BooleanGeneratorPropertiesComposite.this.getEditingDomain().getCommandStack() .execute(command); break; } for (final Object obj : event.diff.getAdditions()) { final Property p = (Property) obj; final Command command = SetCommand.create( BooleanGeneratorPropertiesComposite.this.getEditingDomain(), p, CodegenPackage.Literals.PROPERTY__VALUE, "TRUE"); BooleanGeneratorPropertiesComposite.this.getEditingDomain().getCommandStack() .execute(command); break; } } }); this.setMap.put(this.getImplSettings(), mySet); } else { mySet = this.setMap.get(this.getImplSettings()); } this.propBinding = this.getContext().bindSet( ViewersObservables.observeCheckedElements(this.propertiesViewer, Property.class), mySet, null, null); } /** * {@inheritDoc} */ @Override protected void preBind(final Implementation impl, final ImplementationSettings implSettings, final List<Binding> bindList) { this.propertiesViewer.setInput(this.getImplSettings().getProperties()); } }