package org.nightlabs.jfire.voucher.admin.ui.priceconfig; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.layout.WeightedTableLayout; import org.nightlabs.base.ui.table.TableContentProvider; import org.nightlabs.base.ui.wizard.DynamicPathWizardDialog; import org.nightlabs.jfire.accounting.Currency; import org.nightlabs.jfire.voucher.admin.ui.resource.Messages; import org.nightlabs.l10n.NumberFormatter; public class CurrencyAmountTable extends XComposite implements ISelectionProvider { private static final Logger logger = Logger.getLogger(CurrencyAmountTable.class); private Map<Currency, Long> map; protected Table table; private static class CurrencyAmountLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { if (element instanceof Map.Entry) { Map.Entry<Currency, Long> me = (Map.Entry<Currency, Long>)element; switch (columnIndex) { case 0: return me.getKey().getCurrencySymbol(); case 1: return NumberFormatter.formatCurrency(me.getValue(), 1, me.getKey(), false); default: return ""; //$NON-NLS-1$ } } if (columnIndex == 0) return String.valueOf(element); else return ""; //$NON-NLS-1$ } } private ICellModifier cellModifier = new ICellModifier() { public boolean canModify(Object element, String property) { return COLUMN_AMOUNT.equals(property); } public Object getValue(Object element, String property) { if (COLUMN_AMOUNT.equals(property)) { Map.Entry<Currency, Long> me = (Map.Entry<Currency, Long>)element; return String.valueOf(me.getValue()); } return null; } public void modify(Object element, String property, Object value) { TableItem tableItem = (TableItem)element; Map.Entry<Currency, Long> me = (Map.Entry<Currency, Long>)tableItem.getData(); if (COLUMN_AMOUNT.equals(property)) { logger.info("ICellModifier.modify: value=" + value); //$NON-NLS-1$ String txt = (String) value; Long v = null; try { v = new Long(txt); } catch (NumberFormatException x) { MessageDialog.openError(getShell(), Messages.getString("org.nightlabs.jfire.voucher.admin.ui.priceconfig.CurrencyAmountTable.errorMessageInvalidNumber.title"), Messages.getString("org.nightlabs.jfire.voucher.admin.ui.priceconfig.CurrencyAmountTable.errorMessageInvalidNumber.message")); //$NON-NLS-1$ //$NON-NLS-2$ } if (v != null) { me.setValue(v); tableItem.setText(1, ((ITableLabelProvider)tableViewer.getLabelProvider()).getColumnText(me, 1)); fireValueChangedEvent(); } } } }; private TableViewer tableViewer; private Button addCurrencyButton; private Button removeCurrencyButton; protected static final String COLUMN_CURRENCY = "currency"; //$NON-NLS-1$ protected static final String COLUMN_AMOUNT = "amount"; //$NON-NLS-1$ public Table getTable() { return table; } public CurrencyAmountTable(Composite parent, boolean showButtons) { super(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER); tableViewer = new TableViewer(this, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION); table = tableViewer.getTable(); tableViewer.setContentProvider(new TableContentProvider()); tableViewer.setLabelProvider(new CurrencyAmountLabelProvider()); tableViewer.setCellModifier(cellModifier); TextCellEditor tce = new TextCellEditor(table); // tce.setValidator(new ICellEditorValidator() { // public String isValid(Object value) // { // logger.info("ICellEditorValidator.isValid: value=" + value); // String txt = (String) value; // try { // Long.parseLong(txt); // return null; // } catch (NumberFormatException x) { // return "The text you entered is not a valid number: " + txt; // } // } // }); tableViewer.setCellEditors(new CellEditor[] {null, tce}); tableViewer.setColumnProperties(new String[] { COLUMN_CURRENCY, COLUMN_AMOUNT }); tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { fireSelectionChangedEvent(); } }); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setLayout(new WeightedTableLayout(new int[] {1, 1})); new TableColumn(table, SWT.LEFT).setText(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.priceconfig.CurrencyAmountTable.currencyTableColumn.text")); //$NON-NLS-1$ new TableColumn(table, SWT.LEFT).setText(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.priceconfig.CurrencyAmountTable.amountTableColumn.text")); //$NON-NLS-1$ if (showButtons) { getGridLayout().numColumns = 2; XComposite buttonComp = new XComposite(this, SWT.NONE, LayoutDataMode.NONE); buttonComp.setLayoutData(new GridData()); addCurrencyButton = new Button(buttonComp, SWT.PUSH); addCurrencyButton.setText(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.priceconfig.CurrencyAmountTable.addCurrencyButton.text")); //$NON-NLS-1$ addCurrencyButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); addCurrencyButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addCurrency(); } }); removeCurrencyButton = new Button(buttonComp, SWT.PUSH); removeCurrencyButton.setText(Messages.getString("org.nightlabs.jfire.voucher.admin.ui.priceconfig.CurrencyAmountTable.removeCurrencyButton.text")); //$NON-NLS-1$ removeCurrencyButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); removeCurrencyButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { removeCurrency(); } }); } } /** * Opens a dialog and adds the selected currencies. */ public void addCurrency() { AddCurrencyWizard wizard = new AddCurrencyWizard(this); DynamicPathWizardDialog dialog = new DynamicPathWizardDialog(wizard); dialog.open(); } /** * Adds the given <code>Currency</code>. If it's already in the map, this is a noop. * * @param currency The <code>Currency</code> to add. */ public void addCurrency(Currency currency) { if (map == null || map.containsKey(currency)) return; map.put(currency, new Long(0)); setMap(map); } /** * Removes the currently selected <code>Currency</code> from the table. */ public void removeCurrency() { Currency c = getSelectedCurrency(); if (c != null) removeCurrency(c); } /** * Removes the given <code>Currency</code> from the table. * * @param currency The <code>Currency</code> to remove. */ public void removeCurrency(Currency currency) { if (map == null) return; map.remove(currency); setMap(map); } public void setMap(Map<Currency, Long> map) { this.map = map; if (map == null) tableViewer.setInput(null); else { List<Map.Entry<Currency, Long>> l = new ArrayList<Map.Entry<Currency,Long>>(map.size()); l.addAll(map.entrySet()); Collections.sort(l, new Comparator<Map.Entry<Currency, Long>>() { public int compare(Map.Entry<Currency, Long> me1, Map.Entry<Currency, Long> me2) { return me1.getKey().getCurrencySymbol().compareTo(me2.getKey().getCurrencySymbol()); } }); tableViewer.setInput(l); } } public Map<Currency, Long> getMap() { return map; } private Currency selectedCurrency; public Currency getSelectedCurrency() { return selectedCurrency; } protected void fireSelectionChangedEvent() { IStructuredSelection sel = (IStructuredSelection) getSelection(); if (sel.isEmpty()) selectedCurrency = null; else selectedCurrency = ((Map.Entry<Currency, Long>)sel.getFirstElement()).getKey(); if (removeCurrencyButton != null) removeCurrencyButton.setEnabled(selectedCurrency != null); Object[] listeners = selectionChangedListeners.getListeners(); if (listeners.length < 1) return; SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection()); for (Object l : listeners) { ISelectionChangedListener listener = (ISelectionChangedListener) l; listener.selectionChanged(event); } } private ListenerList selectionChangedListeners = new ListenerList(); public void addSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.add(listener); } public void removeSelectionChangedListener(ISelectionChangedListener listener) { selectionChangedListeners.remove(listener); } private ListenerList priceValueChangedListeners = new ListenerList(); protected void fireValueChangedEvent() { Object[] listeners = priceValueChangedListeners.getListeners(); if (listeners.length < 1) return; for (Object l : listeners) { IPriceConfigValueChangedListener listener = (IPriceConfigValueChangedListener) l; listener.priceValueChanged(); } } public void addPriceConfigValueChangedListener(IPriceConfigValueChangedListener listener) { priceValueChangedListeners.add(listener); } public void removePriceConfigValueChangedListener(IPriceConfigValueChangedListener listener) { priceValueChangedListeners.remove(listener); } public ISelection getSelection() { return tableViewer.getSelection(); } public void setSelection(ISelection selection) { tableViewer.setSelection(selection); } }