package com.dgex.offspring.application.dialogs; import java.io.File; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.log4j.Logger; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.osgi.util.NLS; 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.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.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import com.dgex.offspring.config.Config; import com.dgex.offspring.messages.Messages; import com.dgex.offspring.wallet.IWallet; import com.dgex.offspring.wallet.IWallet.WalletInitializedException; import com.dgex.offspring.wallet.IWallet.WalletInvalidPassword; import com.dgex.offspring.wallet.IWallet.WalletSaveException; public class LoginDialog extends TitleAreaDialog { private static Logger logger = Logger.getLogger(LoginDialog.class); private final IWallet wallet; private Text textPassword; private Text textlLocation; private Text textPassword2; private Label labelPassword2; private Button buttonBrowse; private Composite mainContainer; private Button testNetCheckbox; public LoginDialog(Shell shell, IWallet wallet) { super(shell); this.wallet = wallet; } @Override public void create() { super.create(); String message = wallet.getWalletFile().exists() ? Messages.LoginDialog_message_login : Messages.LoginDialog_message_newuser; setTitle(Messages.LoginDialog_title); setMessage(message); } @Override protected void createButtonsForButtonBar(Composite parent) { String okLabel = wallet.getWalletFile().exists() ? Messages.LoginDialog_label_login : Messages.LoginDialog_label_create_wallet; createButton(parent, IDialogConstants.OK_ID, okLabel, true); createButton(parent, IDialogConstants.CANCEL_ID, Messages.LoginDialog_label_exit, false); getButton(IDialogConstants.OK_ID).setEnabled(false); } @Override protected Control createDialogArea(Composite parent) { initializeDialogUnits(parent); Composite container = (Composite) super.createDialogArea(parent); GridLayout layout = new GridLayout(3, false); layout.horizontalSpacing = 15; layout.marginTop = 10; layout.marginLeft = 10; GridData gd = new GridData(GridData.FILL, GridData.FILL, false, true); gd.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); mainContainer = new Composite(container, SWT.NONE); mainContainer.setLayoutData(gd); mainContainer.setLayout(layout); // ----------- password ------------ Label label = new Label(mainContainer, SWT.NONE); label.setText(Messages.LoginDialog_label_password); label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false)); gd = new GridData(GridData.FILL, GridData.CENTER, true, false); gd.horizontalSpan = 2; textPassword = new Text(mainContainer, SWT.BORDER | SWT.PASSWORD); textPassword.setLayoutData(gd); // ----------- password (repeat) ------------ labelPassword2 = new Label(mainContainer, SWT.NONE); labelPassword2.setText(Messages.LoginDialog_label_password_repeat); labelPassword2.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false)); gd = new GridData(GridData.FILL, GridData.CENTER, true, false); gd.horizontalSpan = 2; textPassword2 = new Text(mainContainer, SWT.BORDER | SWT.PASSWORD); textPassword2.setLayoutData(gd); // ----------- wallet ------------ label = new Label(mainContainer, SWT.NONE); label.setText(Messages.LoginDialog_label_wallet); label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false)); label.setVisible(false); textlLocation = new Text(mainContainer, SWT.BORDER); textlLocation.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); textlLocation.setEnabled(false); buttonBrowse = new Button(mainContainer, SWT.PUSH); buttonBrowse.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false)); buttonBrowse.setText(Messages.LoginDialog_label_browse); // ----------- test net ------------ new Label(mainContainer, SWT.NONE); gd = new GridData(GridData.FILL, GridData.CENTER, true, false); gd.horizontalSpan = 2; testNetCheckbox = new Button(mainContainer, SWT.CHECK); testNetCheckbox.setLayoutData(gd); testNetCheckbox.setText("Connect to NXT test net (uses different wallet)"); testNetCheckbox.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (testNetCheckbox.getSelection()) { updateWalletPath(Config.getAppPath("testnet.wallet") .getAbsolutePath()); Config.nxtIsTestNet = true; } else { updateWalletPath(wallet.getDefaultWalletFile().getAbsolutePath()); Config.nxtIsTestNet = false; } } }); setupControls(); updateWalletPath(wallet.getWalletFile().getPath()); return container; } private void setupControls() { buttonBrowse.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { FileDialog fd = new FileDialog(getShell(), SWT.SAVE); fd.setText(Messages.LoginDialog_FileDialog_title); String path = fd.open(); if (path != null) { updateWalletPath(path); } }; }); ModifyListener listener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { updateDialogButtons(); } }; textPassword.addModifyListener(listener); textPassword2.addModifyListener(listener); } @Override protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.OK_ID) { if (wallet.getWalletFile().exists()) { try { /* unlock existing wallet */ wallet.initialize(textPassword.getText()); } catch (WalletInvalidPassword e) { setMessage(NLS.bind(Messages.LoginDialog_message_wrong_password, DateFormatUtils.format(System.currentTimeMillis(), Messages.LoginDialog_date_format))); return; } } else { try { /* create new wallet */ wallet.initialize(textPassword.getText()); /* save wallet to disk */ wallet.createWalletFile(); } catch (WalletInvalidPassword e) {} catch (WalletSaveException e) { setMessage(Messages.LoginDialog_message_save_wallet_error); } } } else if (buttonId == IDialogConstants.CANCEL_ID) { setMessage(Messages.LoginDialog_message_offspring_shutdown); Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { System.exit(0); } }); return; } super.buttonPressed(buttonId); } private void updateDialogButtons() { boolean enabled = true; String password = textPassword.getText(); String password2 = textPassword2.getText(); /* User is creating new wallet */ if (!wallet.getWalletFile().exists()) { if (password.isEmpty() || password2.isEmpty()) enabled = false; if (!password.equals(password2)) enabled = false; } else if (password.isEmpty()) { enabled = false; } Button okBtn = getButton(IDialogConstants.OK_ID); if (okBtn != null) okBtn.setEnabled(enabled); } private void updateWalletPath(String path) { try { File file = new File(path); wallet.setWalletFile(file); textlLocation.setText(wallet.getWalletFile().getPath()); if (file.exists()) { setMessage(Messages.LoginDialog_message_login); ((GridData) textPassword2.getLayoutData()).exclude = true; ((GridData) labelPassword2.getLayoutData()).exclude = true; labelPassword2.setVisible(false); textPassword2.setVisible(false); if (getButton(IDialogConstants.OK_ID) != null) getButton(IDialogConstants.OK_ID).setText( Messages.LoginDialog_label_login); } else { setMessage(Messages.LoginDialog_message_newuser); ((GridData) textPassword2.getLayoutData()).exclude = false; ((GridData) labelPassword2.getLayoutData()).exclude = false; labelPassword2.setVisible(true); textPassword2.setVisible(true); if (getButton(IDialogConstants.OK_ID) != null) getButton(IDialogConstants.OK_ID).setText( Messages.LoginDialog_label_create_wallet); } mainContainer.layout(); } catch (WalletInitializedException e) { setMessage(Messages.LoginDialog_message_wallet_initialized); } } @Override protected boolean canHandleShellCloseEvent() { return false; } }