/******************************************************************************* * Copyright (c) 2007-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.core.ui.views; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; 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.Text; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEvent; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.data.events.ElexisEventListener; import ch.elexis.core.data.events.Heartbeat.HeartListener; import ch.elexis.core.model.IPersistentObject; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.actions.GlobalEventDispatcher; import ch.elexis.core.ui.actions.IActivationListener; import ch.elexis.core.ui.icons.Images; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.core.ui.util.ViewMenus; import ch.elexis.data.Anwender; import ch.elexis.data.Mandant; import ch.elexis.data.PersistentObject; import ch.rgw.tools.ExHandler; import ch.rgw.tools.StringTool; /** * This view displays the content of an arbitrary field. * * @author gerry * */ public class FieldDisplayView extends ViewPart implements IActivationListener, ElexisEventListener, HeartListener { public static final String ID = "ch.elexis.dbfielddisplay"; //$NON-NLS-1$ private IAction newViewAction, editDataAction; Text text; Class<? extends PersistentObject> myClass; String myField; boolean bCanEdit; ScrolledForm form; FormToolkit tk = UiDesk.getToolkit(); String subid; String NODE = "FeldAnzeige"; //$NON-NLS-1$ @Override public void createPartControl(Composite parent){ parent.setLayout(new GridLayout()); form = tk.createScrolledForm(parent); form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); form.getBody().setLayout(new GridLayout()); text = tk.createText(form.getBody(), "", SWT.MULTI | SWT.V_SCROLL); //$NON-NLS-1$ text.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); text.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent arg0){ if (bCanEdit) { IPersistentObject mine = ElexisEventDispatcher.getSelected(myClass); if (mine != null) { mine.set(myField, text.getText()); } } } }); text.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent arg0){ arg0.doit = bCanEdit; } public void keyReleased(KeyEvent arg0){} }); makeActions(); ViewMenus menu = new ViewMenus(getViewSite()); menu.createToolbar(newViewAction, editDataAction); String nx = "Patient.Diagnosen"; //$NON-NLS-1$ Integer canEdit = null; subid = getViewSite().getSecondaryId(); if (subid == null) { subid = "defaultData"; //$NON-NLS-1$ } nx = CoreHub.userCfg.get("FieldDisplayViewData/" + subid, null); //$NON-NLS-1$ canEdit = CoreHub.userCfg.get("FieldDisplayViewCanEdit/" + subid, 0); //$NON-NLS-1$ setField(nx == null ? "Patient.Diagnosen" : nx, canEdit == null ? false //$NON-NLS-1$ : (canEdit != 0)); GlobalEventDispatcher.addActivationListener(this, getViewSite().getPart()); } @Override public void dispose(){ GlobalEventDispatcher.removeActivationListener(this, getViewSite().getPart()); } @Override public void setFocus(){ text.setFocus(); } public void activation(boolean mode){ } public void visible(boolean mode){ if (mode) { ElexisEventDispatcher.getInstance().addListeners(this); CoreHub.heart.addListener(this); heartbeat(); } else { ElexisEventDispatcher.getInstance().removeListeners(this); CoreHub.heart.removeListener(this); } } public void catchElexisEvent(final ElexisEvent ev){ final PersistentObject po = ev.getObject(); if (po != null && ev.getObjectClass().equals(myClass)) { UiDesk.asyncExec(new Runnable() { public void run(){ if (ev.getType() == ElexisEvent.EVENT_SELECTED) { String val = po.get(myField); if (val == null) { SWTHelper.showError(Messages.FieldDisplayView_ErrorFieldCaption, //$NON-NLS-1$ Messages.FieldDisplayView_ErrorFieldBody + myField); text.setText(StringTool.leer); } else { text.setText(po.get(myField)); } } else if (ev.getType() == ElexisEvent.EVENT_DESELECTED) { text.setText(""); //$NON-NLS-1$ } } }); } else if (ev.getClass().equals(Anwender.class)) { String nx = CoreHub.userCfg.get("FieldDisplayViewData/" + subid, null); //$NON-NLS-1$ Integer canEdit = CoreHub.userCfg.get("FieldDisplayViewCanEdit/" //$NON-NLS-1$ + subid, 0); setField(nx == null ? "Patient.Diagnosen" : nx, //$NON-NLS-1$ canEdit == null ? false : (canEdit != 0)); } } final private ElexisEvent template = new ElexisEvent(null, myClass, ElexisEvent.EVENT_SELECTED | ElexisEvent.EVENT_DESELECTED); public ElexisEvent getElexisEventFilter(){ return template; } public void heartbeat(){ IPersistentObject mine = ElexisEventDispatcher.getSelected(myClass); if (mine == null) { catchElexisEvent(new ElexisEvent(mine, myClass, ElexisEvent.EVENT_DESELECTED)); } else { catchElexisEvent(new ElexisEvent(mine, myClass, ElexisEvent.EVENT_SELECTED)); } } @SuppressWarnings("unchecked") private void setField(String field, boolean canEdit){ String[] def = field.split("\\."); //$NON-NLS-1$ if (def.length != 2) { SWTHelper.showError(Messages.FieldDisplayView_BadDefinitionCaption, //$NON-NLS-1$ Messages.FieldDisplayView_BadDefinitionBody); //$NON-NLS-1$ } else { myClass = resolveName(def[0]); if (myClass != null) { myField = def[1]; bCanEdit = canEdit; setPartName(myField); CoreHub.userCfg.set("FieldDisplayViewData/" + subid, myClass //$NON-NLS-1$ .getSimpleName() + "." + myField); //$NON-NLS-1$ CoreHub.userCfg.set("FieldDisplayViewCanEdit/" + subid, canEdit); //$NON-NLS-1$ } } } @SuppressWarnings("unchecked") private Class resolveName(String k){ Class ret = null; // resolve with classic names try { String fqname = "ch.elexis.data." + k; //$NON-NLS-1$ ret = Class.forName(fqname); } catch (ClassNotFoundException ex) { ret = null; } // fall back to new schema (there should not exist any) if (ret == null) { try { String fqname = "ch.elexis.core.data." + k; //$NON-NLS-1$ ret = Class.forName(fqname); } catch (ClassNotFoundException ex) { ret = null; } } if (ret == null) { SWTHelper.showError(Messages.FieldDisplayView_WrongTypeCaption, //$NON-NLS-1$ Messages.FieldDisplayView_WrongTypeBody + k + ")"); //$NON-NLS-1$ //$NON-NLS-2$ } return ret; } private void makeActions(){ newViewAction = new Action(Messages.FieldDisplayView_NewWindow) { //$NON-NLS-1$ { setImageDescriptor(Images.IMG_ADDITEM.getImageDescriptor()); setToolTipText(Messages.FieldDisplayView_NewWindowToolTip); //$NON-NLS-1$ } @Override public void run(){ try { String fieldtype = new SelectDataDialog().run(); FieldDisplayView n = (FieldDisplayView) getViewSite().getPage().showView(ID, StringTool.unique("DataDisplay"), //$NON-NLS-1$ IWorkbenchPage.VIEW_VISIBLE); n.setField(fieldtype, false); heartbeat(); } catch (PartInitException e) { ExHandler.handle(e); } } }; editDataAction = new Action(Messages.FieldDisplayView_DataTypeAction) { //$NON-NLS-1$ { setImageDescriptor(Images.IMG_EDIT.getImageDescriptor()); setToolTipText(Messages.FieldDisplayView_DataTypeToolTip); //$NON-NLS-1$ } public void run(){ SelectDataDialog sdd = new SelectDataDialog(); if (sdd.open() == Dialog.OK) { setField(sdd.result, sdd.bEditable); heartbeat(); } } }; } class SelectDataDialog extends TitleAreaDialog { private final String DATATYPE = Messages.FieldDisplayView_DataType; //$NON-NLS-1$ String[] nodes; Combo cbNodes; Button btEditable; String result; boolean bEditable; SelectDataDialog(){ super(getViewSite().getShell()); } String run(){ create(); if (nodes.length > 1) { if (open() == Dialog.OK) { return result; } } return nodes[0]; } @Override protected Control createDialogArea(Composite parent){ Composite ret = new Composite(parent, SWT.NONE); ret.setLayout(new GridLayout()); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); cbNodes = new Combo(ret, SWT.SINGLE); cbNodes.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); nodes = CoreHub.localCfg.get(NODE, "Patient.Diagnosen").split(","); //$NON-NLS-1$ //$NON-NLS-2$ cbNodes.setItems(nodes); btEditable = new Button(ret, SWT.CHECK); btEditable.setText(Messages.FieldDisplayView_FieldCanBeChanged); //$NON-NLS-1$ return ret; } @Override public void create(){ super.create(); setTitle(DATATYPE); setMessage(Messages.FieldDisplayView_EnterExpression, //$NON-NLS-1$ IMessageProvider.INFORMATION); } @Override protected void okPressed(){ String tx = cbNodes.getText(); if (StringTool.getIndex(nodes, tx) == -1) { String tm = StringTool.join(nodes, ",") + "," + tx; //$NON-NLS-1$ //$NON-NLS-2$ CoreHub.localCfg.set(NODE, tm); } result = tx; bEditable = btEditable.getSelection(); super.okPressed(); } } }