package de.urszeidler.shr5.ecp.dialogs; import java.util.ArrayList; import java.util.Calendar; import java.util.Comparator; import java.util.Date; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.list.WritableList; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.jface.databinding.viewers.ViewerProperties; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.nebula.widgets.cdatetime.CDT; import org.eclipse.nebula.widgets.cdatetime.CDateTime; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.wb.swt.ResourceManager; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import de.urszeidler.eclipse.shr5.Credstick; import de.urszeidler.eclipse.shr5.IntervallVertrag; import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil; import de.urszeidler.eclipse.shr5Management.ContractPayment; import de.urszeidler.eclipse.shr5Management.PlayerCharacter; import de.urszeidler.eclipse.shr5Management.Shr5managementFactory; import de.urszeidler.shr5.ecp.util.DefaultLabelProvider; import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools; import de.urszeidler.shr5.runtime.ui.views.SimpleListContenProvider; public class PayFineDialog extends TitleAreaDialog { private DataBindingContext m_bindingContext; private PlayerCharacter character; private ILabelProvider labelProvider = new DefaultLabelProvider(); private WritableList contracts = new WritableList(); private WritableValue selectedCredstick = new WritableValue(); private CheckboxTreeViewer checkboxTreeViewer; private ComboViewer comboViewer; private CDateTime dateTime; private Date baseDate; private List<ContractPayment> payments; /** * Create the dialog. * * @param parentShell * @wbp.parser.constructor */ public PayFineDialog(Shell parentShell) { super(parentShell); } /** * Create the dialog. * * @param parentShell * @param date */ public PayFineDialog(Shell parentShell, PlayerCharacter character, Date date) { super(parentShell); this.character = character; this.baseDate = date; } /** * Create contents of the dialog. * * @param parent */ @Override protected Control createDialogArea(Composite parent) { setTitleImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/title_banner-pay.png")); Composite area = (Composite)super.createDialogArea(parent); Composite container = new Composite(area, SWT.NONE); container.setLayout(new GridLayout(2, false)); GridData gd_container = new GridData(GridData.FILL_BOTH); gd_container.heightHint = 178; container.setLayoutData(gd_container); Label lblDate = new Label(container, SWT.NONE); lblDate.setText("date"); dateTime = new CDateTime(container, CDT.DROP_DOWN | CDT.DATE_SHORT); if (baseDate != null) dateTime.setSelection(baseDate); dateTime.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Date date = dateTime.getSelection(); if (date != null) updateToDate(date); updateState(); } }); dateTime.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); checkboxTreeViewer = new CheckboxTreeViewer(container, SWT.BORDER); checkboxTreeViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { updateState(); } }); checkboxTreeViewer.setLabelProvider(labelProvider); Tree tree = checkboxTreeViewer.getTree(); tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 2)); checkboxTreeViewer.setContentProvider(new SimpleListContenProvider(new AdapterFactoryContentProvider(AdapterFactoryUtil.getInstance() .getAdapterFactory()))); // checkboxTreeViewer.setInput(contracts); Composite composite = new Composite(container, SWT.NONE); composite.setLayout(new GridLayout(1, false)); composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1)); Label lblCredstick = new Label(container, SWT.NONE); lblCredstick.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblCredstick.setText("credstick"); comboViewer = new ComboViewer(container, SWT.NONE); comboViewer.setLabelProvider(labelProvider); comboViewer.setContentProvider(ArrayContentProvider.getInstance()); comboViewer.setInput(FluentIterable.from(character.getInventar()).filter(Credstick.class).toList()); comboViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateState(); } }); Combo combo_credstick = comboViewer.getCombo(); combo_credstick.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); return area; } private void updateState() { StringBuffer errors = new StringBuffer(); final Date selection = dateTime.getSelection(); if (selectedCredstick.getValue() == null) errors.append("select credstick\n"); if (selection == null) errors.append("select date\n"); if (checkboxTreeViewer.getCheckedElements().length == 0) errors.append("select contract\n"); if (errors.length() > 0) { setErrorMessage(errors.toString()); return; } setErrorMessage(null); Function<IntervallVertrag, ContractPayment> function = new Function<IntervallVertrag, ContractPayment>() { @Override public ContractPayment apply(IntervallVertrag input) { ContractPayment contractPayment = Shr5managementFactory.eINSTANCE.createContractPayment(); contractPayment.setContractToPay(input); contractPayment.setMessage(String.format("Pay for %s", labelProvider.getText(input))); return contractPayment; } }; payments = new ArrayList<ContractPayment>(checkboxTreeViewer.getCheckedElements().length); for (Object o : checkboxTreeViewer.getCheckedElements()) { IntervallVertrag iv = (IntervallVertrag)o; ContractPayment payment = function.apply(iv); payments.add(payment); } ImmutableList<String> list = FluentIterable.from(payments).transform(ShadowrunEditingTools.eObject2StringTransformer()).toList(); setMessage(list.toString()); } private void updateToDate(final Date date) { ImmutableList<IntervallVertrag> list = FluentIterable.from(character.getContracts()).filter(IntervallVertrag.class) .filter(new Predicate<IntervallVertrag>() { @Override public boolean apply(IntervallVertrag input) { Date begin = getLastPaymentDate(input,date);//input.getBegin(); if(begin==null) return false; Calendar instance = getNextPayment(input, begin); return instance.getTime().after(date); } }).toList();// .copyInto(contracts); checkboxTreeViewer.setInput(list); } private Date getLastPaymentDate(IntervallVertrag input, Date date) { ImmutableList<ContractPayment> lastpay = FluentIterable.from(character.getDiary().getEntries()).filter(ContractPayment.class).toSortedList(new Comparator<ContractPayment>() { @Override public int compare(ContractPayment o1, ContractPayment o2) { if(o1.getDate()!=null && o2.getDate()!=null) return o1.getDate().compareTo(o2.getDate())*-1; return 0; } }); if(lastpay.isEmpty()) return input.getBegin(); else return lastpay.get(0).getDate(); } /** * Create contents of the button bar. * * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); m_bindingContext = initDataBindings(); } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(450, 320); } protected DataBindingContext initDataBindings() { DataBindingContext bindingContext = new DataBindingContext(); // IObservableValue observeSingleSelectionComboViewer = ViewerProperties.singleSelection().observe(comboViewer); bindingContext.bindValue(observeSingleSelectionComboViewer, selectedCredstick, null, null); // return bindingContext; } public List<ContractPayment> getPayments() { return payments; } public Credstick getSelectedCredstick() { return (Credstick)selectedCredstick.getValue(); } /** * @param input * @param begin * @return */ public static Calendar getNextPayment(IntervallVertrag input, Date begin) { int faelligkeitsIntervall = input.getFaelligkeitsIntervall(); Calendar instance = Calendar.getInstance(); instance.setTime(begin); int field = 0; switch (input.getUnit()) { case DAY: field = Calendar.DAY_OF_YEAR; break; case WEEK: field = Calendar.WEEK_OF_YEAR; break; case MONTH: field = Calendar.MONTH; break; case YEAR: field = Calendar.YEAR; break; default: break; } instance.add(field, faelligkeitsIntervall); return instance; } }