package org.nightlabs.jfire.issuetimetracking.admin.ui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javax.jdo.FetchPlan; import org.eclipse.swt.SWT; 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.editor.ToolBarSectionPart; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jfire.accounting.PriceFragmentType; import org.nightlabs.jfire.accounting.dao.PriceFragmentTypeDAO; import org.nightlabs.jfire.issuetimetracking.ProjectCost; import org.nightlabs.progress.NullProgressMonitor; /** * @author Chairat Kongarayawetchakun - chairat [AT] nightlabs [DOT] de */ public class ProjectCostSection extends ToolBarSectionPart { private CostRevenueComposite costRevenueComposite; private ProjectCost projectCost; private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); public static final String PROPERTY_KEY_CURRENCY = CostRevenueComposite.PROPERTY_KEY_CURRENCY; public static final String PROPERTY_KEY_COST = CostRevenueComposite.PROPERTY_KEY_COST; public static final String PROPERTY_KEY_REVENUE = CostRevenueComposite.PROPERTY_KEY_REVENUE; public ProjectCostSection(FormPage page, Composite parent) { super( page, parent, ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE, "Project Cost"); XComposite mainComposite = new XComposite(getContainer(), SWT.NONE); mainComposite.setLayout(new GridLayout(2, false)); costRevenueComposite = new CostRevenueComposite(mainComposite, SWT.NONE, true); costRevenueComposite.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (ignoreModifyEvents) return; if (priceFragmentType == null) { priceFragmentType = PriceFragmentTypeDAO.sharedInstance().getPriceFragmentType(PriceFragmentType.PRICE_FRAGMENT_TYPE_ID_TOTAL, new String[] { FetchPlan.DEFAULT}, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new NullProgressMonitor()); } projectCost.setCurrency(costRevenueComposite.getSelectedCurrency()); projectCost.getDefaultCost().setAmount(priceFragmentType, costRevenueComposite.getCost()); projectCost.getDefaultRevenue().setAmount(priceFragmentType, costRevenueComposite.getRevenue()); markDirty(); propertyChangeSupport.firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()); } }); } private boolean ignoreModifyEvents = false; protected void assertSWTThread() { if (Display.getCurrent() == null) throw new IllegalStateException("Thread mismatch! This method must be called on the SWT UI thread!"); } private PriceFragmentType priceFragmentType; public void setProjectCost(ProjectCost projectCost) { assertSWTThread(); ignoreModifyEvents = true; try { this.projectCost = projectCost; costRevenueComposite.setCurrency(projectCost.getCurrency()); costRevenueComposite.setRevenue((int)projectCost.getDefaultRevenue().getAmount()); costRevenueComposite.setCost((int)projectCost.getDefaultCost().getAmount()); } finally { ignoreModifyEvents = false; } } public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } }