package com.hilotec.elexis.kgview; import java.util.ArrayList; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import ch.elexis.core.ui.util.PersistentObjectDropTarget; import ch.elexis.data.Konsultation; import ch.elexis.data.PersistentObject; import ch.elexis.icpc.IcpcCode; import ch.rgw.tools.StringTool; import com.hilotec.elexis.kgview.data.KonsData; public abstract class KonsDataFView extends SimpleTextFView { protected final String dbfield; protected final String icpcfield; private KonsData data; private MyKonsListener listener; private List icpc_list; private ArrayList<IcpcCode> code_list; protected KonsDataFView(String field){ dbfield = field; icpcfield = null; } protected KonsDataFView(String field, String icpc){ dbfield = field; icpcfield = icpc; } /** Leert das ICPC-Feld im UI */ protected void clearIcpc(){ if (icpcfield == null) return; icpc_list.removeAll(); code_list.clear(); } /** Inhalt des ICPC-Felds in Datenbank ablegen */ protected void storeIcpc(){ if (icpcfield == null) return; StringBuffer sb = new StringBuffer(); for (IcpcCode c : code_list) { sb.append(c.getCode()); sb.append(","); } if (sb.length() > 0) sb.setLength(sb.length() - 1); data.set(icpcfield, sb.toString()); setEmpty(); } /** ICPC-Feld aus Datenbank laden */ protected void loadIcpc(){ if (icpcfield == null) return; clearIcpc(); String entries[] = StringTool.unNull(data.get(icpcfield)).split(","); for (String c : entries) { if (c.length() == 0) continue; IcpcCode code = IcpcCode.load(c); code_list.add(code); icpc_list.add(code.getLabel()); } } /** Aktuell ausgewaehlten ICPC Code loeschen (im UI und in DB). */ private void removeIcpcCode(){ if (icpcfield == null) return; int i = icpc_list.getSelectionIndex(); if (i >= 0) { code_list.remove(i); icpc_list.remove(i); storeIcpc(); } setEmpty(); } @Override protected void initialize(){ if (icpcfield != null) { GridData gd = new GridData(); gd.horizontalAlignment = gd.verticalAlignment = GridData.FILL; gd.grabExcessHorizontalSpace = true; gd.heightHint = 40; code_list = new ArrayList<IcpcCode>(); icpc_list = new List(area, SWT.V_SCROLL); icpc_list.setLayoutData(gd); icpc_list.addKeyListener(new KeyListener() { public void keyReleased(KeyEvent e){} public void keyPressed(KeyEvent e){ if (e.keyCode != SWT.DEL) return; removeIcpcCode(); } }); Menu m = new Menu(icpc_list); MenuItem mi = new MenuItem(m, 0); mi.setText("Entfernen"); mi.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e){ removeIcpcCode(); } public void widgetDefaultSelected(SelectionEvent e){} }); icpc_list.setMenu(m); new PersistentObjectDropTarget(icpc_list, new PersistentObjectDropTarget.IReceiver() { public void dropped(PersistentObject o, DropTargetEvent e){ IcpcCode code = (IcpcCode) o; icpc_list.add(code.getLabel()); code_list.add(code); storeIcpc(); } public boolean accept(PersistentObject o){ if (!(o instanceof IcpcCode) || code_list.contains(o)) return false; return isEnabled(); } }); } data = null; listener = new MyKonsListener(); } @Override protected void fieldChanged(){ super.fieldChanged(); if (!isEnabled()) { return; } data.set(dbfield, getText()); } @Override protected boolean isEmpty(){ return super.isEmpty() && (code_list == null || code_list.isEmpty()); } @Override protected void setEnabled(boolean en){ super.setEnabled(en); clearIcpc(); if (icpcfield != null) icpc_list.setEnabled(en && getCanEdit()); } /** Konsultation wurde deselektiert */ private void konsDeselected(Konsultation kons){ setEnabled(false); data = null; } /** Konsultation wurde selektiert */ private void konsSelected(Konsultation kons){ data = new KonsData(kons); setCanEdit(data.isEditOK()); setEnabled(true); loadIcpc(); String text = StringTool.unNull(data.get(dbfield)); setText(text); } @Override public void dispose(){ listener.destroy(); super.dispose(); } /** * Helper Klasse um auf dem Laufenden zu bleiben bezüglich der aktiven Konsultation. */ class MyKonsListener extends POSelectionListener<Konsultation> { public MyKonsListener(){ init(); } @Override protected void deselected(Konsultation kons){ konsDeselected(kons); } @Override protected void selected(Konsultation kons){ konsSelected(kons); } } }