Java tutorial
/******************************************************************************* * Copyright (c) 2006-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.views; import java.text.ParseException; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.statushandlers.StatusManager; import ch.elexis.Desk; import ch.elexis.Hub; import ch.elexis.actions.CodeSelectorHandler; import ch.elexis.actions.ElexisEvent; import ch.elexis.actions.ElexisEventDispatcher; import ch.elexis.actions.ElexisEventListenerImpl; import ch.elexis.admin.AccessControlDefaults; import ch.elexis.data.IVerrechenbar; import ch.elexis.data.Konsultation; import ch.elexis.data.Leistungsblock; import ch.elexis.data.PersistentObject; import ch.elexis.data.Prescription; import ch.elexis.data.Verrechnet; import ch.elexis.status.ElexisStatus; import ch.elexis.util.PersistentObjectDropTarget; import ch.elexis.util.SWTHelper; import ch.elexis.views.codesystems.LeistungenView; import ch.rgw.tools.Money; import ch.rgw.tools.Result; import ch.rgw.tools.StringTool; public class VerrechnungsDisplay extends Composite { Table tVerr; TableViewer viewer; MenuManager contextMenuManager; private final Hyperlink hVer; private final PersistentObjectDropTarget dropTarget; private IAction chPriceAction, chCountAction, chTextAction, removeAction, removeAllAction; private static final String CHPRICE = Messages.getString("VerrechnungsDisplay.changePrice"); //$NON-NLS-1$ private static final String CHCOUNT = Messages.getString("VerrechnungsDisplay.changeNumber"); //$NON-NLS-1$ private static final String REMOVE = Messages.getString("VerrechnungsDisplay.removeElement"); //$NON-NLS-1$ private static final String CHTEXT = Messages.getString("VerrechnungsDisplay.changeText"); //$NON-NLS-1$ private static final String REMOVEALL = Messages.getString("VerrechnungsDisplay.removeAll"); //$NON-NLS-1$ public VerrechnungsDisplay(final IWorkbenchPage page, Composite parent, int style) { super(parent, style); setLayout(new GridLayout()); hVer = Desk.getToolkit().createHyperlink(this, Messages.getString("VerrechnungsDisplay.billing"), SWT.NONE); //$NON-NLS-1$ hVer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); hVer.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { try { if (StringTool.isNothing(LeistungenView.ID)) { SWTHelper.alert(Messages.getString("VerrechnungsDisplay.error"), "LeistungenView.ID"); //$NON-NLS-1$ //$NON-NLS-2$ } page.showView(LeistungenView.ID); CodeSelectorHandler.getInstance().setCodeSelectorTarget(dropTarget); } catch (Exception ex) { ElexisStatus status = new ElexisStatus(ElexisStatus.ERROR, Hub.PLUGIN_ID, ElexisStatus.CODE_NONE, Messages.getString("VerrechnungsDisplay.errorStartingCodeWindow") + ex.getMessage(), ex, ElexisStatus.LOG_ERRORS); StatusManager.getManager().handle(status, StatusManager.SHOW); } } }); makeActions(); tVerr = Desk.getToolkit().createTable(this, SWT.SINGLE); tVerr.setLayoutData(new GridData(GridData.FILL_BOTH)); tVerr.setMenu(createVerrMenu()); // dummy table viewer needed for SelectionsProvider for Menu viewer = new TableViewer(tVerr); // add selection event to table which provides selection to ElexisEventDispatcher tVerr.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableItem[] selection = tVerr.getSelection(); Verrechnet verrechnet = (Verrechnet) selection[0].getData(); ElexisEventDispatcher.fireSelectionEvent(verrechnet); } }); dropTarget = new PersistentObjectDropTarget(Messages.getString("VerrechnungsDisplay.doBill"), tVerr, //$NON-NLS-1$ new DropReceiver()); // refresh the table if a update to a Verrechnet occurs ElexisEventDispatcher.getInstance() .addListeners(new ElexisEventListenerImpl(Verrechnet.class, ElexisEvent.EVENT_UPDATE) { @Override public void runInUi(ElexisEvent ev) { Konsultation actKons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); setLeistungen(actKons); } }); } public void clear() { tVerr.removeAll(); } public void addPersistentObject(PersistentObject o) { Konsultation actKons = (Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class); if (actKons != null) { // System.out.println(actKons.getLabel()); if (o instanceof Prescription) { o = ((Prescription) o).getArtikel(); } if (o instanceof IVerrechenbar) { if (Hub.acl.request(AccessControlDefaults.LSTG_VERRECHNEN) == false) { SWTHelper.alert(Messages.getString("VerrechnungsDisplay.missingRightsCaption"), //$NON-NLS-1$ Messages.getString("VerrechnungsDisplay.missingRightsBody")); //$NON-NLS-1$ } else { Result<IVerrechenbar> result = actKons.addLeistung((IVerrechenbar) o); if (!result.isOK()) { SWTHelper.alert(Messages.getString("VerrechnungsDisplay.imvalidBilling"), //$NON-NLS-1$ result.toString()); } setLeistungen(actKons); } } } } private final class DropReceiver implements PersistentObjectDropTarget.IReceiver { public void dropped(PersistentObject o, DropTargetEvent ev) { addPersistentObject(o); } public boolean accept(PersistentObject o) { if (ElexisEventDispatcher.getSelectedPatient() != null) { if (o instanceof IVerrechenbar) { return true; } if (o instanceof Leistungsblock) { return true; } if (o instanceof Prescription) { return true; } } return false; } } public void setLeistungen(Konsultation b) { List<Verrechnet> lgl = b.getLeistungen(); tVerr.setRedraw(false); tVerr.removeAll(); StringBuilder sdg = new StringBuilder(); Money sum = new Money(0); for (Verrechnet lst : lgl) { sdg.setLength(0); int z = lst.getZahl(); Money preis = lst.getNettoPreis().multiply(z); sum.addMoney(preis); sdg.append(z).append(" ").append(lst.getCode()).append(" ").append(lst.getText()) //$NON-NLS-1$ //$NON-NLS-2$ .append(" (").append(preis.getAmountAsString()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ TableItem ti = new TableItem(tVerr, SWT.WRAP); ti.setText(sdg.toString()); ti.setData(lst); } tVerr.setRedraw(true); sdg.setLength(0); sdg.append(Messages.getString("VerrechnungsDisplay.billed")).append(sum.getAmountAsString()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ hVer.setText(sdg.toString()); } private Menu createVerrMenu() { contextMenuManager = new MenuManager(); contextMenuManager.setRemoveAllWhenShown(true); contextMenuManager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { int sel = tVerr.getSelectionIndex(); if (sel != -1) { TableItem ti = tVerr.getItem(sel); Verrechnet v = (Verrechnet) ti.getData(); manager.add(chPriceAction); manager.add(chCountAction); List<IAction> itemActions = v.getVerrechenbar().getActions(v); if ((itemActions != null) && (itemActions.size() > 0)) { manager.add(new Separator()); for (IAction a : itemActions) { if (a != null) { manager.add(a); } } } manager.add(new Separator()); manager.add(chTextAction); manager.add(removeAction); manager.add(new Separator()); manager.add(removeAllAction); } } }); return contextMenuManager.createContextMenu(tVerr); } private void makeActions() { removeAction = new Action(REMOVE) { @Override public void run() { int sel = tVerr.getSelectionIndex(); TableItem ti = tVerr.getItem(sel); Result<Verrechnet> result = ((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)) .removeLeistung((Verrechnet) ti.getData()); if (!result.isOK()) { SWTHelper.alert(Messages.getString("VerrechnungsDisplay.PositionCanootBeRemoved"), result //$NON-NLS-1$ .toString()); } setLeistungen((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)); } }; removeAllAction = new Action(REMOVEALL) { @Override public void run() { TableItem[] items = tVerr.getItems(); for (TableItem ti : items) { Result<Verrechnet> result = ((Konsultation) ElexisEventDispatcher .getSelected(Konsultation.class)).removeLeistung((Verrechnet) ti.getData()); if (!result.isOK()) { SWTHelper.alert(Messages.getString("VerrechnungsDisplay.PositionCanootBeRemoved"), result //$NON-NLS-1$ .toString()); } } setLeistungen((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)); } }; chPriceAction = new Action(CHPRICE) { @Override public void run() { int sel = tVerr.getSelectionIndex(); TableItem ti = tVerr.getItem(sel); Verrechnet v = (Verrechnet) ti.getData(); Money oldPrice = v.getBruttoPreis(); String p = oldPrice.getAmountAsString(); InputDialog dlg = new InputDialog(Desk.getTopShell(), Messages.getString("VerrechnungsDisplay.changePriceForService"), //$NON-NLS-1$ Messages.getString("VerrechnungsDisplay.enterNewPrice"), p, //$NON-NLS-1$ null); if (dlg.open() == Dialog.OK) { try { String val = dlg.getValue().trim(); Money newPrice = new Money(oldPrice); if (val.endsWith("%") && val.length() > 1) { //$NON-NLS-1$ val = val.substring(0, val.length() - 1); double percent = Double.parseDouble(val); double factor = 1.0 + (percent / 100.0); v.setSecondaryScaleFactor(factor); } else { newPrice = new Money(val); v.setTP(newPrice.getCents()); v.setSecondaryScaleFactor(1); } // v.setPreis(newPrice); setLeistungen((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)); } catch (ParseException ex) { SWTHelper.showError(Messages.getString("VerrechnungsDisplay.badAmountCaption"), //$NON-NLS-1$ Messages.getString("VerrechnungsDisplay.badAmountBody")); //$NON-NLS-1$ } } } }; chCountAction = new Action(CHCOUNT) { @Override public void run() { int sel = tVerr.getSelectionIndex(); TableItem ti = tVerr.getItem(sel); Verrechnet v = (Verrechnet) ti.getData(); String p = Integer.toString(v.getZahl()); InputDialog dlg = new InputDialog(Desk.getTopShell(), Messages.getString("VerrechnungsDisplay.changeNumberCaption"), //$NON-NLS-1$ Messages.getString("VerrechnungsDisplay.changeNumberBody"), //$NON-NLS-1$ p, null); if (dlg.open() == Dialog.OK) { try { String val = dlg.getValue(); if (!StringTool.isNothing(val)) { if (val.indexOf('/') > 0) { String[] frac = val.split("/"); //$NON-NLS-1$ v.changeAnzahl(1); double scale = Double.parseDouble(frac[0]) / Double.parseDouble(frac[1]); v.setSecondaryScaleFactor(scale); v.setText(v.getText() + " (" + val //$NON-NLS-1$ + Messages.getString("VerrechnungsDisplay.Orininalpackungen")); //$NON-NLS-1$ } else if (val.indexOf('.') > 0) { double scale = Double.parseDouble(val); v.changeAnzahl(1); v.setSecondaryScaleFactor(scale); v.setText(v.getText() + " (" + Double.toString(scale) + ")"); } else { int neu = Integer.parseInt(dlg.getValue()); v.changeAnzahl(neu); v.setSecondaryScaleFactor(1.0); v.setText(v.getVerrechenbar().getText()); } } setLeistungen((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)); v.getVerrechenbar().getOptifier() .optify((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)); } catch (NumberFormatException ne) { SWTHelper.showError(Messages.getString("VerrechnungsDisplay.invalidEntryCaption"), //$NON-NLS-1$ Messages.getString("VerrechnungsDisplay.invalidEntryBody")); //$NON-NLS-1$ } } } }; chTextAction = new Action(CHTEXT) { @Override public void run() { int sel = tVerr.getSelectionIndex(); TableItem ti = tVerr.getItem(sel); Verrechnet v = (Verrechnet) ti.getData(); String oldText = v.getText(); InputDialog dlg = new InputDialog(Desk.getTopShell(), Messages.getString("VerrechnungsDisplay.changeTextCaption"), //$NON-NLS-1$ Messages.getString("VerrechnungsDisplay.changeTextBody"), //$NON-NLS-1$ oldText, null); if (dlg.open() == Dialog.OK) { String input = dlg.getValue(); if (input.matches("[0-9\\.,]+")) { //$NON-NLS-1$ if (!SWTHelper.askYesNo(Messages.getString("VerrechnungsDisplay.confirmChangeTextCaption"), //$NON-NLS-1$ Messages.getString("VerrechnungsDisplay.confirmChangeTextBody"))) { //$NON-NLS-1$ return; } } v.setText(input); setLeistungen((Konsultation) ElexisEventDispatcher.getSelected(Konsultation.class)); } } }; } }