blob: 19ebbf87cf917bdfff92d43cfc92c5de99904843 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 RBEI and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v. 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Adhith Gopal - Initial contribution and API
* Pavithra Krishna Reddy
* Santhosh Gokhale D
* Abirami Bhologa Indiran
*******************************************************************************/
package org.eclipse.blockchain.ui.wizard;
import java.io.File;
import org.eclipse.blockchain.core.SecoBlocksPreferenceConstants;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* Ethereum Project create/import wizard page
*/
public class EthereumProjectWizardPage extends WizardPage {
private Label projectNameLabel = null;
private Text projectNameText = null;
private String projectNameString;
private final String projectNameError = "Project Name cannot be empty!!!";
private final String existingProjectpathError = "Project paath cannot be empty!!!";
private String projectTemplateToBeCreated = null;
private boolean testNetTobeCreated = false;
private Text solcPathText;
private String solcPathString = "";
private Text existingProjectPathText;
private Text newProjectPathText;
private Button newPrjButton;
private Button existingPrjButton;
Color greyColor = new Color(Display.getDefault(), new RGB(128, 128, 128));
/**
* @param pageName page name
*/
protected EthereumProjectWizardPage(final String pageName) {
super(pageName);
setPageComplete(false);
setTitle("New Ethereum Project");
}
/**
* {@inheritDoc}
*/
@Override
public void createControl(final Composite parent) {
Composite wizardContainer = new Composite(parent, SWT.None);
GridLayout containerGrid = new GridLayout(2, false);
GridData genericGridData = new GridData(GridData.FILL_BOTH);
genericGridData.minimumHeight = 50;
wizardContainer.setLayout(containerGrid);
wizardContainer.setLayoutData(genericGridData);
// Select if it has to be imported as new or existing project
Group newOrExistingGrp = new Group(wizardContainer, NONE);
newOrExistingGrp.setLayout(new GridLayout(3, true));
newOrExistingGrp.setLayoutData(new GridData(GridData.FILL_BOTH));
GridData gridData = new GridData(SWT.FILL, SWT.LEFT, true, false, 1, 1);
Label importAs = new Label(newOrExistingGrp, SWT.NONE);
importAs.setText("Import project as: ");
importAs.setLayoutData(gridData);
this.newPrjButton = new Button(newOrExistingGrp, SWT.RADIO);
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
this.newPrjButton.setLayoutData(gridData);
this.newPrjButton.setText("New project");
this.existingPrjButton = new Button(newOrExistingGrp, SWT.RADIO);
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
this.existingPrjButton.setText("Existing project");
this.existingPrjButton.setLayoutData(gridData);
// create a group to for new project creation related widgets
Group newPrjGrp = new Group(wizardContainer, NONE);
newPrjGrp.setLayout(new GridLayout(3, false));
newPrjGrp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
newPrjGrp.setText("New project");
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
this.projectNameLabel = new Label(newPrjGrp, SWT.None);
this.projectNameLabel.setText("Project Name : ");
this.projectNameLabel.setLayoutData(gridData);
this.projectNameText = new Text(newPrjGrp, SWT.BORDER);
gridData = new GridData(SWT.FILL, SWT.LEFT, true, true, 2, 1);
this.projectNameText.setLayoutData(gridData);
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
Label projectPath = new Label(newPrjGrp, SWT.None);
projectPath.setText("Project path : ");
projectPath.setLayoutData(gridData);
this.newProjectPathText = new Text(newPrjGrp, SWT.BORDER);
gridData = new GridData(SWT.FILL, SWT.LEFT, true, false, 1, 1);
this.newProjectPathText.setLayoutData(gridData);
String workspaceLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString();
this.newProjectPathText.setText(workspaceLocation);
Button newPrjPathBrowseButton = new Button(newPrjGrp, SWT.PUSH);
newPrjPathBrowseButton.setText("Browse");
gridData = new GridData(SWT.FILL, SWT.LEFT, false, false, 1, 1);
newPrjPathBrowseButton.setLayoutData(gridData);
newPrjPathBrowseButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
DirectoryDialog prjPathDialog = new DirectoryDialog(parent.getShell());
prjPathDialog.setFilterPath(workspaceLocation);
String selectedDir = prjPathDialog.open();
if (selectedDir != null) {
EthereumProjectWizardPage.this.newProjectPathText.setText(selectedDir);
}
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
// do nothing
}
});
// project template section
Label projectTemplateGroup = new Label(newPrjGrp, SWT.SHADOW_ETCHED_IN);
projectTemplateGroup.setText("Project Template : ");
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
projectTemplateGroup.setLayoutData(gridData);
// combo for project selection
Combo projectTemplateSelection = new Combo(newPrjGrp, NONE);
// Only simple project is supported for now - , "Web project", "Angular
// JS Project", "React Js Project"
projectTemplateSelection.setItems("Simple project");
projectTemplateSelection.setLayoutData(gridData);
projectTemplateSelection.select(0);
setProjectTemplateToBeImported(projectTemplateSelection.getText());
projectTemplateSelection.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(final SelectionEvent e) {
setProjectTemplateToBeImported(projectTemplateSelection.getText());
}
});
// existing project section
Group existingPrjGrp = new Group(wizardContainer, NONE);
existingPrjGrp.setLayout(new GridLayout(3, false));
existingPrjGrp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
existingPrjGrp.setText("Existing project");
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
Label newProjectPath = new Label(existingPrjGrp, SWT.None);
newProjectPath.setText("Project path : ");
newProjectPath.setLayoutData(gridData);
this.existingProjectPathText = new Text(existingPrjGrp, SWT.BORDER);
gridData = new GridData(SWT.FILL, SWT.LEFT, true, false, 1, 1);
this.existingProjectPathText.setLayoutData(gridData);
this.existingProjectPathText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(final ModifyEvent e) {
if (getTextBoxText(EthereumProjectWizardPage.this.existingProjectPathText).trim().isEmpty()) {
setPageComplete(false);
setErrorMessage(EthereumProjectWizardPage.this.existingProjectpathError);
} else {
setPageComplete(true);
setErrorMessage(null);
}
}
});
Button existingPrjPathBrowseButton = new Button(existingPrjGrp, SWT.PUSH);
existingPrjPathBrowseButton.setText("Browse");
gridData = new GridData(SWT.FILL, SWT.LEFT, false, false, 1, 1);
existingPrjPathBrowseButton.setLayoutData(gridData);
existingPrjPathBrowseButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
DirectoryDialog prjPathDialog = new DirectoryDialog(parent.getShell());
prjPathDialog.setFilterPath(System.getProperty("user.dir"));
String selectedDir = prjPathDialog.open();
if ((selectedDir != null) && !selectedDir.equals("")) {
setPageComplete(true);
setErrorMessage(null);
EthereumProjectWizardPage.this.existingProjectPathText.setText(selectedDir);
} else {
setErrorMessage(EthereumProjectWizardPage.this.existingProjectpathError);
setPageComplete(false);
}
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
// do nothing
}
});
// Enable the new/existing fiel import depending on the radio button
// selection
this.newPrjButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
// Enable the new project creation group
newPrjGrp.setEnabled(true);
newPrjGrp.setForeground(null);
setForeGroundToChildren(newPrjGrp.getChildren(), null);
// Disable existing project creation
existingPrjGrp.setEnabled(false);
existingPrjGrp.setForeground(EthereumProjectWizardPage.this.greyColor);
setForeGroundToChildren(existingPrjGrp.getChildren(), EthereumProjectWizardPage.this.greyColor);
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
widgetSelected(e);
}
});
this.existingPrjButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
newPrjGrp.setEnabled(false);
newPrjGrp.setForeground(EthereumProjectWizardPage.this.greyColor);
setForeGroundToChildren(newPrjGrp.getChildren(), EthereumProjectWizardPage.this.greyColor);
existingPrjGrp.setEnabled(true);
existingPrjGrp.setForeground(null);
setForeGroundToChildren(existingPrjGrp.getChildren(), null);
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
widgetSelected(e);
}
});
// compiler section
Group compilerGrp = new Group(wizardContainer, NONE);
compilerGrp.setLayout(new GridLayout(3, false));
compilerGrp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
compilerGrp.setText("Compiler settings");
Label solcLabel = new Label(compilerGrp, SWT.NONE);
solcLabel.setText("Solidity compiler path : ");
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
solcLabel.setLayoutData(gridData);
this.solcPathText = new Text(compilerGrp, SWT.BORDER);
gridData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
this.solcPathText.setLayoutData(gridData);
Button compilerPathBrowseButton = new Button(compilerGrp, SWT.PUSH);
compilerPathBrowseButton.setText("Browse");
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
compilerPathBrowseButton.setLayoutData(gridData);
compilerPathBrowseButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(final SelectionEvent e) {
DirectoryDialog solcCompilerPathDialog = new DirectoryDialog(parent.getShell());
solcCompilerPathDialog.setFilterPath(System.getProperty("user.dir"));
String selectedDir = solcCompilerPathDialog.open();
if (selectedDir != null) {
EthereumProjectWizardPage.this.solcPathText.setText(selectedDir);
}
}
@Override
public void widgetDefaultSelected(final SelectionEvent e) {
// do nothing
}
});
Label solcVerLabel = new Label(compilerGrp, SWT.NONE);
solcVerLabel.setText("Solidity versions available");
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
solcVerLabel.setLayoutData(gridData);
// combo for project selection
Combo compilerSelection = new Combo(compilerGrp, NONE);
gridData = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
compilerSelection.setLayoutData(gridData);
String list = Platform.getPreferencesService().getString(SecoBlocksPreferenceConstants.SECOBLOCKS_PREF_NODE,
SecoBlocksPreferenceConstants.PREF_KEY_SelectedList, null, null);
compilerSelection.setItems((list != null) ? list.split(",") : new String[0]);
compilerSelection.setLayoutData(gridData);
compilerSelection.select(0);
String solcPathWithVersion = getSolcPath() + File.separator + compilerSelection.getText();
EthereumProjectWizardPage.this.solcPathText.setText(solcPathWithVersion);
compilerSelection.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(final SelectionEvent e) {
EthereumProjectWizardPage.this.solcPathText.setText(solcPathWithVersion);
}
});
setControl(wizardContainer);
setErrorMessage(this.projectNameError);
addButtonListeners();
}
private void setForeGroundToChildren(final Control[] children, final Color color) {
for (Control child : children) {
if ((child instanceof Text)) {
((Text) child).setEditable(color == null);
}
child.setForeground(color);
}
}
private String getSolcPath() {
return InstanceScope.INSTANCE.getNode(SecoBlocksPreferenceConstants.SECOBLOCKS_PREF_NODE)
.get(SecoBlocksPreferenceConstants.SOLIDITY_COMPILER_PREF_KEY, "");
}
private void addButtonListeners() {
this.projectNameText.addModifyListener((final ModifyEvent e) -> {
if (!getTextBoxText(this.projectNameText).trim().equals("")) {
setPageComplete(true);
setErrorMessage(null);
} else {
setPageComplete(false);
setErrorMessage(this.projectNameError);
}
});
}
private String getTextBoxText(final Text textBox) {
Display.getDefault().syncExec(() -> this.projectNameString = textBox.getText());
return this.projectNameString;
}
/**
* @return -
*/
public String getSolcPathFromTextBox() {
Display.getDefault().syncExec(() -> this.solcPathString = this.solcPathText.getText());
return this.solcPathString;
}
/**
* @return
*/
public String getNewProjectPath() {
return this.newProjectPathText.getText();
}
/**
* @return
*/
public String getExistingProjectPath() {
return this.existingProjectPathText.getText();
}
/**
* @return
*/
public boolean isNewProjectToBeCreated() {
return this.newPrjButton.getSelection();
}
/**
* @return - The project name entered in project creation wizard
*/
public String getProjectNameString() {
return this.projectNameString;
}
/**
* @return the selectedProject
*/
public String getProjectTemplaeToBeCreated() {
return this.projectTemplateToBeCreated;
}
/**
* @param selectedProject the selectedProject to set
*/
public void setProjectTemplateToBeImported(final String selectedProject) {
this.projectTemplateToBeCreated = selectedProject;
}
/**
* @return the testNetTobeCreated
*/
public boolean isTestNetTobeCreated() {
return this.testNetTobeCreated;
}
/**
* @param testNetTobeCreated the testNetTobeCreated to set
*/
public void setTestNetTobeCreated(final boolean testNetTobeCreated) {
this.testNetTobeCreated = testNetTobeCreated;
}
}