/******************************************************************************* * Copyright (c) 2006-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.core.ui.views; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DropTargetEvent; 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.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.statushandlers.StatusManager; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEvent; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.events.ElexisEventListener; import ch.elexis.core.data.interfaces.IDiagnose; import ch.elexis.core.data.interfaces.IVerrechenbar; import ch.elexis.core.data.status.ElexisStatus; import ch.elexis.core.ui.Hub; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.actions.CodeSelectorHandler; import ch.elexis.core.ui.dialogs.FreeTextDiagnoseDialog; import ch.elexis.core.ui.events.ElexisUiEventListenerImpl; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.locks.IUnlockable; import ch.elexis.core.ui.util.PersistentObjectDragSource; import ch.elexis.core.ui.util.PersistentObjectDragSource.ISelectionRenderer; import ch.elexis.core.ui.util.PersistentObjectDropTarget; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.views.codesystems.DiagnosenView; import ch.elexis.data.FreeTextDiagnose; import ch.elexis.data.Konsultation; import ch.elexis.data.PersistentObject; public class DiagnosenDisplay extends Composite implements ISelectionRenderer, IUnlockable { Table tDg; private final Button addFreeTextBtn; private final Hyperlink hDg; private final PersistentObjectDropTarget dropTarget; private final ElexisEventListener eeli_update = new ElexisUiEventListenerImpl( Konsultation.class, ElexisEvent.EVENT_UPDATE) { @Override public void runInUi(ElexisEvent ev){ Konsultation actKons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); if (actKons != null) { setDiagnosen(actKons); } } }; public void setEnabled(boolean enabled) { addFreeTextBtn.setEnabled(enabled); hDg.setEnabled(enabled); super.setEnabled(enabled); }; public DiagnosenDisplay(final IWorkbenchPage page, final Composite parent, final int style){ super(parent, style); setLayout(new GridLayout(2, false)); hDg = UiDesk.getToolkit() .createHyperlink(this, Messages.DiagnosenDisplay_Diagnoses, SWT.NONE); //$NON-NLS-1$ hDg.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); hDg.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(final HyperlinkEvent e){ try { page.showView(DiagnosenView.ID); CodeSelectorHandler.getInstance().setCodeSelectorTarget(dropTarget); } catch (Exception ex) { ElexisStatus status = new ElexisStatus(ElexisStatus.ERROR, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE, Messages.DiagnosenDisplay_ErrorStartingCodeSystem + ex.getMessage(), ex, ElexisStatus.LOG_ERRORS); StatusManager.getManager().handle(status, StatusManager.SHOW); } } }); addFreeTextBtn = new Button(this, SWT.PUSH); addFreeTextBtn.setImage(Images.IMG_DOCUMENT_TEXT.getImage()); addFreeTextBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ FreeTextDiagnoseDialog ftDialog = new FreeTextDiagnoseDialog(Display.getDefault().getActiveShell()); if (ftDialog.open() == Window.OK) { FreeTextDiagnose diag = new FreeTextDiagnose(ftDialog.getText(), true); Konsultation actKons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); actKons.addDiagnose(diag); setDiagnosen(actKons); } } }); tDg = UiDesk.getToolkit().createTable(this, SWT.SINGLE | SWT.WRAP); tDg.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); tDg.setMenu(createDgMenu()); // new PersistentObjectDragSource() dropTarget = new PersistentObjectDropTarget(Messages.DiagnosenDisplay_DiagnoseTarget, tDg, new DropReceiver()); //$NON-NLS-1$ new PersistentObjectDragSource(tDg, this); ElexisEventDispatcher.getInstance().addListeners(eeli_update); } public void clear(){ tDg.removeAll(); } private final class DropReceiver implements PersistentObjectDropTarget.IReceiver { @Override public void dropped(final PersistentObject o, final DropTargetEvent ev){ Konsultation actKons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); if (actKons == null) { SWTHelper.alert("Keine Konsultation ausgewählt", "Bitte wählen Sie zuerst eine Konsultation aus"); } else { if (o instanceof IDiagnose) { actKons.addDiagnose((IDiagnose) o); setDiagnosen(actKons); } } } @Override public boolean accept(final PersistentObject o){ if (o instanceof IVerrechenbar) { return true; } if (o instanceof IDiagnose) { return true; } return false; } } public void setDiagnosen(final Konsultation b){ List<IDiagnose> dgl = b.getDiagnosen(); tDg.removeAll(); for (IDiagnose dg : dgl) { TableItem ti = new TableItem(tDg, SWT.WRAP); ti.setText(dg.getLabel()); ti.setData(dg); } // tDg.setEnabled(b.getStatus()==RnStatus.NICHT_VON_HEUTE); } private Menu createDgMenu(){ Menu ret = new Menu(tDg); MenuItem delDg = new MenuItem(ret, SWT.NONE); delDg.setText(Messages.DiagnosenDisplay_RemoveDiagnoses); //$NON-NLS-1$ delDg.addSelectionListener(new delDgListener()); return ret; } class delDgListener extends SelectionAdapter { @Override public void widgetSelected(final SelectionEvent e){ int sel = tDg.getSelectionIndex(); if (sel != -1) { TableItem ti = tDg.getItem(sel); ((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)) .removeDiagnose((IDiagnose) ti.getData()); tDg.remove(sel); } // setBehandlung(actBehandlung); } } @Override public List<PersistentObject> getSelection(){ TableItem[] sel = tDg.getSelection(); ArrayList<PersistentObject> ret = new ArrayList<PersistentObject>(); if ((sel != null) && (sel.length > 0)) { for (TableItem ti : sel) { IDiagnose id = (IDiagnose) ti.getData(); String clazz = id.getClass().getName(); ret.add(CoreHub.poFactory.createFromString(clazz + "::" + id.getCode())); //$NON-NLS-1$ } } return ret; } @Override public void setUnlocked(boolean unlocked) { setEnabled(unlocked); redraw(); } }