package edu.ualberta.med.biobank.widgets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.PlatformUI;
import edu.ualberta.med.biobank.common.wrappers.EventAttrTypeEnum;
import edu.ualberta.med.biobank.dialogs.ListAddDialog;
import edu.ualberta.med.biobank.gui.common.BgcPlugin;
import edu.ualberta.med.biobank.gui.common.widgets.BgcBaseWidget;
import edu.ualberta.med.biobank.model.EventAttrCustom;
public class EventAttrWidget extends BgcBaseWidget {
private Button checkButton;
private Button addButton;
private Button removeButton;
private List itemList;
private boolean hasListValues;
private LabelDialogInfo labelDlgInfo;
private static class LabelDialogInfo {
public String title;
public String prompt;
public String helpText;
public LabelDialogInfo(String title, String prompt, String helpText) {
this.title = title;
this.prompt = prompt;
this.helpText = helpText;
}
};
private static Map<String, LabelDialogInfo> LABEL_DLG_INFO =
new HashMap<String, LabelDialogInfo>() {
private static final long serialVersionUID = 1L;
{
put(Messages.PvInfoWidget_patient_type_label,
new LabelDialogInfo(
Messages.PvInfoWidget_patient_type_title,
Messages.PvInfoWidget_patient_type_prompt,
Messages.PvInfoWidget_patient_type_help));
put(Messages.PvInfoWidget_visit_type_label,
new LabelDialogInfo(
Messages.PvInfoWidget_visit_type_title,
Messages.PvInfoWidget_visit_type_prompt,
Messages.PvInfoWidget_visit_type_help));
put(Messages.PvInfoWidget_consent_label, new LabelDialogInfo(
Messages.PvInfoWidget_consent_title,
Messages.PvInfoWidget_consent_prompt,
Messages.PvInfoWidget_consent_help));
}
};
public EventAttrWidget(Composite parent, int style,
final EventAttrCustom customInfo, boolean selected) {
super(parent, style);
setLayout(new GridLayout(1, false));
setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
hasListValues = customInfo.getType() == EventAttrTypeEnum.SELECT_SINGLE
|| customInfo.getType() == EventAttrTypeEnum.SELECT_MULTIPLE;
// selected |= (customInfo.getAllowedValues() != null);
if (hasListValues) {
labelDlgInfo = LABEL_DLG_INFO.get(customInfo.getLabel());
Assert.isNotNull(labelDlgInfo, "no dialog info for label " //$NON-NLS-1$
+ customInfo.getLabel());
createCheckButton(customInfo, selected);
// this composite holds the list and the "Add" and "Remove" buttons
Composite comp = new Composite(this, SWT.NONE);
comp.setLayout(new GridLayout(2, false));
comp.setLayoutData(new GridData(GridData.FILL_BOTH));
// this composite holds the "Add" and "Remove" buttons
Composite bcomp = new Composite(comp, SWT.NONE);
bcomp.setLayout(new GridLayout(1, false));
bcomp.setLayoutData(new GridData());
addButton = new Button(bcomp, SWT.PUSH);
addButton.setImage(BgcPlugin.getDefault().getImageRegistry()
.get(BgcPlugin.IMG_ADD));
addButton.setToolTipText(Messages.PvInfoWidget_add_label);
addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
notifyListeners();
Assert.isNotNull(labelDlgInfo, "no dialog info for label " //$NON-NLS-1$
+ customInfo.getLabel());
ListAddDialog dlg = new ListAddDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(),
labelDlgInfo.title, labelDlgInfo.prompt,
labelDlgInfo.helpText);
if (dlg.open() == Dialog.OK) {
java.util.List<String> currentItems =
new ArrayList<String>(
Arrays.asList(itemList.getItems()));
java.util.List<String> newItems = Arrays.asList(dlg
.getResult());
if (currentItems.size() == 0) {
currentItems.addAll(newItems);
} else {
// make sure there are no duplicates
for (String item : newItems) {
item = item.trim();
if (!currentItems.contains(item)) {
currentItems.add(item);
}
}
}
Collections.sort(currentItems);
itemList.removeAll();
for (String item : currentItems) {
itemList.add(item);
}
checkButton.setSelection(true);
}
}
});
removeButton = new Button(bcomp, SWT.PUSH);
removeButton.setImage(BgcPlugin.getDefault().getImageRegistry()
.get(BgcPlugin.IMG_DELETE));
removeButton.setToolTipText(Messages.PvInfoWidget_remove_label);
removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
for (String selection : itemList.getSelection()) {
itemList.remove(selection);
notifyListeners();
}
}
});
itemList = new List(comp, SWT.BORDER | SWT.V_SCROLL);
itemList.setLayoutData(new GridData(GridData.FILL_BOTH));
if (customInfo.getAllowedValues() != null) {
for (String item : customInfo.getAllowedValues()) {
itemList.add(item);
}
}
Menu m = new Menu(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(), SWT.POP_UP);
MenuItem mi = new MenuItem(m, SWT.CASCADE);
mi.setText(Messages.PvInfoWidget_move_top_label);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
int index = itemList.getSelectionIndex();
if (index <= 0)
return;
String[] items = itemList.getItems();
String[] newList = new String[items.length];
newList[0] = items[index];
int i = 1;
for (String item : items) {
if (!item.equals(items[index])) {
newList[i] = item;
++i;
}
}
itemList.setItems(newList);
}
});
mi = new MenuItem(m, SWT.CASCADE);
mi.setText(Messages.PvInfoWidget_move_up_label);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
int index = itemList.getSelectionIndex();
if (index <= 0)
return;
String[] items = itemList.getItems();
String[] newList = new String[items.length];
int i = 0;
for (String item : items) {
if ((i < index - 1) || (i > index)) {
newList[i] = item;
}
++i;
}
newList[index - 1] = items[index];
newList[index] = items[index - 1];
itemList.setItems(newList);
}
});
mi = new MenuItem(m, SWT.CASCADE);
mi.setText(Messages.PvInfoWidget_move_down_label);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
int index = itemList.getSelectionIndex();
String[] items = itemList.getItems();
if (index >= items.length - 1)
return;
String[] newList = new String[items.length];
int i = 0;
for (String item : items) {
if ((i < index) || (i > index + 1)) {
newList[i] = item;
}
++i;
}
newList[index] = items[index + 1];
newList[index + 1] = items[index];
itemList.setItems(newList);
}
});
mi = new MenuItem(m, SWT.CASCADE);
mi.setText(Messages.PvInfoWidget_move_bottom_label);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
int index = itemList.getSelectionIndex();
String[] items = itemList.getItems();
if (index >= items.length - 1)
return;
String[] newList = new String[items.length];
int i = 0;
for (String item : items) {
if (!item.equals(items[index])) {
newList[i] = item;
++i;
}
}
newList[i] = items[index];
itemList.setItems(newList);
}
});
itemList.setMenu(m);
} else {
createCheckButton(customInfo, selected);
}
}
private void createCheckButton(final EventAttrCustom pvCustomInfo,
boolean selected) {
checkButton = new Button(this, SWT.CHECK);
checkButton.setText(pvCustomInfo.getLabel());
checkButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
notifyListeners();
}
});
if (pvCustomInfo.getIsDefault()) {
checkButton.setEnabled(false);
checkButton.setSelection(true);
} else {
checkButton.setSelection(selected);
}
}
public boolean getSelected() {
return checkButton.getSelection();
}
public String getValues() {
if (hasListValues) {
return StringUtils.join(itemList.getItems(),
EventAttrCustom.VALUE_MULTIPLE_SEPARATOR);
}
return null;
}
public void setSelected(boolean selected) {
checkButton.setSelection(selected);
}
public void reloadAllowedValues(EventAttrCustom pvCustomInfo) {
if (itemList != null) {
itemList.removeAll();
if (pvCustomInfo.getAllowedValues() != null) {
for (String item : pvCustomInfo.getAllowedValues()) {
itemList.add(item);
}
}
}
}
}