/* * 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 static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Maps.newHashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.window.Window; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.rf.ide.core.project.RobotProjectConfig; import org.rf.ide.core.project.RobotProjectConfig.VariableMapping; import org.rf.ide.core.testdata.model.RobotExpressions; import org.robotframework.ide.eclipse.main.plugin.RedImages; import org.robotframework.ide.eclipse.main.plugin.project.RobotProjectConfigEvents; import org.robotframework.ide.eclipse.main.plugin.project.editor.RedProjectEditor; import org.robotframework.ide.eclipse.main.plugin.project.editor.general.VariableMappingsFormFragment.VariableMappingDialog; import org.robotframework.red.graphics.ImagesManager; import org.robotframework.red.swt.SwtThread; import org.robotframework.red.swt.SwtThread.Evaluation; /** * @author Michal Anglart * */ public class DefineGlobalVariableInConfigFixer extends RedXmlConfigMarkerResolution { private final String variable; public static List<DefineGlobalVariableInConfigFixer> createFixers(final String parameterizedPath) { final List<String> variables = RobotExpressions.getVariables(parameterizedPath); final Map<String, String> vars = newHashMap(); final List<DefineGlobalVariableInConfigFixer> fixers = newArrayList(); for (final String var : variables) { if (!vars.containsKey(var)) { fixers.add(new DefineGlobalVariableInConfigFixer(var)); } } return fixers; } public DefineGlobalVariableInConfigFixer(final String variable) { this.variable = variable; } @Override public String getLabel() { return "Define '" + variable + "' variable"; } @Override protected ICompletionProposal asContentProposal(final IMarker marker, final IFile externalFile) { return new DefineLibraryProposal(marker, externalFile, variable, getLabel()); } private class DefineLibraryProposal extends RedConfigFileCompletionProposal { private final String name; private VariableMapping variableMapping; private List<VariableMapping> changedMappings; public DefineLibraryProposal(final IMarker marker, final IFile externalFile, final String variableName, final String shortDescription) { super(marker, externalFile, shortDescription, null); this.name = variableName; } @Override public boolean apply(final IFile externalFile, final RobotProjectConfig config) throws ProposalApplyingException { variableMapping = SwtThread.syncEval(new Evaluation<VariableMapping>() { @Override public VariableMapping runCalculation() { final Shell shell = Display.getCurrent().getActiveShell(); final VariableMappingDialog dialog = new VariableMappingDialog(shell, name); return dialog.open() == Window.OK ? dialog.getMapping() : null; } }); if (variableMapping == null) { return false; } config.addVariableMapping(variableMapping); changedMappings = config.getVariableMappings(); return true; } @Override protected void openDesiredPageInEditor(final RedProjectEditor editor) { editor.openGeneralPage(); } @Override protected void fireEvents() { eventBroker.post(RobotProjectConfigEvents.ROBOT_CONFIG_VAR_MAP_STRUCTURE_CHANGED, changedMappings); } @Override public String getAdditionalProposalInfo() { return "Add " + name + " variable mapping to red.xml file"; } @Override public Image getImage() { return ImagesManager.getImage(RedImages.getRobotVariableImage()); } } }