/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.configuration;
import java.io.File;
import java.io.FileFilter;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.commons.lang3.text.WordUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PartInitException;
import de.rcenvironment.core.configuration.ConfigurationService;
import de.rcenvironment.core.configuration.ConfigurationService.ConfigurablePathId;
import de.rcenvironment.core.gui.resources.api.ImageManager;
import de.rcenvironment.core.gui.resources.api.StandardImages;
import de.rcenvironment.core.gui.utils.common.EditorsHelper;
import de.rcenvironment.core.start.gui.WorkspaceSettings;
import de.rcenvironment.core.utils.incubator.ServiceRegistry;
/**
* Dialog that shows information about the configuration and offers to open sample configuration files.
*
* @author Oliver Seebach
* @author Robert Mischke
* @author Sascha Zur
*/
public class ConfigurationInformationDialog extends Dialog {
private static final int MINIMUM_HEIGHT = 250;
private static final int MINIMUM_WIDTH = 500;
private final ConfigurationService configurationService;
private final SortedMap<String, File> exampleConfigFileNamesAndPaths = new TreeMap<>();
private String profileConfigPath = "";
private String installationConfigPath = "";
private String workspaceLocation = "";
private boolean dontAskForWorkspaceLocationOnStartup = false;
private final Log log = LogFactory.getLog(getClass());
private Button loadButton;
private org.eclipse.swt.widgets.List examplesList;
private Button askWorkspaceLocationButton;
public ConfigurationInformationDialog(Shell parentShell) {
super(parentShell);
configurationService = ServiceRegistry.createAccessFor(this).getService(ConfigurationService.class);
setShellStyle(SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL | SWT.RESIZE);
initConfigurationFileAndPathMapping();
loadConfigurationDetails();
}
@Override
protected void configureShell(Shell shell) {
shell.setText("Configuration Information");
shell.setMinimumSize(MINIMUM_WIDTH, MINIMUM_HEIGHT);
super.configureShell(shell);
}
private void loadConfigurationDetails() {
profileConfigPath = configurationService.getConfigurablePath(ConfigurablePathId.PROFILE_ROOT).getAbsolutePath();
// systemConfigPath = ...
installationConfigPath = configurationService.getConfigurablePath(ConfigurablePathId.INSTALLATION_DATA_ROOT).getAbsolutePath();
// get last workspace location and "don't as again" setting
WorkspaceSettings workspaceSettings = WorkspaceSettings.getInstance();
workspaceLocation = workspaceSettings.getLastLocation();
dontAskForWorkspaceLocationOnStartup = workspaceSettings.getDontAskAgainSetting();
}
@Override
protected Control createDialogArea(Composite parent) {
Composite dialogArea = (Composite) super.createDialogArea(parent);
dialogArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
dialogArea.setLayout(new GridLayout());
ScrolledComposite scrolled = new ScrolledComposite(dialogArea,
SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
scrolled.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
scrolled.setLayout(new GridLayout());
scrolled.setExpandVertical(true);
scrolled.setExpandHorizontal(true);
Composite container = new Composite(scrolled, SWT.NONE);
scrolled.setContent(container);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
container.setLayout(new GridLayout());
// ----------------------------------------------------
Group informationGroup = new Group(container, SWT.NONE);
informationGroup.setText("General");
GridLayout informationGroupGridLayout = new GridLayout(1, true);
informationGroup.setLayout(informationGroupGridLayout);
GridData informationGroupGridData = new GridData();
informationGroupGridData.grabExcessHorizontalSpace = true;
informationGroupGridData.verticalAlignment = GridData.BEGINNING;
informationGroupGridData.horizontalAlignment = GridData.FILL;
informationGroup.setLayoutData(informationGroupGridData);
CLabel informationLabel = new CLabel(informationGroup, SWT.NONE);
informationLabel.setText("You need to configure RCE to change the name of your instance, connect your instance to others, etc.\n"
+ "All configuration is done within a single file called \"configuration.json\" in your profile directory \n"
+ "(see 'File System Locations' below). You can easily open and edit it with the \"Help > Open Configuration File\" \n"
+ "menu option, or with the corresponding tool bar button.");
informationLabel.setImage(ImageManager.getInstance().getSharedImage(StandardImages.INFORMATION_16));
// ----------------------------------------------------
Group examplesGroup = new Group(container, SWT.NONE);
examplesGroup.setText("Example Configurations");
GridLayout examplesGroupGridLayout = new GridLayout(1, true);
examplesGroup.setLayout(examplesGroupGridLayout);
GridData examplesGroupGridData = new GridData();
examplesGroupGridData.grabExcessHorizontalSpace = true;
examplesGroupGridData.verticalAlignment = GridData.BEGINNING;
examplesGroupGridData.horizontalAlignment = GridData.FILL;
examplesGroup.setLayoutData(examplesGroupGridData);
CLabel exampleLabel = new CLabel(examplesGroup, SWT.NONE);
exampleLabel
.setText("The following list shows configuration examples for typical configuration scenarios. You can open them, copy their \n"
+ "content into your own configuration file, and adapt it to suit your needs. A special example file called \n"
+ "\"Configuration Reference\" contains all existing parameters, which you can use for reference.\n ");
examplesList = new org.eclipse.swt.widgets.List(examplesGroup, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
String[] examplesItems = exampleConfigFileNamesAndPaths.keySet().toArray(
new String[exampleConfigFileNamesAndPaths.keySet().size()]);
examplesList.setItems(examplesItems);
examplesList.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false));
examplesList.addSelectionListener(new ExampleListSelectionListener());
examplesList.addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent event) {
openSelectionInEditor();
// close dialog.
closeConfigurationDialog();
}
});
loadButton = new Button(examplesGroup, SWT.PUSH);
loadButton.setText("Open in editor (read-only)");
loadButton.setEnabled(false);
loadButton.addSelectionListener(new LoadButtonSelectionListener());
// ----------------------------------------------------
Group locationsGroup = new Group(container, SWT.NONE);
locationsGroup.setText("File System Locations");
GridLayout locationsGroupGridLayout = new GridLayout(2, false);
locationsGroup.setLayout(locationsGroupGridLayout);
GridData locationsGroupGridData = new GridData();
locationsGroupGridData.grabExcessHorizontalSpace = true;
locationsGroupGridData.verticalAlignment = GridData.BEGINNING;
locationsGroupGridData.horizontalAlignment = GridData.FILL;
locationsGroup.setLayoutData(locationsGroupGridData);
Label installationLabel = new Label(locationsGroup, SWT.NONE);
installationLabel.setText("Installation:");
Text installationConfigText = new Text(locationsGroup, SWT.READ_ONLY | SWT.BORDER);
installationConfigText.setText(installationConfigPath);
installationConfigText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
installationConfigText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
Label profileLabel = new Label(locationsGroup, SWT.NONE);
profileLabel.setText("Profile:");
Text profileConfigText = new Text(locationsGroup, SWT.READ_ONLY | SWT.BORDER);
profileConfigText.setText(profileConfigPath);
profileConfigText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
profileConfigText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
Label workspaceLabel = new Label(locationsGroup, SWT.NONE);
workspaceLabel.setText("Workspace:");
Text workspaceText = new Text(locationsGroup, SWT.READ_ONLY | SWT.BORDER);
workspaceText.setText(workspaceLocation);
workspaceText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
workspaceText.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
new Label(locationsGroup, SWT.NONE);
askWorkspaceLocationButton = new Button(locationsGroup, SWT.CHECK);
askWorkspaceLocationButton.setText("Always use this workspace location (don't ask on startup)");
askWorkspaceLocationButton.setSelection(dontAskForWorkspaceLocationOnStartup);
askWorkspaceLocationButton.addSelectionListener(new AskWorkspaceToggleButtonListener());
GridData checkBoxData = new GridData();
checkBoxData.horizontalIndent = 10;
askWorkspaceLocationButton.setLayoutData(checkBoxData);
// ----------------------------------------------------
Group applyGroup = new Group(container, SWT.NONE);
applyGroup.setText("Apply Changes");
GridLayout applyGroupGridLayout = new GridLayout(1, true);
applyGroup.setLayout(applyGroupGridLayout);
GridData applyGroupGridData = new GridData();
applyGroupGridData.grabExcessHorizontalSpace = true;
applyGroupGridData.verticalAlignment = GridData.BEGINNING;
applyGroupGridData.horizontalAlignment = GridData.FILL;
applyGroup.setLayoutData(applyGroupGridData);
CLabel applyLabel = new CLabel(applyGroup, SWT.NONE);
applyLabel
.setText("You need to restart RCE to apply any changes you made in the configuration file.\n"
+ "Note that there is a \"Restart\" shortcut in the \"File\" menu for this.");
applyLabel.setImage(ImageManager.getInstance().getSharedImage(StandardImages.INFORMATION_16));
// ----------------------------------------------------
container.setSize(container.computeSize(SWT.NONE,
SWT.NONE, true));
scrolled.setMinSize(getInitialSize());
scrolled.setVisible(true);
return dialogArea;
}
private void initConfigurationFileAndPathMapping() {
File examplesDir = configurationService.getConfigurablePath(ConfigurablePathId.CONFIGURATION_SAMPLES_LOCATION);
if (!examplesDir.isDirectory()) {
log.warn("Expected location for configuration example files does not exist: " + examplesDir.getAbsolutePath());
return;
}
File[] files = examplesDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile() && pathname.getName().endsWith(".sample");
}
});
for (File file : files) {
String name = file.getName();
String shortName = WordUtils.capitalize(name.replaceFirst("^configuration\\.json\\.(.+)\\.sample$", "$1").replace("_", " "));
exampleConfigFileNamesAndPaths.put(shortName, file);
}
}
private void closeConfigurationDialog() {
this.close();
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
}
private void openSelectionInEditor() {
if (examplesList.getSelectionCount() == 1) {
int selectionIndex = examplesList.getSelectionIndex();
if (selectionIndex < examplesList.getItemCount()) {
String selection = examplesList.getItem(selectionIndex);
File configFile = exampleConfigFileNamesAndPaths.get(selection);
try {
configFile.setReadOnly();
EditorsHelper.openExternalFileInEditor(configFile);
} catch (PartInitException e) {
log.error("Failed to open profile configuration file in an editor.", e);
}
}
}
}
/**
* Listener that reacts on selections in example config list.
*
* @author Oliver Seebach
*
*/
private final class ExampleListSelectionListener implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent event) {
if (examplesList.getSelectionCount() == 1) {
loadButton.setEnabled(true);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {
widgetSelected(event);
}
}
/**
* Listener for toggling "ask for workspace location on start" button.
*
* @author Oliver Seebach
* @author Robert Mischke
*/
private final class AskWorkspaceToggleButtonListener implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent event) {
boolean newDontAskAgainValue = askWorkspaceLocationButton.getSelection();
WorkspaceSettings.getInstance().setDontAskAgainSetting(newDontAskAgainValue);
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {
widgetDefaultSelected(event);
}
}
/**
* Listener that reacts on click on load button.
*
* @author Oliver Seebach
*
*/
private final class LoadButtonSelectionListener implements SelectionListener {
@Override
public void widgetSelected(SelectionEvent event) {
openSelectionInEditor();
// close dialog.
closeConfigurationDialog();
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {
widgetSelected(event);
}
}
}