Java tutorial
/******************************************************************************* * 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 * H. Marlovits added noPatientHandled test to avoid flickering on startupwhen * no patient selected in some cases * *******************************************************************************/ package ch.elexis.views; import static ch.elexis.actions.GlobalActions.delFallAction; import static ch.elexis.actions.GlobalActions.delKonsAction; import static ch.elexis.actions.GlobalActions.makeBillAction; import static ch.elexis.actions.GlobalActions.moveBehandlungAction; import static ch.elexis.actions.GlobalActions.openFallaction; import static ch.elexis.actions.GlobalActions.redateAction; import static ch.elexis.actions.GlobalActions.reopenFallAction; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.ISaveablePart2; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.part.ViewPart; import ch.elexis.Desk; import ch.elexis.Hub; import ch.elexis.actions.ElexisEvent; import ch.elexis.actions.ElexisEventDispatcher; import ch.elexis.actions.ElexisEventListenerImpl; import ch.elexis.actions.GlobalActions; import ch.elexis.actions.GlobalEventDispatcher; import ch.elexis.actions.GlobalEventDispatcher.IActivationListener; import ch.elexis.core.icons.Images; import ch.elexis.data.Fall; import ch.elexis.data.Konsultation; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.util.SWTHelper; import ch.elexis.util.viewers.CommonContentProviderAdapter; import ch.elexis.util.viewers.CommonViewer; import ch.elexis.util.viewers.CommonViewer.DoubleClickListener; import ch.elexis.util.viewers.DefaultContentProvider; import ch.elexis.util.viewers.DefaultControlFieldProvider; import ch.elexis.util.viewers.DefaultLabelProvider; import ch.elexis.util.viewers.SimpleWidgetProvider; import ch.elexis.util.viewers.ViewerConfigurer; import ch.elexis.util.viewers.ViewerConfigurer.ButtonProvider; import ch.rgw.tools.ExHandler; import ch.rgw.tools.IFilter; /** * Eine View, die untereinander Flle und zugehrigende Behandlungen des aktuell ausgewhlten * Patienten anzeigt. * * @author gerry * */ public class FallListeView extends ViewPart implements IActivationListener, ISaveablePart2 { private static boolean noPatientHandled = true; public static final String ID = "ch.elexis.FallListeView"; //$NON-NLS-1$ CommonViewer fallViewer; CommonViewer behandlViewer; private ViewerConfigurer fallCf, behandlCf; private FormToolkit tk; private Form form; private Patient actPatient; private Fall actFall; private Konsultation actBehandlung; // private Filter behandlungsFilter; private Image iClosed; private ElexisEventListenerImpl eeli_pat = new ElexisEventListenerImpl(Patient.class) { public void runInUi(final ElexisEvent ev) { actPatient = (Patient) ev.getObject(); form.setText(actPatient.getPersonalia()); fallViewer.getViewerWidget().refresh(false); } }; private ElexisEventListenerImpl eeli_fall = new ElexisEventListenerImpl(Fall.class, ElexisEvent.EVENT_CREATE | ElexisEvent.EVENT_DELETE | ElexisEvent.EVENT_RELOAD | ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_UPDATE) { public void runInUi(final ElexisEvent ev) { Fall f = (Fall) ev.getObject(); setFall(f, null); } }; public FallListeView() { super(); } @Override public void createPartControl(Composite parent) { iClosed = Images.IMG_LOCK_CLOSED.getImage(); tk = Desk.getToolkit(); form = tk.createForm(parent); form.getBody().setLayout(new GridLayout()); SashForm sash = new SashForm(form.getBody(), SWT.VERTICAL); form.setText(Messages.getString("FallListeView.NoPatientSelected")); //$NON-NLS-1$ sash.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); ButtonProvider fallButton = new ButtonProvider() { public Button createButton(Composite parent1) { Button ret = tk.createButton(parent1, Messages.getString("FallListeView.NewCase"), SWT.PUSH); //$NON-NLS-1$ ret.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { String bez = fallCf.getControlFieldProvider().getValues()[0]; Fall fall = actPatient.neuerFall(bez, Messages.getString("FallListeView.Illness"), "KVG"); //$NON-NLS-1$ //$NON-NLS-2$ Konsultation b = fall.neueKonsultation(); b.setMandant(Hub.actMandant); fallCf.getControlFieldProvider().clearValues(); fallViewer.getViewerWidget().refresh(); fallViewer.setSelection(fall, true); } }); return ret; } public boolean isAlwaysEnabled() { return false; } }; fallViewer = new CommonViewer(); fallCf = new ViewerConfigurer(new DefaultContentProvider(fallViewer, Fall.class) { @Override public Object[] getElements(Object inputElement) { if (actPatient != null) { if (fallCf.getControlFieldProvider().isEmpty()) { return actPatient.getFaelle(); } else { IFilter filter = fallCf.getControlFieldProvider().createFilter(); List<String> list = actPatient.getList(Messages.getString("FallListeView.Cases"), true); //$NON-NLS-1$ ArrayList<Fall> arr = new ArrayList<Fall>(); for (String s : list) { Fall f = Fall.load(s); if (filter.select(f)) { arr.add(f); } } return arr.toArray(); } } return new Object[0]; } }, new LabelProvider() { @Override public Image getImage(Object element) { if (element instanceof Fall) { if (((Fall) element).isOpen()) { // show red/green dot is case invalid/valid if (((Fall) element).isValid()) { return Images.IMG_OK.getImage(); } else { return Images.IMG_FEHLER.getImage(); } } else { return iClosed; } } return super.getImage(element); } @Override public String getText(Object element) { return (((Fall) element).getLabel()); } }, new DefaultControlFieldProvider(fallViewer, new String[] { Messages.getString("FallListeView.Label") //$NON-NLS-1$ }), fallButton, new SimpleWidgetProvider(SimpleWidgetProvider.TYPE_TABLE, SWT.SINGLE, fallViewer)); fallViewer.create(fallCf, sash, SWT.NONE, getViewSite()); fallViewer.getViewerWidget() .addSelectionChangedListener(GlobalEventDispatcher.getInstance().getDefaultListener()); behandlViewer = new CommonViewer(); ButtonProvider behandlButton = new ButtonProvider() { public Button createButton(Composite parent1) { Button ret = tk.createButton(parent1, Messages.getString("FallListeView.NewKons"), SWT.PUSH); //$NON-NLS-1$ ret.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Konsultation b = actFall.neueKonsultation(); if (b != null) { b.setMandant(Hub.actMandant); behandlCf.getControlFieldProvider().clearValues(); behandlViewer.getViewerWidget().refresh(); // behandlViewer.setSelection(b); setFall(actFall, b); } } }); return ret; } public boolean isAlwaysEnabled() { return true; } }; behandlCf = new ViewerConfigurer(new CommonContentProviderAdapter() { @Override public Object[] getElements(Object inputElement) { if (actFall != null) { Konsultation[] alle = actFall.getBehandlungen(true); /* * if(behandlungsFilter!=null){ ArrayList<Konsultation> al=new * ArrayList<Konsultation>(alle.length); for(int i=0;i<alle.length;i++){ * if(behandlungsFilter.select(alle[i])==true){ al.add(alle[i]); } } return * al.toArray(); } */ return actFall.getBehandlungen(true); } return new Object[0]; } }, new DefaultLabelProvider(), new DefaultControlFieldProvider(behandlViewer, new String[] { Messages.getString("FallListeView.Date") //$NON-NLS-1$ }), behandlButton, new SimpleWidgetProvider(SimpleWidgetProvider.TYPE_LIST, SWT.SINGLE | SWT.V_SCROLL, behandlViewer)); Composite cf = new Composite(sash, SWT.BORDER); cf.setLayout(new GridLayout()); behandlViewer.create(behandlCf, cf, SWT.NONE, getViewSite()); behandlViewer.getViewerWidget() .addSelectionChangedListener(GlobalEventDispatcher.getInstance().getDefaultListener()); tk.adapt(sash, false, false); GlobalEventDispatcher.addActivationListener(this, this); sash.setWeights(new int[] { 50, 50 }); // behandlungsFilter=null; createMenuAndToolbar(); createContextMenu(); ((DefaultContentProvider) fallCf.getContentProvider()).startListening(); fallViewer.addDoubleClickListener(new DoubleClickListener() { @Override public void doubleClicked(PersistentObject obj, CommonViewer cv) { try { FallDetailView pdv = (FallDetailView) getSite().getPage().showView(FallDetailView.ID); } catch (PartInitException e) { ExHandler.handle(e); } } }); behandlViewer.addDoubleClickListener(new DoubleClickListener() { @Override public void doubleClicked(PersistentObject obj, CommonViewer cv) { try { PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() .showView(KonsDetailView.ID); } catch (PartInitException e) { ExHandler.handle(e); } } }); } private void createContextMenu() { MenuManager fallMenuMgr = new MenuManager(); fallMenuMgr.setRemoveAllWhenShown(true); fallMenuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { manager.add(openFallaction); manager.add(reopenFallAction); manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); manager.add(delFallAction); manager.add(new Separator()); manager.add(makeBillAction); } }); Menu fallMenu = fallMenuMgr.createContextMenu(fallViewer.getViewerWidget().getControl()); fallViewer.getViewerWidget().getControl().setMenu(fallMenu); getSite().registerContextMenu("ch.elexis.FallListeMenu", fallMenuMgr, //$NON-NLS-1$ fallViewer.getViewerWidget()); MenuManager behdlMenuMgr = new MenuManager(); behdlMenuMgr.setRemoveAllWhenShown(true); behdlMenuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); manager.add(delKonsAction); manager.add(moveBehandlungAction); manager.add(redateAction); } }); Menu behdlMenu = behdlMenuMgr.createContextMenu(behandlViewer.getViewerWidget().getControl()); behandlViewer.getViewerWidget().getControl().setMenu(behdlMenu); getSite().registerContextMenu("ch.elexis.BehandlungsListeMenu", behdlMenuMgr, //$NON-NLS-1$ behandlViewer.getViewerWidget()); } private void createMenuAndToolbar() { IMenuManager mgr = getViewSite().getActionBars().getMenuManager(); mgr.add(delFallAction); mgr.add(delKonsAction); mgr.add(new Separator()); // mgr.add(filterAction); IToolBarManager tmg = getViewSite().getActionBars().getToolBarManager(); tmg.add(GlobalActions.helpAction); // tmg.add(filterAction); } @Override public void setFocus() { // TODO Auto-generated method stub } public void setFall(Fall f, Konsultation b) { actFall = f; if (f != null) { actPatient = f.getPatient(); // System.out.println(actPatient.getLabel()); form.setText(actPatient.getLabel()); fallViewer.notify(CommonViewer.Message.update); fallViewer.setSelection(f, false); if (b == null) { b = f.getLetzteBehandlung(); } if (b != null) { behandlViewer.setSelection(b, false); } // Hub.actBehandlung=b; actBehandlung = b; reopenFallAction.setEnabled(!f.isOpen()); behandlViewer.getViewerWidget().refresh(true); noPatientHandled = false; } else { if (!noPatientHandled) { ElexisEventDispatcher.clearSelection(Konsultation.class); ElexisEventDispatcher.clearSelection(Fall.class); if (actPatient == null) { form.setText(Messages.getString("FallListeView.NoPatientSelected")); //$NON-NLS-1$ } else { form.setText(actPatient.getLabel()); } fallViewer.notify(CommonViewer.Message.update); reopenFallAction.setEnabled(false); behandlViewer.getViewerWidget().refresh(true); noPatientHandled = true; } } } public void selectionEvent(PersistentObject obj) { if (obj instanceof Patient) { } else if (obj instanceof Fall) { } } @Override public void dispose() { ((DefaultContentProvider) fallCf.getContentProvider()).stopListening(); GlobalEventDispatcher.removeActivationListener(this, this); super.dispose(); } public void activation(boolean mode) { // TODO Auto-generated method stub } public void visible(boolean mode) { if (mode == true) { ElexisEventDispatcher.getInstance().addListeners(eeli_fall, eeli_pat); actPatient = (Patient) ElexisEventDispatcher.getSelected(Patient.class); actFall = (Fall) ElexisEventDispatcher.getSelected(Fall.class); // System.out.println(actPatient.getLabel()); if (actPatient != null) { if (actFall == null) { actBehandlung = actPatient.getLetzteKons(false); if (actBehandlung == null) { actFall = null; } else { actFall = actBehandlung.getFall(); } } else { // System.out.println(actFall.getPatient().getLabel()); if (actFall.getPatient().getId().equals(actPatient.getId())) { if (actBehandlung != null) { if ((actBehandlung.getFall() == null) || (!actBehandlung.getFall().getId().equals(actFall.getId()))) { actBehandlung = actPatient.getLetzteKons(false); } } } else { actBehandlung = actPatient.getLetzteKons(false); if (actBehandlung == null) { actFall = null; } else { actFall = actBehandlung.getFall(); } } } } else { actFall = null; actBehandlung = null; } setFall(actFall, actBehandlung); } else { ElexisEventDispatcher.getInstance().removeListeners(eeli_fall, eeli_pat); } } /*********************************************************************************************** * Die folgenden 6 Methoden implementieren das Interface ISaveablePart2 Wir bentigen das * Interface nur, um das Schliessen einer View zu verhindern, wenn die Perspektive fixiert ist. * Gibt es da keine einfachere Methode? */ public int promptToSaveOnClose() { return GlobalActions.fixLayoutAction.isChecked() ? ISaveablePart2.CANCEL : ISaveablePart2.NO; } public void doSave(IProgressMonitor monitor) { /* leer */ } public void doSaveAs() { /* leer */ } public boolean isDirty() { return true; } public boolean isSaveAsAllowed() { return false; } public boolean isSaveOnCloseNeeded() { return true; } }