/*******************************************************************************
* Copyright (c) 2007, D. Lutz and Elexis
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* D. Lutz - initial implementation
*
*******************************************************************************/
package org.iatrix.messwerte.preferences;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.viewers.DefaultLabelProvider;
import ch.elexis.data.LabGroup;
import ch.elexis.data.LabItem;
import ch.elexis.data.Query;
import ch.rgw.tools.StringTool;
/**
* This class is a copy of ch.elexis.preferences.LabGroupPrefs. Up to Elexis 1.3.4,
* ch.elexis.preferences.LabGroupPrefs, is not this user-friendly. Therefore, we created our own
* version. This code will be part of Elexis 1.4.
*
* When doing changes here, do them in ch.elexis.preferences.LabGroupPrefs, too.
*
* @author danlutz
*
*/
public class LabGroupPrefs extends PreferencePage implements IWorkbenchPreferencePage {
private LabGroup actGroup = null;
private ComboViewer groupsViewer;
private ListViewer itemsViewer;
Button newButton;
Button removeButton;
Button renameButton;
Button addItemButton;
Button removeItemButton;
public LabGroupPrefs(){
super("Gruppen");
}
protected Control createContents(Composite parent){
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
composite.setLayout(new GridLayout(1, false));
Label label;
GridLayout layout;
Composite topArea = new Composite(composite, SWT.NONE);
topArea.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
layout = new GridLayout(3, false);
layout.verticalSpacing = 20;
topArea.setLayout(layout);
label = new Label(topArea, SWT.NONE);
label.setText("Für Laborverordnungen und Laborblätter können hier\n"
+ "zusätzlich zu den normalen Laborgruppen\n"
+ "weitere Gruppen definiert werden, z. B. \"Diabeteskontrolle\".");
label.setLayoutData(SWTHelper.getFillGridData(3, true, 1, false));
GridData gd;
label = new Label(topArea, SWT.NONE);
label.setText("Gruppe:");
gd = SWTHelper.getFillGridData(1, false, 1, false);
gd.verticalAlignment = GridData.BEGINNING;
label.setLayoutData(gd);
groupsViewer = new ComboViewer(topArea, SWT.READ_ONLY);
gd = SWTHelper.getFillGridData(1, true, 1, false);
gd.verticalAlignment = GridData.BEGINNING;
groupsViewer.getControl().setLayoutData(gd);
groupsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event){
IStructuredSelection sel = (IStructuredSelection) groupsViewer.getSelection();
Object element = sel.getFirstElement();
if (element instanceof LabGroup) {
actGroup = (LabGroup) element;
itemsViewer.refresh();
}
updateButtonsState();
}
});
groupsViewer.setContentProvider(new GroupsContentProvider());
groupsViewer.setLabelProvider(new DefaultLabelProvider());
groupsViewer.setInput(this);
Composite groupButtonArea = new Composite(topArea, SWT.PUSH);
layout = new GridLayout(1, false);
layout.marginHeight = 0;
groupButtonArea.setLayout(layout);
newButton = new Button(groupButtonArea, SWT.PUSH);
newButton.setText("Neu...");
newButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e){
InputDialog dialog =
new InputDialog(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
"Neue Laborgruppe", "Bitte wählen Sie einen Namen für die Gruppe", "", null);
int rc = dialog.open();
if (rc == Window.OK) {
String name = dialog.getValue();
LabGroup group = new LabGroup(name, null);
groupsViewer.refresh();
groupsViewer.setSelection(new StructuredSelection(group));
}
}
public void widgetDefaultSelected(SelectionEvent e){
widgetSelected(e);
}
});
removeButton = new Button(groupButtonArea, SWT.PUSH);
removeButton.setText("Löschen");
removeButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e){
if (actGroup != null) {
if (SWTHelper.askYesNo("Gruppe Löschen",
"Wollen Sie die Gruppe \"" + actGroup.getLabel() + "\" wirklich löschen?")) {
// TODO: only required for Elexis versions < 1.4. Will be removed later.
// (LabGroup.delete() in Elexis >= 1.4 calls removeAll() itself)
actGroup.removeAll();
actGroup.delete();
actGroup = null;
groupsViewer.refresh();
itemsViewer.refresh();
selectFirstGroup();
}
}
}
public void widgetDefaultSelected(SelectionEvent e){
widgetSelected(e);
}
});
renameButton = new Button(groupButtonArea, SWT.PUSH);
renameButton.setText("Umbenennen");
renameButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e){
if (actGroup != null) {
InputDialog dlg =
new InputDialog(getShell(), "Gruppe umbenennen",
"Bitte geben Sie den neuen Namen der Gruppe ein.", actGroup.getName(),
null);
if (dlg.open() == InputDialog.OK) {
String name = dlg.getValue();
if (!StringTool.isNothing(name)) {
actGroup.setName(name);
groupsViewer.refresh();
}
}
}
}
public void widgetDefaultSelected(SelectionEvent e){
widgetSelected(e);
}
});
Composite bottomArea = new Composite(composite, SWT.NONE);
bottomArea.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
bottomArea.setLayout(new GridLayout(1, false));
label = new Label(bottomArea, SWT.NONE);
label.setText("Enthaltene Laborwerte:");
itemsViewer =
new ListViewer(bottomArea, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
itemsViewer.getControl().setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
itemsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event){
updateItemButtonsState();
}
});
itemsViewer.setContentProvider(new GroupItemsContentProvider());
itemsViewer.setLabelProvider(new ItemsLabelProvider());
itemsViewer.setInput(this);
Composite buttonArea = new Composite(bottomArea, SWT.NONE);
buttonArea.setLayoutData(SWTHelper.getFillGridData(1, false, 1, false));
buttonArea.setLayout(new GridLayout(2, true));
addItemButton = new Button(buttonArea, SWT.PUSH);
addItemButton.setText("Hinzufügen...");
addItemButton.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
removeItemButton = new Button(buttonArea, SWT.PUSH);
removeItemButton.setText("Entfernen");
removeItemButton.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
addItemButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e){
if (actGroup != null) {
ItemsSelectionDialog dialog =
new ItemsSelectionDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(), actGroup);
if (dialog.open() == ItemsSelectionDialog.OK) {
itemsViewer.refresh();
}
}
}
public void widgetDefaultSelected(SelectionEvent e){
widgetSelected(e);
}
});
removeItemButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e){
if (actGroup != null) {
IStructuredSelection sel = (IStructuredSelection) itemsViewer.getSelection();
for (Object obj : sel.toList()) {
if (obj instanceof LabItem) {
LabItem item = (LabItem) obj;
actGroup.removeItem(item);
}
}
itemsViewer.refresh();
}
}
public void widgetDefaultSelected(SelectionEvent e){
widgetSelected(e);
}
});
selectFirstGroup();
return composite;
}
public void init(IWorkbench workbench){
// nothing to do
}
private void selectFirstGroup(){
Object element = groupsViewer.getElementAt(0);
if (element != null) {
groupsViewer.setSelection(new StructuredSelection(element));
}
}
private void updateButtonsState(){
updateGroupButtonsState();
updateItemButtonsState();
}
private void updateGroupButtonsState(){
if (actGroup != null) {
removeButton.setEnabled(true);
} else {
removeButton.setEnabled(false);
}
}
private void updateItemButtonsState(){
if (actGroup != null) {
addItemButton.setEnabled(true);
IStructuredSelection sel = (IStructuredSelection) itemsViewer.getSelection();
Object element = sel.getFirstElement();
if (element instanceof LabItem) {
removeItemButton.setEnabled(true);
} else {
removeItemButton.setEnabled(false);
}
} else {
addItemButton.setEnabled(false);
removeItemButton.setEnabled(false);
}
}
static class GroupsContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement){
Query<LabGroup> query = new Query<LabGroup>(LabGroup.class);
query.orderBy(false, new String[] {
"Name"
});
List<LabGroup> groups = query.execute();
if (groups == null) {
groups = new ArrayList<LabGroup>();
}
return groups.toArray();
}
public void dispose(){
// nothing to do
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput){
// nothing to do
}
}
static class ItemsLabelProvider extends DefaultLabelProvider {
@Override
public String getText(Object element){
if (element instanceof LabItem) {
LabItem item = (LabItem) element;
StringBuffer sb = new StringBuffer();
sb.append(item.getGroup());
sb.append(" - ");
sb.append(item.get("titel"));
return sb.toString();
} else {
return element.toString();
}
}
}
class GroupItemsContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement){
if (actGroup != null) {
List<LabItem> items = actGroup.getItems();
Collections.sort(items);
return items.toArray();
} else {
return new Object[] {};
}
}
public void dispose(){
// nothing to do
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput){
// nothing to do
}
}
class ItemsSelectionDialog extends TitleAreaDialog {
private LabGroup group;
private ListViewer viewer;
ItemsSelectionDialog(Shell parentShell, LabGroup group){
super(parentShell);
this.group = group;
}
protected Control createContents(Composite parent){
Control contents = super.createContents(parent);
setMessage("Bitte wählen Sie die Laborwerte aus.");
setTitle("Laborwerte wählen");
return contents;
}
protected Control createDialogArea(Composite parent){
Composite composite = (Composite) super.createDialogArea(parent);
composite.setLayout(new GridLayout(1, false));
Label label = new Label(composite, SWT.NONE);
label.setText("Gruppe: " + group.getName());
viewer =
new ListViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
viewer.getControl().setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
viewer.setContentProvider(new ItemsContentProvider());
viewer.setLabelProvider(new ItemsLabelProvider());
viewer.setInput(this);
return composite;
}
protected void buttonPressed(int buttonId){
if (buttonId == OK) {
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
// list of existing items
List<LabItem> existingItems = group.getItems();
List<LabItem> items = new ArrayList<LabItem>();
for (Object obj : sel.toList()) {
if (obj instanceof LabItem) {
LabItem item = (LabItem) obj;
if (!existingItems.contains(item)) {
items.add(item);
}
}
}
group.addItems(items);
}
setReturnCode(buttonId);
close();
}
class ItemsContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement){
Query<LabItem> query = new Query<LabItem>(LabItem.class);
query.orderBy(false, new String[] {
"Gruppe", "prio", "titel"
});
List<LabItem> items = query.execute();
if (items == null) {
items = new ArrayList<LabItem>();
}
// remove items already contained in the group
List<LabItem> contained = group.getItems();
items.removeAll(contained);
return items.toArray();
}
public void dispose(){
// nothing to do
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput){
// nothing to do
}
}
}
}