blob: 438f9727acb53783b876552feb53bed1ce566ec9 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2015, 2019 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.redocs.r.ui.processing;
import java.util.Map;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.jface.databinding.swt.typed.WidgetProperties;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.ecommons.databinding.core.validation.UpdateableErrorValidator;
import org.eclipse.statet.ecommons.resources.core.variables.ResourceVariables;
import org.eclipse.statet.ecommons.templates.TemplateVariableProcessor;
import org.eclipse.statet.ecommons.ui.SharedMessages;
import org.eclipse.statet.ecommons.ui.components.CustomizableVariableSelectionDialog;
import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
import org.eclipse.statet.ecommons.ui.util.VariableFilterUtils;
import org.eclipse.statet.ecommons.variables.core.VariableText2;
import org.eclipse.statet.ecommons.variables.core.VariableTextValidator;
import org.eclipse.statet.docmlet.base.ui.processing.DocProcessingConfig;
import org.eclipse.statet.docmlet.base.ui.processing.DocProcessingConfigStepTab;
import org.eclipse.statet.docmlet.base.ui.processing.DocProcessingOperationSettings;
import org.eclipse.statet.internal.redocs.r.Messages;
import org.eclipse.statet.ltk.ui.sourceediting.SnippetEditor;
import org.eclipse.statet.ltk.ui.sourceediting.SnippetEditor1;
import org.eclipse.statet.r.core.RCore;
import org.eclipse.statet.r.launching.ui.RLaunchingUI;
import org.eclipse.statet.r.ui.sourceediting.RSourceViewerConfigurator;
import org.eclipse.statet.r.ui.sourceediting.RTemplateSourceViewerConfigurator;
@NonNullByDefault
public class RunRConsoleSnippetOperationSettings extends DocProcessingOperationSettings {
private IObservableValue<String> snippetValue;
private SnippetEditor1 snippetEditor;
private VariableText2 snippetVariableResolver;
public RunRConsoleSnippetOperationSettings() {
}
@Override
public String getId() {
return RunRConsoleSnippetOperation.ID;
}
@Override
public String getLabel() {
return Messages.ProcessingOperation_RunRConsoleSnippet_label;
}
@Override
public String getInfo() {
final String label= getLabel();
final String code= this.snippetValue.getValue();
return label + ": " + limitInfo(code); //$NON-NLS-1$
}
@Override
protected void init(final DocProcessingConfigStepTab tab) {
super.init(tab);
final Realm realm= getRealm();
this.snippetValue= new WritableValue<>(realm, "", String.class); //$NON-NLS-1$
}
@Override
protected Composite createControl(final Composite parent) {
final Composite composite= super.createControl(parent);
composite.setLayout(LayoutUtils.newCompositeGrid(1));
this.snippetVariableResolver= new VariableText2(getTab().getStepVariables());
{ final Label label= new Label(composite, SWT.NONE);
label.setText(Messages.ProcessingOperation_RunRConsoleSnippetSettings_RCode_label);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
{ final TemplateVariableProcessor templateVariableProcessor= new TemplateVariableProcessor();
final RSourceViewerConfigurator configurator= new RTemplateSourceViewerConfigurator(
RCore.getWorkbenchAccess(),
templateVariableProcessor );
final SnippetEditor1 editor= new SnippetEditor1(configurator, null,
PlatformUI.getWorkbench(), RLaunchingUI.LAUNCH_CONFIG_QUALIFIER, true ) {
@Override
protected void fillToolMenu(final Menu menu) {
{ final MenuItem item= new MenuItem(menu, SWT.PUSH);
item.setText(SharedMessages.InsertVariable_label);
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
final CustomizableVariableSelectionDialog dialog= new CustomizableVariableSelectionDialog(getTextControl().getShell());
dialog.addVariableFilter(VariableFilterUtils.EXCLUDE_JAVA_FILTER);
dialog.setAdditionals(RunRConsoleSnippetOperationSettings
.this.snippetVariableResolver.getExtraVariables().values() );
if (dialog.open() != Dialog.OK) {
return;
}
final String variable= dialog.getVariableExpression();
if (variable == null) {
return;
}
getTextControl().insert(variable);
getTextControl().setFocus();
}
});
}
{ final MenuItem item= new MenuItem(menu, SWT.PUSH);
item.setText(Messages.ProcessingOperation_Insert_InFileLocVariable_label);
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
getTextControl().insert(
"${" + ResourceVariables.RESOURCE_LOC_VAR_NAME + "}" ); //$NON-NLS-1$ //$NON-NLS-2$
getTextControl().setFocus();
}
});
}
{ final MenuItem item= new MenuItem(menu, SWT.PUSH);
item.setText(Messages.ProcessingOperation_Insert_OutFileLocVariable_label);
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
getTextControl().insert(
"${" + ResourceVariables.RESOURCE_LOC_VAR_NAME + ":" + //$NON-NLS-1$ //$NON-NLS-2$
"${" + DocProcessingConfig.OUT_FILE_PATH_VAR_NAME + "}" + //$NON-NLS-1$ //$NON-NLS-2$
"}" ); //$NON-NLS-1$
getTextControl().setFocus();
}
});
}
}
};
editor.create(composite, SnippetEditor.DEFAULT_MULTI_LINE_STYLE);
final GridData gd= new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd.heightHint= LayoutUtils.hintHeight(editor.getSourceViewer().getTextWidget(), 5);
editor.getControl().setLayoutData(gd);
this.snippetEditor= editor;
}
return composite;
}
@Override
protected void addBindings(final DataBindingContext dbc) {
dbc.bindValue(
WidgetProperties.text(SWT.Modify)
.observe(this.snippetEditor.getTextControl()),
this.snippetValue,
new UpdateValueStrategy<String, String>()
.setAfterGetValidator(new UpdateableErrorValidator<>(
new VariableTextValidator(
this.snippetVariableResolver,
Messages.ProcessingOperation_RunRConsoleSnippet_RCode_error_SpecInvalid_message ))),
null );
}
@Override
protected void load(final Map<String, String> config) {
final String code= config.get(RunRConsoleSnippetOperation.R_SNIPPET_CODE_ATTR_NAME);
this.snippetValue.setValue((code != null) ? code : ""); //$NON-NLS-1$
}
@Override
protected void save(final Map<String, String> config) {
final String code= this.snippetValue.getValue();
config.put(RunRConsoleSnippetOperation.R_SNIPPET_CODE_ATTR_NAME, code);
}
}