package com.yoghurt.crypto.transactions.client.ui; import gwt.material.design.client.ui.MaterialButton; import gwt.material.design.client.ui.MaterialTextBox; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.DeckPanel; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PasswordTextBox; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.yoghurt.crypto.transactions.client.i18n.M; import com.yoghurt.crypto.transactions.client.util.StyleUtil; import com.yoghurt.crypto.transactions.shared.domain.BlockchainSource; import com.yoghurt.crypto.transactions.shared.domain.config.AbstractAdministratedApplicationConfig; import com.yoghurt.crypto.transactions.shared.domain.config.AdministratedApplicationConfig; public class ConfigViewImpl extends Composite implements ConfigView { private static final BlockchainSource[] compatibleSources = BlockchainSource.values(); interface ConfigViewImplUiBinder extends UiBinder<Widget, ConfigViewImpl> {} private static final ConfigViewImplUiBinder UI_BINDER = GWT.create(ConfigViewImplUiBinder.class); @UiField DeckPanel switchPanel; @UiField MaterialButton login; @UiField PasswordTextBox password; @UiField PasswordTextBox createPassword; @UiField PasswordTextBox createPasswordRepeat; @UiField ListBox connectorListBox; @UiField SimplePanel configEditorContainer; @UiField MaterialTextBox applicationTitle; @UiField MaterialTextBox applicationSubtitle; @UiField MaterialTextBox donationAddress; private Presenter presenter; @SuppressWarnings("rawtypes") private ConfigEditor currentEditor; public ConfigViewImpl() { initWidget(UI_BINDER.createAndBindUi(this)); for (final BlockchainSource source : compatibleSources) { connectorListBox.addItem(M.messages().configConnectorOption(source), source.name()); } DomEvent.fireNativeEvent(Document.get().createChangeEvent(), connectorListBox); StyleUtil.setPlaceHolder(createPassword, M.messages().configPasswordPlaceHolder()); StyleUtil.setPlaceHolder(password, M.messages().configPasswordPlaceHolder()); StyleUtil.setPlaceHolder(createPasswordRepeat, M.messages().configPasswordRepeatPlaceHolder()); } @Override public void setPresenter(final Presenter presenter) { this.presenter = presenter; } @UiHandler("submitNewPassword") public void onSubmitNewPasswordClick(final ClickEvent e) { if (createPassword.getValue().equals(createPasswordRepeat.getValue())) { presenter.submitNewPassword(createPassword.getText()); } else { // Show error } } @UiHandler("saveConfig") public void onSaveConfigClick(final ClickEvent e) { presenter.saveConfig(); } @UiHandler("connectorListBox") public void onConnectorListValueChange(final ChangeEvent e) { displayConfigEditor(BlockchainSource.valueOf(connectorListBox.getSelectedValue())); } private void displayConfigEditor(final BlockchainSource source) { currentEditor = createEditor(source); configEditorContainer.setWidget(currentEditor); } @UiHandler("login") public void onLoginClick(final ClickEvent e) { presenter.checkAuthenticed(password.getValue()); login.setDisable(true); } @Override public void setCreatePassword(final boolean create) { login.setDisable(false); switchPanel.showWidget(create ? 0 : 1); } @Override public void setAuthentic(final boolean result) { login.setDisable(false); switchPanel.showWidget(2); } private ConfigEditor<?> createEditor(final BlockchainSource source) { switch (source) { case BLOCKR_API: return new BlockrConfigEditor(); case NODE: return new NodeConfigEditor(); } return null; } @Override public HandlerRegistration addValueChangeHandler(final ValueChangeHandler<AdministratedApplicationConfig> handler) { // No-op return null; } @Override public AbstractAdministratedApplicationConfig getValue() { final AbstractAdministratedApplicationConfig appConfig = (AbstractAdministratedApplicationConfig) currentEditor.getValue(); appConfig.setApplicationTitle(applicationTitle.getValue()); appConfig.setApplicationSubTitle(applicationSubtitle.getValue()); appConfig.setHostDonationAddress(donationAddress.getValue()); return appConfig; } @Override public void setValue(final AdministratedApplicationConfig value) { setValue(value, false); } @SuppressWarnings("unchecked") @Override public void setValue(final AdministratedApplicationConfig value, final boolean fireEvents) { for (int i = 0; i < connectorListBox.getItemCount(); i++) { if(connectorListBox.getValue(i).equals(value.getBlockchainSource().name())) { connectorListBox.setSelectedIndex(i); DomEvent.fireNativeEvent(Document.get().createChangeEvent(), connectorListBox); break; } } currentEditor.setValue(value); applicationTitle.setText(value.getApplicationTitle()); applicationSubtitle.setText(value.getApplicationSubTitle()); donationAddress.setText(value.getHostDonationAddress()); } }