/******************************************************************************* | |
* 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: | |
* Deepthi Murugaiyan - Initial contribution and API | |
* Adhith Gopal | |
*******************************************************************************/ | |
package org.eclipse.blockchain.ui.views; | |
import java.util.Map; | |
import java.util.Set; | |
import org.eclipse.blockchain.core.BlockchainCore; | |
import org.eclipse.blockchain.core.SecoBlocksPreferenceConstants; | |
import org.eclipse.blockchain.core.Web3jHandler; | |
import org.eclipse.blockchain.core.events.BlockchainEnvironmentChangedTrigger; | |
import org.eclipse.blockchain.core.events.IBlockchainEnvironmentChangedEvent; | |
import org.eclipse.blockchain.core.events.IBlockchainEnvironmentChangedListener; | |
import org.eclipse.blockchain.ui.Activator; | |
import org.eclipse.core.runtime.preferences.InstanceScope; | |
import org.eclipse.fx.ui.workbench3.FXViewPart; | |
import org.eclipse.ui.IViewSite; | |
import org.eclipse.ui.PartInitException; | |
import javafx.beans.value.ChangeListener; | |
import javafx.beans.value.ObservableValue; | |
import javafx.collections.FXCollections; | |
import javafx.collections.ObservableList; | |
import javafx.geometry.Insets; | |
import javafx.scene.Scene; | |
import javafx.scene.control.Button; | |
import javafx.scene.control.ComboBox; | |
import javafx.scene.control.Label; | |
import javafx.scene.control.TextField; | |
import javafx.scene.control.Tooltip; | |
import javafx.scene.layout.GridPane; | |
/** | |
* Ethereum Accounts view section | |
*/ | |
public class EtherAccountViewPart extends FXViewPart | |
implements | |
IBlockchainEnvironmentChangedListener { | |
static ComboBox<String> cmbAccount = new ComboBox<>(); | |
static TextField txtBalance = new TextField(); | |
static String selectedEnvironment = ""; | |
private static String selectedItem; | |
/** | |
* {@inheritDoc} | |
*/ | |
@Override | |
public void init(final IViewSite site) throws PartInitException { | |
super.init(site); | |
BlockchainEnvironmentChangedTrigger.getInstance() | |
.addBlockchainEnvironmentChangedListener(this); | |
} | |
@Override | |
protected Scene createFxScene() { | |
Scene scene = null; | |
try { | |
clearAccountsSection(); | |
GridPane gridPane = new GridPane(); | |
gridPane.setPadding(new Insets(20)); | |
gridPane.setHgap(10); | |
gridPane.setVgap(10); | |
Label lblAccount = new Label(); | |
lblAccount.setText("Accounts"); | |
EtherAccountViewPart.cmbAccount.setPrefWidth(200); | |
EtherAccountViewPart.cmbAccount.setItems(getAccountList()); | |
EtherAccountViewPart.cmbAccount.getSelectionModel().selectFirst(); | |
Label lblEtherBalance = new Label(); | |
lblEtherBalance.setText("Ether Balance"); | |
Map<String, String> accountBalance = Web3jHandler.getInstance() | |
.getAccount().getAccountBalance(getSelectedEnvironment()); | |
// Add a ChangeListener to the ComboBox | |
EtherAccountViewPart.cmbAccount.getSelectionModel() | |
.selectedItemProperty() | |
.addListener(new ChangeListener<String>() { | |
@Override | |
public void changed( | |
final ObservableValue<? extends String> ov, | |
final String oldValue, final String newValue) { | |
if (newValue != null) { | |
EtherAccountViewPart.txtBalance.setText( | |
Web3jHandler.getInstance().getAccount() | |
.getAccountBalance( | |
getSelectedEnvironment()) | |
.get(newValue)); | |
selectedItem = newValue; | |
/* | |
* if | |
* (EtherAccountViewPart.getSelectedEnvironment( | |
* ) .equals(SecoBlocksPreferenceConstants. | |
* EnvironmentType.EMBEDDED_EVM.toString())) { | |
* InstanceScope.INSTANCE.getNode( | |
* SecoBlocksPreferenceConstants. | |
* SECOBLOCKS_PREF_NODE) | |
* .put(SecoBlocksPreferenceConstants. | |
* EMBEDDED_EVM_SELECTED_ADDRESS, newValue); } | |
*/ | |
} | |
} | |
}); | |
Button btnAddAccount = new Button(); | |
btnAddAccount.setText("+"); | |
Label lblGasLimit = new Label(); | |
lblGasLimit.setText("Gas Limit"); | |
Label lblGasValue = new Label(); | |
lblGasValue.setText("Gas Value"); | |
TextField txtGasLimit = new TextField(); | |
txtGasLimit.setEditable(false); | |
txtGasLimit.setTooltip(new Tooltip("Under dev")); | |
txtGasLimit.setDisable(true); | |
TextField txtGasValue = new TextField(); | |
txtGasValue.setEditable(false); | |
txtGasValue.setTooltip(new Tooltip("Under dev")); | |
txtGasValue.setDisable(true); | |
if (Web3jHandler.getInstance().getAdminInstance() != null) { | |
/** | |
* This has to be properly constructed | |
*/ | |
// txtGasValue.setText(Web3jHandler.getInstance().getGasPrice().toString()); | |
} | |
setEthBalanace(accountBalance); | |
gridPane.add(lblAccount, 0, 0); | |
gridPane.add(EtherAccountViewPart.cmbAccount, 1, 0); | |
gridPane.add(btnAddAccount, 2, 0); | |
gridPane.add(lblGasLimit, 0, 1); | |
gridPane.add(lblGasValue, 0, 2); | |
gridPane.add(txtGasLimit, 1, 1); | |
gridPane.add(txtGasValue, 1, 2); | |
gridPane.add(lblEtherBalance, 0, 3); | |
gridPane.add(EtherAccountViewPart.txtBalance, 1, 3); | |
txtBalance.setEditable(false); | |
scene = new Scene(gridPane, 400, 400); | |
scene.getStylesheets() | |
.add(getClass().getResource("Views.css").toExternalForm()); | |
} catch (Exception e) { | |
BlockchainCore.getInstance().logException(Activator.PLUGIN_ID, | |
e.getMessage(), e); | |
} | |
return scene; | |
} | |
/** | |
* @param accountBalance | |
*/ | |
private static void setEthBalanace( | |
final Map<String, String> accountBalance) { | |
if (!EtherAccountViewPart.cmbAccount.getItems().isEmpty()) { | |
EtherAccountViewPart.selectedItem = EtherAccountViewPart.cmbAccount | |
.getSelectionModel().getSelectedItem(); | |
txtBalance.setText( | |
accountBalance.get(EtherAccountViewPart.selectedItem)); | |
} else {// This means no accounts | |
txtBalance.setText(""); | |
} | |
} | |
/** | |
* @return | |
*/ | |
private static ObservableList<String> getAccountList() { | |
ObservableList<String> accountList = FXCollections | |
.observableArrayList(); | |
Map<String, String> acctInfo = Web3jHandler.getInstance().getAccount() | |
.getAccounts(getSelectedEnvironment()); | |
Set<String> accounts = acctInfo.keySet(); | |
accountList.addAll(accounts); | |
if (!accountList.isEmpty()) { | |
if (getSelectedEnvironment().equals( | |
SecoBlocksPreferenceConstants.EnvironmentType.GETH_CLIENT | |
.toString())) { | |
accountList.remove(0);// skipping the coin-base account from | |
// displaying | |
} | |
} | |
return accountList; | |
} | |
@Override | |
protected void setFxFocus() { | |
} | |
/** | |
* @return the selectedItem | |
*/ | |
public static String getSelectedItem() { | |
return selectedItem; | |
} | |
/** | |
* | |
*/ | |
public static void updateView() { | |
EtherAccountViewPart.cmbAccount.setItems(getAccountList()); | |
if (selectedItem == null) { | |
EtherAccountViewPart.cmbAccount.getSelectionModel().selectFirst(); | |
} else { | |
EtherAccountViewPart.cmbAccount.getSelectionModel() | |
.select(selectedItem); | |
} | |
setEthBalanace(Web3jHandler.getInstance().getAccount() | |
.getAccountBalance(getSelectedEnvironment())); | |
} | |
private static String getSelectedEnvironment() { | |
if (!selectedEnvironment.isEmpty()) { | |
return selectedEnvironment; | |
} | |
return selectedEnvironment = InstanceScope.INSTANCE | |
.getNode(SecoBlocksPreferenceConstants.SECOBLOCKS_PREF_NODE) | |
.get(SecoBlocksPreferenceConstants.ENVIRONMENT_PREF_KEY, | |
SecoBlocksPreferenceConstants.EnvironmentType.EMBEDDED_EVM | |
.toString()); | |
} | |
private void clearAccountsSection() { | |
if ((cmbAccount != null) && (txtBalance != null)) { | |
cmbAccount.setItems(FXCollections.observableArrayList()); | |
txtBalance.setText(""); | |
} | |
} | |
/** | |
* {@inheritDoc} | |
*/ | |
@Override | |
public void blockchainEnvironmentChanged( | |
final IBlockchainEnvironmentChangedEvent event) { | |
// Change accounts section when evnvironment is changed | |
selectedEnvironment = event.getActiveEvironment(); | |
selectedItem = null;// On environment change reset previous environment | |
// selected account | |
updateView(); | |
} | |
} |