package org.nightlabs.jfire.trade.ui.account.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.base.ui.editor.ToolBarSectionPart; import org.nightlabs.base.ui.entity.editor.EntityEditorPageControllerModifyEvent; import org.nightlabs.base.ui.entity.editor.IEntityEditorPageControllerModifyListener; import org.nightlabs.base.ui.resource.SharedImages; import org.nightlabs.base.ui.wizard.DynamicPathWizardDialog; import org.nightlabs.jdo.query.QueryCollection; import org.nightlabs.jfire.accounting.ManualMoneyTransfer; import org.nightlabs.jfire.accounting.MoneyTransfer; import org.nightlabs.jfire.base.jdo.notification.JDOLifecycleEvent; import org.nightlabs.jfire.base.jdo.notification.JDOLifecycleListener; import org.nightlabs.jfire.base.jdo.notification.JDOLifecycleManager; import org.nightlabs.jfire.base.ui.jdo.notification.JDOLifecycleAdapterJob; import org.nightlabs.jfire.jdo.notification.IJDOLifecycleListenerFilter; import org.nightlabs.jfire.jdo.notification.JDOLifecycleState; import org.nightlabs.jfire.jdo.notification.SimpleLifecycleListenerFilter; import org.nightlabs.jfire.trade.ui.TradePlugin; import org.nightlabs.jfire.trade.ui.account.transfer.MoneyTransferTable; import org.nightlabs.jfire.trade.ui.account.transfer.manual.ManualMoneyTransferWizard; import org.nightlabs.jfire.trade.ui.resource.Messages; import org.nightlabs.jfire.transfer.id.AnchorID; import org.nightlabs.progress.ProgressMonitor; /** * @author Chairat Kongarayawetchakun - chairatk[at]nightlabs[dot]de */ public class MoneyTransferListSection extends ToolBarSectionPart{ private MoneyTransferTable moneyTransferTable; private MoneyTransferPageController controller; private ManualMoneyTransferAction transferMoneyAction; public MoneyTransferListSection(FormPage page, Composite parent, MoneyTransferPageController controller) { super(page, parent, ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE, Messages.getString("org.nightlabs.jfire.trade.ui.account.editor.MoneyTransferListSection.section.title")); //$NON-NLS-1$ this.controller = controller; getSection().setText(Messages.getString("org.nightlabs.jfire.trade.ui.account.editor.MoneyTransferListSection.sectionTitle")); //$NON-NLS-1$ getSection().setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); getSection().setLayout(new GridLayout()); XComposite client = new XComposite(getSection(), SWT.NONE, LayoutMode.TIGHT_WRAPPER); client.getGridLayout().numColumns = 1; moneyTransferTable = new MoneyTransferTable( client, SWT.NONE); moneyTransferTable.getGridData().grabExcessHorizontalSpace = true; this.controller.addPropertyChangeListener(MoneyTransferPageController.PROPERTY_MONEY_TRANSFER_QUERY, new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (ignoreMoneyTransferQueryChanged) return; moneyTransferQueryChanged((QueryCollection<?>) evt.getNewValue()); } }); JDOLifecycleManager.sharedInstance().addLifecycleListener(moneyTransferLifecycleListener); getSection().addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent event) { JDOLifecycleManager.sharedInstance().removeLifecycleListener(moneyTransferLifecycleListener); } }); this.controller.addModifyListener(new IEntityEditorPageControllerModifyListener() { public void controllerObjectModified(final EntityEditorPageControllerModifyEvent modifyEvent) { Display.getDefault().asyncExec(new Runnable() { @SuppressWarnings("unchecked") public void run() { moneyTransferListChanged((List<MoneyTransfer>) modifyEvent.getNewObject()); } }); } }); moneyTransferQueryChanged(this.controller.getQueryWrapper()); List<MoneyTransfer> moneyTransferList = this.controller.getMoneyTransferList(); if (moneyTransferList != null) moneyTransferListChanged(moneyTransferList); getSection().setClient(client); GridData gridData = new GridData(GridData.FILL_BOTH); gridData.grabExcessVerticalSpace = true; getSection().setLayoutData(gridData); transferMoneyAction = new ManualMoneyTransferAction(); getToolBarManager().add(transferMoneyAction); updateToolBarManager(); } private JDOLifecycleListener moneyTransferLifecycleListener = new JDOLifecycleAdapterJob(Messages.getString("org.nightlabs.jfire.trade.ui.account.editor.MoneyTransferPageController.loadMoneyTransfersJob.name")) { //$NON-NLS-1$ private IJDOLifecycleListenerFilter filter = new SimpleLifecycleListenerFilter( ManualMoneyTransfer.class, false, JDOLifecycleState.NEW, JDOLifecycleState.DELETED ); @Override public IJDOLifecycleListenerFilter getJDOLifecycleListenerFilter() { return filter; } @Override public void notify(JDOLifecycleEvent event) { ProgressMonitor monitor = getProgressMonitor(); monitor.beginTask(Messages.getString("org.nightlabs.jfire.trade.ui.account.editor.MoneyTransferPageController.loadMoneyTransfersJob.name"), 100); //$NON-NLS-1$ try { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { controller.fireMoneyTransferQueryChange(); } }); } finally { monitor.done(); } } }; private boolean ignoreMoneyTransferQueryChanged = false; /** * must be called on UI thread! */ private void fireProductTransferQueryChanged() { ignoreMoneyTransferQueryChanged = true; try { controller.fireMoneyTransferQueryChange(); } finally { ignoreMoneyTransferQueryChanged = false; } } /** * This method is called on the UI thread whenever the productTransferQuery has changed. * It is not called, if the change originated from here (i.e. {@link #fireProductTransferQueryChanged()} in * this object). */ private void moneyTransferQueryChanged(QueryCollection<?> queryCollection) { moneyTransferTable.setLoadingStatus(); } /** * this method is called on the UI thread. */ private void moneyTransferListChanged(List<MoneyTransfer> moneyTransferList) { moneyTransferTable.setMoneyTransfers(controller.getCurrentAnchorID(), moneyTransferList); } public class ManualMoneyTransferAction extends Action { public ManualMoneyTransferAction() { super(); setId(ManualMoneyTransferAction.class.getName()); setImageDescriptor(SharedImages.getSharedImageDescriptor( TradePlugin.getDefault(), MoneyTransferListSection.class, "Transfer")); //$NON-NLS-1$ setToolTipText(Messages.getString("org.nightlabs.jfire.trade.ui.account.editor.MoneyTransferListSection.action.toolitp")); //$NON-NLS-1$ setText(Messages.getString("org.nightlabs.jfire.trade.ui.account.editor.MoneyTransferListSection.action.text")); //$NON-NLS-1$ } @Override public void run() { AnchorID accountID = controller.getCurrentAnchorID(); if (accountID == null) return; ManualMoneyTransferWizard wizard = new ManualMoneyTransferWizard(accountID); DynamicPathWizardDialog dialog = new DynamicPathWizardDialog(wizard); dialog.open(); } } }