/*******************************************************************************
* Copyright (c) 2009-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
*
* Sponsoring:
* mediX Notfallpaxis, diepraxen Stauffacher AG, Zürich
*
* Contributors:
* G. Weirich - initial implementation
*
*******************************************************************************/
package ch.elexis.agenda.ui;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.part.ViewPart;
import ch.elexis.agenda.acl.ACLContributor;
import ch.elexis.agenda.data.Termin;
import ch.elexis.agenda.ui.provider.TerminListSorter;
import ch.elexis.agenda.ui.provider.TerminListWidgetProvider;
import ch.elexis.agenda.ui.provider.TermineLabelProvider;
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.ui.UiDesk;
import ch.elexis.core.ui.actions.GlobalEventDispatcher;
import ch.elexis.core.ui.actions.IActivationListener;
import ch.elexis.core.ui.events.ElexisUiEventListenerImpl;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.locks.AcquireLockBlockingUi;
import ch.elexis.core.ui.locks.ILockHandler;
import ch.elexis.core.ui.locks.LockRequestingRestrictedAction;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.core.ui.util.viewers.CommonViewer.DoubleClickListener;
import ch.elexis.core.ui.util.viewers.DefaultContentProvider;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.dialogs.TerminDialog;
public class TerminListeView extends ViewPart implements IActivationListener {
public static final String ID = "ch.elexis.agenda.Terminliste";
ScrolledForm form;
CommonViewer cv = new CommonViewer();
LockRequestingRestrictedAction<Termin> terminAendernAction;
private ElexisEventListener eeli_pat = new ElexisUiEventListenerImpl(Patient.class,
ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_DESELECTED) {
public void runInUi(ElexisEvent ev){
if (ev.getType() == ElexisEvent.EVENT_SELECTED) {
updateSelection((Patient) ev.getObject());
} else if (ev.getType() == ElexisEvent.EVENT_DESELECTED) {
form.setText(Messages.TerminListView_noPatientSelected);
}
}
};
private ElexisEventListener eeli_term =
new ElexisUiEventListenerImpl(Termin.class, ElexisEvent.EVENT_UPDATE) {
public void runInUi(ElexisEvent ev){
if (cv != null) {
cv.notify(CommonViewer.Message.update);
}
};
};
public TerminListeView(){
terminAendernAction = new LockRequestingRestrictedAction<Termin>(
ACLContributor.CHANGE_APPOINTMENTS, ch.elexis.agenda.Messages.TagesView_changeTermin) {
{
setImageDescriptor(Images.IMG_EDIT.getImageDescriptor());
setToolTipText(ch.elexis.agenda.Messages.TagesView_changeThisTermin);
}
@Override
public Termin getTargetedObject(){
return (Termin) ElexisEventDispatcher.getSelected(Termin.class);
}
@Override
public void doRun(Termin element){
AcquireLockBlockingUi.aquireAndRun(element, new ILockHandler() {
@Override
public void lockFailed(){
// do nothing
}
@Override
public void lockAcquired(){
TerminDialog dlg = new TerminDialog(element);
dlg.open();
}
});
if (cv != null) {
cv.notify(CommonViewer.Message.update);
}
}
};
}
@Override
public void createPartControl(Composite parent){
form = UiDesk.getToolkit().createScrolledForm(parent);
form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
Composite body = form.getBody();
body.setLayout(new GridLayout());
ViewerConfigurer vc = new ViewerConfigurer(new DefaultContentProvider(cv, Termin.class) {
@Override
public Object[] getElements(Object inputElement){
Patient p = ElexisEventDispatcher.getSelectedPatient();
Query<Termin> qbe = new Query<Termin>(Termin.class);
if (p == null) {
qbe.add(Termin.FLD_PATIENT, Query.EQUALS, "--");
} else {
qbe.add(Termin.FLD_PATIENT, Query.EQUALS, p.getId());
qbe.orderBy(false, Termin.FLD_TAG);
}
return qbe.execute().toArray();
}
}, new TermineLabelProvider(), new TerminListWidgetProvider());
cv.create(vc, body, SWT.NONE, this);
cv.getConfigurer().getContentProvider().startListening();
cv.addDoubleClickListener(new DoubleClickListener() {
@Override
public void doubleClicked(PersistentObject obj, CommonViewer cv){
terminAendernAction.run();
}
});
GlobalEventDispatcher.addActivationListener(this, this);
}
@Override
public void setFocus(){}
public void activation(boolean mode){
if (mode) {
updateSelection(ElexisEventDispatcher.getSelectedPatient());
}
}
@Override
public void dispose(){
GlobalEventDispatcher.removeActivationListener(this, this);
super.dispose();
}
public void visible(boolean mode){
if (mode) {
ElexisEventDispatcher.getInstance().addListeners(eeli_pat, eeli_term);
} else {
ElexisEventDispatcher.getInstance().removeListeners(eeli_pat, eeli_term);
}
}
private void updateSelection(Patient patient){
if (patient == null) {
form.setText(Messages.TerminListView_noPatientSelected);
} else {
form.setText(patient.getLabel());
cv.notify(CommonViewer.Message.update);
}
}
/**
* Sorts the appointments in the TerminListView. Use SWT.UP for ascending and SWT.DOWN for
* descending.
*
* @param sortDirection
*/
public void sort(int sortDirection){
TerminListSorter sorter = new TerminListSorter();
sorter.setDirection(sortDirection);
cv.getViewerWidget().setSorter(sorter);
}
}