/*******************************************************************************
* Copyright (c) 2013, 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.action.ControlContribution;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
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.core.interfaces.IPathMapService;
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.locator.interfaces.services.IDefaultContextService;
import org.eclipse.tcf.te.tcf.ui.help.IContextHelpIds;
import org.eclipse.tcf.te.tcf.ui.nls.Messages;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
/**
* Abstract configuration editor page implementation.
*/
public abstract class AbstractConfigurationEditorPage extends AbstractCustomFormToolkitEditorPage {
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() {
@SuppressWarnings("synthetic-access")
@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() {
if (!getManagedForm().getForm().isDisposed()) {
setFormTitle(getFormTitle());
setFormImage(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; }
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractEditorPage#postDoSave(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void postDoSave(IProgressMonitor monitor) {
super.postDoSave(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);
// Reopen the editor on the current page
// ViewsUtil.reopenEditor(getEditor(), getEditor().getActivePageInstance().getId(), false);
} catch (IOException e) {
// Build up the message template
String template = NLS.bind(Messages.AbstractConfigurationEditorPage_error_save, ((IPeerNode)input).getName(), Messages.AbstractConfigurationEditorPage_error_possibleCause);
// Handle the status
StatusHandlerUtil.handleStatus(StatusHelper.getStatus(e), input, template, null, IContextHelpIds.MESSAGE_SAVE_FAILED, AbstractConfigurationEditorPage.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$
}
});
IPathMapService service = ServiceManager.getInstance().getService(input, IPathMapService.class);
if (service != null) {
service.generateSourcePathMappings(input);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.tcf.te.ui.views.editor.pages.AbstractCustomFormToolkitEditorPage#doCreateLinkContribution(org.eclipse.jface.action.IToolBarManager)
*/
@Override
protected IContributionItem doCreateLinkContribution(final IToolBarManager tbManager) {
return new ControlContribution("SetAsDefaultContextLink") { //$NON-NLS-1$
IEventListener eventListener = null;
@Override
public void dispose() {
super.dispose();
if (eventListener == null) {
EventManager.getInstance().removeEventListener(eventListener);
}
}
@Override
protected Control createControl(Composite parent) {
final ImageHyperlink hyperlink = new ImageHyperlink(parent, SWT.NONE);
hyperlink.setText("Set as default connection"); //$NON-NLS-1$
hyperlink.setUnderlined(true);
hyperlink.setForeground(getManagedForm().getToolkit().getHyperlinkGroup().getForeground());
IPeerNode defaultNode = ServiceManager.getInstance().getService(IDefaultContextService.class).getDefaultContext(null);
setVisible(defaultNode == null || defaultNode != getEditorInputNode());
hyperlink.addHyperlinkListener(new IHyperlinkListener() {
@Override
public void linkActivated(HyperlinkEvent e) {
if (getEditorInputNode() instanceof IPeerNode) {
ServiceManager.getInstance().getService(IDefaultContextService.class).setDefaultContext((IPeerNode)getEditorInputNode());
}
}
@Override
public void linkEntered(HyperlinkEvent e) {
hyperlink.setForeground(getManagedForm().getToolkit().getHyperlinkGroup().getActiveForeground());
}
@Override
public void linkExited(HyperlinkEvent e) {
hyperlink.setForeground(getManagedForm().getToolkit().getHyperlinkGroup().getForeground());
}
});
eventListener = new IEventListener() {
@Override
public void eventFired(EventObject event) {
if (event instanceof ChangeEvent) {
ChangeEvent changeEvent = (ChangeEvent)event;
if (changeEvent.getSource() instanceof IDefaultContextService) {
IPeerNode defaultNode = ServiceManager.getInstance().getService(IDefaultContextService.class).getDefaultContext(null);
setVisible(defaultNode == null || getEditorInputNode() == null || defaultNode != getEditorInputNode());
ExecutorsUtil.executeInUI(new Runnable() {
@Override
public void run() {
tbManager.update(true);
}
});
}
}
}
};
EventManager.getInstance().addEventListener(eventListener, ChangeEvent.class);
return hyperlink;
}
};
}
}