package ch.elexis.core.ui.preferences;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import ch.elexis.core.constants.Preferences;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.status.ElexisStatus;
import ch.elexis.core.data.util.Extensions;
import ch.elexis.core.ui.Hub;
import ch.elexis.core.ui.constants.ExtensionPointConstantsUi;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.views.IDetailDisplay;
public class ServiceDiagnosePrefs extends PreferencePage implements IWorkbenchPreferencePage {
private static final String FAVORITES = "Favoriten";
private ComboViewer cmbViewer;
private TableViewer viewer, viewerAvailable;
private List<String> input, aInput;
enum ViewType {
Leistungen, Diagnose, Codes
}
public ServiceDiagnosePrefs(){
super("Leistungen u. Diagnosen");
}
@Override
protected Control createContents(Composite parent){
Composite ret = new Composite(parent, SWT.NONE);
ret.setLayout(new GridLayout(3, true));
Label lblView = new Label(ret, SWT.NONE);
lblView.setText(Messages.ServiceDiagnosis_View);
lblView.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
cmbViewer = new ComboViewer(ret, SWT.READ_ONLY);
Combo combo = cmbViewer.getCombo();
combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
cmbViewer.setContentProvider(new ArrayContentProvider());
cmbViewer.setLabelProvider(new LabelProvider());
cmbViewer.setInput(ViewType.values());
cmbViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event){
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
ViewType view = (ViewType) selection.getFirstElement();
loadInput(view);
}
});
int operations = DND.DROP_MOVE | DND.DROP_TARGET_MOVE;
Transfer[] transferTypes = new Transfer[] {
TextTransfer.getInstance()
};
new Label(ret, SWT.NONE);
new Label(ret, SWT.NONE);
new Label(ret, SWT.NONE);
Label lblDisplayed = new Label(ret, SWT.NONE);
lblDisplayed.setText(Messages.ServiceDiagnosis_Displayed);
new Label(ret, SWT.NONE);
Label lblAvailable = new Label(ret, SWT.NONE);
lblAvailable.setText(Messages.ServiceDiagnosis_Available);
Label label = new Label(ret, SWT.SEPARATOR | SWT.HORIZONTAL);
label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
viewer = new TableViewer(ret, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
Table table = viewer.getTable();
table.setHeaderVisible(false);
table.setLinesVisible(false);
GridData gd_v = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
gd_v.widthHint = 150;
gd_v.heightHint = 200;
gd_v.minimumWidth = 150;
gd_v.minimumHeight = 200;
table.setLayoutData(gd_v);
createColumn(ret, viewer);
viewer.setContentProvider(new ArrayContentProvider());
viewer.setInput(input);
viewer.addDragSupport(operations, transferTypes, new DragListener(viewer, true));
viewer.addDropSupport(operations, transferTypes, new DropListener(viewer, true));
Composite btnComposite = new Composite(ret, SWT.NONE);
btnComposite.setLayout(new GridLayout(1, false));
btnComposite.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, true, false));
Button btnUp = new Button(btnComposite, SWT.PUSH);
btnUp.setImage(Images.IMG_ARROWUP.getImage());
btnUp.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
btnUp.setToolTipText(Messages.ServiceDiagnosis_UpTooltip);
btnUp.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
String value = (String) selection.getFirstElement();
int idx = input.indexOf(value);
if (idx > 0) {
input.remove(value);
input.add(idx - 1, value);
viewer.refresh();
}
}
});
Button btnDown = new Button(btnComposite, SWT.PUSH);
btnDown.setImage(Images.IMG_ARROWDOWN.getImage());
btnDown.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
btnDown.setToolTipText(Messages.ServiceDiagnosis_DownTooltip);
btnDown.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e){
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
String value = (String) selection.getFirstElement();
int idx = input.indexOf(value);
if (idx != -1 && idx < input.size() - 1) {
input.remove(value);
input.add(idx + 1, value);
viewer.refresh();
}
}
});
viewerAvailable = new TableViewer(ret, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
table = viewerAvailable.getTable();
table.setHeaderVisible(false);
table.setLinesVisible(false);
GridData gd_va = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
gd_va.widthHint = 150;
gd_va.heightHint = 200;
gd_va.minimumWidth = 150;
gd_va.minimumHeight = 200;
table.setLayoutData(gd_va);
createColumn(ret, viewerAvailable);
viewerAvailable.setContentProvider(new ArrayContentProvider());
viewerAvailable.setInput(aInput);
viewerAvailable.addDragSupport(operations, transferTypes, new DragListener(viewerAvailable,
false));
viewerAvailable.addDropSupport(operations, transferTypes, new DropListener(viewerAvailable,
false));
cmbViewer.setSelection(new StructuredSelection(ViewType.Leistungen));
return ret;
}
private void createColumn(final Composite parent, final TableViewer viewer){
TableViewerColumn tvCol = new TableViewerColumn(viewer, SWT.NONE);
tvCol.setLabelProvider(new ColumnLabelProvider());
TableColumn column = tvCol.getColumn();
column.setText("");
column.setWidth(150);
column.setResizable(false);
column.setMoveable(false);
}
private void loadInput(ViewType view){
String[] settings = new String[]{};
input = new ArrayList<String>();
aInput = new ArrayList<String>();
switch (view) {
case Leistungen:
aInput.addAll(findPagesFor(ExtensionPointConstantsUi.VERRECHNUNGSCODE, null));
aInput.add(FAVORITES);
settings =
CoreHub.userCfg
.get(Preferences.USR_SERVICES_DIAGNOSES_SRV, getListAsString(aInput))
.split(",");
break;
case Diagnose:
aInput.addAll(findPagesFor(ExtensionPointConstantsUi.DIAGNOSECODE, null));
settings =
CoreHub.userCfg.get(Preferences.USR_SERVICES_DIAGNOSES_DIAGNOSE,
getListAsString(aInput)).split(",");
break;
case Codes:
aInput.addAll(findPagesFor(ExtensionPointConstantsUi.VERRECHNUNGSCODE, "Artikel"));
aInput.addAll(findPagesFor(ExtensionPointConstantsUi.DIAGNOSECODE, "Artikel"));
aInput.addAll(findPagesFor(ExtensionPointConstantsUi.GENERICCODE, "Artikel"));
aInput.add(FAVORITES);
settings =
CoreHub.userCfg.get(Preferences.USR_SERVICES_DIAGNOSES_CODES,
getListAsString(aInput)).split(",");
break;
default:
break;
}
for (String s : settings) {
input.add(s);
aInput.remove(s);
}
viewer.setInput(input);
viewerAvailable.setInput(aInput);
}
private String getListAsString(List<String> list){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
if (i != (list.size() - 1)) {
sb.append(",");
}
}
return sb.toString();
}
private List<String> findPagesFor(String point, String ignore){
List<String> pageNames = new ArrayList<String>();
List<IConfigurationElement> list = Extensions.getExtensions(point);
for (IConfigurationElement ce : list) {
try {
if (ignore != null && ignore.equals(ce.getName())) {
continue;
}
IDetailDisplay d =
(IDetailDisplay) ce.createExecutableExtension("CodeDetailDisplay"); //$NON-NLS-1$
pageNames.add(d.getTitle().trim());
} catch (Exception ex) {
new ElexisStatus(ElexisStatus.WARNING, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE,
"Fehler beim Laden von " + ce.getName(), ex, ElexisStatus.LOG_WARNINGS);
}
}
return pageNames;
}
@Override
public void init(IWorkbench workbench){
// TODO Auto-generated method stub
}
@Override
protected void performApply(){
IStructuredSelection selection = (IStructuredSelection) cmbViewer.getSelection();
ViewType type = (ViewType) selection.getFirstElement();
if (type != null) {
String listString = getListAsString(input);
switch (type) {
case Leistungen:
CoreHub.userCfg.set(Preferences.USR_SERVICES_DIAGNOSES_SRV, listString);
break;
case Diagnose:
CoreHub.userCfg.set(Preferences.USR_SERVICES_DIAGNOSES_DIAGNOSE, listString);
break;
case Codes:
CoreHub.userCfg.set(Preferences.USR_SERVICES_DIAGNOSES_CODES, listString);
break;
default:
break;
}
}
super.performApply();
}
class DropListener extends ViewerDropAdapter {
private final TableViewer viewer;
private boolean isUserSet;
protected DropListener(Viewer viewer, boolean isUserSet){
super(viewer);
this.viewer = (TableViewer) viewer;
this.isUserSet = isUserSet;
}
@Override
public boolean performDrop(Object data){
if (isUserSet) {
input.add(data.toString());
} else {
aInput.add(data.toString());
}
viewer.refresh();
return true;
}
@Override
public boolean validateDrop(Object target, int operation, TransferData transferType){
return true;
}
}
class DragListener implements DragSourceListener {
private final TableViewer viewer;
private boolean isUserSet;
private String movedValue;
public DragListener(Viewer viewer, boolean isUserSet){
this.viewer = (TableViewer) viewer;
this.isUserSet = isUserSet;
}
@Override
public void dragSetData(DragSourceEvent event){
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
String value = (String) selection.getFirstElement();
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = value;
movedValue = value;
}
}
public void dragStart(DragSourceEvent event){}
@Override
public void dragFinished(DragSourceEvent event){
if (isUserSet) {
input.remove(movedValue);
} else {
aInput.remove(movedValue);
}
viewer.refresh();
}
}
}