/** * Copyright (c) 2010-2012, 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.medelexis.templator.ui; import java.io.File; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; 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.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.jdom.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.text.ITextPlugin.ICallback; import ch.elexis.core.ui.util.SWTHelper; import ch.medelexis.templator.model.IProcessor; import ch.medelexis.templator.model.ProcessingSchema; public class ProcessingSchemaDisplay extends Composite { private static final Logger log = LoggerFactory.getLogger(ProcessingSchemaDisplay.class); private static final String NO_SCHEMA_SELECTED = "Kein Schema ausgewählt"; private static final String NO_PATIENT_SELECTED = "Kein Patient ausgewählt "; private IAction printAction, addAction, directOutputAction; ScrolledForm form; Composite cFields; ToolBar toolBar; ProcessingSchema proc; private boolean bSaveOnFocusLost = true; FocusSaver fs = new FocusSaver(); // FileFieldEditor ffi; Combo cbProcessor; Text tTemplate; ICallback saveHandler; public ProcessingSchemaDisplay(Composite parent, ICallback handler){ super(parent, SWT.NONE); if (parent.getLayout() instanceof GridLayout) { setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); } setLayout(new FillLayout()); form = UiDesk.getToolkit().createScrolledForm(this); saveHandler = handler; Composite body = form.getBody(); body.setLayout(new GridLayout()); makeActions(); ToolBarManager tbm = new ToolBarManager(SWT.HORIZONTAL); tbm.add(printAction); tbm.add(addAction); tbm.add(directOutputAction); tbm.createControl(body); Composite cButtons = new Composite(body, SWT.NONE); cButtons.setLayout(new GridLayout(3, false)); cButtons.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); new Label(cButtons, SWT.NONE).setText("Schablone"); tTemplate = new Text(cButtons, SWT.BORDER); tTemplate.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); Button bChoose = new Button(cButtons, SWT.PUSH); bChoose.setText("wählen"); bChoose.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e){ FileDialog fd = new FileDialog(getShell(), SWT.OPEN); fd.setFilterPath(CoreHub.localCfg.get(Preferences.PREF_TEMPLATEBASE, System.getProperty("user.home"))); String fname = fd.open(); if (fname != null) { File f = new File(fname); tTemplate.setText(f.getName()); } } }); new Label(cButtons, SWT.NONE).setText("Ausgabeprozessor"); cbProcessor = new Combo(cButtons, SWT.SINGLE); cbProcessor.setLayoutData(SWTHelper.getFillGridData(2, true, 1, false)); IProcessor[] processors = ProcessingSchema.getProcessors(); for (IProcessor pro : processors) { cbProcessor.add(pro.getName()); } cFields = new Composite(body, SWT.NONE); cFields.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); cFields.setLayout(new GridLayout(2, false)); } private void makeActions(){ printAction = new Action("Ausgeben") { { setImageDescriptor(Images.IMG_PRINTER.getImageDescriptor()); setToolTipText("Gibt dieses Dokument mit dem konfigurierten Ausgabeprogramm aus"); } @Override public void run(){ save(); IProcessor pr = proc.getProcessor(); if (pr == null) { SWTHelper.alert("Es ist kein Prozessor definiert", "Die Vorlage hat keinen Prozessor. Ausgabe nicht möglich"); } else { pr.doOutput(proc); } } }; addAction = new Action("Variable hinzufügen") { { setImageDescriptor(Images.IMG_ADDITEM.getImageDescriptor()); setToolTipText("Ein neues Name-Wert-Paar hinzufügen"); } @Override public void run(){ InputDialog id = new InputDialog(getShell(), "Neues Prozessorfeld", "Geben Sie bitte einen Namen für das Feld ein", "Textfeld", new IInputValidator() { @Override public String isValid(String newText){ if (newText.matches("[a-zA-Z][a-zA-Z0-9-_]*")) { return null; } return "Der Text sollte mit einem Buchstaben anfangen und nur Buchstaben ohne Sonderzeichen oder Ziffern enthalten"; } }); if (id.open() == Dialog.OK) { String name = id.getValue(); proc.addField(name); set(proc); } } }; directOutputAction = new Action("Sofort ausgeben", Action.AS_CHECK_BOX) { { setToolTipText("Beim Drucken direkt zum Ausgabeprozessor senden"); setImageDescriptor(Images.IMG_NEXT.getImageDescriptor()); } @Override public void run(){ proc.setDirectOutput(directOutputAction.isChecked()); } }; } public void set(ProcessingSchema schema){ proc = schema; for (Control c : cFields.getChildren()) { c.removeFocusListener(fs); c.dispose(); } for (Element e : schema.getFields()) { Label lbl = new Label(cFields, SWT.NONE); lbl.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); Text text = new Text(cFields, SWT.BORDER); text.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false)); text.addFocusListener(fs); String name = e.getAttributeValue("name"); if (name == null) { name = "?"; } lbl.setText(name); text.setText(e.getText()); text.setData(name); } IProcessor p = schema.getProcessor(); if (p == null) { if (cbProcessor.getItemCount() > 0) { cbProcessor.select(0); } else { cbProcessor.setText("unbekannt. kein Prozessor installiert"); } } else { cbProcessor.setText(p.getName()); } File fTempl = schema.getTemplateFile(); tTemplate.setText(fTempl == null ? "unbekannt" : fTempl.getName()); directOutputAction.setChecked(schema.getDirectOutput()); cFields.layout(); } public void save(){ collect(); saveHandler.save(); } public void setSaveOnFocusLost(boolean bSave){ bSaveOnFocusLost = bSave; } void collect(){ for (Control c : cFields.getChildren()) { if (c instanceof Text) { Text text = (Text) c; String con = text.getText(); String name = (String) text.getData(); proc.getField(name).setText(con); log.debug("read field - " + name); } } String sProcessor = cbProcessor.getText(); proc.setProcessor(sProcessor); File tmpl = new File(tTemplate.getText()); proc.setDirectOutput(directOutputAction.isChecked()); proc.setTemplate(tmpl.getName()); } class FocusSaver extends FocusAdapter { @Override public void focusLost(FocusEvent e){ if (bSaveOnFocusLost) { // proc.getProcessor().doOutput(proc); save(); } } } }