/*******************************************************************************
* Copyright (c) 2007-2010, G. Weirich 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:
* G. Weirich - initial implementation
*
*******************************************************************************/
package ch.elexis.icpc.views;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.ui.actions.GlobalEventDispatcher;
import ch.elexis.core.data.interfaces.IDiagnose;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.icpc.Episode;
import ch.elexis.core.ui.util.PersistentObjectDragSource;
import ch.elexis.core.ui.util.PersistentObjectDropTarget;
import ch.elexis.core.ui.util.SWTHelper;
public class EpisodesDisplay extends Composite {
ScrolledForm form;
Patient actPatient;
TreeViewer tvEpisodes;
public EpisodesDisplay(final Composite parent){
super(parent, SWT.NONE);
setLayout(new GridLayout());
form = UiDesk.getToolkit().createScrolledForm(this);
form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
Composite body = form.getBody();
body.setLayout(new GridLayout());
tvEpisodes = new TreeViewer(body);
tvEpisodes.getControl().setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
tvEpisodes.setLabelProvider(new EpisodesLabelProvider());
tvEpisodes.setContentProvider(new EpisodecontentProvider());
tvEpisodes.addSelectionChangedListener(GlobalEventDispatcher.getInstance()
.getDefaultListener());
/* PersistentObjectDragSource pods= */new PersistentObjectDragSource(tvEpisodes);
// lvEpisodes.addDragSupport(DND.DROP_COPY, new Transfer[]
// {TextTransfer.getInstance()},
// pods);
new PersistentObjectDropTarget(tvEpisodes.getControl(), new Receiver());
setPatient(ElexisEventDispatcher.getSelectedPatient());
}
public void setPatient(final Patient pat){
actPatient = pat;
if (pat != null) {
tvEpisodes.setInput(pat);
}
tvEpisodes.refresh();
}
public Episode getSelectedEpisode(){
Tree widget = tvEpisodes.getTree();
TreeItem[] sel = widget.getSelection();
if ((sel == null) || (sel.length == 0)) {
return null;
}
TreeItem f = sel[0];
TreeItem p = f;
do {
f = p;
p = f.getParentItem();
} while (p != null);
return getEpisodeFromItem(f);
}
private Episode getEpisodeFromItem(final TreeItem t){
String etext = t.getText();
for (Object o : ((ITreeContentProvider) tvEpisodes.getContentProvider())
.getElements(actPatient)) {
if (o instanceof Episode) {
Episode ep = (Episode) o;
if (ep.getLabel().equals(etext)) {
return ep;
}
}
}
return null;
}
class EpisodecontentProvider implements ITreeContentProvider {
public Object[] getChildren(final Object parentElement){
if (parentElement instanceof Episode) {
Episode ep = (Episode) parentElement;
ArrayList<String> ret = new ArrayList<String>();
ret.add("Seit: " + ep.get("StartDate"));
ret.add("Status: " + ep.getStatusText());
List<IDiagnose> diags = ep.getDiagnoses();
for (IDiagnose dg : diags) {
ret.add(dg.getCodeSystemName() + ": " + dg.getLabel());
}
return ret.toArray();
}
return null;
}
public Object getParent(final Object element){
// TODO Auto-generated method stub
return null;
}
public boolean hasChildren(final Object element){
if (element instanceof Episode) {
return true;
}
return false;
}
public Object[] getElements(final Object inputElement){
if (actPatient != null) {
Query<Episode> qbe = new Query<Episode>(Episode.class);
qbe.add("PatientID", "=", actPatient.getId());
List<Episode> list = qbe.execute();
Collections.sort(list);
return list.toArray();
}
return new Object[0];
}
public void dispose(){
// TODO Auto-generated method stub
}
public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput){
// TODO Auto-generated method stub
}
}
class EpisodesLabelProvider extends LabelProvider implements IColorProvider {
@Override
public String getText(final Object element){
if (element instanceof Episode) {
return ((Episode) element).getLabel();
} else if (element instanceof String) {
return element.toString();
}
return super.getText(element);
}
public Color getBackground(final Object element){
// TODO Auto-generated method stub
return null;
}
public Color getForeground(final Object element){
if (element instanceof Episode) {
Episode e = (Episode) element;
if (e.getStatus() == Episode.INACTIVE) {
return UiDesk.getColor(UiDesk.COL_LIGHTGREY);
}
}
return UiDesk.getColor(UiDesk.COL_BLACK);
}
}
class Receiver implements PersistentObjectDropTarget.IReceiver {
public boolean accept(final PersistentObject o){
if (o instanceof IDiagnose) {
return true;
}
return false;
}
public void dropped(final PersistentObject o, final DropTargetEvent e){
Tree tree = tvEpisodes.getTree();
Point point = tree.toControl(e.x, e.y);
TreeItem item = tree.getItem(point);
if (item != null) {
Episode hit = getEpisodeFromItem(item);
if (hit != null) {
if (o instanceof IDiagnose) {
IDiagnose id = (IDiagnose) o;
hit.addDiagnosis(id);
}
tvEpisodes.refresh();
}
}
}
}
}