package org.nightlabs.jfire.voucher.ui.transfer.pay.wizard; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import org.apache.log4j.Logger; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; 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.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.Text; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.base.ui.exceptionhandler.ExceptionHandlerRegistry; import org.nightlabs.base.ui.wizard.WizardHopPage; import org.nightlabs.jfire.voucher.accounting.pay.PaymentDataVoucher; import org.nightlabs.jfire.voucher.store.VoucherKey; import org.nightlabs.jfire.voucher.ui.VoucherPlugin; import org.nightlabs.jfire.voucher.ui.detail.VoucherKeyDetailComposite; import org.nightlabs.jfire.voucher.ui.resource.Messages; import org.nightlabs.jfire.voucher.ui.transfer.pay.ClientPaymentProcessorVoucher; import org.nightlabs.keyreader.KeyReadEvent; import org.nightlabs.keyreader.KeyReadListener; import org.nightlabs.keyreader.KeyReader; import org.nightlabs.keyreader.KeyReaderErrorEvent; import org.nightlabs.keyreader.KeyReaderErrorListener; import org.nightlabs.keyreader.KeyReaderMan; import org.nightlabs.keyreader.ui.KeyReaderImplementationRegistry; import org.nightlabs.l10n.NumberFormatter; public class VoucherKeyWizardPage extends WizardHopPage { private static final Logger logger = Logger.getLogger(VoucherKeyWizardPage.class); private ClientPaymentProcessorVoucher clientPaymentProcessor; private Text voucherKeyText; private Button voucherKeyOK; private VoucherKeyDetailComposite voucherKeyDetailComposite; public VoucherKeyWizardPage(ClientPaymentProcessorVoucher clientPaymentProcessor) { super(VoucherKeyWizardPage.class.getName(), Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.title")); //$NON-NLS-1$ setDescription(Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.description")); //$NON-NLS-1$ this.clientPaymentProcessor = clientPaymentProcessor; } private void clearVoucherKey() { setErrorMessage(null); setMessage(null, WARNING); setMessage(null); ignorePropertyChange = true; try { voucherKeyDetailComposite.setVoucherKeyString(null); } finally { ignorePropertyChange = false; } if (voucherKey == null) return; voucherKey = null; getContainer().updateButtons(); } private KeyReaderMan keyReaderMan; private KeyReaderErrorListener keyReaderErrorListener = new KeyReaderErrorListener() { public void errorOccured(KeyReaderErrorEvent e) { ExceptionHandlerRegistry.asyncHandleException(e.getError()); } }; private KeyReadListener keyReadListener = new KeyReadListener() { public void keyRead(final KeyReadEvent e) { voucherKey = null; Display.getDefault().asyncExec(new Runnable() { public void run() { voucherKeyText.setText(e.getKey()); voucherKeyEntered(); } }); } }; private static final String KEY_READER_ID = VoucherPlugin.getDefault().getBundle().getSymbolicName(); private KeyReader keyReader; private boolean keyReaderListenersRegistered = false; private void startKeyReader() { try { KeyReaderImplementationRegistry.sharedInstance(); // this initializes the extension point in order to allow class-loading without buddy-registration if (keyReaderMan == null) keyReaderMan = KeyReaderMan.sharedInstance(); keyReader = keyReaderMan.createKeyReader(KEY_READER_ID); if (!keyReaderListenersRegistered) { keyReader.addKeyReaderErrorListener(keyReaderErrorListener); keyReader.addKeyReadListener(keyReadListener); keyReaderListenersRegistered = true; } keyReader.openPort(); } catch (Exception e) { throw new RuntimeException(e); } } private void stopKeyReader(boolean onlyUnregisterListeners) { if (keyReader == null) return; keyReader.removeKeyReaderErrorListener(keyReaderErrorListener); keyReader.removeKeyReadListener(keyReadListener); keyReaderListenersRegistered = false; if (onlyUnregisterListeners) return; keyReader.close(true); keyReader = null; } @Override public Control createPageContents(Composite parent) { XComposite page = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER); XComposite voucherKeyComp = new XComposite(page, SWT.NONE, LayoutMode.TIGHT_WRAPPER); voucherKeyComp.getGridLayout().numColumns = 2; voucherKeyComp.getGridData().grabExcessVerticalSpace = false; voucherKeyText = new Text(voucherKeyComp, SWT.BORDER); voucherKeyText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); voucherKeyText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (logger.isDebugEnabled()) logger.debug("voucherKeyText: modifyText"); //$NON-NLS-1$ clearVoucherKey(); } }); voucherKeyText.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { if (logger.isDebugEnabled()) logger.debug("voucherKeyText: focusGained - defaultButton=" + getContainer().getShell().getDefaultButton()); //$NON-NLS-1$ // getContainer().getShell().setDefaultButton(null); } @Override public void focusLost(FocusEvent e) { logger.debug("voucherKeyText: focusLost"); //$NON-NLS-1$ } }); voucherKeyText.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { logger.debug("voucherKeyText: keyPressed: " + (int)e.character); //$NON-NLS-1$ } @Override public void keyReleased(KeyEvent e) { logger.debug("voucherKeyText: keyReleased: " + (int)e.character); //$NON-NLS-1$ if (e.character == '\r') { voucherKeyEntered(); } } }); voucherKeyText.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { logger.debug("voucherKeyText: widgetDefaultSelected"); //$NON-NLS-1$ } @Override public void widgetSelected(SelectionEvent e) { logger.debug("voucherKeyText: widgetSelected"); //$NON-NLS-1$ } }); voucherKeyOK = new Button(voucherKeyComp, SWT.PUSH); voucherKeyOK.setText(Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.voucherKeyOKButton.text")); //$NON-NLS-1$ voucherKeyOK.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { voucherKeyEntered(); } }); voucherKeyDetailComposite = new VoucherKeyDetailComposite(page, SWT.BORDER); voucherKeyDetailComposite.addPropertyChangeListener(VoucherKeyDetailComposite.PROPERTY_NAME_VOUCHER_KEY, new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (ignorePropertyChange) return; voucherKey = (VoucherKey) evt.getNewValue(); if (voucherKey == null) { errorMessage( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherNotFound.title"), //$NON-NLS-1$ Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherNotFound.message") //$NON-NLS-1$ ); } onShow(); } }); // register the listeners after creating the gui in order to ensure it exists, when they're triggered startKeyReader(); page.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { stopKeyReader(false); } }); return page; } private void errorMessage(String title, String message) { setErrorMessage(message); MessageDialog.openError( getShell(), title, message ); } private void warnMessage(String title, String message) { setMessage(message, WARNING); MessageDialog.openWarning( getShell(), title, message ); } private boolean ignorePropertyChange = false; @Override public void onHide() { stopKeyReader(true); } @Override public void onShow() { startKeyReader(); if (voucherKey != null) { if (VoucherKey.VALIDITY_VALID != voucherKey.getValidity()) { errorMessage( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherNotValid.title"), //$NON-NLS-1$ Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherNotValid.message") //$NON-NLS-1$ ); } // if voucherKey not valid else { if (!clientPaymentProcessor.getCurrency().equals(voucherKey.getRestValue().getCurrency())) { errorMessage( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageCurrencyMismatch.title"), //$NON-NLS-1$ String.format( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageCurrencyMismatch.message"), //$NON-NLS-1$ voucherKey.getRestValue().getCurrency().getCurrencySymbol(), clientPaymentProcessor.getCurrency().getCurrencySymbol() ) ); voucherKey = null; } else { IWizardPage page = getWizard().getStartingPage(); iterateWizardPages: while (page != null && page != this) { if (page instanceof VoucherKeyWizardPage) { VoucherKeyWizardPage vkwp = (VoucherKeyWizardPage) page; if (voucherKey.equals(vkwp.voucherKey)) { errorMessage( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherAlreadySelected.title"), //$NON-NLS-1$ Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherAlreadySelected.message") //$NON-NLS-1$ ); voucherKey = null; break iterateWizardPages; } } page = page.getNextPage(); } if (voucherKey != null) { if (clientPaymentProcessor.getAmount() > voucherKey.getRestValue().getAmount()) { warnMessage( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherInsufficient.title"), //$NON-NLS-1$ String.format( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.errorMessageVoucherInsufficient.message"), //$NON-NLS-1$ NumberFormatter.formatCurrency(clientPaymentProcessor.getAmount(), clientPaymentProcessor.getCurrency()), NumberFormatter.formatCurrency(voucherKey.getRestValue().getAmount(), voucherKey.getRestValue().getCurrency()) ) ); clientPaymentProcessor.getPaymentEntryPage().setAmount(voucherKey.getRestValue().getAmount()); } if (voucherKey.getRestValue().getAmount() > clientPaymentProcessor.getAmount() && clientPaymentProcessor.getAmount() < clientPaymentProcessor.getPaymentEntryPage().getMaxAmount()) { if (MessageDialog.openQuestion( getShell(), Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.dialogIncreaseAmount.title"), //$NON-NLS-1$ String.format( Messages.getString("org.nightlabs.jfire.voucher.ui.transfer.pay.wizard.VoucherKeyWizardPage.dialogIncreaseAmount.message"), //$NON-NLS-1$ NumberFormatter.formatCurrency(clientPaymentProcessor.getAmount(), clientPaymentProcessor.getCurrency()), NumberFormatter.formatCurrency(clientPaymentProcessor.getPaymentEntryPage().getMaxAmount(), clientPaymentProcessor.getCurrency()), NumberFormatter.formatCurrency(voucherKey.getRestValue().getAmount(), voucherKey.getRestValue().getCurrency()) ) )) { clientPaymentProcessor.getPaymentEntryPage().setAmount(Math.min( clientPaymentProcessor.getPaymentEntryPage().getMaxAmount(), voucherKey.getRestValue().getAmount() )); } } } // if (voucherKey != null) { } } // if voucherKey valid } // if (voucherKey != null) { PaymentDataVoucher paymentData = (PaymentDataVoucher) clientPaymentProcessor.getPaymentData(); paymentData.setVoucherKey(voucherKey == null ? null : voucherKey.getVoucherKey()); getContainer().updateButtons(); } private void voucherKeyEntered() { voucherKeyDetailComposite.setVoucherKeyString(voucherKeyText.getText()); } private VoucherKey voucherKey = null; @Override public boolean isPageComplete() { return voucherKey != null && VoucherKey.VALIDITY_VALID == voucherKey.getValidity(); } }