/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.project.build.fix;
import javax.inject.Inject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.statushandlers.StatusManager;
import org.rf.ide.core.project.RobotProjectConfig;
import org.robotframework.ide.eclipse.main.plugin.RedPlugin;
import org.robotframework.ide.eclipse.main.plugin.model.RobotProject;
import org.robotframework.ide.eclipse.main.plugin.project.RedEclipseProjectConfigReader;
import org.robotframework.ide.eclipse.main.plugin.project.RedEclipseProjectConfigWriter;
import org.robotframework.ide.eclipse.main.plugin.project.editor.RedProjectEditor;
/**
* @author Michal Anglart
*
*/
public abstract class RedConfigFileCompletionProposal implements ICompletionProposal {
@Inject
protected IEventBroker eventBroker;
private final IMarker marker;
protected final IFile externalFile;
private final String shortDescription;
private final String detailedDescription;
public RedConfigFileCompletionProposal(final IMarker marker, final IFile externalFile,
final String shortDescription, final String detailedDescription) {
this.marker = marker;
this.externalFile = externalFile;
this.shortDescription = shortDescription;
this.detailedDescription = detailedDescription;
final IEclipseContext context = PlatformUI.getWorkbench().getService(IEclipseContext.class)
.getActiveLeaf();
ContextInjectionFactory.inject(this, context);
}
@Override
public void apply(final IDocument currentFileDocument) {
try {
final RobotProject robotProject = RedPlugin.getModelManager().createProject(externalFile.getProject());
RobotProjectConfig config = robotProject.getOpenedProjectConfig();
final boolean isEditorOpened = config != null;
if (config == null) {
config = new RedEclipseProjectConfigReader().readConfiguration(robotProject.getConfigurationFile());
}
if (apply(externalFile, config)) {
marker.delete();
if (!isEditorOpened) {
new RedEclipseProjectConfigWriter().writeConfiguration(config, externalFile.getProject());
}
final RedProjectEditor redXmlEditor = openEditor();
openDesiredPageInEditor(redXmlEditor);
fireEvents();
}
} catch (final ProposalApplyingException | CoreException e) {
StatusManager.getManager().handle(new Status(IStatus.ERROR, RedPlugin.PLUGIN_ID, e.getMessage(), e));
}
}
private RedProjectEditor openEditor() throws PartInitException {
final IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
final FileEditorInput input = new FileEditorInput(externalFile);
final IEditorRegistry editorRegistry = PlatformUI.getWorkbench().getEditorRegistry();
final IEditorDescriptor desc = editorRegistry.findEditor(RedProjectEditor.ID);
final RedProjectEditor redXmlEditor = (RedProjectEditor) page.openEditor(input, desc.getId());
return redXmlEditor;
}
protected abstract void openDesiredPageInEditor(RedProjectEditor editor);
protected void fireEvents() {
// nothing to do here
}
public abstract boolean apply(final IFile externalFile, RobotProjectConfig config) throws ProposalApplyingException;
@Override
public Point getSelection(final IDocument document) {
return null;
}
@Override
public String getAdditionalProposalInfo() {
return detailedDescription;
}
@Override
public String getDisplayString() {
return shortDescription;
}
@Override
public Image getImage() {
return null;
}
@Override
public IContextInformation getContextInformation() {
return null;
}
static class ProposalApplyingException extends RuntimeException {
private static final long serialVersionUID = 1L;
public ProposalApplyingException(final String message) {
super(message);
}
public ProposalApplyingException(final String message, final Throwable cause) {
super(message, cause);
}
}
}