/******************************************************************************* * Copyright (c) 2005-2009, 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.views.rechnung; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.dialogs.KontaktSelektor; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.viewers.ViewerConfigurer; import ch.elexis.core.ui.util.viewers.ViewerConfigurer.ControlFieldListener; import ch.elexis.data.Fall; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.elexis.data.RnStatus; import ch.rgw.tools.IFilter; import ch.rgw.tools.StringTool; /** * Controlfieldprovider for RechnungsListeView. Creates a Composite that contains the controls to * select the criteria for the bills to be displayed * * @author gerry * */ class RnControlFieldProvider implements ViewerConfigurer.ControlFieldProvider { // final String[] // stats={"Alle","Bezahlt","Offen","Offen&Gedruckt","1. Mahnung","2. Mahnung","3. Mahnung","In Betreibung","Teilverlust","Totalverlust"}; final static String[] stats = { Messages.RnControlFieldProvider_all, Messages.RnControlFieldProvider_open, Messages.RnControlFieldProvider_openAndPrinted, Messages.RnControlFieldProvider_partlyPaid, Messages.RnControlFieldProvider_paid, Messages.RnControlFieldProvider_overpaid, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ Messages.RnControlFieldProvider_reminder, Messages.RnControlFieldProvider_reminderPrinted, Messages.RnControlFieldProvider_reminder2, Messages.RnControlFieldProvider_reminder2Printed, Messages.RnControlFieldProvider_reminder3, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ Messages.RnControlFieldProvider_reminder3Printed, Messages.RnControlFieldProvider_enforcement, Messages.RnControlFieldProvider_partlyLost, Messages.RnControlFieldProvider_totallyLost, Messages.RnControlFieldProvider_storno, //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ Messages.RnControlFieldProvider_erroneous, Messages.RnControlFieldProvider_toPrint, Messages.RnControlFieldProvider_toBePaid, Messages.RnControlFieldProvider_dontRemind, Messages.RnControlFieldProvider_writtenOff, Messages.RnControlFieldProvider_rejected }; final static int[] statInts = { RnStatus.UNBEKANNT, RnStatus.OFFEN, RnStatus.OFFEN_UND_GEDRUCKT, RnStatus.TEILZAHLUNG, RnStatus.BEZAHLT, RnStatus.ZUVIEL_BEZAHLT, RnStatus.MAHNUNG_1, RnStatus.MAHNUNG_1_GEDRUCKT, RnStatus.MAHNUNG_2, RnStatus.MAHNUNG_2_GEDRUCKT, RnStatus.MAHNUNG_3, RnStatus.MAHNUNG_3_GEDRUCKT, RnStatus.IN_BETREIBUNG, RnStatus.TEILVERLUST, RnStatus.TOTALVERLUST, RnStatus.STORNIERT, RnStatus.FEHLERHAFT, RnStatus.ZU_DRUCKEN, RnStatus.AUSSTEHEND, RnStatus.MAHNSTOPP, RnStatus.ABGESCHRIEBEN, RnStatus.ZURUECKGEWIESEN }; final static int STAT_DEFAULT_INDEX = 1; private final static String ALLE = Messages.RnControlFieldProvider_allPatients; //$NON-NLS-1$ private final static String ALL = Messages.RnControlFieldProvider_all; //$NON-NLS-1$ Combo cbStat; Combo cbZType; /* DatePickerCombo dpVon, dpBis; */ private List<ControlFieldListener> listeners; private final SelectionAdapter csel = new CtlSelectionListener(); private boolean bDateAsStatus; private HyperlinkAdapter /* hlStatus, */hlPatient; private Label /* hDateFrom, hDateUntil, */lPatient; Text tNr, tBetrag; String oldSelectedBillingSystem = ""; //$NON-NLS-1$ Patient actPatient; public Composite createControl(final Composite parent){ Composite ret = new Composite(parent, SWT.NONE); listeners = new ArrayList<ControlFieldListener>(); ret.setLayout(new GridLayout(5, true)); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); hlPatient = new HyperlinkAdapter() { @Override public void linkActivated(final HyperlinkEvent e){ Patient oldPatient = actPatient; KontaktSelektor ksl = new KontaktSelektor(parent.getShell(), Patient.class, Messages.RnControlFieldProvider_selectPatientCaption, //$NON-NLS-1$ Messages.RnControlFieldProvider_selectPatientMessage, true); //$NON-NLS-1$ if (ksl.open() == Dialog.OK) { actPatient = (Patient) ksl.getSelection(); if (actPatient != null) { lPatient.setText(actPatient.getLabel()); cbStat.setText(stats[0]); } else { lPatient.setText(ALLE); cbStat.setText(stats[1]); } } else { actPatient = null; lPatient.setText(ALLE); cbStat.setText(stats[1]); } if (actPatient == null && oldPatient == null) { return; } else if (actPatient != null && oldPatient != null && actPatient.equals(oldPatient)) { return; } fireChangedEvent(); } }; new Label(ret, SWT.NONE).setText(Messages.RnControlFieldProvider_state); //$NON-NLS-1$ Label lbl = SWTHelper.createHyperlink(ret, Messages.RnControlFieldProvider_patient2, hlPatient); //$NON-NLS-1$ lbl.setForeground(UiDesk.getColorRegistry().get(UiDesk.COL_BLUE)); new Label(ret, SWT.NONE).setText(Messages.RnControlFieldProvider_PaymentSystem); //$NON-NLS-1$ new Label(ret, SWT.NONE).setText(Messages.RnControlFieldProvider_invoideNr); //$NON-NLS-1$ new Label(ret, SWT.NONE).setText(Messages.RnControlFieldProvider_amount); //$NON-NLS-1$ // / ^ labels / values cbStat = new Combo(ret, SWT.READ_ONLY); cbStat.setVisibleItemCount(stats.length); cbStat.setItems(stats); cbStat.addSelectionListener(csel); cbStat.select(STAT_DEFAULT_INDEX); lPatient = new Label(ret, SWT.NONE); lPatient.setText(ALLE); cbZType = new Combo(ret, SWT.SINGLE | SWT.READ_ONLY); // sort items according to prefs cbZType.setItems(ch.elexis.core.ui.preferences.UserCasePreferences.sortBillingSystems(Fall .getAbrechnungsSysteme())); cbZType.add(ALL); // focus listener needed because view may be created BEFORE a user is active // but for the sorting we need the user prefs for sorting // AND if the prefs have just been modified... cbZType.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e){ // only set items if there ARE changes to avoid unnecessary flickering String[] currItems = cbZType.getItems(); String[] newItems = ch.elexis.core.ui.preferences.UserCasePreferences.sortBillingSystems(Fall .getAbrechnungsSysteme()); if (!Arrays.equals(currItems, newItems)) { String savedItem = cbZType.getText(); cbZType.setItems(newItems); cbZType.setText(savedItem); cbZType.add(ALL); } oldSelectedBillingSystem = cbZType.getText(); } @Override public void focusLost(FocusEvent e){} }); // added to prevent selection of separator cbZType.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e){ int separatorPos = ch.elexis.core.ui.preferences.UserCasePreferences .getBillingSystemsMenuSeparatorPos(Fall.getAbrechnungsSysteme()); if (cbZType.getSelectionIndex() == separatorPos) cbZType.select(cbZType.indexOf(oldSelectedBillingSystem)); else oldSelectedBillingSystem = cbZType.getText(); } @Override public void widgetDefaultSelected(SelectionEvent e){} }); /* * GridData gdlp=new GridData(); gdlp.widthHint=150; gdlp.minimumWidth=150; */ tNr = new Text(ret, SWT.BORDER); tNr.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e){ if (tNr.getText().length() == 0) { cbStat.select(STAT_DEFAULT_INDEX); } fireChangedEvent(); } }); tBetrag = new Text(ret, SWT.BORDER); tBetrag.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e){ if (tNr.getText().length() == 0) { cbStat.select(STAT_DEFAULT_INDEX); } fireChangedEvent(); } }); GridData sgd = new GridData(); sgd.minimumWidth = 100; sgd.widthHint = 100; return ret; } public void addChangeListener(final ControlFieldListener cl){ listeners.add(cl); } public void removeChangeListener(final ControlFieldListener cl){ listeners.remove(cl); } public boolean getDateModeIsStatus(){ return bDateAsStatus; } public String[] getValues(){ String[] ret = new String[5]; int selIdx = cbStat.getSelectionIndex(); if (selIdx != -1) { ret[0] = Integer.toString(statInts[selIdx]); } else { ret[0] = StringConstants.ONE; } if (actPatient != null) { ret[1] = actPatient.getId(); } ret[2] = tNr.getText(); ret[3] = tBetrag.getText().replaceAll("\\.", ""); //$NON-NLS-1$ //$NON-NLS-2$ if (StringTool.isNothing(ret[2])) { ret[2] = null; } else { // Wenn RnNummer gegeben ist, alles andere auf Standard. clearValues(); tNr.setText(ret[2]); ret[0] = StringConstants.ZERO; ret[1] = null; ret[3] = null; } if (StringTool.isNothing(ret[3])) { ret[3] = null; } else { clearValues(); tBetrag.setText(ret[3]); ret[0] = StringConstants.ZERO; ret[1] = null; ret[2] = null; } ret[4] = cbZType.getText(); if (StringTool.isNothing(ret[4]) || ret[4].equals(ALL)) { ret[4] = null; } return ret; } public void clearValues(){ cbStat.select(0); tNr.setText(""); //$NON-NLS-1$ actPatient = null; lPatient.setText(ALLE); } public boolean isEmpty(){ return false; } public void setQuery(final Query q){ } public IFilter createFilter(){ return new IFilter() { public boolean select(final Object element){ return true; } }; } public void fireChangedEvent(){ UiDesk.getDisplay().syncExec(new Runnable() { public void run(){ HashMap<String, String> hm = new HashMap<String, String>(); hm.put(Messages.RnControlFieldProvider_state, StringConstants.ZERO); //$NON-NLS-1$ for (ControlFieldListener lis : listeners) { lis.changed(hm); } } }); } public void fireSortEvent(final String text){ for (ControlFieldListener lis : listeners) { lis.reorder(text); } } public void setFocus(){ } private static class CtlSelectionListener extends SelectionAdapter { @Override public void widgetSelected(final SelectionEvent e){ // fireChangedEvent(); do nothing. Only refresh by click on the refresh button } } }