public code v1

This commit is contained in:
2026-05-22 11:14:29 +02:00
parent 427197ec5a
commit b8141736eb
28859 changed files with 575079 additions and 0 deletions
@@ -0,0 +1,155 @@
package afryca.ase.engine.R.gui.addon;
import java.text.MessageFormat;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.di.extensions.Preference;
import org.eclipse.e4.core.services.log.ILoggerProvider;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.osgi.service.prefs.BackingStoreException;
import afryca.ase.engine.IEngine;
import afryca.ase.engine.R.gui.l10n.Messages;
import afryca.ase.engine.R.gui.preferences.PreferenceConstants;
import afryca.ase.engine.R.provider.IREngineProvider;
import afryca.ase.service.IASEService;
/**
* R engine add-on
*
* @author Sinbad²
* @version 3.0
*/
@SuppressWarnings("restriction")
public class REngineAddon {
private Job job;
private boolean notShowAgain;
@Inject
private UISynchronize sync;
@Inject
private IASEService aseService;
@Inject
private IREngineProvider rEngineProvider;
@Inject
private IEclipseContext context;
@Inject
@Optional
@Named(IServiceConstants.ACTIVE_SHELL)
private Shell shell;
@Inject
@Translation
private Messages messages;
@Inject
@Preference(nodePath = PreferenceConstants.NODEPATH)
private IEclipsePreferences preferences;
@Inject
private void setNotShowAgainValue(
@Preference(nodePath = PreferenceConstants.NODEPATH, value = PreferenceConstants.NOT_SHOW_AGAIN) String value) {
notShowAgain = Boolean.parseBoolean(value);
}
private Logger logger;
@Inject
public void instantiateLogger(ILoggerProvider loggerProvider) {
logger = loggerProvider.getClassLogger(this.getClass());
}
@PostConstruct
private void initialize() {
addEngineJob(IREngineProvider.R);
addJobDoneListener();
}
private void addEngineJob(String scriptName) {
job = new Job(scriptName) {
@Override
protected IStatus run(IProgressMonitor monitor) {
IEngine engine = getEngine();
if (engine != null) {
aseService.addEngine(engine);
return Status.OK_STATUS;
}
return Status.CANCEL_STATUS;
}
};
job.schedule();
// Add job.join() if engine is necessary
}
private IEngine getEngine() {
return rEngineProvider.getEngine();
}
private void addJobDoneListener() { // @formatter:off
job.addJobChangeListener(new IJobChangeListener() {
@Override public void done(IJobChangeEvent event) { sync.asyncExec(() -> check()); }
@Override public void sleeping(IJobChangeEvent event) {}
@Override public void scheduled(IJobChangeEvent event) {}
@Override public void running(IJobChangeEvent event) {}
@Override public void awake(IJobChangeEvent event) {}
@Override public void aboutToRun(IJobChangeEvent event) {}
}); // @formatter:on
}
private void check() {
String rStatus = (String) context.get(IREngineProvider.R_STATUS);
if (rStatus != null) {
if (!notShowAgain) {
Shell shell = (this.shell != null)
? this.shell
: Display.getDefault().getActiveShell();
notShowAgain = MessageDialogWithToggle
.openError(
shell,
MessageFormat.format(messages.r_loading_fail, rStatus),
(String) context.get(IREngineProvider.R_MANUAL),
messages.do_not_show_again_r_loading_problems,
notShowAgain,
null,
null)
.getToggleState();
if (notShowAgain) {
changeNotShowAgain(notShowAgain);
}
}
}
}
private void changeNotShowAgain(boolean value) {
preferences.put(PreferenceConstants.NOT_SHOW_AGAIN, Boolean.toString(value));
try {
preferences.flush();
} catch (BackingStoreException e) {
logger.error(MessageFormat.format(messages.preferences_x_flush_fail, PreferenceConstants.NODEPATH));
}
}
}
@@ -0,0 +1,43 @@
package afryca.ase.engine.R.gui.command;
import javax.inject.Inject;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.core.services.log.ILoggerProvider;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.e4.core.services.nls.Translation;
import afryca.ase.engine.R.gui.dialog.REnginePreferencesDialog;
import afryca.ase.engine.R.gui.l10n.Messages;
/**
* Modify R engine preferences
*
* @author Sinbad²
* @version 3.0
*/
@SuppressWarnings("restriction")
public class ModifyREnginePreferences {
public static final String ID = "afryca.ase.engine.R.gui.command.modify_r_engine_preferences"; //$NON-NLS-1$
private Logger logger;
@Inject
@Translation
private Messages messages;
@Inject
public void instantiateLogger(ILoggerProvider loggerProvider) {
logger = loggerProvider.getClassLogger(this.getClass());
}
@Execute
public void execute(IEclipseContext context) {
logger.info(messages.command_executed, ID);
REnginePreferencesDialog dialog = ContextInjectionFactory.make(REnginePreferencesDialog.class, context);
dialog.open();
}
}
@@ -0,0 +1,61 @@
package afryca.ase.engine.R.gui.command;
import java.text.MessageFormat;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.core.services.log.ILoggerProvider;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Shell;
import afryca.ase.engine.R.gui.l10n.Messages;
import afryca.ase.engine.R.provider.IREngineProvider;
/**
* Show R engine status
*
* @author Sinbad²
* @version 3.0
*/
@SuppressWarnings("restriction")
public class ShowRStatus {
public static final String ID = "afryca.ase.engine.R.gui.show_r_status"; //$NON-NLS-1$
private Logger logger;
@Inject
@Translation
private Messages messages;
@Inject
public void instantiateLogger(ILoggerProvider loggerProvider) {
logger = loggerProvider.getClassLogger(this.getClass());
}
@Execute
public void execute(IEclipseContext context, @Named(IServiceConstants.ACTIVE_SHELL) Shell shell) {
logger.info(messages.command_executed, ID);
String rStatus = (String) context.get(IREngineProvider.R_STATUS);
if (rStatus != null) {
MessageDialog.openError(
shell,
MessageFormat.format(messages.r_loading_fail, rStatus),
(String) context.get(IREngineProvider.R_MANUAL));
} else {
String rVersion = (String) context.get(IREngineProvider.R_VERSION);
String rPaths = (String) context.get(IREngineProvider.R_PATHS);
MessageDialog.openInformation(
shell,
MessageFormat.format(messages.r_version_x_loaded, rVersion),
rPaths);
}
}
}
@@ -0,0 +1,263 @@
package afryca.ase.engine.R.gui.dialog;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.e4.core.di.extensions.Preference;
import org.eclipse.e4.core.services.log.ILoggerProvider;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wb.swt.ResourceManager;
import org.osgi.service.prefs.BackingStoreException;
import afryca.ase.engine.R.gui.icons.Icons;
import afryca.ase.engine.R.gui.l10n.Messages;
import afryca.ase.engine.R.gui.preferences.PreferenceConstants;
/**
* R Engine preferences dialog
*
* @author Sinbad²
* @version 3.0
*/
@SuppressWarnings("restriction")
public class REnginePreferencesDialog extends TitleAreaDialog {
private static final String PLUGIN_ID = "afryca.ase.engine.R.gui"; //$NON-NLS-1$
private static final String DIALOG_CLASS_SHELL = "DialogClassShell"; //$NON-NLS-1$
private static final int BUTTON_OK = IDialogConstants.OK_ID;
private static final int BUTTON_CANCEL = IDialogConstants.CANCEL_ID;
private static final int BUTTON_RESTORE = IDialogConstants.ABORT_ID;
private static final int BUTTON_APPLY = IDialogConstants.PROCEED_ID;
private Composite container;
private Button notShowAgainButton;
private Map<String, Object> changes;
private Map<String, Object> currentValues;
@Inject
@Translation
private Messages messages;
@Inject
@Translation
private Icons icons;
@Inject
private IStylingEngine engine;
@Inject
@Preference(nodePath = PreferenceConstants.NODEPATH)
private IEclipsePreferences rEnginePreferences;
private Logger logger;
@Inject
public void instantiateLogger(ILoggerProvider loggerProvider) {
logger = loggerProvider.getClassLogger(this.getClass());
}
@Inject
private void setDefaultModuleBindings(
@Preference(nodePath = PreferenceConstants.NODEPATH, value = PreferenceConstants.NOT_SHOW_AGAIN) String notShowAgain) {
getCurrentValues().put(PreferenceConstants.NOT_SHOW_AGAIN, notShowAgain);
}
private Map<String, Object> getCurrentValues() {
if (currentValues == null) {
currentValues = new HashMap<>();
}
return currentValues;
}
private Map<String, Object> getChanges() {
if (changes == null) {
changes = new HashMap<>();
}
return changes;
}
@Inject
public REnginePreferencesDialog(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) {
super(shell);
}
@Override
protected Control createDialogArea(Composite parent) {
container = (Composite) super.createDialogArea(parent);
GridLayoutFactory
.swtDefaults()
.applyTo(container);
styleDialog();
createNotShowAgainGroup();
hookNotShowAgainSelectionListener();
setSelection();
return container;
}
private void styleDialog() {
engine.setClassname(getShell(), DIALOG_CLASS_SHELL);
getShell().setText(messages.configure_r_engine);
setTitleImage(ResourceManager.getPluginImage(PLUGIN_ID, icons.modify_preferences));
setTitle(messages.configure_r_engine);
setMessage(messages.configure_r_engine_description, SWT.NONE);
}
private void createNotShowAgainGroup() {
Group notShowAgainGroup = new Group(container, SWT.NONE);
notShowAgainGroup.setText(messages.show_r_loading_problems);
GridDataFactory
.swtDefaults()
.align(SWT.FILL, SWT.CENTER)
.grab(true, false)
.applyTo(notShowAgainGroup);
GridLayoutFactory
.swtDefaults()
.numColumns(1)
.applyTo(notShowAgainGroup);
notShowAgainButton = new Button(notShowAgainGroup, SWT.CHECK);
notShowAgainButton.setText(messages.do_not_show_again_r_loading_problems);
}
private void hookNotShowAgainSelectionListener() {
notShowAgainButton.addListener(SWT.Selection, event -> {
getChanges().put(PreferenceConstants.NOT_SHOW_AGAIN, Boolean.toString(notShowAgainButton.getSelection()));
analizeChanges();
configureButtons();
});
}
private void analizeChanges() {
getChanges()
.entrySet()
.stream()
.filter(map -> getCurrentValues().containsKey(map.getKey()))
.filter(map -> areEquals(map.getValue(), getCurrentValues().get(map.getKey())))
.map(map -> map.getKey())
.collect(Collectors.toList())
.forEach(getChanges()::remove);
}
private boolean areEquals(Object current, Object change) {
if ((current == null) && (change == null)) {
return true;
}
if ((current == null) || (change == null)) {
return false;
}
return current.equals(change);
}
private void configureButtons() {
Button applyButton = getButton(BUTTON_APPLY);
if (applyButton != null) {
applyButton.setEnabled(thereAreChanges());
}
}
private boolean thereAreChanges() {
return !getChanges().isEmpty();
}
private void setSelection() {
String notShowAgainPreferenceValue = (String) getCurrentValues().get(PreferenceConstants.NOT_SHOW_AGAIN);
boolean notShowAgain = Boolean.parseBoolean(notShowAgainPreferenceValue);
notShowAgainButton.setSelection(notShowAgain);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, BUTTON_OK, messages.button_ok, true);
createButton(parent, BUTTON_CANCEL, messages.button_cancel, false);
createButton(parent, BUTTON_RESTORE, messages.button_restore, false);
createButton(parent, BUTTON_APPLY, messages.button_apply, false);
configureButtons();
}
@Override
protected void buttonPressed(int buttonId) {
if (BUTTON_OK == buttonId) {
okPressed();
} else if (BUTTON_CANCEL == buttonId) {
cancelPressed();
} else if (BUTTON_RESTORE == buttonId) {
restorePressed();
} else if (BUTTON_APPLY == buttonId) {
applyPressed();
}
}
@Override
protected void okPressed() {
applyChanges();
setReturnCode(BUTTON_OK);
close();
}
private void applyChanges() {
getChanges().forEach(this::performChange);
getChanges().clear();
configureButtons();
}
private void performChange(String key, Object change) {
if (PreferenceConstants.NOT_SHOW_AGAIN.equals(key)) {
changeNotShowAgain(Boolean.parseBoolean((String) change));
}
}
private void changeNotShowAgain(boolean value) {
rEnginePreferences.put(PreferenceConstants.NOT_SHOW_AGAIN, Boolean.toString(value));
try {
rEnginePreferences.flush();
} catch (BackingStoreException e) {
logger.error(MessageFormat.format(messages.preferences_x_flush_fail, PreferenceConstants.NODEPATH));
}
}
@Override
protected void cancelPressed() {
setReturnCode(BUTTON_CANCEL);
close();
}
private void restorePressed() {
restoreDefaults();
}
private void restoreDefaults() {
try {
rEnginePreferences.clear();
rEnginePreferences.flush();
} catch (BackingStoreException e) {
logger.error(MessageFormat.format(messages.preferences_x_clear_fail, PreferenceConstants.NODEPATH));
}
setSelection();
}
private void applyPressed() {
applyChanges();
}
}
@@ -0,0 +1,11 @@
package afryca.ase.engine.R.gui.icons;
/**
* Localization icons
*
* @author Sinbad²
* @version 3.0
*/
public class Icons {
public String modify_preferences;
}
@@ -0,0 +1 @@
modify_preferences=icons/modify_preferences.png
@@ -0,0 +1,24 @@
package afryca.ase.engine.R.gui.l10n;
/**
* Localization messages
*
* @author Sinbad²
* @version 3.0
*/
public class Messages {
public String button_apply;
public String button_cancel;
public String button_ok;
public String button_restore;
public String command_can_executed_result;
public String command_executed;
public String configure_r_engine;
public String configure_r_engine_description;
public String do_not_show_again_r_loading_problems;
public String preferences_x_clear_fail;
public String preferences_x_flush_fail;
public String r_loading_fail;
public String r_version_x_loaded;
public String show_r_loading_problems;
}
@@ -0,0 +1,14 @@
button_apply=&Apply
button_cancel=&Cancel
button_ok=&OK
button_restore=&Restore
command_can_executed_result={0} can be executed? {1}
command_executed={0} executed
configure_r_engine=Configure R engine
configure_r_engine_description=Configure R engine preferences
do_not_show_again_r_loading_problems=Do not show again R loading problems
preferences_x_clear_fail=Preferences ''{0}'' clear fail
preferences_x_flush_fail=Preferences ''{0}'' flush fail
r_loading_fail=R loading fail - {0}
r_version_x_loaded={0} loaded
show_r_loading_problems=Show R loading problems
@@ -0,0 +1,14 @@
button_apply=&Aplicar
button_cancel=&Cancelar
button_ok=&OK
button_restore=&Restaurar
command_can_executed_result=¿{0} puede ser ejecutado? {1}
command_executed={0} ejecutado
configure_r_engine=Configurar entorno R
configure_r_engine_description=Configurar preferencias del entorno R
do_not_show_again_r_loading_problems=No volver a mostrar fallos cargando R
preferences_x_clear_fail=El limpiado de las preferencias ''{0}'' falló
preferences_x_flush_fail=El guardado de las preferencias ''{0}'' falló
r_loading_fail=La carga de R falló - {0}
r_version_x_loaded={0} cargada
show_r_loading_problems=Mostrar problemas cargando R
@@ -0,0 +1,12 @@
package afryca.ase.engine.R.gui.preferences;
/**
* Preference constants
*
* @author Sinbad²
* @version 3.0
*/
public interface PreferenceConstants {
public static final String NODEPATH = "afryca.ase.engine.R.gui"; //$NON-NLS-1$
public static final String NOT_SHOW_AGAIN = "not.show.again"; //$NON-NLS-1$
}