/******************************************************************************* * Copyright (c) 2007, 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 * *******************************************************************************/ package ch.medshare.elexis.directories.views; import java.io.IOException; import java.util.List; import java.util.Vector; import org.eclipse.core.runtime.ListenerList; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import ch.elexis.core.ui.contacts.dialogs.PatientErfassenDialog; import ch.elexis.core.ui.dialogs.KontaktErfassenDialog; import ch.elexis.core.ui.util.SWTHelper; import ch.medshare.elexis.directories.DirectoriesContentParser; import ch.medshare.elexis.directories.DirectoriesHelper; import ch.medshare.elexis.directories.KontaktEntry; import ch.rgw.tools.ExHandler; public class WeisseSeitenSearchForm extends Composite { private final ListenerList listeners = new ListenerList(); private List<KontaktEntry> kontakte = new Vector<KontaktEntry>(); private String searchInfoText = ""; public WeisseSeitenSearchForm(Composite parent, int style){ super(parent, style); createPartControl(parent); } private void createPartControl(Composite parent){ setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); setLayout(new GridLayout(3, false)); Label nameLabel = new Label(this, SWT.NONE); nameLabel.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); nameLabel.setText(Messages.getString("WeisseSeitenSearchForm.label.werWasWo")); //$NON-NLS-1$ Label geoLabel = new Label(this, SWT.NONE); geoLabel.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); geoLabel.setText(Messages.getString("WeisseSeitenSearchForm.label.Ort")); //$NON-NLS-1$ new Label(this, SWT.NONE); // Platzhalter final Text nameText = new Text(this, SWT.BORDER); nameText.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); final Text geoText = new Text(this, SWT.BORDER); geoText.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); Button searchBtn = new Button(this, SWT.NONE); searchBtn.setText(Messages.getString("WeisseSeitenSearchForm.btn.Suchen")); //$NON-NLS-1$ nameText.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e){ if (e.character == SWT.CR) { searchAction(nameText.getText(), geoText.getText()); } } }); geoText.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e){ if (e.character == SWT.CR) { searchAction(nameText.getText(), geoText.getText()); } } }); searchBtn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e){ searchAction(nameText.getText(), geoText.getText()); } }); } /** * Liest Kontaktinformationen anhand der Kriterien name & geo. Bei der Suche wird die * Kontakteliste und der InfoText abgefüllt. */ private void readKontakte(final String name, final String geo){ final Cursor backupCursor = getShell().getCursor(); final Cursor waitCursor = new Cursor(getShell().getDisplay(), SWT.CURSOR_WAIT); getShell().setCursor(waitCursor); try { String content = DirectoriesHelper.readContent(name, geo); DirectoriesContentParser parser = new DirectoriesContentParser(content); kontakte = parser.extractKontakte(); searchInfoText = parser.getSearchInfo(); } catch (IOException e) { ExHandler.handle(e); } finally { getShell().setCursor(backupCursor); } } /** * Aktion wenn Such-Button klicked oder Default-Action (Return). */ private void searchAction(String name, String geo){ readKontakte(name, geo); resultChanged(); } private void resultChanged(){ for (Object listener : listeners.getListeners()) { if (listener != null) { ((Listener) listener).handleEvent(null); } } } /** * Retourniert String array für Dialoge */ private String[] getFields(KontaktEntry entry){ final String name = entry.getName() + " " //$NON-NLS-1$ + entry.getVorname(); final String geo = entry.getPlz() + " " //$NON-NLS-1$ + entry.getOrt(); if (!entry.isDetail()) { // Sind Detailinformationen vorhanden readKontakte(name, geo); // Detail infos lesen KontaktEntry detailEntry = null; if (getKontakte().size() == 1) { detailEntry = getKontakte().get(0); } else if (getKontakte().size() > 1) { String strasse = entry.getAdresse().trim(); for (KontaktEntry tempEntry : getKontakte()) { if (strasse.contains(tempEntry.getAdresse())) { detailEntry = tempEntry; } } } if (detailEntry != null) { // Falls bei Detailsuche Fehler passiert, dann sind weniger Infos vorhanden if (detailEntry.countNotEmptyFields() > entry.countNotEmptyFields()) { entry = detailEntry; } } } return new String[] { entry.getName(), entry.getVorname(), "", entry.getAdresse(), entry.getPlz(), //$NON-NLS-1$ entry.getOrt(), entry.getTelefon(), entry.getZusatz(), entry.getFax(), entry.getEmail() }; } /** * Öffnet Dialog zum Erfassen eines Patienten */ public void openPatientenDialog(KontaktEntry entry){ if (entry != null) { final PatientErfassenDialog dialog = new PatientErfassenDialog(getShell(), entry.toHashmap()); dialog.open(); } } /** * Öffnet Dialog zum Erfassen eines Kontaktes */ public void openKontaktDialog(KontaktEntry entry){ if (entry != null) { final KontaktErfassenDialog dialog = new KontaktErfassenDialog(getShell(), getFields(entry)); dialog.open(); } } /** * Kontakt Liste */ public List<KontaktEntry> getKontakte(){ return this.kontakte; } /** * Infotext zum Suchresultat: z.B. "123 Treffer" */ public String getSearchInfoText(){ return this.searchInfoText; } public void addResultChangeListener(Listener listener){ listeners.add(listener); } public void removeResultChangeListener(Listener listener){ listeners.add(listener); } }