/*******************************************************************************
* Copyright (c) 2007-2010, medshare 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:
* M. Imhof - initial implementation
* G. Weirich - added Anschrift
*
*******************************************************************************/
package ch.elexis.core.ui.dialogs;
import java.util.List;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.icons.ImageSize;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.Anwender;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Labor;
import ch.elexis.data.Mandant;
import ch.elexis.data.Organisation;
import ch.elexis.data.Patient;
import ch.elexis.data.Person;
import ch.elexis.data.Query;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
import ch.rgw.tools.TimeTool.TimeFormatException;
public class KontaktErfassenDialog extends TitleAreaDialog {
private static final int KED_NAME = 0;
private static final int KED_FIRSTNAME = 1;
private static final int KED_ADDITIONAL = 7;
private Button bOrganisation, bLabor, bPerson, bPatient, bAnwender, bMandant;
Kontakt newKontakt = null;
String[] fld;
Text tName, tVorname, tZusatz, tGebDat, tStrasse, tPlz, tOrt, tTel, tFax, tEmail;
Combo cbSex;
Label lName, lVorname, lZusatz;
Hyperlink hlAnschrift;
public KontaktErfassenDialog(final Shell parent, final String[] fields){
super(parent);
fld = fields;
}
@Override
protected Control createDialogArea(final Composite parent){
Composite typeComp = new Composite(parent, SWT.NONE);
typeComp.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
typeComp.setLayout(new GridLayout(1, false));
Composite cTypes = UiDesk.getToolkit().createComposite(typeComp, SWT.BORDER);
bOrganisation =
UiDesk.getToolkit().createButton(cTypes, Messages.KontaktErfassenDialog_organization, //$NON-NLS-1$
SWT.CHECK);
bOrganisation.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
bOrganisationChanged(bOrganisation.getSelection());
}
});
bLabor = UiDesk.getToolkit().createButton(cTypes, Messages.KontaktErfassenDialog_labor,
SWT.CHECK); //$NON-NLS-1$
bLabor.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
bLaborChanged(bLabor.getSelection());
}
});
bPerson = UiDesk.getToolkit().createButton(cTypes, Messages.KontaktErfassenDialog_person,
SWT.CHECK); //$NON-NLS-1$
bPerson.setSelection(true);
bPerson.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
bPersonChanged(bPerson.getSelection());
}
});
bPatient = UiDesk.getToolkit().createButton(cTypes, Messages.KontaktErfassenDialog_patient,
SWT.CHECK); //$NON-NLS-1$
bPatient.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
bPatientChanged(bPatient.getSelection());
}
});
if (fld.length > KontaktSelektor.HINT_PATIENT) {
if (!StringTool.isNothing(fld[KontaktSelektor.HINT_PATIENT])) {
bPatient.setSelection(true);
}
}
bAnwender = UiDesk.getToolkit().createButton(cTypes, Messages.KontaktErfassenDialog_user,
SWT.CHECK); //$NON-NLS-1$
bAnwender.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
bAnwenderChanged(bAnwender.getSelection());
}
});
bMandant = UiDesk.getToolkit().createButton(cTypes, Messages.KontaktErfassenDialog_mandant,
SWT.CHECK); //$NON-NLS-1$
bMandant.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e){
bMandantChanged(bMandant.getSelection());
}
});
// Not everybody may create users and mandators
if (!CoreHub.acl.request(AccessControlDefaults.ACL_USERS)) {
bMandant.setEnabled(false);
bAnwender.setEnabled(false);
}
cTypes.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
cTypes.setLayout(new FillLayout());
Composite ret = new Composite(parent, SWT.NONE);
ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
ret.setLayout(new GridLayout(2, false));
lName = new Label(ret, SWT.NONE);
lName.setText(Messages.KontaktErfassenDialog_name); //$NON-NLS-1$
tName = new Text(ret, SWT.BORDER);
tName.setText(fld[KontaktSelektor.HINT_NAME]);
tName.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tName.setTextLimit(80);
lVorname = new Label(ret, SWT.NONE);
lVorname.setText(Messages.KontaktErfassenDialog_firstName); //$NON-NLS-1$
tVorname = new Text(ret, SWT.BORDER);
tVorname.setText(
fld[KontaktSelektor.HINT_FIRSTNAME] == null ? "" : fld[KontaktSelektor.HINT_FIRSTNAME]); //$NON-NLS-1$
tVorname.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tVorname.setTextLimit(80);
lZusatz = new Label(ret, SWT.NONE);
lZusatz.setText(Messages.KontaktErfassenDialog_zusatz); //$NON-NLS-1$
tZusatz = new Text(ret, SWT.BORDER);
tZusatz.setText(fld.length > KontaktSelektor.HINT_ADD ? fld[KontaktSelektor.HINT_ADD] : ""); //$NON-NLS-1$
tZusatz.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
new Label(ret, SWT.NONE).setText(Messages.PatientErfassenDialog_sex);//$NON-NLS-1$
cbSex = new Combo(ret, SWT.SINGLE);
cbSex.setItems(new String[] {
Messages.KontaktErfassenDialog_male, Messages.KontaktErfassenDialog_female
}); //$NON-NLS-1$ //$NON-NLS-2$
if (fld.length <= KontaktSelektor.HINT_SEX || fld[KontaktSelektor.HINT_SEX].length() == 0) {
if (StringTool.isNothing(fld[KontaktSelektor.HINT_FIRSTNAME])) {
cbSex.select(0);
} else {
cbSex.select(StringTool.isFemale(fld[KontaktSelektor.HINT_FIRSTNAME]) ? 1 : 0);
}
} else {
cbSex.select(fld[KontaktSelektor.HINT_SEX].equals(Person.MALE) ? 0 : 1);
}
new Label(ret, SWT.NONE).setText(Messages.KontaktErfassenDialog_birthDate); //$NON-NLS-1$
tGebDat = new Text(ret, SWT.BORDER);
tGebDat.setText(
fld[KontaktSelektor.HINT_BIRTHDATE] == null ? "" : fld[KontaktSelektor.HINT_BIRTHDATE]); //$NON-NLS-1$
tGebDat.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tGebDat.setTextLimit(8);
new Label(ret, SWT.NONE).setText(Messages.PatientErfassenDialog_street); //$NON-NLS-1$
tStrasse = new Text(ret, SWT.BORDER);
tStrasse.setText(
fld.length > KontaktSelektor.HINT_STREET ? fld[KontaktSelektor.HINT_STREET] : ""); //$NON-NLS-1$
tStrasse.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tStrasse.setTextLimit(80);
new Label(ret, SWT.NONE).setText(Messages.PatientErfassenDialog_zip); //$NON-NLS-1$
tPlz = new Text(ret, SWT.BORDER);
tPlz.setText(fld.length > KontaktSelektor.HINT_ZIP ? fld[KontaktSelektor.HINT_ZIP] : ""); //$NON-NLS-1$
tPlz.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tPlz.setTextLimit(6);
new Label(ret, SWT.NONE).setText(Messages.PatientErfassenDialog_city); //$NON-NLS-1$
tOrt = new Text(ret, SWT.BORDER);
tOrt.setText(
fld.length > KontaktSelektor.HINT_PLACE ? fld[KontaktSelektor.HINT_PLACE] : ""); //$NON-NLS-1$
tOrt.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tOrt.setTextLimit(50);
new Label(ret, SWT.NONE).setText(Messages.PatientErfassenDialog_phone); //$NON-NLS-1$
tTel = new Text(ret, SWT.BORDER);
tTel.setText(fld.length > 6 ? fld[6] : ""); //$NON-NLS-1$
tTel.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tTel.setTextLimit(30);
new Label(ret, SWT.NONE).setText(Messages.KontaktErfassenDialog_fax); //$NON-NLS-1$
tFax = new Text(ret, SWT.BORDER);
tFax.setText(fld.length > 8 ? fld[8] : ""); //$NON-NLS-1$
tFax.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tFax.setTextLimit(30);
new Label(ret, SWT.NONE).setText(Messages.KontaktErfassenDialog_email); //$NON-NLS-1$
tEmail = new Text(ret, SWT.BORDER);
tEmail.setText(fld.length > 9 ? fld[9] : ""); //$NON-NLS-1$
tEmail.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tEmail.setTextLimit(80);
new Label(ret, SWT.NONE).setText(Messages.KontaktErfassenDialog_postanschrift); //$NON-NLS-1$
hlAnschrift = UiDesk.getToolkit().createHyperlink(ret,
Messages.KontaktErfassenDialog_postalempty, SWT.NONE); //$NON-NLS-1$
hlAnschrift.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e){
createKontakt();
AnschriftEingabeDialog aed = new AnschriftEingabeDialog(getShell(), newKontakt);
aed.create();
SWTHelper.center(getShell(), aed.getShell());
aed.open();
hlAnschrift.setText(newKontakt.getPostAnschrift(false));
}
});
hlAnschrift.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
return ret;
}
@Override
public void create(){
super.create();
setMessage(Messages.KontaktErfassenDialog_message); //$NON-NLS-1$
setTitle(Messages.KontaktErfassenDialog_subTitle); //$NON-NLS-1$
getShell().setText(Messages.KontaktErfassenDialog_title); //$NON-NLS-1$
setTitleImage(Images.IMG_LOGO.getImage(ImageSize._75x66_TitleDialogIconSize));
}
protected void bOrganisationChanged(boolean isSelected){
bOrganisation.setSelection(isSelected);
if (isSelected) {
bPersonChanged(false);
lName.setText(Messages.KontaktErfassenDialog_bezeichnung);//$NON-NLS-1$
lVorname.setText(Messages.KontaktErfassenDialog_zusatz); //$NON-NLS-1$
lZusatz.setText(Messages.KontaktErfassenDialog_ansprechperson); //$NON-NLS-1$
cbSex.setEnabled(false);
lName.getParent().layout();
} else {
bLaborChanged(false);
}
}
protected void bLaborChanged(boolean isSelected){
bLabor.setSelection(isSelected);
if (isSelected) {
bOrganisationChanged(true);
lZusatz.setText(Messages.KontaktErfassenDialog_laborleiter); //$NON-NLS-1$
lName.getParent().layout();
}
}
protected void bPersonChanged(boolean isSelected){
bPerson.setSelection(isSelected);
if (isSelected) {
bOrganisationChanged(false);
lName.setText(Messages.KontaktErfassenDialog_name);//$NON-NLS-1$
lVorname.setText(Messages.KontaktErfassenDialog_firstName); //$NON-NLS-1$
lZusatz.setText(Messages.KontaktErfassenDialog_zusatz); //$NON-NLS-1$
cbSex.setEnabled(true);
lName.getParent().layout();
} else {
bAnwenderChanged(false);
bMandantChanged(false);
bPatientChanged(false);
}
}
protected void bAnwenderChanged(boolean isSelected){
bAnwender.setSelection(isSelected);
if (isSelected) {
bPatientChanged(false);
bPersonChanged(true);
} else {
bMandantChanged(false);
}
}
protected void bMandantChanged(boolean isSelected){
bMandant.setSelection(isSelected);
if (isSelected) {
bAnwenderChanged(true);
}
}
protected void bPatientChanged(boolean isSelected){
bPatient.setSelection(isSelected);
if (isSelected) {
bAnwenderChanged(false);
bPersonChanged(true);
}
}
private void createKontakt(){
String[] ret = new String[8];
ret[0] = tName.getText();
ret[1] = tVorname.getText();
int idx = cbSex.getSelectionIndex();
if (idx == -1) {
SWTHelper.showError(Messages.KontaktErfassenDialog_geschlechtFehlt_title, //$NON-NLS-1$
Messages.KontaktErfassenDialog_geschlechtFehlt_msg); //$NON-NLS-1$
return;
}
ret[2] = cbSex.getItem(idx);
ret[3] = tGebDat.getText();
try {
if (!StringTool.isNothing(ret[3])) {
new TimeTool(ret[3], true);
}
ret[4] = tStrasse.getText();
ret[5] = tPlz.getText();
ret[6] = tOrt.getText();
ret[7] = tTel.getText();
if (newKontakt == null) {
Query<Kontakt> qbe = new Query<Kontakt>(Kontakt.class);
qbe.add("Bezeichnung1", "=", ret[0]); //$NON-NLS-1$ //$NON-NLS-2$
qbe.add("Bezeichnung2", "=", ret[1]); //$NON-NLS-1$ //$NON-NLS-2$
List<Kontakt> list = qbe.execute();
if ((list != null) && (!list.isEmpty())) {
Kontakt k = list.get(0);
if (bOrganisation.getSelection() && k.istOrganisation()) {
if (bLabor.getSelection()) {
k.set("istOrganisation", "1"); //$NON-NLS-1$ //$NON-NLS-2$
}
if (MessageDialog.openConfirm(getShell(),
Messages.KontaktErfassenDialog_organisationExistiert_title, //$NON-NLS-1$
Messages.KontaktErfassenDialog_organisationExistiert_msg) == false) { //$NON-NLS-1$
super.okPressed();
return;
}
}
if (k.istPerson()) {
if (bAnwender.getSelection()) {
k.set("istAnwender", "1"); //$NON-NLS-1$ //$NON-NLS-2$
}
if (bMandant.getSelection()) {
k.set("istMandant", "1"); //$NON-NLS-1$ //$NON-NLS-2$
}
if (bPatient.getSelection()) {
k.set("istPatient", "1"); //$NON-NLS-1$ //$NON-NLS-2$
}
if (MessageDialog.openConfirm(getShell(),
Messages.KontaktErfassenDialog_personExisitiert_title, //$NON-NLS-1$
Messages.KontaktErfassenDialog_personExisitiert_msg) == false) { //$NON-NLS-1$
super.okPressed();
return;
}
}
}
/**
* Neuer Kontakt erstellen. Reihenfolge der Abfrage ist Wichtig, da ein Anwender
* auch ein Mandant sein kann. "Organisation", - "Labor", "Person" - "Patient" -
* "Anwender" - "Mandant"
*/
if (bMandant.getSelection()) {
newKontakt = new Mandant(ret[0], ret[1], ret[3], ret[2]);
newKontakt.set("Zusatz", tZusatz.getText()); //$NON-NLS-1$
} else if (bAnwender.getSelection()) {
newKontakt = new Anwender(ret[0], ret[1], ret[3], ret[2]);
newKontakt.set("Zusatz", tZusatz.getText()); //$NON-NLS-1$
} else if (bPatient.getSelection()) {
newKontakt = new Patient(ret[0], ret[1], ret[3], ret[2]);
newKontakt.set("Zusatz", tZusatz.getText()); //$NON-NLS-1$
} else if (bPerson.getSelection()) {
newKontakt = new Person(ret[0], ret[1], ret[3], ret[2]);
newKontakt.set("Zusatz", tZusatz.getText()); //$NON-NLS-1$
} else if (bLabor.getSelection()) {
newKontakt = new Labor(ret[0], ret[0]);
newKontakt.set("Zusatz1", ret[1]); //$NON-NLS-1$
newKontakt.set("Ansprechperson", tZusatz.getText()); //$NON-NLS-1$
} else if (bOrganisation.getSelection()) {
newKontakt = new Organisation(ret[0], ret[1]);
newKontakt.set("Ansprechperson", tZusatz.getText()); //$NON-NLS-1$
} else {
MessageDialog.openInformation(getShell(),
Messages.KontaktErfassenDialog_unbekannterTyp_title, //$NON-NLS-1$
Messages.KontaktErfassenDialog_unbekannterTyp_msg); //$NON-NLS-1$
return;
}
}
if (CoreHub.getLocalLockService().acquireLock(newKontakt).isOk()) {
newKontakt.set(new String[] {
"Strasse", "Plz", "Ort", "Telefon1", "Fax", "E-Mail" //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
}, new String[] {
ret[4], ret[5], ret[6], ret[7], tFax.getText(), tEmail.getText()
});
ElexisEventDispatcher.fireSelectionEvent(newKontakt);
CoreHub.getLocalLockService().releaseLock(newKontakt);
}
} catch (TimeFormatException e) {
ExHandler.handle(e);
SWTHelper.showError(Messages.KontaktErfassenDialog_falschesDatum_title, //$NON-NLS-1$
Messages.KontaktErfassenDialog_falschesDatum_msg); //$NON-NLS-1$
return;
}
}
@Override
protected void okPressed(){
createKontakt();
super.okPressed();
}
public Kontakt getResult(){
return newKontakt;
}
}