package edu.ualberta.med.biobank.widgets.report; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import edu.ualberta.med.biobank.model.ReportFilterValue; public class ComboFilterValueWidget implements FilterValueWidget { private static final String DEFAULT_TEXT = Messages.ComboFilterValueWidget_select_enter_text; private final ComboViewer comboViewer; private boolean isShowingDefaultText; public ComboFilterValueWidget(Composite parent) { comboViewer = new ComboViewer(parent, SWT.NONE); final Combo combo = comboViewer.getCombo(); isShowingDefaultText = true; combo.setText(DEFAULT_TEXT); addListeners(); } @Override public Collection<ReportFilterValue> getValues() { Collection<ReportFilterValue> values = new ArrayList<ReportFilterValue>(); ISelection selection = comboViewer.getSelection(); if (selection instanceof IStructuredSelection) { Iterator<?> it = ((IStructuredSelection) selection).iterator(); int position = 0; while (it.hasNext()) { String selectedText = (String) it.next(); if (selectedText != null && !selectedText.isEmpty()) { ReportFilterValue value = new ReportFilterValue(); value.setPosition(position); value.setValue(selectedText); values.add(value); position++; } } } if (values.isEmpty() && !comboViewer.getCombo().isDisposed() && !isShowingDefaultText) { String text = comboViewer.getCombo().getText().trim(); if (!text.isEmpty()) { ReportFilterValue value = new ReportFilterValue(); value.setValue(text); value.setPosition(0); values.add(value); } } return values; } @Override public void setValues(Collection<ReportFilterValue> values) { Combo combo = comboViewer.getCombo(); if (!combo.isDisposed()) { combo.setText(""); //$NON-NLS-1$ for (ReportFilterValue value : values) { if (value != null && value.getValue() != null) { combo.setText(value.getValue()); } break; } } } @Override public void addChangeListener( final ChangeListener<ChangeEvent> changeListener) { comboViewer.getCombo().addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { changeListener.handleEvent(null); } }); } @Override public Control getControl() { return comboViewer.getControl(); } @Override public boolean isValid(ReportFilterValue value) { return value.getValue() != null && !value.getValue().isEmpty() && value.getSecondValue() == null; } @Override public String toString(ReportFilterValue value) { return value.getValue(); } public ComboViewer getComboViewer() { return comboViewer; } private void addListeners() { final Combo combo = comboViewer.getCombo(); combo.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { if (combo.getText().equals(DEFAULT_TEXT)) { combo.setText(""); //$NON-NLS-1$ isShowingDefaultText = false; } } @Override public void focusLost(FocusEvent e) { if (combo.getText().isEmpty()) { combo.setText(DEFAULT_TEXT); isShowingDefaultText = true; } } }); combo.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { isShowingDefaultText = false; if (combo.getText().isEmpty() && !combo.isFocusControl()) { combo.setText(DEFAULT_TEXT); isShowingDefaultText = true; } } }); } }