/******************************************************************************* * Copyright (c) 2011, 2014 Wind River Systems, Inc. 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.tcf.ui.editor; import java.io.IOException; import java.util.EventObject; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.ILabelDecorator; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.tcf.protocol.Protocol; import org.eclipse.tcf.te.runtime.concurrent.util.ExecutorsUtil; import org.eclipse.tcf.te.runtime.events.ChangeEvent; import org.eclipse.tcf.te.runtime.events.EventManager; import org.eclipse.tcf.te.runtime.interfaces.events.IEventListener; import org.eclipse.tcf.te.runtime.persistence.interfaces.IURIPersistenceService; import org.eclipse.tcf.te.runtime.services.ServiceManager; import org.eclipse.tcf.te.runtime.statushandler.StatusHandlerUtil; import org.eclipse.tcf.te.runtime.utils.StatusHelper; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNode; import org.eclipse.tcf.te.tcf.locator.interfaces.nodes.IPeerNodeProperties; import org.eclipse.tcf.te.tcf.ui.activator.UIPlugin; import org.eclipse.tcf.te.tcf.ui.editor.sections.AttributesSection; import org.eclipse.tcf.te.tcf.ui.editor.sections.GeneralInformationSection; import org.eclipse.tcf.te.tcf.ui.editor.sections.ServicesSection; import org.eclipse.tcf.te.tcf.ui.editor.sections.TransportSection; import org.eclipse.tcf.te.tcf.ui.help.IContextHelpIds; import org.eclipse.tcf.te.tcf.ui.internal.ImageConsts; import org.eclipse.tcf.te.tcf.ui.nls.Messages; import org.eclipse.tcf.te.ui.forms.CustomFormToolkit; import org.eclipse.tcf.te.ui.views.extensions.LabelProviderDelegateExtensionPointManager; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; /** * Peer overview page implementation. */ public class OverviewEditorPage extends AbstractCustomFormToolkitEditorPage { // References to the page sub sections private GeneralInformationSection infoSection; private TransportSection transportSection; private ServicesSection servicesSection; private AttributesSection attributesSection; private IEventListener listener = null; /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractEditorPage#setInput(org.eclipse.ui.IEditorInput) */ @Override protected void setInput(IEditorInput input) { IEditorInput oldInput = getEditorInput(); // do nothing when input did not change if (oldInput != null && oldInput.equals(input)) { return; } super.setInput(input); if (listener == null) { listener = new IEventListener() { @Override public void eventFired(EventObject event) { ChangeEvent changeEvent = (ChangeEvent)event; if ((IPeerNodeProperties.PROPERTY_CONNECT_STATE.equals(changeEvent.getEventId()) || IPeerNodeProperties.PROPERTY_IS_VALID.equals(changeEvent.getEventId()) || IPeerNodeProperties.PROPERTY_WARNINGS.equals(changeEvent.getEventId())) && event.getSource() == getEditorInputNode()) { ExecutorsUtil.executeInUI(new Runnable() { @Override public void run() { getManagedForm().getForm().setImage(getFormImage()); } }); } } }; EventManager.getInstance().addEventListener(listener, ChangeEvent.class); } } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractCustomFormToolkitEditorPage#dispose() */ @Override public void dispose() { if (listener != null) { EventManager.getInstance().removeEventListener(listener); listener = null; } if (infoSection != null) { infoSection.dispose(); infoSection = null; } if (transportSection != null) { transportSection.dispose(); transportSection = null; } if (servicesSection != null) { servicesSection.dispose(); servicesSection = null; } if (attributesSection != null) { attributesSection.dispose(); attributesSection = null; } super.dispose(); } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractCustomFormToolkitEditorPage#getContextHelpId() */ @Override protected String getContextHelpId() { return IContextHelpIds.OVERVIEW_EDITOR_PAGE; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractCustomFormToolkitEditorPage#getFormTitle() */ @Override protected String getFormTitle() { return Messages.OverviewEditorPage_title; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractCustomFormToolkitEditorPage#getFormImage() */ @Override protected Image getFormImage() { Image image = null; if (getEditorInputNode() instanceof IPeerNode) { ILabelProvider[] delegates = LabelProviderDelegateExtensionPointManager.getInstance().getDelegates(getEditorInputNode(), false); if (delegates != null && delegates.length > 0) { image = delegates[0].getImage(getEditorInputNode()); if (image != null && delegates[0] instanceof ILabelDecorator) { image = ((ILabelDecorator)delegates[0]).decorateImage(image, getEditorInputNode()); } } } return image != null ? image : UIPlugin.getImage(ImageConsts.CONNECTION); } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractCustomFormToolkitEditorPage#doCreateFormContent(org.eclipse.swt.widgets.Composite, org.eclipse.tcf.te.ui.forms.CustomFormToolkit) */ @Override protected void doCreateFormContent(Composite parent, CustomFormToolkit toolkit) { Assert.isNotNull(parent); Assert.isNotNull(toolkit); // Setup the main panel (using the table wrap layout) Composite panel = toolkit.getFormToolkit().createComposite(parent); TableWrapLayout layout = new TableWrapLayout(); layout.makeColumnsEqualWidth = true; layout.numColumns = 2; panel.setLayout(layout); panel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); infoSection = new GeneralInformationSection(getManagedForm(), panel); infoSection.getSection().setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP)); getManagedForm().addPart(infoSection); transportSection = new TransportSection(getManagedForm(), (Composite)infoSection.getSection().getClient()); ((GridData)transportSection.getSection().getLayoutData()).horizontalSpan = 2; getManagedForm().addPart(transportSection); servicesSection = new ServicesSection(getManagedForm(), panel); TableWrapData layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.TOP); servicesSection.getSection().setLayoutData(layoutData); getManagedForm().addPart(servicesSection); attributesSection = new AttributesSection(getManagedForm(), panel); layoutData = new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.FILL_GRAB); layoutData.colspan = 2; attributesSection.getSection().setLayoutData(layoutData); getManagedForm().addPart(attributesSection); } /* (non-Javadoc) * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean) */ @Override public void setActive(boolean active) { super.setActive(active); if (infoSection != null) infoSection.setActive(active); if (transportSection != null) transportSection.setActive(active); if (servicesSection != null) servicesSection.setActive(active); if (attributesSection != null) attributesSection.setActive(active); validate(); } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractEditorPage#doValidate() */ @Override protected ValidationResult doValidate() { ValidationResult result = super.doValidate(); if (infoSection != null) { infoSection.isValid(); result.setResult(infoSection); } if (transportSection != null) { transportSection.isValid(); result.setResult(transportSection); } if (servicesSection != null) { servicesSection.isValid(); result.setResult(servicesSection); } if (attributesSection != null) { attributesSection.isValid(); result.setResult(attributesSection); } return result; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractEditorPage#postDoSave(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void postDoSave(IProgressMonitor monitor) { // If necessary, write the changed peer attributes final Object input = getEditorInputNode(); if (input instanceof IPeerNode) { Runnable runnable = new Runnable() { @Override public void run() { try { // Get the persistence service IURIPersistenceService uRIPersistenceService = ServiceManager.getInstance().getService(IURIPersistenceService.class); if (uRIPersistenceService == null) { throw new IOException("Persistence service instance unavailable."); //$NON-NLS-1$ } // Save the peer node to the new persistence storage uRIPersistenceService.write(((IPeerNode)input).getPeer(), null); } catch (IOException e) { // Build up the message template String template = NLS.bind(Messages.OverviewEditorPage_error_save, ((IPeerNode)input).getName(), Messages.PossibleCause); // Handle the status StatusHandlerUtil.handleStatus(StatusHelper.getStatus(e), input, template, null, IContextHelpIds.MESSAGE_SAVE_FAILED, OverviewEditorPage.this, null); } } }; Assert.isTrue(!Protocol.isDispatchThread()); Protocol.invokeAndWait(runnable); Protocol.invokeLater(new Runnable() { @Override public void run() { // Trigger a change event for the original data node ((IPeerNode)input).fireChangeEvent("properties", null, ((IPeerNode)input).getProperties()); //$NON-NLS-1$ } }); } } }