/*******************************************************************************
* Copyright (c) 2005-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.contacts.views;
import java.util.HashMap;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.status.ElexisStatus;
import ch.elexis.core.ui.actions.FlatDataLoader;
import ch.elexis.core.ui.actions.GlobalActions;
import ch.elexis.core.ui.actions.PersistentObjectLoader;
import ch.elexis.core.ui.dialogs.GenericPrintDialog;
import ch.elexis.core.ui.dialogs.KontaktErfassenDialog;
import ch.elexis.core.ui.icons.Activator;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.locks.LockedRestrictedAction;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.core.ui.util.viewers.DefaultControlFieldProvider;
import ch.elexis.core.ui.util.viewers.DefaultLabelProvider;
import ch.elexis.core.ui.util.viewers.SimpleWidgetProvider;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldListener;
import ch.elexis.core.ui.views.Messages;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Organisation;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Person;
import ch.elexis.data.Query;
import ch.rgw.tools.StringTool;
public class KontakteView extends ViewPart implements ControlFieldListener, ISaveablePart2 {
public static final String ID = "ch.elexis.Kontakte"; //$NON-NLS-1$
private CommonViewer cv;
private ViewerConfigurer vc;
IAction dupKontakt, delKontakt, createKontakt, printList;
PersistentObjectLoader loader;
private final String[] fields = { Kontakt.FLD_SHORT_LABEL + Query.EQUALS + Messages.KontakteView_shortLabel, // $NON-NLS-1$
Kontakt.FLD_NAME1 + Query.EQUALS + Messages.KontakteView_text1, // $NON-NLS-1$
Kontakt.FLD_NAME2 + Query.EQUALS + Messages.KontakteView_text2, // $NON-NLS-1$
Kontakt.FLD_STREET + Query.EQUALS + Messages.KontakteView_street, // $NON-NLS-1$
Kontakt.FLD_ZIP + Query.EQUALS + Messages.KontakteView_zip, // $NON-NLS-1$
Kontakt.FLD_PLACE + Query.EQUALS + Messages.KontakteView_place }; // $NON-NLS-1$
private ViewMenus menu;
public KontakteView() {
}
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
cv = new CommonViewer();
loader = new FlatDataLoader(cv, new Query<Kontakt>(Kontakt.class));
loader.setOrderFields(
new String[] { Kontakt.FLD_NAME1, Kontakt.FLD_NAME2, Kontakt.FLD_STREET, Kontakt.FLD_PLACE });
vc = new ViewerConfigurer(loader, new KontaktLabelProvider(), new DefaultControlFieldProvider(cv, fields),
new ViewerConfigurer.DefaultButtonProvider(),
new SimpleWidgetProvider(SimpleWidgetProvider.TYPE_LAZYLIST, SWT.MULTI, null));
cv.create(vc, parent, SWT.NONE, getViewSite());
makeActions();
cv.setObjectCreateAction(getViewSite(), createKontakt);
menu = new ViewMenus(getViewSite());
menu.createViewerContextMenu(cv.getViewerWidget(), delKontakt, dupKontakt);
menu.createMenu(printList);
menu.createToolbar(printList);
vc.getContentProvider().startListening();
vc.getControlFieldProvider().addChangeListener(this);
cv.addDoubleClickListener(new CommonViewer.DoubleClickListener() {
public void doubleClicked(PersistentObject obj, CommonViewer cv) {
try {
KontaktDetailView kdv = (KontaktDetailView) getSite().getPage().showView(KontaktDetailView.ID);
ElexisEventDispatcher.fireSelectionEvent(obj);
// kdv.kb.catchElexisEvent(new ElexisEvent(obj, obj.getClass(), ElexisEvent.EVENT_SELECTED));
} catch (PartInitException e) {
ElexisStatus es = new ElexisStatus(ElexisStatus.ERROR, Activator.PLUGIN_ID, ElexisStatus.CODE_NONE,
"Fehler beim Öffnen", e);
ElexisEventDispatcher.fireElexisStatusEvent(es);
}
}
});
}
public void dispose() {
vc.getContentProvider().stopListening();
vc.getControlFieldProvider().removeChangeListener(this);
super.dispose();
}
@Override
public void setFocus() {
vc.getControlFieldProvider().setFocus();
}
public void changed(HashMap<String, String> values) {
ElexisEventDispatcher.clearSelection(Kontakt.class);
}
public void reorder(String field) {
loader.reorder(field);
}
/**
* ENTER has been pressed in the control fields, select the first listed
* patient
*/
// this is also implemented in PatientenListeView
public void selected() {
StructuredViewer viewer = cv.getViewerWidget();
Object[] elements = cv.getConfigurer().getContentProvider().getElements(viewer.getInput());
if (elements != null && elements.length > 0) {
Object element = elements[0];
/*
* just selecting the element in the viewer doesn't work if the
* control fields are not empty (i. e. the size of items changes):
* cv.setSelection(element, true); bug in TableViewer with style
* VIRTUAL? work-arount: just globally select the element without
* visual representation in the viewer
*/
if (element instanceof PersistentObject) {
// globally select this object
ElexisEventDispatcher.fireSelectionEvent((PersistentObject) element);
}
}
}
/*
* Die folgenden 6 Methoden implementieren das Interface ISaveablePart2 Wir
* benötigen 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;
}
private void makeActions() {
delKontakt = new LockedRestrictedAction<Kontakt>(AccessControlDefaults.KONTAKT_DELETE,
Messages.KontakteView_delete) {
@Override
public void doRun(Kontakt k) {
if (SWTHelper.askYesNo("Wirklich löschen?", k.getLabel())) {
k.delete();
cv.getConfigurer().getControlFieldProvider().fireChangedEvent();
}
}
@Override
public Kontakt getTargetedObject() {
return (Kontakt) cv.getViewerWidgetFirstSelection();
}
};
dupKontakt = new Action(Messages.KontakteView_duplicate) { // $NON-NLS-1$
@Override
public void run() {
Object[] o = cv.getSelection();
if (o != null) {
Kontakt k = (Kontakt) o[0];
Kontakt dup;
if (k.istPerson()) {
Person p = Person.load(k.getId());
dup = new Person(p.getName(), p.getVorname(), p.getGeburtsdatum(), p.getGeschlecht());
} else {
Organisation org = Organisation.load(k.getId());
dup = new Organisation(org.get(Organisation.FLD_NAME1), org.get(Organisation.FLD_NAME2));
}
dup.setAnschrift(k.getAnschrift());
cv.getConfigurer().getControlFieldProvider().fireChangedEvent();
// cv.getViewerWidget().refresh();
}
}
};
createKontakt = new Action(Messages.KontakteView_create) { // $NON-NLS-1$
@Override
public void run() {
String[] flds = cv.getConfigurer().getControlFieldProvider().getValues();
String[] predef = new String[] { flds[1], flds[2], StringConstants.EMPTY, flds[3], flds[4], flds[5] };
KontaktErfassenDialog ked = new KontaktErfassenDialog(getViewSite().getShell(), predef);
ked.open();
}
};
printList = new Action("Markierte Adressen drucken") {
{
setImageDescriptor(Images.IMG_PRINTER.getImageDescriptor());
setToolTipText("Die in der Liste markierten Kontakte als Tabelle ausdrucken");
}
public void run() {
Object[] sel = cv.getSelection();
String[][] adrs = new String[sel.length][];
if (sel != null && sel.length > 0) {
GenericPrintDialog gpl = new GenericPrintDialog(getViewSite().getShell(), "Adressliste",
"Adressliste");
gpl.create();
for (int i = 0; i < sel.length; i++) {
Kontakt k = (Kontakt) sel[i];
String[] f = new String[] { Kontakt.FLD_NAME1, Kontakt.FLD_NAME2, Kontakt.FLD_NAME3,
Kontakt.FLD_STREET, Kontakt.FLD_ZIP, Kontakt.FLD_PLACE, Kontakt.FLD_PHONE1 };
String[] v = new String[f.length];
k.get(f, v);
adrs[i] = new String[4];
adrs[i][0] = new StringBuilder(v[0]).append(StringConstants.SPACE).append(v[1])
.append(StringConstants.SPACE).append(v[2]).toString();
adrs[i][1] = v[3];
adrs[i][2] = new StringBuilder(v[4]).append(StringConstants.SPACE).append(v[5]).toString();
adrs[i][3] = v[6];
}
gpl.insertTable("[Liste]", adrs, null);
gpl.open();
}
}
};
}
class KontaktLabelProvider extends DefaultLabelProvider {
@Override
public String getText(Object element) {
String[] fields = new String[] { Kontakt.FLD_NAME1, Kontakt.FLD_NAME2, Kontakt.FLD_NAME3,
Kontakt.FLD_STREET, Kontakt.FLD_ZIP, Kontakt.FLD_PLACE, Kontakt.FLD_PHONE1 };
String[] values = new String[fields.length];
((Kontakt) element).get(fields, values);
return StringTool.join(values, StringConstants.COMMA);
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
}