/******************************************************************************* * 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.spd.internal.ui.editor; import gov.redhawk.common.ui.editor.FormLayoutFactory; import gov.redhawk.common.ui.parts.FormEntry; import gov.redhawk.ide.prf.ui.wizard.PrfModelWizard; import gov.redhawk.ide.spd.internal.ui.editor.composite.GeneralInformationComposite; import gov.redhawk.ide.spd.ui.ComponentUiPlugin; import gov.redhawk.ide.spd.ui.wizard.ScdModelWizard; import gov.redhawk.model.sca.util.ModelUtil; import gov.redhawk.prf.ui.editor.page.PropertiesFormPage; import gov.redhawk.ui.editor.FormEntryAdapter; import gov.redhawk.ui.editor.SCAFormEditor; import gov.redhawk.ui.editor.ScaSection; import gov.redhawk.ui.util.EMFEmptyStringToNullUpdateValueStrategy; import gov.redhawk.ui.util.EntryUtil; import gov.redhawk.ui.util.SCAEditorUtil; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import mil.jpeojtrs.sca.prf.PrfPackage; import mil.jpeojtrs.sca.scd.ScdPackage; import mil.jpeojtrs.sca.scd.SoftwareComponent; import mil.jpeojtrs.sca.spd.Descriptor; import mil.jpeojtrs.sca.spd.LocalFile; import mil.jpeojtrs.sca.spd.PropertyFile; import mil.jpeojtrs.sca.spd.SoftPkg; import mil.jpeojtrs.sca.spd.SpdFactory; import mil.jpeojtrs.sca.spd.SpdPackage; import mil.jpeojtrs.sca.util.DceUuidUtil; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.CommonPlugin; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.databinding.FeaturePath; import org.eclipse.emf.databinding.edit.EMFEditObservables; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.statushandlers.StatusManager; /** * The Class GeneralInfoSection. */ public class GeneralInfoSection extends ScaSection { private GeneralInformationComposite client; private Resource spdResource; private final Collection<Binding> bindings = new ArrayList<Binding>(); // Let's us know if the resource is a Softpackage Library private boolean isLibrary; /** * Instantiates a new general info section. * * @param page the page * @param parent the parent */ public GeneralInfoSection(final ComponentOverviewPage page, final Composite parent) { super(page, parent, Section.DESCRIPTION); createClient(getSection(), page.getEditor().getToolkit(), page); } protected void createClient(final Section section, final FormToolkit toolkit, ComponentOverviewPage page) { section.setText("General Information"); section.setLayout(FormLayoutFactory.createClearTableWrapLayout(false, 1)); final TableWrapData data = new TableWrapData(TableWrapData.FILL_GRAB); section.setLayoutData(data); section.setDescription("This section describes general information about this resource."); final IActionBars actionBars = getPage().getEditor().getEditorSite().getActionBars(); this.client = new GeneralInformationComposite(section, SWT.None, toolkit, actionBars, page.isSoftpackageLibrary()); section.setClient(this.client); addListeners(actionBars); toolkit.adapt(this.client); toolkit.paintBordersFor(this.client); } /** * {@inheritDoc} */ @Override protected void createClient(final Section section, final FormToolkit toolkit) { createClient(section, toolkit, null); } /** * Add Listeners to handle Control Events * * @param actionBars */ private void addListeners(final IActionBars actionBars) { if (this.getPage() instanceof ComponentOverviewPage) { isLibrary = ((ComponentOverviewPage) this.getPage()).isSoftpackageLibrary(); } // Don't add the following listeners is the resource is a Softpackage Library if (!isLibrary) { this.client.getScdEntry().setFormEntryListener(new FormEntryAdapter(actionBars) { @Override public void buttonSelected(final FormEntry entry) { final IProject project = getProject(); if (project != null) { final IResource file = ModelUtil.getResource(getSoftPkg()); if (file != null) { final String newPath = EntryUtil.browse(project, getScdFile(), ScdPackage.FILE_EXTENSION); if (newPath != null && (getScdFile() == null || !newPath.equals(getScdFile().getName()))) { setScdFileName(newPath); } } } } @Override public void linkActivated(final HyperlinkEvent e) { handleScdLinkActivated(); } }); this.client.getPrfEntry().setFormEntryListener(new FormEntryAdapter(actionBars) { @Override public void buttonSelected(final FormEntry entry) { final IProject project = getProject(); if (project != null) { final String newPath = EntryUtil.browse(project, getPrfFile(), PrfPackage.FILE_EXTENSION); if (newPath != null && (getPrfFile() == null || !newPath.equals(getPrfFile().getName()))) { setPrfFileName(newPath); } } } @Override public void linkActivated(final HyperlinkEvent e) { handlePrfLinkActivated(); } }); } final FormEntryAdapter fIdEntryAdapter = new FormEntryAdapter(actionBars) { @Override public void buttonSelected(final FormEntry entry) { execute(SetCommand.create(getEditingDomain(), getSoftPkg(), SpdPackage.Literals.SOFT_PKG__ID, DceUuidUtil.createDceUUID())); } }; this.client.getIdEntry().setFormEntryListener(fIdEntryAdapter); } private SoftwareComponent getSoftwareComponent() { try { return getSoftPkg().getDescriptor().getComponent(); } catch (final NullPointerException e) { return null; } } /** * Open scd file. */ private void openScdFile() { final SoftwareComponent scd = getSoftwareComponent(); if (scd == null || scd.eResource() == null) { return; } else { try { org.eclipse.emf.common.util.URI uri = scd.eResource().getURI(); if (uri.isPlatformResource()) { IDE.openEditor(getWorkbenchPage(), (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(uri.toPlatformString(true))); } else { if (uri.isPlatform()) { uri = CommonPlugin.resolve(uri); } IDE.openEditorOnFileStore(getWorkbenchPage(), EFS.getStore(URI.create((uri.toString())))); } } catch (final PartInitException e1) { final Status status = new Status(IStatus.ERROR, ComponentUiPlugin.getPluginId(), "Failed to open SCD File: " + getScdFileName(), e1); StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); } catch (final CoreException e) { final Status status = new Status(IStatus.ERROR, ComponentUiPlugin.getPluginId(), "Failed to open SCD File: " + getScdFileName(), e); StatusManager.getManager().handle(status, StatusManager.SHOW | StatusManager.LOG); } } } /** * Gets the workbench page. * * @return the workbench page */ private IWorkbenchPage getWorkbenchPage() { return getPage().getEditor().getSite().getPage(); } /** * Sets the scd file name. * * @param value the value */ private void setScdFileName(final String value) { if (value == null || value.length() == 0) { SetCommand.create(getEditingDomain(), getSoftPkg(), SpdPackage.Literals.SOFT_PKG__DESCRIPTOR, null).execute(); } else { final CompoundCommand command = new CompoundCommand("Set SCD file"); Descriptor descriptor = getSoftPkg().getDescriptor(); if (descriptor == null) { descriptor = SpdFactory.eINSTANCE.createDescriptor(); command.append(SetCommand.create(getEditingDomain(), getSoftPkg(), SpdPackage.Literals.SOFT_PKG__DESCRIPTOR, descriptor)); } LocalFile file = descriptor.getLocalfile(); if (file == null) { file = SpdFactory.eINSTANCE.createLocalFile(); command.append(SetCommand.create(getEditingDomain(), descriptor, SpdPackage.Literals.DESCRIPTOR__LOCALFILE, file)); } command.append(SetCommand.create(getEditingDomain(), file, SpdPackage.Literals.LOCAL_FILE__NAME, value)); getEditingDomain().getCommandStack().execute(command); } } /** * Gets the scd file name. * * @return the scd file name */ private String getScdFileName() { String retVal = ModelUtil.getScdFileName(getSoftPkg()); if (retVal == null) { retVal = ""; } return retVal; } /** * Sets the prf file name. * * @param name the new prf file name */ private void setPrfFileName(final String name) { if (name == null || name.length() == 0) { final Command command = SetCommand.create(getEditingDomain(), getSoftPkg(), SpdPackage.Literals.SOFT_PKG__PROPERTY_FILE, null); getEditingDomain().getCommandStack().execute(command); } else { final CompoundCommand command = new CompoundCommand("Set Prf File"); PropertyFile propfile = getSoftPkg().getPropertyFile(); if (propfile == null) { propfile = SpdFactory.eINSTANCE.createPropertyFile(); command.append(SetCommand.create(getEditingDomain(), getSoftPkg(), SpdPackage.Literals.SOFT_PKG__PROPERTY_FILE, propfile)); } LocalFile localFile = propfile.getLocalFile(); if (localFile == null) { localFile = SpdFactory.eINSTANCE.createLocalFile(); command.append(SetCommand.create(getEditingDomain(), propfile, SpdPackage.Literals.PROPERTY_FILE__LOCAL_FILE, localFile)); propfile.setLocalFile(localFile); } command.append(SetCommand.create(getEditingDomain(), localFile, SpdPackage.Literals.LOCAL_FILE__NAME, name)); getEditingDomain().getCommandStack().execute(command); } } /** * Handle prf link activated. */ private void handlePrfLinkActivated() { if (getPrfFile() == null) { handleNewPrfFile(); } else { openPrfFile(); } } /** * Handle prf link activated. */ private void handleScdLinkActivated() { if (getScdFile() == null) { handleNewScdFile(); } else { openScdFile(); } } /** * Handle new prf file. */ private void handleNewPrfFile() { final IProject project = getProject(); if (project != null) { final PrfModelWizard wizard = new PrfModelWizard(project); if (getSoftPkg().getPropertyFile() != null && getSoftPkg().getPropertyFile().getLocalFile() != null) { String initialValue = getSoftPkg().getPropertyFile().getLocalFile().getName(); wizard.setInitialValue(initialValue); } wizard.init(getPage().getSite().getWorkbenchWindow().getWorkbench(), new StructuredSelection(project)); final WizardDialog dialog = new WizardDialog(getPage().getSite().getShell(), wizard); if (dialog.open() == Window.OK) { final String value = wizard.getModelFile().getProjectRelativePath().toPortableString(); setPrfFileName(value); // Allows the editor to add the properties page and the prf.xml tab without having to close and reopen. if (getPage().getEditor() instanceof ComponentEditor) { ComponentEditor scaEditor = (ComponentEditor) getPage().getEditor(); scaEditor.newPrfAdded(); } } } } /** * Handle new scd file. */ private void handleNewScdFile() { final IProject project = getProject(); if (project != null) { final ScdModelWizard wizard = new ScdModelWizard(project); if (getSoftPkg().getDescriptor() != null && getSoftPkg().getDescriptor().getLocalfile() != null) { String initialValue = getSoftPkg().getDescriptor().getLocalfile().getName(); wizard.setInitialValue(initialValue); } wizard.init(getPage().getSite().getWorkbenchWindow().getWorkbench(), new StructuredSelection(project)); final WizardDialog dialog = new WizardDialog(getPage().getSite().getShell(), wizard); if (dialog.open() == Window.OK) { final String value = wizard.getModelFile().getProjectRelativePath().toPortableString(); setScdFileName(value); } } } /** * Open prf file. */ protected void openPrfFile() { final IFile prfFile = getPrfFile(); if (prfFile == null || !prfFile.exists()) { return; } else { getPage().getEditor().setActivePage(PropertiesFormPage.PAGE_ID); } } /** * Gets the prf file. * * @return the prf file */ private IFile getPrfFile() { IFile file = ModelUtil.getPrfFile(getSoftPkg().getPropertyFile()); if (file == null || !file.exists()) { return null; } return file; } /** * Gets the scd file. * * @return the scd file */ private IFile getScdFile() { IFile file = ModelUtil.getScdFile(getSoftPkg().getDescriptor()); if (file == null || !file.exists()) { return null; } return file; } /** * Gets the project. * * @return the project */ protected IProject getProject() { return ModelUtil.getProject(getSoftPkg()); } /** * @param create */ protected void execute(final Command command) { getEditingDomain().getCommandStack().execute(command); } /** * Gets the editing domain. * * @return the editing domain */ private EditingDomain getEditingDomain() { return getPage().getEditor().getEditingDomain(); } /** * TODO * * @return */ private SoftPkg getSoftPkg() { if (this.spdResource != null) { return SoftPkg.Util.getSoftPkg(this.spdResource); } return null; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public void refresh(final Resource resource) { this.spdResource = resource; this.client.setEditable(SCAEditorUtil.isEditableResource(getPage(), this.spdResource)); for (final Binding binding : this.bindings) { binding.dispose(); } this.bindings.clear(); final SoftPkg model = getSoftPkg(); if (model == null) { return; } final DataBindingContext context = this.getPage().getEditor().getDataBindingContext(); this.bindings.add(context.bindValue( WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(), this.client.getIdEntry().getText()), EMFEditObservables.observeValue(getEditingDomain(), model, SpdPackage.Literals.SOFT_PKG__ID), new EMFEmptyStringToNullUpdateValueStrategy(), null)); this.bindings.add(context.bindValue( WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(), this.client.getVersionEntry().getText()), EMFEditObservables.observeValue(getEditingDomain(), model, SpdPackage.Literals.SOFT_PKG__VERSION), new EMFEmptyStringToNullUpdateValueStrategy(), null)); this.bindings.add(context.bindValue( WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(), this.client.getNameEntry().getText()), EMFEditObservables.observeValue(getEditingDomain(), model, SpdPackage.Literals.SOFT_PKG__NAME), new EMFEmptyStringToNullUpdateValueStrategy(), null)); WidgetProperties.text(SWT.Modify).observe(this.client.getNameEntry().getText()); this.bindings.add(context.bindValue( WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(), this.client.getTitleEntry().getText()), EMFEditObservables.observeValue(getEditingDomain(), model, SpdPackage.Literals.SOFT_PKG__TITLE), new EMFEmptyStringToNullUpdateValueStrategy(), null)); this.bindings.add(context.bindValue( WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(), this.client.getDescriptionEntry().getText()), EMFEditObservables.observeValue(getEditingDomain(), model, SpdPackage.Literals.SOFT_PKG__DESCRIPTION), new EMFEmptyStringToNullUpdateValueStrategy(), null)); if (!isLibrary) { this.bindings.add(context.bindValue( WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(), this.client.getPrfEntry().getText()), EMFEditProperties.value( getEditingDomain(), FeaturePath.fromList(SpdPackage.Literals.SOFT_PKG__PROPERTY_FILE, SpdPackage.Literals.PROPERTY_FILE__LOCAL_FILE, SpdPackage.Literals.LOCAL_FILE__NAME)).observe(model), null, null)); this.bindings.add(context.bindValue( WidgetProperties.text(SWT.Modify).observeDelayed(SCAFormEditor.getFieldBindingDelay(), this.client.getScdEntry().getText()), EMFEditProperties.value( getEditingDomain(), FeaturePath.fromList(SpdPackage.Literals.SOFT_PKG__DESCRIPTOR, SpdPackage.Literals.DESCRIPTOR__LOCALFILE, SpdPackage.Literals.LOCAL_FILE__NAME)).observe(model), null, null)); } this.client.getTypeEntry().setValue(String.valueOf(model.getType())); } }